/* ncplib.h Copyright (C) 1995, 1996 by Volker Lendecke Copyright (C) 1999 Petr Vandrovec This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Revision history: 0.00 1995 Volker Lendecke Initial revision. 0.01 1995-1999 see ncplib.c See ncplib.c 1.00 1999, November 20 Petr Vandrovec Added license. 1.01 2000, January 16 Petr Vandrovec Changes for 32bit uids. 1.02 2001, February 24 Petr Vandrovec Added broadcast state information. Added global_fd code. 1.03 2001, March 4 Petr Vandrovec Added conn_ring code. 1.04 2001, June 2 Petr Vandrovec Moved shuffle() declaration here from ndscrypt.h. 1.05 2001, July 16 Petr Vandrovec Added put_req_size_unsigned prototype. */ #ifndef _NCPLIB_I_H #define _NCPLIB_I_H #ifdef __cplusplus extern "C" { #endif #include #include "private/list.h" #include "private/libncp-lock.h" #include "private/libncp-atomic.h" #include "private/ncp_fs.h" #include #ifndef HAVE_MSG_NOSIGNAL #define MSG_NOSIGNAL 0 #endif #define UNUSED(x) x __attribute__((unused)) #define ncp_const_cast(x) ((void*)(unsigned long)(x)) #define NWCC_BCAST_PERMIT_UNKNOWN -9876 /* something unused */ struct ncp_conn { enum connect_state is_connected; struct NWDSConnection* nds_conn; struct list_head nds_ring; char* user; int user_id_valid; NWObjectID user_id; struct ncp_fs_info_v2 i; /* Fields for use with permanent connections */ int mount_fid; char* mount_point; ncpt_atomic_t store_count; u_int32_t state; union ncp_sockaddr addr; struct { size_t count; struct tagBuf_T* buffer; } serverAddresses; #define CONNECTION_AUTHENTICATED 0x8000 #define CONNECTION_LICENSED 0x0004 unsigned int connState; /* Fields for use with temporary connections */ int ncp_sock; int wdog_sock; int wdog_pipe; u_int8_t sequence; ncpt_atomic_t use_count; /* it was completion code */ int conn_status; /* Fields used to setup ncp requests */ unsigned char *current_point; int has_subfunction; int verbose; size_t ncp_reply_size; void *private_key; size_t private_key_len; int lock; unsigned char packet[NCP_PACKET_SIZE]; unsigned char *ncp_reply; unsigned char *ncp_reply_buffer; size_t ncp_reply_alloc; /* Field used to make packet signatures */ int sign_wanted; int sign_active; struct ncp_sign_init sign_data; ncpt_mutex_t buffer_mutex; struct { ncpt_mutex_t mutex; unsigned char valid; char* serverName; struct { unsigned int major, minor, revision; } version; int ncp64bit; } serverInfo; enum NET_ADDRESS_TYPE nt; int bcast_state; int global_fd; struct list_head conn_ring; }; /* saving pointer somewhere */ static inline long ncp_conn_store(struct ncp_conn* conn) { ncpt_atomic_inc(&conn->store_count); return 0; } /* forgetting pointer */ long ncp_conn_release(struct ncp_conn* conn); /* using pointer... */ static inline long ncp_conn_use(struct ncp_conn* conn) { ncpt_atomic_inc(&conn->use_count); return 0; } /* ncp_close is counterpart to ncp_conn_use... */ long ncp_request(struct ncp_conn* conn, int request); void ncp_lock_conn(struct ncp_conn* conn); void ncp_unlock_conn(struct ncp_conn* conn); #ifdef NCP_TRACE_ENABLE void __ncp_trace(char* module, int line, char* p, ...); void __dump_hex(const char* msg, const unsigned char* buf, size_t len); #define NCP_TRACE(X...) __ncp_trace(__FILE__, __LINE__, X) #define DUMP_HEX(msg,buf,len) __dump_hex(msg, buf, len) #define ncp_printf NCP_TRACE #else #define NCP_TRACE(X...) #define DUMP_HEX(msg,buf,len) #define ncp_printf printf #endif static inline void assert_conn_locked(struct ncp_conn *conn) { if (conn->lock == 0) { ncp_printf("ncpfs: connection not locked!\n"); } } #define DEFINE_ASSERT_FUNCTION(name,type) \ static inline void assert_##name(struct ncp_conn *conn, type x ) { \ assert_conn_locked(conn); \ name(conn, x); \ } static inline void ncp_add_byte(struct ncp_conn *conn, byte x) { BSET(conn->current_point, 0, x); conn->current_point++; } static inline void ncp_add_word_lh(struct ncp_conn *conn, word x) { WSET_LH(conn->current_point, 0, x); conn->current_point += 2; } static inline void ncp_add_word_hl(struct ncp_conn *conn, word x) { WSET_HL(conn->current_point, 0, x); conn->current_point += 2; } static inline void ncp_add_dword_lh(struct ncp_conn *conn, dword x) { DSET_LH(conn->current_point, 0, x); conn->current_point += 4; } static inline void ncp_add_dword_hl(struct ncp_conn *conn, dword x) { DSET_HL(conn->current_point, 0, x); conn->current_point += 4; } static inline void ncp_add_qword_hl(struct ncp_conn *conn, u_int64_t x) { QSET_HL(conn->current_point, 0, x); conn->current_point += 8; } DEFINE_ASSERT_FUNCTION(ncp_add_byte,byte) DEFINE_ASSERT_FUNCTION(ncp_add_word_lh,word) DEFINE_ASSERT_FUNCTION(ncp_add_word_hl,word) DEFINE_ASSERT_FUNCTION(ncp_add_dword_lh,dword) DEFINE_ASSERT_FUNCTION(ncp_add_dword_hl,dword) static inline void ncp_add_mem(struct ncp_conn *conn, const void *source, int size) { assert_conn_locked(conn); memcpy(conn->current_point, source, size); conn->current_point += size; } static inline int ncp_add_seek(struct ncp_conn *conn, int pos) { assert_conn_locked(conn); if (conn->current_point > conn->packet + pos) return NWE_BUFFER_OVERFLOW; conn->current_point = conn->packet + pos; return 0; } void ncp_add_pstring(struct ncp_conn *conn, const char *s); static inline unsigned char* ncp_reply_data(struct ncp_conn *conn, int offset) { return conn->ncp_reply + sizeof(struct ncp_reply_header) + offset; } static inline byte ncp_reply_byte(struct ncp_conn *conn, int offset) { return BVAL(ncp_reply_data(conn, offset), 0); } static inline word ncp_reply_word_hl(struct ncp_conn *conn, int offset) { return WVAL_HL(ncp_reply_data(conn, offset), 0); } static inline word ncp_reply_word_lh(struct ncp_conn *conn, int offset) { return WVAL_LH(ncp_reply_data(conn, offset), 0); } static inline dword ncp_reply_dword_hl(struct ncp_conn *conn, int offset) { return DVAL_HL(ncp_reply_data(conn, offset), 0); } static inline dword ncp_reply_dword_lh(struct ncp_conn *conn, int offset) { return DVAL_LH(ncp_reply_data(conn, offset), 0); } static inline u_int64_t ncp_reply_qword_lh(struct ncp_conn *conn, int offset) { return QVAL_LH(ncp_reply_data(conn, offset), 0); } static inline u_int32_t cpu_to_le32(u_int32_t val) { return DVAL_LH(&val, 0); } static inline u_int32_t cpu_to_be32(u_int32_t val) { return htonl(val); } static inline unsigned int min(unsigned int a, unsigned int b) { return (a < b) ? a : b; } static inline void ConvertToNWfromDWORD(u_int32_t sfd, unsigned char nwhandle[6]) { DSET_LH(nwhandle, 2, sfd); WSET_LH(nwhandle, 0, sfd+1); } static inline u_int32_t ConvertToDWORDfromNW(const unsigned char nwhandle[6]) { return DVAL_LH(nwhandle, 2); } void ncp_init_request(struct ncp_conn *conn); void ncp_init_request_s(struct ncp_conn *conn, int subfunction); long ncp_sign_start(struct ncp_conn *conn, const unsigned char *sign_root); void shuffle(const unsigned char *objid, const void *pwd, size_t buflen, unsigned char *out); NWCCODE ncp_set_private_key(struct ncp_conn *conn, const void* pk, size_t pk_len); NWCCODE ncp_get_private_key(struct ncp_conn *conn, void* pk, size_t* pk_len); NWCCODE ncp_next_conn(struct ncp_conn *conn, struct ncp_conn **nextConn); #ifdef SIGNATURES static inline int ncp_get_sign_wanted(struct ncp_conn *conn) { return conn->sign_wanted; } static inline int ncp_get_sign_active(struct ncp_conn *conn) { return conn->sign_active; } #else #define ncp_get_sign_wanted(X) (0) #define ncp_get_sign_active(X) (0) #endif extern ncpt_mutex_t nds_ring_lock; NWCCODE ncp_put_req_size_unsigned(void *buffer, size_t reqlen, unsigned long value); NWCCODE x_recvfrom(int sock, void *buf, int len, unsigned int flags, struct sockaddr *sender, socklen_t* addrlen, int timeout, size_t *rlen); static inline NWCCODE x_recv(int sock, void *buf, int len, unsigned int flags, int timeout, size_t *rlen) { return x_recvfrom(sock, buf, len, flags, NULL, 0, timeout, rlen); } NWCCODE __NWReadFileServerInfo(struct ncp_conn* conn); int ncp_fd_nosigpipe(int fd); #ifdef __cplusplus } #endif #endif /* _NCPLIB_I_H */