From 011a5107c537a699e2df0270a10c3065d9c4b119 Mon Sep 17 00:00:00 2001 From: ncpfs archive import Date: Tue, 28 Apr 2026 20:39:58 +0200 Subject: [PATCH] Import ncpfs 2.0.3 --- .downloads/ncpfs-2.0.3.tgz | Bin 0 -> 128523 bytes Changes | 18 +- FAQ | 7 - Makefile | 7 +- README | 6 + ipxdump/ipxparse.c | 49 +++ kernel-1.2/linux/ncp.h | 6 + kernel-1.2/linux/ncp_fs_sb.h | 2 + kernel-1.2/src/dir.c | 91 ++++-- kernel-1.2/src/ncplib_kernel.c | 114 ++++--- kernel-2.0/README | 18 -- kernel-2.0/lfn-2.0.7.diff | 498 ----------------------------- man/Makefile | 2 +- man/nwfsinfo.1 | 52 +++ man/nwuserlist.1 | 93 ++++++ ncpfs-2.0.2.lsm => ncpfs-2.0.3.lsm | 10 +- util/Makefile | 37 ++- util/com_err/Makefile | 2 +- util/ncplib.c | 164 ++++++++-- util/ncplib.h | 50 +++ util/ncplib_err.et | 5 +- util/ncpmount.c | 3 +- util/ncptest.c | 54 +++- util/npasswd.c | 3 +- util/nprint.c | 5 +- util/nsend.c | 2 +- util/nwbocreate.c | 5 +- util/nwbols.c | 5 +- util/nwboprops.c | 5 +- util/nwborm.c | 5 +- util/nwbpadd.c | 5 +- util/nwbpcreate.c | 5 +- util/nwbprm.c | 5 +- util/nwbpvalues.c | 5 +- util/nwfsinfo.c | 88 ++++- util/nwgrant.c | 5 +- util/nwrevoke.c | 5 +- util/nwuserlist.c | 143 +++++++++ util/pqlist.c | 2 +- util/pserver.c | 2 +- 40 files changed, 922 insertions(+), 661 deletions(-) create mode 100644 .downloads/ncpfs-2.0.3.tgz delete mode 100644 kernel-2.0/README delete mode 100644 kernel-2.0/lfn-2.0.7.diff create mode 100644 man/nwfsinfo.1 create mode 100644 man/nwuserlist.1 rename ncpfs-2.0.2.lsm => ncpfs-2.0.3.lsm (76%) create mode 100644 util/nwuserlist.c diff --git a/.downloads/ncpfs-2.0.3.tgz b/.downloads/ncpfs-2.0.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..9e48cbeb5183dffb68c76554dc2cc45760740104 GIT binary patch literal 128523 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�A53(8uwZNJM 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%0A< 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 ncpfs-2.0.3 +- Removed the kernel-2.0 directory. Linus took the patch into 2.0.8. + So, if you want to use long file name support, upgrade to Linux + kernel version 2.0.8. +- Applied the lfn patch to the kernel-1.2 module with some light + testing. If you experience problems, tell it to me, and use the + ncpfs-2.0.2 kernel module, or upgrade to Linux 2.0.8. +- Added unencrypted login when no crypt key is returned. +- Hopefully improved error messages a bit +- Added some values to ipxparse +- For ELF systems, moved ncplib to /lib/libncp.so.1.x. This saves + about 1MB of disk space. As ncpfs grows, the saving will + increase. Please look at the Makefile to enable this. +- Enhanced nwfsinfo a bit. (Even with a manpage!) +- Added nwuserlist. + ncpfs-2.0.1 -> ncpfs-2.0.2 - Added some values to ipxparse. - Added a patch against 2.0.7 for long file names support. I did not @@ -133,4 +149,4 @@ ncpfs-0.12 -> ncpfs-0.13 - support for automatic loading of ncpfs.o by kerneld. Thanks to Steven N. Hirsch . - A subtle problem in the read routines has been removed by Uwe Bonnes - . Thanks a lot. \ No newline at end of file + . Thanks a lot. diff --git a/FAQ b/FAQ index cdaf2a1..904c800 100644 --- a/FAQ +++ b/FAQ @@ -37,13 +37,6 @@ packet signatures on the 4.1 server, as ncpfs does not support them. ------------------------------------------------------------------------------- -Q: Does ncpfs support long file names, using the OS/2 namespace? - -Yes. But you will have to patch your kernel. Look at the file -kernel-2.0/README for more information. - -------------------------------------------------------------------------------- - Q: When I re-export ncpfs-mounted directories via nfs, I get messages like 'pwd: cannot get current directory', and other strange things happen to the nfs clients. What's wrong? diff --git a/Makefile b/Makefile index bec5406..a82502c 100644 --- a/Makefile +++ b/Makefile @@ -2,12 +2,15 @@ # Makefile for the linux ncp-filesystem routines. # -VERSION = 2.0.2 +VERSION = 2.0.3 # If you are using kerneld to autoload ncp support, # uncomment this (kerneld is in linux since about 1.3.57): #KERNELD = -DHAVE_KERNELD +# If your system is ELF, please uncomment the following line: +#HAVE_ELF=yes + TOPDIR = $(shell pwd) BINDIR = /usr/local/bin SBINDIR = /sbin @@ -21,7 +24,7 @@ SUBDIRS += kernel-1.2/src INCLUDES = -I$(TOPDIR)/kernel-1.2 endif -export INCLUDES BINDIR INTERM_BINDIR SBINDIR KERNELD VERSION +export INCLUDES BINDIR INTERM_BINDIR SBINDIR KERNELD VERSION HAVE_ELF all: for i in $(SUBDIRS); do make -C $$i all; done diff --git a/README b/README index 22aa684..4d0d3f0 100644 --- a/README +++ b/README @@ -39,6 +39,12 @@ ncpfs. If you are running kerneld, please uncomment the corresponding line in the Makefile to reflect this. +If your system is ELF, please enable the use of the shared ncp-library +in the Makefile. This will save at least 1MB of disk space. + +After you adapted your Makefile, type 'make' and, as root, 'make install'. + + HELP In the meantime my mail volume has grown considerably, so the response diff --git a/ipxdump/ipxparse.c b/ipxdump/ipxparse.c index 8e3e890..10726ce 100644 --- a/ipxdump/ipxparse.c +++ b/ipxdump/ipxparse.c @@ -351,6 +351,10 @@ void handle_ncp (struct sockaddr_ipx *source, switch(rq->function) { + case 18: + printf("fn: %-3d\n", rq->function); + printf("Get Volume Info with Number\n"); + break; case 20: printf("fn: %-3d\n", rq->function); printf("Get File Server Date and Time\n"); @@ -381,6 +385,9 @@ void handle_ncp (struct sockaddr_ipx *source, case 01: printf("Get Directory Path\n"); break; + case 02: + printf("Scan Directory Information\n"); + break; case 03: printf("Get Effective Directory Rights\n"); break; @@ -390,6 +397,9 @@ void handle_ncp (struct sockaddr_ipx *source, case 06: printf("Get Volume Name\n"); break; + case 10: + printf("Create directory\n"); + break; case 18: printf("Allocate Permanent Dir Handle\n"); break; @@ -399,6 +409,9 @@ void handle_ncp (struct sockaddr_ipx *source, case 21: printf("Get Volume Info with handle\n"); break; + case 39: + printf("Add ext. Trustee to Dir or File\n"); + break; case 48: printf("Get Name Space Directory Entry\n"); break; @@ -426,21 +439,48 @@ void handle_ncp (struct sockaddr_ipx *source, case 28: printf("Get Connection Information\n"); break; + case 50: + printf("Create Bindery Object\n"); + break; case 53: printf("Get Bindery Object ID\n"); break; + case 54: + printf("Get Bindery Object Name\n"); + break; case 55: printf("Scan Bindery Object\n"); break; + case 57: + printf("Create Property\n"); + break; + case 59: + printf("Change Property Security\n"); + break; + case 60: + printf("Scan Property\n"); + break; case 61: printf("Read Property Value\n"); break; case 62: printf("Write Property Value\n"); break; + case 65: + printf("Add Bindery Object to Set\n"); + break; + case 67: + printf("Is Bindery Object in Set\n"); + break; case 70: printf("Get Bindery Access Level\n"); break; + case 72: + printf("Get Bindery Object Access Level\n"); + break; + case 75: + printf("Keyed change password\n"); + break; } data += 3; @@ -476,6 +516,10 @@ void handle_ncp (struct sockaddr_ipx *source, printf("fn: %-3d\n", rq->function); printf("Close File\n"); break; + case 67: + printf("fn: %-3d\n", rq->function); + printf("Create File\n"); + break; case 72: printf("fn: %-3d\n", rq->function); printf("Read from File\n"); @@ -488,6 +532,11 @@ void handle_ncp (struct sockaddr_ipx *source, printf("fn: %-3d\n", rq->function); printf("Set File Time Date Stamp\n"); break; + case 76: + printf("fn: %-3d\n", rq->function); + printf("Open File (old)\n"); + break; + case 87: printf("fn: %-3d, subfn: %-3d\n", rq->function, data[0]); diff --git a/kernel-1.2/linux/ncp.h b/kernel-1.2/linux/ncp.h index ab3f653..3d5286e 100644 --- a/kernel-1.2/linux/ncp.h +++ b/kernel-1.2/linux/ncp.h @@ -116,6 +116,12 @@ struct ncp_file_info { __u16 update_time; }; +/* Defines for Name Spaces */ +#define NW_NS_DOS 0 +#define NW_NS_MAC 1 +#define NW_NS_NFS 2 +#define NW_NS_FTAM 3 +#define NW_NS_OS2 4 /* Defines for ReturnInformationMask */ #define RIM_NAME (0x0001L) diff --git a/kernel-1.2/linux/ncp_fs_sb.h b/kernel-1.2/linux/ncp_fs_sb.h index 26e76ac..36fd36b 100644 --- a/kernel-1.2/linux/ncp_fs_sb.h +++ b/kernel-1.2/linux/ncp_fs_sb.h @@ -21,6 +21,8 @@ struct ncp_server { interest for us later, so we store it completely. */ + __u8 name_space[NCP_NUMBER_OF_VOLUMES]; + struct file *ncp_filp; /* File pointer to ncp socket */ struct file *wdog_filp; /* File pointer to wdog socket */ void *data_ready; /* The wdog socket gets a new diff --git a/kernel-1.2/src/dir.c b/kernel-1.2/src/dir.c index b1a7f77..56f86e0 100644 --- a/kernel-1.2/src/dir.c +++ b/kernel-1.2/src/dir.c @@ -97,6 +97,20 @@ str_lower(char *name) } } +static inline int +ncp_namespace(struct inode *i) +{ + struct ncp_server *server = NCP_SERVER(i); + struct nw_info_struct *info = NCP_ISTRUCT(i); + return server->name_space[info->volNumber]; +} + +static inline int +ncp_preserve_case(struct inode *i) +{ + return (ncp_namespace(i) == NW_NS_OS2); +} + static struct file_operations ncp_dir_operations = { NULL, /* lseek - default */ ncp_dir_read, /* read - bad */ @@ -133,7 +147,7 @@ struct inode_operations ncp_dir_inode_operations = { /* Here we encapsulate the inode number handling that depends upon the * mount mode: When we mount a complete server, the memory address of * the npc_inode_info is used as an inode. When only a single volume - * is mounted, then the DosDirNum is used as the inode number. As this + * is mounted, then the dirEntNum is used as the inode number. As this * is unique for the complete volume, this should enable the NFS * exportability of a ncpfs-mounted volume. */ @@ -148,7 +162,7 @@ inline ino_t ncp_info_ino(struct ncp_server *server, struct ncp_inode_info *info) { return ncp_single_volume(server) - ? info->finfo.i.DosDirNum : (ino_t)info; + ? info->finfo.i.dirEntNum : (ino_t)info; } static inline int @@ -351,9 +365,12 @@ ncp_readdir(struct inode *inode, struct file *filp, c_last_returned_index = 0; index = 0; - for (i = 0; i < c_size; i++) + if (!ncp_preserve_case(inode)) { - str_lower(c_entry[i].i.entryName); + for (i = 0; i < c_size; i++) + { + str_lower(c_entry[i].i.entryName); + } } } } @@ -375,7 +392,7 @@ ncp_readdir(struct inode *inode, struct file *filp, if (ncp_single_volume(server)) { - ino = (ino_t)(entry->i.DosDirNum); + ino = (ino_t)(entry->i.dirEntNum); } else { @@ -671,7 +688,7 @@ ncp_init_root(struct ncp_server *server) root->finfo.opened = 0; i->attributes = aDIR; i->dataStreamSize = 1024; - i->DosDirNum = 0; + i->dirEntNum = i->DosDirNum = 0; i->volNumber = NCP_NUMBER_OF_VOLUMES+1; /* illegal volnum */ ncp_date_unix2dos(0, &(i->creationTime), &(i->creationDate)); ncp_date_unix2dos(0, &(i->modifyTime), &(i->modifyDate)); @@ -748,7 +765,7 @@ ncp_find_dir_inode(struct inode *dir, const char *name) do { - if ( (result->dir->finfo.i.DosDirNum == dir_info->DosDirNum) + if ( (result->dir->finfo.i.dirEntNum == dir_info->dirEntNum) && (result->dir->finfo.i.volNumber == dir_info->volNumber) && (strcmp(result->finfo.i.entryName, name) == 0) /* The root dir is never looked up using this @@ -776,7 +793,7 @@ ncp_lookup(struct inode *dir, const char *__name, int len, struct ncp_server *server; struct ncp_inode_info *result_info; int found_in_cache; - + int down_case = 0; char name[len+1]; *result = NULL; @@ -887,20 +904,26 @@ ncp_lookup(struct inode *dir, const char *__name, int len, if (found_in_cache == 0) { int res; - str_upper(name); DDPRINTK("ncp_lookup: do_lookup on %s/%s\n", NCP_ISTRUCT(dir)->entryName, name); if (ncp_is_server_root(dir)) { + str_upper(name); + down_case = 1; res = ncp_lookup_volume(server, name, &(finfo.i)); } else { + if (!ncp_preserve_case(dir)) + { + str_upper(name); + down_case = 1; + } res = ncp_obtain_info(server, NCP_ISTRUCT(dir)->volNumber, - NCP_ISTRUCT(dir)->DosDirNum, + NCP_ISTRUCT(dir)->dirEntNum, name, &(finfo.i)); } if (res != 0) @@ -912,7 +935,11 @@ ncp_lookup(struct inode *dir, const char *__name, int len, } finfo.opened = 0; - str_lower(finfo.i.entryName); + + if (down_case != 0) + { + str_lower(finfo.i.entryName); + } if (!(*result = ncp_iget(dir, &finfo))) { @@ -949,7 +976,11 @@ ncp_create(struct inode *dir, const char *name, int len, int mode, strncpy(_name, name, len); _name[len] = '\0'; - str_upper(_name); + + if (!ncp_preserve_case(dir)) + { + str_upper(_name); + } lock_super(dir->i_sb); if (ncp_open_create_file_or_subdir(NCP_SERVER(dir), @@ -966,7 +997,11 @@ ncp_create(struct inode *dir, const char *name, int len, int mode, ncp_invalid_dir_cache(dir); - str_lower(finfo.i.entryName); + if (!ncp_preserve_case(dir)) + { + str_lower(finfo.i.entryName); + } + finfo.access = O_RDWR; if (!(*result = ncp_iget(dir, &finfo)) < 0) @@ -1000,7 +1035,11 @@ ncp_mkdir(struct inode *dir, const char *name, int len, int mode) strncpy(_name, name, len); _name[len] = '\0'; - str_upper(_name); + + if (!ncp_preserve_case(dir)) + { + str_upper(_name); + } if (!dir || !S_ISDIR(dir->i_mode)) { @@ -1058,7 +1097,11 @@ ncp_rmdir(struct inode *dir, const char *name, int len) strncpy(_name, name, len); _name[len] = '\0'; - str_upper(_name); + + if (!ncp_preserve_case(dir)) + { + str_upper(_name); + } if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir), NCP_ISTRUCT(dir), @@ -1101,7 +1144,11 @@ ncp_unlink(struct inode *dir, const char *name, int len) { strncpy(_name, name, len); _name[len] = '\0'; - str_upper(_name); + + if (!ncp_preserve_case(dir)) + { + str_upper(_name); + } if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir), NCP_ISTRUCT(dir), @@ -1155,11 +1202,19 @@ ncp_rename(struct inode *old_dir, const char *old_name, int old_len, strncpy(_old_name, old_name, old_len); _old_name[old_len] = '\0'; - str_upper(_old_name); + + if (!ncp_preserve_case(old_dir)) + { + str_upper(_old_name); + } strncpy(_new_name, new_name, new_len); _new_name[new_len] = '\0'; - str_upper(_new_name); + + if (!ncp_preserve_case(new_dir)) + { + str_upper(_new_name); + } res = ncp_ren_or_mov_file_or_subdir(NCP_SERVER(old_dir), NCP_ISTRUCT(old_dir), _old_name, diff --git a/kernel-1.2/src/ncplib_kernel.c b/kernel-1.2/src/ncplib_kernel.c index 09e0ef9..d987b6e 100644 --- a/kernel-1.2/src/ncplib_kernel.c +++ b/kernel-1.2/src/ncplib_kernel.c @@ -188,25 +188,6 @@ ncp_get_volume_info_with_number(struct ncp_server *server, int n, return 0; } -int -ncp_get_volume_number(struct ncp_server *server, const char *name, int *target) -{ - int result; - - ncp_init_request_s(server, 5); - ncp_add_pstring(server, name); - - if ((result = ncp_request(server, 22)) != 0) - { - ncp_unlock_server(server); - return result; - } - - *target = ncp_reply_byte(server, 0); - ncp_unlock_server(server); - return 0; -} - int ncp_close_file(struct ncp_server *server, const char *file_id) { @@ -282,8 +263,8 @@ ncp_obtain_info(struct ncp_server *server, ncp_init_request(server); ncp_add_byte(server, 6); /* subfunction */ - ncp_add_byte(server, 0); /* dos name space */ - ncp_add_byte(server, 0); /* dos name space as dest */ + ncp_add_byte(server, server->name_space[vol_num]); + ncp_add_byte(server, server->name_space[vol_num]); ncp_add_word(server, 0xff); /* get all */ ncp_add_dword(server, RIM_ALL); ncp_add_handle_path(server, vol_num, dir_base, 1, path); @@ -299,20 +280,57 @@ ncp_obtain_info(struct ncp_server *server, return 0; } +static inline int +ncp_has_os2_namespace(struct ncp_server *server, __u8 volume) +{ + int result; + __u8 *namespace; + __u16 no_namespaces; + + ncp_init_request(server); + ncp_add_byte(server, 24); /* Subfunction: Get Name Spaces Loaded */ + ncp_add_word(server, 0); + ncp_add_byte(server, volume); + + if ((result = ncp_request(server, 87)) != 0) + { + ncp_unlock_server(server); + return 0; + } + + no_namespaces = ncp_reply_word(server, 0); + namespace = ncp_reply_data(server, 2); + + while (no_namespaces > 0) + { + DPRINTK("get_namespaces: found %d on %d\n", *namespace,volume); + + if (*namespace == 4) + { + DPRINTK("get_namespaces: found OS2\n"); + ncp_unlock_server(server); + return 1; + } + namespace += 1; + no_namespaces -= 1; + } + ncp_unlock_server(server); + return 0; +} + int ncp_lookup_volume(struct ncp_server *server, char *volname, struct nw_info_struct *target) { int result; - __u8 vol_num; - __u32 dir_base; + int volnum; DPRINTK("ncp_lookup_volume: looking up vol %s\n", volname); ncp_init_request(server); ncp_add_byte(server, 22); /* Subfunction: Generate dir handle */ - ncp_add_byte(server, 0); /* DOS name space */ + ncp_add_byte(server, 0); /* DOS namespace */ ncp_add_byte(server, 0); /* reserved */ ncp_add_byte(server, 0); /* reserved */ ncp_add_byte(server, 0); /* reserved */ @@ -329,20 +347,19 @@ ncp_lookup_volume(struct ncp_server *server, return result; } - dir_base = ncp_reply_dword(server, 4); - vol_num = ncp_reply_byte(server, 8); + memset(target, 0, sizeof(*target)); + target->DosDirNum = target->dirEntNum = ncp_reply_dword(server, 4); + target->volNumber = volnum = ncp_reply_byte(server, 8); ncp_unlock_server(server); - if ((result = ncp_obtain_info(server, vol_num, dir_base, NULL, - target)) != 0) - { - return result; - } + server->name_space[volnum] = ncp_has_os2_namespace(server,volnum)?4:0; - DPRINTK("ncp_lookup_volume: attribs = %X\n", target->attributes); + DPRINTK("lookup_vol: namespace[%d] = %d\n", + volnum, server->name_space[volnum]); target->nameLen = strlen(volname); strcpy(target->entryName, volname); + target->attributes = aDIR; return 0; } @@ -356,14 +373,14 @@ ncp_modify_file_or_subdir_dos_info(struct ncp_server *server, ncp_init_request(server); ncp_add_byte(server, 7); /* subfunction */ - ncp_add_byte(server, 0); /* dos name space */ + ncp_add_byte(server, server->name_space[file->volNumber]); ncp_add_byte(server, 0); /* reserved */ ncp_add_word(server, 0x8006); /* search attribs: all */ ncp_add_dword(server, info_mask); ncp_add_mem(server, info, sizeof(*info)); ncp_add_handle_path(server, file->volNumber, - file->DosDirNum, 1, NULL); + file->dirEntNum, 1, NULL); if ((result = ncp_request(server, 87)) != 0) { @@ -383,11 +400,11 @@ ncp_del_file_or_subdir(struct ncp_server *server, ncp_init_request(server); ncp_add_byte(server, 8); /* subfunction */ - ncp_add_byte(server, 0); /* dos name space */ + ncp_add_byte(server, server->name_space[dir->volNumber]); ncp_add_byte(server, 0); /* reserved */ ncp_add_word(server, 0x8006); /* search attribs: all */ ncp_add_handle_path(server, dir->volNumber, - dir->DosDirNum, 1, name); + dir->dirEntNum, 1, name); if ((result = ncp_request(server, 87)) != 0) { @@ -420,15 +437,16 @@ ncp_open_create_file_or_subdir(struct ncp_server *server, { int result; __u16 search_attribs = 0x0006; + __u8 volume = (dir != NULL) ? dir->volNumber : target->i.volNumber; if ((create_attributes & aDIR) != 0) { - search_attribs |= 0x8000; - } + search_attribs |= 0x8000; +} ncp_init_request(server); ncp_add_byte(server, 1); /* subfunction */ - ncp_add_byte(server, 0); /* dos name space */ + ncp_add_byte(server, server->name_space[volume]); ncp_add_byte(server, open_create_mode); ncp_add_word(server, search_attribs); ncp_add_dword(server, RIM_ALL); @@ -439,13 +457,11 @@ ncp_open_create_file_or_subdir(struct ncp_server *server, if (dir != NULL) { - ncp_add_handle_path(server, dir->volNumber, - dir->DosDirNum, 1, name); + ncp_add_handle_path(server, volume, dir->dirEntNum, 1, name); } else { - ncp_add_handle_path(server, - target->i.volNumber, target->i.DosDirNum, + ncp_add_handle_path(server, volume, target->i.dirEntNum, 1, NULL); } @@ -481,9 +497,9 @@ ncp_initialize_search(struct ncp_server *server, ncp_init_request(server); ncp_add_byte(server, 2); /* subfunction */ - ncp_add_byte(server, 0); /* dos name space */ + ncp_add_byte(server, server->name_space[dir->volNumber]); ncp_add_byte(server, 0); /* reserved */ - ncp_add_handle_path(server, dir->volNumber, dir->DosDirNum, 1, NULL); + ncp_add_handle_path(server, dir->volNumber, dir->dirEntNum, 1, NULL); if ((result = ncp_request(server, 87)) != 0) { @@ -507,7 +523,7 @@ ncp_search_for_file_or_subdir(struct ncp_server *server, ncp_init_request(server); ncp_add_byte(server, 3); /* subfunction */ - ncp_add_byte(server, 0); /* dos name space */ + ncp_add_byte(server, server->name_space[seq->volNumber]); ncp_add_byte(server, 0); /* data stream (???) */ ncp_add_word(server, 0xffff); /* Search attribs */ ncp_add_dword(server, RIM_ALL); /* return info mask */ @@ -542,19 +558,19 @@ ncp_ren_or_mov_file_or_subdir(struct ncp_server *server, ncp_init_request(server); ncp_add_byte(server, 4); /* subfunction */ - ncp_add_byte(server, 0); /* dos name space */ + ncp_add_byte(server, server->name_space[old_dir->volNumber]); ncp_add_byte(server, 1); /* rename flag */ ncp_add_word(server, 0x8006); /* search attributes */ /* source Handle Path */ ncp_add_byte(server, old_dir->volNumber); - ncp_add_dword(server, old_dir->DosDirNum); + ncp_add_dword(server, old_dir->dirEntNum); ncp_add_byte(server, 1); ncp_add_byte(server, 1); /* 1 source component */ /* dest Handle Path */ ncp_add_byte(server, new_dir->volNumber); - ncp_add_dword(server, new_dir->DosDirNum); + ncp_add_dword(server, new_dir->dirEntNum); ncp_add_byte(server, 1); ncp_add_byte(server, 1); /* 1 destination component */ diff --git a/kernel-2.0/README b/kernel-2.0/README deleted file mode 100644 index ec19f0c..0000000 --- a/kernel-2.0/README +++ /dev/null @@ -1,18 +0,0 @@ -This directory contains the patch you have to apply to the Linux -kernel if you want to use the support for long file names using the -OS/2 namespace on the NetWare server. It did not make it into 2.0, but -patching your kernel is really no problem. - -To apply this patch, please take a clean Linux kernel. This patch is -against Linux 2.0.7, but any later kernel version in the 2.0.x series -should also work fine. Please perform the following two steps: - -cd /usr/src/linux -patch -p1 name_space[info->volNumber]; -+} -+ -+static inline int -+ncp_preserve_case(struct inode *i) -+{ -+ return (ncp_namespace(i) == NW_NS_OS2); -+} -+ - static struct file_operations ncp_dir_operations = { - NULL, /* lseek - default */ - ncp_dir_read, /* read - bad */ -@@ -128,7 +142,7 @@ - /* Here we encapsulate the inode number handling that depends upon the - * mount mode: When we mount a complete server, the memory address of - * the ncp_inode_info is used as the inode number. When only a single -- * volume is mounted, then the DosDirNum is used as the inode -+ * volume is mounted, then the dirEntNum is used as the inode - * number. As this is unique for the complete volume, this should - * enable the NFS exportability of a ncpfs-mounted volume. - */ -@@ -143,7 +157,7 @@ - ncp_info_ino(struct ncp_server *server, struct ncp_inode_info *info) - { - return ncp_single_volume(server) -- ? info->finfo.i.DosDirNum : (ino_t)info; -+ ? info->finfo.i.dirEntNum : (ino_t)info; - } - - static inline int -@@ -177,8 +191,6 @@ - return NULL; - } - -- -- - static int - ncp_dir_read(struct inode *inode, struct file *filp, char *buf, int count) - { -@@ -326,9 +338,12 @@ - c_last_returned_index = 0; - index = 0; - -- for (i = 0; i < c_size; i++) -+ if (!ncp_preserve_case(inode)) - { -- str_lower(c_entry[i].i.entryName); -+ for (i = 0; i < c_size; i++) -+ { -+ str_lower(c_entry[i].i.entryName); -+ } - } - } - } -@@ -345,7 +360,7 @@ - - if (ncp_single_volume(server)) - { -- ino = (ino_t)(entry->i.DosDirNum); -+ ino = (ino_t)(entry->i.dirEntNum); - } - else - { -@@ -652,7 +667,7 @@ - root->finfo.opened = 0; - i->attributes = aDIR; - i->dataStreamSize = 1024; -- i->DosDirNum = 0; -+ i->dirEntNum = i->DosDirNum = 0; - i->volNumber = NCP_NUMBER_OF_VOLUMES+1; /* illegal volnum */ - ncp_date_unix2dos(0, &(i->creationTime), &(i->creationDate)); - ncp_date_unix2dos(0, &(i->modifyTime), &(i->modifyDate)); -@@ -729,7 +744,7 @@ - - do - { -- if ( (result->dir->finfo.i.DosDirNum == dir_info->DosDirNum) -+ if ( (result->dir->finfo.i.dirEntNum == dir_info->dirEntNum) - && (result->dir->finfo.i.volNumber == dir_info->volNumber) - && (strcmp(result->finfo.i.entryName, name) == 0) - /* The root dir is never looked up using this -@@ -757,6 +772,7 @@ - struct ncp_server *server; - struct ncp_inode_info *result_info; - int found_in_cache; -+ int down_case = 0; - char name[len+1]; - - *result = NULL; -@@ -867,20 +883,26 @@ - if (found_in_cache == 0) - { - int res; -- str_upper(name); - - DDPRINTK("ncp_lookup: do_lookup on %s/%s\n", - NCP_ISTRUCT(dir)->entryName, name); - - if (ncp_is_server_root(dir)) - { -+ str_upper(name); -+ down_case = 1; - res = ncp_lookup_volume(server, name, &(finfo.i)); - } - else - { -+ if (!ncp_preserve_case(dir)) -+ { -+ str_upper(name); -+ down_case = 1; -+ } - res = ncp_obtain_info(server, - NCP_ISTRUCT(dir)->volNumber, -- NCP_ISTRUCT(dir)->DosDirNum, -+ NCP_ISTRUCT(dir)->dirEntNum, - name, &(finfo.i)); - } - if (res != 0) -@@ -892,7 +914,11 @@ - } - - finfo.opened = 0; -- str_lower(finfo.i.entryName); -+ -+ if (down_case != 0) -+ { -+ str_lower(finfo.i.entryName); -+ } - - if (!(*result = ncp_iget(dir, &finfo))) - { -@@ -929,7 +955,11 @@ - - strncpy(_name, name, len); - _name[len] = '\0'; -- str_upper(_name); -+ -+ if (!ncp_preserve_case(dir)) -+ { -+ str_upper(_name); -+ } - - lock_super(dir->i_sb); - if (ncp_open_create_file_or_subdir(NCP_SERVER(dir), -@@ -946,7 +976,11 @@ - - ncp_invalid_dir_cache(dir); - -- str_lower(finfo.i.entryName); -+ if (!ncp_preserve_case(dir)) -+ { -+ str_lower(finfo.i.entryName); -+ } -+ - finfo.access = O_RDWR; - - if (!(*result = ncp_iget(dir, &finfo)) < 0) -@@ -980,7 +1014,11 @@ - - strncpy(_name, name, len); - _name[len] = '\0'; -- str_upper(_name); -+ -+ if (!ncp_preserve_case(dir)) -+ { -+ str_upper(_name); -+ } - - if (!dir || !S_ISDIR(dir->i_mode)) - { -@@ -1038,7 +1076,11 @@ - - strncpy(_name, name, len); - _name[len] = '\0'; -- str_upper(_name); -+ -+ if (!ncp_preserve_case(dir)) -+ { -+ str_upper(_name); -+ } - - if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir), - NCP_ISTRUCT(dir), -@@ -1081,7 +1123,11 @@ - { - strncpy(_name, name, len); - _name[len] = '\0'; -- str_upper(_name); -+ -+ if (!ncp_preserve_case(dir)) -+ { -+ str_upper(_name); -+ } - - if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir), - NCP_ISTRUCT(dir), -@@ -1136,11 +1182,19 @@ - - strncpy(_old_name, old_name, old_len); - _old_name[old_len] = '\0'; -- str_upper(_old_name); -+ -+ if (!ncp_preserve_case(old_dir)) -+ { -+ str_upper(_old_name); -+ } - - strncpy(_new_name, new_name, new_len); - _new_name[new_len] = '\0'; -- str_upper(_new_name); -+ -+ if (!ncp_preserve_case(new_dir)) -+ { -+ str_upper(_new_name); -+ } - - res = ncp_ren_or_mov_file_or_subdir(NCP_SERVER(old_dir), - NCP_ISTRUCT(old_dir), _old_name, -diff -urN 2.0.7/fs/ncpfs/ncplib_kernel.c linux/fs/ncpfs/ncplib_kernel.c ---- 2.0.7/fs/ncpfs/ncplib_kernel.c Thu Apr 18 08:40:28 1996 -+++ linux/fs/ncpfs/ncplib_kernel.c Tue Jul 16 10:52:33 1996 -@@ -190,25 +190,6 @@ - } - - int --ncp_get_volume_number(struct ncp_server *server, const char *name, int *target) --{ -- int result; -- -- ncp_init_request_s(server, 5); -- ncp_add_pstring(server, name); -- -- if ((result = ncp_request(server, 22)) != 0) -- { -- ncp_unlock_server(server); -- return result; -- } -- -- *target = ncp_reply_byte(server, 0); -- ncp_unlock_server(server); -- return 0; --} -- --int - ncp_close_file(struct ncp_server *server, const char *file_id) - { - int result; -@@ -278,8 +259,8 @@ - - ncp_init_request(server); - ncp_add_byte(server, 6); /* subfunction */ -- ncp_add_byte(server, 0); /* dos name space */ -- ncp_add_byte(server, 0); /* dos name space as dest */ -+ ncp_add_byte(server, server->name_space[vol_num]); -+ ncp_add_byte(server, server->name_space[vol_num]); - ncp_add_word(server, 0xff); /* get all */ - ncp_add_dword(server, RIM_ALL); - ncp_add_handle_path(server, vol_num, dir_base, 1, path); -@@ -295,20 +276,57 @@ - return 0; - } - -+static inline int -+ncp_has_os2_namespace(struct ncp_server *server, __u8 volume) -+{ -+ int result; -+ __u8 *namespace; -+ __u16 no_namespaces; -+ -+ ncp_init_request(server); -+ ncp_add_byte(server, 24); /* Subfunction: Get Name Spaces Loaded */ -+ ncp_add_word(server, 0); -+ ncp_add_byte(server, volume); -+ -+ if ((result = ncp_request(server, 87)) != 0) -+ { -+ ncp_unlock_server(server); -+ return 0; -+ } -+ -+ no_namespaces = ncp_reply_word(server, 0); -+ namespace = ncp_reply_data(server, 2); -+ -+ while (no_namespaces > 0) -+ { -+ DPRINTK("get_namespaces: found %d on %d\n", *namespace,volume); -+ -+ if (*namespace == 4) -+ { -+ DPRINTK("get_namespaces: found OS2\n"); -+ ncp_unlock_server(server); -+ return 1; -+ } -+ namespace += 1; -+ no_namespaces -= 1; -+ } -+ ncp_unlock_server(server); -+ return 0; -+} -+ - int - ncp_lookup_volume(struct ncp_server *server, - char *volname, - struct nw_info_struct *target) - { - int result; -- __u8 vol_num; -- __u32 dir_base; -+ int volnum; - - DPRINTK("ncp_lookup_volume: looking up vol %s\n", volname); - - ncp_init_request(server); - ncp_add_byte(server, 22); /* Subfunction: Generate dir handle */ -- ncp_add_byte(server, 0); /* DOS name space */ -+ ncp_add_byte(server, 0); /* DOS namespace */ - ncp_add_byte(server, 0); /* reserved */ - ncp_add_byte(server, 0); /* reserved */ - ncp_add_byte(server, 0); /* reserved */ -@@ -325,20 +343,19 @@ - return result; - } - -- dir_base = ncp_reply_dword(server, 4); -- vol_num = ncp_reply_byte(server, 8); -+ memset(target, 0, sizeof(*target)); -+ target->DosDirNum = target->dirEntNum = ncp_reply_dword(server, 4); -+ target->volNumber = volnum = ncp_reply_byte(server, 8); - ncp_unlock_server(server); - -- if ((result = ncp_obtain_info(server, vol_num, dir_base, NULL, -- target)) != 0) -- { -- return result; -- } -+ server->name_space[volnum] = ncp_has_os2_namespace(server,volnum)?4:0; - -- DPRINTK("ncp_lookup_volume: attribs = %X\n", target->attributes); -+ DPRINTK("lookup_vol: namespace[%d] = %d\n", -+ volnum, server->name_space[volnum]); - - target->nameLen = strlen(volname); - strcpy(target->entryName, volname); -+ target->attributes = aDIR; - return 0; - } - -@@ -352,14 +369,14 @@ - - ncp_init_request(server); - ncp_add_byte(server, 7); /* subfunction */ -- ncp_add_byte(server, 0); /* dos name space */ -+ ncp_add_byte(server, server->name_space[file->volNumber]); - ncp_add_byte(server, 0); /* reserved */ - ncp_add_word(server, 0x8006); /* search attribs: all */ - - ncp_add_dword(server, info_mask); - ncp_add_mem(server, info, sizeof(*info)); - ncp_add_handle_path(server, file->volNumber, -- file->DosDirNum, 1, NULL); -+ file->dirEntNum, 1, NULL); - - result = ncp_request(server, 87); - ncp_unlock_server(server); -@@ -374,11 +391,11 @@ - - ncp_init_request(server); - ncp_add_byte(server, 8); /* subfunction */ -- ncp_add_byte(server, 0); /* dos name space */ -+ ncp_add_byte(server, server->name_space[dir->volNumber]); - ncp_add_byte(server, 0); /* reserved */ - ncp_add_word(server, 0x8006); /* search attribs: all */ - ncp_add_handle_path(server, dir->volNumber, -- dir->DosDirNum, 1, name); -+ dir->dirEntNum, 1, name); - - result = ncp_request(server, 87); - ncp_unlock_server(server); -@@ -406,15 +423,16 @@ - { - int result; - __u16 search_attribs = 0x0006; -+ __u8 volume = (dir != NULL) ? dir->volNumber : target->i.volNumber; - - if ((create_attributes & aDIR) != 0) - { -- search_attribs |= 0x8000; -- } -+ search_attribs |= 0x8000; -+} - - ncp_init_request(server); - ncp_add_byte(server, 1); /* subfunction */ -- ncp_add_byte(server, 0); /* dos name space */ -+ ncp_add_byte(server, server->name_space[volume]); - ncp_add_byte(server, open_create_mode); - ncp_add_word(server, search_attribs); - ncp_add_dword(server, RIM_ALL); -@@ -425,13 +443,11 @@ - - if (dir != NULL) - { -- ncp_add_handle_path(server, dir->volNumber, -- dir->DosDirNum, 1, name); -+ ncp_add_handle_path(server, volume, dir->dirEntNum, 1, name); - } - else - { -- ncp_add_handle_path(server, -- target->i.volNumber, target->i.DosDirNum, -+ ncp_add_handle_path(server, volume, target->i.dirEntNum, - 1, NULL); - } - -@@ -467,9 +483,9 @@ - - ncp_init_request(server); - ncp_add_byte(server, 2); /* subfunction */ -- ncp_add_byte(server, 0); /* dos name space */ -+ ncp_add_byte(server, server->name_space[dir->volNumber]); - ncp_add_byte(server, 0); /* reserved */ -- ncp_add_handle_path(server, dir->volNumber, dir->DosDirNum, 1, NULL); -+ ncp_add_handle_path(server, dir->volNumber, dir->dirEntNum, 1, NULL); - - if ((result = ncp_request(server, 87)) != 0) - { -@@ -493,7 +509,7 @@ - - ncp_init_request(server); - ncp_add_byte(server, 3); /* subfunction */ -- ncp_add_byte(server, 0); /* dos name space */ -+ ncp_add_byte(server, server->name_space[seq->volNumber]); - ncp_add_byte(server, 0); /* data stream (???) */ - ncp_add_word(server, 0xffff); /* Search attribs */ - ncp_add_dword(server, RIM_ALL); /* return info mask */ -@@ -528,19 +544,19 @@ - - ncp_init_request(server); - ncp_add_byte(server, 4); /* subfunction */ -- ncp_add_byte(server, 0); /* dos name space */ -+ ncp_add_byte(server, server->name_space[old_dir->volNumber]); - ncp_add_byte(server, 1); /* rename flag */ - ncp_add_word(server, 0x8006); /* search attributes */ - - /* source Handle Path */ - ncp_add_byte(server, old_dir->volNumber); -- ncp_add_dword(server, old_dir->DosDirNum); -+ ncp_add_dword(server, old_dir->dirEntNum); - ncp_add_byte(server, 1); - ncp_add_byte(server, 1); /* 1 source component */ - - /* dest Handle Path */ - ncp_add_byte(server, new_dir->volNumber); -- ncp_add_dword(server, new_dir->DosDirNum); -+ ncp_add_dword(server, new_dir->dirEntNum); - ncp_add_byte(server, 1); - ncp_add_byte(server, 1); /* 1 destination component */ - -diff -urN 2.0.7/include/linux/ncp.h linux/include/linux/ncp.h ---- 2.0.7/include/linux/ncp.h Thu Apr 18 08:40:36 1996 -+++ linux/include/linux/ncp.h Tue Jul 16 17:27:45 1996 -@@ -116,6 +116,12 @@ - __u16 update_time; - }; - -+/* Defines for Name Spaces */ -+#define NW_NS_DOS 0 -+#define NW_NS_MAC 1 -+#define NW_NS_NFS 2 -+#define NW_NS_FTAM 3 -+#define NW_NS_OS2 4 - - /* Defines for ReturnInformationMask */ - #define RIM_NAME (0x0001L) -diff -urN 2.0.7/include/linux/ncp_fs_sb.h linux/include/linux/ncp_fs_sb.h ---- 2.0.7/include/linux/ncp_fs_sb.h Thu Apr 18 08:40:36 1996 -+++ linux/include/linux/ncp_fs_sb.h Tue Jul 16 17:35:17 1996 -@@ -21,6 +21,8 @@ - interest for us later, so we store - it completely. */ - -+ __u8 name_space[NCP_NUMBER_OF_VOLUMES]; -+ - struct file *ncp_filp; /* File pointer to ncp socket */ - struct file *wdog_filp; /* File pointer to wdog socket */ - struct file *msg_filp; /* File pointer to message socket */ diff --git a/man/Makefile b/man/Makefile index feb9f2d..e8647b7 100644 --- a/man/Makefile +++ b/man/Makefile @@ -1,5 +1,5 @@ MAN1= slist nprint pqlist nsend pserver ncopy npasswd -MAN1 += nwbols nwboprops nwbpvalues +MAN1 += nwbols nwboprops nwbpvalues nwfsinfo nwuserlist MAN5= nwclient MAN8= ncpmount ncpumount ipx_configure ipx_interface ipx_internal_net \ ipx_route nwmsg diff --git a/man/nwfsinfo.1 b/man/nwfsinfo.1 new file mode 100644 index 0000000..e985f89 --- /dev/null +++ b/man/nwfsinfo.1 @@ -0,0 +1,52 @@ +.TH NWFSINFO 1 07/22/1996 nwfsinfo nwfsinfo +.SH NAME +nwfsinfo \- Print some information about the file server +.SH SYNOPSIS +.B nwfsinfo +[ +.B -h +] [ +.B -S +.I server +] [ +.B -t +] [ +.B -i +] [ +.B -d +] + +.SH DESCRIPTION +.B nwfsinfo +prints some of the information the NetWare servers present without +logging in. The options control what is printed. You should try the +different options to find out what is printed when. + +.SH OPTIONS + +.B -h +.RS 3 +With -h nwfsinfo prints a little help text. +.RE + +.B -S +.I server +.RS 3 +is the name of the server you want to know something about. +.RE + +.B -t +.RS 3 +Print what the file server believes to be the current time. +.RE + +.B -d +.RS 3 +Print the so-called file server description strings. +.RE + +.B -i +.RS 3 +Print the extended file server information such as NetWare version, +maximum connections an others. +.RE diff --git a/man/nwuserlist.1 b/man/nwuserlist.1 new file mode 100644 index 0000000..0991e6e --- /dev/null +++ b/man/nwuserlist.1 @@ -0,0 +1,93 @@ +.TH NWUSERLIST 1 7/22/1996 nwuserlist nwuserlist +.SH NAME +nwuserlist \- List Users logged in at a NetWare server +.SH SYNOPSIS +.B nwuserlist +[ +.B -h +] [ +.B -S +.I server +] [ +.B -U +.I user name +] [ +.B -P +.I password + | +.B -n +] [ +.B -C +] [ +.B -a +] + +.SH DESCRIPTION +.B nwuserlist +lists the users logged in at a NetWare server, together with their +connection number and their login time. + +.B nwuserlist +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, nwuserlist +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 -a +.RS 3 +With option -a the IPX address of the station the user is logged in +from is printed as well. +.RE + +.SH AUTHORS +nwuserlist was written by Volker Lendecke. See the Changes file of ncpfs +for other contributors. diff --git a/ncpfs-2.0.2.lsm b/ncpfs-2.0.3.lsm similarity index 76% rename from ncpfs-2.0.2.lsm rename to ncpfs-2.0.3.lsm index e52a046..f8e2439 100644 --- a/ncpfs-2.0.2.lsm +++ b/ncpfs-2.0.3.lsm @@ -1,7 +1,7 @@ Begin3 Title: ncpfs -Version: 2.0.2 -Entered-date: 18. July 1996 +Version: 2.0.3 +Entered-date: 22. July 1996 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 @@ -12,8 +12,8 @@ Keywords: filesystem ncp novell netware printing 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/system/Filesystems/ncpfs - ~124k ncpfs-2.0.2.tgz - ~ 1k ncpfs-2.0.2.lsm +Alternate-site: sunsite.unc.edu:/pub/Linux/system/Filesystems/ncpfs + ~128k ncpfs-2.0.3.tgz + ~ 1k ncpfs-2.0.3.lsm Copying-policy: GPL End diff --git a/util/Makefile b/util/Makefile index 782f54c..f5b1dd7 100644 --- a/util/Makefile +++ b/util/Makefile @@ -5,17 +5,32 @@ USERUTILS = slist pqlist nwfsinfo pserver nprint nsend ncopy npasswd USERUTILS += nwbols nwbocreate nwborm nwboprops USERUTILS += nwbpcreate nwbprm nwbpvalues nwbpadd -USERUTILS += nwgrant nwrevoke +USERUTILS += nwgrant nwrevoke nwuserlist UIDUTILS = ncpmount ncpumount SBINUTILS = nwmsg UTIL_EXECS = $(USERUTILS) $(UIDUTILS) $(SBINUTILS) UTILS = $(addprefix $(INTERM_BINDIR)/,$(UTIL_EXECS)) -#CFLAGS = -Wall $(INCLUDES) $(KERNELD) -g -DNCPFS_VERSION=\"$(VERSION)\" -CFLAGS = -Wall $(INCLUDES) $(KERNELD) -O2 -DNCPFS_VERSION=\"$(VERSION)\" +CFLAGS = -Wall $(INCLUDES) $(KERNELD) -DNCPFS_VERSION=\"$(VERSION)\" CC = gcc +#CFLAGS += -g +CFLAGS += -O2 + +ifeq ($(HAVE_ELF),yes) +PIC_FLAG = -fPIC +NCP_LIB = libncp.so.1.0 +LIB_LINK_COMMAND = gcc -shared -Wl,-soname,libncp.so.1 -o $(NCP_LIB) +INSTALL_LIB = install $(NCP_LIB) -m 755 /lib; \ + ln -sf $(NCP_LIB) /lib/libncp.so.1; \ + ldconfig +export PIC_FLAG +else +NCP_LIB = libncp.a +LIB_LINK_COMMAND = ar r libncp.a +endif + default: make -C .. @@ -28,21 +43,26 @@ install: all do install $(INTERM_BINDIR)/$$i -m 4755 $(BINDIR); done for i in $(SBINUTILS); \ do install $(INTERM_BINDIR)/$$i -m 755 $(SBINDIR); done + $(INSTALL_LIB) -$(UTILS): $(addsuffix .o,$(UTIL_EXECS)) libncp.a +$(UTILS): $(addsuffix .o,$(UTIL_EXECS)) $(NCP_LIB) $(CC) -o $@ $(addsuffix .o,$(notdir $@)) -L. -lncp ncplib.o: ncplib.c ncplib.h ncplib_err.h - $(CC) $(CFLAGS) -finline-functions -c ncplib.c + $(CC) $(CFLAGS) $(PIC_FLAG) -finline-functions -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 -libncp.a: ncplib.o ncplib_err.o $(COM_ERR_CFILES) +$(NCP_LIB): ncplib.o ncplib_err.o $(COM_ERR_CFILES) make -C com_err - ar r libncp.a ncplib.o ncplib_err.o \ + $(LIB_LINK_COMMAND) ncplib.o ncplib_err.o \ com_err/com_err.o com_err/error_message.o com_err/et_name.o \ com_err/init_et.o + ln -sf libncp.so.1.0 libncp.so.1 + +ncplib_err.o: ncplib_err.h ncplib_err.c + $(CC) $(CFLAGS) $(PIC_FLAG) -c ncplib_err.c ncplib_err.h: ncplib_err.et com_err/compile_et ncplib_err @@ -53,7 +73,7 @@ ncplib_err.c: ncplib_err.et test: test.o ncplib.o $(CC) -o test test.o ncplib.o -ncptest: ncptest.o libncp.a +ncptest: ncptest.o $(NCP_LIB) $(CC) -o ncptest ncptest.o -L. -lncp dep: ncplib_err.h @@ -63,6 +83,7 @@ dep: ncplib_err.h clean: make -C com_err clean rm -f *.o *~ slist test ncptest ncplib_err.[ch] libncp.a + rm -f libncp.so.* mrproper: clean make -C com_err mrproper diff --git a/util/com_err/Makefile b/util/com_err/Makefile index ba2f1a1..271ce59 100644 --- a/util/com_err/Makefile +++ b/util/com_err/Makefile @@ -3,7 +3,7 @@ # OBJECTS = com_err.o error_message.o et_name.o init_et.o -CFLAGS = -Wall -O2 +CFLAGS = -Wall -O2 $(PIC_FLAG) all: $(OBJECTS) diff --git a/util/ncplib.c b/util/ncplib.c index d584d0c..5b20a51 100644 --- a/util/ncplib.c +++ b/util/ncplib.c @@ -1149,6 +1149,11 @@ long ncp_close(struct ncp_conn *conn) { long result; + if (conn == NULL) + { + return 0; + } + if ((result = ncp_do_close(conn)) != 0) { return result; @@ -1292,7 +1297,7 @@ ncp_get_nwc_ent(FILE *nwc) } FILE * -ncp_fopen_nwc(const char *user, const char *mode) +ncp_fopen_nwc(const char *user, const char *mode, long *err) { char path[MAXPATHLEN]; char *home = NULL; @@ -1320,7 +1325,7 @@ ncp_fopen_nwc(const char *user, const char *mode) if ( (home == NULL) || (strlen(home) + sizeof(NWCLIENT) + 2 > sizeof(path))) { - errno = ENAMETOOLONG; + *err = ENAMETOOLONG; return NULL; } @@ -1330,12 +1335,13 @@ ncp_fopen_nwc(const char *user, const char *mode) if (stat(path, &st) != 0) { + *err = errno; return NULL; } if ((st.st_mode & (S_IRWXO | S_IRWXG)) != 0) { - errno = EINVAL; + *err = NCPL_ET_INVALID_MODE; return NULL; } @@ -1371,11 +1377,9 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, } else { - nwc = ncp_fopen_nwc(NULL, NULL); - - if (nwc == NULL) + if ((nwc = ncp_fopen_nwc(NULL, NULL, err)) == NULL) { - *err = NCPL_ET_NO_SPEC; + *err = NCPL_ET_NO_SERVER; return NULL; } @@ -1391,6 +1395,15 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, strcpy(spec.user, nwc_ent->user); } + str_upper(spec.server); + + if (login_necessary == 0) + { + memset(spec.user, 0, sizeof(spec.user)); + memset(spec.password, 0, sizeof(spec.password)); + return &spec; + } + if (user != NULL) { if (strlen(user) >= sizeof(spec.user)) @@ -1401,7 +1414,6 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, strcpy(spec.user, user); } - str_upper(spec.server); str_upper(spec.user); spec.login_type = NCP_BINDERY_USER; @@ -1422,7 +1434,7 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, } else { - if ((nwc = ncp_fopen_nwc(NULL, NULL)) != NULL) + if ((nwc = ncp_fopen_nwc(NULL, NULL, err)) != NULL) { while ((nwc_ent = ncp_get_nwc_ent(nwc)) != NULL) { @@ -1442,15 +1454,10 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, } } - if (login_necessary == 0) - { - memset(spec.user, 0, sizeof(spec.user)); - memset(spec.password, 0, sizeof(spec.password)); - } - if (strlen(spec.user) == 0) { - return &spec; + *err = NCPL_ET_NO_USER; + return NULL; } if ((strlen(spec.password) == 0) && (password == NULL)) @@ -1817,6 +1824,31 @@ ncp_get_file_server_time(struct ncp_conn *conn, time_t *target) return 0; } +long +ncp_get_file_server_information(struct ncp_conn *conn, + struct ncp_file_server_info *target) +{ + long result; + ncp_init_request_s(conn, 17); + if ((result = ncp_request(conn, 23)) != 0) + { + ncp_unlock_conn(conn); + return result; + } + + memcpy(target, ncp_reply_data(conn, 0), sizeof(*target)); + target->MaximumServiceConnections + = htons(target->MaximumServiceConnections); + target->ConnectionsInUse + = htons(target->ConnectionsInUse); + target->MaxConnectionsEverUsed + = htons(target->MaxConnectionsEverUsed); + target->NumberMountedVolumes + = htons(target->NumberMountedVolumes); + ncp_unlock_conn(conn); + return 0; +} + long ncp_get_connlist(struct ncp_conn *conn, __u16 object_type, const char *object_name, @@ -1840,6 +1872,57 @@ ncp_get_connlist(struct ncp_conn *conn, return 0; } +long +ncp_get_stations_logged_info(struct ncp_conn *conn, + __u32 connection, + struct ncp_bindery_object *target, + time_t *login_time) +{ + long result; + ncp_init_request_s(conn, 28); + ncp_add_dword(conn, connection); + + if ((result = ncp_request(conn, 23)) != 0) + { + ncp_unlock_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)); + memcpy(target->object_name, ncp_reply_data(conn, 6), + sizeof(target->object_name)); + *login_time = nw_to_ctime((struct nw_time_buffer *) + ncp_reply_data(conn, 54)); + ncp_unlock_conn(conn); + return 0; +} + +long +ncp_get_internet_address(struct ncp_conn *conn, + __u32 connection, + struct sockaddr_ipx *target, + __u8 *conn_type) +{ + long result; + ncp_init_request_s(conn, 26); + ncp_add_dword(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); + memcpy(&(target->sipx_node), ncp_reply_data(conn, 4), 6); + target->sipx_port = ncp_reply_word(conn, 10); + *conn_type = ncp_reply_byte(conn, 12); + ncp_unlock_conn(conn); + return 0; +} + long ncp_send_broadcast(struct ncp_conn *conn, __u8 no_conn, const __u8 *connections, @@ -2196,6 +2279,21 @@ ncp_login_encrypted(struct ncp_conn *conn, return result; } +long +ncp_login_unencrypted(struct ncp_conn *conn, + __u16 object_type, const char *object_name, + const unsigned char *passwd) +{ + long result; + ncp_init_request_s(conn, 20); + ncp_add_word(conn, htons(object_type)); + ncp_add_pstring(conn, object_name); + ncp_add_pstring(conn, passwd); + result = ncp_request(conn, 23); + ncp_unlock_conn(conn); + return result; +} + long ncp_change_login_passwd(struct ncp_conn *conn, const struct ncp_bindery_object *object, @@ -2252,7 +2350,8 @@ ncp_login_object(struct ncp_conn *conn, struct ncp_bindery_object user; if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) { - return result; + return ncp_login_unencrypted(conn, login_type, username, + password); } if ((result = ncp_get_bindery_object_id(conn, login_type, @@ -2672,7 +2771,7 @@ static void ncp_add_handle_path(struct ncp_conn *conn, __u8 vol_num, __u32 dir_base, int have_dir_base, - char *path) + const char *path) { ncp_add_byte(conn, vol_num); ncp_add_dword(conn, dir_base); @@ -2705,6 +2804,33 @@ ncp_extract_file_info(void *structure, struct nw_info_struct *target) return; } +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) +{ + long result; + + ncp_init_request(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_handle_path(conn, vol, dirent, 1, path); + + if ((result = ncp_request(conn, 87)) != 0) + { + ncp_unlock_conn(conn); + return result; + } + ncp_extract_file_info(ncp_reply_data(conn, 0), target); + ncp_unlock_conn(conn); + return 0; +} + long ncp_do_lookup(struct ncp_conn *conn, struct nw_info_struct *dir, @@ -2893,7 +3019,7 @@ ncp_initialize_search(struct ncp_conn *conn, return result; } - memcpy(&(target->s), ncp_reply_data(conn, 0), sizeof(target->s)); + memcpy(&(target->s), ncp_reply_data(conn, 0), 9); target->namespace = namespace; ncp_unlock_conn(conn); diff --git a/util/ncplib.h b/util/ncplib.h index d4fe7bb..1586e86 100644 --- a/util/ncplib.h +++ b/util/ncplib.h @@ -155,11 +155,48 @@ ncp_get_file_server_description_strings(struct ncp_conn *conn, long ncp_get_file_server_time(struct ncp_conn *conn, time_t *target); +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); + long 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); + +long +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, @@ -265,6 +302,11 @@ ncp_login_encrypted(struct ncp_conn *conn, 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); + long ncp_change_login_passwd(struct ncp_conn *conn, const struct ncp_bindery_object *object, @@ -373,6 +415,14 @@ ncp_copy_file(struct ncp_conn *conn, __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); + + long ncp_do_lookup(struct ncp_conn *conn, struct nw_info_struct *dir, diff --git a/util/ncplib_err.et b/util/ncplib_err.et index f0d5bb6..5deeca4 100644 --- a/util/ncplib_err.et +++ b/util/ncplib_err.et @@ -3,6 +3,9 @@ error_table NCPL ec NCPL_ET_NO_SERVER, "No server found" +ec NCPL_ET_NO_USER, + "No username found" + ec NCPL_ET_HOST_UNKNOWN, "Server Unknown" @@ -19,7 +22,7 @@ ec NCPL_ET_NO_SPEC, "Could not find valid connection spec" ec NCPL_ET_INVALID_MODE, - "$HOME/.nwclient has invalid mode" + "$HOME/.nwclient has invalid mode, must be 600" ec NCPL_ET_LOGIN_DENIED, "Login denied" diff --git a/util/ncpmount.c b/util/ncpmount.c index eafb928..b05b1a9 100644 --- a/util/ncpmount.c +++ b/util/ncpmount.c @@ -201,7 +201,7 @@ main(int argc, char *argv[]) upcase_password = 1; - while ((opt = getopt (argc, argv, "CS:U:c:u:g:f:d:P:nhvV:t:r:")) + while ((opt = getopt (argc, argv, "CS:U:c:u:g:f:d:P:nh?vV:t:r:")) != EOF) { switch (opt) @@ -310,6 +310,7 @@ main(int argc, char *argv[]) data.retry_count = atoi(optarg); break; case 'h': + case '?': help(); exit(1); case 'v': diff --git a/util/ncptest.c b/util/ncptest.c index 75488c4..8533633 100644 --- a/util/ncptest.c +++ b/util/ncptest.c @@ -131,6 +131,58 @@ test_change(struct ncp_conn *conn) return 0; } +void +test_readdir(struct ncp_conn *conn) +{ + struct nw_info_struct sys; + struct nw_info_struct blub; + struct ncp_search_seq seq; + struct nw_info_struct entry; + + if (ncp_do_lookup(conn, NULL, "SYS", &sys) != 0) + { + printf("lookup error\n"); + return; + } + if (ncp_do_lookup(conn, &sys, "BLUB", &blub) != 0) + { + 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; + printf("found: %s\n", entry.entryName); + if (ncp_obtain_file_or_subdir_info(conn, NW_NS_DOS, NW_NS_NFS, + 0x8006, RIM_ALL, + entry.volNumber, + entry.DosDirNum, + NULL, + &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, + entry.DosDirNum, + NULL, + &nfs) == 0) + { + printf("os2 name: %s\n", nfs.entryName); + } + } + +} + + int main(int argc, char *argv[]) { @@ -143,7 +195,7 @@ main(int argc, char *argv[]) return 1; } - test_change(conn); + test_readdir(conn); ncp_close(conn); return 0; } diff --git a/util/npasswd.c b/util/npasswd.c index 0f2e551..edcf1ea 100644 --- a/util/npasswd.c +++ b/util/npasswd.c @@ -53,7 +53,7 @@ main(int argc, char *argv[]) progname = argv[0]; - while ((opt = getopt(argc, argv, "hS:U:t:")) != EOF) + while ((opt = getopt(argc, argv, "h?S:U:t:")) != EOF) { switch(opt) { case 'S': @@ -66,6 +66,7 @@ main(int argc, char *argv[]) object_type = atoi(optarg); break; case 'h': + case '?': help(); exit(1); default: diff --git a/util/nprint.c b/util/nprint.c index 8c6a806..a4ab053 100644 --- a/util/nprint.c +++ b/util/nprint.c @@ -57,7 +57,7 @@ main(int argc, char *argv[]) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) { - com_err(argv[0], err, "in ncp_initialize"); + com_err(argv[0], err, "when initializing connection"); exit(1); } @@ -78,10 +78,11 @@ main(int argc, char *argv[]) pj.Rows = htons(80); strcpy(pj.FnameHeader, "stdin"); - while ((opt = getopt(argc, argv, "hq: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) { case 'h': + case '?': help(); ncp_close(conn); exit(1); diff --git a/util/nsend.c b/util/nsend.c index 14c5828..9a58fd2 100644 --- a/util/nsend.c +++ b/util/nsend.c @@ -25,7 +25,7 @@ main(int argc, char **argv) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) { - com_err(argv[0], err, "in ncp_initialize"); + com_err(argv[0], err, "when initializing"); exit(1); } diff --git a/util/nwbocreate.c b/util/nwbocreate.c index a3f3309..8f006b8 100644 --- a/util/nwbocreate.c +++ b/util/nwbocreate.c @@ -83,11 +83,11 @@ main(int argc, char *argv[]) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) { - com_err(argv[0], err, "in ncp_initialize"); + com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "ho:t:r:w:")) != EOF) + while ((opt = getopt(argc, argv, "h?o:t:r:w:")) != EOF) { switch(opt) { case 'o': @@ -122,6 +122,7 @@ main(int argc, char *argv[]) } break; case 'h': + case '?': help(); goto finished; default: diff --git a/util/nwbols.c b/util/nwbols.c index 7f0459d..f55d759 100644 --- a/util/nwbols.c +++ b/util/nwbols.c @@ -59,14 +59,15 @@ main(int argc, char **argv) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) { - com_err(argv[0], err, "in ncp_initialize"); + com_err(argv[0], err, "when initializing"); return 1; } - while ((opt = getopt(argc, argv, "hvt:")) != EOF) + while ((opt = getopt(argc, argv, "h?vt:")) != EOF) { switch(opt) { case 'h': + case '?': help(); exit(1); case 't': diff --git a/util/nwboprops.c b/util/nwboprops.c index a02db3e..c60a9b5 100644 --- a/util/nwboprops.c +++ b/util/nwboprops.c @@ -56,11 +56,11 @@ main(int argc, char *argv[]) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) { - com_err(argv[0], err, "in ncp_initialize"); + com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "ho:t:v")) != EOF) + while ((opt = getopt(argc, argv, "h?o:t:v")) != EOF) { switch(opt) { case 'o': @@ -74,6 +74,7 @@ main(int argc, char *argv[]) verbose = 1; break; case 'h': + case '?': help(); goto finished; default: diff --git a/util/nwborm.c b/util/nwborm.c index 7087a96..2da2fa0 100644 --- a/util/nwborm.c +++ b/util/nwborm.c @@ -53,11 +53,11 @@ main(int argc, char *argv[]) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) { - com_err(argv[0], err, "in ncp_initialize"); + com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "ho:t:")) != EOF) + while ((opt = getopt(argc, argv, "h?o:t:")) != EOF) { switch(opt) { case 'o': @@ -68,6 +68,7 @@ main(int argc, char *argv[]) object_type = atoi(optarg); break; case 'h': + case '?': help(); goto finished; default: diff --git a/util/nwbpadd.c b/util/nwbpadd.c index 4aec345..70d5ea7 100644 --- a/util/nwbpadd.c +++ b/util/nwbpadd.c @@ -63,11 +63,11 @@ main(int argc, char *argv[]) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) { - com_err(argv[0], err, "in ncp_initialize"); + com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "ho:t:p:v:")) != EOF) + while ((opt = getopt(argc, argv, "h?o:t:p:v:")) != EOF) { switch(opt) { case 'o': @@ -91,6 +91,7 @@ main(int argc, char *argv[]) value = optarg; break; case 'h': + case '?': help(); goto finished; default: diff --git a/util/nwbpcreate.c b/util/nwbpcreate.c index 641ef58..740cd06 100644 --- a/util/nwbpcreate.c +++ b/util/nwbpcreate.c @@ -87,11 +87,11 @@ main(int argc, char *argv[]) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) { - com_err(argv[0], err, "in ncp_initialize"); + com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "ho:t:p:sr:w:")) != EOF) + while ((opt = getopt(argc, argv, "h?o:t:p:sr:w:")) != EOF) { switch(opt) { case 'o': @@ -139,6 +139,7 @@ main(int argc, char *argv[]) } break; case 'h': + case '?': help(); goto finished; default: diff --git a/util/nwbprm.c b/util/nwbprm.c index 3c85356..116a0ed 100644 --- a/util/nwbprm.c +++ b/util/nwbprm.c @@ -55,11 +55,11 @@ main(int argc, char *argv[]) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) { - com_err(argv[0], err, "in ncp_initialize"); + com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "ho:t:p:")) != EOF) + while ((opt = getopt(argc, argv, "h?o:t:p:")) != EOF) { switch(opt) { case 'o': @@ -80,6 +80,7 @@ main(int argc, char *argv[]) str_upper(property_name); break; case 'h': + case '?': help(); goto finished; default: diff --git a/util/nwbpvalues.c b/util/nwbpvalues.c index 4911ad7..3b77d40 100644 --- a/util/nwbpvalues.c +++ b/util/nwbpvalues.c @@ -65,11 +65,11 @@ main(int argc, char *argv[]) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) { - com_err(argv[0], err, "in ncp_initialize"); + com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "ho:t:p:v")) != EOF) + while ((opt = getopt(argc, argv, "h?o:t:p:v")) != EOF) { switch(opt) { case 'o': @@ -93,6 +93,7 @@ main(int argc, char *argv[]) verbose = 1; break; case 'h': + case '?': help(); goto finished; default: diff --git a/util/nwfsinfo.c b/util/nwfsinfo.c index e820715..1c01685 100644 --- a/util/nwfsinfo.c +++ b/util/nwfsinfo.c @@ -11,6 +11,64 @@ #include #include "ncplib.h" +static char *progname; + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [pattern]\n", progname); +} + +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" + "\n" + "-d Print Description Strings\n" + "-t Print File Server's time\n" + "-i Print File Server Information\n" + "\n"); +} + +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"); + return; +} + int main(int argc, char **argv) { @@ -18,16 +76,22 @@ main(int argc, char **argv) int opt; long err; + progname = argv[0]; + if ((conn = ncp_initialize(&argc, argv, 0, &err)) == NULL) { - com_err(argv[0], err, "in ncp_initialize"); + com_err(argv[0], err, "when initializing"); return 1; } - while ((opt = getopt(argc, argv, "dt")) != EOF) + while ((opt = getopt(argc, argv, "h?dti")) != EOF) { switch(opt) { + case 'h': + case '?': + help(); + break; case 'd': { char strings[512]; @@ -68,12 +132,26 @@ main(int argc, char **argv) fputs(ctime(&t), stdout); break; } - default: - printf("unknown option: %c\n", opt); + 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; + } + print_info(&info); break; } + + default: + usage(); + goto finished; + } } - + + finished: ncp_close(conn); return 0; } diff --git a/util/nwgrant.c b/util/nwgrant.c index 9f07752..98a0576 100644 --- a/util/nwgrant.c +++ b/util/nwgrant.c @@ -57,11 +57,11 @@ main(int argc, char *argv[]) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) { - com_err(argv[0], err, "in ncp_initialize"); + com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "ho:t:r:")) != EOF) + while ((opt = getopt(argc, argv, "h?o:t:r:")) != EOF) { switch(opt) { case 'o': @@ -75,6 +75,7 @@ main(int argc, char *argv[]) rights = strtol(optarg, NULL, 16); break; case 'h': + case '?': help(); goto finished; default: diff --git a/util/nwrevoke.c b/util/nwrevoke.c index 0147fb9..f37a400 100644 --- a/util/nwrevoke.c +++ b/util/nwrevoke.c @@ -55,11 +55,11 @@ main(int argc, char *argv[]) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) { - com_err(argv[0], err, "in ncp_initialize"); + com_err(argv[0], err, "when initializing"); goto finished; } - while ((opt = getopt(argc, argv, "ho:t:")) != EOF) + while ((opt = getopt(argc, argv, "h?o:t:")) != EOF) { switch(opt) { case 'o': @@ -70,6 +70,7 @@ main(int argc, char *argv[]) object_type = atoi(optarg); break; case 'h': + case '?': help(); goto finished; default: diff --git a/util/nwuserlist.c b/util/nwuserlist.c new file mode 100644 index 0000000..bca22e2 --- /dev/null +++ b/util/nwuserlist.c @@ -0,0 +1,143 @@ +/* + * nwfsinfo.c + * + * Print the info strings of a server, maybe sometime more. + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + +#include +#include +#include "ncplib.h" + +static char *progname; + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [pattern]\n", progname); +} + +static void +str_trim_right(char *s, char c) +{ + int len = strlen(s) - 1; + + while ((len > 0) && (s[len] == c)) + { + s[len] = '\0'; + len -= 1; + } +} + +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" + "-a Print Station's addr\n" + "\n"); +} + +int +main(int argc, char **argv) +{ + struct ncp_conn *conn; + int opt; + long err; + struct ncp_file_server_info info; + struct ncp_bindery_object user; + time_t login_time; + int i; + int print_addr = 0; + + progname = argv[0]; + + if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) + { + com_err(argv[0], err, "when initializing"); + goto finished; + } + + while ((opt = getopt(argc, argv, "h?a")) != EOF) + { + switch(opt) + { + case 'h': + case '?': + help(); + goto finished; + case 'a': + print_addr = 1; + break; + default: + usage(); + goto finished; + } + } + + if (ncp_get_file_server_information(conn, &info) != 0) + { + perror("Could not get server information"); + ncp_close(conn); + return 1; + } + + if (isatty(1)) + { + if (print_addr == 0) + { + printf("\n%-6s%-21s%-12s\n" + "---------------------------------------------" + "------\n", + "Conn", + "User name", + "Login time"); + } + else + { + printf("\n%-6s%-21s%-27s%-12s\n" + "---------------------------------------------" + "---------------------------------\n", + "Conn", + "User name", + "Station Address", + "Login time"); + } + } + + for (i = 1; i <= info.MaximumServiceConnections; i++) + { + char name[49]; + name[48] = '\0'; + if (ncp_get_stations_logged_info(conn, i, &user, + &login_time) != 0) + { + continue; + } + memcpy(name, user.object_name, 48); + str_trim_right(name, ' '); + printf("%4d: %-20s ", i, name); + + if (print_addr != 0) + { + 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: + ncp_close(conn); + return 0; +} diff --git a/util/pqlist.c b/util/pqlist.c index 4c44728..dd5215c 100644 --- a/util/pqlist.c +++ b/util/pqlist.c @@ -26,7 +26,7 @@ main(int argc, char **argv) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) { - com_err(argv[0], err, "in ncp_initialize"); + com_err(argv[0], err, "when initializing"); return 1; } diff --git a/util/pserver.c b/util/pserver.c index 048aeb9..a80b389 100644 --- a/util/pserver.c +++ b/util/pserver.c @@ -150,7 +150,7 @@ main(int argc, char *argv[]) if ((conn = ncp_initialize_as(&argc, argv, 1, NCP_BINDERY_PSERVER, &err)) == NULL) { - com_err(argv[0], err, "in ncp_initialize"); + com_err(argv[0], err, "when initializing"); return 1; }