diff --git a/.downloads/ncpfs-2.0.9.tgz b/.downloads/ncpfs-2.0.9.tgz new file mode 100644 index 0000000..767ddd7 Binary files /dev/null and b/.downloads/ncpfs-2.0.9.tgz differ diff --git a/Changes b/Changes index 7350721..3cd8536 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,11 @@ I only began this file with ncpfs-0.12. If you're interested in older versions, you can find them on ftp.gwdg.de:/pub/linux/misc/ncpfs/old. +ncpfs-2.0.8 -> ncpfs-2.0.9 +- Added patches directory +- Added nwvolinfo and nwtrustee. Thanks to Jacek Stepniewski +- nwpasswd can change other's passwords. Thanks to Martin Stover. + ncpfs-2.0.7 -> ncpfs-2.0.8 - Fixed util/Makefile for easier optimization handling. Thanks to Rik Faith for this one diff --git a/Makefile b/Makefile index 7a74f76..8cf8201 100644 --- a/Makefile +++ b/Makefile @@ -2,11 +2,11 @@ # Makefile for the linux ncp-filesystem routines. # -VERSION = 2.0.8 +VERSION = 2.0.9 # If you are using kerneld to autoload ncp support, # uncomment this (kerneld is in linux since about 1.3.57): -#KERNELD = -DHAVE_KERNELD +KERNELD = -DHAVE_KERNELD # If your system is ELF, either also do a 'make install', or append the util/ # directory where the dynamic library resides to the environment @@ -29,7 +29,7 @@ INCLUDES += -I$(TOPDIR)/kernel-1.2 endif COPT = -O2 -# COPT += -g +COPT += -g CFLAGS = $(COPT) -Wall $(INCLUDES) $(KERNELD) -DNCPFS_VERSION=\"$(VERSION)\" export INCLUDES BINDIR SBINDIR KERNELD VERSION HAVE_ELF CFLAGS diff --git a/TODO b/TODO deleted file mode 100644 index b5e4d5c..0000000 --- a/TODO +++ /dev/null @@ -1,12 +0,0 @@ -Here's a list of things I want to do. Feel free to send suggestions, -or even help me ;-). - -- do rtt estimation, like tcp does. - -- Do better connection management. I imagine to create a ncpd. - -- When ncpd is done, one can think about mounting several volumes over - a single NCP connection. This should make the trade-off mentioned in - ncpmount.8 unnecessary. - -- Do some kind of mapping of NCP uid's to unix uid's diff --git a/include/com_err.h b/include/com_err.h index f28dce8..8e8ad11 100644 --- a/include/com_err.h +++ b/include/com_err.h @@ -16,25 +16,25 @@ typedef long errcode_t; #include /* ANSI C -- use prototypes etc */ -void com_err (const char *, long, const char *, ...); -void com_err_va (const char *whoami, errcode_t code, const char *fmt, - va_list args); -char const *error_message (long); +void com_err(const char *, long, const char *,...); +void com_err_va(const char *whoami, errcode_t code, const char *fmt, + va_list args); +char const *error_message(long); extern void (*com_err_hook) (const char *, long, const char *, va_list); -void (*set_com_err_hook (void (*) (const char *, long, const char *, va_list))) - (const char *, long, const char *, va_list); -void (*reset_com_err_hook (void)) (const char *, long, const char *, va_list); -int init_error_table(const char * const *msgs, int base, int count); +void (*set_com_err_hook(void (*)(const char *, long, const char *, va_list))) + (const char *, long, const char *, va_list); +void (*reset_com_err_hook(void)) (const char *, long, const char *, va_list); +int init_error_table(const char *const *msgs, int base, int count); #else /* no prototypes */ -void com_err (); -void com_err_va (); -char *error_message (); +void com_err(); +void com_err_va(); +char *error_message(); extern void (*com_err_hook) (); -void (*set_com_err_hook ()) (); -void (*reset_com_err_hook ()) (); +void (*set_com_err_hook()) (); +void (*reset_com_err_hook()) (); int init_error_table(); #endif #define __COM_ERR_H -#endif /* ! defined(__COM_ERR_H) */ +#endif /* ! defined(__COM_ERR_H) */ diff --git a/include/ipxlib.h b/include/ipxlib.h index ac243b0..bf16bf4 100644 --- a/include/ipxlib.h +++ b/include/ipxlib.h @@ -15,9 +15,9 @@ #include #include -typedef unsigned long IPXNet; +typedef unsigned long IPXNet; typedef unsigned short IPXPort; -typedef unsigned char IPXNode[IPX_NODE_LEN]; +typedef unsigned char IPXNode[IPX_NODE_LEN]; #define IPX_USER_PTYPE (0x00) #define IPX_RIP_PTYPE (0x01) @@ -33,30 +33,35 @@ typedef unsigned char IPXNode[IPX_NODE_LEN]; #define IPX_SAP_FILE_SERVER (0x0004) -struct sap_query { - unsigned short query_type; /* net order */ - unsigned short server_type; /* net order */ +struct sap_query +{ + unsigned short query_type; /* net order */ + unsigned short server_type; /* net order */ }; -struct sap_server_ident { - unsigned short server_type __attribute__ ((packed)); - char server_name[48] __attribute__ ((packed)); - IPXNet server_network __attribute__ ((packed)); - IPXNode server_node __attribute__ ((packed)); - IPXPort server_port __attribute__ ((packed)); - unsigned short intermediate_network __attribute__ ((packed)); +struct sap_server_ident +{ + unsigned short server_type __attribute__((packed)); + char server_name[48] __attribute__((packed)); + IPXNet server_network __attribute__((packed)); + IPXNode server_node __attribute__((packed)); + IPXPort server_port __attribute__((packed)); + unsigned short intermediate_network __attribute__((packed)); }; - + #define IPX_RIP_REQUEST (0x1) #define IPX_RIP_RESPONSE (0x2) -struct ipx_rip_packet { - __u16 operation __attribute__ ((packed)); - struct ipx_rt_def { - __u32 network __attribute__ ((packed)); - __u16 hops __attribute__ ((packed)); - __u16 ticks __attribute__ ((packed)); - } rt[1] __attribute__ ((packed)); +struct ipx_rip_packet +{ + __u16 operation __attribute__((packed)); + struct ipx_rt_def + { + __u32 network __attribute__((packed)); + __u16 hops __attribute__((packed)); + __u16 ticks __attribute__((packed)); + } + rt[1] __attribute__((packed)); }; #define IPX_BROADCAST_NODE ("\xff\xff\xff\xff\xff\xff") @@ -68,26 +73,26 @@ struct ipx_rip_packet { #endif void -ipx_print_node(IPXNode node); + ipx_print_node(IPXNode node); void -ipx_print_network(IPXNet net); + ipx_print_network(IPXNet net); void -ipx_print_port(IPXPort port); + ipx_print_port(IPXPort port); void -ipx_print_saddr(struct sockaddr_ipx* sipx); + ipx_print_saddr(struct sockaddr_ipx *sipx); void -ipx_fprint_node(FILE *file, IPXNode node); + ipx_fprint_node(FILE * file, IPXNode node); void -ipx_fprint_network(FILE *file, IPXNet net); + ipx_fprint_network(FILE * file, IPXNet net); void -ipx_fprint_port(FILE *file, IPXPort port); + ipx_fprint_port(FILE * file, IPXPort port); void -ipx_fprint_saddr(FILE *file, struct sockaddr_ipx* sipx); + ipx_fprint_saddr(FILE * file, struct sockaddr_ipx *sipx); int -ipx_sscanf_node(char *buf, unsigned char node[IPX_NODE_LEN]); + ipx_sscanf_node(char *buf, unsigned char node[IPX_NODE_LEN]); void -ipx_assign_node(IPXNode dest, IPXNode src); + ipx_assign_node(IPXNode dest, IPXNode src); int -ipx_node_equal(IPXNode n1,IPXNode n2); + ipx_node_equal(IPXNode n1, IPXNode n2); -#endif /* _IPXLIB_H */ +#endif /* _IPXLIB_H */ diff --git a/include/ncplib.h b/include/ncplib.h index ebc637b..a73c038 100644 --- a/include/ncplib.h +++ b/include/ncplib.h @@ -19,26 +19,115 @@ #include "ipxlib.h" #include "com_err.h" +typedef __u8 byte; +typedef __u16 word; +typedef __u32 dword; + #ifndef memzero #include #define memzero(object) memset(&(object), 0, sizeof(object)) #endif -void -str_upper(char *name); +#define BVAL(buf,pos) (((__u8 *)(buf))[pos]) +#define PVAL(buf,pos) ((unsigned)BVAL(buf,pos)) +#define BSET(buf,pos,val) (BVAL(buf,pos) = (val)) -enum connect_state { +static inline word +WVAL_HL(__u8 * buf, int pos) +{ + return PVAL(buf, pos) << 8 | PVAL(buf, pos + 1); +} +static inline dword +DVAL_HL(__u8 * buf, int pos) +{ + return WVAL_HL(buf, pos) << 16 | WVAL_HL(buf, pos + 2); +} +static inline void +WSET_HL(__u8 * buf, int pos, word val) +{ + BSET(buf, pos, val >> 8); + BSET(buf, pos + 1, val & 0xff); +} +static inline void +DSET_HL(__u8 * buf, int pos, dword val) +{ + WSET_HL(buf, pos, val >> 16); + WSET_HL(buf, pos + 2, val & 0xffff); +} + + +/* we know that the 386 can handle misalignment and has the "right" + byteorder */ +#if defined(__i386__) + +static inline word +WVAL_LH(__u8 * buf, int pos) +{ + return *((word *) (buf + pos)); +} +static inline dword +DVAL_LH(__u8 * buf, int pos) +{ + return *((dword *) (buf + pos)); +} +static inline void +WSET_LH(__u8 * buf, int pos, word val) +{ + *((word *) (buf + pos)) = val; +} +static inline void +DSET_LH(__u8 * buf, int pos, dword val) +{ + *((dword *) (buf + pos)) = val; +} + +#else + +static inline word +WVAL_LH(__u8 * buf, int pos) +{ + return PVAL(buf, pos) | PVAL(buf, pos + 1) << 8; +} +static inline dword +DVAL_LH(__u8 * buf, int pos) +{ + return WVAL_LH(buf, pos) | WVAL_LH(buf, pos + 2) << 16; +} +static inline void +WSET_LH(__u8 * buf, int pos, word val) +{ + BSET(buf, pos, val & 0xff); + BSET(buf, pos + 1, val >> 8); +} +static inline void +DSET_LH(__u8 * buf, int pos, dword val) +{ + WSET_LH(buf, pos, val & 0xffff); + WSET_LH(buf, pos + 2, val >> 16); +} + +#endif + + + + +void + str_upper(char *name); + +enum connect_state +{ NOT_CONNECTED = 0, CONN_PERMANENT, CONN_TEMPORARY }; -struct ncp_conn { +struct ncp_conn +{ enum connect_state is_connected; char server[NCP_BINDERY_NAME_LEN]; - char user [NCP_BINDERY_NAME_LEN]; + char user[NCP_BINDERY_NAME_LEN]; struct ncp_fs_info i; @@ -66,7 +155,8 @@ struct ncp_conn { char packet[NCP_PACKET_SIZE]; }; -struct ncp_conn_spec { +struct ncp_conn_spec +{ char server[NCP_BINDERY_NAME_LEN]; char user[NCP_BINDERY_NAME_LEN]; uid_t uid; @@ -74,12 +164,14 @@ struct ncp_conn_spec { char password[NCP_BINDERY_NAME_LEN]; }; -struct ncp_search_seq { +struct ncp_search_seq +{ struct nw_search_sequence s; int namespace; }; -struct ncp_property_info { +struct ncp_property_info +{ __u8 property_name[16]; __u8 property_flags; __u8 property_security; @@ -94,46 +186,47 @@ struct ncp_property_info { from the list. It was designed after the X Windows init functions. */ struct ncp_conn * -ncp_initialize(int *argc, char **argv, - int login_necessary, long *err); + ncp_initialize(int *argc, char **argv, + int login_necessary, long *err); /* You can login as another object by this procedure. As a first use pserver comes to mind. */ struct ncp_conn * -ncp_initialize_as(int *argc, char **argv, - int login_necessary, int login_type, long *err); + ncp_initialize_as(int *argc, char **argv, + int login_necessary, int login_type, long *err); /* Open a connection */ struct ncp_conn * -ncp_open(const struct ncp_conn_spec *spec, long *err); + ncp_open(const struct ncp_conn_spec *spec, long *err); /* Open a connection on an existing mount point */ struct ncp_conn * -ncp_open_mount(const char *mount_point, long *err); + ncp_open_mount(const char *mount_point, long *err); /* Find a permanent connection that fits the spec, return NULL if * there is none. */ char * -ncp_find_permanent(const struct ncp_conn_spec *spec); + ncp_find_permanent(const struct ncp_conn_spec *spec); /* Find the address of a file server */ struct sockaddr_ipx * -ncp_find_fileserver(const char *server_name, long *err); + ncp_find_fileserver(const char *server_name, long *err); /* Find the address of a server */ struct sockaddr_ipx * -ncp_find_server(const char **server_name, int type, long *err); + ncp_find_server(const char **server_name, int type, long *err); /* Detach from a permanent connection or destroy a temporary connection */ long -ncp_close(struct ncp_conn *conn); + ncp_close(struct ncp_conn *conn); /* like getmntent, get_ncp_conn_ent scans /etc/mtab for usable connections */ -struct ncp_conn_ent { +struct ncp_conn_ent +{ char server[NCP_BINDERY_NAME_LEN]; char user[NCP_BINDERY_NAME_LEN]; uid_t uid; @@ -141,7 +234,7 @@ struct ncp_conn_ent { }; struct ncp_conn_ent * -ncp_get_conn_ent(FILE *filep); + ncp_get_conn_ent(FILE * filep); #define NWCLIENT (".nwclient") #define NWC_NOPASSWORD ("-") @@ -149,165 +242,168 @@ ncp_get_conn_ent(FILE *filep); /* find an appropriate connection */ struct ncp_conn_spec * -ncp_find_conn_spec(const char *server, const char *user, const char *password, - int login_necessary, uid_t uid, long *err); + ncp_find_conn_spec(const char *server, const char *user, const char *password, + int login_necessary, uid_t uid, long *err); long -ncp_get_file_server_description_strings(struct ncp_conn *conn, - char target[512]); + ncp_get_file_server_description_strings(struct ncp_conn *conn, + char target[512]); long -ncp_get_file_server_time(struct ncp_conn *conn, time_t *target); + ncp_get_file_server_time(struct ncp_conn *conn, time_t * target); long -ncp_set_file_server_time(struct ncp_conn *conn, time_t *source); + ncp_set_file_server_time(struct ncp_conn *conn, time_t * source); -struct ncp_file_server_info { - __u8 ServerName[48] __attribute__ ((packed)); - __u8 FileServiceVersion __attribute__ ((packed)); - __u8 FileServiceSubVersion __attribute__ ((packed)); - __u16 MaximumServiceConnections __attribute__ ((packed)); - __u16 ConnectionsInUse __attribute__ ((packed)); - __u16 NumberMountedVolumes __attribute__ ((packed)); - __u8 Revision __attribute__ ((packed)); - __u8 SFTLevel __attribute__ ((packed)); - __u8 TTSLevel __attribute__ ((packed)); - __u16 MaxConnectionsEverUsed __attribute__ ((packed)); - __u8 AccountVersion __attribute__ ((packed)); - __u8 VAPVersion __attribute__ ((packed)); - __u8 QueueVersion __attribute__ ((packed)); - __u8 PrintVersion __attribute__ ((packed)); - __u8 VirtualConsoleVersion __attribute__ ((packed)); - __u8 RestrictionLevel __attribute__ ((packed)); - __u8 InternetBridge __attribute__ ((packed)); - __u8 Reserved[60] __attribute__ ((packed)); +struct ncp_file_server_info +{ + __u8 ServerName[48] __attribute__((packed)); + __u8 FileServiceVersion __attribute__((packed)); + __u8 FileServiceSubVersion __attribute__((packed)); + __u16 MaximumServiceConnections __attribute__((packed)); + __u16 ConnectionsInUse __attribute__((packed)); + __u16 NumberMountedVolumes __attribute__((packed)); + __u8 Revision __attribute__((packed)); + __u8 SFTLevel __attribute__((packed)); + __u8 TTSLevel __attribute__((packed)); + __u16 MaxConnectionsEverUsed __attribute__((packed)); + __u8 AccountVersion __attribute__((packed)); + __u8 VAPVersion __attribute__((packed)); + __u8 QueueVersion __attribute__((packed)); + __u8 PrintVersion __attribute__((packed)); + __u8 VirtualConsoleVersion __attribute__((packed)); + __u8 RestrictionLevel __attribute__((packed)); + __u8 InternetBridge __attribute__((packed)); + __u8 Reserved[60] __attribute__((packed)); }; long -ncp_get_file_server_information(struct ncp_conn *conn, - struct ncp_file_server_info *target); + ncp_get_file_server_information(struct ncp_conn *conn, + struct ncp_file_server_info *target); long -ncp_get_connlist(struct ncp_conn *conn, - __u16 object_type, const char *object_name, - int *returned_no, __u8 conn_numbers[256]); + ncp_get_connlist(struct ncp_conn *conn, + __u16 object_type, const char *object_name, + int *returned_no, __u8 conn_numbers[256]); long -ncp_get_stations_logged_info(struct ncp_conn *conn, - __u32 connection, - struct ncp_bindery_object *target, - time_t *login_time); + ncp_get_stations_logged_info(struct ncp_conn *conn, + __u32 connection, + struct ncp_bindery_object *target, + time_t * login_time); long -ncp_get_internet_address(struct ncp_conn *conn, - __u32 connection, - struct sockaddr_ipx *target, - __u8 *conn_type); + ncp_get_internet_address(struct ncp_conn *conn, + __u32 connection, + struct sockaddr_ipx *target, + __u8 * conn_type); long -ncp_send_broadcast(struct ncp_conn *conn, - __u8 no_conn, const __u8 *connections, - const char *message); + ncp_send_broadcast(struct ncp_conn *conn, + __u8 no_conn, const __u8 * connections, + const char *message); long -ncp_get_encryption_key(struct ncp_conn *conn, - char *target); + ncp_get_encryption_key(struct ncp_conn *conn, + char *target); long -ncp_get_bindery_object_id(struct ncp_conn *conn, - __u16 object_type, - const char *object_name, - struct ncp_bindery_object *target); -long -ncp_get_bindery_object_name(struct ncp_conn *conn, - __u32 object_id, - struct ncp_bindery_object *target); -long -ncp_scan_bindery_object(struct ncp_conn *conn, - __u32 last_id, __u16 object_type, char *search_string, - struct ncp_bindery_object *target); -long -ncp_create_bindery_object(struct ncp_conn *conn, - __u16 object_type, - const char *object_name, - __u8 object_security, - __u8 object_status); -long -ncp_delete_bindery_object(struct ncp_conn *conn, - __u16 object_type, - const char *object_name); - -long -ncp_change_object_security(struct ncp_conn *conn, + ncp_get_bindery_object_id(struct ncp_conn *conn, __u16 object_type, const char *object_name, - __u8 security); + struct ncp_bindery_object *target); +long + ncp_get_bindery_object_name(struct ncp_conn *conn, + __u32 object_id, + struct ncp_bindery_object *target); +long + ncp_scan_bindery_object(struct ncp_conn *conn, + __u32 last_id, __u16 object_type, char *search_string, + struct ncp_bindery_object *target); +long + ncp_create_bindery_object(struct ncp_conn *conn, + __u16 object_type, + const char *object_name, + __u8 object_security, + __u8 object_status); +long + ncp_delete_bindery_object(struct ncp_conn *conn, + __u16 object_type, + const char *object_name); -struct ncp_station_addr { - __u32 NetWork __attribute__ ((packed)); - __u8 Node[6] __attribute__ ((packed)); - __u16 Socket __attribute__ ((packed)); +long + ncp_change_object_security(struct ncp_conn *conn, + __u16 object_type, + const char *object_name, + __u8 security); + +struct ncp_station_addr +{ + __u32 NetWork __attribute__((packed)); + __u8 Node[6] __attribute__((packed)); + __u16 Socket __attribute__((packed)); }; -struct ncp_prop_login_control { - __u8 AccountExpireDate[3] __attribute__ ((packed)); - __u8 Disabled __attribute__ ((packed)); - __u8 PasswordExpireDate[3] __attribute__ ((packed)); - __u8 GraceLogins __attribute__ ((packed)); - __u16 PasswordExpireInterval __attribute__ ((packed)); - __u8 MaxGraceLogins __attribute__ ((packed)); - __u8 MinPasswordLength __attribute__ ((packed)); - __u16 MaxConnections __attribute__ ((packed)); - __u8 ConnectionTimeMask[42] __attribute__ ((packed)); - __u8 LastLogin[6] __attribute__ ((packed)); - __u8 RestrictionMask __attribute__ ((packed)); - __u8 reserved __attribute__ ((packed)); - __u32 MaxDiskUsage __attribute__ ((packed)); - __u16 BadLoginCount __attribute__ ((packed)); - __u32 BadLoginCountDown __attribute__ ((packed)); - struct ncp_station_addr LastIntruder __attribute__ ((packed)); -}; +struct ncp_prop_login_control +{ + __u8 AccountExpireDate[3] __attribute__((packed)); + __u8 Disabled __attribute__((packed)); + __u8 PasswordExpireDate[3] __attribute__((packed)); + __u8 GraceLogins __attribute__((packed)); + __u16 PasswordExpireInterval __attribute__((packed)); + __u8 MaxGraceLogins __attribute__((packed)); + __u8 MinPasswordLength __attribute__((packed)); + __u16 MaxConnections __attribute__((packed)); + __u8 ConnectionTimeMask[42] __attribute__((packed)); + __u8 LastLogin[6] __attribute__((packed)); + __u8 RestrictionMask __attribute__((packed)); + __u8 reserved __attribute__((packed)); + __u32 MaxDiskUsage __attribute__((packed)); + __u16 BadLoginCount __attribute__((packed)); + __u32 BadLoginCountDown __attribute__((packed)); + struct ncp_station_addr LastIntruder __attribute__((packed)); +}; long -ncp_read_property_value(struct ncp_conn *conn, - int object_type, const char *object_name, - int segment, const char *prop_name, - struct nw_property *target); + ncp_read_property_value(struct ncp_conn *conn, + int object_type, const char *object_name, + int segment, const char *prop_name, + struct nw_property *target); long -ncp_scan_property(struct ncp_conn *conn, - __u16 object_type, const char *object_name, - __u32 last_id, char *search_string, - struct ncp_property_info *property_info); + ncp_scan_property(struct ncp_conn *conn, + __u16 object_type, const char *object_name, + __u32 last_id, char *search_string, + struct ncp_property_info *property_info); long -ncp_add_object_to_set(struct ncp_conn *conn, - __u16 object_type, const char *object_name, - const char *property_name, - __u16 member_type, - const char *member_name); + ncp_add_object_to_set(struct ncp_conn *conn, + __u16 object_type, const char *object_name, + const char *property_name, + __u16 member_type, + const char *member_name); long -ncp_change_property_security(struct ncp_conn *conn, - __u16 object_type, const char *object_name, - const char *property_name, - __u8 property_security); + ncp_change_property_security(struct ncp_conn *conn, + __u16 object_type, const char *object_name, + const char *property_name, + __u8 property_security); long -ncp_create_property(struct ncp_conn *conn, + ncp_create_property(struct ncp_conn *conn, __u16 object_type, const char *object_name, - const char *property_name, + const char *property_name, __u8 property_flags, __u8 property_security); long -ncp_delete_object_from_set(struct ncp_conn *conn, - __u16 object_type, const char *object_name, - const char *property_name, - __u16 member_type, - const char *member_name); -long -ncp_delete_property(struct ncp_conn *conn, - __u16 object_type, const char *object_name, - const char *property_name); + ncp_delete_object_from_set(struct ncp_conn *conn, + __u16 object_type, const char *object_name, + const char *property_name, + __u16 member_type, + const char *member_name); long -ncp_write_property_value(struct ncp_conn *conn, - __u16 object_type, const char *object_name, - const char *property_name, - __u8 segment, - struct nw_property *property_value); + ncp_delete_property(struct ncp_conn *conn, + __u16 object_type, const char *object_name, + const char *property_name); +long + ncp_write_property_value(struct ncp_conn *conn, + __u16 object_type, const char *object_name, + const char *property_name, + __u8 segment, + struct nw_property *property_value); /* Bit masks for security flag */ #define NCP_SEC_CHECKSUMMING_REQUESTED (1) @@ -317,138 +413,138 @@ ncp_write_property_value(struct ncp_conn *conn, #define NCP_SEC_LIP_DISABLED (128) long -ncp_get_big_ncp_max_packet_size(struct ncp_conn *conn, - __u16 proposed_max_size, - __u8 proposed_security_flag, - __u16 *accepted_max_size, - __u16 *echo_socket, - __u8 *accepted_security_flag); + ncp_get_big_ncp_max_packet_size(struct ncp_conn *conn, + __u16 proposed_max_size, + __u8 proposed_security_flag, + __u16 * accepted_max_size, + __u16 * echo_socket, + __u8 * accepted_security_flag); long -ncp_login_encrypted(struct ncp_conn *conn, - const struct ncp_bindery_object *object, - const unsigned char *key, - const unsigned char *passwd); + ncp_login_encrypted(struct ncp_conn *conn, + const struct ncp_bindery_object *object, + const unsigned char *key, + const unsigned char *passwd); long -ncp_login_unencrypted(struct ncp_conn *conn, - __u16 object_type, const char *object_name, - const unsigned char *passwd); + ncp_login_unencrypted(struct ncp_conn *conn, + __u16 object_type, const char *object_name, + const unsigned char *passwd); long -ncp_change_login_passwd(struct ncp_conn *conn, - const struct ncp_bindery_object *object, - const unsigned char *key, - const unsigned char *oldpasswd, - const unsigned char *newpasswd); + ncp_change_login_passwd(struct ncp_conn *conn, + const struct ncp_bindery_object *object, + const unsigned char *key, + const unsigned char *oldpasswd, + const unsigned char *newpasswd); #define NCP_GRACE_PERIOD (0xdf) long -ncp_login_user(struct ncp_conn *conn, - const unsigned char *username, - const unsigned char *password); + ncp_login_user(struct ncp_conn *conn, + const unsigned char *username, + const unsigned char *password); long -ncp_get_volume_info_with_number(struct ncp_conn *conn, int n, - struct ncp_volume_info *target); + ncp_get_volume_info_with_number(struct ncp_conn *conn, int n, + struct ncp_volume_info *target); long -ncp_get_volume_number(struct ncp_conn *conn, const char *name, - int *target); + ncp_get_volume_number(struct ncp_conn *conn, const char *name, + int *target); long -ncp_file_search_init(struct ncp_conn *conn, - int dir_handle, const char *path, - struct ncp_filesearch_info *target); + ncp_file_search_init(struct ncp_conn *conn, + int dir_handle, const char *path, + struct ncp_filesearch_info *target); long -ncp_file_search_continue(struct ncp_conn *conn, - struct ncp_filesearch_info *fsinfo, - int attributes, const char *path, - struct ncp_file_info *target); + ncp_file_search_continue(struct ncp_conn *conn, + struct ncp_filesearch_info *fsinfo, + int attributes, const char *path, + struct ncp_file_info *target); long -ncp_get_finfo(struct ncp_conn *conn, - int dir_handle, const char *path, const char *name, - struct ncp_file_info *target); + ncp_get_finfo(struct ncp_conn *conn, + int dir_handle, const char *path, const char *name, + struct ncp_file_info *target); long -ncp_open_file(struct ncp_conn *conn, - int dir_handle, const char *path, - int attr, int access, - struct ncp_file_info *target); -long -ncp_close_file(struct ncp_conn *conn, const char *file_id); - -long -ncp_create_newfile(struct ncp_conn *conn, - int dir_handle, const char *path, - int attr, - struct ncp_file_info *target); - -long -ncp_create_file(struct ncp_conn *conn, - int dir_handle, const char *path, - int attr, - struct ncp_file_info *target); - -long -ncp_erase_file(struct ncp_conn *conn, + ncp_open_file(struct ncp_conn *conn, int dir_handle, const char *path, - int attr); + int attr, int access, + struct ncp_file_info *target); +long + ncp_close_file(struct ncp_conn *conn, const char *file_id); long -ncp_rename_file(struct ncp_conn *conn, - int old_handle, const char *old_path, - int attr, - int new_handle, const char *new_path); + ncp_create_newfile(struct ncp_conn *conn, + int dir_handle, const char *path, + int attr, + struct ncp_file_info *target); long -ncp_create_directory(struct ncp_conn *conn, - int dir_handle, const char *path, - int inherit_mask); + ncp_create_file(struct ncp_conn *conn, + int dir_handle, const char *path, + int attr, + struct ncp_file_info *target); long -ncp_delete_directory(struct ncp_conn *conn, - int dir_handle, const char *path); - -long -ncp_rename_directory(struct ncp_conn *conn, - int dir_handle, - const char *old_path, const char *new_path); - -long -ncp_add_trustee(struct ncp_conn *conn, + ncp_erase_file(struct ncp_conn *conn, int dir_handle, const char *path, - __u32 object_id, __u8 rights); + int attr); long -ncp_delete_trustee(struct ncp_conn *conn, - int dir_handle, const char *path, __u32 object_id); + ncp_rename_file(struct ncp_conn *conn, + int old_handle, const char *old_path, + int attr, + int new_handle, const char *new_path); long -ncp_read(struct ncp_conn *conn, const char *file_id, - off_t offset, size_t count, char *target); + ncp_create_directory(struct ncp_conn *conn, + int dir_handle, const char *path, + int inherit_mask); long -ncp_write(struct ncp_conn *conn, const char *file_id, - off_t offset, size_t count, const char *source); + ncp_delete_directory(struct ncp_conn *conn, + int dir_handle, const char *path); long -ncp_copy_file(struct ncp_conn *conn, - const char source_file[6], - const char target_file[6], - __u32 source_offset, - __u32 target_offset, - __u32 count, - __u32 *copied_count); + ncp_rename_directory(struct ncp_conn *conn, + int dir_handle, + const char *old_path, const char *new_path); long -ncp_obtain_file_or_subdir_info(struct ncp_conn *conn, - __u8 source_ns, __u8 target_ns, - __u16 search_attribs, __u32 rim, - __u8 vol, __u32 dirent, const char *path, - struct nw_info_struct *target); + ncp_add_trustee(struct ncp_conn *conn, + int dir_handle, const char *path, + __u32 object_id, __u8 rights); + +long + ncp_delete_trustee(struct ncp_conn *conn, + int dir_handle, const char *path, __u32 object_id); + +long + ncp_read(struct ncp_conn *conn, const char *file_id, + off_t offset, size_t count, char *target); + +long + ncp_write(struct ncp_conn *conn, const char *file_id, + off_t offset, size_t count, const char *source); + +long + ncp_copy_file(struct ncp_conn *conn, + const char source_file[6], + const char target_file[6], + __u32 source_offset, + __u32 target_offset, + __u32 count, + __u32 * copied_count); + +long + ncp_obtain_file_or_subdir_info(struct ncp_conn *conn, + __u8 source_ns, __u8 target_ns, + __u16 search_attribs, __u32 rim, + __u8 vol, __u32 dirent, const char *path, + struct nw_info_struct *target); #define NCP_PERM_READ (0x001) #define NCP_PERM_WRITE (0x002) @@ -461,103 +557,103 @@ ncp_obtain_file_or_subdir_info(struct ncp_conn *conn, #define NCP_PERM_SUPER (0x100) long -ncp_get_eff_directory_rights(struct ncp_conn *conn, - __u8 source_ns, __u8 target_ns, - __u16 search_attribs, - __u8 vol, __u32 dirent, const char *path, - __u16 *my_effective_rights); + ncp_get_eff_directory_rights(struct ncp_conn *conn, + __u8 source_ns, __u8 target_ns, + __u16 search_attribs, + __u8 vol, __u32 dirent, const char *path, + __u16 * my_effective_rights); long -ncp_do_lookup(struct ncp_conn *conn, - struct nw_info_struct *dir, - char *path, /* may only be one component */ - struct nw_info_struct *target); + ncp_do_lookup(struct ncp_conn *conn, + struct nw_info_struct *dir, + char *path, /* may only be one component */ + struct nw_info_struct *target); long -ncp_modify_file_or_subdir_dos_info(struct ncp_conn *conn, - struct nw_info_struct *file, - __u32 info_mask, - struct nw_modify_dos_info *info); + ncp_modify_file_or_subdir_dos_info(struct ncp_conn *conn, + struct nw_info_struct *file, + __u32 info_mask, + struct nw_modify_dos_info *info); long -ncp_del_file_or_subdir(struct ncp_conn *conn, - struct nw_info_struct *dir, char *name); + ncp_del_file_or_subdir(struct ncp_conn *conn, + struct nw_info_struct *dir, char *name); long -ncp_open_create_file_or_subdir(struct ncp_conn *conn, - struct nw_info_struct *dir, char *name, - int open_create_mode, - __u32 create_attributes, - int desired_acc_rights, - struct nw_file_info *target); + ncp_open_create_file_or_subdir(struct ncp_conn *conn, + struct nw_info_struct *dir, char *name, + int open_create_mode, + __u32 create_attributes, + int desired_acc_rights, + struct nw_file_info *target); long -ncp_initialize_search(struct ncp_conn *conn, - const struct nw_info_struct *dir, - int namespace, - struct ncp_search_seq *target); + ncp_initialize_search(struct ncp_conn *conn, + const struct nw_info_struct *dir, + int namespace, + struct ncp_search_seq *target); long -ncp_search_for_file_or_subdir(struct ncp_conn *conn, - struct ncp_search_seq *seq, - struct nw_info_struct *target); + ncp_search_for_file_or_subdir(struct ncp_conn *conn, + struct ncp_search_seq *seq, + struct nw_info_struct *target); long -ncp_ren_or_mov_file_or_subdir(struct ncp_conn *conn, - struct nw_info_struct *old_dir, char *old_name, - struct nw_info_struct *new_dir, char *new_name); + ncp_ren_or_mov_file_or_subdir(struct ncp_conn *conn, + struct nw_info_struct *old_dir, char *old_name, + struct nw_info_struct *new_dir, char *new_name); long -ncp_create_queue_job_and_file(struct ncp_conn *conn, + ncp_create_queue_job_and_file(struct ncp_conn *conn, + __u32 queue_id, + struct queue_job *job); + +long + ncp_close_file_and_start_job(struct ncp_conn *conn, __u32 queue_id, struct queue_job *job); long -ncp_close_file_and_start_job(struct ncp_conn *conn, - __u32 queue_id, - struct queue_job *job); + ncp_attach_to_queue(struct ncp_conn *conn, + __u32 queue_id); long -ncp_attach_to_queue(struct ncp_conn *conn, - __u32 queue_id); + ncp_detach_from_queue(struct ncp_conn *conn, + __u32 queue_id); long -ncp_detach_from_queue(struct ncp_conn *conn, - __u32 queue_id); + ncp_service_queue_job(struct ncp_conn *conn, __u32 queue_id, __u16 job_type, + struct queue_job *job); long -ncp_service_queue_job(struct ncp_conn *conn, __u32 queue_id, __u16 job_type, - struct queue_job *job); + ncp_finish_servicing_job(struct ncp_conn *conn, __u32 queue_id, + __u32 job_number, __u32 charge_info); long -ncp_finish_servicing_job(struct ncp_conn *conn, __u32 queue_id, - __u32 job_number, __u32 charge_info); + ncp_abort_servicing_job(struct ncp_conn *conn, __u32 queue_id, + __u32 job_number); long -ncp_abort_servicing_job(struct ncp_conn *conn, __u32 queue_id, - __u32 job_number); + ncp_get_broadcast_message(struct ncp_conn *conn, char message[256]); long -ncp_get_broadcast_message(struct ncp_conn *conn, char message[256]); - -long -ncp_dealloc_dir_handle(struct ncp_conn *conn, __u8 dir_handle); + ncp_dealloc_dir_handle(struct ncp_conn *conn, __u8 dir_handle); #define NCP_ALLOC_PERMANENT (0x0000) #define NCP_ALLOC_TEMPORARY (0x0001) #define NCP_ALLOC_SPECIAL (0x0002) long -ncp_alloc_short_dir_handle(struct ncp_conn *conn, - struct nw_info_struct *dir, - __u16 alloc_mode, - __u8 *target); + ncp_alloc_short_dir_handle(struct ncp_conn *conn, + struct nw_info_struct *dir, + __u16 alloc_mode, + __u8 * target); long -ncp_get_effective_dir_rights(struct ncp_conn *conn, - struct nw_info_struct *file, - __u16 *target); + ncp_get_effective_dir_rights(struct ncp_conn *conn, + struct nw_info_struct *file, + __u16 * target); struct ncp_trustee_struct { @@ -566,10 +662,10 @@ struct ncp_trustee_struct }; long -ncp_add_trustee_set(struct ncp_conn *conn, - __u8 volume_number, __u32 dir_entry, - __u16 rights_mask, - int object_count, struct ncp_trustee_struct *rights); - + ncp_add_trustee_set(struct ncp_conn *conn, + __u8 volume_number, __u32 dir_entry, + __u16 rights_mask, + int object_count, struct ncp_trustee_struct *rights); -#endif /* _NCPLIB_H */ + +#endif /* _NCPLIB_H */ diff --git a/lib/Makefile b/lib/Makefile index fa86697..5e73e9f 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -28,7 +28,7 @@ install: $(INSTALL_LIB) ncplib.o: ncplib.c ncplib_err.h - $(CC) $(CFLAGS) -finline-functions -c ncplib.c + $(CC) $(CFLAGS) -c ncplib.c COM_ERR_CFILES = com_err/com_err.c com_err/error_message.c com_err/et_name.c \ com_err/init_et.c diff --git a/lib/ncplib.c b/lib/ncplib.c index 7ff183a..5ccad92 100644 --- a/lib/ncplib.c +++ b/lib/ncplib.c @@ -8,12 +8,7 @@ #include "ncplib.h" #include "ncplib_err.h" -typedef __u8 byte; -typedef __u16 word; -typedef __u32 dword; - #include -/* #include */ /* generates a warning here */ extern pid_t wait(int *); #include #include @@ -34,21 +29,22 @@ extern pid_t wait(int *); #include static long -ncp_negotiate_buffersize(struct ncp_conn *conn, - int size, int *target); + ncp_negotiate_buffersize(struct ncp_conn *conn, + int size, int *target); static long -ncp_login_object(struct ncp_conn *conn, - const unsigned char *username, - int login_type, - const unsigned char *password); + ncp_login_object(struct ncp_conn *conn, + const unsigned char *username, + int login_type, + const unsigned char *password); static long -ncp_do_close(struct ncp_conn *conn); + ncp_do_close(struct ncp_conn *conn); void str_upper(char *name) { - while (*name) { + while (*name) + { *name = toupper(*name); name = name + 1; } @@ -60,7 +56,7 @@ static int debug_level = 5; static FILE *logfile = stderr; static void -dprintf(int level, char *p, ...) +dprintf(int level, char *p,...) { va_list ap; @@ -68,7 +64,6 @@ dprintf(int level, char *p, ...) { return; } - va_start(ap, p); vfprintf(logfile, p, ap); va_end(ap); @@ -83,62 +78,62 @@ dprintf(int level, char *p, ...) #include "nwcrypt.c" void -ipx_fprint_node(FILE* file,IPXNode node) +ipx_fprint_node(FILE * file, IPXNode node) { - fprintf(file,"%02X%02X%02X%02X%02X%02X", - (unsigned char)node[0], - (unsigned char)node[1], - (unsigned char)node[2], - (unsigned char)node[3], - (unsigned char)node[4], - (unsigned char)node[5] - ); + fprintf(file, "%02X%02X%02X%02X%02X%02X", + (unsigned char) node[0], + (unsigned char) node[1], + (unsigned char) node[2], + (unsigned char) node[3], + (unsigned char) node[4], + (unsigned char) node[5] + ); } void -ipx_fprint_network(FILE* file,IPXNet net) +ipx_fprint_network(FILE * file, IPXNet net) { - fprintf(file,"%08lX",ntohl(net)); + fprintf(file, "%08lX", ntohl(net)); } void -ipx_fprint_port(FILE* file,IPXPort port) +ipx_fprint_port(FILE * file, IPXPort port) { - fprintf(file,"%04X",ntohs(port)); + fprintf(file, "%04X", ntohs(port)); } void -ipx_fprint_saddr(FILE* file,struct sockaddr_ipx* sipx) +ipx_fprint_saddr(FILE * file, struct sockaddr_ipx *sipx) { - ipx_fprint_network(file,sipx->sipx_network); - fprintf(file,":"); - ipx_fprint_node(file,sipx->sipx_node); - fprintf(file,":"); - ipx_fprint_port(file,sipx->sipx_port); + ipx_fprint_network(file, sipx->sipx_network); + fprintf(file, ":"); + ipx_fprint_node(file, sipx->sipx_node); + fprintf(file, ":"); + ipx_fprint_port(file, sipx->sipx_port); } void ipx_print_node(IPXNode node) { - ipx_fprint_node(stdout,node); + ipx_fprint_node(stdout, node); } void ipx_print_network(IPXNet net) { - ipx_fprint_network(stdout,net); + ipx_fprint_network(stdout, net); } void ipx_print_port(IPXPort port) { - ipx_fprint_port(stdout,port); + ipx_fprint_port(stdout, port); } void -ipx_print_saddr(struct sockaddr_ipx* sipx) +ipx_print_saddr(struct sockaddr_ipx *sipx) { - ipx_fprint_saddr(stdout,sipx); + ipx_fprint_saddr(stdout, sipx); } int @@ -153,8 +148,7 @@ ipx_sscanf_node(char *buf, unsigned char node[6]) { return i; } - - for (i=0; i<6; i++) + for (i = 0; i < 6; i++) { node[i] = n[i]; } @@ -169,7 +163,7 @@ ipx_sscanf_saddr(char *buf, struct sockaddr_ipx *target) addr.sipx_family = AF_IPX; addr.sipx_type = NCP_PTYPE; - + if (sscanf(buf, "%lx", &addr.sipx_network) != 1) { return 1; @@ -205,9 +199,9 @@ ipx_assign_node(IPXNode dest, IPXNode src) } int -ipx_node_equal(IPXNode n1,IPXNode n2) +ipx_node_equal(IPXNode n1, IPXNode n2) { - return memcmp(n1,n2, IPX_NODE_LEN)==0; + return memcmp(n1, n2, IPX_NODE_LEN) == 0; } static int @@ -219,24 +213,24 @@ ipx_recvfrom(int sock, void *buf, int len, unsigned int flags, struct timeval tv; int result; - FD_ZERO(&rd); FD_ZERO(&wr); FD_ZERO(&ex); + FD_ZERO(&rd); + FD_ZERO(&wr); + FD_ZERO(&ex); FD_SET(sock, &rd); - tv.tv_sec = timeout; + tv.tv_sec = timeout; tv.tv_usec = 0; - - if ((result = select(sock+1, &rd, &wr, &ex, &tv)) == -1) + + if ((result = select(sock + 1, &rd, &wr, &ex, &tv)) == -1) { *err = errno; return -1; } - if (FD_ISSET(sock, &rd)) { result = recvfrom(sock, buf, len, flags, - (struct sockaddr *)sender, addrlen); - } - else + (struct sockaddr *) sender, addrlen); + } else { result = -1; errno = ETIMEDOUT; @@ -276,14 +270,12 @@ install_wdog(struct ncp_conn *conn) { return -1; } - if (pid != 0) { /* Parent, should go on as usual */ conn->wdog_pid = pid; return 0; } - while (1) { long err; @@ -298,16 +290,14 @@ install_wdog(struct ncp_conn *conn) anymore */ exit(0); } - - if ( (pktsize != 2) + if ((pktsize != 2) || (buf[1] != '?')) { continue; } - buf[1] = 'Y'; pktsize = sendto(sock, buf, 2, 0, - (struct sockaddr *)&sender, + (struct sockaddr *) &sender, sizeof(sender)); } } @@ -315,7 +305,7 @@ install_wdog(struct ncp_conn *conn) #define ncp_printf printf static void -assert_conn_locked(struct ncp_conn *conn); + assert_conn_locked(struct ncp_conn *conn); static void assert_conn_not_locked(struct ncp_conn *conn) @@ -343,14 +333,15 @@ ncp_unlock_conn(struct ncp_conn *conn) static long do_ncp_call(struct ncp_conn *conn, int request_size) { - struct ncp_request_header request = - *((struct ncp_request_header *)(&(conn->packet))); + struct ncp_request_header request; int result; int retries = 20; int len; long err; + memcpy(&request, conn->packet, sizeof(request)); + while (retries > 0) { struct ncp_reply_header reply; @@ -361,17 +352,16 @@ do_ncp_call(struct ncp_conn *conn, int request_size) result = sendto(conn->ncp_sock, conn->packet, request_size, - 0, (struct sockaddr *)&(conn->i.addr), + 0, (struct sockaddr *) &(conn->i.addr), sizeof(conn->i.addr)); if (result < 0) { return errno; } - - re_select: + re_select: len = ipx_recvfrom(conn->ncp_sock, - (char *)&reply, sizeof(reply), + (char *) &reply, sizeof(reply), MSG_PEEK, &sender, &sizeofaddr, 3, &err); if ((len < 0) && (err == ETIMEDOUT)) @@ -382,30 +372,28 @@ do_ncp_call(struct ncp_conn *conn, int request_size) { return err; } + if ( /* Is the sender wrong? */ + (memcmp(&sender.sipx_node, + &(conn->i.addr.sipx_node), 6) != 0) + || (sender.sipx_port != conn->i.addr.sipx_port) - if ( /* Is the sender wrong? */ - (memcmp(&sender.sipx_node, - &(conn->i.addr.sipx_node), 6) != 0) - || (sender.sipx_port != conn->i.addr.sipx_port) + /* Did the sender send a positive acknowledge? */ + || ((len == sizeof(reply)) + && (reply.type == NCP_POSITIVE_ACK)) - /* Did the sender send a positive acknowledge? */ - || ( (len == sizeof(reply)) - && (reply.type == NCP_POSITIVE_ACK)) - - /* Did we get a bogus answer? */ - || ( (len < sizeof(reply)) - || (reply.type != NCP_REPLY) - || ( (request.type != NCP_ALLOC_SLOT_REQUEST) - && ( (reply.sequence != request.sequence) - || (reply.conn_low != request.conn_low) - || (reply.conn_high != request.conn_high))))) + /* Did we get a bogus answer? */ + || ((len < sizeof(reply)) + || (reply.type != NCP_REPLY) + || ((request.type != NCP_ALLOC_SLOT_REQUEST) + && ((reply.sequence != request.sequence) + || (reply.conn_low != request.conn_low) + || (reply.conn_high != request.conn_high))))) { /* Then throw away the packet */ - ipx_recv(conn->ncp_sock, (char *)&reply, sizeof(reply), + ipx_recv(conn->ncp_sock, (char *) &reply, sizeof(reply), 0, 1, &err); goto re_select; } - ipx_recv(conn->ncp_sock, conn->packet, NCP_PACKET_SIZE, 0, 1, &err); conn->reply_size = len; @@ -417,86 +405,70 @@ do_ncp_call(struct ncp_conn *conn, int request_size) static int ncp_mount_request(struct ncp_conn *conn, int function) { - struct ncp_request_header *h - = (struct ncp_request_header *)(conn->packet); - struct ncp_reply_header *reply - = (struct ncp_reply_header *)(conn->packet); struct ncp_ioctl_request request; - int result; assert_conn_locked(conn); if (conn->has_subfunction != 0) { - *(__u16 *)&(h->data[0]) - = htons(conn->current_size - - sizeof(struct ncp_request_header) - 2); + WSET_HL(conn->packet, 7, conn->current_size + - sizeof(struct ncp_request_header) - 2); } + request.function = function; + request.size = conn->current_size; + request.data = conn->packet; - request.function = function; - request.size = conn->current_size; - request.data = conn->packet; - - if ((result = ioctl(conn->mount_fid,NCP_IOC_NCPREQUEST, &request)) < 0) + if ((result = ioctl(conn->mount_fid, NCP_IOC_NCPREQUEST, &request)) < 0) { return result; } - - conn->completion = reply->completion_code; - conn->conn_status = reply->connection_state; + conn->completion = BVAL(conn->packet, 6); + conn->conn_status = BVAL(conn->packet, 7); conn->ncp_reply_size = result - sizeof(struct ncp_reply_header); - if ((reply->completion_code != 0) && (conn->verbose != 0)) + if ((conn->completion != 0) && (conn->verbose != 0)) { - ncp_printf("ncp_request_error: %d\n", reply->completion_code); + ncp_printf("ncp_request_error: %d\n", conn->completion); } - return reply->completion_code == 0 ? 0 : NCPL_ET_REQUEST_ERROR; + return conn->completion == 0 ? 0 : NCPL_ET_REQUEST_ERROR; } static long ncp_temp_request(struct ncp_conn *conn, int function) { - struct ncp_request_header *h - = (struct ncp_request_header *)&(conn->packet); - struct ncp_reply_header *r - = (struct ncp_reply_header *)&(conn->packet); - long err; assert_conn_locked(conn); + conn->sequence += 1; + + WSET_LH(conn->packet, 0, NCP_REQUEST); + BSET(conn->packet, 2, conn->sequence); + BSET(conn->packet, 3, (conn->i.connection) & 0xff); + BSET(conn->packet, 5, (conn->i.connection) >> 8); + BSET(conn->packet, 4, 1); + BSET(conn->packet, 6, function); + if (conn->has_subfunction != 0) { - *(__u16 *)&(h->data[0]) - = htons(conn->current_size - - sizeof(struct ncp_request_header) - 2); + WSET_HL(conn->packet, 7, conn->current_size + - sizeof(struct ncp_request_header) - 2); } - - h->type = NCP_REQUEST; - - conn->sequence += 1; - h->sequence = conn->sequence; - h->conn_low = (conn->i.connection) & 0xff; - h->conn_high = ((conn->i.connection) & 0xff00) >> 8; - h->task = 1; - h->function = function; - if ((err = do_ncp_call(conn, conn->current_size)) != 0) { return err; } - - conn->completion = r->completion_code; - conn->conn_status = r->connection_state; + conn->completion = BVAL(conn->packet, 6); + conn->conn_status = BVAL(conn->packet, 7); conn->ncp_reply_size = - conn->reply_size - sizeof(struct ncp_reply_header); + conn->reply_size - sizeof(struct ncp_reply_header); - if ((r->completion_code != 0) && (conn->verbose != 0)) + if ((conn->completion != 0) && (conn->verbose != 0)) { - ncp_printf("ncp_completion_code: %d\n", r->completion_code); + ncp_printf("ncp_completion_code: %d\n", conn->completion); } - return r->completion_code == 0 ? 0 : NCPL_ET_REQUEST_ERROR; + return conn->completion == 0 ? 0 : NCPL_ET_REQUEST_ERROR; } #ifdef PACKET_SIGNATURES @@ -513,7 +485,6 @@ ncp_setup_security(struct ncp_conn *conn) { return 0; } - if ((accepted_security & NCP_SEC_SIGNATURE_REQUESTED) == 0) { return 0; @@ -537,9 +508,6 @@ static long ncp_connect_addr(struct ncp_conn *conn, const struct sockaddr_ipx *target, int wdog_needed) { - struct ncp_request_header *h = - (struct ncp_request_header *)&(conn->packet); - struct sockaddr_ipx addr; int addrlen; @@ -548,83 +516,80 @@ ncp_connect_addr(struct ncp_conn *conn, const struct sockaddr_ipx *target, conn->is_connected = NOT_CONNECTED; conn->verbose = 0; - + if ((ncp_sock = socket(AF_IPX, SOCK_DGRAM, PF_IPX)) == -1) { return errno; } - if ((wdog_sock = socket(AF_IPX, SOCK_DGRAM, PF_IPX)) == -1) { return errno; } - - addr.sipx_family = AF_IPX; - addr.sipx_port = htons(0x0); - addr.sipx_type = NCP_PTYPE; + addr.sipx_family = AF_IPX; + addr.sipx_port = htons(0x0); + addr.sipx_type = NCP_PTYPE; addr.sipx_network = IPX_THIS_NET; ipx_assign_node(addr.sipx_node, IPX_THIS_NODE); addrlen = sizeof(addr); - if ( (bind(ncp_sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) - || (getsockname(ncp_sock, (struct sockaddr *)&addr, &addrlen)==-1)) + if ((bind(ncp_sock, (struct sockaddr *) &addr, sizeof(addr)) == -1) + || (getsockname(ncp_sock, (struct sockaddr *) &addr, &addrlen) == -1)) { int saved_errno = errno; - close(ncp_sock); close(wdog_sock); + close(ncp_sock); + close(wdog_sock); return saved_errno; } - addr.sipx_port = htons(ntohs(addr.sipx_port) + 1); - if (bind(wdog_sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) + if (bind(wdog_sock, (struct sockaddr *) &addr, sizeof(addr)) == -1) { int saved_errno = errno; - close(ncp_sock); close(wdog_sock); + close(ncp_sock); + close(wdog_sock); return saved_errno; } - conn->ncp_sock = ncp_sock; conn->wdog_sock = wdog_sock; - h->type = NCP_ALLOC_SLOT_REQUEST; - conn->sequence = 0; - conn->i.addr = *target; - h->sequence = conn->sequence; - h->conn_low = 0xff; - h->conn_high = 0xff; - h->task = 1; - h->function = 0; + conn->i.addr = *target; - if ((err = do_ncp_call(conn, sizeof(*h))) != 0) + WSET_LH(conn->packet, 0, NCP_ALLOC_SLOT_REQUEST); + BSET(conn->packet, 2, conn->sequence); + BSET(conn->packet, 3, 0xff); + BSET(conn->packet, 4, 1); + BSET(conn->packet, 5, 0xff); + BSET(conn->packet, 6, 0); + + if ((err = do_ncp_call(conn, sizeof(struct ncp_request_header))) != 0) { - close(ncp_sock); close(wdog_sock); + close(ncp_sock); + close(wdog_sock); return err; } - if (wdog_needed != 0) { install_wdog(conn); - } - else + } else { conn->wdog_pid = 0; } - conn->sequence = 0; - conn->i.connection = h->conn_low + (h->conn_high * 256); + conn->sequence = 0; + conn->i.connection = + BVAL(conn->packet, 3) + (BVAL(conn->packet, 5) << 8); conn->is_connected = CONN_TEMPORARY; - if ( (ncp_negotiate_buffersize(conn, 1024, - &(conn->i.buffer_size)) != 0) + if ((ncp_negotiate_buffersize(conn, 1024, + &(conn->i.buffer_size)) != 0) || (conn->i.buffer_size < 512) || (conn->i.buffer_size > 1024)) { ncp_do_close(conn); return -1; } - return 0; } @@ -636,11 +601,10 @@ ncp_connect_any(struct ncp_conn *conn, int wdog_needed) const char *server = NULL; long err; - if ((addr = ncp_find_server(&server,NCP_BINDERY_FSERVER,&err)) == NULL) + if ((addr = ncp_find_server(&server, NCP_BINDERY_FSERVER, &err)) == NULL) { return err; } - if ((result = ncp_connect_addr(conn, addr, wdog_needed)) != 0) { return result; @@ -660,7 +624,7 @@ ncp_find_server(const char **server_name, int type, long *err) { char command[256]; char buf[128]; - char server[NCP_BINDERY_NAME_LEN+1]; + char server[NCP_BINDERY_NAME_LEN + 1]; static struct sockaddr_ipx result; FILE *p; int res; @@ -670,10 +634,9 @@ ncp_find_server(const char **server_name, int type, long *err) if (*server_name != NULL) { - strncpy(server, *server_name, sizeof(server)-1); + strncpy(server, *server_name, sizeof(server) - 1); str_upper(server); } - sprintf(command, "nwsfind -t %d %s", type, server); p = popen(command, "r"); @@ -682,7 +645,6 @@ ncp_find_server(const char **server_name, int type, long *err) *err = errno; return NULL; } - fgets(buf, sizeof(buf), p); if (buf[strlen(buf)] - 1 == '\n'); @@ -693,10 +655,9 @@ ncp_find_server(const char **server_name, int type, long *err) if (((res = pclose(p)) != 0) || (ipx_sscanf_saddr(buf, &result) != 0)) { *err = (*server_name != NULL) - ? NCPL_ET_HOST_UNKNOWN : NCPL_ET_NO_SERVER; + ? NCPL_ET_HOST_UNKNOWN : NCPL_ET_NO_SERVER; return NULL; } - if (*server_name == NULL) { if ((n = strchr(buf, ' ')) == NULL) @@ -706,7 +667,6 @@ ncp_find_server(const char **server_name, int type, long *err) } *server_name = n; } - return &result; } @@ -721,17 +681,14 @@ ncp_open_temporary(struct ncp_conn *conn, { return ncp_connect_any(conn, 1); } - if ((addr = ncp_find_fileserver(spec->server, &err)) == NULL) { return err; } - if ((err = ncp_connect_addr(conn, addr, 1)) != 0) { return err; } - strcpy(conn->server, spec->server); if (strlen(spec->user) != 0) @@ -744,7 +701,6 @@ ncp_open_temporary(struct ncp_conn *conn, } strcpy(conn->user, spec->user); } - return 0; } @@ -757,35 +713,32 @@ ncp_find_permanent(const struct ncp_conn_spec *spec) int mount_fid; struct ncp_fs_info i; - initialize_NCPL_error_table(); + initialize_NCPL_error_table(); if ((mtab = fopen(MOUNTED, "r")) == NULL) { return NULL; } - while ((conn_ent = ncp_get_conn_ent(mtab)) != NULL) { if (spec != NULL) { - if ( (conn_ent->uid != spec->uid) - || ( (strlen(spec->server) != 0) + if ((conn_ent->uid != spec->uid) + || ((strlen(spec->server) != 0) && (strcasecmp(conn_ent->server, spec->server) != 0)) - || ( (strlen(spec->user) != 0) + || ((strlen(spec->user) != 0) && (strcasecmp(conn_ent->user, spec->user) != 0))) { continue; } } - mount_fid = open(conn_ent->mount_point, O_RDONLY, 0); if (mount_fid < 0) { continue; } - i.version = NCP_GET_FS_INFO_VERSION; if (ioctl(mount_fid, NCP_IOC_GET_FS_INFO, &i) < 0) @@ -793,7 +746,6 @@ ncp_find_permanent(const struct ncp_conn_spec *spec) close(mount_fid); continue; } - close(mount_fid); result = conn_ent->mount_point; break; @@ -803,7 +755,7 @@ ncp_find_permanent(const struct ncp_conn_spec *spec) errno = (result == NULL) ? ENOENT : 0; return result; } - + static int ncp_open_permanent(struct ncp_conn *conn, const struct ncp_conn_spec *spec) @@ -815,18 +767,15 @@ ncp_open_permanent(struct ncp_conn *conn, errno = EBUSY; return -1; } - if ((mount_point = ncp_find_permanent(spec)) == NULL) { return -1; } - if (strlen(mount_point) >= sizeof(conn->mount_point)) { errno = ENAMETOOLONG; return -1; } - /* The rest has already been done in ncp_find_permanent, so we * do not check errors anymore */ conn->mount_fid = open(mount_point, O_RDONLY, 0); @@ -836,12 +785,11 @@ ncp_open_permanent(struct ncp_conn *conn, { strncpy(conn->server, spec->server, sizeof(conn->server)); strncpy(conn->user, spec->user, sizeof(conn->user)); - } - else + } else { - memset(conn->server, '\0', sizeof(conn->server)); - memset(conn->user, '\0', sizeof(conn->user)); - } + memset(conn->server, '\0', sizeof(conn->server)); + memset(conn->user, '\0', sizeof(conn->user)); + } strcpy(conn->mount_point, mount_point); conn->is_connected = CONN_PERMANENT; return 0; @@ -852,7 +800,7 @@ ncp_open(const struct ncp_conn_spec *spec, long *err) { struct ncp_conn *result; - initialize_NCPL_error_table(); + initialize_NCPL_error_table(); result = malloc(sizeof(struct ncp_conn)); @@ -861,14 +809,12 @@ ncp_open(const struct ncp_conn_spec *spec, long *err) *err = ENOMEM; return NULL; } - memzero(*result); if (ncp_open_permanent(result, spec) == 0) { return result; } - if ((*err = ncp_open_temporary(result, spec)) != 0) { free(result); @@ -883,14 +829,13 @@ ncp_open_mount(const char *mount_point, long *err) { struct ncp_conn *result; - initialize_NCPL_error_table(); + initialize_NCPL_error_table(); if (strlen(mount_point) >= sizeof(result->mount_point)) { *err = ENAMETOOLONG; return NULL; } - result = malloc(sizeof(struct ncp_conn)); if (result == NULL) @@ -898,7 +843,6 @@ ncp_open_mount(const char *mount_point, long *err) *err = ENOMEM; return NULL; } - memzero(*result); result->is_connected = NOT_CONNECTED; @@ -927,24 +871,21 @@ ncp_open_mount(const char *mount_point, long *err) static long ncp_user_disconnect(struct ncp_conn *conn) { - struct ncp_request_header *h - = (struct ncp_request_header *)(conn->packet); long result; - h->type = NCP_DEALLOC_SLOT_REQUEST; - conn->sequence += 1; - h->sequence = conn->sequence; - h->conn_low = (conn->i.connection) & 0xff; - h->conn_high = ((conn->i.connection) & 0xff00) >> 8; - h->task = 1; - h->function = 0; - if ((result = do_ncp_call(conn, sizeof(*h))) != 0) + WSET_LH(conn->packet, 0, NCP_DEALLOC_SLOT_REQUEST); + BSET(conn->packet, 2, conn->sequence); + BSET(conn->packet, 3, (conn->i.connection) & 0xff); + BSET(conn->packet, 4, 1); + BSET(conn->packet, 5, (conn->i.connection) >> 8); + BSET(conn->packet, 6, 0); + + if ((result = do_ncp_call(conn, sizeof(struct ncp_request_header))) != 0) { return result; } - close(conn->ncp_sock); close(conn->wdog_sock); @@ -953,7 +894,6 @@ ncp_user_disconnect(struct ncp_conn *conn) kill(conn->wdog_pid, SIGTERM); wait(NULL); } - return 0; } @@ -967,7 +907,7 @@ ncp_do_close(struct ncp_conn *conn) case CONN_PERMANENT: result = close(conn->mount_fid); break; - + case CONN_TEMPORARY: result = ncp_user_disconnect(conn); break; @@ -975,7 +915,7 @@ ncp_do_close(struct ncp_conn *conn) default: break; } - + conn->is_connected = NOT_CONNECTED; return result; @@ -989,7 +929,6 @@ ncp_close(struct ncp_conn *conn) { return 0; } - if ((result = ncp_do_close(conn)) != 0) { return result; @@ -999,10 +938,10 @@ ncp_close(struct ncp_conn *conn) } struct ncp_conn_ent * -ncp_get_conn_ent(FILE *filep) +ncp_get_conn_ent(FILE * filep) { static struct ncp_conn_ent entry; - char server[2*NCP_BINDERY_NAME_LEN]; + char server[2 * NCP_BINDERY_NAME_LEN]; char *user; struct mntent *mnt_ent; int fid; @@ -1016,12 +955,10 @@ ncp_get_conn_ent(FILE *filep) { continue; } - if (strlen(mnt_ent->mnt_fsname) >= sizeof(server)) { continue; } - strcpy(server, mnt_ent->mnt_fsname); user = strchr(server, '/'); if (user != NULL) @@ -1034,8 +971,7 @@ ncp_get_conn_ent(FILE *filep) } strcpy(entry.user, user); } - - if ( (strlen(server) >= sizeof(entry.server)) + if ((strlen(server) >= sizeof(entry.server)) || (strlen(mnt_ent->mnt_dir) >= sizeof(entry.mount_point))) { continue; @@ -1049,12 +985,11 @@ ncp_get_conn_ent(FILE *filep) { continue; } - - if (ioctl(fid, NCP_IOC_GETMOUNTUID, &entry.uid) != 0) { + if (ioctl(fid, NCP_IOC_GETMOUNTUID, &entry.uid) != 0) + { close(fid); continue; } - close(fid); return &entry; } @@ -1063,7 +998,7 @@ ncp_get_conn_ent(FILE *filep) } static struct ncp_conn_spec * -ncp_get_nwc_ent(FILE *nwc) +ncp_get_nwc_ent(FILE * nwc) { static struct ncp_conn_spec spec; char line[512]; @@ -1076,18 +1011,16 @@ ncp_get_nwc_ent(FILE *nwc) while (fgets(line, sizeof(line), nwc) != NULL) { - if ( (line[0] == '\n') + if ((line[0] == '\n') || (line[0] == '#')) { continue; } - line_len = strlen(line); - if (line[line_len-1] == '\n') + if (line[line_len - 1] == '\n') { - line[line_len-1] = '\0'; + line[line_len - 1] = '\0'; } - user = strchr(line, '/'); password = strchr(user != NULL ? user : line, ' '); @@ -1096,7 +1029,6 @@ ncp_get_nwc_ent(FILE *nwc) *password = '\0'; password += 1; } - if (user != NULL) { *user = '\0'; @@ -1107,7 +1039,6 @@ ncp_get_nwc_ent(FILE *nwc) } strcpy(spec.user, user); } - if (strlen(line) >= sizeof(spec.server)) { continue; @@ -1143,12 +1074,10 @@ ncp_fopen_nwc(const char *user, const char *mode, long *err) { mode = "r"; } - if (user == NULL) { home = getenv("HOME"); - } - else + } else { struct passwd *pwd; @@ -1158,13 +1087,12 @@ ncp_fopen_nwc(const char *user, const char *mode, long *err) } } - if ( (home == NULL) - || (strlen(home) + sizeof(NWCLIENT) + 2 > sizeof(path))) + if ((home == NULL) + || (strlen(home) + sizeof(NWCLIENT) + 2 > sizeof(path))) { *err = ENAMETOOLONG; return NULL; } - strcpy(path, home); strcat(path, "/"); strcat(path, NWCLIENT); @@ -1174,13 +1102,11 @@ ncp_fopen_nwc(const char *user, const char *mode, long *err) *err = errno; return NULL; } - if ((st.st_mode & (S_IRWXO | S_IRWXG)) != 0) { *err = NCPL_ET_INVALID_MODE; return NULL; } - return fopen(path, mode); } @@ -1196,7 +1122,7 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, FILE *nwc; struct ncp_conn_spec *nwc_ent; - initialize_NCPL_error_table(); + initialize_NCPL_error_table(); *err = 0; memzero(spec); @@ -1210,15 +1136,13 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, return NULL; } strcpy(spec.server, server); - } - else + } else { if ((nwc = ncp_fopen_nwc(NULL, NULL, err)) == NULL) { *err = NCPL_ET_NO_SERVER; return NULL; } - nwc_ent = ncp_get_nwc_ent(nwc); fclose(nwc); @@ -1239,7 +1163,6 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, memset(spec.password, 0, sizeof(spec.password)); return &spec; } - if (user != NULL) { if (strlen(user) >= sizeof(spec.user)) @@ -1249,7 +1172,6 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, } strcpy(spec.user, user); } - str_upper(spec.user); spec.login_type = NCP_BINDERY_USER; @@ -1258,7 +1180,6 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, ncp_do_close(&conn); return &spec; } - if (password != NULL) { if (strlen(password) >= sizeof(spec.password)) @@ -1267,16 +1188,15 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, return NULL; } strcpy(spec.password, password); - } - else + } else { if ((nwc = ncp_fopen_nwc(NULL, NULL, err)) != NULL) { while ((nwc_ent = ncp_get_nwc_ent(nwc)) != NULL) { - if ( (strcasecmp(spec.server, - nwc_ent->server) != 0) - || ( (*spec.user != '\0') + if ((strcasecmp(spec.server, + nwc_ent->server) != 0) + || ((*spec.user != '\0') && (strcasecmp(spec.user, nwc_ent->user) != 0))) { @@ -1295,7 +1215,6 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, *err = NCPL_ET_NO_USER; return NULL; } - if ((strlen(spec.password) == 0) && (password == NULL)) { char *password; @@ -1312,8 +1231,7 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, return NULL; } strcpy(spec.password, password); - } - else + } else { if (strcmp(spec.password, NWC_NOPASSWORD) == 0) { @@ -1331,8 +1249,8 @@ struct ncp_conn * ncp_initialize_as(int *argc, char **argv, int login_necessary, int login_type, long *err) { - char *server = NULL; - char *user = NULL; + char *server = NULL; + char *user = NULL; char *password = NULL; struct ncp_conn_spec *spec; int i = 1; @@ -1343,40 +1261,38 @@ ncp_initialize_as(int *argc, char **argv, if (target != NULL) { - if (arg_no+1 >= *argc) + if (arg_no + 1 >= *argc) { /* No argument to switch */ errno = EINVAL; return -1; } - *target = argv[arg_no+1]; + *target = argv[arg_no + 1]; count = 2; } - /* Delete the consumed switch from the argument list and decrement the argument count */ - while (count+arg_no < *argc) + while (count + arg_no < *argc) { - argv[arg_no] = argv[arg_no+count]; + argv[arg_no] = argv[arg_no + count]; arg_no += 1; } *argc -= count; return 0; } - initialize_NCPL_error_table(); + initialize_NCPL_error_table(); *err = EINVAL; while (i < *argc) { - if ( (argv[i][0] != '-') + if ((argv[i][0] != '-') || (strlen(argv[i]) != 2)) { i += 1; continue; } - switch (argv[i][1]) { case 'S': @@ -1416,23 +1332,20 @@ ncp_initialize_as(int *argc, char **argv, if (login_necessary != 0) { return NULL; - } - else + } else { return ncp_open(NULL, err); } } - spec->login_type = login_type; if (login_necessary == 0) { spec->user[0] = '\0'; } - return ncp_open(spec, err); } - + struct ncp_conn * ncp_initialize(int *argc, char **argv, int login_necessary, long *err) @@ -1444,7 +1357,8 @@ ncp_initialize(int *argc, char **argv, static long ncp_request(struct ncp_conn *conn, int function) { - switch (conn->is_connected) { + switch (conn->is_connected) + { case CONN_PERMANENT: return ncp_mount_request(conn, function); case CONN_TEMPORARY: @@ -1463,17 +1377,18 @@ ncp_request(struct ncp_conn *conn, int function) static inline int min(int a, int b) { - return (asecond; - u_time.tm_min = source->minute; - u_time.tm_hour = source->hour; - u_time.tm_mday = source->day; - u_time.tm_mon = source->month - 1; - u_time.tm_year = source->year; + u_time.tm_sec = source->second; + u_time.tm_min = source->minute; + u_time.tm_hour = source->hour; + u_time.tm_mday = source->day; + u_time.tm_mon = source->month - 1; + u_time.tm_year = source->year; if (u_time.tm_year < 80) { u_time.tm_year += 100; } - return mktime(&u_time); } static void assert_conn_locked(struct ncp_conn *conn) { - if (conn->lock == 0) { + if (conn->lock == 0) + { ncp_printf("ncpfs: conn not locked!\n"); } } @@ -1509,25 +1424,43 @@ static void ncp_add_byte(struct ncp_conn *conn, byte x) { assert_conn_locked(conn); - *(byte *)(&(conn->packet[conn->current_size])) = x; + BSET(conn->packet, conn->current_size, x); conn->current_size += 1; return; } static void -ncp_add_word(struct ncp_conn *conn, word x) +ncp_add_word_lh(struct ncp_conn *conn, word x) { assert_conn_locked(conn); - *(word *)(&(conn->packet[conn->current_size])) = x; + WSET_LH(conn->packet, conn->current_size, x); conn->current_size += 2; return; } static void -ncp_add_dword(struct ncp_conn *conn, dword x) +ncp_add_dword_lh(struct ncp_conn *conn, dword x) { assert_conn_locked(conn); - *(dword *)(&(conn->packet[conn->current_size])) = x; + DSET_LH(conn->packet, conn->current_size, x); + conn->current_size += 4; + return; +} + +static void +ncp_add_word_hl(struct ncp_conn *conn, word x) +{ + assert_conn_locked(conn); + WSET_HL(conn->packet, conn->current_size, x); + conn->current_size += 2; + return; +} + +static void +ncp_add_dword_hl(struct ncp_conn *conn, dword x) +{ + assert_conn_locked(conn); + DSET_HL(conn->packet, conn->current_size, x); conn->current_size += 4; return; } @@ -1546,7 +1479,8 @@ ncp_add_pstring(struct ncp_conn *conn, const char *s) { int len = strlen(s); assert_conn_locked(conn); - if (len > 255) { + if (len > 255) + { ncp_printf("ncpfs: string too long: %s\n", s); len = 255; } @@ -1568,7 +1502,7 @@ static void ncp_init_request_s(struct ncp_conn *conn, int subfunction) { ncp_init_request(conn); - ncp_add_word(conn, 0); /* preliminary size */ + ncp_add_word_lh(conn, 0); /* preliminary size */ ncp_add_byte(conn, subfunction); @@ -1584,19 +1518,31 @@ ncp_reply_data(struct ncp_conn *conn, int offset) static byte ncp_reply_byte(struct ncp_conn *conn, int offset) { - return *(byte *)(ncp_reply_data(conn, offset)); + return *(byte *) (ncp_reply_data(conn, offset)); } static word -ncp_reply_word(struct ncp_conn *conn, int offset) +ncp_reply_word_hl(struct ncp_conn *conn, int offset) { - return *(word *)(ncp_reply_data(conn, offset)); + return WVAL_HL(ncp_reply_data(conn, offset), 0); +} + +static word +ncp_reply_word_lh(struct ncp_conn *conn, int offset) +{ + return WVAL_LH(ncp_reply_data(conn, offset), 0); } static dword -ncp_reply_dword(struct ncp_conn *conn, int offset) +ncp_reply_dword_hl(struct ncp_conn *conn, int offset) { - return *(dword *)(ncp_reply_data(conn, offset)); + return DVAL_HL(ncp_reply_data(conn, offset), 0); +} + +static dword +ncp_reply_dword_lh(struct ncp_conn *conn, int offset) +{ + return DVAL_LH(ncp_reply_data(conn, offset), 0); } /* Here the ncp calls begin @@ -1609,14 +1555,14 @@ ncp_negotiate_buffersize(struct ncp_conn *conn, long result; ncp_init_request(conn); - ncp_add_word(conn, htons(size)); - - if ((result = ncp_request(conn, 33)) != 0) { + ncp_add_word_hl(conn, size); + + if ((result = ncp_request(conn, 33)) != 0) + { ncp_unlock_conn(conn); return result; } - - *target =min(ntohs(ncp_reply_word(conn, 0)), size); + *target = min(ncp_reply_word_hl(conn, 0), size); ncp_unlock_conn(conn); return 0; @@ -1636,14 +1582,13 @@ ncp_get_file_server_description_strings(struct ncp_conn *conn, ncp_unlock_conn(conn); return result; } - memcpy(target, ncp_reply_data(conn, 0), 512); ncp_unlock_conn(conn); return 0; } long -ncp_get_file_server_time(struct ncp_conn *conn, time_t *target) +ncp_get_file_server_time(struct ncp_conn *conn, time_t * target) { long result; @@ -1654,14 +1599,13 @@ ncp_get_file_server_time(struct ncp_conn *conn, time_t *target) ncp_unlock_conn(conn); return result; } - - *target= nw_to_ctime((struct nw_time_buffer *)ncp_reply_data(conn, 0)); + *target = nw_to_ctime((struct nw_time_buffer *) ncp_reply_data(conn, 0)); ncp_unlock_conn(conn); return 0; } long -ncp_set_file_server_time(struct ncp_conn *conn, time_t *source) +ncp_set_file_server_time(struct ncp_conn *conn, time_t * source) { long result; int year; @@ -1672,10 +1616,9 @@ ncp_set_file_server_time(struct ncp_conn *conn, time_t *source) { year -= 100; } - ncp_init_request_s(conn, 202); ncp_add_byte(conn, year); - ncp_add_byte(conn, utime->tm_mon+1); + ncp_add_byte(conn, utime->tm_mon + 1); ncp_add_byte(conn, utime->tm_mday); ncp_add_byte(conn, utime->tm_hour); ncp_add_byte(conn, utime->tm_min); @@ -1697,16 +1640,15 @@ ncp_get_file_server_information(struct ncp_conn *conn, ncp_unlock_conn(conn); return result; } - memcpy(target, ncp_reply_data(conn, 0), sizeof(*target)); target->MaximumServiceConnections - = htons(target->MaximumServiceConnections); + = htons(target->MaximumServiceConnections); target->ConnectionsInUse - = htons(target->ConnectionsInUse); + = htons(target->ConnectionsInUse); target->MaxConnectionsEverUsed - = htons(target->MaxConnectionsEverUsed); + = htons(target->MaxConnectionsEverUsed); target->NumberMountedVolumes - = htons(target->NumberMountedVolumes); + = htons(target->NumberMountedVolumes); ncp_unlock_conn(conn); return 0; } @@ -1719,7 +1661,7 @@ ncp_get_connlist(struct ncp_conn *conn, long result; ncp_init_request_s(conn, 21); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); if ((result = ncp_request(conn, 23)) != 0) @@ -1727,7 +1669,6 @@ ncp_get_connlist(struct ncp_conn *conn, ncp_unlock_conn(conn); return result; } - *returned_no = ncp_reply_byte(conn, 0); memcpy(conn_numbers, ncp_reply_data(conn, 1), (*returned_no)); ncp_unlock_conn(conn); @@ -1738,11 +1679,11 @@ long ncp_get_stations_logged_info(struct ncp_conn *conn, __u32 connection, struct ncp_bindery_object *target, - time_t *login_time) + time_t * login_time) { long result; ncp_init_request_s(conn, 28); - ncp_add_dword(conn, connection); + ncp_add_dword_lh(conn, connection); if ((result = ncp_request(conn, 23)) != 0) { @@ -1750,8 +1691,8 @@ ncp_get_stations_logged_info(struct ncp_conn *conn, return result; } memset(target, 0, sizeof(*target)); - target->object_id = ntohl(ncp_reply_dword(conn, 0)); - target->object_type = ntohs(ncp_reply_word(conn, 4)); + target->object_id = ncp_reply_dword_hl(conn, 0); + target->object_type = ncp_reply_word_hl(conn, 4); memcpy(target->object_name, ncp_reply_data(conn, 6), sizeof(target->object_name)); *login_time = nw_to_ctime((struct nw_time_buffer *) @@ -1764,22 +1705,21 @@ long ncp_get_internet_address(struct ncp_conn *conn, __u32 connection, struct sockaddr_ipx *target, - __u8 *conn_type) + __u8 * conn_type) { long result; ncp_init_request_s(conn, 26); - ncp_add_dword(conn, connection); + ncp_add_dword_lh(conn, connection); if ((result = ncp_request(conn, 23)) != 0) { ncp_unlock_conn(conn); return result; } - memset(target, 0, sizeof(*target)); - target->sipx_network = ncp_reply_dword(conn, 0); + target->sipx_network = ncp_reply_dword_lh(conn, 0); memcpy(&(target->sipx_node), ncp_reply_data(conn, 4), 6); - target->sipx_port = ncp_reply_word(conn, 10); + target->sipx_port = ncp_reply_word_lh(conn, 10); *conn_type = ncp_reply_byte(conn, 12); ncp_unlock_conn(conn); return 0; @@ -1787,7 +1727,7 @@ ncp_get_internet_address(struct ncp_conn *conn, long ncp_send_broadcast(struct ncp_conn *conn, - __u8 no_conn, const __u8 *connections, + __u8 no_conn, const __u8 * connections, const char *message) { long result; @@ -1796,10 +1736,9 @@ ncp_send_broadcast(struct ncp_conn *conn, { return NCPL_ET_MSG_TOO_LONG; } - ncp_init_request_s(conn, 0); ncp_add_byte(conn, no_conn); - ncp_add_mem(conn, (char *)(connections), no_conn); + ncp_add_mem(conn, (char *) (connections), no_conn); ncp_add_pstring(conn, message); result = ncp_request(conn, 21); @@ -1818,18 +1757,18 @@ ncp_get_encryption_key(struct ncp_conn *conn, ncp_init_request_s(conn, 23); - if ((result = ncp_request(conn, 23)) != 0) { + if ((result = ncp_request(conn, 23)) != 0) + { ncp_unlock_conn(conn); return result; } - - if (conn->ncp_reply_size < 8) { + if (conn->ncp_reply_size < 8) + { ncp_printf("ncp_reply_size %d < 8\n", - conn->ncp_reply_size); + conn->ncp_reply_size); ncp_unlock_conn(conn); return result; } - memcpy(target, ncp_reply_data(conn, 0), 8); ncp_unlock_conn(conn); return 0; @@ -1843,23 +1782,23 @@ ncp_get_bindery_object_id(struct ncp_conn *conn, { long result; ncp_init_request_s(conn, 53); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); - if ((result = ncp_request(conn, 23)) != 0) { + if ((result = ncp_request(conn, 23)) != 0) + { ncp_unlock_conn(conn); return result; } - - if (conn->ncp_reply_size < 54) { + if (conn->ncp_reply_size < 54) + { ncp_printf("ncp_reply_size %d < 54\n", - conn->ncp_reply_size); + conn->ncp_reply_size); ncp_unlock_conn(conn); return result; } - - target->object_id = ntohl(ncp_reply_dword(conn, 0)); - target->object_type = ntohs(ncp_reply_word (conn, 4)); + target->object_id = ncp_reply_dword_hl(conn, 0); + target->object_type = ncp_reply_word_hl(conn, 4); memcpy(target->object_name, ncp_reply_data(conn, 6), 48); ncp_unlock_conn(conn); return 0; @@ -1872,15 +1811,15 @@ ncp_get_bindery_object_name(struct ncp_conn *conn, { long result; ncp_init_request_s(conn, 54); - ncp_add_dword(conn, htonl(object_id)); + ncp_add_dword_hl(conn, object_id); - if ((result = ncp_request(conn, 23)) != 0) { + if ((result = ncp_request(conn, 23)) != 0) + { ncp_unlock_conn(conn); return result; } - - target->object_id = ntohl(ncp_reply_dword(conn, 0)); - target->object_type = ntohs(ncp_reply_word (conn, 4)); + target->object_id = ncp_reply_dword_hl(conn, 0); + target->object_type = ncp_reply_word_hl(conn, 4); memcpy(target->object_name, ncp_reply_data(conn, 6), 48); ncp_unlock_conn(conn); return 0; @@ -1893,17 +1832,17 @@ ncp_scan_bindery_object(struct ncp_conn *conn, { long result; ncp_init_request_s(conn, 55); - ncp_add_dword(conn, htonl(last_id)); - ncp_add_word(conn, htons(object_type)); + ncp_add_dword_hl(conn, last_id); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, search_string); - if ((result = ncp_request(conn, 23)) != 0) { + if ((result = ncp_request(conn, 23)) != 0) + { ncp_unlock_conn(conn); return result; } - - target->object_id = ntohl(ncp_reply_dword(conn, 0)); - target->object_type = ntohs(ncp_reply_word(conn, 4)); + target->object_id = ncp_reply_dword_hl(conn, 0); + target->object_type = ncp_reply_word_hl(conn, 4); memcpy(target->object_name, ncp_reply_data(conn, 6), NCP_BINDERY_NAME_LEN); target->object_flags = ncp_reply_byte(conn, 54); @@ -1913,7 +1852,7 @@ ncp_scan_bindery_object(struct ncp_conn *conn, ncp_unlock_conn(conn); return 0; } - + long ncp_create_bindery_object(struct ncp_conn *conn, __u16 object_type, @@ -1925,7 +1864,7 @@ ncp_create_bindery_object(struct ncp_conn *conn, ncp_init_request_s(conn, 50); ncp_add_byte(conn, object_status); ncp_add_byte(conn, object_security); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); result = ncp_request(conn, 23); @@ -1941,7 +1880,7 @@ ncp_delete_bindery_object(struct ncp_conn *conn, { long result; ncp_init_request_s(conn, 51); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); result = ncp_request(conn, 23); @@ -1957,16 +1896,16 @@ ncp_read_property_value(struct ncp_conn *conn, { long result; ncp_init_request_s(conn, 61); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); ncp_add_byte(conn, segment); ncp_add_pstring(conn, prop_name); - if ((result = ncp_request(conn, 23)) != 0) { + if ((result = ncp_request(conn, 23)) != 0) + { ncp_unlock_conn(conn); return result; } - memcpy(&(target->value), ncp_reply_data(conn, 0), 128); target->more_flag = ncp_reply_byte(conn, 128); target->property_flag = ncp_reply_byte(conn, 129); @@ -1979,26 +1918,26 @@ long ncp_scan_property(struct ncp_conn *conn, __u16 object_type, const char *object_name, __u32 last_id, char *search_string, - struct ncp_property_info *property_info) + struct ncp_property_info *property_info) { long result; ncp_init_request_s(conn, 60); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); - ncp_add_dword(conn, htonl(last_id)); + ncp_add_dword_hl(conn, last_id); ncp_add_pstring(conn, search_string); - if ((result = ncp_request(conn, 23)) != 0) { + if ((result = ncp_request(conn, 23)) != 0) + { ncp_unlock_conn(conn); return result; } - - memcpy(property_info->property_name,ncp_reply_data(conn, 0), 16); - property_info->property_flags = ncp_reply_byte(conn,16); - property_info->property_security = ncp_reply_byte(conn,17); - property_info->search_instance = ntohl(ncp_reply_dword(conn,18)); - property_info->value_available_flag = ncp_reply_byte(conn,22); - property_info->more_properties_flag = ncp_reply_byte(conn,23); + memcpy(property_info->property_name, ncp_reply_data(conn, 0), 16); + property_info->property_flags = ncp_reply_byte(conn, 16); + property_info->property_security = ncp_reply_byte(conn, 17); + property_info->search_instance = ncp_reply_dword_hl(conn, 18); + property_info->value_available_flag = ncp_reply_byte(conn, 22); + property_info->more_properties_flag = ncp_reply_byte(conn, 23); ncp_unlock_conn(conn); return 0; } @@ -2012,10 +1951,10 @@ ncp_add_object_to_set(struct ncp_conn *conn, { long result; ncp_init_request_s(conn, 65); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); ncp_add_pstring(conn, property_name); - ncp_add_word(conn, htons(member_type)); + ncp_add_word_hl(conn, member_type); ncp_add_pstring(conn, member_name); result = ncp_request(conn, 23); @@ -2026,12 +1965,12 @@ ncp_add_object_to_set(struct ncp_conn *conn, long ncp_change_property_security(struct ncp_conn *conn, __u16 object_type, const char *object_name, - const char *property_name, + const char *property_name, __u8 property_security) { long result; ncp_init_request_s(conn, 59); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); ncp_add_byte(conn, property_security); ncp_add_pstring(conn, property_name); @@ -2043,13 +1982,13 @@ ncp_change_property_security(struct ncp_conn *conn, long ncp_create_property(struct ncp_conn *conn, - __u16 object_type, const char *object_name, - const char *property_name, - __u8 property_flags, __u8 property_security) + __u16 object_type, const char *object_name, + const char *property_name, + __u8 property_flags, __u8 property_security) { long result; ncp_init_request_s(conn, 57); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); ncp_add_byte(conn, property_flags); ncp_add_byte(conn, property_security); @@ -2069,10 +2008,10 @@ ncp_delete_object_from_set(struct ncp_conn *conn, { long result; ncp_init_request_s(conn, 66); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); ncp_add_pstring(conn, property_name); - ncp_add_word(conn, htons(member_type)); + ncp_add_word_hl(conn, member_type); ncp_add_pstring(conn, member_name); result = ncp_request(conn, 23); @@ -2080,14 +2019,14 @@ ncp_delete_object_from_set(struct ncp_conn *conn, return result; } -long +long ncp_delete_property(struct ncp_conn *conn, __u16 object_type, const char *object_name, const char *property_name) { long result; ncp_init_request_s(conn, 58); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); ncp_add_pstring(conn, property_name); @@ -2098,16 +2037,16 @@ ncp_delete_property(struct ncp_conn *conn, long ncp_write_property_value(struct ncp_conn *conn, - __u16 object_type, const char *object_name, - const char *property_name, + __u16 object_type, const char *object_name, + const char *property_name, __u8 segment, struct nw_property *property_value) { long result; ncp_init_request_s(conn, 62); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); - ncp_add_byte(conn,segment); + ncp_add_byte(conn, segment); ncp_add_byte(conn, property_value->more_flag); ncp_add_pstring(conn, property_name); ncp_add_mem(conn, property_value->value, 128); @@ -2120,14 +2059,14 @@ ncp_write_property_value(struct ncp_conn *conn, long ncp_get_big_ncp_max_packet_size(struct ncp_conn *conn, __u16 proposed_max_size, - __u8 proposed_security_flag, - __u16 *accepted_max_size, - __u16 *echo_socket, - __u8 *accepted_security_flag) + __u8 proposed_security_flag, + __u16 * accepted_max_size, + __u16 * echo_socket, + __u8 * accepted_security_flag) { long result; ncp_init_request(conn); - ncp_add_word(conn, htons(proposed_max_size)); + ncp_add_word_hl(conn, proposed_max_size); ncp_add_byte(conn, proposed_security_flag); if ((result = ncp_request(conn, 97)) != 0) @@ -2135,8 +2074,8 @@ ncp_get_big_ncp_max_packet_size(struct ncp_conn *conn, ncp_unlock_conn(conn); return result; } - *accepted_max_size = ntohs(ncp_reply_word(conn, 0)); - *echo_socket = ntohs(ncp_reply_word(conn, 2)); + *accepted_max_size = ncp_reply_word_hl(conn, 0); + *echo_socket = ncp_reply_word_hl(conn, 2); *accepted_security_flag = ncp_reply_byte(conn, 4); ncp_unlock_conn(conn); return 0; @@ -2153,12 +2092,12 @@ ncp_login_encrypted(struct ncp_conn *conn, unsigned char encrypted[8]; long result; - shuffle((byte *)&tmpID, passwd, strlen(passwd), buf); + shuffle((byte *) & tmpID, passwd, strlen(passwd), buf); nw_encrypt(key, buf, encrypted); ncp_init_request_s(conn, 24); ncp_add_mem(conn, encrypted, 8); - ncp_add_word(conn, htons(object->object_type)); + ncp_add_word_hl(conn, object->object_type); ncp_add_pstring(conn, object->object_name); result = ncp_request(conn, 23); @@ -2173,7 +2112,7 @@ ncp_login_unencrypted(struct ncp_conn *conn, { long result; ncp_init_request_s(conn, 20); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); ncp_add_pstring(conn, passwd); result = ncp_request(conn, 23); @@ -2190,17 +2129,17 @@ ncp_change_login_passwd(struct ncp_conn *conn, { long id = htonl(object->object_id); unsigned char cryptkey[8]; - unsigned char newpwd[16]; /* new passwd as stored by server */ - unsigned char oldpwd[16]; /* old passwd as stored by server */ + unsigned char newpwd[16]; /* new passwd as stored by server */ + unsigned char oldpwd[16]; /* old passwd as stored by server */ unsigned char len; long result; memcpy(cryptkey, key, 8); - shuffle((byte *)&id, oldpasswd, strlen(oldpasswd), oldpwd); - shuffle((byte *)&id, newpasswd, strlen(newpasswd), newpwd); + shuffle((byte *) & id, oldpasswd, strlen(oldpasswd), oldpwd); + shuffle((byte *) & id, newpasswd, strlen(newpasswd), newpwd); nw_encrypt(cryptkey, oldpwd, cryptkey); newpassencrypt(oldpwd, newpwd, newpwd); - newpassencrypt(oldpwd+8, newpwd+8, newpwd+8); + newpassencrypt(oldpwd + 8, newpwd + 8, newpwd + 8); if ((len = strlen(newpasswd)) > 63) { len = 63; @@ -2209,7 +2148,7 @@ ncp_change_login_passwd(struct ncp_conn *conn, ncp_init_request_s(conn, 75); ncp_add_mem(conn, cryptkey, 8); - ncp_add_word(conn, htons(object->object_type)); + ncp_add_word_hl(conn, object->object_type); ncp_add_pstring(conn, object->object_name); ncp_add_byte(conn, len); ncp_add_mem(conn, newpwd, 16); @@ -2225,7 +2164,7 @@ ncp_login_user(struct ncp_conn *conn, { return ncp_login_object(conn, username, NCP_BINDERY_USER, password); } - + static long ncp_login_object(struct ncp_conn *conn, const unsigned char *username, @@ -2236,28 +2175,27 @@ ncp_login_object(struct ncp_conn *conn, unsigned char ncp_key[8]; struct ncp_bindery_object user; - if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) { + if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) + { return ncp_login_unencrypted(conn, login_type, username, password); } - if ((result = ncp_get_bindery_object_id(conn, login_type, - username, &user)) != 0) { + username, &user)) != 0) + { return result; } - if ((result = ncp_login_encrypted(conn, &user, ncp_key, password)) != 0) { struct nw_property p; struct ncp_prop_login_control *l - = (struct ncp_prop_login_control *)&p; + = (struct ncp_prop_login_control *) &p; if (conn->completion != NCP_GRACE_PERIOD) { return result; } - fprintf(stderr, "Your password has expired\n"); if ((result = ncp_read_property_value(conn, NCP_BINDERY_USER, @@ -2282,28 +2220,28 @@ ncp_get_volume_info_with_number(struct ncp_conn *conn, int n, ncp_init_request_s(conn, 44); ncp_add_byte(conn, n); - if ((result = ncp_request(conn, 22)) != 0) { + if ((result = ncp_request(conn, 22)) != 0) + { ncp_unlock_conn(conn); return result; } - - target->total_blocks = ncp_reply_dword(conn, 0); - target->free_blocks = ncp_reply_dword(conn, 4); - target->purgeable_blocks = ncp_reply_dword(conn, 8); - target->not_yet_purgeable_blocks = ncp_reply_dword(conn, 12); - target->total_dir_entries = ncp_reply_dword(conn, 16); - target->available_dir_entries = ncp_reply_dword(conn, 20); + target->total_blocks = ncp_reply_dword_lh(conn, 0); + target->free_blocks = ncp_reply_dword_lh(conn, 4); + target->purgeable_blocks = ncp_reply_dword_lh(conn, 8); + target->not_yet_purgeable_blocks = ncp_reply_dword_lh(conn, 12); + target->total_dir_entries = ncp_reply_dword_lh(conn, 16); + target->available_dir_entries = ncp_reply_dword_lh(conn, 20); target->sectors_per_block = ncp_reply_byte(conn, 28); memzero(target->volume_name); len = ncp_reply_byte(conn, 29); - if (len > NCP_VOLNAME_LEN) { + if (len > NCP_VOLNAME_LEN) + { ncp_printf("ncpfs: volume name too long: %d\n", len); ncp_unlock_conn(conn); return -EIO; } - memcpy(&(target->volume_name), ncp_reply_data(conn, 30), len); ncp_unlock_conn(conn); return 0; @@ -2317,11 +2255,11 @@ ncp_get_volume_number(struct ncp_conn *conn, const char *name, int *target) ncp_init_request_s(conn, 5); ncp_add_pstring(conn, name); - if ((result = ncp_request(conn, 22)) != 0) { + if ((result = ncp_request(conn, 22)) != 0) + { ncp_unlock_conn(conn); return result; } - *target = ncp_reply_byte(conn, 0); ncp_unlock_conn(conn); return 0; @@ -2339,19 +2277,19 @@ ncp_file_search_init(struct ncp_conn *conn, ncp_add_byte(conn, dir_handle); ncp_add_pstring(conn, path); - if ((result = ncp_request(conn, 62)) != 0) { + if ((result = ncp_request(conn, 62)) != 0) + { ncp_unlock_conn(conn); return result; } - target->volume_number = ncp_reply_byte(conn, 0); - target->directory_id = ntohs(ncp_reply_word(conn, 1)); - target->sequence_no = ntohs(ncp_reply_word(conn, 3)); + target->directory_id = ncp_reply_word_hl(conn, 1); + target->sequence_no = ncp_reply_word_hl(conn, 3); target->access_rights = ncp_reply_byte(conn, 5); ncp_unlock_conn(conn); return 0; } - + long ncp_file_search_continue(struct ncp_conn *conn, @@ -2364,30 +2302,30 @@ ncp_file_search_continue(struct ncp_conn *conn, ncp_init_request(conn); ncp_add_byte(conn, fsinfo->volume_number); - ncp_add_word(conn, htons(fsinfo->directory_id)); - ncp_add_word(conn, htons(fsinfo->sequence_no)); + ncp_add_word_hl(conn, fsinfo->directory_id); + ncp_add_word_hl(conn, fsinfo->sequence_no); ncp_add_byte(conn, attributes); ncp_add_pstring(conn, name); - if ((result = ncp_request(conn, 63)) != 0) { + if ((result = ncp_request(conn, 63)) != 0) + { ncp_unlock_conn(conn); return result; } - - fsinfo->sequence_no = ntohs(ncp_reply_word(conn, 0)); + fsinfo->sequence_no = ncp_reply_word_hl(conn, 0); memzero(target->file_name); memcpy(&(target->file_name), ncp_reply_data(conn, 4), NCP_MAX_FILENAME); target->file_attributes = ncp_reply_byte(conn, 18); - target->file_mode = ncp_reply_byte(conn, 19); - target->file_length = ntohl(ncp_reply_dword(conn, 20)); - target->creation_date = ntohs(ncp_reply_word(conn, 24)); - target->access_date = ntohs(ncp_reply_word(conn, 26)); - target->update_date = ntohs(ncp_reply_word(conn, 28)); - target->update_time = ntohs(ncp_reply_word(conn, 30)); + target->file_mode = ncp_reply_byte(conn, 19); + target->file_length = ncp_reply_dword_hl(conn, 20); + target->creation_date = ncp_reply_word_hl(conn, 24); + target->access_date = ncp_reply_word_hl(conn, 26); + target->update_date = ncp_reply_word_hl(conn, 28); + target->update_time = ncp_reply_word_hl(conn, 30); ncp_unlock_conn(conn); return 0; @@ -2403,20 +2341,20 @@ ncp_get_finfo(struct ncp_conn *conn, struct ncp_filesearch_info fsinfo; if ((result = ncp_file_search_init(conn, dir_handle, path, - &fsinfo)) != 0) { + &fsinfo)) != 0) + { return result; } - if ((result = ncp_file_search_continue(conn, &fsinfo, 0, name, - target)) == 0) { + target)) == 0) + { return result; } - if ((result = ncp_file_search_init(conn, dir_handle, path, - &fsinfo)) != 0) { + &fsinfo)) != 0) + { return result; } - return ncp_file_search_continue(conn, &fsinfo, aDIR, name, target); } @@ -2434,25 +2372,25 @@ ncp_open_file(struct ncp_conn *conn, ncp_add_byte(conn, access); ncp_add_pstring(conn, path); - if ((result = ncp_request(conn, 76)) != 0) { + if ((result = ncp_request(conn, 76)) != 0) + { ncp_unlock_conn(conn); return result; } - memcpy(&(target->file_id), ncp_reply_data(conn, 0), NCP_FILE_ID_LEN); - + memzero(target->file_name); memcpy(&(target->file_name), ncp_reply_data(conn, 8), NCP_MAX_FILENAME); target->file_attributes = ncp_reply_byte(conn, 22); - target->file_mode = ncp_reply_byte(conn, 23); - target->file_length = ntohl(ncp_reply_dword(conn, 24)); - target->creation_date = ntohs(ncp_reply_word(conn, 28)); - target->access_date = ntohs(ncp_reply_word(conn, 30)); - target->update_date = ntohs(ncp_reply_word(conn, 32)); - target->update_time = ntohs(ncp_reply_word(conn, 34)); + target->file_mode = ncp_reply_byte(conn, 23); + target->file_length = ncp_reply_dword_hl(conn, 24); + target->creation_date = ncp_reply_word_hl(conn, 28); + target->access_date = ncp_reply_word_hl(conn, 30); + target->update_date = ncp_reply_word_hl(conn, 32); + target->update_time = ncp_reply_word_hl(conn, 34); ncp_unlock_conn(conn); return 0; @@ -2480,35 +2418,35 @@ ncp_do_create(struct ncp_conn *conn, int function) { long result; - + ncp_init_request(conn); ncp_add_byte(conn, dir_handle); ncp_add_byte(conn, attr); ncp_add_pstring(conn, path); - if ((result = ncp_request(conn, function)) != 0) { + if ((result = ncp_request(conn, function)) != 0) + { ncp_unlock_conn(conn); return result; } - memcpy(&(target->file_id), ncp_reply_data(conn, 0), NCP_FILE_ID_LEN); - + memzero(target->file_name); memcpy(&(target->file_name), ncp_reply_data(conn, 8), NCP_MAX_FILENAME); target->file_attributes = ncp_reply_byte(conn, 22); - target->file_mode = ncp_reply_byte(conn, 23); - target->file_length = ntohl(ncp_reply_dword(conn, 24)); - target->creation_date = ntohs(ncp_reply_word(conn, 28)); - target->access_date = ntohs(ncp_reply_word(conn, 30)); - target->update_date = ntohs(ncp_reply_word(conn, 32)); - target->update_time = ntohs(ncp_reply_word(conn, 34)); + target->file_mode = ncp_reply_byte(conn, 23); + target->file_length = ncp_reply_dword_hl(conn, 24); + target->creation_date = ncp_reply_word_hl(conn, 28); + target->access_date = ncp_reply_word_hl(conn, 30); + target->update_date = ncp_reply_word_hl(conn, 32); + target->update_time = ncp_reply_word_hl(conn, 34); ncp_unlock_conn(conn); return 0; -} +} long ncp_create_newfile(struct ncp_conn *conn, @@ -2544,7 +2482,7 @@ ncp_erase_file(struct ncp_conn *conn, ncp_unlock_conn(conn); return result; } - + long ncp_rename_file(struct ncp_conn *conn, int old_handle, const char *old_path, @@ -2560,11 +2498,11 @@ ncp_rename_file(struct ncp_conn *conn, ncp_add_byte(conn, new_handle); ncp_add_pstring(conn, new_path); - if ((result = ncp_request(conn, 69)) != 0) { + if ((result = ncp_request(conn, 69)) != 0) + { ncp_unlock_conn(conn); return result; } - ncp_unlock_conn(conn); return 0; } @@ -2611,7 +2549,7 @@ ncp_add_trustee(struct ncp_conn *conn, ncp_init_request_s(conn, 13); ncp_add_byte(conn, dir_handle); - ncp_add_dword(conn, htonl(object_id)); + ncp_add_dword_hl(conn, object_id); ncp_add_byte(conn, rights); ncp_add_pstring(conn, path); @@ -2622,13 +2560,13 @@ ncp_add_trustee(struct ncp_conn *conn, long ncp_delete_trustee(struct ncp_conn *conn, - int dir_handle, const char *path,__u32 object_id) + int dir_handle, const char *path, __u32 object_id) { long result; ncp_init_request_s(conn, 14); ncp_add_byte(conn, dir_handle); - ncp_add_dword(conn, htonl(object_id)); + ncp_add_dword_hl(conn, object_id); ncp_add_byte(conn, 0); ncp_add_pstring(conn, path); @@ -2661,17 +2599,19 @@ ncp_add_handle_path(struct ncp_conn *conn, const char *path) { ncp_add_byte(conn, vol_num); - ncp_add_dword(conn, dir_base); - if (have_dir_base != 0) { - ncp_add_byte(conn, 1); /* dir_base */ - } else { - ncp_add_byte(conn, 0xff); /* no handle */ + ncp_add_dword_lh(conn, dir_base); + if (have_dir_base != 0) + { + ncp_add_byte(conn, 1); /* dir_base */ + } else + { + ncp_add_byte(conn, 0xff); /* no handle */ } - if (path != NULL) { - ncp_add_byte(conn, 1); /* 1 component */ + if (path != NULL) + { + ncp_add_byte(conn, 1); /* 1 component */ ncp_add_pstring(conn, path); - } - else + } else { ncp_add_byte(conn, 0); } @@ -2686,7 +2626,7 @@ ncp_extract_file_info(void *structure, struct nw_info_struct *target) memcpy(target, structure, info_struct_size); name_len = structure + info_struct_size; target->nameLen = *name_len; - strncpy(target->entryName, name_len+1, *name_len); + strncpy(target->entryName, name_len + 1, *name_len); target->entryName[*name_len] = '\0'; return; } @@ -2704,8 +2644,8 @@ ncp_obtain_file_or_subdir_info(struct ncp_conn *conn, ncp_add_byte(conn, 6); ncp_add_byte(conn, source_ns); ncp_add_byte(conn, target_ns); - ncp_add_word(conn, search_attribs); - ncp_add_dword(conn, rim); + ncp_add_word_lh(conn, search_attribs); + ncp_add_dword_lh(conn, rim); ncp_add_handle_path(conn, vol, dirent, 1, path); if ((result = ncp_request(conn, 87)) != 0) @@ -2716,14 +2656,14 @@ ncp_obtain_file_or_subdir_info(struct ncp_conn *conn, ncp_extract_file_info(ncp_reply_data(conn, 0), target); ncp_unlock_conn(conn); return 0; -} +} long ncp_get_eff_directory_rights(struct ncp_conn *conn, __u8 source_ns, __u8 target_ns, __u16 search_attribs, __u8 vol, __u32 dirent, const char *path, - __u16 *my_effective_rights) + __u16 * my_effective_rights) { long result; @@ -2731,8 +2671,8 @@ ncp_get_eff_directory_rights(struct ncp_conn *conn, ncp_add_byte(conn, 29); ncp_add_byte(conn, source_ns); ncp_add_byte(conn, target_ns); - ncp_add_word(conn, search_attribs); - ncp_add_dword(conn, 0); + ncp_add_word_lh(conn, search_attribs); + ncp_add_dword_lh(conn, 0); ncp_add_handle_path(conn, vol, dirent, 1, path); if ((result = ncp_request(conn, 87)) != 0) @@ -2740,8 +2680,7 @@ ncp_get_eff_directory_rights(struct ncp_conn *conn, ncp_unlock_conn(conn); return result; } - - *my_effective_rights = ncp_reply_word(conn, 0); + *my_effective_rights = ncp_reply_word_lh(conn, 0); ncp_unlock_conn(conn); return 0; } @@ -2752,65 +2691,65 @@ ncp_do_lookup(struct ncp_conn *conn, char *path, /* may only be one component */ struct nw_info_struct *target) { - __u8 vol_num; + __u8 vol_num; __u32 dir_base; long result; char *volname = NULL; - if (target == NULL) { + if (target == NULL) + { return -EINVAL; } - - if (dir == NULL) { + if (dir == NULL) + { /* Access a volume's root directory */ ncp_init_request(conn); - ncp_add_byte(conn, 22); /* subfunction */ - ncp_add_byte(conn, 0); /* dos name space */ - ncp_add_byte(conn, 0); /* reserved */ - ncp_add_byte(conn, 0); /* reserved */ - ncp_add_byte(conn, 0); /* reserved */ - ncp_add_handle_path(conn, 0, 0, 0, /* no handle */ + ncp_add_byte(conn, 22); /* subfunction */ + ncp_add_byte(conn, 0); /* dos name space */ + ncp_add_byte(conn, 0); /* reserved */ + ncp_add_byte(conn, 0); /* reserved */ + ncp_add_byte(conn, 0); /* reserved */ + ncp_add_handle_path(conn, 0, 0, 0, /* no handle */ path); - if ((result = ncp_request(conn, 87)) != 0) { + if ((result = ncp_request(conn, 87)) != 0) + { ncp_unlock_conn(conn); return result; } - - dir_base = ncp_reply_dword(conn, 4); - vol_num = ncp_reply_byte (conn, 8); + dir_base = ncp_reply_dword_lh(conn, 4); + vol_num = ncp_reply_byte(conn, 8); ncp_unlock_conn(conn); volname = path; path = NULL; - } - else + } else { vol_num = dir->volNumber; dir_base = dir->DosDirNum; } ncp_init_request(conn); - ncp_add_byte(conn, 6); /* subfunction */ - ncp_add_byte(conn, 0); /* dos name space */ - ncp_add_byte(conn, 0); /* dos name space as dest */ - ncp_add_word(conn, 0xff); /* get all */ - ncp_add_dword(conn, RIM_ALL); + ncp_add_byte(conn, 6); /* subfunction */ + ncp_add_byte(conn, 0); /* dos name space */ + ncp_add_byte(conn, 0); /* dos name space as dest */ + ncp_add_word_lh(conn, 0xff); /* get all */ + ncp_add_dword_lh(conn, RIM_ALL); ncp_add_handle_path(conn, vol_num, dir_base, 1, path); - if ((result = ncp_request(conn, 87)) != 0) { + if ((result = ncp_request(conn, 87)) != 0) + { ncp_unlock_conn(conn); return result; } - ncp_extract_file_info(ncp_reply_data(conn, 0), target); - if (volname != NULL) { + if (volname != NULL) + { target->nameLen = strlen(volname); strcpy(target->entryName, volname); } - ncp_unlock_conn(conn); return 0; } @@ -2827,9 +2766,9 @@ ncp_modify_file_or_subdir_dos_info(struct ncp_conn *conn, ncp_add_byte(conn, 7); /* subfunction */ ncp_add_byte(conn, 0); /* dos name space */ ncp_add_byte(conn, 0); /* reserved */ - ncp_add_word(conn, 0x8006); /* search attribs: all */ + ncp_add_word_lh(conn, 0x8006); /* search attribs: all */ - ncp_add_dword(conn, info_mask); + ncp_add_dword_lh(conn, info_mask); ncp_add_mem(conn, info, sizeof(*info)); ncp_add_handle_path(conn, file->volNumber, file->DosDirNum, 1, NULL); @@ -2838,7 +2777,7 @@ ncp_modify_file_or_subdir_dos_info(struct ncp_conn *conn, ncp_unlock_conn(conn); return result; } - + long ncp_del_file_or_subdir(struct ncp_conn *conn, struct nw_info_struct *dir, char *name) @@ -2849,22 +2788,22 @@ ncp_del_file_or_subdir(struct ncp_conn *conn, ncp_add_byte(conn, 8); /* subfunction */ ncp_add_byte(conn, 0); /* dos name space */ ncp_add_byte(conn, 0); /* reserved */ - ncp_add_word(conn, 0x8006); /* search attribs: all */ + ncp_add_word_lh(conn, 0x8006); /* search attribs: all */ ncp_add_handle_path(conn, dir->volNumber, dir->DosDirNum, 1, name); - + result = ncp_request(conn, 87); ncp_unlock_conn(conn); return result; } static inline void -ConvertToNWfromDWORD ( __u32 sfd , __u8 ret[6] ) +ConvertToNWfromDWORD(__u32 sfd, __u8 ret[6]) { - __u16 *dest = (__u16 *) ret; - memcpy(&(dest[1]), &sfd, 4); - dest[0] = dest[1] + 1; - return; + __u16 *dest = (__u16 *) ret; + memcpy(&(dest[1]), &sfd, 4); + dest[0] = dest[1] + 1; + return; } long @@ -2880,25 +2819,25 @@ ncp_open_create_file_or_subdir(struct ncp_conn *conn, target->opened = 0; ncp_init_request(conn); - ncp_add_byte(conn, 1); /* subfunction */ - ncp_add_byte(conn, 0); /* dos name space */ + ncp_add_byte(conn, 1); /* subfunction */ + ncp_add_byte(conn, 0); /* dos name space */ ncp_add_byte(conn, open_create_mode); - ncp_add_word(conn, 0x8006); - ncp_add_dword(conn, RIM_ALL); - ncp_add_dword(conn, create_attributes); + ncp_add_word_lh(conn, 0x8006); + ncp_add_dword_lh(conn, RIM_ALL); + ncp_add_dword_lh(conn, create_attributes); /* The desired acc rights seem to be the inherited rights mask for directories */ - ncp_add_word(conn, desired_acc_rights); + ncp_add_word_lh(conn, desired_acc_rights); ncp_add_handle_path(conn, dir->volNumber, dir->DosDirNum, 1, name); - if ((result = ncp_request(conn, 87)) != 0) { + if ((result = ncp_request(conn, 87)) != 0) + { ncp_unlock_conn(conn); return result; } - target->opened = 1; - target->server_file_handle = ncp_reply_dword(conn, 0); + target->server_file_handle = ncp_reply_dword_lh(conn, 0); target->open_create_action = ncp_reply_byte(conn, 4); ncp_extract_file_info(ncp_reply_data(conn, 5), &(target->i)); ConvertToNWfromDWORD(target->server_file_handle, target->file_handle); @@ -2919,28 +2858,27 @@ ncp_initialize_search(struct ncp_conn *conn, { return EINVAL; } - memzero(*target); ncp_init_request(conn); - ncp_add_byte(conn, 2); /* subfunction */ + ncp_add_byte(conn, 2); /* subfunction */ ncp_add_byte(conn, namespace); - ncp_add_byte(conn, 0); /* reserved */ + ncp_add_byte(conn, 0); /* reserved */ ncp_add_handle_path(conn, dir->volNumber, dir->DosDirNum, 1, NULL); - - if ((result = ncp_request(conn, 87)) != 0) { + + if ((result = ncp_request(conn, 87)) != 0) + { ncp_unlock_conn(conn); return result; } - memcpy(&(target->s), ncp_reply_data(conn, 0), 9); target->namespace = namespace; ncp_unlock_conn(conn); return 0; } - + /* Search for everything */ long ncp_search_for_file_or_subdir(struct ncp_conn *conn, @@ -2950,21 +2888,21 @@ ncp_search_for_file_or_subdir(struct ncp_conn *conn, long result; ncp_init_request(conn); - ncp_add_byte(conn, 3); /* subfunction */ - ncp_add_byte(conn, seq->namespace); - ncp_add_byte(conn, 0); /* data stream (???) */ - ncp_add_word(conn, 0xffff); /* Search attribs */ - ncp_add_dword(conn, RIM_ALL); /* return info mask */ + ncp_add_byte(conn, 3); /* subfunction */ + ncp_add_byte(conn, seq->namespace); + ncp_add_byte(conn, 0); /* data stream (???) */ + ncp_add_word_lh(conn, 0xffff); /* Search attribs */ + ncp_add_dword_lh(conn, RIM_ALL); /* return info mask */ ncp_add_mem(conn, &(seq->s), 9); - ncp_add_byte(conn, 2); /* 2 byte pattern */ - ncp_add_byte(conn, 0xff); /* following is a wildcard */ + ncp_add_byte(conn, 2); /* 2 byte pattern */ + ncp_add_byte(conn, 0xff); /* following is a wildcard */ ncp_add_byte(conn, '*'); - - if ((result = ncp_request(conn, 87)) != 0) { + + if ((result = ncp_request(conn, 87)) != 0) + { ncp_unlock_conn(conn); return result; } - memcpy(seq, ncp_reply_data(conn, 0), sizeof(*seq)); ncp_extract_file_info(ncp_reply_data(conn, 10), target); @@ -2979,27 +2917,27 @@ ncp_ren_or_mov_file_or_subdir(struct ncp_conn *conn, { long result; - if ( (old_dir == NULL) || (old_name == NULL) + if ((old_dir == NULL) || (old_name == NULL) || (new_dir == NULL) || (new_name == NULL)) return -EINVAL; - + ncp_init_request(conn); - ncp_add_byte(conn, 4); /* subfunction */ - ncp_add_byte(conn, 0); /* dos name space */ - ncp_add_byte(conn, 1); /* rename flag */ - ncp_add_word(conn, 0x8006); /* search attributes */ + ncp_add_byte(conn, 4); /* subfunction */ + ncp_add_byte(conn, 0); /* dos name space */ + ncp_add_byte(conn, 1); /* rename flag */ + ncp_add_word_lh(conn, 0x8006); /* search attributes */ /* source Handle Path */ ncp_add_byte(conn, old_dir->volNumber); - ncp_add_dword(conn, old_dir->DosDirNum); + ncp_add_dword_lh(conn, old_dir->DosDirNum); ncp_add_byte(conn, 1); - ncp_add_byte(conn, 1); /* 1 source component */ + ncp_add_byte(conn, 1); /* 1 source component */ /* dest Handle Path */ ncp_add_byte(conn, new_dir->volNumber); - ncp_add_dword(conn, new_dir->DosDirNum); + ncp_add_dword_lh(conn, new_dir->DosDirNum); ncp_add_byte(conn, 1); - ncp_add_byte(conn, 1); /* 1 destination component */ + ncp_add_byte(conn, 1); /* 1 destination component */ /* source path string */ ncp_add_pstring(conn, old_name); @@ -3010,7 +2948,7 @@ ncp_ren_or_mov_file_or_subdir(struct ncp_conn *conn, ncp_unlock_conn(conn); return result; } - + /* Create a new job entry */ long @@ -3021,14 +2959,14 @@ ncp_create_queue_job_and_file(struct ncp_conn *conn, long result; ncp_init_request_s(conn, 121); - ncp_add_dword(conn, htonl(queue_id)); + ncp_add_dword_hl(conn, queue_id); ncp_add_mem(conn, &(job->j), sizeof(job->j)); - if ((result = ncp_request(conn, 23)) != 0) { + if ((result = ncp_request(conn, 23)) != 0) + { ncp_unlock_conn(conn); return result; } - memcpy(&(job->j), ncp_reply_data(conn, 0), 78); ConvertToNWfromDWORD(job->j.JobFileHandle, job->file_handle); @@ -3044,8 +2982,8 @@ ncp_close_file_and_start_job(struct ncp_conn *conn, long result; ncp_init_request_s(conn, 127); - ncp_add_dword(conn, htonl(queue_id)); - ncp_add_dword(conn, job->j.JobNumber); + ncp_add_dword_hl(conn, queue_id); + ncp_add_dword_lh(conn, job->j.JobNumber); result = ncp_request(conn, 23); ncp_unlock_conn(conn); @@ -3059,7 +2997,7 @@ ncp_attach_to_queue(struct ncp_conn *conn, long result; ncp_init_request_s(conn, 111); - ncp_add_dword(conn, htonl(queue_id)); + ncp_add_dword_hl(conn, queue_id); result = ncp_request(conn, 23); ncp_unlock_conn(conn); @@ -3073,7 +3011,7 @@ ncp_detach_from_queue(struct ncp_conn *conn, long result; ncp_init_request_s(conn, 112); - ncp_add_dword(conn, htonl(queue_id)); + ncp_add_dword_hl(conn, queue_id); result = ncp_request(conn, 23); ncp_unlock_conn(conn); @@ -3087,14 +3025,14 @@ ncp_service_queue_job(struct ncp_conn *conn, __u32 queue_id, __u16 job_type, long result; ncp_init_request_s(conn, 124); - ncp_add_dword(conn, htonl(queue_id)); - ncp_add_word(conn, htons(job_type)); + ncp_add_dword_hl(conn, queue_id); + ncp_add_word_hl(conn, job_type); - if ((result = ncp_request(conn, 23)) != 0) { + if ((result = ncp_request(conn, 23)) != 0) + { ncp_unlock_conn(conn); return result; } - memcpy(&(job->j), ncp_reply_data(conn, 0), 78); ConvertToNWfromDWORD(job->j.JobFileHandle, job->file_handle); @@ -3109,9 +3047,9 @@ ncp_finish_servicing_job(struct ncp_conn *conn, __u32 queue_id, long result; ncp_init_request_s(conn, 131); - ncp_add_dword(conn, htonl(queue_id)); - ncp_add_dword(conn, job_number); - ncp_add_dword(conn, htonl(charge_info)); + ncp_add_dword_hl(conn, queue_id); + ncp_add_dword_lh(conn, job_number); + ncp_add_dword_hl(conn, charge_info); result = ncp_request(conn, 23); ncp_unlock_conn(conn); @@ -3125,8 +3063,8 @@ ncp_abort_servicing_job(struct ncp_conn *conn, __u32 queue_id, long result; ncp_init_request_s(conn, 132); - ncp_add_dword(conn, htonl(queue_id)); - ncp_add_dword(conn, job_number); + ncp_add_dword_hl(conn, queue_id); + ncp_add_dword_lh(conn, job_number); result = ncp_request(conn, 23); ncp_unlock_conn(conn); @@ -3143,22 +3081,22 @@ ncp_do_read(struct ncp_conn *conn, const char *file_id, ncp_init_request(conn); ncp_add_byte(conn, 0); ncp_add_mem(conn, file_id, 6); - ncp_add_dword(conn, htonl(offset)); - ncp_add_word(conn, htons(to_read)); + ncp_add_dword_hl(conn, offset); + ncp_add_word_hl(conn, to_read); - if ((result = ncp_request(conn, 72)) != 0) { + if ((result = ncp_request(conn, 72)) != 0) + { ncp_unlock_conn(conn); return result; } - - *bytes_read = ntohs(ncp_reply_word(conn, 0)); + *bytes_read = ncp_reply_word_hl(conn, 0); memcpy(target, ncp_reply_data(conn, 2), *bytes_read); ncp_unlock_conn(conn); return 0; } - + long ncp_read(struct ncp_conn *conn, const char *file_id, off_t offset, size_t count, char *target) @@ -3177,7 +3115,6 @@ ncp_read(struct ncp_conn *conn, const char *file_id, { return -1; } - offset += read_this_time; target += read_this_time; already_read += read_this_time; @@ -3200,21 +3137,21 @@ ncp_do_write(struct ncp_conn *conn, const char *file_id, ncp_init_request(conn); ncp_add_byte(conn, 0); ncp_add_mem(conn, file_id, 6); - ncp_add_dword(conn, htonl(offset)); - ncp_add_word(conn, htons(to_write)); + ncp_add_dword_hl(conn, offset); + ncp_add_word_hl(conn, to_write); ncp_add_mem(conn, source, to_write); - if ((result = ncp_request(conn, 73)) != 0) { + if ((result = ncp_request(conn, 73)) != 0) + { ncp_unlock_conn(conn); return result; } - *bytes_written = to_write; ncp_unlock_conn(conn); return 0; } - + long ncp_write(struct ncp_conn *conn, const char *file_id, off_t offset, size_t count, const char *source) @@ -3229,11 +3166,10 @@ ncp_write(struct ncp_conn *conn, const char *file_id, count - already_written); if (ncp_do_write(conn, file_id, offset, to_write, - source, &written_this_time) != 0) + source, &written_this_time) != 0) { return -1; } - offset += written_this_time; source += written_this_time; already_written += written_this_time; @@ -3253,7 +3189,7 @@ ncp_copy_file(struct ncp_conn *conn, __u32 source_offset, __u32 target_offset, __u32 count, - __u32 *copied_count) + __u32 * copied_count) { long result; @@ -3262,17 +3198,16 @@ ncp_copy_file(struct ncp_conn *conn, ncp_add_byte(conn, 0); /* reserved */ ncp_add_mem(conn, source_file, 6); ncp_add_mem(conn, target_file, 6); - ncp_add_dword(conn, htonl(source_offset)); - ncp_add_dword(conn, htonl(target_offset)); - ncp_add_dword(conn, htonl(count)); + ncp_add_dword_hl(conn, source_offset); + ncp_add_dword_hl(conn, target_offset); + ncp_add_dword_hl(conn, count); if ((result = ncp_request(conn, 74)) != 0) { ncp_unlock_conn(conn); return result; } - - *copied_count = ntohl(ncp_reply_dword(conn, 0)); + *copied_count = ncp_reply_dword_hl(conn, 0); ncp_unlock_conn(conn); return 0; } @@ -3290,7 +3225,6 @@ ncp_get_broadcast_message(struct ncp_conn *conn, char message[256]) ncp_unlock_conn(conn); return result; } - length = ncp_reply_byte(conn, 0); message[length] = 0; memcpy(message, ncp_reply_data(conn, 1), length); @@ -3314,8 +3248,8 @@ ncp_dealloc_dir_handle(struct ncp_conn *conn, __u8 dir_handle) long ncp_alloc_short_dir_handle(struct ncp_conn *conn, struct nw_info_struct *dir, - word alloc_mode, - byte *target) + word alloc_mode, + byte * target) { long result; @@ -3323,7 +3257,7 @@ ncp_alloc_short_dir_handle(struct ncp_conn *conn, ncp_add_byte(conn, 12); /* subfunction */ ncp_add_byte(conn, 0); /* dos name space */ ncp_add_byte(conn, 0); /* reserved */ - ncp_add_word(conn, htons(alloc_mode)); + ncp_add_word_hl(conn, alloc_mode); ncp_add_handle_path(conn, dir->volNumber, dir->DosDirNum, 1, NULL); @@ -3332,7 +3266,6 @@ ncp_alloc_short_dir_handle(struct ncp_conn *conn, ncp_unlock_conn(conn); return result; } - *target = ncp_reply_byte(conn, 0); ncp_unlock_conn(conn); return result; @@ -3347,18 +3280,18 @@ ncp_add_trustee_set(struct ncp_conn *conn, long result = 0; ncp_init_request(conn); - ncp_add_byte(conn, 10); /* subfunction */ - ncp_add_byte(conn, 0); /* dos name space */ + ncp_add_byte(conn, 10); /* subfunction */ + ncp_add_byte(conn, 0); /* dos name space */ ncp_add_byte(conn, 0); /* reserved */ - ncp_add_word(conn, 0x8006); - ncp_add_word(conn, rights_mask); - ncp_add_word(conn, object_count); + ncp_add_word_lh(conn, 0x8006); + ncp_add_word_lh(conn, rights_mask); + ncp_add_word_lh(conn, object_count); ncp_add_handle_path(conn, volume_number, dir_entry, 1, NULL); while (object_count > 0) { - ncp_add_dword(conn, htonl(rights->object_id)); - ncp_add_word(conn, rights->rights); + ncp_add_dword_hl(conn, rights->object_id); + ncp_add_word_lh(conn, rights->rights); object_count -= 1; rights += 1; } diff --git a/lib/nwcrypt.c b/lib/nwcrypt.c index de9d955..645cfdf 100644 --- a/lib/nwcrypt.c +++ b/lib/nwcrypt.c @@ -1,17 +1,17 @@ /*$********************************************************* -$* -$* This code has been taken from DDJ 11/93, from an -$* article by Pawel Szczerbina. -$* -$* Password encryption routines follow. -$* Converted to C from Barry Nance's Pascal -$* prog published in the March -93 issue of Byte. -$* -$* Adapted to be useable for ncpfs by -$* Volker Lendecke in -$* October 1995. -$* -$**********************************************************/ + $* + $* This code has been taken from DDJ 11/93, from an + $* article by Pawel Szczerbina. + $* + $* Password encryption routines follow. + $* Converted to C from Barry Nance's Pascal + $* prog published in the March -93 issue of Byte. + $* + $* Adapted to be useable for ncpfs by + $* Volker Lendecke in + $* October 1995. + $* + $********************************************************* */ /**************************************************************************** @@ -91,28 +91,28 @@ typedef unsigned char buf8[8]; typedef unsigned char buf4[4]; static unsigned char encrypttable[256] = -{0x7,0x8,0x0,0x8,0x6,0x4,0xE,0x4,0x5,0xC,0x1,0x7,0xB,0xF,0xA,0x8, - 0xF,0x8,0xC,0xC,0x9,0x4,0x1,0xE,0x4,0x6,0x2,0x4,0x0,0xA,0xB,0x9, - 0x2,0xF,0xB,0x1,0xD,0x2,0x1,0x9,0x5,0xE,0x7,0x0,0x0,0x2,0x6,0x6, - 0x0,0x7,0x3,0x8,0x2,0x9,0x3,0xF,0x7,0xF,0xC,0xF,0x6,0x4,0xA,0x0, - 0x2,0x3,0xA,0xB,0xD,0x8,0x3,0xA,0x1,0x7,0xC,0xF,0x1,0x8,0x9,0xD, - 0x9,0x1,0x9,0x4,0xE,0x4,0xC,0x5,0x5,0xC,0x8,0xB,0x2,0x3,0x9,0xE, - 0x7,0x7,0x6,0x9,0xE,0xF,0xC,0x8,0xD,0x1,0xA,0x6,0xE,0xD,0x0,0x7, - 0x7,0xA,0x0,0x1,0xF,0x5,0x4,0xB,0x7,0xB,0xE,0xC,0x9,0x5,0xD,0x1, - 0xB,0xD,0x1,0x3,0x5,0xD,0xE,0x6,0x3,0x0,0xB,0xB,0xF,0x3,0x6,0x4, - 0x9,0xD,0xA,0x3,0x1,0x4,0x9,0x4,0x8,0x3,0xB,0xE,0x5,0x0,0x5,0x2, - 0xC,0xB,0xD,0x5,0xD,0x5,0xD,0x2,0xD,0x9,0xA,0xC,0xA,0x0,0xB,0x3, - 0x5,0x3,0x6,0x9,0x5,0x1,0xE,0xE,0x0,0xE,0x8,0x2,0xD,0x2,0x2,0x0, - 0x4,0xF,0x8,0x5,0x9,0x6,0x8,0x6,0xB,0xA,0xB,0xF,0x0,0x7,0x2,0x8, - 0xC,0x7,0x3,0xA,0x1,0x4,0x2,0x5,0xF,0x7,0xA,0xC,0xE,0x5,0x9,0x3, - 0xE,0x7,0x1,0x2,0xE,0x1,0xF,0x4,0xA,0x6,0xC,0x6,0xF,0x4,0x3,0x0, - 0xC,0x0,0x3,0x6,0xF,0x8,0x7,0xB,0x2,0xD,0xC,0x6,0xA,0xA,0x8,0xD}; +{0x7, 0x8, 0x0, 0x8, 0x6, 0x4, 0xE, 0x4, 0x5, 0xC, 0x1, 0x7, 0xB, 0xF, 0xA, 0x8, +0xF, 0x8, 0xC, 0xC, 0x9, 0x4, 0x1, 0xE, 0x4, 0x6, 0x2, 0x4, 0x0, 0xA, 0xB, 0x9, +0x2, 0xF, 0xB, 0x1, 0xD, 0x2, 0x1, 0x9, 0x5, 0xE, 0x7, 0x0, 0x0, 0x2, 0x6, 0x6, +0x0, 0x7, 0x3, 0x8, 0x2, 0x9, 0x3, 0xF, 0x7, 0xF, 0xC, 0xF, 0x6, 0x4, 0xA, 0x0, +0x2, 0x3, 0xA, 0xB, 0xD, 0x8, 0x3, 0xA, 0x1, 0x7, 0xC, 0xF, 0x1, 0x8, 0x9, 0xD, +0x9, 0x1, 0x9, 0x4, 0xE, 0x4, 0xC, 0x5, 0x5, 0xC, 0x8, 0xB, 0x2, 0x3, 0x9, 0xE, +0x7, 0x7, 0x6, 0x9, 0xE, 0xF, 0xC, 0x8, 0xD, 0x1, 0xA, 0x6, 0xE, 0xD, 0x0, 0x7, +0x7, 0xA, 0x0, 0x1, 0xF, 0x5, 0x4, 0xB, 0x7, 0xB, 0xE, 0xC, 0x9, 0x5, 0xD, 0x1, +0xB, 0xD, 0x1, 0x3, 0x5, 0xD, 0xE, 0x6, 0x3, 0x0, 0xB, 0xB, 0xF, 0x3, 0x6, 0x4, +0x9, 0xD, 0xA, 0x3, 0x1, 0x4, 0x9, 0x4, 0x8, 0x3, 0xB, 0xE, 0x5, 0x0, 0x5, 0x2, +0xC, 0xB, 0xD, 0x5, 0xD, 0x5, 0xD, 0x2, 0xD, 0x9, 0xA, 0xC, 0xA, 0x0, 0xB, 0x3, +0x5, 0x3, 0x6, 0x9, 0x5, 0x1, 0xE, 0xE, 0x0, 0xE, 0x8, 0x2, 0xD, 0x2, 0x2, 0x0, +0x4, 0xF, 0x8, 0x5, 0x9, 0x6, 0x8, 0x6, 0xB, 0xA, 0xB, 0xF, 0x0, 0x7, 0x2, 0x8, +0xC, 0x7, 0x3, 0xA, 0x1, 0x4, 0x2, 0x5, 0xF, 0x7, 0xA, 0xC, 0xE, 0x5, 0x9, 0x3, +0xE, 0x7, 0x1, 0x2, 0xE, 0x1, 0xF, 0x4, 0xA, 0x6, 0xC, 0x6, 0xF, 0x4, 0x3, 0x0, + 0xC, 0x0, 0x3, 0x6, 0xF, 0x8, 0x7, 0xB, 0x2, 0xD, 0xC, 0x6, 0xA, 0xA, 0x8, 0xD}; -static buf32 encryptkeys = -{0x48,0x93,0x46,0x67,0x98,0x3D,0xE6,0x8D, - 0xB7,0x10,0x7A,0x26,0x5A,0xB9,0xB1,0x35, - 0x6B,0x0F,0xD5,0x70,0xAE,0xFB,0xAD,0x11, - 0xF4,0x47,0xDC,0xA7,0xEC,0xCF,0x50,0xC0}; +static buf32 encryptkeys = +{0x48, 0x93, 0x46, 0x67, 0x98, 0x3D, 0xE6, 0x8D, + 0xB7, 0x10, 0x7A, 0x26, 0x5A, 0xB9, 0xB1, 0x35, + 0x6B, 0x0F, 0xD5, 0x70, 0xAE, 0xFB, 0xAD, 0x11, + 0xF4, 0x47, 0xDC, 0xA7, 0xEC, 0xCF, 0x50, 0xC0}; static void @@ -128,15 +128,16 @@ shuffle1(buf32 temp, unsigned char *target) { for (s = 0; s <= 31; ++s) { - b3 = (temp[s]+b4) ^ (temp[(s+b4)&31] - encryptkeys[s]); + b3 = (temp[s] + b4) ^ (temp[(s + b4) & 31] - encryptkeys[s]); b4 = b4 + b3; temp[s] = b3; } } - for (i = 0; i <= 15; ++i) { - target[i] = encrypttable[temp[ 2*i ]] - | (encrypttable[temp[ 2*i + 1]] << 4); + for (i = 0; i <= 15; ++i) + { + target[i] = encrypttable[temp[2 * i]] + | (encrypttable[temp[2 * i + 1]] << 4); } } @@ -148,12 +149,14 @@ shuffle(const unsigned char *lon, const unsigned char *buf, int buflen, int b2, d, s; buf32 temp; - while ( (buflen > 0) - && (buf[buflen - 1] == 0)) { + while ((buflen > 0) + && (buf[buflen - 1] == 0)) + { buflen = buflen - 1; } - for (s = 0; s < 32; s++) { + for (s = 0; s < 32; s++) + { temp[s] = 0; } @@ -176,17 +179,17 @@ shuffle(const unsigned char *lon, const unsigned char *buf, int buflen, { b2 = d; temp[s] = temp[s] ^ encryptkeys[s]; - } else { + } else + { temp[s] = temp[s] ^ buf[b2]; b2 = b2 + 1; } } } - for (s = 0; s <= 31; ++s) temp[s] = temp[s] ^ lon[s & 3]; - shuffle1(temp,target); + shuffle1(temp, target); } @@ -198,7 +201,7 @@ nw_encrypt(const unsigned char *fra, buf32 k; int s; - shuffle(&(fra[0]), buf, 16, &(k[ 0])); + shuffle(&(fra[0]), buf, 16, &(k[0])); shuffle(&(fra[4]), buf, 16, &(k[16])); for (s = 0; s <= 15; ++s) @@ -219,16 +222,17 @@ nw_encrypt(const unsigned char *fra, /* server side (mars etc.) should: * store the *encrypted* password internally (output from shuffle) * verify if nw_encrypt(cryptkey from GetCryptKey, old stored password) - == cryptkey in EncryptedChangePassword request buffer (this means - old password was correct) + == cryptkey in EncryptedChangePassword request buffer (this means + old password was correct) * decrypt new password in request buffer using (yet to write) inverse of - newpassencrypt with old stored password as parameter + newpassencrypt with old stored password as parameter * compute the length of the unencrypted new password as len ^ (first byte of - old internal password) ^ (second byte of old internal password) + old internal password) ^ (second byte of old internal password) */ -static char -newshuffle[256+16] = { +static char + newshuffle[256 + 16] = +{ 0x0f, 0x08, 0x05, 0x07, 0x0c, 0x02, 0x0e, 0x09, 0x00, 0x01, 0x06, 0x0d, 0x03, 0x04, 0x0b, 0x0a, 0x02, 0x0c, 0x0e, 0x06, 0x0f, 0x00, 0x01, 0x08, @@ -279,17 +283,17 @@ newshuffle[256+16] = { * - Shuffle (aus nwcrypt.c) altes passwort nach old (16 bytes) * - shuffle neues passwort nach new (16 bytes) * - nwpassencrypt (diese Funktion) zweimal aufrufen fuer je 8 bytes: - * nwpassencrypt(old+0, new+0, out+0) - * nwpassencrypt(old+8, new+8, out+8) + * nwpassencrypt(old+0, new+0, out+0) + * nwpassencrypt(old+8, new+8, out+8) * - NCP-Buffer aufbauen: - * 2 byte Laenge im Hi-Lo-Format - * 1 byte Funktion (0x4b) - * 8 byte (nwcrypt Ergebnis analog login/verify password) - * 2 byte Objecttype - * 1 byte Objectname-Laenge - * n byte Objectname - * 1 byte (Laenge des eingegebenen neuen Passworts ^ old[0] ^ old[1])&0x7f|0x40 - * 16 byte (Ergebnis dieser Funktion doppelt aufgerufen, s.o.) + * 2 byte Laenge im Hi-Lo-Format + * 1 byte Funktion (0x4b) + * 8 byte (nwcrypt Ergebnis analog login/verify password) + * 2 byte Objecttype + * 1 byte Objectname-Laenge + * n byte Objectname + * 1 byte (Laenge des eingegebenen neuen Passworts ^ old[0] ^ old[1])&0x7f|0x40 + * 16 byte (Ergebnis dieser Funktion doppelt aufgerufen, s.o.) */ /* @@ -308,31 +312,31 @@ newpassencrypt(char *old, char *new, char *out) memcpy(copy, new, 8); - for (i=0; i<16; i++) + for (i = 0; i < 16; i++) { - for (di=0, ax=0, p=old; di<8; di++, ax+=0x20, p++) + for (di = 0, ax = 0, p = old; di < 8; di++, ax += 0x20, p++) { - cl=newshuffle[(((copy[di]^*p)>>4)&0x0f)+ax+0x10]<<4; - dl=newshuffle[((copy[di]^*p)&0xf)+ax]; - copy[di]=cl|dl; + cl = newshuffle[(((copy[di] ^ *p) >> 4) & 0x0f) + ax + 0x10] << 4; + dl = newshuffle[((copy[di] ^ *p) & 0xf) + ax]; + copy[di] = cl | dl; } - ch=old[7]; - for (bx=old+7; bx>old; bx--) + ch = old[7]; + for (bx = old + 7; bx > old; bx--) { - *bx=((bx[-1]>>4)&0x0f)|((*bx)<<4); + *bx = ((bx[-1] >> 4) & 0x0f) | ((*bx) << 4); } - *old=((ch>>4)&0x0f)|(*old)<<4; + *old = ((ch >> 4) & 0x0f) | (*old) << 4; memset(out, '\0', 8); - for (di=0; di<16; di++) + for (di = 0; di < 16; di++) { - if (newshuffle[di+0x100]&1) - ch=((copy[newshuffle[di+0x100]/2]>>4)&0x0f); + if (newshuffle[di + 0x100] & 1) + ch = ((copy[newshuffle[di + 0x100] / 2] >> 4) & 0x0f); else - ch=copy[newshuffle[di+0x100]/2]&0x0f; - out[di/2]|=((di&1) ? ch<<4 : ch); + ch = copy[newshuffle[di + 0x100] / 2] & 0x0f; + out[di / 2] |= ((di & 1) ? ch << 4 : ch); } memcpy(copy, out, 8); } diff --git a/man/nwpasswd.1 b/man/nwpasswd.1 index 17e03d7..b4b088e 100644 --- a/man/nwpasswd.1 +++ b/man/nwpasswd.1 @@ -1,4 +1,4 @@ -.TH NWPASSWD 1 06/22/1996 nwpasswd nwpasswd +.TH NWPASSWD 1 01/16/1997 nwpasswd nwpasswd .SH NAME nwpasswd \- Change a user's password .SH SYNOPSIS @@ -11,6 +11,9 @@ nwpasswd \- Change a user's password ] [ .B -U .I user name +] [ +.B -O +.I object name ] .B -t .I object type @@ -43,6 +46,16 @@ is the name of the server you want to use. is the name of the bindery object whose password is to be changed. .RE +.B -O +.I object name +.RS 3 +If you have supervisor privileges, you can change other users' +passwords. With +.B -O +you can tell nwpasswd the name of the user whose password should be +changed. +.RE + .B -t .I object type .RS 3 diff --git a/man/nwvolinfo.1 b/man/nwvolinfo.1 new file mode 100644 index 0000000..b5e8659 --- /dev/null +++ b/man/nwvolinfo.1 @@ -0,0 +1,100 @@ +.TH NWVOLINFO 8 7/9/1996 nwvolinfo nwvolinfo +.SH NAME +nwvolinfo \- Diplay info on NetWare Volumes +.SH SYNOPSIS +.B nwvolinfo +[ +.B -h +] [ +.B -S +.I server +] [ +.B -U +.I user name +] [ +.B -P +.I password +| +.B -n +] [ +.B -C +] [ +.B -v +.I volume +] [ +.B -N +] + +.SH DESCRIPTION +.B nwvolinfo +displays information on a NetWare Server Volume. + +.B nwvolinfo +looks up the file +.I $HOME/.nwclient +to find a file server, a user name and possibly a password. See +nwclient(5) for more information. Please note that the access +permissions of $HOME/.nwclient MUST be 600 for security reasons. + +.SH OPTIONS + +.B -h +.RS 3 +.B -h +is used to print out a short help text. +.RE + +.B -S +.I server +.RS 3 +.B server +is the name of the server you want to use. +.RE + +.B -U +.I user +.RS 3 +.B user +is the user name to use for login. +.RE + +.B -P +.I password +.RS 3 +.B password +is the password to use for login. If neither +.B -n +nor +.B -P +are given, and the user has no open connection to the server, nwvolinfo +prompts for a password. +.RE + +.B -n +.RS 3 +.B -n +should be given if no password is required for the login. +.RE + +.B -C +.RS 3 +By default, passwords are converted to uppercase before they are sent +to the server, because most servers require this. You can turn off +this conversion by +.B -C. +.RE + +.B -v +.I volume +.RS 3 +The volume name to be used. Defaults to 'SYS'. +.RE + +.B -N +.RS 3 +Display the information in numeric-only format for use in a pipe. +.RE + +.SH AUTHORS +nwvolinfo was written by Jacek Stepniewski based on +utilities by Volker Lendecke. \ No newline at end of file diff --git a/ncpfs-2.0.8.lsm b/ncpfs-2.0.9.lsm similarity index 83% rename from ncpfs-2.0.8.lsm rename to ncpfs-2.0.9.lsm index 62f3ce0..29cb724 100644 --- a/ncpfs-2.0.8.lsm +++ b/ncpfs-2.0.9.lsm @@ -1,7 +1,7 @@ Begin3 Title: ncpfs -Version: 2.0.8 -Entered-date: 10. December 1996 +Version: 2.0.9 +Entered-date: 16. February 1997 Description: With ncpfs you can mount volumes of your netware server under Linux. You can also print to netware print queues and spool netware print queues to the @@ -13,7 +13,7 @@ Author: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke) Maintained-by: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke) Primary-site: ftp.gwdg.de:/pub/linux/misc/ncpfs Alternate-site: sunsite.unc.edu:/pub/Linux/system/Filesystems/ncpfs - ~156k ncpfs-2.0.8.tgz - ~ 1k ncpfs-2.0.8.lsm + ~156k ncpfs-2.0.9.tgz + ~ 1k ncpfs-2.0.9.lsm Copying-policy: GPL End diff --git a/patches/README b/patches/README new file mode 100644 index 0000000..e4edd17 --- /dev/null +++ b/patches/README @@ -0,0 +1,13 @@ +To apply the patches, cd into the appropriate kernel source directory +and do: + + patch -p1 < patch-file + + +lockup-2.0.28.diff: +An *extremely* dirty fix to the lockup bug mentioned in the BUGS +file. Please only apply it if you experience the problem. Should apply +to 2.0.28 and above in the 2.0.x series. NOT TESTED with 2.1.x. + +linux-2.1.26.diff: +Little fix to make ncpfs work with 2.1.26. Sent to Linus. diff --git a/patches/linux-2.1.26.diff b/patches/linux-2.1.26.diff new file mode 100644 index 0000000..3b6e7fb --- /dev/null +++ b/patches/linux-2.1.26.diff @@ -0,0 +1,35 @@ +--- 2.1.26/fs/ncpfs/sock.c Sun Jan 26 11:07:44 1997 ++++ 2.1.26-patched/fs/ncpfs/sock.c Sun Feb 16 17:05:13 1997 +@@ -24,6 +24,7 @@ + #include + #include + #include ++#include + #include + + +@@ -343,7 +344,6 @@ + char *start = server->packet; + poll_table wait_table; + struct poll_table_entry entry; +- int (*select) (struct inode *, poll_table *); + int init_timeout, max_timeout; + int timeout; + int retrans; +@@ -362,7 +362,6 @@ + + file = server->ncp_filp; + inode = file->f_inode; +- select = file->f_op->poll; + sock = &inode->u.socket_i; + if (!sock) + { +@@ -418,7 +417,7 @@ + wait_table.nr = 0; + wait_table.entry = &entry; + current->state = TASK_INTERRUPTIBLE; +- if (!select(inode, &wait_table)) ++ if (!(file->f_op->poll(file, &wait_table) & POLLIN)) + { + if (timeout > max_timeout) + { diff --git a/patches/lockup-2.0.28.diff b/patches/lockup-2.0.28.diff new file mode 100644 index 0000000..13d924e --- /dev/null +++ b/patches/lockup-2.0.28.diff @@ -0,0 +1,44 @@ +diff -urN 2.0.11/fs/ncpfs/sock.c linux/fs/ncpfs/sock.c +--- 2.0.28/fs/ncpfs/sock.c Fri Jul 12 08:14:53 1996 ++++ linux/fs/ncpfs/sock.c Thu Aug 8 19:27:26 1996 +@@ -55,7 +55,8 @@ + { + struct iovec iov; + struct msghdr msg; +- ++ int result; ++ + iov.iov_base = (void *)buff; + iov.iov_len = len; + +@@ -65,7 +66,29 @@ + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + +- return sock->ops->sendmsg(sock, &msg, len, nonblock, flags); ++ result = sock->ops->sendmsg(sock, &msg, len, 1, flags); ++ ++ if ((result != -EAGAIN) || (nonblock != 0)) ++ { ++ return result; ++ } ++ ++ /* The following is probably one of the worst sins you can do ++ to a multitasking kernel: active polling. But when you call ++ ipx_sendmsg with nonblock==0, then it will block forever ++ from time to time. I really do not know why. To work around ++ this, I try to send the packet with nonblock=1 and retry ++ it. */ ++ ++ do { ++ /* Before retrying, give others a chance */ ++ current->state = TASK_INTERRUPTIBLE; ++ current->timeout = jiffies + HZ/10; ++ schedule(); ++ result = sock->ops->sendmsg(sock, &msg, len, 1, flags); ++ } while (result == -EAGAIN); ++ ++ return result; + } + + diff --git a/sutil/ncplib.c b/sutil/ncplib.c index 7f09950..a1e8ba3 100644 --- a/sutil/ncplib.c +++ b/sutil/ncplib.c @@ -8,12 +8,8 @@ #include "ncplib.h" #include "ncplib_err.h" -typedef __u8 byte; -typedef __u16 word; -typedef __u32 dword; - #include -/* #include */ /* generates a warning here */ + /* #include *//* generates a warning here */ extern pid_t wait(int *); #include #include @@ -34,21 +30,22 @@ extern pid_t wait(int *); #include static long -ncp_negotiate_buffersize(struct ncp_conn *conn, - int size, int *target); + ncp_negotiate_buffersize(struct ncp_conn *conn, + int size, int *target); static long -ncp_login_object(struct ncp_conn *conn, - const unsigned char *username, - int login_type, - const unsigned char *password); + ncp_login_object(struct ncp_conn *conn, + const unsigned char *username, + int login_type, + const unsigned char *password); static long -ncp_do_close(struct ncp_conn *conn); + ncp_do_close(struct ncp_conn *conn); void str_upper(char *name) { - while (*name) { + while (*name) + { *name = toupper(*name); name = name + 1; } @@ -59,62 +56,62 @@ str_upper(char *name) #include "nwcrypt.c" void -ipx_fprint_node(FILE* file,IPXNode node) +ipx_fprint_node(FILE * file, IPXNode node) { - fprintf(file,"%02X%02X%02X%02X%02X%02X", - (unsigned char)node[0], - (unsigned char)node[1], - (unsigned char)node[2], - (unsigned char)node[3], - (unsigned char)node[4], - (unsigned char)node[5] - ); + fprintf(file, "%02X%02X%02X%02X%02X%02X", + (unsigned char) node[0], + (unsigned char) node[1], + (unsigned char) node[2], + (unsigned char) node[3], + (unsigned char) node[4], + (unsigned char) node[5] + ); } void -ipx_fprint_network(FILE* file,IPXNet net) +ipx_fprint_network(FILE * file, IPXNet net) { - fprintf(file,"%08lX",ntohl(net)); + fprintf(file, "%08lX", ntohl(net)); } void -ipx_fprint_port(FILE* file,IPXPort port) +ipx_fprint_port(FILE * file, IPXPort port) { - fprintf(file,"%04X",ntohs(port)); + fprintf(file, "%04X", ntohs(port)); } void -ipx_fprint_saddr(FILE* file,struct sockaddr_ipx* sipx) +ipx_fprint_saddr(FILE * file, struct sockaddr_ipx *sipx) { - ipx_fprint_network(file,sipx->sipx_network); - fprintf(file,":"); - ipx_fprint_node(file,sipx->sipx_node); - fprintf(file,":"); - ipx_fprint_port(file,sipx->sipx_port); + ipx_fprint_network(file, sipx->sipx_network); + fprintf(file, ":"); + ipx_fprint_node(file, sipx->sipx_node); + fprintf(file, ":"); + ipx_fprint_port(file, sipx->sipx_port); } void ipx_print_node(IPXNode node) { - ipx_fprint_node(stdout,node); + ipx_fprint_node(stdout, node); } void ipx_print_network(IPXNet net) { - ipx_fprint_network(stdout,net); + ipx_fprint_network(stdout, net); } void ipx_print_port(IPXPort port) { - ipx_fprint_port(stdout,port); + ipx_fprint_port(stdout, port); } void -ipx_print_saddr(struct sockaddr_ipx* sipx) +ipx_print_saddr(struct sockaddr_ipx *sipx) { - ipx_fprint_saddr(stdout,sipx); + ipx_fprint_saddr(stdout, sipx); } int @@ -129,8 +126,7 @@ ipx_sscanf_node(char *buf, unsigned char node[6]) { return i; } - - for (i=0; i<6; i++) + for (i = 0; i < 6; i++) { node[i] = n[i]; } @@ -144,9 +140,9 @@ ipx_assign_node(IPXNode dest, IPXNode src) } int -ipx_node_equal(IPXNode n1,IPXNode n2) +ipx_node_equal(IPXNode n1, IPXNode n2) { - return memcmp(n1,n2, IPX_NODE_LEN)==0; + return memcmp(n1, n2, IPX_NODE_LEN) == 0; } static int @@ -158,24 +154,24 @@ ipx_recvfrom(int sock, void *buf, int len, unsigned int flags, struct timeval tv; int result; - FD_ZERO(&rd); FD_ZERO(&wr); FD_ZERO(&ex); + FD_ZERO(&rd); + FD_ZERO(&wr); + FD_ZERO(&ex); FD_SET(sock, &rd); - tv.tv_sec = timeout; + tv.tv_sec = timeout; tv.tv_usec = 0; - - if ((result = select(sock+1, &rd, &wr, &ex, &tv)) == -1) + + if ((result = select(sock + 1, &rd, &wr, &ex, &tv)) == -1) { *err = errno; return -1; } - if (FD_ISSET(sock, &rd)) { result = recvfrom(sock, buf, len, flags, - (struct sockaddr *)sender, addrlen); - } - else + (struct sockaddr *) sender, addrlen); + } else { result = -1; errno = ETIMEDOUT; @@ -211,7 +207,7 @@ ipx_sap_find_nearest(int server_type, struct sockaddr_ipx *result, struct sap_server_ident *ident; - if ((sock = socket(AF_IPX,SOCK_DGRAM,PF_IPX)) < 0) + if ((sock = socket(AF_IPX, SOCK_DGRAM, PF_IPX)) < 0) { if (errno == EINVAL) { @@ -219,21 +215,19 @@ ipx_sap_find_nearest(int server_type, struct sockaddr_ipx *result, } return errno; } - - opt=1; + opt = 1; /* Permit broadcast output */ - if(setsockopt(sock,SOL_SOCKET,SO_BROADCAST, &opt,sizeof(opt))==-1) + if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt)) == -1) { goto finished; } - memzero(addr); - addr.sipx_family = AF_IPX; + addr.sipx_family = AF_IPX; addr.sipx_network = htonl(0x0); - addr.sipx_port = htons(0x0); - addr.sipx_type = IPX_SAP_PTYPE; - - if(bind(sock,(struct sockaddr*)&addr,sizeof(addr))==-1) + addr.sipx_port = htons(0x0); + addr.sipx_type = IPX_SAP_PTYPE; + + if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) == -1) { if (errno == EADDRNOTAVAIL) { @@ -241,23 +235,21 @@ ipx_sap_find_nearest(int server_type, struct sockaddr_ipx *result, } goto finished; } - - *(unsigned short *)data = htons(IPX_SAP_NEAREST_QUERY); - *(unsigned short *)&(data[2]) = htons(server_type); - + WSET_HL(data, 0, IPX_SAP_NEAREST_QUERY); + WSET_HL(data, 2, server_type); + memzero(addr); - addr.sipx_family = AF_IPX; - addr.sipx_port = htons(IPX_SAP_PORT); - addr.sipx_type = IPX_SAP_PTYPE; + addr.sipx_family = AF_IPX; + addr.sipx_port = htons(IPX_SAP_PORT); + addr.sipx_type = IPX_SAP_PTYPE; addr.sipx_network = htonl(0x0); ipx_assign_node(addr.sipx_node, IPX_BROADCAST_NODE); - + if (sendto(sock, data, 4, 0, - (struct sockaddr *)&addr, sizeof(addr)) < 0) + (struct sockaddr *) &addr, sizeof(addr)) < 0) { goto finished; } - packets = 5; do { @@ -269,7 +261,7 @@ ipx_sap_find_nearest(int server_type, struct sockaddr_ipx *result, continue; } } - while ( (ntohs(*((__u16 *)data)) != IPX_SAP_NEAREST_RESPONSE) + while ((ntohs(*((__u16 *) data)) != IPX_SAP_NEAREST_RESPONSE) && (packets > 0)); if (packets == 0) @@ -277,19 +269,18 @@ ipx_sap_find_nearest(int server_type, struct sockaddr_ipx *result, close(sock); return NCPL_ET_NO_SERVER; } + ident = (struct sap_server_ident *) (data + 2); - ident = (struct sap_server_ident *)(data+2); - - result->sipx_family = AF_IPX; + result->sipx_family = AF_IPX; result->sipx_network = ident->server_network; - result->sipx_port = ident->server_port; + result->sipx_port = ident->server_port; ipx_assign_node(result->sipx_node, ident->server_node); memcpy(server_name, ident->server_name, sizeof(ident->server_name)); - + errno = 0; - - finished: + + finished: close(sock); return errno; } @@ -299,16 +290,16 @@ ipx_make_reachable(IPXNet network) { struct rtentry rt_def; /* Router */ - struct sockaddr_ipx *sr = (struct sockaddr_ipx *)&rt_def.rt_gateway; + struct sockaddr_ipx *sr = (struct sockaddr_ipx *) &rt_def.rt_gateway; /* Target */ - struct sockaddr_ipx *st = (struct sockaddr_ipx *)&rt_def.rt_dst; + struct sockaddr_ipx *st = (struct sockaddr_ipx *) &rt_def.rt_dst; struct ipx_rip_packet rip; struct sockaddr_ipx addr; int addrlen; int sock; int opt; - int res=-1; + int res = -1; int i; int packets; @@ -317,7 +308,6 @@ ipx_make_reachable(IPXNet network) errno = EPERM; return -1; } - memzero(rip); sock = socket(AF_IPX, SOCK_DGRAM, PF_IPX); @@ -330,28 +320,25 @@ ipx_make_reachable(IPXNet network) } return errno; } - - opt=1; + opt = 1; /* Permit broadcast output */ if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt)) != 0) { goto finished; } - memzero(addr); - addr.sipx_family = AF_IPX; + addr.sipx_family = AF_IPX; addr.sipx_network = htonl(0x0); - addr.sipx_port = htons(0x0); - addr.sipx_type = IPX_RIP_PTYPE; - - if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) != 0) + addr.sipx_port = htons(0x0); + addr.sipx_type = IPX_RIP_PTYPE; + + if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) != 0) { goto finished; } - - addr.sipx_family = AF_IPX; - addr.sipx_port = htons(IPX_RIP_PORT); - addr.sipx_type = IPX_RIP_PTYPE; + addr.sipx_family = AF_IPX; + addr.sipx_port = htons(IPX_RIP_PORT); + addr.sipx_type = IPX_RIP_PTYPE; addr.sipx_network = htonl(0x0); ipx_assign_node(addr.sipx_node, IPX_BROADCAST_NODE); @@ -359,11 +346,10 @@ ipx_make_reachable(IPXNet network) rip.rt[0].network = htonl(network); if (sendto(sock, &rip, sizeof(rip), 0, - (struct sockaddr *)&addr, sizeof(addr)) < 0) + (struct sockaddr *) &addr, sizeof(addr)) < 0) { goto finished; } - packets = 3; do { @@ -374,10 +360,9 @@ ipx_make_reachable(IPXNet network) { goto finished; } - addrlen = sizeof(struct sockaddr_ipx); - len = ipx_recvfrom(sock, &rip, sizeof(rip),0, sr, &addrlen, 1, + len = ipx_recvfrom(sock, &rip, sizeof(rip), 0, sr, &addrlen, 1, &err); if (len < sizeof(rip)) @@ -392,11 +377,10 @@ ipx_make_reachable(IPXNet network) { goto finished; } - - rt_def.rt_flags = RTF_GATEWAY; + rt_def.rt_flags = RTF_GATEWAY; st->sipx_network = htonl(network); - st->sipx_family = AF_IPX; - sr->sipx_family = AF_IPX; + st->sipx_family = AF_IPX; + sr->sipx_family = AF_IPX; i = 0; do @@ -405,8 +389,8 @@ ipx_make_reachable(IPXNet network) i++; } while ((i < 5) && (res < 0) && (errno == EAGAIN)); - - finished: + + finished: close(sock); if (res != 0) @@ -415,7 +399,7 @@ ipx_make_reachable(IPXNet network) } return res; } - + static int install_wdog(struct ncp_conn *conn) { @@ -433,14 +417,12 @@ install_wdog(struct ncp_conn *conn) { return -1; } - if (pid != 0) { /* Parent, should go on as usual */ conn->wdog_pid = pid; return 0; } - while (1) { long err; @@ -455,24 +437,24 @@ install_wdog(struct ncp_conn *conn) anymore */ exit(0); } - - if ( (pktsize != 2) + if ((pktsize != 2) || (buf[1] != '?')) { continue; } - buf[1] = 'Y'; pktsize = sendto(sock, buf, 2, 0, - (struct sockaddr *)&sender, + (struct sockaddr *) &sender, sizeof(sender)); } } #define ncp_printf printf +#define ncp_printf printf + static void -assert_conn_locked(struct ncp_conn *conn); + assert_conn_locked(struct ncp_conn *conn); static void assert_conn_not_locked(struct ncp_conn *conn) @@ -500,14 +482,15 @@ ncp_unlock_conn(struct ncp_conn *conn) static long do_ncp_call(struct ncp_conn *conn, int request_size) { - struct ncp_request_header request = - *((struct ncp_request_header *)(&(conn->packet))); + struct ncp_request_header request; int result; int retries = 20; int len; long err; + memcpy(&request, conn->packet, sizeof(request)); + while (retries > 0) { struct ncp_reply_header reply; @@ -518,17 +501,16 @@ do_ncp_call(struct ncp_conn *conn, int request_size) result = sendto(conn->ncp_sock, conn->packet, request_size, - 0, (struct sockaddr *)&(conn->i.addr), + 0, (struct sockaddr *) &(conn->i.addr), sizeof(conn->i.addr)); if (result < 0) { return errno; } - - re_select: + re_select: len = ipx_recvfrom(conn->ncp_sock, - (char *)&reply, sizeof(reply), + (char *) &reply, sizeof(reply), MSG_PEEK, &sender, &sizeofaddr, 3, &err); if ((len < 0) && (err == ETIMEDOUT)) @@ -539,30 +521,28 @@ do_ncp_call(struct ncp_conn *conn, int request_size) { return err; } + if ( /* Is the sender wrong? */ + (memcmp(&sender.sipx_node, + &(conn->i.addr.sipx_node), 6) != 0) + || (sender.sipx_port != conn->i.addr.sipx_port) - if ( /* Is the sender wrong? */ - (memcmp(&sender.sipx_node, - &(conn->i.addr.sipx_node), 6) != 0) - || (sender.sipx_port != conn->i.addr.sipx_port) + /* Did the sender send a positive acknowledge? */ + || ((len == sizeof(reply)) + && (reply.type == NCP_POSITIVE_ACK)) - /* Did the sender send a positive acknowledge? */ - || ( (len == sizeof(reply)) - && (reply.type == NCP_POSITIVE_ACK)) - - /* Did we get a bogus answer? */ - || ( (len < sizeof(reply)) - || (reply.type != NCP_REPLY) - || ( (request.type != NCP_ALLOC_SLOT_REQUEST) - && ( (reply.sequence != request.sequence) - || (reply.conn_low != request.conn_low) - || (reply.conn_high != request.conn_high))))) + /* Did we get a bogus answer? */ + || ((len < sizeof(reply)) + || (reply.type != NCP_REPLY) + || ((request.type != NCP_ALLOC_SLOT_REQUEST) + && ((reply.sequence != request.sequence) + || (reply.conn_low != request.conn_low) + || (reply.conn_high != request.conn_high))))) { /* Then throw away the packet */ - ipx_recv(conn->ncp_sock, (char *)&reply, sizeof(reply), + ipx_recv(conn->ncp_sock, (char *) &reply, sizeof(reply), 0, 1, &err); goto re_select; } - ipx_recv(conn->ncp_sock, conn->packet, NCP_PACKET_SIZE, 0, 1, &err); conn->reply_size = len; @@ -574,95 +554,76 @@ do_ncp_call(struct ncp_conn *conn, int request_size) static int ncp_mount_request(struct ncp_conn *conn, int function) { - struct ncp_request_header *h - = (struct ncp_request_header *)(conn->packet); - struct ncp_reply_header *reply - = (struct ncp_reply_header *)(conn->packet); struct ncp_ioctl_request request; - int result; assert_conn_locked(conn); if (conn->has_subfunction != 0) { - *(__u16 *)&(h->data[0]) - = htons(conn->current_size - - sizeof(struct ncp_request_header) - 2); + WSET_HL(conn->packet, 7, conn->current_size + - sizeof(struct ncp_request_header) - 2); } + request.function = function; + request.size = conn->current_size; + request.data = conn->packet; - request.function = function; - request.size = conn->current_size; - request.data = conn->packet; - - if ((result = ioctl(conn->mount_fid,NCP_IOC_NCPREQUEST, &request)) < 0) + if ((result = ioctl(conn->mount_fid, NCP_IOC_NCPREQUEST, &request)) < 0) { return result; } - - conn->completion = reply->completion_code; - conn->conn_status = reply->connection_state; + conn->completion = BVAL(conn->packet, 6); + conn->conn_status = BVAL(conn->packet, 7); conn->ncp_reply_size = result - sizeof(struct ncp_reply_header); - if ((reply->completion_code != 0) && (conn->verbose != 0)) + if ((conn->completion != 0) && (conn->verbose != 0)) { - ncp_printf("ncp_request_error: %d\n", reply->completion_code); + ncp_printf("ncp_request_error: %d\n", conn->completion); } - return reply->completion_code == 0 ? 0 : NCPL_ET_REQUEST_ERROR; + return conn->completion == 0 ? 0 : NCPL_ET_REQUEST_ERROR; } static long ncp_temp_request(struct ncp_conn *conn, int function) { - struct ncp_request_header *h - = (struct ncp_request_header *)&(conn->packet); - struct ncp_reply_header *r - = (struct ncp_reply_header *)&(conn->packet); - long err; assert_conn_locked(conn); + conn->sequence += 1; + + WSET_LH(conn->packet, 0, NCP_REQUEST); + BSET(conn->packet, 2, conn->sequence); + BSET(conn->packet, 3, (conn->i.connection) & 0xff); + BSET(conn->packet, 5, (conn->i.connection) >> 8); + BSET(conn->packet, 4, 1); + BSET(conn->packet, 6, function); + if (conn->has_subfunction != 0) { - *(__u16 *)&(h->data[0]) - = htons(conn->current_size - - sizeof(struct ncp_request_header) - 2); + WSET_HL(conn->packet, 7, conn->current_size + - sizeof(struct ncp_request_header) - 2); } - - h->type = NCP_REQUEST; - - conn->sequence += 1; - h->sequence = conn->sequence; - h->conn_low = (conn->i.connection) & 0xff; - h->conn_high = ((conn->i.connection) & 0xff00) >> 8; - h->task = 1; - h->function = function; - if ((err = do_ncp_call(conn, conn->current_size)) != 0) { return err; } - - conn->completion = r->completion_code; - conn->conn_status = r->connection_state; + conn->completion = BVAL(conn->packet, 6); + conn->conn_status = BVAL(conn->packet, 7); conn->ncp_reply_size = - conn->reply_size - sizeof(struct ncp_reply_header); + conn->reply_size - sizeof(struct ncp_reply_header); - if ((r->completion_code != 0) && (conn->verbose != 0)) + if ((conn->completion != 0) && (conn->verbose != 0)) { - ncp_printf("ncp_completion_code: %d\n", r->completion_code); + ncp_printf("ncp_completion_code: %d\n", conn->completion); } - return r->completion_code == 0 ? 0 : NCPL_ET_REQUEST_ERROR; + return conn->completion == 0 ? 0 : NCPL_ET_REQUEST_ERROR; } static long ncp_connect_addr(struct ncp_conn *conn, const struct sockaddr_ipx *target, int wdog_needed) { - struct ncp_request_header *h = - (struct ncp_request_header *)&(conn->packet); - struct sockaddr_ipx addr; int addrlen; @@ -671,88 +632,87 @@ ncp_connect_addr(struct ncp_conn *conn, const struct sockaddr_ipx *target, conn->is_connected = NOT_CONNECTED; conn->verbose = 0; - + if ((ncp_sock = socket(AF_IPX, SOCK_DGRAM, PF_IPX)) == -1) { return errno; } - if ((wdog_sock = socket(AF_IPX, SOCK_DGRAM, PF_IPX)) == -1) { return errno; } - - addr.sipx_family = AF_IPX; - addr.sipx_port = htons(0x0); - addr.sipx_type = NCP_PTYPE; + addr.sipx_family = AF_IPX; + addr.sipx_port = htons(0x0); + addr.sipx_type = NCP_PTYPE; addr.sipx_network = IPX_THIS_NET; ipx_assign_node(addr.sipx_node, IPX_THIS_NODE); addrlen = sizeof(addr); - if ( (bind(ncp_sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) - || (getsockname(ncp_sock, (struct sockaddr *)&addr, &addrlen)==-1)) + if ((bind(ncp_sock, (struct sockaddr *) &addr, sizeof(addr)) == -1) + || (getsockname(ncp_sock, (struct sockaddr *) &addr, &addrlen) == -1)) { int saved_errno = errno; - close(ncp_sock); close(wdog_sock); + close(ncp_sock); + close(wdog_sock); return saved_errno; } - addr.sipx_port = htons(ntohs(addr.sipx_port) + 1); - if (bind(wdog_sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) + if (bind(wdog_sock, (struct sockaddr *) &addr, sizeof(addr)) == -1) { int saved_errno = errno; - close(ncp_sock); close(wdog_sock); + close(ncp_sock); + close(wdog_sock); return saved_errno; } - conn->ncp_sock = ncp_sock; conn->wdog_sock = wdog_sock; - h->type = NCP_ALLOC_SLOT_REQUEST; - conn->sequence = 0; - conn->i.addr = *target; - h->sequence = conn->sequence; - h->conn_low = 0xff; - h->conn_high = 0xff; - h->task = 1; - h->function = 0; + conn->i.addr = *target; - if ((err = do_ncp_call(conn, sizeof(*h))) != 0) + WSET_LH(conn->packet, 0, NCP_ALLOC_SLOT_REQUEST); + BSET(conn->packet, 2, conn->sequence); + BSET(conn->packet, 3, 0xff); + BSET(conn->packet, 4, 1); + BSET(conn->packet, 5, 0xff); + BSET(conn->packet, 6, 0); + + if ((err = do_ncp_call(conn, sizeof(struct ncp_request_header))) != 0) { - if ( (err != ENETUNREACH) + if ((err != ENETUNREACH) || (ipx_make_reachable(htonl(target->sipx_network)) != 0) - || ((err = do_ncp_call(conn, sizeof(*h))) != 0)) + || ((err = + do_ncp_call(conn, + sizeof(struct ncp_request_header))) != 0)) { - close(ncp_sock); close(wdog_sock); + close(ncp_sock); + close(wdog_sock); return err; } } - if (wdog_needed != 0) { install_wdog(conn); - } - else + } else { conn->wdog_pid = 0; } - conn->sequence = 0; - conn->i.connection = h->conn_low + (h->conn_high * 256); + conn->sequence = 0; + conn->i.connection = + BVAL(conn->packet, 3) + (BVAL(conn->packet, 5) << 8); conn->is_connected = CONN_TEMPORARY; - if ( (ncp_negotiate_buffersize(conn, 1024, - &(conn->i.buffer_size)) != 0) + if ((ncp_negotiate_buffersize(conn, 1024, + &(conn->i.buffer_size)) != 0) || (conn->i.buffer_size < 512) || (conn->i.buffer_size > 1024)) { ncp_do_close(conn); return -1; } - return 0; } @@ -768,7 +728,6 @@ ncp_connect_any(struct ncp_conn *conn, int wdog_needed) { return result; } - if ((result = ncp_connect_addr(conn, &addr, wdog_needed)) != 0) { return result; @@ -786,10 +745,10 @@ ncp_find_fileserver(char *server_name, long *err) struct sockaddr_ipx * ncp_find_server(char **server_name, int type, long *err) { - char server[NCP_BINDERY_NAME_LEN+1]; - static char nearest[NCP_BINDERY_NAME_LEN+1]; + char server[NCP_BINDERY_NAME_LEN + 1]; + static char nearest[NCP_BINDERY_NAME_LEN + 1]; struct nw_property prop; - struct prop_net_address *n_addr = (struct prop_net_address *)∝ + struct prop_net_address *n_addr = (struct prop_net_address *) ∝ struct ncp_conn conn; static struct sockaddr_ipx result; @@ -806,16 +765,13 @@ ncp_find_server(char **server_name, int type, long *err) *err = NCPL_ET_NAMETOOLONG; return NULL; } - strcpy(server, *server_name); str_upper(server); } - if ((*err = ipx_sap_find_nearest(type, &result, nearest)) != 0) { return NULL; } - /* We have to ask the nearest server for our wanted server */ memzero(conn); @@ -823,7 +779,6 @@ ncp_find_server(char **server_name, int type, long *err) { return NULL; } - if (*server_name == NULL) { *server_name = nearest; @@ -831,24 +786,22 @@ ncp_find_server(char **server_name, int type, long *err) errno = 0; return &result; } - /* The following optimization should have been done before - ncp_connect_addr. This would be convenient if there was a - simple way to find out whether there is a route to the - server. Parsing /proc/net/ipx_route is not too nice, so we - just connect to the server and immediately disconnect - again. This way we also find out if the server still has - free connection slots. */ + ncp_connect_addr. This would be convenient if there was a + simple way to find out whether there is a route to the + server. Parsing /proc/net/ipx_route is not too nice, so we + just connect to the server and immediately disconnect + again. This way we also find out if the server still has + free connection slots. */ if (strcmp(server, nearest) == 0) { /* Our wanted server answered the SAP GNS request, so - use it */ + use it */ ncp_do_close(&conn); errno = 0; return &result; } - if (ncp_read_property_value(&conn, type, server, 1, "NET_ADDRESS", &prop) != 0) { @@ -856,26 +809,23 @@ ncp_find_server(char **server_name, int type, long *err) *err = NCPL_ET_HOST_UNKNOWN; return NULL; } - if ((*err = ncp_do_close(&conn)) != 0) { return NULL; } - - result.sipx_family = AF_IPX; + result.sipx_family = AF_IPX; result.sipx_network = n_addr->network; - result.sipx_port = n_addr->port; + result.sipx_port = n_addr->port; ipx_assign_node(result.sipx_node, n_addr->node); /* To make the final server reachable, we connect again. See - above. (When can we rely on all users running ipxd??? :-)) */ + above. (When can we rely on all users running ipxd??? :-)) */ memzero(conn); - if ( ((*err = ncp_connect_addr(&conn, &result, 0)) != 0) + if (((*err = ncp_connect_addr(&conn, &result, 0)) != 0) || ((*err = ncp_do_close(&conn)) != 0)) { return NULL; } - return &result; } @@ -890,17 +840,14 @@ ncp_open_temporary(struct ncp_conn *conn, { return ncp_connect_any(conn, 1); } - if ((addr = ncp_find_fileserver(spec->server, &err)) == NULL) { return err; } - if ((err = ncp_connect_addr(conn, addr, 1)) != 0) { return err; } - strcpy(conn->server, spec->server); if (strlen(spec->user) != 0) @@ -913,7 +860,6 @@ ncp_open_temporary(struct ncp_conn *conn, } strcpy(conn->user, spec->user); } - return 0; } @@ -926,35 +872,32 @@ ncp_find_permanent(const struct ncp_conn_spec *spec) int mount_fid; struct ncp_fs_info i; - initialize_NCPL_error_table(); + initialize_NCPL_error_table(); if ((mtab = fopen(MOUNTED, "r")) == NULL) { return NULL; } - while ((conn_ent = ncp_get_conn_ent(mtab)) != NULL) { if (spec != NULL) { - if ( (conn_ent->uid != spec->uid) - || ( (strlen(spec->server) != 0) + if ((conn_ent->uid != spec->uid) + || ((strlen(spec->server) != 0) && (strcasecmp(conn_ent->server, spec->server) != 0)) - || ( (strlen(spec->user) != 0) + || ((strlen(spec->user) != 0) && (strcasecmp(conn_ent->user, spec->user) != 0))) { continue; } } - mount_fid = open(conn_ent->mount_point, O_RDONLY, 0); if (mount_fid < 0) { continue; } - i.version = NCP_GET_FS_INFO_VERSION; if (ioctl(mount_fid, NCP_IOC_GET_FS_INFO, &i) < 0) @@ -962,7 +905,6 @@ ncp_find_permanent(const struct ncp_conn_spec *spec) close(mount_fid); continue; } - close(mount_fid); result = conn_ent->mount_point; break; @@ -972,7 +914,7 @@ ncp_find_permanent(const struct ncp_conn_spec *spec) errno = (result == NULL) ? ENOENT : 0; return result; } - + static int ncp_open_permanent(struct ncp_conn *conn, const struct ncp_conn_spec *spec) @@ -984,18 +926,15 @@ ncp_open_permanent(struct ncp_conn *conn, errno = EBUSY; return -1; } - if ((mount_point = ncp_find_permanent(spec)) == NULL) { return -1; } - if (strlen(mount_point) >= sizeof(conn->mount_point)) { errno = ENAMETOOLONG; return -1; } - /* The rest has already been done in ncp_find_permanent, so we * do not check errors anymore */ conn->mount_fid = open(mount_point, O_RDONLY, 0); @@ -1005,12 +944,11 @@ ncp_open_permanent(struct ncp_conn *conn, { strncpy(conn->server, spec->server, sizeof(conn->server)); strncpy(conn->user, spec->user, sizeof(conn->user)); - } - else + } else { - memset(conn->server, '\0', sizeof(conn->server)); - memset(conn->user, '\0', sizeof(conn->user)); - } + memset(conn->server, '\0', sizeof(conn->server)); + memset(conn->user, '\0', sizeof(conn->user)); + } strcpy(conn->mount_point, mount_point); conn->is_connected = CONN_PERMANENT; return 0; @@ -1021,7 +959,7 @@ ncp_open(struct ncp_conn_spec *spec, long *err) { struct ncp_conn *result; - initialize_NCPL_error_table(); + initialize_NCPL_error_table(); result = malloc(sizeof(struct ncp_conn)); @@ -1030,14 +968,12 @@ ncp_open(struct ncp_conn_spec *spec, long *err) *err = ENOMEM; return NULL; } - memzero(*result); if (ncp_open_permanent(result, spec) == 0) { return result; } - if ((*err = ncp_open_temporary(result, spec)) != 0) { free(result); @@ -1052,14 +988,13 @@ ncp_open_mount(const char *mount_point, long *err) { struct ncp_conn *result; - initialize_NCPL_error_table(); + initialize_NCPL_error_table(); if (strlen(mount_point) >= sizeof(result->mount_point)) { *err = ENAMETOOLONG; return NULL; } - result = malloc(sizeof(struct ncp_conn)); if (result == NULL) @@ -1067,7 +1002,6 @@ ncp_open_mount(const char *mount_point, long *err) *err = ENOMEM; return NULL; } - memzero(*result); result->is_connected = NOT_CONNECTED; @@ -1096,24 +1030,21 @@ ncp_open_mount(const char *mount_point, long *err) static long ncp_user_disconnect(struct ncp_conn *conn) { - struct ncp_request_header *h - = (struct ncp_request_header *)(conn->packet); long result; - h->type = NCP_DEALLOC_SLOT_REQUEST; - conn->sequence += 1; - h->sequence = conn->sequence; - h->conn_low = (conn->i.connection) & 0xff; - h->conn_high = ((conn->i.connection) & 0xff00) >> 8; - h->task = 1; - h->function = 0; - if ((result = do_ncp_call(conn, sizeof(*h))) != 0) + WSET_LH(conn->packet, 0, NCP_DEALLOC_SLOT_REQUEST); + BSET(conn->packet, 2, conn->sequence); + BSET(conn->packet, 3, (conn->i.connection) & 0xff); + BSET(conn->packet, 4, 1); + BSET(conn->packet, 5, (conn->i.connection) >> 8); + BSET(conn->packet, 6, 0); + + if ((result = do_ncp_call(conn, sizeof(struct ncp_request_header))) != 0) { return result; } - close(conn->ncp_sock); close(conn->wdog_sock); @@ -1122,7 +1053,6 @@ ncp_user_disconnect(struct ncp_conn *conn) kill(conn->wdog_pid, SIGTERM); wait(NULL); } - return 0; } @@ -1136,7 +1066,7 @@ ncp_do_close(struct ncp_conn *conn) case CONN_PERMANENT: result = close(conn->mount_fid); break; - + case CONN_TEMPORARY: result = ncp_user_disconnect(conn); break; @@ -1144,7 +1074,7 @@ ncp_do_close(struct ncp_conn *conn) default: break; } - + conn->is_connected = NOT_CONNECTED; return result; @@ -1158,7 +1088,6 @@ ncp_close(struct ncp_conn *conn) { return 0; } - if ((result = ncp_do_close(conn)) != 0) { return result; @@ -1168,10 +1097,10 @@ ncp_close(struct ncp_conn *conn) } struct ncp_conn_ent * -ncp_get_conn_ent(FILE *filep) +ncp_get_conn_ent(FILE * filep) { static struct ncp_conn_ent entry; - char server[2*NCP_BINDERY_NAME_LEN]; + char server[2 * NCP_BINDERY_NAME_LEN]; char *user; struct mntent *mnt_ent; int fid; @@ -1185,12 +1114,10 @@ ncp_get_conn_ent(FILE *filep) { continue; } - if (strlen(mnt_ent->mnt_fsname) >= sizeof(server)) { continue; } - strcpy(server, mnt_ent->mnt_fsname); user = strchr(server, '/'); if (user != NULL) @@ -1203,8 +1130,7 @@ ncp_get_conn_ent(FILE *filep) } strcpy(entry.user, user); } - - if ( (strlen(server) >= sizeof(entry.server)) + if ((strlen(server) >= sizeof(entry.server)) || (strlen(mnt_ent->mnt_dir) >= sizeof(entry.mount_point))) { continue; @@ -1218,12 +1144,11 @@ ncp_get_conn_ent(FILE *filep) { continue; } - - if (ioctl(fid, NCP_IOC_GETMOUNTUID, &entry.uid) != 0) { + if (ioctl(fid, NCP_IOC_GETMOUNTUID, &entry.uid) != 0) + { close(fid); continue; } - close(fid); return &entry; } @@ -1232,7 +1157,7 @@ ncp_get_conn_ent(FILE *filep) } static struct ncp_conn_spec * -ncp_get_nwc_ent(FILE *nwc) +ncp_get_nwc_ent(FILE * nwc) { static struct ncp_conn_spec spec; char line[512]; @@ -1245,18 +1170,16 @@ ncp_get_nwc_ent(FILE *nwc) while (fgets(line, sizeof(line), nwc) != NULL) { - if ( (line[0] == '\n') + if ((line[0] == '\n') || (line[0] == '#')) { continue; } - line_len = strlen(line); - if (line[line_len-1] == '\n') + if (line[line_len - 1] == '\n') { - line[line_len-1] = '\0'; + line[line_len - 1] = '\0'; } - user = strchr(line, '/'); password = strchr(user != NULL ? user : line, ' '); @@ -1265,7 +1188,6 @@ ncp_get_nwc_ent(FILE *nwc) *password = '\0'; password += 1; } - if (user != NULL) { *user = '\0'; @@ -1276,7 +1198,6 @@ ncp_get_nwc_ent(FILE *nwc) } strcpy(spec.user, user); } - if (strlen(line) >= sizeof(spec.server)) { continue; @@ -1312,12 +1233,10 @@ ncp_fopen_nwc(const char *user, const char *mode, long *err) { mode = "r"; } - if (user == NULL) { home = getenv("HOME"); - } - else + } else { struct passwd *pwd; @@ -1327,13 +1246,12 @@ ncp_fopen_nwc(const char *user, const char *mode, long *err) } } - if ( (home == NULL) - || (strlen(home) + sizeof(NWCLIENT) + 2 > sizeof(path))) + if ((home == NULL) + || (strlen(home) + sizeof(NWCLIENT) + 2 > sizeof(path))) { *err = ENAMETOOLONG; return NULL; } - strcpy(path, home); strcat(path, "/"); strcat(path, NWCLIENT); @@ -1343,13 +1261,11 @@ ncp_fopen_nwc(const char *user, const char *mode, long *err) *err = errno; return NULL; } - if ((st.st_mode & (S_IRWXO | S_IRWXG)) != 0) { *err = NCPL_ET_INVALID_MODE; return NULL; } - return fopen(path, mode); } @@ -1364,7 +1280,7 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, FILE *nwc; struct ncp_conn_spec *nwc_ent; - initialize_NCPL_error_table(); + initialize_NCPL_error_table(); *err = 0; memzero(spec); @@ -1378,15 +1294,13 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, return NULL; } strcpy(spec.server, server); - } - else + } else { if ((nwc = ncp_fopen_nwc(NULL, NULL, err)) == NULL) { *err = NCPL_ET_NO_SERVER; return NULL; } - nwc_ent = ncp_get_nwc_ent(nwc); fclose(nwc); @@ -1407,7 +1321,6 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, memset(spec.password, 0, sizeof(spec.password)); return &spec; } - if (user != NULL) { if (strlen(user) >= sizeof(spec.user)) @@ -1417,7 +1330,6 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, } strcpy(spec.user, user); } - str_upper(spec.user); spec.login_type = NCP_BINDERY_USER; @@ -1426,7 +1338,6 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, ncp_do_close(&conn); return &spec; } - if (password != NULL) { if (strlen(password) >= sizeof(spec.password)) @@ -1435,16 +1346,15 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, return NULL; } strcpy(spec.password, password); - } - else + } else { if ((nwc = ncp_fopen_nwc(NULL, NULL, err)) != NULL) { while ((nwc_ent = ncp_get_nwc_ent(nwc)) != NULL) { - if ( (strcasecmp(spec.server, - nwc_ent->server) != 0) - || ( (*spec.user != '\0') + if ((strcasecmp(spec.server, + nwc_ent->server) != 0) + || ((*spec.user != '\0') && (strcasecmp(spec.user, nwc_ent->user) != 0))) { @@ -1463,7 +1373,6 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, *err = NCPL_ET_NO_USER; return NULL; } - if ((strlen(spec.password) == 0) && (password == NULL)) { char *password; @@ -1480,8 +1389,7 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, return NULL; } strcpy(spec.password, password); - } - else + } else { if (strcmp(spec.password, NWC_NOPASSWORD) == 0) { @@ -1499,8 +1407,8 @@ struct ncp_conn * ncp_initialize_as(int *argc, char **argv, int login_necessary, int login_type, long *err) { - char *server = NULL; - char *user = NULL; + char *server = NULL; + char *user = NULL; char *password = NULL; struct ncp_conn_spec *spec; int i = 1; @@ -1511,40 +1419,38 @@ ncp_initialize_as(int *argc, char **argv, if (target != NULL) { - if (arg_no+1 >= *argc) + if (arg_no + 1 >= *argc) { /* No argument to switch */ errno = EINVAL; return -1; } - *target = argv[arg_no+1]; + *target = argv[arg_no + 1]; count = 2; } - /* Delete the consumed switch from the argument list and decrement the argument count */ - while (count+arg_no < *argc) + while (count + arg_no < *argc) { - argv[arg_no] = argv[arg_no+count]; + argv[arg_no] = argv[arg_no + count]; arg_no += 1; } *argc -= count; return 0; } - initialize_NCPL_error_table(); + initialize_NCPL_error_table(); *err = EINVAL; while (i < *argc) { - if ( (argv[i][0] != '-') + if ((argv[i][0] != '-') || (strlen(argv[i]) != 2)) { i += 1; continue; } - switch (argv[i][1]) { case 'S': @@ -1584,23 +1490,20 @@ ncp_initialize_as(int *argc, char **argv, if (login_necessary != 0) { return NULL; - } - else + } else { return ncp_open(NULL, err); } } - spec->login_type = login_type; if (login_necessary == 0) { spec->user[0] = '\0'; } - return ncp_open(spec, err); } - + struct ncp_conn * ncp_initialize(int *argc, char **argv, int login_necessary, long *err) @@ -1612,7 +1515,8 @@ ncp_initialize(int *argc, char **argv, static long ncp_request(struct ncp_conn *conn, int function) { - switch (conn->is_connected) { + switch (conn->is_connected) + { case CONN_PERMANENT: return ncp_mount_request(conn, function); case CONN_TEMPORARY: @@ -1631,13 +1535,14 @@ ncp_request(struct ncp_conn *conn, int function) static inline int min(int a, int b) { - return (alock == 0) { + if (conn->lock == 0) + { ncp_printf("ncpfs: conn not locked!\n"); } } @@ -1646,20 +1551,47 @@ static void ncp_add_byte(struct ncp_conn *conn, byte x) { assert_conn_locked(conn); - *(byte *)(&(conn->packet[conn->current_size])) = x; + BSET(conn->packet, conn->current_size, x); conn->current_size += 1; return; } static void -ncp_add_word(struct ncp_conn *conn, word x) +ncp_add_word_lh(struct ncp_conn *conn, word x) { assert_conn_locked(conn); - *(word *)(&(conn->packet[conn->current_size])) = x; + WSET_LH(conn->packet, conn->current_size, x); conn->current_size += 2; return; } +static void +ncp_add_dword_lh(struct ncp_conn *conn, dword x) +{ + assert_conn_locked(conn); + DSET_LH(conn->packet, conn->current_size, x); + conn->current_size += 4; + return; +} + +static void +ncp_add_word_hl(struct ncp_conn *conn, word x) +{ + assert_conn_locked(conn); + WSET_HL(conn->packet, conn->current_size, x); + conn->current_size += 2; + return; +} + +static void +ncp_add_dword_hl(struct ncp_conn *conn, dword x) +{ + assert_conn_locked(conn); + DSET_HL(conn->packet, conn->current_size, x); + conn->current_size += 4; + return; +} + static void ncp_add_mem(struct ncp_conn *conn, const void *source, int size) { @@ -1674,7 +1606,8 @@ ncp_add_pstring(struct ncp_conn *conn, const char *s) { int len = strlen(s); assert_conn_locked(conn); - if (len > 255) { + if (len > 255) + { ncp_printf("ncpfs: string too long: %s\n", s); len = 255; } @@ -1696,7 +1629,7 @@ static void ncp_init_request_s(struct ncp_conn *conn, int subfunction) { ncp_init_request(conn); - ncp_add_word(conn, 0); /* preliminary size */ + ncp_add_word_lh(conn, 0); /* preliminary size */ ncp_add_byte(conn, subfunction); @@ -1712,19 +1645,31 @@ ncp_reply_data(struct ncp_conn *conn, int offset) static byte ncp_reply_byte(struct ncp_conn *conn, int offset) { - return *(byte *)(ncp_reply_data(conn, offset)); + return *(byte *) (ncp_reply_data(conn, offset)); } static word -ncp_reply_word(struct ncp_conn *conn, int offset) +ncp_reply_word_hl(struct ncp_conn *conn, int offset) { - return *(word *)(ncp_reply_data(conn, offset)); + return WVAL_HL(ncp_reply_data(conn, offset), 0); +} + +static word +ncp_reply_word_lh(struct ncp_conn *conn, int offset) +{ + return WVAL_LH(ncp_reply_data(conn, offset), 0); } static dword -ncp_reply_dword(struct ncp_conn *conn, int offset) +ncp_reply_dword_hl(struct ncp_conn *conn, int offset) { - return *(dword *)(ncp_reply_data(conn, offset)); + return DVAL_HL(ncp_reply_data(conn, offset), 0); +} + +static dword +ncp_reply_dword_lh(struct ncp_conn *conn, int offset) +{ + return DVAL_LH(ncp_reply_data(conn, offset), 0); } /* Here the ncp calls begin @@ -1737,14 +1682,14 @@ ncp_negotiate_buffersize(struct ncp_conn *conn, long result; ncp_init_request(conn); - ncp_add_word(conn, htons(size)); - - if ((result = ncp_request(conn, 33)) != 0) { + ncp_add_word_hl(conn, size); + + if ((result = ncp_request(conn, 33)) != 0) + { ncp_unlock_conn(conn); return result; } - - *target =min(ntohs(ncp_reply_word(conn, 0)), size); + *target = min(ncp_reply_word_hl(conn, 0), size); ncp_unlock_conn(conn); return 0; @@ -1761,18 +1706,18 @@ ncp_get_encryption_key(struct ncp_conn *conn, ncp_init_request_s(conn, 23); - if ((result = ncp_request(conn, 23)) != 0) { + if ((result = ncp_request(conn, 23)) != 0) + { ncp_unlock_conn(conn); return result; } - - if (conn->ncp_reply_size < 8) { + if (conn->ncp_reply_size < 8) + { ncp_printf("ncp_reply_size %d < 8\n", - conn->ncp_reply_size); + conn->ncp_reply_size); ncp_unlock_conn(conn); return result; } - memcpy(target, ncp_reply_data(conn, 0), 8); ncp_unlock_conn(conn); return 0; @@ -1786,23 +1731,23 @@ ncp_get_bindery_object_id(struct ncp_conn *conn, { long result; ncp_init_request_s(conn, 53); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); - if ((result = ncp_request(conn, 23)) != 0) { + if ((result = ncp_request(conn, 23)) != 0) + { ncp_unlock_conn(conn); return result; } - - if (conn->ncp_reply_size < 54) { + if (conn->ncp_reply_size < 54) + { ncp_printf("ncp_reply_size %d < 54\n", - conn->ncp_reply_size); + conn->ncp_reply_size); ncp_unlock_conn(conn); return result; } - - target->object_id = ntohl(ncp_reply_dword(conn, 0)); - target->object_type = ntohs(ncp_reply_word (conn, 4)); + target->object_id = ncp_reply_dword_hl(conn, 0); + target->object_type = ncp_reply_word_hl(conn, 4); memcpy(target->object_name, ncp_reply_data(conn, 6), 48); ncp_unlock_conn(conn); return 0; @@ -1816,16 +1761,16 @@ ncp_read_property_value(struct ncp_conn *conn, { long result; ncp_init_request_s(conn, 61); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); ncp_add_byte(conn, segment); ncp_add_pstring(conn, prop_name); - if ((result = ncp_request(conn, 23)) != 0) { + if ((result = ncp_request(conn, 23)) != 0) + { ncp_unlock_conn(conn); return result; } - memcpy(&(target->value), ncp_reply_data(conn, 0), 128); target->more_flag = ncp_reply_byte(conn, 128); target->property_flag = ncp_reply_byte(conn, 129); @@ -1844,12 +1789,12 @@ ncp_login_encrypted(struct ncp_conn *conn, unsigned char encrypted[8]; long result; - shuffle((byte *)&tmpID, passwd, strlen(passwd), buf); + shuffle((byte *) & tmpID, passwd, strlen(passwd), buf); nw_encrypt(key, buf, encrypted); ncp_init_request_s(conn, 24); ncp_add_mem(conn, encrypted, 8); - ncp_add_word(conn, htons(object->object_type)); + ncp_add_word_hl(conn, object->object_type); ncp_add_pstring(conn, object->object_name); result = ncp_request(conn, 23); @@ -1864,7 +1809,7 @@ ncp_login_unencrypted(struct ncp_conn *conn, { long result; ncp_init_request_s(conn, 20); - ncp_add_word(conn, htons(object_type)); + ncp_add_word_hl(conn, object_type); ncp_add_pstring(conn, object_name); ncp_add_pstring(conn, passwd); result = ncp_request(conn, 23); @@ -1879,7 +1824,7 @@ ncp_login_user(struct ncp_conn *conn, { return ncp_login_object(conn, username, NCP_BINDERY_USER, password); } - + static long ncp_login_object(struct ncp_conn *conn, const unsigned char *username, @@ -1890,28 +1835,27 @@ ncp_login_object(struct ncp_conn *conn, unsigned char ncp_key[8]; struct ncp_bindery_object user; - if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) { + if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) + { return ncp_login_unencrypted(conn, login_type, username, password); } - if ((result = ncp_get_bindery_object_id(conn, login_type, - username, &user)) != 0) { + username, &user)) != 0) + { return result; } - if ((result = ncp_login_encrypted(conn, &user, ncp_key, password)) != 0) { struct nw_property p; struct ncp_prop_login_control *l - = (struct ncp_prop_login_control *)&p; + = (struct ncp_prop_login_control *) &p; if (conn->completion != NCP_GRACE_PERIOD) { return result; } - fprintf(stderr, "Your password has expired\n"); if ((result = ncp_read_property_value(conn, NCP_BINDERY_USER, diff --git a/sutil/ncplib.h b/sutil/ncplib.h index 7aaaf44..095eed7 100644 --- a/sutil/ncplib.h +++ b/sutil/ncplib.h @@ -24,6 +24,90 @@ #define memzero(object) memset(&(object), 0, sizeof(object)) #endif +typedef __u8 byte; +typedef __u16 word; +typedef __u32 dword; + +#define BVAL(buf,pos) (((__u8 *)(buf))[pos]) +#define PVAL(buf,pos) ((unsigned)BVAL(buf,pos)) +#define BSET(buf,pos,val) (BVAL(buf,pos) = (val)) + +static inline word +WVAL_HL(__u8 *buf, int pos) +{ + return PVAL(buf,pos)<<8 | PVAL(buf, pos+1); +} +static inline dword +DVAL_HL(__u8 *buf, int pos) +{ + return WVAL_HL(buf, pos)<<16 | WVAL_HL(buf, pos+2); +} +static inline void +WSET_HL(__u8 *buf, int pos, word val) +{ + BSET(buf,pos,val>>8); + BSET(buf,pos+1, val & 0xff); +} +static inline void +DSET_HL(__u8 *buf, int pos, dword val) +{ + WSET_HL(buf, pos, val >>16); + WSET_HL(buf, pos+2, val & 0xffff); +} + + +/* we know that the 386 can handle misalignment and has the "right" + byteorder */ +#if defined(__i386__) + +static inline word +WVAL_LH(__u8 *buf, int pos) +{ + return *((word *)(buf+pos)); +} +static inline dword +DVAL_LH(__u8 *buf, int pos) +{ + return *((dword *)(buf+pos)); +} +static inline void +WSET_LH(__u8 *buf, int pos, word val) +{ + *((word *)(buf+pos)) = val; +} +static inline void +DSET_LH(__u8 *buf, int pos, dword val) +{ + *((dword *)(buf+pos)) = val; +} + +#else + +static inline word +WVAL_LH(__u8 *buf, int pos) +{ + return PVAL(buf,pos) | PVAL(buf, pos+1)<<8; +} +static inline dword +DVAL_LH(__u8 *buf, int pos) +{ + return WVAL_LH(buf, pos) | WVAL_LH(buf, pos+2) << 16; +} +static inline void +WSET_LH(__u8 *buf, int pos, word val) +{ + BSET(buf,pos,val & 0xff); + BSET(buf,pos+1, val >> 8); +} +static inline void +DSET_LH(__u8 *buf, int pos, dword val) +{ + WSET_LH(buf, pos, val & 0xffff); + WSET_LH(buf, pos+2, val >> 16); +} + +#endif + void str_upper(char *name); diff --git a/sutil/ncpmount.c b/sutil/ncpmount.c index b05b1a9..e61ad84 100644 --- a/sutil/ncpmount.c +++ b/sutil/ncpmount.c @@ -26,7 +26,7 @@ #include #include #include -/* #include */ /* generates a warning here */ + /* #include *//* generates a warning here */ extern pid_t waitpid(pid_t, int *, int); #include #include @@ -61,8 +61,8 @@ load_ncpfs(void) FILE *ffs; char s[1024]; char *p, *p1; - pid_t pid; - int status; + pid_t pid; + int status; /* Check if ncpfs is in the kernel */ ffs = fopen("/proc/filesystems", "r"); @@ -72,9 +72,8 @@ load_ncpfs(void) perror("Error: \"/proc/filesystems\" could not be read:"); return -1; } - p = NULL; - while (! feof(ffs)) + while (!feof(ffs)) { p1 = fgets(s, sizeof(s), ffs); if (p1) @@ -92,84 +91,79 @@ load_ncpfs(void) { return 0; } + /* system() function without signal handling, from Stevens */ - /* system() function without signal handling, from Stevens */ - - if ((pid = fork()) < 0) + if ((pid = fork()) < 0) { - return 1; - } - else if (pid == 0) + return 1; + } else if (pid == 0) { - /* child */ - execl("/sbin/modprobe", "modprobe", "ncpfs", NULL); - _exit(127); /* execl error */ - } - else + /* child */ + execl("/sbin/modprobe", "modprobe", "ncpfs", NULL); + _exit(127); /* execl error */ + } else { - /* parent */ - while (waitpid(pid, &status, 0) < 0) + /* parent */ + while (waitpid(pid, &status, 0) < 0) { - if (errno != EINTR) + if (errno != EINTR) { - status = -1; - break; - } - } - } - return status; + status = -1; + break; + } + } + } + return status; } -#endif /* HAVE_KERNELD */ +#endif /* HAVE_KERNELD */ /* Check whether user is allowed to mount on the specified mount point */ static int mount_ok(struct stat *st) { - if (!S_ISDIR(st->st_mode)) - { - errno = ENOTDIR; - return -1; - } - - if ( (getuid() != 0) - && ( (getuid() != st->st_uid) - || ((st->st_mode & S_IRWXU) != S_IRWXU))) - { - errno = EPERM; - return -1; - } - - return 0; + if (!S_ISDIR(st->st_mode)) + { + errno = ENOTDIR; + return -1; + } + if ((getuid() != 0) + && ((getuid() != st->st_uid) + || ((st->st_mode & S_IRWXU) != S_IRWXU))) + { + errno = EPERM; + return -1; + } + return 0; } -int +int main(int argc, char *argv[]) { - struct ncp_mount_data data; - struct stat st; + struct ncp_mount_data data; + struct stat st; char mount_name[256]; - int fd, result; + int fd, result; struct sockaddr_ipx addr; struct sockaddr_ipx *server_addr; int addrlen; - int upcase_password; + int upcase_password; long err; - int um; + int um; unsigned int flags; - char mount_point[MAXPATHLEN]; - struct mntent ment; - FILE *mtab; + char mount_point[MAXPATHLEN]; + struct mntent ment; + FILE *mtab; char *tmp_mount; - char *server = NULL; - char *user = NULL; + char *server = NULL; + char *user = NULL; char *password = NULL; struct ncp_conn_spec *spec; @@ -179,36 +173,36 @@ main(int argc, char *argv[]) int opt; - progname = argv[0]; + progname = argv[0]; - memzero(data); memzero(spec); + memzero(data); + memzero(spec); if (geteuid() != 0) { - fprintf(stderr, "%s must be installed suid root\n", progname); - exit(1); - } - - data.uid = getuid(); - data.gid = getgid(); - um = umask(0); - umask(um); - data.file_mode = (S_IRWXU|S_IRWXG|S_IRWXO) & ~um; - data.dir_mode = 0; - data.flags |= NCP_MOUNT_SOFT; + fprintf(stderr, "%s must be installed suid root\n", progname); + exit(1); + } + data.uid = getuid(); + data.gid = getgid(); + um = umask(0); + umask(um); + data.file_mode = (S_IRWXU | S_IRWXG | S_IRWXO) & ~um; + data.dir_mode = 0; + data.flags |= NCP_MOUNT_SOFT; data.time_out = 60; data.retry_count = 5; upcase_password = 1; - while ((opt = getopt (argc, argv, "CS:U:c:u:g:f:d:P:nh?vV:t:r:")) + while ((opt = getopt(argc, argv, "CS:U:c:u:g:f:d:P:nh?vV:t:r:")) != EOF) { - switch (opt) + switch (opt) { - case 'C': - upcase_password = 0; - break; + case 'C': + upcase_password = 0; + break; case 'S': if (strlen(optarg) >= sizeof(spec->server)) { @@ -218,80 +212,77 @@ main(int argc, char *argv[]) } server = optarg; break; - case 'U': - if (strlen(optarg) >= sizeof(spec->user)) + case 'U': + if (strlen(optarg) >= sizeof(spec->user)) { - fprintf(stderr, "Username too long: %s\n", - optarg); - return 1; - } + fprintf(stderr, "Username too long: %s\n", + optarg); + return 1; + } user = optarg; break; - case 'c': - if (isdigit(optarg[0])) + case 'c': + if (isdigit(optarg[0])) { conn_uid = atoi(optarg); - } - else + } else { - struct passwd *pwd = getpwnam(optarg); - if (pwd == NULL) + struct passwd *pwd = getpwnam(optarg); + if (pwd == NULL) { - fprintf(stderr, "Unknown user: %s\n", - optarg); - return 1; - } - conn_uid = pwd->pw_uid; - } - break; - case 'u': - if (isdigit(optarg[0])) + fprintf(stderr, "Unknown user: %s\n", + optarg); + return 1; + } + conn_uid = pwd->pw_uid; + } + break; + case 'u': + if (isdigit(optarg[0])) { data.uid = atoi(optarg); - } - else + } else { - struct passwd *pwd = getpwnam(optarg); - if (pwd == NULL) + struct passwd *pwd = getpwnam(optarg); + if (pwd == NULL) { - fprintf(stderr, "Unknown user: %s\n", - optarg); - return 1; - } - data.uid = pwd->pw_uid; - } - break; - case 'g': - if (isdigit(optarg[0])) + fprintf(stderr, "Unknown user: %s\n", + optarg); + return 1; + } + data.uid = pwd->pw_uid; + } + break; + case 'g': + if (isdigit(optarg[0])) { - data.gid = atoi(optarg); - } - else + data.gid = atoi(optarg); + } else { - struct group *grp = getgrnam(optarg); - if (grp == NULL) + struct group *grp = getgrnam(optarg); + if (grp == NULL) { - fprintf(stderr, "Unknown group: %s\n", - optarg); - return 1; - } - data.gid = grp->gr_gid; - } - break; - case 'f': - data.file_mode = strtol(optarg, NULL, 8); - break; - case 'd': - data.dir_mode = strtol(optarg, NULL, 8); - break; - case 'P': + fprintf(stderr, "Unknown group: %s\n", + optarg); + return 1; + } + data.gid = grp->gr_gid; + } + break; + case 'f': + data.file_mode = strtol(optarg, NULL, 8); + break; + case 'd': + data.dir_mode = strtol(optarg, NULL, 8); + break; + case 'P': if (strlen(optarg) >= sizeof(spec->password)) { printf("password too long\n"); exit(1); } password = optarg; - break; + break; case 'V': if (strlen(optarg) >= sizeof(data.mounted_vol)) { @@ -300,9 +291,9 @@ main(int argc, char *argv[]) } strcpy(data.mounted_vol, optarg); break; - case 'n': + case 'n': password = ""; - break; + break; case 't': data.time_out = atoi(optarg); break; @@ -316,46 +307,41 @@ main(int argc, char *argv[]) case 'v': fprintf(stderr, "ncpfs version %s\n", NCPFS_VERSION); exit(1); - default: + default: usage(); - return -1; - } - } + return -1; + } + } - if ((spec = ncp_find_conn_spec(server,user,password,1, data.uid, &err)) + if ((spec = ncp_find_conn_spec(server, user, password, 1, data.uid, &err)) == NULL) { com_err(progname, err, "in find_conn_spec"); exit(1); } - if (upcase_password != 0) { str_upper(spec->password); } - - if (optind != argc-1) + if (optind != argc - 1) { usage(); return -1; } - realpath(argv[optind], mount_point); - if (stat(mount_point, &st) == -1) + if (stat(mount_point, &st) == -1) { - fprintf(stderr, "could not find mount point %s: %s\n", - mount_point, strerror(errno)); - exit(1); - } - - if (mount_ok(&st) != 0) + fprintf(stderr, "could not find mount point %s: %s\n", + mount_point, strerror(errno)); + exit(1); + } + if (mount_ok(&st) != 0) { - fprintf(stderr, "cannot to mount on %s: %s\n", - mount_point, strerror(errno)); - exit(1); - } - + fprintf(stderr, "cannot to mount on %s: %s\n", + mount_point, strerror(errno)); + exit(1); + } #ifndef HAVE_KERNELD /* Check if the ncpfs filesystem is in the kernel. If not, attempt * to load the ncpfs module */ @@ -366,21 +352,20 @@ main(int argc, char *argv[]) } #endif - data.version = NCP_MOUNT_VERSION; - data.mounted_uid = conn_uid; + data.version = NCP_MOUNT_VERSION; + data.mounted_uid = conn_uid; memcpy(data.server_name, spec->server, sizeof(data.server_name)); - if (data.dir_mode == 0) + if (data.dir_mode == 0) { - data.dir_mode = data.file_mode; - if ((data.dir_mode & S_IRUSR) != 0) - data.dir_mode |= S_IXUSR; - if ((data.dir_mode & S_IRGRP) != 0) - data.dir_mode |= S_IXGRP; - if ((data.dir_mode & S_IROTH) != 0) - data.dir_mode |= S_IXOTH; - } - + data.dir_mode = data.file_mode; + if ((data.dir_mode & S_IRUSR) != 0) + data.dir_mode |= S_IXUSR; + if ((data.dir_mode & S_IRGRP) != 0) + data.dir_mode |= S_IXGRP; + if ((data.dir_mode & S_IROTH) != 0) + data.dir_mode |= S_IXOTH; + } if ((tmp_mount = ncp_find_permanent(spec)) != NULL) { @@ -390,7 +375,6 @@ main(int argc, char *argv[]) tmp_mount); exit(1); } - if ((server_addr = ncp_find_fileserver(spec->server, &err)) == NULL) { com_err("ncpmount", err, "when trying to find %s", @@ -399,13 +383,12 @@ main(int argc, char *argv[]) } data.serv_addr = *server_addr; - data.ncp_fd = socket(AF_IPX, SOCK_DGRAM, PF_IPX); + data.ncp_fd = socket(AF_IPX, SOCK_DGRAM, PF_IPX); if (data.ncp_fd == -1) { com_err("ncpmount", err, "opening ncp_socket"); exit(1); } - data.wdog_fd = socket(AF_IPX, SOCK_DGRAM, PF_IPX); if (data.wdog_fd == -1) { @@ -413,11 +396,10 @@ main(int argc, char *argv[]) strerror(errno)); exit(1); } - memzero(addr); addr.sipx_type = NCP_PTYPE; - if (bind(data.ncp_fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) + if (bind(data.ncp_fd, (struct sockaddr *) &addr, sizeof(addr)) == -1) { fprintf(stderr, "\nbind: %s\n", strerror(errno)); @@ -427,25 +409,23 @@ main(int argc, char *argv[]) "and try again after waiting a minute.\n\n"); exit(1); } - addrlen = sizeof(addr); - if (getsockname(data.ncp_fd, (struct sockaddr *)&addr, &addrlen)==-1) + if (getsockname(data.ncp_fd, (struct sockaddr *) &addr, &addrlen) == -1) { perror("getsockname ncp socket"); - close(data.ncp_fd); close(data.wdog_fd); + close(data.ncp_fd); + close(data.wdog_fd); exit(1); } - addr.sipx_port = htons(ntohs(addr.sipx_port) + 1); - if (bind(data.wdog_fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) + if (bind(data.wdog_fd, (struct sockaddr *) &addr, sizeof(addr)) == -1) { fprintf(stderr, "bind(wdog_sock, ): %s\n", strerror(errno)); exit(1); } - #if NCP_MOUNT_VERSION>1 data.message_fd = socket(AF_IPX, SOCK_DGRAM, PF_IPX); @@ -455,16 +435,14 @@ main(int argc, char *argv[]) strerror(errno)); exit(1); } - addr.sipx_port = htons(ntohs(addr.sipx_port) + 1); - if (bind(data.message_fd, (struct sockaddr *)&addr,sizeof(addr)) == -1) + if (bind(data.message_fd, (struct sockaddr *) &addr, sizeof(addr)) == -1) { fprintf(stderr, "bind(message_sock, ): %s\n", strerror(errno)); exit(1); } - if (strlen(mount_point) < sizeof(data.mount_point)) { strcpy(data.mount_point, mount_point); @@ -477,26 +455,24 @@ main(int argc, char *argv[]) strcat(mount_name, "/"); strcat(mount_name, spec->user); - result = mount(mount_name, mount_point, "ncpfs", flags, (char *)&data); + result = mount(mount_name, mount_point, "ncpfs", flags, (char *) &data); if (result < 0) { printf("mount failed\n"); exit(1); } - if ((conn = ncp_open_mount(mount_point, &err)) == NULL) { com_err("ncpmount", err, "attempt to open mount point"); umount(mount_point); exit(1); } - if ((err = ncp_login_user(conn, spec->user, spec->password)) != 0) { struct nw_property p; struct ncp_prop_login_control *l - = (struct ncp_prop_login_control *)&p; + = (struct ncp_prop_login_control *) &p; if (conn->completion != NCP_GRACE_PERIOD) { @@ -506,7 +482,6 @@ main(int argc, char *argv[]) umount(mount_point); exit(1); } - fprintf(stderr, "Your password has expired\n"); if ((err = ncp_read_property_value(conn, NCP_BINDERY_USER, @@ -517,7 +492,6 @@ main(int argc, char *argv[]) l->GraceLogins); } } - if ((err = ioctl(conn->mount_fid, NCP_IOC_CONN_LOGGED_IN, NULL)) != 0) { com_err("ncpmount", err, "in logged_indication"); @@ -527,78 +501,76 @@ main(int argc, char *argv[]) } ncp_close(conn); - ment.mnt_fsname = mount_name; - ment.mnt_dir = mount_point; - ment.mnt_type = "ncpfs"; - ment.mnt_opts = "rw"; - ment.mnt_freq = 0; - ment.mnt_passno= 0; + ment.mnt_fsname = mount_name; + ment.mnt_dir = mount_point; + ment.mnt_type = "ncpfs"; + ment.mnt_opts = "rw"; + ment.mnt_freq = 0; + ment.mnt_passno = 0; - if ((fd = open(MOUNTED"~", O_RDWR|O_CREAT|O_EXCL, 0600)) == -1) - { - fprintf(stderr, "Can't get "MOUNTED"~ lock file"); - exit(1); - } - close(fd); - - if ((mtab = setmntent(MOUNTED, "a+")) == NULL) - { - fprintf(stderr, "Can't open " MOUNTED); - exit(1); - } + if ((fd = open(MOUNTED "~", O_RDWR | O_CREAT | O_EXCL, 0600)) == -1) + { + fprintf(stderr, "Can't get " MOUNTED "~ lock file"); + exit(1); + } + close(fd); - if (addmntent(mtab, &ment) == 1) - { - fprintf(stderr, "Can't write mount entry"); - exit(1); - } - if (fchmod(fileno(mtab), 0644) == -1) - { - fprintf(stderr, "Can't set perms on "MOUNTED); - exit(1); - } - endmntent(mtab); - - if (unlink(MOUNTED"~") == -1) - { - fprintf(stderr, "Can't remove "MOUNTED"~"); - exit(1); - } + if ((mtab = setmntent(MOUNTED, "a+")) == NULL) + { + fprintf(stderr, "Can't open " MOUNTED); + exit(1); + } + if (addmntent(mtab, &ment) == 1) + { + fprintf(stderr, "Can't write mount entry"); + exit(1); + } + if (fchmod(fileno(mtab), 0644) == -1) + { + fprintf(stderr, "Can't set perms on " MOUNTED); + exit(1); + } + endmntent(mtab); + if (unlink(MOUNTED "~") == -1) + { + fprintf(stderr, "Can't remove " MOUNTED "~"); + exit(1); + } return 0; -} +} static void usage(void) { printf("usage: %s [options] mount-point\n", progname); - printf("Try `%s -h' for more information\n", progname); + printf("Try `%s -h' for more information\n", progname); } static void help(void) { - printf("\n"); - printf("usage: %s [options] mount-point\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options] mount-point\n", progname); + printf("\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" + "-U username Username sent to server\n" "-V volume Volume to mount, for NFS re-export\n" - "-u uid uid the mounted files get\n" - "-g gid gid the mounted files get\n" - "-f mode permission the files get (octal notation)\n" - "-d mode permission the dirs get (octal notation)\n" + "-u uid uid the mounted files get\n" + "-g gid gid the mounted files get\n" + "-f mode permission the files get (octal notation)\n" + "-d mode permission the dirs get (octal notation)\n" "-c uid uid to identify the connection to mount on\n" " Only makes sense for root\n" "-t time_out Waiting time (in 1/100s) to wait for\n" " an answer from the server. Default: 60\n" "-r retry_count Number of retry attempts. Default: 5\n" - "-C Don't convert password to uppercase\n" - "-P password Use this password\n" - "-n Do not use any password\n" - " If neither -P nor -n are given, you are\n" - " asked for a password.\n" - "-h print this help text\n" + "-C Don't convert password to uppercase\n" + "-P password Use this password\n" + "-n Do not use any password\n" + " If neither -P nor -n are given, you are\n" + " asked for a password.\n" + "-h print this help text\n" "-v print ncpfs version number\n" - "\n"); + "\n"); } diff --git a/sutil/ncpumount.c b/sutil/ncpumount.c index 521776e..15a7e96 100644 --- a/sutil/ncpumount.c +++ b/sutil/ncpumount.c @@ -16,7 +16,7 @@ #include #include #include -/* #include */ /* generates a warning here */ + /* #include *//* generates a warning here */ extern pid_t waitpid(pid_t, int *, int); #include #include @@ -38,36 +38,36 @@ static char *progname; static void usage(void) { - printf("usage: %s mount-point\n", progname); + printf("usage: %s mount-point\n", progname); } static int umount_ok(const char *mount_point) { - int fid = open(mount_point, O_RDONLY, 0); - uid_t mount_uid; + int fid = open(mount_point, O_RDONLY, 0); + uid_t mount_uid; - if (fid == -1) { - fprintf(stderr, "Could not open %s: %s\n", - mount_point, strerror(errno)); - return -1; - } - - if (ioctl(fid, NCP_IOC_GETMOUNTUID, &mount_uid) != 0) { - fprintf(stderr, "%s probably not ncp-filesystem\n", - mount_point); - return -1; - } - - if ( (getuid() != 0) - && (mount_uid != getuid())) { - fprintf(stderr, "You are not allowed to umount %s\n", - mount_point); - return -1; - } - - close(fid); - return 0; + if (fid == -1) + { + fprintf(stderr, "Could not open %s: %s\n", + mount_point, strerror(errno)); + return -1; + } + if (ioctl(fid, NCP_IOC_GETMOUNTUID, &mount_uid) != 0) + { + fprintf(stderr, "%s probably not ncp-filesystem\n", + mount_point); + return -1; + } + if ((getuid() != 0) + && (mount_uid != getuid())) + { + fprintf(stderr, "You are not allowed to umount %s\n", + mount_point); + return -1; + } + close(fid); + return 0; } /* Make a canonical pathname from PATH. Returns a freshly malloced string. @@ -76,118 +76,117 @@ umount_ok(const char *mount_point) is not a legal pathname for ``/dev/fd0.'' Anything we cannot parse we return unmodified. */ char * -canonicalize (const char *path) +canonicalize(const char *path) { - char *canonical = malloc (PATH_MAX + 1); - - if (path == NULL) - return NULL; - - if (realpath (path, canonical)) - return canonical; + char *canonical = malloc(PATH_MAX + 1); - if (strlen(path) > PATH_MAX) - { - return NULL; - } + if (path == NULL) + return NULL; - strcpy (canonical, path); - return canonical; + if (realpath(path, canonical)) + return canonical; + + if (strlen(path) > PATH_MAX) + { + return NULL; + } + strcpy(canonical, path); + return canonical; } -int +int main(int argc, char *argv[]) { - int fd; + int fd; - char* mount_point; + char *mount_point; - struct mntent *mnt; - FILE* mtab; - FILE* new_mtab; + struct mntent *mnt; + FILE *mtab; + FILE *new_mtab; - progname = argv[0]; + progname = argv[0]; - if (geteuid() != 0) { - fprintf(stderr, "%s must be installed suid root\n", progname); - exit(1); - } - - if (argc != 2) { - usage(); - exit(1); - } - - mount_point = canonicalize(argv[1]); + if (geteuid() != 0) + { + fprintf(stderr, "%s must be installed suid root\n", progname); + exit(1); + } + if (argc != 2) + { + usage(); + exit(1); + } + mount_point = canonicalize(argv[1]); if (mount_point == NULL) { fprintf(stderr, "Invalid mount point: %s\n", argv[1]); exit(1); } - - if (umount_ok(mount_point) != 0) { + if (umount_ok(mount_point) != 0) + { fprintf(stderr, "You are not allowed to umount %s\n", mount_point); - exit(1); - } - - if (umount(mount_point) != 0) { - fprintf(stderr, "Could not umount %s: %s\n", - mount_point, strerror(errno)); - exit(1); - } - - if ((fd = open(MOUNTED"~", O_RDWR|O_CREAT|O_EXCL, 0600)) == -1) - { - fprintf(stderr, "Can't get "MOUNTED"~ lock file"); - return 1; - } - close(fd); - - if ((mtab = setmntent(MOUNTED, "r")) == NULL) { - fprintf(stderr, "Can't open " MOUNTED ": %s\n", - strerror(errno)); - return 1; - } + exit(1); + } + if (umount(mount_point) != 0) + { + fprintf(stderr, "Could not umount %s: %s\n", + mount_point, strerror(errno)); + exit(1); + } + if ((fd = open(MOUNTED "~", O_RDWR | O_CREAT | O_EXCL, 0600)) == -1) + { + fprintf(stderr, "Can't get " MOUNTED "~ lock file"); + return 1; + } + close(fd); + if ((mtab = setmntent(MOUNTED, "r")) == NULL) + { + fprintf(stderr, "Can't open " MOUNTED ": %s\n", + strerror(errno)); + return 1; + } #define MOUNTED_TMP MOUNTED".tmp" - if ((new_mtab = setmntent(MOUNTED_TMP, "w")) == NULL) { - fprintf(stderr, "Can't open " MOUNTED_TMP ": %s\n", - strerror(errno)); - endmntent(mtab); - return 1; - } + if ((new_mtab = setmntent(MOUNTED_TMP, "w")) == NULL) + { + fprintf(stderr, "Can't open " MOUNTED_TMP ": %s\n", + strerror(errno)); + endmntent(mtab); + return 1; + } + while ((mnt = getmntent(mtab)) != NULL) + { + if (strcmp(mnt->mnt_dir, mount_point) != 0) + { + addmntent(new_mtab, mnt); + } + } - while ((mnt = getmntent(mtab)) != NULL) { - if (strcmp(mnt->mnt_dir, mount_point) != 0) { - addmntent(new_mtab, mnt); - } - } + endmntent(mtab); - endmntent(mtab); - - if (fchmod (fileno (new_mtab), S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) < 0) { - fprintf(stderr, "Error changing mode of %s: %s\n", - MOUNTED_TMP, strerror(errno)); - exit(1); - } - - endmntent(new_mtab); - - if (rename(MOUNTED_TMP, MOUNTED) < 0) { - fprintf(stderr, "Cannot rename %s to %s: %s\n", - MOUNTED, MOUNTED_TMP, strerror(errno)); - exit(1); - } - - if (unlink(MOUNTED"~") == -1) - { - fprintf(stderr, "Can't remove "MOUNTED"~"); - return 1; - } + if (fchmod(fileno(new_mtab), S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) < 0) + { + fprintf(stderr, "Error changing mode of %s: %s\n", + MOUNTED_TMP, strerror(errno)); + exit(1); + } + endmntent(new_mtab); + if (rename(MOUNTED_TMP, MOUNTED) < 0) + { + fprintf(stderr, "Cannot rename %s to %s: %s\n", + MOUNTED, MOUNTED_TMP, strerror(errno)); + exit(1); + } + if (unlink(MOUNTED "~") == -1) + { + fprintf(stderr, "Can't remove " MOUNTED "~"); + return 1; + } return 0; -} +} diff --git a/sutil/nwcrypt.c b/sutil/nwcrypt.c index 4c028da..be33914 100644 --- a/sutil/nwcrypt.c +++ b/sutil/nwcrypt.c @@ -1,17 +1,17 @@ /*$********************************************************* -$* -$* This code has been taken from DDJ 11/93, from an -$* article by Pawel Szczerbina. -$* -$* Password encryption routines follow. -$* Converted to C from Barry Nance's Pascal -$* prog published in the March -93 issue of Byte. -$* -$* Adapted to be useable for ncpfs by -$* Volker Lendecke in -$* October 1995. -$* -$**********************************************************/ + $* + $* This code has been taken from DDJ 11/93, from an + $* article by Pawel Szczerbina. + $* + $* Password encryption routines follow. + $* Converted to C from Barry Nance's Pascal + $* prog published in the March -93 issue of Byte. + $* + $* Adapted to be useable for ncpfs by + $* Volker Lendecke in + $* October 1995. + $* + $********************************************************* */ /**************************************************************************** @@ -91,28 +91,28 @@ typedef unsigned char buf8[8]; typedef unsigned char buf4[4]; static unsigned char encrypttable[256] = -{0x7,0x8,0x0,0x8,0x6,0x4,0xE,0x4,0x5,0xC,0x1,0x7,0xB,0xF,0xA,0x8, - 0xF,0x8,0xC,0xC,0x9,0x4,0x1,0xE,0x4,0x6,0x2,0x4,0x0,0xA,0xB,0x9, - 0x2,0xF,0xB,0x1,0xD,0x2,0x1,0x9,0x5,0xE,0x7,0x0,0x0,0x2,0x6,0x6, - 0x0,0x7,0x3,0x8,0x2,0x9,0x3,0xF,0x7,0xF,0xC,0xF,0x6,0x4,0xA,0x0, - 0x2,0x3,0xA,0xB,0xD,0x8,0x3,0xA,0x1,0x7,0xC,0xF,0x1,0x8,0x9,0xD, - 0x9,0x1,0x9,0x4,0xE,0x4,0xC,0x5,0x5,0xC,0x8,0xB,0x2,0x3,0x9,0xE, - 0x7,0x7,0x6,0x9,0xE,0xF,0xC,0x8,0xD,0x1,0xA,0x6,0xE,0xD,0x0,0x7, - 0x7,0xA,0x0,0x1,0xF,0x5,0x4,0xB,0x7,0xB,0xE,0xC,0x9,0x5,0xD,0x1, - 0xB,0xD,0x1,0x3,0x5,0xD,0xE,0x6,0x3,0x0,0xB,0xB,0xF,0x3,0x6,0x4, - 0x9,0xD,0xA,0x3,0x1,0x4,0x9,0x4,0x8,0x3,0xB,0xE,0x5,0x0,0x5,0x2, - 0xC,0xB,0xD,0x5,0xD,0x5,0xD,0x2,0xD,0x9,0xA,0xC,0xA,0x0,0xB,0x3, - 0x5,0x3,0x6,0x9,0x5,0x1,0xE,0xE,0x0,0xE,0x8,0x2,0xD,0x2,0x2,0x0, - 0x4,0xF,0x8,0x5,0x9,0x6,0x8,0x6,0xB,0xA,0xB,0xF,0x0,0x7,0x2,0x8, - 0xC,0x7,0x3,0xA,0x1,0x4,0x2,0x5,0xF,0x7,0xA,0xC,0xE,0x5,0x9,0x3, - 0xE,0x7,0x1,0x2,0xE,0x1,0xF,0x4,0xA,0x6,0xC,0x6,0xF,0x4,0x3,0x0, - 0xC,0x0,0x3,0x6,0xF,0x8,0x7,0xB,0x2,0xD,0xC,0x6,0xA,0xA,0x8,0xD}; +{0x7, 0x8, 0x0, 0x8, 0x6, 0x4, 0xE, 0x4, 0x5, 0xC, 0x1, 0x7, 0xB, 0xF, 0xA, 0x8, +0xF, 0x8, 0xC, 0xC, 0x9, 0x4, 0x1, 0xE, 0x4, 0x6, 0x2, 0x4, 0x0, 0xA, 0xB, 0x9, +0x2, 0xF, 0xB, 0x1, 0xD, 0x2, 0x1, 0x9, 0x5, 0xE, 0x7, 0x0, 0x0, 0x2, 0x6, 0x6, +0x0, 0x7, 0x3, 0x8, 0x2, 0x9, 0x3, 0xF, 0x7, 0xF, 0xC, 0xF, 0x6, 0x4, 0xA, 0x0, +0x2, 0x3, 0xA, 0xB, 0xD, 0x8, 0x3, 0xA, 0x1, 0x7, 0xC, 0xF, 0x1, 0x8, 0x9, 0xD, +0x9, 0x1, 0x9, 0x4, 0xE, 0x4, 0xC, 0x5, 0x5, 0xC, 0x8, 0xB, 0x2, 0x3, 0x9, 0xE, +0x7, 0x7, 0x6, 0x9, 0xE, 0xF, 0xC, 0x8, 0xD, 0x1, 0xA, 0x6, 0xE, 0xD, 0x0, 0x7, +0x7, 0xA, 0x0, 0x1, 0xF, 0x5, 0x4, 0xB, 0x7, 0xB, 0xE, 0xC, 0x9, 0x5, 0xD, 0x1, +0xB, 0xD, 0x1, 0x3, 0x5, 0xD, 0xE, 0x6, 0x3, 0x0, 0xB, 0xB, 0xF, 0x3, 0x6, 0x4, +0x9, 0xD, 0xA, 0x3, 0x1, 0x4, 0x9, 0x4, 0x8, 0x3, 0xB, 0xE, 0x5, 0x0, 0x5, 0x2, +0xC, 0xB, 0xD, 0x5, 0xD, 0x5, 0xD, 0x2, 0xD, 0x9, 0xA, 0xC, 0xA, 0x0, 0xB, 0x3, +0x5, 0x3, 0x6, 0x9, 0x5, 0x1, 0xE, 0xE, 0x0, 0xE, 0x8, 0x2, 0xD, 0x2, 0x2, 0x0, +0x4, 0xF, 0x8, 0x5, 0x9, 0x6, 0x8, 0x6, 0xB, 0xA, 0xB, 0xF, 0x0, 0x7, 0x2, 0x8, +0xC, 0x7, 0x3, 0xA, 0x1, 0x4, 0x2, 0x5, 0xF, 0x7, 0xA, 0xC, 0xE, 0x5, 0x9, 0x3, +0xE, 0x7, 0x1, 0x2, 0xE, 0x1, 0xF, 0x4, 0xA, 0x6, 0xC, 0x6, 0xF, 0x4, 0x3, 0x0, + 0xC, 0x0, 0x3, 0x6, 0xF, 0x8, 0x7, 0xB, 0x2, 0xD, 0xC, 0x6, 0xA, 0xA, 0x8, 0xD}; -static buf32 encryptkeys = -{0x48,0x93,0x46,0x67,0x98,0x3D,0xE6,0x8D, - 0xB7,0x10,0x7A,0x26,0x5A,0xB9,0xB1,0x35, - 0x6B,0x0F,0xD5,0x70,0xAE,0xFB,0xAD,0x11, - 0xF4,0x47,0xDC,0xA7,0xEC,0xCF,0x50,0xC0}; +static buf32 encryptkeys = +{0x48, 0x93, 0x46, 0x67, 0x98, 0x3D, 0xE6, 0x8D, + 0xB7, 0x10, 0x7A, 0x26, 0x5A, 0xB9, 0xB1, 0x35, + 0x6B, 0x0F, 0xD5, 0x70, 0xAE, 0xFB, 0xAD, 0x11, + 0xF4, 0x47, 0xDC, 0xA7, 0xEC, 0xCF, 0x50, 0xC0}; static void @@ -128,15 +128,16 @@ shuffle1(buf32 temp, unsigned char *target) { for (s = 0; s <= 31; ++s) { - b3 = (temp[s]+b4) ^ (temp[(s+b4)&31] - encryptkeys[s]); + b3 = (temp[s] + b4) ^ (temp[(s + b4) & 31] - encryptkeys[s]); b4 = b4 + b3; temp[s] = b3; } } - for (i = 0; i <= 15; ++i) { - target[i] = encrypttable[temp[ 2*i ]] - | (encrypttable[temp[ 2*i + 1]] << 4); + for (i = 0; i <= 15; ++i) + { + target[i] = encrypttable[temp[2 * i]] + | (encrypttable[temp[2 * i + 1]] << 4); } } @@ -148,12 +149,14 @@ shuffle(const unsigned char *lon, const unsigned char *buf, int buflen, int b2, d, s; buf32 temp; - while ( (buflen > 0) - && (buf[buflen - 1] == 0)) { + while ((buflen > 0) + && (buf[buflen - 1] == 0)) + { buflen = buflen - 1; } - for (s = 0; s < 32; s++) { + for (s = 0; s < 32; s++) + { temp[s] = 0; } @@ -176,17 +179,17 @@ shuffle(const unsigned char *lon, const unsigned char *buf, int buflen, { b2 = d; temp[s] = temp[s] ^ encryptkeys[s]; - } else { + } else + { temp[s] = temp[s] ^ buf[b2]; b2 = b2 + 1; } } } - for (s = 0; s <= 31; ++s) temp[s] = temp[s] ^ lon[s & 3]; - shuffle1(temp,target); + shuffle1(temp, target); } @@ -198,7 +201,7 @@ nw_encrypt(const unsigned char *fra, buf32 k; int s; - shuffle(&(fra[0]), buf, 16, &(k[ 0])); + shuffle(&(fra[0]), buf, 16, &(k[0])); shuffle(&(fra[4]), buf, 16, &(k[16])); for (s = 0; s <= 15; ++s) diff --git a/sutil/nwsfind.c b/sutil/nwsfind.c index 2220337..62086cd 100644 --- a/sutil/nwsfind.c +++ b/sutil/nwsfind.c @@ -25,16 +25,16 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [server]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [server]\n", progname); + printf("\n" "-t Server type, default: File server\n" "-h Print this help text\n" "\n"); } static void -swallow_error(const char * name, long code, const char *format, va_list arg) +swallow_error(const char *name, long code, const char *format, va_list arg) { printf("%s ", error_message(code)); vfprintf(stdout, format, arg); @@ -58,7 +58,8 @@ main(int argc, char *argv[]) while ((opt = getopt(argc, argv, "t:")) != EOF) { - switch(opt) { + switch (opt) + { case 't': object_type = atoi(optarg); break; @@ -72,13 +73,12 @@ main(int argc, char *argv[]) } } - if (optind < argc-1) + if (optind < argc - 1) { usage(); exit(1); } - - if (optind == argc-1) + if (optind == argc - 1) { server = argv[optind]; if (strlen(server) >= NCP_BINDERY_NAME_LEN) @@ -86,8 +86,7 @@ main(int argc, char *argv[]) com_err(argv[0], ENAMETOOLONG, "server name too long"); exit(1); } - } - + } result = ncp_find_server(&server, object_type, &err); if (result == NULL) @@ -95,7 +94,6 @@ main(int argc, char *argv[]) com_err(argv[0], err, "when trying to find server"); exit(1); } - ipx_print_saddr(result); printf(" %s\n", server); return 0; diff --git a/util/Makefile b/util/Makefile index 1ef9936..c73f6b7 100644 --- a/util/Makefile +++ b/util/Makefile @@ -6,7 +6,7 @@ USERUTILS = slist pqlist nwfsinfo pserver nprint nsend ncopy nwpasswd USERUTILS += nwbols nwbocreate nwborm nwboprops USERUTILS += nwbpcreate nwbprm nwbpvalues nwbpadd nwbpset USERUTILS += nwgrant nwrevoke nwuserlist nwrights nwauth -USERUTILS += nwfstime +USERUTILS += nwfstime nwvolinfo SBINUTILS = nwmsg UTILS = $(USERUTILS) $(SBINUTILS) ncptest diff --git a/util/ncopy.c b/util/ncopy.c index 918c36d..b59b0f6 100644 --- a/util/ncopy.c +++ b/util/ncopy.c @@ -27,9 +27,9 @@ struct NCPMountRec { - char *mountDir; - char *server; - struct ncp_conn *conn; + char *mountDir; + char *server; + struct ncp_conn *conn; }; /**************************************************************************** @@ -37,30 +37,30 @@ struct NCPMountRec * */ const char *VersionStr = "0.1"; -char * ProgramName; +char *ProgramName; struct NCPMountRec *NcpMountTable = NULL; int ncpCount = 0; /* (initialized) command options */ -int optVersion=0; /* -V TRUE if just want version */ -int optVerbose=0; /* -v TRUE if want verbose output */ -int optNice=0; /* -n TRUE if we are cooperative (nice) */ -int optNiceFactorSel=0; /* -s TRUE if we selected a nice factor */ -int optNiceFactor=10; /* -s arg, number of 100K blocks to copy - before sleeping for a second */ -__u32 CopyBlockSize = 100000; /* Size of the default block copy size */ -unsigned int NiceSleepTime=1; /* Number of seconds to sleep in Nice Mode */ +int optVersion = 0; /* -V TRUE if just want version */ +int optVerbose = 0; /* -v TRUE if want verbose output */ +int optNice = 0; /* -n TRUE if we are cooperative (nice) */ +int optNiceFactorSel = 0; /* -s TRUE if we selected a nice factor */ +int optNiceFactor = 10; /* -s arg, number of 100K blocks to copy + before sleeping for a second */ +__u32 CopyBlockSize = 100000; /* Size of the default block copy size */ +unsigned int NiceSleepTime = 1; /* Number of seconds to sleep in Nice Mode */ -int BlocksCopied=0; /* Number of blocks copied */ -int MaxNcopyRetries=25; /* Maximum number of times to retry a failed - copy before giving up */ +int BlocksCopied = 0; /* Number of blocks copied */ +int MaxNcopyRetries = 25; /* Maximum number of times to retry a failed + copy before giving up */ /* Globals needed for signal handlers */ -int OutputOpen=0; /* True if the ncp output file is open */ -struct ncp_conn *CurrentConn = NULL; /* Connection of output file */ -struct ncp_file_info *CurrentFile = NULL; /* File info of output file */ +int OutputOpen = 0; /* True if the ncp output file is open */ +struct ncp_conn *CurrentConn = NULL; /* Connection of output file */ +struct ncp_file_info *CurrentFile = NULL; /* File info of output file */ /* Signal control structures */ static struct sigaction sHangupSig; @@ -71,11 +71,12 @@ static struct sigaction sTermSig; /**************************************************************************** * */ -static void usage() +static void +usage() { - fprintf(stderr,"usage: %s [-V]\n", ProgramName); - fprintf(stderr," %s [-vn] [-s amt] sourcefile destinationfile|directory\n", ProgramName); - fprintf(stderr," %s [-vn] [-s amt] sourcefile [...] directory\n", ProgramName); + fprintf(stderr, "usage: %s [-V]\n", ProgramName); + fprintf(stderr, " %s [-vn] [-s amt] sourcefile destinationfile|directory\n", ProgramName); + fprintf(stderr, " %s [-vn] [-s amt] sourcefile [...] directory\n", ProgramName); } /**************************************************************************** @@ -84,165 +85,193 @@ static void usage() * ("/" returns pointer to "/", null returns pointer to null) * Return pointer to original string if no "/" in string. (except at end) */ -static const char *myBaseName(const char *path) +static const char * +myBaseName(const char *path) { - const char *p; + const char *p; - for(p = &path[strlen(path)]; p != path; p--) { /* skip ENDING "/" chars */ - if(*p && *p != '/') break; - } - if(p==path) return p; - for( ; p != path || *p == '/'; p--) { - if(*p == '/') return ++p; - } - return p; + for (p = &path[strlen(path)]; p != path; p--) + { /* skip ENDING "/" chars */ + if (*p && *p != '/') + break; + } + if (p == path) + return p; + for (; p != path || *p == '/'; p--) + { + if (*p == '/') + return ++p; + } + return p; } /**************************************************************************** * */ -static const char *notDir(const char *path) +static const char * +notDir(const char *path) { - struct stat buf; - static const char *notDirectory="not a directory"; + struct stat buf; + static const char *notDirectory = "not a directory"; - if(stat(path, &buf)) return strerror(errno); /* no permission? not exist? */ - if(!S_ISDIR(buf.st_mode)) return notDirectory; /* not a directory */ - return (char *) 0; /* OK */ + if (stat(path, &buf)) + return strerror(errno); /* no permission? not exist? */ + if (!S_ISDIR(buf.st_mode)) + return notDirectory; /* not a directory */ + return (char *) 0; /* OK */ } /**************************************************************************** * */ -static int handleOptions(const int argc, char * const argv[]) +static int +handleOptions(const int argc, char *const argv[]) { - int opt; + int opt; - while ((opt = getopt(argc, argv, "vVns:")) != EOF) - { - switch (opt) { + while ((opt = getopt(argc, argv, "vVns:")) != EOF) + { + switch (opt) + { - case 'V': /* Version */ - optVersion=1; - break; + case 'V': /* Version */ + optVersion = 1; + break; - case 'v': /* Verbose output */ - optVerbose=1; - break; + case 'v': /* Verbose output */ + optVerbose = 1; + break; - case 'n': /* Nice, cooperative copy */ - optNice=1; - break; + case 'n': /* Nice, cooperative copy */ + optNice = 1; + break; - case 's': /* Nice Factor */ - optNiceFactorSel=1; - optNiceFactor=atoi(optarg); - if (optNiceFactor < 1) { - fprintf(stderr,"%s: -s option requires positive numeric argument > 0\n", - ProgramName); - return 1; - } - break; + case 's': /* Nice Factor */ + optNiceFactorSel = 1; + optNiceFactor = atoi(optarg); + if (optNiceFactor < 1) + { + fprintf(stderr, "%s: -s option requires positive numeric argument > 0\n", + ProgramName); + return 1; + } + break; - default: /* invalid options or options without required arguments */ - return 1; - } - continue; - } - return 0; + default: /* invalid options or options without required arguments */ + return 1; + } + continue; + } + return 0; } /**************************************************************************** * TODO: if recursive flag last MUST be a directory, even if only 2 args. */ -static int validateFileArgs(const int argc, char * const argv[]) +static int +validateFileArgs(const int argc, char *const argv[]) { - const char *p; - if (argc == 0) { - fprintf(stderr,"%s: No arguments specified.\n", ProgramName); - return 1; - } - if(argc == 1) { - fprintf(stderr,"%s: No destination specified.\n", ProgramName); - return 1; - } - if((argc > 2) && (p=notDir(argv[argc-1]))) { /* last arg MUST be dir */ - fprintf(stderr,"%s: %s: %s\n", ProgramName, argv[argc-1], p); - return 1; - } - return 0; + const char *p; + if (argc == 0) + { + fprintf(stderr, "%s: No arguments specified.\n", ProgramName); + return 1; + } + if (argc == 1) + { + fprintf(stderr, "%s: No destination specified.\n", ProgramName); + return 1; + } + if ((argc > 2) && (p = notDir(argv[argc - 1]))) + { /* last arg MUST be dir */ + fprintf(stderr, "%s: %s: %s\n", ProgramName, argv[argc - 1], p); + return 1; + } + return 0; } /**************************************************************************** * Duplicate a string. */ -char *duplicateStr(const char *InStr) +char * +duplicateStr(const char *InStr) { - char *dup; - if (!InStr) return NULL; - dup = (char*)malloc(strlen(InStr)+1); - if (dup) - strcpy(dup,InStr); - return dup; + char *dup; + if (!InStr) + return NULL; + dup = (char *) malloc(strlen(InStr) + 1); + if (dup) + strcpy(dup, InStr); + return dup; } /**************************************************************************** * load a table of ncpfs mount points. */ -int loadMountTable() +int +loadMountTable() { - FILE *mountedFile; - struct mntent *mountEntry = NULL; - ncpCount = 0; - if ( (mountedFile = fopen(MOUNTED,"r")) == NULL) { - fprintf(stderr,"ncopy: cannot open %s, %s\n",MOUNTED,strerror(errno)); - return 1; - } - - while ( (mountEntry = getmntent(mountedFile)) != NULL) { - if (!strcmp(mountEntry->mnt_type,"ncpfs")) - ncpCount++; - } - if (ncpCount) { - NcpMountTable = (struct NCPMountRec*) - malloc(ncpCount * sizeof(struct NCPMountRec)); - if (!NcpMountTable) { - fprintf(stderr,"Out of memory\n"); - fclose(mountedFile); - return 1; - } - fseek(mountedFile,0,SEEK_SET); - ncpCount = 0; - while ( (mountEntry = getmntent(mountedFile)) != NULL) { - if (!strcmp(mountEntry->mnt_type,"ncpfs")) { - NcpMountTable[ncpCount].mountDir = duplicateStr(mountEntry->mnt_dir); - NcpMountTable[ncpCount].server = - duplicateStr(mountEntry->mnt_fsname); - NcpMountTable[ncpCount].conn = NULL; - ncpCount++; - } - } - } - fclose(mountedFile); - return 0; + FILE *mountedFile; + struct mntent *mountEntry = NULL; + ncpCount = 0; + if ((mountedFile = fopen(MOUNTED, "r")) == NULL) + { + fprintf(stderr, "ncopy: cannot open %s, %s\n", MOUNTED, strerror(errno)); + return 1; + } + while ((mountEntry = getmntent(mountedFile)) != NULL) + { + if (!strcmp(mountEntry->mnt_type, "ncpfs")) + ncpCount++; + } + if (ncpCount) + { + NcpMountTable = (struct NCPMountRec *) + malloc(ncpCount * sizeof(struct NCPMountRec)); + if (!NcpMountTable) + { + fprintf(stderr, "Out of memory\n"); + fclose(mountedFile); + return 1; + } + fseek(mountedFile, 0, SEEK_SET); + ncpCount = 0; + while ((mountEntry = getmntent(mountedFile)) != NULL) + { + if (!strcmp(mountEntry->mnt_type, "ncpfs")) + { + NcpMountTable[ncpCount].mountDir = duplicateStr(mountEntry->mnt_dir); + NcpMountTable[ncpCount].server = + duplicateStr(mountEntry->mnt_fsname); + NcpMountTable[ncpCount].conn = NULL; + ncpCount++; + } + } + } + fclose(mountedFile); + return 0; } /**************************************************************************** * Releases the table of ncpfs mount points. */ -void releaseMountTable() +void +releaseMountTable() { - int loop; - if (!ncpCount) return; - for (loop = ncpCount; loop; loop--,ncpCount--) { - if (NcpMountTable[loop-1].conn) { - ncp_close(NcpMountTable[loop-1].conn); - NcpMountTable[loop-1].conn = NULL; - } - free(NcpMountTable[loop-1].server); - free(NcpMountTable[loop-1].mountDir); - } - free(NcpMountTable); + int loop; + if (!ncpCount) + return; + for (loop = ncpCount; loop; loop--, ncpCount--) + { + if (NcpMountTable[loop - 1].conn) + { + ncp_close(NcpMountTable[loop - 1].conn); + NcpMountTable[loop - 1].conn = NULL; + } + free(NcpMountTable[loop - 1].server); + free(NcpMountTable[loop - 1].mountDir); + } + free(NcpMountTable); } /**************************************************************************** @@ -250,18 +279,22 @@ void releaseMountTable() * the file. * Returns -1 if the files do not reference the same server. */ -int ncpIndex(const char *InputFile, const char *OutputFile) +int +ncpIndex(const char *InputFile, const char *OutputFile) { - int loop; - char *mountDir; - if (!ncpCount) return -1; - - for (loop = 0; loop < ncpCount; loop++) { - mountDir = NcpMountTable[loop].mountDir; - if (!strncmp(mountDir,InputFile,strlen(mountDir)) && - !strncmp(mountDir,OutputFile,strlen(mountDir))) return loop; - } - return -1; + int loop; + char *mountDir; + if (!ncpCount) + return -1; + + for (loop = 0; loop < ncpCount; loop++) + { + mountDir = NcpMountTable[loop].mountDir; + if (!strncmp(mountDir, InputFile, strlen(mountDir)) && + !strncmp(mountDir, OutputFile, strlen(mountDir))) + return loop; + } + return -1; } @@ -269,117 +302,133 @@ int ncpIndex(const char *InputFile, const char *OutputFile) * Does a regular buffered file copy. * This is used if we cannot use the Netware file copy. */ -int normalFileCopy(const char *InputFile, const char *OutputFile, - char *Buffer,int BufferSize, - const char *paramInputFile, - const char *paramOutputFile) +int +normalFileCopy(const char *InputFile, const char *OutputFile, + char *Buffer, int BufferSize, + const char *paramInputFile, + const char *paramOutputFile) { - int fdIn, fdOut; - long fileSize,totalSize; - struct stat statBuf; - fdIn = open(InputFile,O_RDONLY); - if (fdIn == -1) { - fprintf(stderr,"%s: Cannot open %s, %s\n",ProgramName,paramInputFile, - strerror(errno)); - return 1; - } - if (fstat(fdIn,&statBuf)) { - fprintf(stderr,"%s: Cannot stat %s, %s\n",ProgramName,paramInputFile, - strerror(errno)); - close(fdIn); - return 1; - } - if(S_ISDIR(statBuf.st_mode)) { - close(fdIn); - fprintf(stderr,"%s: %s: omitting directory\n",ProgramName,paramInputFile); - return 0; /* At this point, don't consider this a fatal error */ - } - - fdOut = open(OutputFile,O_CREAT | O_TRUNC | O_WRONLY,statBuf.st_mode); - if (fdOut == -1) { - fprintf(stderr,"%s: Cannot create %s, %s\n",ProgramName,paramOutputFile, - strerror(errno)); - close(fdIn); - return 1; - } - fileSize = lseek(fdIn,0,SEEK_END); - if (fileSize < 0) { - fprintf(stderr,"%s: lseek error on %s, %s\n",ProgramName,paramInputFile, - strerror(errno)); - close(fdOut); - close(fdIn); - return 1; - } - lseek(fdIn,0,SEEK_SET); - if (optVerbose) { - printf("Normal copy: %s -> %s 0%%",paramInputFile,paramOutputFile); - fflush(stdout); - } - totalSize = fileSize; - while (fileSize) { - int currentMove; - int writeAmt; - currentMove = (fileSize > BufferSize) ? BufferSize : fileSize; - if (read(fdIn,Buffer,currentMove) != currentMove) { - fprintf(stderr,"%s: Error reading %s, %s\n",ProgramName,paramInputFile, - strerror(errno)); - close(fdIn); - close(fdOut); - return 1; - } - writeAmt = write(fdOut,Buffer,currentMove); - if (writeAmt < 0) { - fprintf(stderr,"%s: Error writing %s, %s\n",ProgramName,paramOutputFile, - strerror(errno)); - close(fdIn); - close(fdOut); - return 1; - } else if (writeAmt == 0) { - fprintf(stderr,"%s: Out of space on destination device writing %s\n", - ProgramName,OutputFile); - close(fdIn); - close(fdOut); - return 1; - } - fileSize -= currentMove; - if (optVerbose) { - printf("\rNormal copy: %s -> %s %ld%%",paramInputFile,paramOutputFile,(100 - (fileSize * 100/totalSize))); - fflush(stdout); - } - } - close(fdOut); - close(fdIn); - if (optVerbose) - printf("\n"); - return 0; + int fdIn, fdOut; + long fileSize, totalSize; + struct stat statBuf; + fdIn = open(InputFile, O_RDONLY); + if (fdIn == -1) + { + fprintf(stderr, "%s: Cannot open %s, %s\n", ProgramName, paramInputFile, + strerror(errno)); + return 1; + } + if (fstat(fdIn, &statBuf)) + { + fprintf(stderr, "%s: Cannot stat %s, %s\n", ProgramName, paramInputFile, + strerror(errno)); + close(fdIn); + return 1; + } + if (S_ISDIR(statBuf.st_mode)) + { + close(fdIn); + fprintf(stderr, "%s: %s: omitting directory\n", ProgramName, paramInputFile); + return 0; /* At this point, don't consider this a fatal error */ + } + fdOut = open(OutputFile, O_CREAT | O_TRUNC | O_WRONLY, statBuf.st_mode); + if (fdOut == -1) + { + fprintf(stderr, "%s: Cannot create %s, %s\n", ProgramName, paramOutputFile, + strerror(errno)); + close(fdIn); + return 1; + } + fileSize = lseek(fdIn, 0, SEEK_END); + if (fileSize < 0) + { + fprintf(stderr, "%s: lseek error on %s, %s\n", ProgramName, paramInputFile, + strerror(errno)); + close(fdOut); + close(fdIn); + return 1; + } + lseek(fdIn, 0, SEEK_SET); + if (optVerbose) + { + printf("Normal copy: %s -> %s 0%%", paramInputFile, paramOutputFile); + fflush(stdout); + } + totalSize = fileSize; + while (fileSize) + { + int currentMove; + int writeAmt; + currentMove = (fileSize > BufferSize) ? BufferSize : fileSize; + if (read(fdIn, Buffer, currentMove) != currentMove) + { + fprintf(stderr, "%s: Error reading %s, %s\n", ProgramName, paramInputFile, + strerror(errno)); + close(fdIn); + close(fdOut); + return 1; + } + writeAmt = write(fdOut, Buffer, currentMove); + if (writeAmt < 0) + { + fprintf(stderr, "%s: Error writing %s, %s\n", ProgramName, paramOutputFile, + strerror(errno)); + close(fdIn); + close(fdOut); + return 1; + } else if (writeAmt == 0) + { + fprintf(stderr, "%s: Out of space on destination device writing %s\n", + ProgramName, OutputFile); + close(fdIn); + close(fdOut); + return 1; + } + fileSize -= currentMove; + if (optVerbose) + { + printf("\rNormal copy: %s -> %s %ld%%", paramInputFile, paramOutputFile, (100 - (fileSize * 100 / totalSize))); + fflush(stdout); + } + } + close(fdOut); + close(fdIn); + if (optVerbose) + printf("\n"); + return 0; } /**************************************************************************** * Converts a string to upper case. * Netware file names need to be all upper case. */ -char *upString(char *str) +char * +upString(char *str) { - char *alias = str; - while (*alias) { - *alias = toupper(*alias); - ++alias; - } - return str; + char *alias = str; + while (*alias) + { + *alias = toupper(*alias); + ++alias; + } + return str; } /**************************************************************************** * Locates the first occurrance of a single character in the input string. * returns -1 if the character is not found. */ -int stringPosition(const char *str,char token) +int +stringPosition(const char *str, char token) { - const char *alias = str; - while (*alias) { - if (*alias == token) return alias - str; - alias++; - } - return -1; + const char *alias = str; + while (*alias) + { + if (*alias == token) + return alias - str; + alias++; + } + return -1; } /**************************************************************************** @@ -388,221 +437,238 @@ int stringPosition(const char *str,char token) * This will mangle the input "FileString", leaving just the file name * component in it when it is finished. */ -int getDirHandle(struct ncp_conn *conn, char *FileString, __u8 *NewDirHandle) +int +getDirHandle(struct ncp_conn *conn, char *FileString, __u8 * NewDirHandle) { - struct nw_info_struct info1,info2; - int currentLevel = 0; - int k; - struct nw_info_struct *parentInfo = NULL; - struct nw_info_struct *currentInfo = NULL; + struct nw_info_struct info1, info2; + int currentLevel = 0; + int k; + struct nw_info_struct *parentInfo = NULL; + struct nw_info_struct *currentInfo = NULL; - while ( (k = stringPosition(FileString,'/')) >= 0) { - FileString[k] = 0; - if (!currentLevel) { - parentInfo = NULL; - currentInfo = &info1; - } else if (currentLevel % 2) { - parentInfo = &info1; - currentInfo = &info2; - } else { - parentInfo = &info2; - currentInfo = &info1; - } - if (ncp_do_lookup(conn, parentInfo, FileString, - currentInfo) != 0) { - fprintf(stderr,"%s: Ncp lookup failed on directory %s--%s\n", - ProgramName,FileString,strerror(errno)); - return 1; - } - ++currentLevel; - memmove(FileString,FileString+k+1,strlen(FileString+k+1)+1); - } - - if (ncp_alloc_short_dir_handle(conn, currentInfo, NCP_ALLOC_TEMPORARY, - NewDirHandle) != 0) { - fprintf(stderr,"%s: Ncp alloc dir handle failed--%s\n", - ProgramName,strerror(errno)); - return 1; - } - return 0; + while ((k = stringPosition(FileString, '/')) >= 0) + { + FileString[k] = 0; + if (!currentLevel) + { + parentInfo = NULL; + currentInfo = &info1; + } else if (currentLevel % 2) + { + parentInfo = &info1; + currentInfo = &info2; + } else + { + parentInfo = &info2; + currentInfo = &info1; + } + if (ncp_do_lookup(conn, parentInfo, FileString, + currentInfo) != 0) + { + fprintf(stderr, "%s: Ncp lookup failed on directory %s--%s\n", + ProgramName, FileString, strerror(errno)); + return 1; + } + ++currentLevel; + memmove(FileString, FileString + k + 1, strlen(FileString + k + 1) + 1); + } + + if (ncp_alloc_short_dir_handle(conn, currentInfo, NCP_ALLOC_TEMPORARY, + NewDirHandle) != 0) + { + fprintf(stderr, "%s: Ncp alloc dir handle failed--%s\n", + ProgramName, strerror(errno)); + return 1; + } + return 0; } /**************************************************************************** * Interfaces with the ncplib to do the netware copy of the file. */ -int netwareCopyFile(int ncpMountIndex, const char *sourcefile, - const char *destfile, - const char *paramInputFile, - const char *paramOutputFile) +int +netwareCopyFile(int ncpMountIndex, const char *sourcefile, + const char *destfile, + const char *paramInputFile, + const char *paramOutputFile) { - __u8 source_dir_handle; - __u8 dest_dir_handle; - struct ncp_file_info source_file; - struct ncp_file_info dest_file; - __u32 amountCopied; - __u32 amtLeft; - __u32 totalSize; - __u32 sourceOff; - __u32 thisMove; - int stroffset; - int retValue; - char *sourceDup; - char *destDup; - struct ncp_conn *sourceconn; - int retryCount; - long err = 0; + __u8 source_dir_handle; + __u8 dest_dir_handle; + struct ncp_file_info source_file; + struct ncp_file_info dest_file; + __u32 amountCopied; + __u32 amtLeft; + __u32 totalSize; + __u32 sourceOff; + __u32 thisMove; + int stroffset; + int retValue; + char *sourceDup; + char *destDup; + struct ncp_conn *sourceconn; + int retryCount; + long err = 0; - /* Establish a connection to a Netware mount point if - one is not already established. */ - if (!NcpMountTable[ncpMountIndex].conn) { - NcpMountTable[ncpMountIndex].conn = - ncp_open_mount(NcpMountTable[ncpMountIndex].mountDir,&err); - if (err) { - com_err(ProgramName,err,"opening ncp connection on mount point %s", - NcpMountTable[ncpMountIndex].mountDir); - return 2; - } - } - sourceconn = NcpMountTable[ncpMountIndex].conn; - - /* Duplicate and upper case the file names so we do not trample - on the input strings */ - stroffset = strlen(NcpMountTable[ncpMountIndex].mountDir) + 1; - sourceDup = duplicateStr(sourcefile+stroffset); - destDup = duplicateStr(destfile+stroffset); - if (!sourceDup || !destDup) { - fprintf(stderr,"%s: Malloc failed duplicating file names\n", - ProgramName); - return 2; - } + /* Establish a connection to a Netware mount point if + one is not already established. */ + if (!NcpMountTable[ncpMountIndex].conn) + { + NcpMountTable[ncpMountIndex].conn = + ncp_open_mount(NcpMountTable[ncpMountIndex].mountDir, &err); + if (err) + { + com_err(ProgramName, err, "opening ncp connection on mount point %s", + NcpMountTable[ncpMountIndex].mountDir); + return 2; + } + } + sourceconn = NcpMountTable[ncpMountIndex].conn; - upString(sourceDup); - upString(destDup); + /* Duplicate and upper case the file names so we do not trample + on the input strings */ + stroffset = strlen(NcpMountTable[ncpMountIndex].mountDir) + 1; + sourceDup = duplicateStr(sourcefile + stroffset); + destDup = duplicateStr(destfile + stroffset); + if (!sourceDup || !destDup) + { + fprintf(stderr, "%s: Malloc failed duplicating file names\n", + ProgramName); + return 2; + } + upString(sourceDup); + upString(destDup); - /* Get Handles to the input and output directories */ - if (getDirHandle(sourceconn,sourceDup,&source_dir_handle) || - getDirHandle(sourceconn,destDup,&dest_dir_handle)) { - free(sourceDup); - free(destDup); - return 1; - } + /* Get Handles to the input and output directories */ + if (getDirHandle(sourceconn, sourceDup, &source_dir_handle) || + getDirHandle(sourceconn, destDup, &dest_dir_handle)) + { + free(sourceDup); + free(destDup); + return 1; + } + /* Open the input and output files. */ + if (ncp_open_file(sourceconn, source_dir_handle, sourceDup, 0, AR_READ, + &source_file) != 0) + { + fprintf(stderr, "%s: Cannot open %s--%s\n", + ProgramName, paramInputFile, strerror(errno)); + free(sourceDup); + free(destDup); + return 1; + } + if (ncp_create_file(sourceconn, dest_dir_handle, destDup, + source_file.file_attributes, &dest_file) != 0) + { + fprintf(stderr, "%s: Cannot create %s--%s\n", ProgramName, paramOutputFile, + strerror(errno)); + ncp_close_file(sourceconn, source_file.file_id); + free(sourceDup); + free(destDup); + return 1; + } + /* Set globals in case a signal happens while copying */ + CurrentConn = sourceconn; + CurrentFile = &dest_file; + OutputOpen = 1; - /* Open the input and output files. */ - if (ncp_open_file(sourceconn, source_dir_handle, sourceDup,0,AR_READ, - &source_file) != 0) { - fprintf(stderr,"%s: Cannot open %s--%s\n", - ProgramName,paramInputFile,strerror(errno)); - free(sourceDup); - free(destDup); - return 1; - } + free(sourceDup); + free(destDup); - if (ncp_create_file(sourceconn, dest_dir_handle, destDup, - source_file.file_attributes, &dest_file) != 0) { - fprintf(stderr,"%s: Cannot create %s--%s\n",ProgramName, paramOutputFile, - strerror(errno)); - ncp_close_file(sourceconn,source_file.file_id); - free(sourceDup); - free(destDup); - return 1; - } - /* Set globals in case a signal happens while copying */ - CurrentConn = sourceconn; - CurrentFile = &dest_file; - OutputOpen = 1; + retValue = 0; + if (optVerbose) + { + printf("NetWare copy: %s -> %s 0%%", paramInputFile, paramOutputFile); + fflush(stdout); + } + /* The main copy loop. */ - free(sourceDup); - free(destDup); + amtLeft = totalSize = source_file.file_length; + sourceOff = 0; + retryCount = 0; - retValue = 0; - if (optVerbose) { - printf("NetWare copy: %s -> %s 0%%",paramInputFile,paramOutputFile); - fflush(stdout); - } - - /* The main copy loop. */ - - amtLeft = totalSize = source_file.file_length; - sourceOff = 0; - retryCount = 0; - - while (amtLeft && retryCount < MaxNcopyRetries) { - int ncopyRetValue; - if (amtLeft > CopyBlockSize) - thisMove = CopyBlockSize; - else - thisMove = amtLeft; - /* If we are being nice and we've copied enough blocks, go to sleep */ - if (optNice) { - if (BlocksCopied == optNiceFactor) { - sleep(NiceSleepTime); - BlocksCopied=0; - } else - ++BlocksCopied; - } - ncopyRetValue = ncp_copy_file(sourceconn, source_file.file_id, - dest_file.file_id, sourceOff,sourceOff, - thisMove,&amountCopied); - if (ncopyRetValue != 0) { - /* In my testing this only happens when you run out of space - on the server. - Netware seems to wait a bit before reporting space recently - free'd. I will just wait a bit before bombin */ - sleep(1); /* Sleep for a second and try again */ - retryCount++; - amountCopied = thisMove = 0; - } - if (amountCopied != thisMove) { - fprintf(stderr,"%s: Warning, amountCopied (%u) != thisMove (%u)\n", - ProgramName,(unsigned int)amountCopied,(unsigned int)thisMove); - } + while (amtLeft && retryCount < MaxNcopyRetries) + { + int ncopyRetValue; + if (amtLeft > CopyBlockSize) + thisMove = CopyBlockSize; + else + thisMove = amtLeft; + /* If we are being nice and we've copied enough blocks, go to sleep */ + if (optNice) + { + if (BlocksCopied == optNiceFactor) + { + sleep(NiceSleepTime); + BlocksCopied = 0; + } else + ++BlocksCopied; + } + ncopyRetValue = ncp_copy_file(sourceconn, source_file.file_id, + dest_file.file_id, sourceOff, sourceOff, + thisMove, &amountCopied); + if (ncopyRetValue != 0) + { + /* In my testing this only happens when you run out of space + on the server. + Netware seems to wait a bit before reporting space recently + free'd. I will just wait a bit before bombin */ + sleep(1); /* Sleep for a second and try again */ + retryCount++; + amountCopied = thisMove = 0; + } + if (amountCopied != thisMove) + { + fprintf(stderr, "%s: Warning, amountCopied (%u) != thisMove (%u)\n", + ProgramName, (unsigned int) amountCopied, (unsigned int) thisMove); + } #ifdef NCOPY_DEBUG - fprintf(stderr,"Copied %u (actual %u)\n",(unsigned int)thisMove, - (unsigned int)amountCopied); + fprintf(stderr, "Copied %u (actual %u)\n", (unsigned int) thisMove, + (unsigned int) amountCopied); #endif - amtLeft -= amountCopied; - sourceOff += amountCopied; - if (optVerbose) { - printf("\rNetWare copy: %s -> %s %ld%%",paramInputFile,paramOutputFile, - (100 - (long)((float)amtLeft /(float)totalSize * 100.0))); - if (retryCount) - printf(" %d retries",retryCount); - fflush(stdout); - } - } - if (retryCount >= MaxNcopyRetries) - retValue = 1; - if (optVerbose) - printf("\n"); - if (ncp_close_file(sourceconn,dest_file.file_id) != 0) { - fprintf(stderr,"%s: Close failed for %s\n",ProgramName,paramOutputFile); - retValue = 1; - } + amtLeft -= amountCopied; + sourceOff += amountCopied; + if (optVerbose) + { + printf("\rNetWare copy: %s -> %s %ld%%", paramInputFile, paramOutputFile, + (100 - (long) ((float) amtLeft / (float) totalSize * 100.0))); + if (retryCount) + printf(" %d retries", retryCount); + fflush(stdout); + } + } + if (retryCount >= MaxNcopyRetries) + retValue = 1; + if (optVerbose) + printf("\n"); + if (ncp_close_file(sourceconn, dest_file.file_id) != 0) + { + fprintf(stderr, "%s: Close failed for %s\n", ProgramName, paramOutputFile); + retValue = 1; + } + /* Clear signal handling globals */ + OutputOpen = 0; + CurrentConn = NULL; + CurrentFile = NULL; - /* Clear signal handling globals */ - OutputOpen = 0; - CurrentConn = NULL; - CurrentFile = NULL; - - if (ncp_close_file(sourceconn,source_file.file_id) != 0) { - fprintf(stderr,"%s: Close failed for %s\n",ProgramName,paramInputFile); - retValue = 1; - } - - if (ncp_dealloc_dir_handle(sourceconn, dest_dir_handle) != 0) - { - fprintf(stderr,"%s: Dealloc dir handle error for %s\n",ProgramName, - paramOutputFile); - retValue = 1; - } - if (ncp_dealloc_dir_handle(sourceconn, source_dir_handle) != 0) - { - fprintf(stderr,"%s: Dealloc dir handle error for %s\n",ProgramName, - paramInputFile); - retValue = 1; - } - return retValue; + if (ncp_close_file(sourceconn, source_file.file_id) != 0) + { + fprintf(stderr, "%s: Close failed for %s\n", ProgramName, paramInputFile); + retValue = 1; + } + if (ncp_dealloc_dir_handle(sourceconn, dest_dir_handle) != 0) + { + fprintf(stderr, "%s: Dealloc dir handle error for %s\n", ProgramName, + paramOutputFile); + retValue = 1; + } + if (ncp_dealloc_dir_handle(sourceconn, source_dir_handle) != 0) + { + fprintf(stderr, "%s: Dealloc dir handle error for %s\n", ProgramName, + paramInputFile); + retValue = 1; + } + return retValue; } @@ -610,31 +676,32 @@ int netwareCopyFile(int ncpMountIndex, const char *sourcefile, * Decides whether to use the traditional file copy or the netware remote * file copy. */ -int copyFiles(const char *realsource, const char *realdestination, - const char *paraminputfile, const char *paramoutputfile) +int +copyFiles(const char *realsource, const char *realdestination, + const char *paraminputfile, const char *paramoutputfile) { - int oldUMask; - char fileBuffer[24000]; - int retVal = 0; - int ncpMountIndex = ncpIndex(realsource,realdestination); + int oldUMask; + char fileBuffer[24000]; + int retVal = 0; + int ncpMountIndex = ncpIndex(realsource, realdestination); #ifdef NCOPY_DEBUG - printf("Real Source '%s'\n" - "Real Dest '%s'\n" - "Param Src '%s'\n" - "Param Dest '%s'\n",realsource,realdestination,paraminputfile, - paramoutputfile); + printf("Real Source '%s'\n" + "Real Dest '%s'\n" + "Param Src '%s'\n" + "Param Dest '%s'\n", realsource, realdestination, paraminputfile, + paramoutputfile); #endif - oldUMask = umask(0); - if (ncpMountIndex < 0) - retVal = normalFileCopy(realsource,realdestination,fileBuffer, - sizeof(fileBuffer), - paraminputfile,paramoutputfile); - else - retVal = netwareCopyFile(ncpMountIndex,realsource,realdestination, - paraminputfile,paramoutputfile); - umask(oldUMask); - return retVal; + oldUMask = umask(0); + if (ncpMountIndex < 0) + retVal = normalFileCopy(realsource, realdestination, fileBuffer, + sizeof(fileBuffer), + paraminputfile, paramoutputfile); + else + retVal = netwareCopyFile(ncpMountIndex, realsource, realdestination, + paraminputfile, paramoutputfile); + umask(oldUMask); + return retVal; } @@ -655,42 +722,47 @@ int copyFiles(const char *realsource, const char *realdestination, * Is it failure if destination fails? * Do we Stay in the loop? */ -static int copyRealPaths(const char *source, const char *destination) +static int +copyRealPaths(const char *source, const char *destination) { - char realsource[MAXPATHLEN*2]; - char realdestination[MAXPATHLEN*2]; - char dirPart[MAXPATHLEN+1]; - char filePart[MAXPATHLEN+1]; - const char *p; + char realsource[MAXPATHLEN * 2]; + char realdestination[MAXPATHLEN * 2]; + char dirPart[MAXPATHLEN + 1]; + char filePart[MAXPATHLEN + 1]; + const char *p; - if(realpath(source, realsource) == 0) { /* the source must at least exist */ - fprintf(stderr,"%s: %s: %s\n", - ProgramName, source, strerror(errno)); - return 1; /* indicate a "source" problem */ - } - if(realpath(destination, realdestination) == 0) {/* dest file missing? OK */ - strncpy(dirPart, destination, MAXPATHLEN); /* but "dirpart" must work */ - dirPart[MAXPATHLEN] = 0; - p=myBaseName(dirPart); - strcpy(filePart, p); - dirPart[p - dirPart] = 0; /* isolates "directory" part from "file part" */ - if(realpath(dirPart, realdestination) == 0) { - fprintf(stderr,"%s: %s: %s\n", - ProgramName, dirPart, strerror(errno)); - return 2; /* indicate a "destination" problem */ - } - if(*realdestination != '/' || *(realdestination+1)) strcat(realdestination, "/"); - strcat(realdestination, filePart); - } - /* becomes prog exit code */ + if (realpath(source, realsource) == 0) + { /* the source must at least exist */ + fprintf(stderr, "%s: %s: %s\n", + ProgramName, source, strerror(errno)); + return 1; /* indicate a "source" problem */ + } + if (realpath(destination, realdestination) == 0) + { /* dest file missing? OK */ + strncpy(dirPart, destination, MAXPATHLEN); /* but "dirpart" must work */ + dirPart[MAXPATHLEN] = 0; + p = myBaseName(dirPart); + strcpy(filePart, p); + dirPart[p - dirPart] = 0; /* isolates "directory" part from "file part" */ + if (realpath(dirPart, realdestination) == 0) + { + fprintf(stderr, "%s: %s: %s\n", + ProgramName, dirPart, strerror(errno)); + return 2; /* indicate a "destination" problem */ + } + if (*realdestination != '/' || *(realdestination + 1)) + strcat(realdestination, "/"); + strcat(realdestination, filePart); + } + /* becomes prog exit code */ - /* Test Cases: (Where file/dir may or may not exist) - * "", file, file/, dir, dir/ - * /, //, /dir, /dir/, /file, /file/, - * /tmp/file, /tmp/file/, tmp/file, tmp/file/, - * /tmp/dir, /tmp/dir/, tmp/dir, tmp/dir/ - */ - return copyFiles(realsource, realdestination,source,destination); + /* Test Cases: (Where file/dir may or may not exist) + * "", file, file/, dir, dir/ + * /, //, /dir, /dir/, /file, /file/, + * /tmp/file, /tmp/file/, tmp/file, tmp/file/, + * /tmp/dir, /tmp/dir/, tmp/dir, tmp/dir/ + */ + return copyFiles(realsource, realdestination, source, destination); } /**************************************************************************** @@ -698,152 +770,177 @@ static int copyRealPaths(const char *source, const char *destination) * if argc > 2 last parameter is a directory * by validateFileArgs() */ -static int handleFileArgs(int argc, char * const argv[]) +static int +handleFileArgs(int argc, char *const argv[]) { - int loop; - const char *destination; - int copyStatus; - int returnCode=0; /* default program exit code */ - const char *baseNamePtr; - char destinationfile[MAXPATHLEN*2]; + int loop; + const char *destination; + int copyStatus; + int returnCode = 0; /* default program exit code */ + const char *baseNamePtr; + char destinationfile[MAXPATHLEN * 2]; - destination=argv[argc-1]; /* get LAST argument */ - for (loop = 0; loop < (argc-1); loop++) { /* all file arguments, but last */ - strncpy(destinationfile, destination, MAXPATHLEN); - destinationfile[MAXPATHLEN]=0; - if((argc > 2) || (!notDir(argv[argc-1]))) { /* destination is a dir */ - if(*destinationfile != '/' || *(destinationfile+1)) strcat(destinationfile,"/"); - baseNamePtr=myBaseName(argv[loop]); /* get the file name */ - strcat(destinationfile,baseNamePtr); /* add it on end of directory */ - } - copyStatus=copyRealPaths(argv[loop], destinationfile); /* do the copy */ - if(copyStatus > 1) return copyStatus; /* fatal failure? bye */ - if(copyStatus == 1) returnCode=1; /* a partial failure? we can continue */ - } - return returnCode; /* return what will be the program exit code */ + destination = argv[argc - 1]; /* get LAST argument */ + for (loop = 0; loop < (argc - 1); loop++) + { /* all file arguments, but last */ + strncpy(destinationfile, destination, MAXPATHLEN); + destinationfile[MAXPATHLEN] = 0; + if ((argc > 2) || (!notDir(argv[argc - 1]))) + { /* destination is a dir */ + if (*destinationfile != '/' || *(destinationfile + 1)) + strcat(destinationfile, "/"); + baseNamePtr = myBaseName(argv[loop]); /* get the file name */ + strcat(destinationfile, baseNamePtr); /* add it on end of directory */ + } + copyStatus = copyRealPaths(argv[loop], destinationfile); /* do the copy */ + if (copyStatus > 1) + return copyStatus; /* fatal failure? bye */ + if (copyStatus == 1) + returnCode = 1; /* a partial failure? we can continue */ + } + return returnCode; /* return what will be the program exit code */ } /**************************************************************************** * */ -static void handleSignals(int sigNumber) +static void +handleSignals(int sigNumber) { - /* Ignore Signal Handling while cleaning up */ + /* Ignore Signal Handling while cleaning up */ - /* SIGHUP */ - sHangupSig.sa_handler=SIG_IGN; - if(sigaction(SIGHUP, &sHangupSig, NULL) == -1) { - fprintf(stderr,"%s: Reset to ignore SIGHUP signal failed: %s", - ProgramName, strerror(errno)); - } - /* SIGINT */ - sInterruptSig.sa_handler=SIG_IGN; - if(sigaction(SIGINT, &sInterruptSig, NULL) == -1) { - fprintf(stderr,"%s: Reset to ignore SIGINT signal failed: %s", - ProgramName, strerror(errno)); - } - /* SIGQUIT */ - sQuitSig.sa_handler=SIG_IGN; - if(sigaction(SIGQUIT, &sQuitSig, NULL) == -1) { - fprintf(stderr,"%s: Reset to ignore SIGQUIT signal failed: %s", - ProgramName, strerror(errno)); - } - /* SIGTERM */ - sTermSig.sa_handler=SIG_IGN; - if(sigaction(SIGTERM, &sTermSig, NULL) == -1) { - fprintf(stderr,"%s: Reset to ignore SIGTERM signal failed: %s", - ProgramName, strerror(errno)); - } - - /* If we don't close the ncp output file, we have to ncpumount and - ncpmount before we can get rid of it. */ - if (OutputOpen) { - /* Issue a warning if we cannot close the file */ - /* If an error occurs we probably have to umount/mount to - remove the file */ - if (ncp_close_file(CurrentConn,CurrentFile->file_id) != 0) { - fprintf(stderr,"%s: unclean close of output file",ProgramName); - } - OutputOpen = 0; - } - - exit(128 + sigNumber); + /* SIGHUP */ + sHangupSig.sa_handler = SIG_IGN; + if (sigaction(SIGHUP, &sHangupSig, NULL) == -1) + { + fprintf(stderr, "%s: Reset to ignore SIGHUP signal failed: %s", + ProgramName, strerror(errno)); + } + /* SIGINT */ + sInterruptSig.sa_handler = SIG_IGN; + if (sigaction(SIGINT, &sInterruptSig, NULL) == -1) + { + fprintf(stderr, "%s: Reset to ignore SIGINT signal failed: %s", + ProgramName, strerror(errno)); + } + /* SIGQUIT */ + sQuitSig.sa_handler = SIG_IGN; + if (sigaction(SIGQUIT, &sQuitSig, NULL) == -1) + { + fprintf(stderr, "%s: Reset to ignore SIGQUIT signal failed: %s", + ProgramName, strerror(errno)); + } + /* SIGTERM */ + sTermSig.sa_handler = SIG_IGN; + if (sigaction(SIGTERM, &sTermSig, NULL) == -1) + { + fprintf(stderr, "%s: Reset to ignore SIGTERM signal failed: %s", + ProgramName, strerror(errno)); + } + /* If we don't close the ncp output file, we have to ncpumount and + ncpmount before we can get rid of it. */ + if (OutputOpen) + { + /* Issue a warning if we cannot close the file */ + /* If an error occurs we probably have to umount/mount to + remove the file */ + if (ncp_close_file(CurrentConn, CurrentFile->file_id) != 0) + { + fprintf(stderr, "%s: unclean close of output file", ProgramName); + } + OutputOpen = 0; + } + exit(128 + sigNumber); } /**************************************************************************** * We'll trap Hangup, Interrupt, Quit or Terminate */ -static int trapSignals() +static int +trapSignals() { - if(sigaction(SIGHUP, NULL, &sHangupSig)) { /* init structure fields */ - fprintf(stderr,"%s: Get HANGUP signal action failed: %s", - ProgramName, strerror(errno)); - return 1; - } - sHangupSig.sa_handler = handleSignals; - if(sigaction(SIGHUP, &sHangupSig, NULL) == -1) { - fprintf(stderr,"%s: Reset HANGUP signal action failed: %s", - ProgramName, strerror(errno)); - return 1; - } - if(sigaction(SIGINT, NULL, &sInterruptSig)) { /* init structure fields */ - fprintf(stderr,"%s: Get INTERRUPT signal action failed: %s", - ProgramName, strerror(errno)); - return 1; - } - sInterruptSig.sa_handler = handleSignals; - if(sigaction(SIGINT, &sInterruptSig, NULL) == -1) { - fprintf(stderr,"%s: Reset INTERRUPT signal action failed: %s", - ProgramName, strerror(errno)); - return 1; - } - if(sigaction(SIGQUIT, NULL, &sQuitSig)) { /* init structure fields */ - fprintf(stderr,"%s: Get QUIT signal action failed: %s", - ProgramName, strerror(errno)); - return 1; - } - sQuitSig.sa_handler = handleSignals; - if(sigaction(SIGQUIT, &sQuitSig, NULL) == -1) { - fprintf(stderr,"%s: Reset QUIT signal action failed: %s", - ProgramName, strerror(errno)); - return 1; - } - if(sigaction(SIGTERM, NULL, &sTermSig)) { /* init structure fields */ - fprintf(stderr,"%s: Get TERMINATE signal action failed: %s", - ProgramName, strerror(errno)); - return 1; - } - sTermSig.sa_handler = handleSignals; - if(sigaction(SIGTERM, &sTermSig, NULL) == -1) { - fprintf(stderr,"%s: Reset TERMINATE signal action failed: %s", - ProgramName, strerror(errno)); - return 1; - } - return 0; + if (sigaction(SIGHUP, NULL, &sHangupSig)) + { /* init structure fields */ + fprintf(stderr, "%s: Get HANGUP signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + sHangupSig.sa_handler = handleSignals; + if (sigaction(SIGHUP, &sHangupSig, NULL) == -1) + { + fprintf(stderr, "%s: Reset HANGUP signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + if (sigaction(SIGINT, NULL, &sInterruptSig)) + { /* init structure fields */ + fprintf(stderr, "%s: Get INTERRUPT signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + sInterruptSig.sa_handler = handleSignals; + if (sigaction(SIGINT, &sInterruptSig, NULL) == -1) + { + fprintf(stderr, "%s: Reset INTERRUPT signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + if (sigaction(SIGQUIT, NULL, &sQuitSig)) + { /* init structure fields */ + fprintf(stderr, "%s: Get QUIT signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + sQuitSig.sa_handler = handleSignals; + if (sigaction(SIGQUIT, &sQuitSig, NULL) == -1) + { + fprintf(stderr, "%s: Reset QUIT signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + if (sigaction(SIGTERM, NULL, &sTermSig)) + { /* init structure fields */ + fprintf(stderr, "%s: Get TERMINATE signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + sTermSig.sa_handler = handleSignals; + if (sigaction(SIGTERM, &sTermSig, NULL) == -1) + { + fprintf(stderr, "%s: Reset TERMINATE signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + return 0; } /**************************************************************************** * */ -int main(int argc, char * const argv[]) +int +main(int argc, char *const argv[]) { - int returnCode; - ProgramName=argv[0]; + int returnCode; + ProgramName = argv[0]; - if(handleOptions(argc, argv)) { /* bad option, missing option parameter */ - usage(); - return 1; - } - if(optVersion) { /* only option not requiring any arguments */ - printf("%s version %s\n", ProgramName, VersionStr); - return 0; - } - if(validateFileArgs(argc - optind, argv + optind)) { - usage(); - return 1; - } - if(trapSignals()) return 1; - loadMountTable(); - returnCode = handleFileArgs(argc - optind, argv + optind); - releaseMountTable(); - return returnCode; + if (handleOptions(argc, argv)) + { /* bad option, missing option parameter */ + usage(); + return 1; + } + if (optVersion) + { /* only option not requiring any arguments */ + printf("%s version %s\n", ProgramName, VersionStr); + return 0; + } + if (validateFileArgs(argc - optind, argv + optind)) + { + usage(); + return 1; + } + if (trapSignals()) + return 1; + loadMountTable(); + returnCode = handleFileArgs(argc - optind, argv + optind); + releaseMountTable(); + return returnCode; } diff --git a/util/ncptest.c b/util/ncptest.c index ba64762..4160303 100644 --- a/util/ncptest.c +++ b/util/ncptest.c @@ -19,7 +19,7 @@ #include #include #include -/* #include */ /* generates a warning here */ + /* #include *//* generates a warning here */ extern pid_t waitpid(pid_t, int *, int); #include #include @@ -41,7 +41,8 @@ extern pid_t waitpid(pid_t, int *, int); void test_connlist(struct ncp_conn *conn) { - __u8 conn_list[256] = {0,}; + __u8 conn_list[256] = + {0,}; int no; ncp_get_connlist(conn, NCP_BINDERY_USER, "SUPERVISOR", &no, @@ -52,7 +53,8 @@ test_connlist(struct ncp_conn *conn) void test_send(struct ncp_conn *conn) { - __u8 conn_list[256] = {0,}; + __u8 conn_list[256] = + {0,}; int no; if (ncp_get_connlist(conn, NCP_BINDERY_USER, "ME", &no, @@ -60,7 +62,6 @@ test_send(struct ncp_conn *conn) { no = 0; } - if (no > 0) { ncp_send_broadcast(conn, no, conn_list, "Hallo"); @@ -85,21 +86,18 @@ test_create(struct ncp_conn *conn) printf("lookup public error\n"); return; } - if (ncp_alloc_short_dir_handle(conn, &me, NCP_ALLOC_TEMPORARY, &dir_handle) != 0) { printf("alloc_dir_handle error\n"); return; } - if (ncp_create_file(conn, dir_handle, "BLUB.TXT", 0, &new_file) != 0) { printf("create error\n"); return; } - if (ncp_dealloc_dir_handle(conn, dir_handle) != 0) { printf("dealloc error\n"); @@ -114,15 +112,15 @@ test_change(struct ncp_conn *conn) unsigned char ncp_key[8]; struct ncp_bindery_object user; - if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) { + if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) + { return result; } - if ((result = ncp_get_bindery_object_id(conn, 1, - "ME", &user)) != 0) { + "ME", &user)) != 0) + { return result; } - if ((result = ncp_change_login_passwd(conn, &user, ncp_key, "MEE", "ME")) != 0) { @@ -149,16 +147,14 @@ test_readdir(struct ncp_conn *conn) printf("lookup blub error\n"); return; } - if (ncp_initialize_search(conn, &sys, 0, &seq) != 0) { printf("init error\n"); return; } - while (ncp_search_for_file_or_subdir(conn, &seq, &entry) == 0) { - struct nw_info_struct nfs; + struct nw_info_struct nfs; printf("found: %s\n", entry.entryName); if (ncp_obtain_file_or_subdir_info(conn, NW_NS_DOS, NW_NS_NFS, 0x8006, RIM_ALL, @@ -168,7 +164,7 @@ test_readdir(struct ncp_conn *conn) &nfs) == 0) { printf("nfs name: %s\n", nfs.entryName); - } + } if (ncp_obtain_file_or_subdir_info(conn, NW_NS_DOS, NW_NS_OS2, 0x8006, RIM_ALL, entry.volNumber, @@ -177,7 +173,7 @@ test_readdir(struct ncp_conn *conn) &nfs) == 0) { printf("os2 name: %s\n", nfs.entryName); - } + } } } @@ -199,7 +195,6 @@ test_rights(struct ncp_conn *conn) printf("lookup me error\n"); return; } - if (ncp_get_eff_directory_rights(conn, 0, 0, 0x8006, sys.volNumber, sys.DosDirNum, NULL, &rights) != 0) @@ -231,7 +226,6 @@ main(int argc, char *argv[]) com_err(argv[0], err, "in ncp_initialize"); return 1; } - test_rights(conn); ncp_close(conn); return 0; diff --git a/util/nprint.c b/util/nprint.c index a4ab053..b8fb9ad 100644 --- a/util/nprint.c +++ b/util/nprint.c @@ -19,7 +19,7 @@ static char *progname; static void -usage(void); + usage(void); static void help(void); void @@ -46,25 +46,25 @@ main(int argc, char *argv[]) progname = argv[0]; - memzero(j); memzero(pj); memzero(q); + memzero(j); + memzero(pj); + memzero(q); - if ( (argc == 2) + if ((argc == 2) && (strcmp(argv[1], "-h") == 0)) { help(); exit(0); } - if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) { com_err(argv[0], err, "when initializing connection"); exit(1); } - /* * Fill in default values for print job */ - j.j.TargetServerID = 0xffffffff; /* any server */ + j.j.TargetServerID = 0xffffffff; /* any server */ /* at once */ memset(&(j.j.TargetExecTime), 0xff, sizeof(j.j.TargetExecTime)); j.j.JobType = htons(0); @@ -78,9 +78,10 @@ main(int argc, char *argv[]) pj.Rows = htons(80); strcpy(pj.FnameHeader, "stdin"); - while ((opt = getopt(argc, argv, "h?q:d:p:b:f:l:r:c:t:F:TN"))!=EOF) + while ((opt = getopt(argc, argv, "h?q:d:p:b:f:l:r:c:t:F:TN")) != EOF) { - switch (opt) { + switch (opt) + { case 'h': case '?': help(); @@ -93,8 +94,7 @@ main(int argc, char *argv[]) { strncpy(pj.Path, optarg, sizeof(pj.Path)); - } - else + } else { strcpy(pj.Path, optarg); } @@ -106,8 +106,7 @@ main(int argc, char *argv[]) { strncpy(pj.BannerName, optarg, sizeof(pj.BannerName)); - } - else + } else { strcpy(pj.BannerName, optarg); } @@ -119,8 +118,7 @@ main(int argc, char *argv[]) { strncpy(pj.FnameBanner, optarg, sizeof(pj.FnameBanner)); - } - else + } else { strcpy(pj.FnameBanner, optarg); } @@ -205,13 +203,12 @@ main(int argc, char *argv[]) { strncpy(j.j.JobTextDescription, optarg, sizeof(j.j.JobTextDescription)); - } - else + } else { strcpy(j.j.JobTextDescription, optarg); } break; - + default: usage(); ncp_close(conn); @@ -219,20 +216,18 @@ main(int argc, char *argv[]) } } - if (optind != argc-1) + if (optind != argc - 1) { usage(); ncp_close(conn); exit(1); } - file_name = argv[optind]; if (strcmp(file_name, "-") == 0) { file = 0; /* stdin */ - } - else + } else { file = open(file_name, O_RDONLY, 0); if (file < 0) @@ -241,13 +236,11 @@ main(int argc, char *argv[]) ncp_close(conn); exit(1); } - if (strlen(file_name) >= sizeof(pj.FnameHeader)) { strncpy(pj.FnameHeader, file_name, sizeof(pj.FnameHeader)); - } - else + } else { strcpy(pj.FnameHeader, file_name); } @@ -258,8 +251,7 @@ main(int argc, char *argv[]) { strncpy(pj.FnameBanner, file_name, sizeof(pj.FnameBanner)); - } - else + } else { strcpy(pj.FnameBanner, file_name); } @@ -277,38 +269,35 @@ main(int argc, char *argv[]) ncp_close(conn); exit(1); } - if (ncp_create_queue_job_and_file(conn, q.object_id, &j) != 0) { printf("create error\n"); ncp_close(conn); exit(1); } - written = 0; do { - read_this_time = read(file, buf, sizeof(buf)); + read_this_time = read(file, buf, sizeof(buf)); if (read_this_time < 0) { break; } - if (ncp_write(conn, j.file_handle, written, read_this_time, buf) < read_this_time) { break; } - written += read_this_time; - } while (read_this_time > 0); + } + while (read_this_time > 0); close(file); - if (ncp_close_file_and_start_job(conn, q.object_id, &j) != 0) { + if (ncp_close_file_and_start_job(conn, q.object_id, &j) != 0) + { printf("close error\n"); } - ncp_close(conn); return; } @@ -322,25 +311,25 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options] file\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options] file\n", progname); + printf("\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" - "-P password Use this password\n" - "-n Do not use any password\n" - "-C Don't convert password to uppercase\n" - "-q queue name Name of the printing queue to use\n" - "-d job desc Job description\n" - "-p path name Path name to appear on banner\n" - "-b bannername Banner name (up to 12 chars)\n" - "-f filename Filename to appear on banner\n" - "-l lines Number of lines per page\n" - "-r rows Number of rows per page\n" - "-t tab Number of spaces per tab\n" - "-T Print server tab expantion\n" - "-N Surpress print server form feeds\n" - "-F form # Form number to print on\n" - "-h print this help text\n" - "\n"); + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" + "-q queue name Name of the printing queue to use\n" + "-d job desc Job description\n" + "-p path name Path name to appear on banner\n" + "-b bannername Banner name (up to 12 chars)\n" + "-f filename Filename to appear on banner\n" + "-l lines Number of lines per page\n" + "-r rows Number of rows per page\n" + "-t tab Number of spaces per tab\n" + "-T Print server tab expantion\n" + "-N Surpress print server form feeds\n" + "-F form # Form number to print on\n" + "-h print this help text\n" + "\n"); } diff --git a/util/nsend.c b/util/nsend.c index 9a58fd2..da716b2 100644 --- a/util/nsend.c +++ b/util/nsend.c @@ -16,7 +16,8 @@ int main(int argc, char **argv) { struct ncp_conn *conn; - __u8 conn_list[256] = {0,}; + __u8 conn_list[256] = + {0,}; int no_conn; char *message = NULL; @@ -28,14 +29,12 @@ main(int argc, char **argv) com_err(argv[0], err, "when initializing"); exit(1); } - if (argc != 3) { fprintf(stderr, "usage: %s [options] user message\n", argv[0]); ncp_close(conn); exit(1); } - user = argv[1]; message = argv[2]; @@ -46,14 +45,12 @@ main(int argc, char **argv) ncp_close(conn); exit(1); } - if (no_conn == 0) { fprintf(stderr, "No connection found for %s\n", user); ncp_close(conn); exit(1); } - if ((err = ncp_send_broadcast(conn, no_conn, conn_list, message)) != 0) { com_err(argv[0], err, "in send_broadcast"); diff --git a/util/nwauth.c b/util/nwauth.c index a4946ea..c5f8167 100644 --- a/util/nwauth.c +++ b/util/nwauth.c @@ -23,18 +23,18 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" + "-U username Username sent to server\n" "-t type Object type (decimal value)\n" "\n"); } static void -swallow_error(const char * s, long x, const char *t, va_list arg) +swallow_error(const char *s, long x, const char *t, va_list arg) { return; } @@ -59,10 +59,10 @@ main(int argc, char *argv[]) { set_com_err_hook(swallow_error); } - while ((opt = getopt(argc, argv, "h?S:U:t:")) != EOF) { - switch(opt) { + switch (opt) + { case 'S': server = optarg; break; @@ -90,13 +90,11 @@ main(int argc, char *argv[]) com_err(argv[0], err, "when trying to find server"); exit(1); } - if (ncp_find_fileserver(spec->server, &err) == NULL) { com_err(argv[0], err, "when trying to find server"); exit(1); } - spec->login_type = object_type; memset(spec->password, 0, sizeof(spec->password)); @@ -109,8 +107,7 @@ main(int argc, char *argv[]) exit(1); } strcpy(spec->password, str); - } - else + } else { fgets(spec->password, sizeof(spec->password), stdin); } diff --git a/util/nwbocreate.c b/util/nwbocreate.c index 8f006b8..794c3ad 100644 --- a/util/nwbocreate.c +++ b/util/nwbocreate.c @@ -22,15 +22,15 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" - "-P password Use this password\n" - "-n Do not use any password\n" - "-C Don't convert password to uppercase\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" "\n" "-o object_name Name of created object\n" "-t type Object type (decimal value)\n" @@ -63,8 +63,8 @@ parse_security(const char *security) return 4; } return -1; -} - +} + int main(int argc, char *argv[]) { @@ -76,7 +76,7 @@ main(int argc, char *argv[]) int read_sec = 1; /* logged read */ int write_sec = 3; /* supervisor write */ int result = 1; - + int opt; progname = argv[0]; @@ -86,10 +86,10 @@ main(int argc, char *argv[]) com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "h?o:t:r:w:")) != EOF) { - switch(opt) { + switch (opt) + { case 'o': object_name = optarg; str_upper(object_name); @@ -137,25 +137,22 @@ main(int argc, char *argv[]) argv[0]); goto finished; } - if (object_name == NULL) { fprintf(stderr, "%s: You must specify an object name\n", argv[0]); goto finished; } - if (ncp_create_bindery_object(conn, object_type, object_name, (write_sec << 4) + read_sec, 0) != 0) { fprintf(stderr, "%s: Could not create the object\n", argv[0]); - } - else + } else { result = 0; } - finished: + finished: ncp_close(conn); return result; } diff --git a/util/nwbols.c b/util/nwbols.c index 7d54580..1ecdcca 100644 --- a/util/nwbols.c +++ b/util/nwbols.c @@ -25,15 +25,15 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" - "-P password Use this password\n" - "-n Do not use any password\n" - "-C Don't convert password to uppercase\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" "\n" "-t type Object type to be listed (decimal)\n" "-o object Object pattern\n" @@ -63,10 +63,10 @@ main(int argc, char **argv) com_err(argv[0], err, "when initializing"); return 1; } - while ((opt = getopt(argc, argv, "h?vt:o:")) != EOF) { - switch(opt) { + switch (opt) + { case 'h': case '?': help(); @@ -91,7 +91,6 @@ main(int argc, char **argv) usage(); exit(1); } - for (p = pattern; *p != '\0'; p++) { *p = toupper(*p); @@ -106,17 +105,16 @@ main(int argc, char **argv) if (verbose != 0) { printf("%s %08X %04X %d %02X %d\n", - o.object_name, (unsigned int)o.object_id, - (unsigned int)o.object_type, + o.object_name, (unsigned int) o.object_id, + (unsigned int) o.object_type, o.object_flags, o.object_security, o.object_has_prop); - } - else + } else { printf("%s %08X %04X\n", - o.object_name, (unsigned int)o.object_id, - (unsigned int)o.object_type); - } + o.object_name, (unsigned int) o.object_id, + (unsigned int) o.object_type); + } } ncp_close(conn); diff --git a/util/nwboprops.c b/util/nwboprops.c index c60a9b5..790850a 100644 --- a/util/nwboprops.c +++ b/util/nwboprops.c @@ -22,15 +22,15 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" - "-P password Use this password\n" - "-n Do not use any password\n" - "-C Don't convert password to uppercase\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" "\n" "-o object_name Name of object inspected\n" "-t type Object type (decimal value)\n" @@ -47,7 +47,7 @@ main(int argc, char *argv[]) long err; struct ncp_property_info info; - + int result = 1; int verbose = 0; int opt; @@ -59,10 +59,10 @@ main(int argc, char *argv[]) com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "h?o:t:v")) != EOF) { - switch(opt) { + switch (opt) + { case 'o': object_name = optarg; str_upper(object_name); @@ -89,14 +89,12 @@ main(int argc, char *argv[]) argv[0]); goto finished; } - if (object_name == NULL) { fprintf(stderr, "%s: You must specify an object name\n", argv[0]); goto finished; } - info.search_instance = 0xffffffff; while (ncp_scan_property(conn, object_type, object_name, @@ -108,14 +106,13 @@ main(int argc, char *argv[]) info.property_name, info.property_flags, info.property_security, info.value_available_flag); - } - else + } else { printf("%s\n", info.property_name); } } - finished: + finished: ncp_close(conn); return result; } diff --git a/util/nwborm.c b/util/nwborm.c index 2da2fa0..f0dc321 100644 --- a/util/nwborm.c +++ b/util/nwborm.c @@ -22,15 +22,15 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" - "-P password Use this password\n" - "-n Do not use any password\n" - "-C Don't convert password to uppercase\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" "\n" "-o object_name Name of object to be removed\n" "-t type Object type (decimal value)\n" @@ -46,7 +46,7 @@ main(int argc, char *argv[]) long err; int result = 1; - + int opt; progname = argv[0]; @@ -56,10 +56,10 @@ main(int argc, char *argv[]) com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "h?o:t:")) != EOF) { - switch(opt) { + switch (opt) + { case 'o': object_name = optarg; str_upper(object_name); @@ -83,24 +83,21 @@ main(int argc, char *argv[]) argv[0]); goto finished; } - if (object_name == NULL) { fprintf(stderr, "%s: You must specify an object name\n", argv[0]); goto finished; } - if (ncp_delete_bindery_object(conn, object_type, object_name) != 0) { fprintf(stderr, "%s: Could not delete the object\n", argv[0]); - } - else + } else { result = 0; } - finished: + finished: ncp_close(conn); return result; } diff --git a/util/nwbpadd.c b/util/nwbpadd.c index 70d5ea7..77283fd 100644 --- a/util/nwbpadd.c +++ b/util/nwbpadd.c @@ -22,15 +22,15 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options] [values]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options] [values]\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" - "-P password Use this password\n" - "-n Do not use any password\n" - "-C Don't convert password to uppercase\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" "\n" "-o object_name Name of accessed object\n" "-t type Object type (decimal value)\n" @@ -66,10 +66,10 @@ main(int argc, char *argv[]) com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "h?o:t:p:v:")) != EOF) { - switch(opt) { + switch (opt) + { case 'o': object_name = optarg; str_upper(object_name); @@ -106,28 +106,24 @@ main(int argc, char *argv[]) argv[0]); goto finished; } - if (object_name == NULL) { fprintf(stderr, "%s: You must specify an object name\n", argv[0]); goto finished; } - if (property_name == NULL) { fprintf(stderr, "%s: You must specify a property name\n", argv[0]); goto finished; } - - if (optind > argc-1) + if (optind > argc - 1) { fprintf(stderr, "%s: You must specify a property value\n", argv[0]); goto finished; } - value = argv[optind]; optind += 1; @@ -137,7 +133,6 @@ main(int argc, char *argv[]) fprintf(stderr, "%s: Could not find property\n", argv[0]); goto finished; } - if ((info.property_flags & 2) != 0) { /* Property is of type SET */ @@ -150,7 +145,6 @@ main(int argc, char *argv[]) progname, property_name); goto finished; } - if (ncp_get_bindery_object_name(conn, ntohl(strtol(value, NULL, 16)), &o) != 0) @@ -159,7 +153,6 @@ main(int argc, char *argv[]) progname, value); goto finished; } - if (ncp_add_object_to_set(conn, object_type, object_name, property_name, o.object_type, o.object_name) != 0) @@ -167,12 +160,11 @@ main(int argc, char *argv[]) fprintf(stderr, "%s: could not add object %s\n", progname, o.object_name); goto finished; - } - } - else + } + } else { /* Property is of type ITEM */ - char contents[255*128]; + char contents[255 * 128]; int segno = 1; int length; @@ -189,8 +181,7 @@ main(int argc, char *argv[]) goto finished; } strcpy(contents, value); - } - else + } else { /* value is the byte count */ int i; @@ -219,15 +210,15 @@ main(int argc, char *argv[]) for (segno = 1; segno <= 255; segno++) { struct nw_property segment; - int offset = (segno-1)*128; + int offset = (segno - 1) * 128; - if ( offset > length ) + if (offset > length) { /* everything written */ break; } memcpy(segment.value, &(contents[offset]), 128); - segment.more_flag = segno*128 < length; + segment.more_flag = segno * 128 < length; if (ncp_write_property_value(conn, object_type, object_name, property_name, @@ -241,7 +232,7 @@ main(int argc, char *argv[]) } result = 0; - finished: + finished: ncp_close(conn); return result; } diff --git a/util/nwbpcreate.c b/util/nwbpcreate.c index 740cd06..f7394da 100644 --- a/util/nwbpcreate.c +++ b/util/nwbpcreate.c @@ -22,15 +22,15 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" - "-P password Use this password\n" - "-n Do not use any password\n" - "-C Don't convert password to uppercase\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" "\n" "-o object_name Name of object\n" "-t type Object type (decimal value)\n" @@ -65,8 +65,8 @@ parse_security(const char *security) return 4; } return -1; -} - +} + int main(int argc, char *argv[]) { @@ -80,7 +80,7 @@ main(int argc, char *argv[]) int read_sec = 1; /* logged read */ int write_sec = 3; /* supervisor write */ int result = 1; - + int opt; progname = argv[0]; @@ -90,10 +90,10 @@ main(int argc, char *argv[]) com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "h?o:t:p:sr:w:")) != EOF) { - switch(opt) { + switch (opt) + { case 'o': object_name = optarg; str_upper(object_name); @@ -154,34 +154,30 @@ main(int argc, char *argv[]) argv[0]); goto finished; } - if (object_name == NULL) { fprintf(stderr, "%s: You must specify an object name\n", argv[0]); goto finished; } - if (property_name == NULL) { fprintf(stderr, "%s: You must specify a property name\n", argv[0]); goto finished; } - if (ncp_create_property(conn, object_type, object_name, property_name, property_is_set ? 2 : 0, (write_sec << 4) + read_sec) != 0) { - fprintf(stderr, "%s: Could not create the property\n",argv[0]); - } - else + fprintf(stderr, "%s: Could not create the property\n", argv[0]); + } else { result = 0; } - finished: + finished: ncp_close(conn); return result; } diff --git a/util/nwbprm.c b/util/nwbprm.c index 116a0ed..baa37b2 100644 --- a/util/nwbprm.c +++ b/util/nwbprm.c @@ -22,15 +22,15 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" - "-P password Use this password\n" - "-n Do not use any password\n" - "-C Don't convert password to uppercase\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" "\n" "-o object_name Name of object\n" "-t type Object type (decimal value)\n" @@ -48,7 +48,7 @@ main(int argc, char *argv[]) long err; int result = 1; - + int opt; progname = argv[0]; @@ -58,10 +58,10 @@ main(int argc, char *argv[]) com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "h?o:t:p:")) != EOF) { - switch(opt) { + switch (opt) + { case 'o': object_name = optarg; str_upper(object_name); @@ -95,32 +95,28 @@ main(int argc, char *argv[]) argv[0]); goto finished; } - if (object_name == NULL) { fprintf(stderr, "%s: You must specify an object name\n", argv[0]); goto finished; } - if (property_name == NULL) { fprintf(stderr, "%s: You must specify a property name\n", argv[0]); goto finished; } - if (ncp_delete_property(conn, object_type, object_name, property_name) != 0) { - fprintf(stderr, "%s: Could not delete the property\n",argv[0]); - } - else + fprintf(stderr, "%s: Could not delete the property\n", argv[0]); + } else { result = 0; } - finished: + finished: ncp_close(conn); return result; } diff --git a/util/nwbpset.c b/util/nwbpset.c index 20886dc..42a3fa6 100644 --- a/util/nwbpset.c +++ b/util/nwbpset.c @@ -22,25 +22,25 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options] [values]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options] [values]\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" - "-P password Use this password\n" - "-n Do not use any password\n" - "-C Don't convert password to uppercase\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" "\n"); } static char * -get_line(char *buf, int len, FILE *stream) +get_line(char *buf, int len, FILE * stream) { char *result = fgets(buf, len, stream); if (result != NULL) { - buf[strlen(buf)-1] = '\0'; /* remove newline */ + buf[strlen(buf) - 1] = '\0'; /* remove newline */ } return result; } @@ -66,10 +66,10 @@ main(int argc, char *argv[]) com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "h?")) != EOF) { - switch(opt) { + switch (opt) + { case 'h': case '?': help(); @@ -100,7 +100,6 @@ main(int argc, char *argv[]) fprintf(stderr, "Illegal format on stdin\n"); goto finished; } - memset(buf, 0, sizeof(buf)); if (get_line(buf, sizeof(buf), stdin) == NULL) { @@ -130,21 +129,19 @@ main(int argc, char *argv[]) "ITEM over existing SET"); goto finished; } - if (info.property_security != property_security) { if (ncp_change_property_security(conn, object_type, object_name, property_name, - property_security)!=0) + property_security) != 0) { fprintf(stderr, "Could not change " "property security\n"); goto finished; } } - } - else + } else { if (ncp_create_property(conn, object_type, object_name, property_name, property_flag, @@ -161,7 +158,7 @@ main(int argc, char *argv[]) int i; int length; int segno; - char property_value[255*128]; + char property_value[255 * 128]; memset(property_value, 0, sizeof(property_value)); @@ -173,20 +170,20 @@ main(int argc, char *argv[]) } property_value[i] = strtoul(buf, NULL, 16); } - length = i-1; + length = i - 1; for (segno = 1; segno <= 255; segno++) { struct nw_property segment; - int offset = (segno-1)*128; + int offset = (segno - 1) * 128; - if ( offset > length ) + if (offset > length) { /* everything written */ break; } memcpy(segment.value, &(property_value[offset]), 128); - segment.more_flag = segno*128 < length; + segment.more_flag = segno * 128 < length; if (ncp_write_property_value(conn, object_type, object_name, property_name, @@ -196,8 +193,7 @@ main(int argc, char *argv[]) goto finished; } } - } - else + } else { /* SET property */ @@ -213,14 +209,13 @@ main(int argc, char *argv[]) fprintf(stderr, "Illegal format on stdin\n"); goto finished; } - if (ncp_add_object_to_set(conn, object_type, object_name, property_name, element_type, element_name) != 0) { - if (conn->completion != 0xE9) /* object already - in set */ + if (conn->completion != 0xE9) /* object already + in set */ { fprintf(stderr, "Could not add object " "to set\n"); @@ -228,11 +223,11 @@ main(int argc, char *argv[]) } } } - } + } result = 0; - finished: + finished: ncp_close(conn); return result; } diff --git a/util/nwbpvalues.c b/util/nwbpvalues.c index aaa5e92..fe1243b 100644 --- a/util/nwbpvalues.c +++ b/util/nwbpvalues.c @@ -15,7 +15,7 @@ static char *progname; static void -print_property(char *prop_name, __u8 *val, int segments); + print_property(char *prop_name, __u8 * val, int segments); static void usage(void) @@ -26,15 +26,15 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" - "-P password Use this password\n" - "-n Do not use any password\n" - "-C Don't convert password to uppercase\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" "\n" "-o object_name Name of object\n" "-t type Object type (decimal value)\n" @@ -51,7 +51,7 @@ main(int argc, char *argv[]) char *object_name = NULL; int object_type = -1; char *property_name = NULL; - __u8 property_value[255*128]; + __u8 property_value[255 * 128]; int segno; int verbose = 0; int canonical = 0; @@ -60,7 +60,7 @@ main(int argc, char *argv[]) long err; int result = 1; - + int opt; progname = argv[0]; @@ -70,10 +70,10 @@ main(int argc, char *argv[]) com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "h?o:t:p:vc")) != EOF) { - switch(opt) { + switch (opt) + { case 'o': object_name = optarg; str_upper(object_name); @@ -113,33 +113,29 @@ main(int argc, char *argv[]) argv[0]); goto finished; } - if (object_name == NULL) { fprintf(stderr, "%s: You must specify an object name\n", argv[0]); goto finished; } - if (property_name == NULL) { fprintf(stderr, "%s: You must specify a property name\n", argv[0]); goto finished; } - if (ncp_scan_property(conn, object_type, object_name, 0xffffffff, property_name, &info) != 0) { fprintf(stderr, "%s: Could not find property\n", argv[0]); goto finished; } - segno = 1; while (ncp_read_property_value(conn, object_type, object_name, segno, property_name, &segment) == 0) { - memcpy(&(property_value[(segno-1)*128]), segment.value, 128); + memcpy(&(property_value[(segno - 1) * 128]), segment.value, 128); if ((segment.more_flag == 0) || (segno == 255)) { break; @@ -154,27 +150,24 @@ main(int argc, char *argv[]) info.property_name, info.property_flags, info.property_security); } - if ((info.property_flags & 2) == 0) { /* ITEM property */ if (canonical != 0) { int i; - for (i = 0; i < segno*128; i++) + for (i = 0; i < segno * 128; i++) { printf("%-2.2x\n", property_value[i]); } - } - else + } else { print_property(property_name, property_value, segno); } - } - else + } else { int objects = 32 * segno; - __u32 *value = (__u32 *)property_value; + __u32 *value = (__u32 *) property_value; int i = 0; while (i < objects) @@ -184,7 +177,7 @@ main(int argc, char *argv[]) if ((value[i] == 0) || (value[i] == 0xffffffff)) { /* Continue with next segment */ - i = ((i/32) + 1) * 32; + i = ((i / 32) + 1) * 32; continue; } if (ncp_get_bindery_object_name(conn, ntohl(value[i]), @@ -195,15 +188,13 @@ main(int argc, char *argv[]) printf("%-4.4x\n%s\n", (unsigned int) o.object_type, o.object_name); - } - else if (verbose != 0) + } else if (verbose != 0) { printf("%s %08X %04X\n", o.object_name, (unsigned int) o.object_id, (unsigned int) o.object_type); - } - else + } else { printf("%s\n", o.object_name); } @@ -212,41 +203,41 @@ main(int argc, char *argv[]) } } result = 0; - - finished: + + finished: ncp_close(conn); return result; } static void -print_unknown(__u8 *val) +print_unknown(__u8 * val) { - int j = (128/16); + int j = (128 / 16); while (1) { int i; - for ( i = 0 ; i < 16 ; i++ ) + for (i = 0; i < 16; i++) { - printf ( "%02X " , val[i] ); + printf("%02X ", val[i]); } - printf ( " [" ); - for ( i = 0 ; i < 16 ; i++ ) + printf(" ["); + for (i = 0; i < 16; i++) { - printf ( "%c" , isprint(val[i]) ? val[i] : '.'); + printf("%c", isprint(val[i]) ? val[i] : '.'); } j -= 1; - if ( j == 0 ) + if (j == 0) { - printf ( "]\n" ); + printf("]\n"); return; } - printf ( "]+\n" ) ; + printf("]+\n"); val += 16; } } static void -print_string(__u8 *val) +print_string(__u8 * val) { puts(val); } @@ -256,65 +247,65 @@ print_station_addr(char *fmt, struct ncp_station_addr *addr, char *buff) { char *ret = buff; - while ( *fmt != 0 ) + while (*fmt != 0) { - switch ( *fmt ) + switch (*fmt) { case '%': - switch ( *(++fmt) ) + switch (*(++fmt)) { - case 'N': /* node */ - { - int i ; - for ( i = 0 ; i < 6 ; buff += 2 , i++ ) + case 'N': /* node */ { - sprintf(buff, "%02X",addr->Node[i]); + int i; + for (i = 0; i < 6; buff += 2, i++) + { + sprintf(buff, "%02X", addr->Node[i]); + } } - } break; - case 'S': /* Socket */ + case 'S': /* Socket */ sprintf(buff, "%04X", htons(addr->Socket)); - buff += 4 ; - break ; - case 'L': /* Lan */ + buff += 4; + break; + case 'L': /* Lan */ sprintf(buff, "%08lX", htonl(addr->NetWork)); - buff += 8 ; - break ; + buff += 8; + break; case '%': *buff++ = '%'; default: - break ; + break; } if (*fmt) { - fmt++ ; + fmt++; } - break ; + break; default: - *buff++ = *fmt++ ; + *buff++ = *fmt++; } } - *buff = 0 ; - return ret ; + *buff = 0; + return ret; } void -print_login_control ( __u8 *val ) +print_login_control(__u8 * val) { - int i , j , mask; - char buff[32]; - struct ncp_prop_login_control *a =(struct ncp_prop_login_control *)val; + int i, j, mask; + char buff[32]; + struct ncp_prop_login_control *a = (struct ncp_prop_login_control *) val; static char *days[] - = { "Sun" , "Mon" , "Tue" , "Wen" , "Thu" , "Fri" , "Sat" } ; + = + {"Sun", "Mon", "Tue", "Wen", "Thu", "Fri", "Sat"}; if (a->LastLogin[2] || a->LastLogin[1] || a->LastLogin[0] || a->LastLogin[3] || a->LastLogin[4] || a->LastLogin[5]) { printf("Last Login: %d.%d.%02d at %2d:%02d:%02d\n", - a->LastLogin[2] , a->LastLogin[1] , a->LastLogin[0] , - a->LastLogin[3] , a->LastLogin[4] , a->LastLogin[5]); - } - else + a->LastLogin[2], a->LastLogin[1], a->LastLogin[0], + a->LastLogin[3], a->LastLogin[4], a->LastLogin[5]); + } else { printf("Never logged in\n"); } @@ -333,7 +324,7 @@ print_login_control ( __u8 *val ) if (a->PasswordExpireDate[2] || a->PasswordExpireDate[1] || a->PasswordExpireDate[0]) { - printf("Password expires on: %d.%d.%d\n" , + printf("Password expires on: %d.%d.%d\n", a->PasswordExpireDate[2], a->PasswordExpireDate[1], a->PasswordExpireDate[0]); @@ -356,8 +347,7 @@ print_login_control ( __u8 *val ) printf("Maximum no of connections: %d\n", ntohs(a->MaxConnections)); } - - if ( a->MaxDiskUsage != 0xFFFFFF7FL ) + if (a->MaxDiskUsage != 0xFFFFFF7FL) { printf("Maximum DiskQuota : %8ld blocks\n", ntohl(a->MaxDiskUsage)); @@ -371,23 +361,22 @@ print_login_control ( __u8 *val ) } if (a->LastIntruder.NetWork != 0L) { - printf("Last \'intruder\' address: %s\n" , - print_station_addr("(%L): %N[%S]" , - &(a->LastIntruder),buff)); + printf("Last \'intruder\' address: %s\n", + print_station_addr("(%L): %N[%S]", + &(a->LastIntruder), buff)); } - if ( a->RestrictionMask & 0xFC ) + if (a->RestrictionMask & 0xFC) { printf("RestrictionMask : %02X\n", a->RestrictionMask); } - - for ( i = 0 ; i < 42 ; i++ ) + for (i = 0; i < 42; i++) { - if ( a->ConnectionTimeMask[i] != 0xFF ) + if (a->ConnectionTimeMask[i] != 0xFF) { i = 101; } } - if ( i < 100 ) + if (i < 100) { return; } @@ -395,50 +384,79 @@ print_login_control ( __u8 *val ) printf("Time restrictions: 1 1 1 1 1 1 1 1 1 1 2 2 2 2 ]\n"); printf(" Day [0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 ]\n"); - for ( i = 0 ; i < 7 ; i++ ) + for (i = 0; i < 7; i++) { - printf (" %s [" , days[i]); - for ( j = 0 ; j < 6 ; j++ ) + printf(" %s [", days[i]); + for (j = 0; j < 6; j++) { - for ( mask = 1 ; mask < 0x100 ; mask <<= 1 ) + for (mask = 1; mask < 0x100; mask <<= 1) { - putchar ( (*val & mask) ? '*' : ' ' ) ; + putchar((*val & mask) ? '*' : ' '); } - val++ ; + val++; } - printf ( "]\n" ) ; + printf("]\n"); } } void -print_addr( __u8 *val) +print_addr(__u8 * val) { char buff[50]; print_station_addr("(%L): %N[%S]", - (struct ncp_station_addr *)val, buff); + (struct ncp_station_addr *) val, buff); printf("%s\n", buff); } -static struct { - char *pname ; - void (*func)(__u8 *) ; -} formats[] = { - { "DESCRIPTION" , print_string } , - { "SURNAME" , print_string } , - { "OBJECT_CLASS" , print_string } , - { "DESCRIPTION" , print_string } , - { "IDENTIFICATION" , print_string } , - { "Q_DIRECTORY" , print_string } , - { "LOGIN_CONTROL" , print_login_control } , - { "NET_ADDRESS" , print_addr } , - { NULL , NULL } +static struct +{ + char *pname; + void (*func) (__u8 *); +} +formats[] = +{ + { + "DESCRIPTION", print_string + } + , + { + "SURNAME", print_string + } + , + { + "OBJECT_CLASS", print_string + } + , + { + "DESCRIPTION", print_string + } + , + { + "IDENTIFICATION", print_string + } + , + { + "Q_DIRECTORY", print_string + } + , + { + "LOGIN_CONTROL", print_login_control + } + , + { + "NET_ADDRESS", print_addr + } + , + { + NULL, NULL + } }; static void -print_property(char *prop_name, __u8 *val, int segments) +print_property(char *prop_name, __u8 * val, int segments) { int i; - void (*f)(__u8 *); + void (*f) (__u8 *); for (i = 0; formats[i].pname != NULL; i++) { @@ -454,12 +472,10 @@ print_property(char *prop_name, __u8 *val, int segments) f(val); return; } - for (i = 0; i < segments; i++) { - printf("Segment: %03d\n", i+1); - print_unknown(&(val[i*128])); + printf("Segment: %03d\n", i + 1); + print_unknown(&(val[i * 128])); printf("\n"); } } - diff --git a/util/nwfsinfo.c b/util/nwfsinfo.c index 1c01685..af0ebec 100644 --- a/util/nwfsinfo.c +++ b/util/nwfsinfo.c @@ -1,3 +1,4 @@ + /* * nwfsinfo.c * @@ -22,9 +23,9 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" "\n" @@ -37,34 +38,34 @@ help(void) static void print_info(struct ncp_file_server_info *info) { - printf ( "\n" ) ; - printf ( "Fileservername %-48.48s\n" , info->ServerName ) ; - printf ( "\n" ) ; - printf ( "Version %d.%d Revision %c\n" , - info->FileServiceVersion , info->FileServiceSubVersion, - info->Revision + 'A' ) ; - printf ( "Max. Connections %d\n" , - info->MaximumServiceConnections ) ; - printf ( "currently in use %d\n" , - info->ConnectionsInUse ) ; - printf ( "peak connections %d\n" , - info->MaxConnectionsEverUsed ) ; - printf ( "Max. Volumes %d\n" , - info->NumberMountedVolumes ) ; - printf ( "SFTLevel %d\n" , - info->SFTLevel ) ; - printf ( "TTSLevel %d\n" , - info->TTSLevel ) ; - printf ( "Accountversion %d\n" , - info->AccountVersion ) ; - printf ( "Queueversion %d\n" , - info->QueueVersion ) ; - printf ( "Printversion %d\n" , - info->PrintVersion ) ; - printf ( "Virt.Consolvers. %d\n" , - info->VirtualConsoleVersion ) ; - printf ( "RestrictionLevel %d\n" , - info->RestrictionLevel ) ; + printf("\n"); + printf("Fileservername %-48.48s\n", info->ServerName); + printf("\n"); + printf("Version %d.%d Revision %c\n", + info->FileServiceVersion, info->FileServiceSubVersion, + info->Revision + 'A'); + printf("Max. Connections %d\n", + info->MaximumServiceConnections); + printf("currently in use %d\n", + info->ConnectionsInUse); + printf("peak connections %d\n", + info->MaxConnectionsEverUsed); + printf("Max. Volumes %d\n", + info->NumberMountedVolumes); + printf("SFTLevel %d\n", + info->SFTLevel); + printf("TTSLevel %d\n", + info->TTSLevel); + printf("Accountversion %d\n", + info->AccountVersion); + printf("Queueversion %d\n", + info->QueueVersion); + printf("Printversion %d\n", + info->PrintVersion); + printf("Virt.Consolvers. %d\n", + info->VirtualConsoleVersion); + printf("RestrictionLevel %d\n", + info->RestrictionLevel); printf("\n"); return; } @@ -83,75 +84,72 @@ main(int argc, char **argv) com_err(argv[0], err, "when initializing"); return 1; } - while ((opt = getopt(argc, argv, "h?dti")) != EOF) { - switch(opt) + switch (opt) { case 'h': case '?': help(); break; case 'd': - { - char strings[512]; - char *s; - - if (ncp_get_file_server_description_strings(conn, - strings) - != 0) { - perror("could not get strings"); - ncp_close(conn); - return 1; - } + char strings[512]; + char *s; - s = strings; - while (s < strings+512) - { - if (strlen(s) == 0) + if (ncp_get_file_server_description_strings(conn, + strings) + != 0) { - break; + perror("could not get strings"); + ncp_close(conn); + return 1; } - puts(s); - s += strlen(s)+1; + s = strings; + while (s < strings + 512) + { + if (strlen(s) == 0) + { + break; + } + puts(s); + s += strlen(s) + 1; + } + break; } - break; - } case 't': - { - time_t t; - - if (ncp_get_file_server_time(conn, &t) != 0) { - perror("could not get server time"); - ncp_close(conn); - return 1; - } + time_t t; - fputs(ctime(&t), stdout); - break; - } + if (ncp_get_file_server_time(conn, &t) != 0) + { + perror("could not get server time"); + ncp_close(conn); + return 1; + } + fputs(ctime(&t), stdout); + break; + } case 'i': - { - struct ncp_file_server_info info; - if (ncp_get_file_server_information(conn, &info) != 0) { - perror("Could not get server information"); - ncp_close(conn); - return 1; + struct ncp_file_server_info info; + if (ncp_get_file_server_information(conn, &info) != 0) + { + perror("Could not get server information"); + ncp_close(conn); + return 1; + } + print_info(&info); + break; } - print_info(&info); - break; - } - + default: usage(); goto finished; } } - finished: + finished: ncp_close(conn); return 0; } diff --git a/util/nwfstime.c b/util/nwfstime.c index 1989ce0..eb9f152 100644 --- a/util/nwfstime.c +++ b/util/nwfstime.c @@ -22,15 +22,15 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" - "-P password Use this password\n" - "-n Do not use any password\n" - "-C Don't convert password to uppercase\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" "\n" "-s Set file server's time from local time\n" "\n"); @@ -52,10 +52,9 @@ main(int argc, char **argv) com_err(argv[0], err, "when initializing"); return 1; } - while ((opt = getopt(argc, argv, "h?s")) != EOF) { - switch(opt) + switch (opt) { case 'h': case '?': @@ -70,7 +69,7 @@ main(int argc, char **argv) } } -finished: + finished: if (set != 0) { @@ -81,8 +80,7 @@ finished: ncp_close(conn); return 1; } - } - else + } else { if ((err = ncp_get_file_server_time(conn, &t)) != 0) { @@ -92,7 +90,7 @@ finished: } fputs(ctime(&t), stdout); } - + ncp_close(conn); return 0; } diff --git a/util/nwgrant.c b/util/nwgrant.c index 98a0576..1226fed 100644 --- a/util/nwgrant.c +++ b/util/nwgrant.c @@ -22,15 +22,15 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options] file/directory\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options] file/directory\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" - "-P password Use this password\n" - "-n Do not use any password\n" - "-C Don't convert password to uppercase\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" "\n" "-o object_name Name of object added as trustee\n" "-t type Object type (decimal value)\n" @@ -60,10 +60,10 @@ main(int argc, char *argv[]) com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "h?o:t:r:")) != EOF) { - switch(opt) { + switch (opt) + { case 'o': object_name = optarg; str_upper(object_name); @@ -90,22 +90,19 @@ main(int argc, char *argv[]) argv[0]); goto finished; } - if (object_name == NULL) { fprintf(stderr, "%s: You must specify an object name\n", argv[0]); goto finished; } - if (rights < 0) { fprintf(stderr, "%s: You must specify a rights mask\n", progname); goto finished; } - - if (optind != argc-1) + if (optind != argc - 1) { fprintf(stderr, "%s: You must specify a directory\n", progname); @@ -119,16 +116,14 @@ main(int argc, char *argv[]) progname, object_name); goto finished; } - if (ncp_add_trustee(conn, 0, path, o.object_id, rights) != 0) { - fprintf(stderr, "%s: Could not add trustee rights\n",progname); + fprintf(stderr, "%s: Could not add trustee rights\n", progname); goto finished; } - result = 0; - finished: + finished: ncp_close(conn); return result; } diff --git a/util/nwmsg.c b/util/nwmsg.c index 9572c26..209ea4c 100644 --- a/util/nwmsg.c +++ b/util/nwmsg.c @@ -41,7 +41,7 @@ main(int argc, char *argv[]) FILE *mtab; struct mntent *mnt; long err; - + progname = argv[0]; @@ -53,14 +53,12 @@ main(int argc, char *argv[]) progname); exit(1); } - mount_point = argv[1]; if ((conn = ncp_open_mount(mount_point, &err)) == NULL) { com_err(progname, err, "in ncp_open_mount"); exit(1); } - if (ncp_get_broadcast_message(conn, message) != 0) { fprintf(stderr, "%s: could not get broadcast message\n", @@ -68,13 +66,11 @@ main(int argc, char *argv[]) ncp_close(conn); exit(1); } - if (strlen(message) == 0) { syslog(LOG_DEBUG, "no message"); exit(0); } - #if 0 syslog(LOG_DEBUG, "message: %s", message); #endif @@ -87,7 +83,6 @@ main(int argc, char *argv[]) ncp_close(conn); exit(1); } - ncp_close(conn); if ((pwd = getpwuid(info.mounted_uid)) == NULL) @@ -96,14 +91,12 @@ main(int argc, char *argv[]) progname, info.mounted_uid); exit(1); } - if ((mtab = fopen(MOUNTED, "r")) == NULL) { fprintf(stderr, "%s: can't open %s\n", progname, MOUNTED); exit(1); } - while ((mnt = getmntent(mtab)) != NULL) { if (strcmp(mnt->mnt_dir, mount_point) == 0) @@ -116,12 +109,10 @@ main(int argc, char *argv[]) { syslog(LOG_DEBUG, "cannot find mtab entry\n"); } - if (search_utmp(pwd->pw_name, tty) != 0) { exit(1); } - sprintf(tty_path, "/dev/%s", tty); if ((tty_file = fopen(tty_path, "w")) == NULL) { @@ -129,8 +120,7 @@ main(int argc, char *argv[]) progname, tty_path, strerror(errno)); exit(1); } - - fprintf(tty_file,"\r\n\007\007\007Message from NetWare Server: %s\r\n", + fprintf(tty_file, "\r\n\007\007\007Message from NetWare Server: %s\r\n", mnt->mnt_fsname); fprintf(tty_file, "%s\r\n", message); fclose(tty_file); @@ -145,21 +135,22 @@ main(int argc, char *argv[]) * and the access time */ static int -term_chk(char *tty, int *msgsokP, time_t *atimeP, int *showerror) +term_chk(char *tty, int *msgsokP, time_t * atimeP, int *showerror) { struct stat s; char path[MAXPATHLEN]; - (void)sprintf(path, "/dev/%s", tty); - if (stat(path, &s) < 0) { + (void) sprintf(path, "/dev/%s", tty); + if (stat(path, &s) < 0) + { if (showerror) - (void)fprintf(stderr, - "write: %s: %s\n", path, strerror(errno)); - return(1); + (void) fprintf(stderr, + "write: %s: %s\n", path, strerror(errno)); + return (1); } *msgsokP = (s.st_mode & (S_IWRITE >> 3)) != 0; /* group write bit */ *atimeP = s.st_atime; - return(0); + return (0); } /* @@ -182,19 +173,20 @@ search_utmp(char *user, char *tty) char atty[sizeof(u.ut_line) + 1]; - if ((ufd = open(_PATH_UTMP, O_RDONLY)) < 0) { + if ((ufd = open(_PATH_UTMP, O_RDONLY)) < 0) + { perror("utmp"); return -1; } - nloggedttys = nttys = 0; bestatime = 0; user_is_me = 0; while (read(ufd, (char *) &u, sizeof(u)) == sizeof(u)) - if (strncmp(user, u.ut_name, sizeof(u.ut_name)) == 0) { + if (strncmp(user, u.ut_name, sizeof(u.ut_name)) == 0) + { ++nloggedttys; - (void)strncpy(atty, u.ut_line, sizeof(u.ut_line)); + (void) strncpy(atty, u.ut_line, sizeof(u.ut_line)); atty[sizeof(u.ut_line)] = '\0'; if (term_chk(atty, &msgsok, &atime, 0)) @@ -202,19 +194,20 @@ search_utmp(char *user, char *tty) if (!msgsok) continue; /* skip ttys with msgs off */ - if (u.ut_type != USER_PROCESS) - continue; /* it's not a valid entry */ + if (u.ut_type != USER_PROCESS) + continue; /* it's not a valid entry */ ++nttys; - if (atime > bestatime) { + if (atime > bestatime) + { bestatime = atime; - (void)strcpy(tty, atty); + (void) strcpy(tty, atty); } } - - (void)close(ufd); - if (nloggedttys == 0) { - (void)fprintf(stderr, "write: %s is not logged in\n", user); + (void) close(ufd); + if (nloggedttys == 0) + { + (void) fprintf(stderr, "write: %s is not logged in\n", user); return -1; } return 0; diff --git a/util/nwpasswd.c b/util/nwpasswd.c index faf7f86..2ef6234 100644 --- a/util/nwpasswd.c +++ b/util/nwpasswd.c @@ -22,16 +22,17 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" + "-U username Username sent to server\n" + "-O objectname Object name to change, default username\n" "-t type Object type (decimal value)\n" "\n"); } - + int main(int argc, char *argv[]) @@ -39,27 +40,33 @@ main(int argc, char *argv[]) struct ncp_conn_spec *spec; struct ncp_conn *conn; char *server = NULL; + char *user_name = NULL; char *object_name = NULL; int object_type = NCP_BINDERY_USER; unsigned char ncp_key[8]; struct ncp_bindery_object user; + unsigned char buf_obj_name[50]; long err; char *str; char oldpass[200], newpass1[200], newpass2[200]; - + int opt; progname = argv[0]; - while ((opt = getopt(argc, argv, "h?S:U:t:")) != EOF) + while ((opt = getopt(argc, argv, "h?S:U:O:t:")) != EOF) { - switch(opt) { + switch (opt) + { case 'S': server = optarg; break; case 'U': + user_name = optarg; + break; + case 'O': object_name = optarg; break; case 't': @@ -74,8 +81,7 @@ main(int argc, char *argv[]) exit(1); } } - - spec = ncp_find_conn_spec(server, object_name, "", + spec = ncp_find_conn_spec(server, user_name, "", 1, getuid(), &err); if (spec == NULL) @@ -83,13 +89,29 @@ main(int argc, char *argv[]) com_err(argv[0], err, "trying to find server"); exit(1); } - + if (!object_name) + { + object_name = spec->user; + } else + { + strcpy(buf_obj_name, object_name); + object_name = buf_obj_name; + str_upper(object_name); + } spec->login_type = object_type; printf("Changing password for user %s on server %s\n", - spec->user, spec->server); + object_name, spec->server); - str = getpass("Enter old password: "); + if (object_name == spec->user) + { + str = getpass("Enter old password: "); + } else + { + char sx[80]; + sprintf(sx, "Enter password for %s: ", spec->user); + str = getpass(sx); + } if (strlen(str) >= sizeof(oldpass)) { printf("Password too long\n"); @@ -122,7 +144,6 @@ main(int argc, char *argv[]) printf("You mistype the new password, try again\n"); exit(1); } - strcpy(spec->password, oldpass); if ((conn = ncp_open(spec, &err)) == NULL) @@ -130,16 +151,26 @@ main(int argc, char *argv[]) com_err(argv[0], err, "when trying to open connection"); exit(1); } - - if ( ((err = ncp_get_encryption_key(conn, ncp_key)) != 0) - || ((err = ncp_get_bindery_object_id(conn, 1, spec->user, + if (object_name != spec->user) + { + if (!(err = ncp_get_bindery_object_id(conn, 1, spec->user, + &user)) + && !(err = ncp_login_user(conn, spec->user, oldpass))) + { + *oldpass = '\0'; + } else + { + com_err(argv[0], err, "not own password"); + } + } + if (((err = ncp_get_encryption_key(conn, ncp_key)) != 0) + || ((err = ncp_get_bindery_object_id(conn, 1, object_name, &user)) != 0) || ((err = ncp_change_login_passwd(conn, &user, ncp_key, - oldpass, newpass1)) != 0)) + oldpass, newpass1)) != 0)) { com_err(argv[0], err, "trying to change password"); } - ncp_close(conn); return 0; } diff --git a/util/nwrevoke.c b/util/nwrevoke.c index f37a400..e2a5e65 100644 --- a/util/nwrevoke.c +++ b/util/nwrevoke.c @@ -22,15 +22,15 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options] file/directory\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options] file/directory\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" - "-U username Username sent to server\n" - "-P password Use this password\n" - "-n Do not use any password\n" - "-C Don't convert password to uppercase\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" "\n" "-o object_name Name of object removed as trustee\n" "-t type Object type (decimal value)\n" @@ -58,10 +58,10 @@ main(int argc, char *argv[]) com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "h?o:t:")) != EOF) { - switch(opt) { + switch (opt) + { case 'o': object_name = optarg; str_upper(object_name); @@ -85,15 +85,13 @@ main(int argc, char *argv[]) argv[0]); goto finished; } - if (object_name == NULL) { fprintf(stderr, "%s: You must specify an object name\n", argv[0]); goto finished; } - - if (optind != argc-1) + if (optind != argc - 1) { fprintf(stderr, "%s: You must specify a directory\n", progname); @@ -107,17 +105,15 @@ main(int argc, char *argv[]) progname, object_name); goto finished; } - if (ncp_delete_trustee(conn, 0, path, o.object_id) != 0) { fprintf(stderr, "%s: Could not remove trustee rights\n", progname); goto finished; } - result = 0; - finished: + finished: ncp_close(conn); return result; } diff --git a/util/nwrights.c b/util/nwrights.c index 9bd3eda..876e4b2 100644 --- a/util/nwrights.c +++ b/util/nwrights.c @@ -22,9 +22,9 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options] file/directory\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options] file/directory\n", progname); + printf("\n" "-h Print this help text\n" "\n" "file/directory\n" @@ -45,7 +45,8 @@ main(int argc, char *argv[]) while ((opt = getopt(argc, argv, "h?")) != EOF) { - switch(opt) { + switch (opt) + { case 'h': case '?': help(); @@ -61,18 +62,15 @@ main(int argc, char *argv[]) usage(); goto finished; } - - if (optind == argc-1) + if (optind == argc - 1) { path = argv[optind]; } - if ((conn = ncp_open_mount(path, &err)) == NULL) { com_err(argv[0], err, "when initializing"); goto finished; } - if ((err = ncp_get_eff_directory_rights(conn, 0, 0, 0x8006, conn->i.volume_number, conn->i.directory_id, NULL, @@ -81,61 +79,52 @@ main(int argc, char *argv[]) com_err(argv[0], err, "when finding rights"); goto finished; } - printf("Your effective rights for %s are: [%c%c%c%c%c%c%c%c]\n", path, - ((rights & NCP_PERM_SUPER ) != 0) ? 'S' : ' ', - ((rights & NCP_PERM_READ ) != 0) ? 'R' : ' ', - ((rights & NCP_PERM_WRITE ) != 0) ? 'W' : ' ', + ((rights & NCP_PERM_SUPER) != 0) ? 'S' : ' ', + ((rights & NCP_PERM_READ) != 0) ? 'R' : ' ', + ((rights & NCP_PERM_WRITE) != 0) ? 'W' : ' ', ((rights & NCP_PERM_CREATE) != 0) ? 'C' : ' ', ((rights & NCP_PERM_DELETE) != 0) ? 'E' : ' ', ((rights & NCP_PERM_MODIFY) != 0) ? 'M' : ' ', ((rights & NCP_PERM_SEARCH) != 0) ? 'F' : ' ', - ((rights & NCP_PERM_OWNER ) != 0) ? 'A' : ' '); + ((rights & NCP_PERM_OWNER) != 0) ? 'A' : ' '); - if ((rights & NCP_PERM_SUPER ) != 0) + if ((rights & NCP_PERM_SUPER) != 0) { printf("(S): You have SUPERVISOR rights\n"); } - - if ((rights & NCP_PERM_READ ) != 0) + if ((rights & NCP_PERM_READ) != 0) { printf("(R): You may READ from files\n"); } - - if ((rights & NCP_PERM_WRITE ) != 0) + if ((rights & NCP_PERM_WRITE) != 0) { printf("(W): You may WRITE to files\n"); } - if ((rights & NCP_PERM_CREATE) != 0) { printf("(C): You may CREATE files\n"); } - if ((rights & NCP_PERM_DELETE) != 0) { printf("(E): You may ERASE files\n"); } - if ((rights & NCP_PERM_MODIFY) != 0) { printf("(M): You may MODIFY directory\n"); } - if ((rights & NCP_PERM_SEARCH) != 0) { printf("(F): You may SCAN for files\n"); } - - if ((rights & NCP_PERM_OWNER ) != 0) + if ((rights & NCP_PERM_OWNER) != 0) { printf("(A): You may change ACCESS control\n"); } - result = 0; - finished: + finished: ncp_close(conn); return result; } diff --git a/util/nwtrustee.c b/util/nwtrustee.c new file mode 100644 index 0000000..08ecab7 --- /dev/null +++ b/util/nwtrustee.c @@ -0,0 +1,159 @@ +/* + * nwtrustee.c + * + * List Trustees + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + +#include +#include +#include +#include +#include "ncplib.h" + +static char *progname; + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [options] pattern\n", progname); + return; +} + +static void +help(void) +{ + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" + "-h Print this help text\n" + "-S server Server name to be used\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" + "\n" + "-l volumeid Volume id to be searched\n" + "-L volname Volume name insteed of id\n" + "-o objectid Object id\n" + "-O objname Object name ( type must be specified )\n" + "-t type Object type\n" + "-v Verbose listing\n" + "\n"); +} + +int +fromhex(char c) +{ + c -= '0'; + if (c > 9) + c = toupper(c) + '0' - 'A' + 10; + return c & 15; +} + +int +main(int argc, char **argv) +{ + struct ncp_conn *conn; + struct ncp_bindery_object bobj; + + char ppath[256]; + char *p; + long err; + int opt, vid, type = 1; + int verbose = 0; + __u32 oid = 1; + __u16 nextp, trust; + + progname = argv[0]; + + if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) + { + com_err(argv[0], err, "when initializing"); + return 1; + } + while ((opt = getopt(argc, argv, "h?vl:L:o:O:t:")) != EOF) + { + switch (opt) + { + case 'h': + case '?': + help(); + exit(1); + case 'l': + vid = atoi(optarg); + break; + case 'L': + if (ncp_get_volume_number(conn, optarg, &vid)) + { + ncp_close(conn); + return 1; + } + break; + + case 'o': + oid = 0; + while (*optarg) + { + oid = (oid << 4) | fromhex(*optarg); + optarg++; + } + break; + case 'O': + for (p = optarg; *p != 0; p++) + { + *p = toupper(*p); + } + if (ncp_get_bindery_object_id(conn, type, optarg, &bobj)) + { + ncp_close(conn); + return 1; + } + oid = bobj.object_id; + break; + case 'v': + verbose = 1; + break; + case 't': + type = atoi(optarg); + break; + default: + usage(); + exit(1); + } + } + + if (optind < argc) + { + usage(); + exit(1); + } + nextp = 0; + while (!ncp_get_trustee(conn, oid, vid, ppath, &trust, &nextp)) + { + if (!nextp) + break; + printf("%s ", ppath); + if (verbose) + { + strcpy(ppath, "[ R W O C E A F M ]"); + p = ppath + 2; + for (type = 1; type < 256; type <<= 1) + { + if (!(trust & type)) + *p = ' '; + p += 2; + } + printf("%s\n", ppath); + } else + { + printf("%X\n", trust); + } + } + + + ncp_close(conn); + return 0; +} diff --git a/util/nwuserlist.c b/util/nwuserlist.c index bca22e2..43ad78c 100644 --- a/util/nwuserlist.c +++ b/util/nwuserlist.c @@ -34,9 +34,9 @@ str_trim_right(char *s, char c) static void help(void) { - printf("\n"); - printf("usage: %s [options]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" "-h Print this help text\n" "-S server Server name to be used\n" "-a Print Station's addr\n" @@ -62,10 +62,9 @@ main(int argc, char **argv) com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "h?a")) != EOF) { - switch(opt) + switch (opt) { case 'h': case '?': @@ -86,7 +85,6 @@ main(int argc, char **argv) ncp_close(conn); return 1; } - if (isatty(1)) { if (print_addr == 0) @@ -97,8 +95,7 @@ main(int argc, char **argv) "Conn", "User name", "Login time"); - } - else + } else { printf("\n%-6s%-21s%-27s%-12s\n" "---------------------------------------------" @@ -109,7 +106,6 @@ main(int argc, char **argv) "Login time"); } } - for (i = 1; i <= info.MaximumServiceConnections; i++) { char name[49]; @@ -127,17 +123,16 @@ main(int argc, char **argv) { struct sockaddr_ipx addr; __u8 conn_type; - + memset(&addr, 0, sizeof(addr)); ncp_get_internet_address(conn, i, &addr, &conn_type); ipx_print_saddr(&addr); printf(" "); } - printf("%s", ctime(&login_time)); } - finished: + finished: ncp_close(conn); return 0; } diff --git a/util/nwvolinfo.c b/util/nwvolinfo.c new file mode 100644 index 0000000..b00de3e --- /dev/null +++ b/util/nwvolinfo.c @@ -0,0 +1,119 @@ +/* + * nwvolinfo.c + * + * Volume Information + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + +#include +#include +#include +#include +#include "ncplib.h" + +static char *progname; + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [options] pattern\n", progname); + return; +} + +static void +help(void) +{ + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" + "-h Print this help text\n" + "-S server Server name to be used\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" + "\n" + "-v volume volume name\n" + "-N Numeric format\n" + "\n"); +} + +int +main(int argc, char **argv) +{ + struct ncp_conn *conn; + struct ncp_volume_info o; + + char *volname = "SYS"; + long err; + int opt; + int numk; + __u16 type = 0; + + progname = argv[0]; + + if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) + { + com_err(argv[0], err, "when initializing"); + return 1; + } + while ((opt = getopt(argc, argv, "h?Nv:")) != EOF) + { + switch (opt) + { + case 'h': + case '?': + help(); + exit(1); + case 'N': + type = 1; + break; + case 'v': + volname = optarg; + break; + default: + usage(); + exit(1); + } + } + + if (optind < argc) + { + usage(); + exit(1); + } + if (ncp_get_volume_number(conn, volname, &opt)) + { + exit(1); + } + if (ncp_get_volume_info_with_number(conn, opt, &o)) + { + exit(1); + } + numk = o.sectors_per_block / 2; + o.free_blocks += o.purgeable_blocks; + if (type) + { + printf("%d %d %d %d %d %d\n", + o.total_blocks * numk, + o.free_blocks * numk, + o.purgeable_blocks * numk, + o.not_yet_purgeable_blocks * numk, + o.total_dir_entries, + o.available_dir_entries); + } else + { + printf("Total : %dK\n", o.total_blocks * numk); + printf("Free : %dK\n", o.free_blocks * numk); + printf("Purgable : %dK\n", o.purgeable_blocks * numk); + printf("No Purg. : %dK\n", o.not_yet_purgeable_blocks * numk); + printf("Dirs : %d\n", o.total_dir_entries); + printf("Free dirs: %d\n", o.available_dir_entries); + } + + + ncp_close(conn); + return 0; +} diff --git a/util/pqlist.c b/util/pqlist.c index dd5215c..26ad308 100644 --- a/util/pqlist.c +++ b/util/pqlist.c @@ -29,18 +29,15 @@ main(int argc, char **argv) com_err(argv[0], err, "when initializing"); return 1; } - if (argc > 2) { fprintf(stderr, "usage: %s [options] [pattern]\n", argv[0]); return 1; } - if (argc == 2) { pattern = argv[1]; } - for (p = pattern; *p != '\0'; p++) { *p = toupper(*p); @@ -55,7 +52,6 @@ main(int argc, char **argv) "Print queue name", "Queue ID"); } - q.object_id = 0xffffffff; while (ncp_scan_bindery_object(conn, q.object_id, @@ -63,14 +59,13 @@ main(int argc, char **argv) { found = 1; printf("%-52s", q.object_name); - printf("%08X\n", (unsigned int)q.object_id); + printf("%08X\n", (unsigned int) q.object_id); } if ((found == 0) && (isatty(1))) { printf("No queues found\n"); } - ncp_close(conn); return 0; } diff --git a/util/pserver.c b/util/pserver.c index 203ff38..83f82bf 100644 --- a/util/pserver.c +++ b/util/pserver.c @@ -18,7 +18,8 @@ #include #include "ncplib.h" -struct nw_queue { +struct nw_queue +{ struct ncp_conn *conn; char queue_name[NCP_BINDERY_NAME_LEN]; @@ -34,11 +35,11 @@ static int term_request; static char *progname; static int -init_queue(struct ncp_conn *conn, char *queue_name, - char *command, struct nw_queue *q); + init_queue(struct ncp_conn *conn, char *queue_name, + char *command, struct nw_queue *q); static int -poll_queue(struct nw_queue *q); + poll_queue(struct nw_queue *q); static void usage(void) @@ -50,20 +51,20 @@ usage(void) static void help(void) { - printf("\n"); - printf("usage: %s [options]\n", progname); - printf("\n" + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" "-S server Server name to be used\n" - "-U username Print Server name sent to server\n" - "-P password Use this password\n" - "-n Do not use any password\n" - "-C Don't convert password to uppercase\n" - "-q queue name Name of the printing queue to use\n" + "-U username Print Server name sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" + "-q queue name Name of the printing queue to use\n" "-c command Name of print command, default: 'lpr'\n" "-j job type Type of job (Form number) to service\n" "-t timeout Polling interval, default: 30 sec\n" "-d Debug: don't daemonize\n" - "-h print this help text\n" + "-h print this help text\n" "\n"); } @@ -74,9 +75,9 @@ help(void) static void terminate_handler() { - signal(SIGTERM,terminate_handler); + signal(SIGTERM, terminate_handler); signal(SIGINT, terminate_handler); - term_request=1; + term_request = 1; } /* Daemon_init is taken from Stevens, Adv. Unix programming */ @@ -88,12 +89,10 @@ daemon_init(void) if ((pid = fork()) < 0) { return -1; - } - else if (pid != 0) + } else if (pid != 0) { exit(0); /* parent vanishes */ } - /* child process */ setsid(); chdir("/"); @@ -124,7 +123,7 @@ main(int argc, char *argv[]) for (i = 1; i < argc; i += 1) { - if ( (strcmp(argv[i], "-h") == 0) + if ((strcmp(argv[i], "-h") == 0) || (strcmp(argv[i], "-?") == 0)) { help(); @@ -146,14 +145,12 @@ main(int argc, char *argv[]) daemon_init(); openlog("pserver", LOG_PID, LOG_LPR); } - if ((conn = ncp_initialize_as(&argc, argv, 1, NCP_BINDERY_PSERVER, &err)) == NULL) { com_err(argv[0], err, "when initializing"); return 1; } - while ((opt = getopt(argc, argv, "q:c:j:t:dh")) != EOF) { switch (opt) @@ -186,7 +183,6 @@ main(int argc, char *argv[]) usage(); return -1; } - memzero(q); if (queue_name == NULL) @@ -194,28 +190,25 @@ main(int argc, char *argv[]) fprintf(stderr, "You must specify a queue\n"); return 1; } - if (init_queue(conn, queue_name, command, &q) != 0) { perror("Could not init queue"); ncp_close(conn); return 1; } - q.job_type = job_type; term_request = 0; - signal(SIGTERM,terminate_handler); + signal(SIGTERM, terminate_handler); signal(SIGINT, terminate_handler); while (1) { - if ( (poll_queue(&q) != 0) + if ((poll_queue(&q) != 0) && (term_request == 0)) { continue; } - if (term_request != 0) { break; @@ -239,14 +232,13 @@ init_queue(struct ncp_conn *conn, char *queue_name, char *command, q->conn = conn; q->command = command; - + if (ncp_get_bindery_object_id(conn, NCP_BINDERY_PQUEUE, queue_name, &obj) != 0) { fprintf(stderr, "Queue %s not found\n", queue_name); return -1; } - q->queue_id = obj.object_id; memcpy(q->queue_name, obj.object_name, sizeof(q->queue_name)); @@ -258,26 +250,26 @@ init_queue(struct ncp_conn *conn, char *queue_name, char *command, } return 0; } - + void build_command(struct nw_queue *q, struct queue_job *j, char *target, int target_size) { char *s = q->command; - char *target_end = target+target_size; + char *target_end = target + target_size; void add_string(char *s) + { + int len = strlen(s); + if (target + len + 1 > target_end) { - int len = strlen(s); - if (target + len + 1 > target_end) - { - len = target_end - target - 1; - } - strncpy(target, s, len); - target += len; + len = target_end - target - 1; } - + strncpy(target, s, len); + target += len; + } + memset(target, 0, target_size); @@ -290,8 +282,7 @@ build_command(struct nw_queue *q, struct queue_job *j, s += 1; continue; } - - switch (*(s+1)) + switch (*(s + 1)) { case '%': *target = '%'; @@ -305,8 +296,7 @@ build_command(struct nw_queue *q, struct queue_job *j, == 0) { user = u.object_name; - } - else + } else { user = "*UNKNOWN USER*"; } @@ -314,7 +304,7 @@ build_command(struct nw_queue *q, struct queue_job *j, } default: *target = '%'; - *(target+1) = *(s+1); + *(target + 1) = *(s + 1); target += 2; } s += 2; @@ -322,7 +312,7 @@ build_command(struct nw_queue *q, struct queue_job *j, } - + static int poll_queue(struct nw_queue *q) @@ -337,19 +327,16 @@ poll_queue(struct nw_queue *q) /* No job for us */ return 0; } - if (pipe(fd) < 0) { syslog(LOG_ERR, "pipe error: %m"); goto fail; } - if ((pid = fork()) < 0) { syslog(LOG_ERR, "fork error: %m"); goto fail; } - if (pid > 0) { /* parent */ @@ -375,8 +362,7 @@ poll_queue(struct nw_queue *q) { syslog(LOG_ERR, "waitpid: %m\n"); } - } - else + } else { /* child */ @@ -394,7 +380,6 @@ poll_queue(struct nw_queue *q) } close(fd[0]); } - build_command(q, &job, command, sizeof(command)); execl("/bin/sh", "sh", "-c", command, NULL); @@ -403,10 +388,10 @@ poll_queue(struct nw_queue *q) exit(1); } - ncp_finish_servicing_job(q->conn, q->queue_id, job.j.JobNumber,0); - return 1; + ncp_finish_servicing_job(q->conn, q->queue_id, job.j.JobNumber, 0); + return 1; - fail: + fail: ncp_abort_servicing_job(q->conn, q->queue_id, job.j.JobNumber); /* We tell that we did not have a job to avoid overloading when something's wrong */ diff --git a/util/slist.c b/util/slist.c index 9c2a773..184578f 100644 --- a/util/slist.c +++ b/util/slist.c @@ -30,12 +30,10 @@ main(int argc, char *argv[]) printf("usage: %s [pattern]\n", argv[0]); exit(1); } - if (argc == 2) { pattern = argv[1]; } - for (p = pattern; *p != '\0'; p++) { *p = toupper(*p); @@ -46,7 +44,6 @@ main(int argc, char *argv[]) com_err(argv[0], err, "in ncp_open"); exit(1); } - if (isatty(1)) { printf("\n%-52s%-10s%-12s\n" @@ -56,7 +53,6 @@ main(int argc, char *argv[]) "Network", "Node Address"); } - obj.object_id = 0xffffffff; while (ncp_scan_bindery_object(conn, obj.object_id, @@ -65,7 +61,7 @@ main(int argc, char *argv[]) { struct nw_property prop; struct prop_net_address *naddr - = (struct prop_net_address *)∝ + = (struct prop_net_address *) ∝ found = 1; @@ -86,7 +82,5 @@ main(int argc, char *argv[]) { printf("No servers found\n"); } - ncp_close(conn); } -