Files
ncpfs/lib/ncplib_i.h
2026-04-28 20:56:03 +02:00

342 lines
8.9 KiB
C

/*
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 <vandrove@vc.cvut.cz>
Added license.
1.01 2000, January 16 Petr Vandrovec <vandrove@vc.cvut.cz>
Changes for 32bit uids.
1.02 2001, February 24 Petr Vandrovec <vandrove@vc.cvut.cz>
Added broadcast state information.
Added global_fd code.
1.03 2001, March 4 Petr Vandrovec <vandrove@vc.cvut.cz>
Added conn_ring code.
1.04 2001, June 2 Petr Vandrovec <vandrove@vc.cvut.cz>
Moved shuffle() declaration here from ndscrypt.h.
1.05 2001, July 16 Petr Vandrovec <vandrove@vc.cvut.cz>
Added put_req_size_unsigned prototype.
*/
#ifndef _NCPLIB_I_H
#define _NCPLIB_I_H
#ifdef __cplusplus
extern "C" {
#endif
#include <ncp/ncplib.h>
#include "private/list.h"
#include "private/libncp-lock.h"
#include "private/libncp-atomic.h"
#include "private/ncp_fs.h"
#include <string.h>
#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 */