From 20589ca20338766041fb5ae724f6d37f0e68ac4d Mon Sep 17 00:00:00 2001 From: ncpfs archive import Date: Tue, 28 Apr 2026 20:39:57 +0200 Subject: [PATCH] Import ncpfs 0.11 --- .downloads/ncpfs-0.11.tgz | Bin 0 -> 66669 bytes Makefile | 12 +- README | 49 +++-- ipx-0.75/Makefile | 24 ++- kernel-1.2/src/Makefile | 4 +- man/Makefile | 16 ++ man/ncpmount.8 | 27 ++- man/nprint.1 | 98 +++++++-- man/pqlist.1 | 39 ++++ man/slist.1 | 36 ++++ ncpfs-0.10.lsm => ncpfs-0.11.lsm | 12 +- util/Makefile | 11 +- util/fsinfo.c | 46 +++++ util/ncplib.c | 327 ++++++++++++++++++++++--------- util/ncplib.h | 20 +- util/ncpmount.c | 7 +- util/nprint.c | 108 +++------- util/nwlsconn.c | 46 ----- util/pqlist.c | 75 +++++++ util/slist.c | 8 +- 20 files changed, 678 insertions(+), 287 deletions(-) create mode 100644 .downloads/ncpfs-0.11.tgz create mode 100644 man/Makefile create mode 100644 man/pqlist.1 create mode 100644 man/slist.1 rename ncpfs-0.10.lsm => ncpfs-0.11.lsm (58%) create mode 100644 util/fsinfo.c delete mode 100644 util/nwlsconn.c create mode 100644 util/pqlist.c diff --git a/.downloads/ncpfs-0.11.tgz b/.downloads/ncpfs-0.11.tgz new file mode 100644 index 0000000000000000000000000000000000000000..4512242c1384a3f7d458525d982e532f0d3f7639 GIT binary patch literal 66669 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 literal 0 HcmV?d00001 diff --git a/Makefile b/Makefile index 3b59b8e..ee83bf3 100644 --- a/Makefile +++ b/Makefile @@ -6,8 +6,9 @@ TOPDIR = $(shell pwd) -BINDIR = $(TOPDIR)/bin -SUBDIRS = util ipx-0.75 +BINDIR = /usr/local/bin +INTERM_BINDIR = $(TOPDIR)/bin +SUBDIRS = util ipx-0.75 man # # The following 2 lines are for those who use Kernel version 1.2.x. @@ -18,7 +19,7 @@ SUBDIRS = util ipx-0.75 SUBDIRS += kernel-1.2/src INCLUDES = -I$(TOPDIR)/kernel-1.2 -export INCLUDES BINDIR +export INCLUDES BINDIR INTERM_BINDIR all: for i in $(SUBDIRS); do make -C $$i; done @@ -26,6 +27,9 @@ all: dep: for i in $(SUBDIRS); do make -C $$i dep; done +install: + for i in $(SUBDIRS); do make -C $$i install; done + clean: rm -f `find . -type f -name '*.o' -print` rm -f `find . -type f -name '*~' -print` @@ -34,7 +38,7 @@ clean: for i in $(SUBDIRS); do make -C $$i clean; done realclean: clean - rm -fr $(BINDIR)/* ncpfs.tgz + rm -fr $(INTERM_BINDIR)/* ncpfs.tgz make -C util realclean modules: ncpfs.o diff --git a/README b/README index 7883bdc..18bf944 100644 --- a/README +++ b/README @@ -1,30 +1,23 @@ -This is version 0.10 of ncpfs, a free NetWare client filesystem for +This is version 0.11 of ncpfs, a free NetWare client filesystem for Linux. -The main change for this release is that the directory kernel-1.3 is -removed. Guess why? ncpfs is in the standard kernel since 1.3.53. But -please note that ncpfs does NOT work with 1.3.53. I sent a fix to -Linus, so it should work fine with 1.3.54, or 1.3.55. - I would like to invite you to write documentation. As those whose native tongue is English might have noticed, my C is better than my English. So I doubt that everything in the man/ subdirectory is written very well. Please feel free to send me any comments about that. - INSTALLATION The installation of ncpfs depends on the kernel version you are using. For kernel 1.2, you should simply type 'make' and look at what's in the bin/ directory after that. Please be sure that your -kernel resides in /usr/src/linux, because the file kernel-1.2/sock.c -has to refer directly to it. +kernel resides in /usr/src/linux, because the file +kernel-1.2/src/sock.c has to refer directly to it. -If you use Kernel 1.3, please be sure that you use at least 1.3.54 (or -1.3.55, if 1.3.54 makes ncp connections hang). ncpfs does NOT work -with any earlier 1.3.x kernel, especially not with 1.3.53, although it -has a fs/ncpfs/ subdirectory. +If you use Kernel 1.3, please be sure that you use at least +1.3.54. ncpfs does NOT work with any earlier 1.3.x kernel, especially +not with 1.3.53, although this one has a fs/ncpfs/ subdirectory. If you use Kernel 1.3.54 or later, you might have to recompile your kernel. With these kernels, the kernel part of ncpfs is already @@ -54,8 +47,8 @@ hand, note that there has to be a route to the internal network of your server. Please see the file util/start_ipx for an example. I use tools written by Greg Page, Caldera. I hope I did not do too -much harm to their business. For your convenience I included the file -ipx.tar made available by Caldera. +much harm to their business. For your convenience I included the +contents of the file ipx.tar made available by Caldera. My main source of information is a book written in german by Manfred Hill and Ralf Zessin, "Netzwerkprogrammierung in C", IWT Verlag GmbH, @@ -75,6 +68,21 @@ free NetWare API for Linux! I would be happy to receive your comments on this. +THANKS + +I do not want to leave those unmentioned, who have helped me with +ncpfs. + +The most enthusiastic user and tester is certainly Uwe Bonnes +. Up to now he's the only one +who has contributed something, namely manpages and corretions to +existing manpages. + +Ales Dyrak has written lwared, which was the initial start for ncpfs. + +Alan Cox has found some bugs I would probably never have found. + + LIMITATIONS (compare these with smbfs :-) The limitations ncpfs has are the natural limitations of the NCP @@ -96,3 +104,14 @@ different. You can never know when the client will access the file-id you offered, so you would have to cache the inode numbers indefinitely long. I think this should not be done in kernel mode, as it would require an unlimited amount of RAM. + +Those who looked at the kernel code a bit closer will have found out +that the last section is a little white lie. As I found out after the +first version of ncpfs, NetWare does indeed offer something like inode +numbers, although are only unique per volume. So one way to make ncpfs +re-exportable by nfs is to allocate a superblock per volume and show +the inode numbers to the user. I was just too lazy to do this +yet. Maybe once we will force Novell to make NetWare NFS +affordable... ;-) + +Have fun with ncpfs! diff --git a/ipx-0.75/Makefile b/ipx-0.75/Makefile index 278ce08..f2a2a8a 100644 --- a/ipx-0.75/Makefile +++ b/ipx-0.75/Makefile @@ -1,21 +1,20 @@ CFLAGS = -O2 -Wall -BINDIR = ../bin -UTILS = $(BINDIR)/ipx_configure $(BINDIR)/ipx_interface \ - $(BINDIR)/ipx_internal_net $(BINDIR)/ipx_route +UTILS = $(INTERM_BINDIR)/ipx_configure $(INTERM_BINDIR)/ipx_interface \ + $(INTERM_BINDIR)/ipx_internal_net $(INTERM_BINDIR)/ipx_route all: $(UTILS) -$(BINDIR)/ipx_configure: ipx_configure.o - $(CC) -o $(BINDIR)/ipx_configure ipx_configure.o +$(INTERM_BINDIR)/ipx_configure: ipx_configure.o + $(CC) -o $(INTERM_BINDIR)/ipx_configure ipx_configure.o -$(BINDIR)/ipx_interface: ipx_interface.o - $(CC) -o $(BINDIR)/ipx_interface ipx_interface.o +$(INTERM_BINDIR)/ipx_interface: ipx_interface.o + $(CC) -o $(INTERM_BINDIR)/ipx_interface ipx_interface.o -$(BINDIR)/ipx_internal_net: ipx_internal_net.o - $(CC) -o $(BINDIR)/ipx_internal_net ipx_internal_net.o +$(INTERM_BINDIR)/ipx_internal_net: ipx_internal_net.o + $(CC) -o $(INTERM_BINDIR)/ipx_internal_net ipx_internal_net.o -$(BINDIR)/ipx_route: ipx_route.o - $(CC) -o $(BINDIR)/ipx_route ipx_route.o +$(INTERM_BINDIR)/ipx_route: ipx_route.o + $(CC) -o $(INTERM_BINDIR)/ipx_route ipx_route.o dep: $(CPP) -M $(INCLUDES) *.c > .depend @@ -26,7 +25,6 @@ clean: install: $(UTILS) for i in $(UTILS); \ do \ - install --strip $$i /sbin; \ - install $$i.8 /usr/man/man8; \ + install --strip $$i $(BINDIR); \ done diff --git a/kernel-1.2/src/Makefile b/kernel-1.2/src/Makefile index 39530ca..a12973b 100644 --- a/kernel-1.2/src/Makefile +++ b/kernel-1.2/src/Makefile @@ -20,9 +20,9 @@ ARCH = i386 OBJS= dir.o inode.o file.o sock.o ioctl.o ncplib_kernel.o mmap.o -all: $(BINDIR)/ncpfs.o +all: $(INTERM_BINDIR)/ncpfs.o -$(BINDIR)/ncpfs.o: $(OBJS) +$(INTERM_BINDIR)/ncpfs.o: $(OBJS) $(LD) -r -o $@ $(OBJS) ncplib_kernel.o: ncplib_kernel.c ncplib_kernel.h diff --git a/man/Makefile b/man/Makefile new file mode 100644 index 0000000..129ba0c --- /dev/null +++ b/man/Makefile @@ -0,0 +1,16 @@ +MAN1= slist nprint pqlist +MAN5= nwclient +MAN8= ncpmount ncpumount ipx_configure ipx_interface ipx_internal_net ipx_route + + + +all: + +dep: + +install: + for i in $(MAN1); do install $$i.1 -m 755 /usr/local/man/man1; done + for i in $(MAN5); do install $$i.5 -m 755 /usr/local/man/man5; done + for i in $(MAN8); do install $$i.8 -m 755 /usr/local/man/man8; done + +clean: diff --git a/man/ncpmount.8 b/man/ncpmount.8 index c4c95c9..3061872 100644 --- a/man/ncpmount.8 +++ b/man/ncpmount.8 @@ -16,9 +16,6 @@ ncpmount \- mount program for ncpfs ] [ .B -C ] [ -.B -s -.I server name -] [ .B -c .I client name ] [ @@ -54,7 +51,7 @@ ftp://klokan.sh.cvut.cz/pub/linux for this very intersting program. 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 not that the access +nwclient(5) for more information. Please note that the access permissions of .nwclient MUST be 600, for security reasons. .SH OPTIONS @@ -140,11 +137,29 @@ and a group it belongs to. With and .B -g you can tell ncpmount which id's it should assign to the files in the -mounted direcory. +mounted directory. The defaults for these values are the current uid and gid. .RE +.B -c +.I user name +.RS 3 +This option is only makes sense if root mounts the directory. root can +mount directories on behalf of other users. +.B -c +names the user who is the +.I owner +of the connection, where owner is not meant in the unix sense (that +"owner" is set by -u), but as the one who has mounted the directory. +This way it could be possible to mount a public read-only directory, +but to allow the lp daemon to print on NetWare queues. This is +possible, because only users who have write permissions on a directory +may issue ncp requests over a connection. An exception is the owner +(in the sense mentioned above), who is also given 'request +permission'. +.RE + .B -f .I file mode, .B -d @@ -157,7 +172,7 @@ and these options are also used to cover deficiencies in the implementation of ncpfs. I did not implement a scheme to map NetWare permissions to unix permissions. So ncpmount has to be told which -permissions it should assign to the mounted files and direcories. The +permissions it should assign to the mounted files and directories. The values have to be given as octal numbers. The default values are taken from the current umask, where the file mode is the current umask, and the dir mode adds execute permissions where the file mode gives read diff --git a/man/nprint.1 b/man/nprint.1 index 1e1090e..04e6404 100644 --- a/man/nprint.1 +++ b/man/nprint.1 @@ -1,4 +1,4 @@ -.TH NPRINT 8 12/27/1995 nprint nprint +.TH NPRINT 1 12/27/1995 nprint nprint .SH NAME nprint \- NetWare print client .SH SYNOPSIS @@ -11,14 +11,8 @@ nprint \- NetWare print client ] [ .B -n ] [ -.B -P -.I password -] [ .B -C ] [ -.B -S -.I server name -] [ .B -U .I user name ] [ @@ -61,7 +55,7 @@ nprint \- NetWare print client .B -F .I form number ] -file +.B file .SH DESCRIPTION With @@ -71,10 +65,6 @@ you can print files on print queues of a NetWare file server. There are a lot of options, so you should probably wrap some default configurations into some shell scripts. -As you will see, this manpage is not yet complete, but most of the -options should be self-explaining when you look at Novell's nprint -documentation. I promise to fix this with the next release :-). - .SH OPTIONS .B file .RS 3 @@ -90,6 +80,48 @@ filename is given, standard input is used. 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 the print request at the server. +.RE + +.B -P +.I password +.RS 3 +.B password +is the password to use for the print request at the server. If neither +.B -n +nor +.B -P +are given, and the user has no open connection to the server, nprint +prompts for a password. +.RE + +.B -n +.RS 3 +.B -n +should be given if no password is required for the print request. +.RE + +.B -q +.I queue name +.RS 3 +.B queue name +is the name of the print queue to use at the print server. At +present, you must give it in upper case characters. +.RE + +.B -d +.I job description +.RS 3 +.B job description +is the string that appears in pconsole when you list the jobs for the +print queue. It is also printed somewhere on the top of the banner +page. +.RE + .B -p .I pathname .RS 3 @@ -115,4 +147,46 @@ part of the banner page. Default: the name of the file that is printed, or 'stdin'. .RE +.B -l +.I lines +.RS 3 +.B lines +is the number of lines to put on one page. Default: 66 +.RE + +.B -r +.I rows +.RS 3 +.B rows +is the number of rows to put on one page. Default: 80 +.RE + +.B -t +.I tabs +.RS 3 +.B tabs +is the number of spaces to print for a Tab-Character. Default: 8 +.RE + +.B -T +.RS 3 +tells the print server to expand Tab-Character and use 8 spaces +.RE + +.B -N +.RS 3 +tells the print server +.B not +to use Form Feeds +.RE + +.B -F +.I form number +.RS 3 +.B form number +is the the number of the form to be put into the printer. If it's +different from the one currently in the printer, your job is only +printed if a printer operator has put in the correct form. +.RE + diff --git a/man/pqlist.1 b/man/pqlist.1 new file mode 100644 index 0000000..8eca8b3 --- /dev/null +++ b/man/pqlist.1 @@ -0,0 +1,39 @@ +.TH PQLIST 1 01/10/1996 pqlist pqlist +.SH NAME +pqlist \- List available NetWare print queues +.SH SYNOPSIS +.B pqlist +[ +.B -S +.I server +] [ +.B -U +.I user name +] [ +.B -n +] [ +.B -P +.I password +] [ +.I pattern +] +.SH DESCRIPTION +With +.B pqlist, +you can list the NetWare print queues available to you on some +server. If you are already connected to some server, this one is +used. + +.SH OPTIONS + +.B pattern +.RS 3 +.B pattern +is used to list only selected queues. You can use wildcards in the +pattern, but you have to be careful to prevent shell interpretation of +wildcards like '*'. +.RE + +See ncpmount(8) for an explanation of the other options. They are +necessary because you might have to login into a server before it +tells you where you may print. diff --git a/man/slist.1 b/man/slist.1 new file mode 100644 index 0000000..1ed4b36 --- /dev/null +++ b/man/slist.1 @@ -0,0 +1,36 @@ +.TH SLIST 1 01/07/1996 slist slist +.SH NAME +slist \- List available NetWare Servers +.SH SYNOPSIS +.B slist +[ +.I pattern +] +.SH DESCRIPTION +With +.B slist, +you can get a list of NetWare Servers available in your network. If +slist does not print to a tty, the decorative header line is not +printed, so that you can count the servers on your network by doing + +slist | wc -l + + +.SH OPTIONS +.B pattern +.RS 3 +.B pattern +is used to list only selected servers. For a server to be listed, the +pattern must match the full server name. You can use wildcards for the +pattern, but you must protect these wildcards from any command line +expansion by quoting. Case doesn't matter. +.RE + +.SH EXAMPLE +.TP +slist "I*" +.TP +or +.TP +slist "i*" +List all available Netware servers on your Network, that begin with an "I". diff --git a/ncpfs-0.10.lsm b/ncpfs-0.11.lsm similarity index 58% rename from ncpfs-0.10.lsm rename to ncpfs-0.11.lsm index bd4269b..acb2264 100644 --- a/ncpfs-0.10.lsm +++ b/ncpfs-0.11.lsm @@ -1,15 +1,17 @@ Begin3 Title: ncpfs -Version: 0.10 -Entered-date: 03. January 1996 +Version: 0.11 +Entered-date: 10. January 1996 Description: With ncpfs you can mount volumes of your novell - server under Linux. + server under Linux. You need kernel 1.2.x or + 1.3.54 and above. ncpfs does NOT work with any 1.3.x + kernel below 1.3.54. Keywords: filesystem kernel ncp novell netware Author: lendecke@namu01.gwdg.de (Volker Lendecke) Maintained-by: lendecke@namu01.gwdg.de (Volker Lendecke) Primary-site: linux01.gwdg.de:/pub/ncpfs Alternate-site: sunsite.unc.edu:/pub/system/Filesystems/ - ~63k ncpfs-0.10.tgz - ~ 1k ncpfs-0.10.lsm + ~66k ncpfs-0.11.tgz + ~ 1k ncpfs-0.11.lsm Copying-policy: GPL End diff --git a/util/Makefile b/util/Makefile index f4455d6..cf5b50f 100644 --- a/util/Makefile +++ b/util/Makefile @@ -2,14 +2,20 @@ # Makefile for the linux ncp-filesystem routines. # -UTIL_EXECS = ncpmount ncpumount nprint slist -UTILS = $(addprefix $(BINDIR)/,$(UTIL_EXECS)) +UTIL_EXECS = ncpmount ncpumount nprint slist pqlist +UTILS = $(addprefix $(INTERM_BINDIR)/,$(UTIL_EXECS)) +UIDUTILS = ncpmount ncpumount CFLAGS = -Wall $(INCLUDES) -O2 CC = gcc all: $(UTILS) ncptest +install: all + for i in $(UTIL_EXECS); \ + do install --strip $(INTERM_BINDIR)/$$i -m 755 $(BINDIR); done + for i in $(UIDUTILS); do chmod 4755 $(BINDIR)/$$i; done + $(UTILS): $(addsuffix .o,$(UTIL_EXECS)) ncplib.o $(CC) -o $@ $(addsuffix .o,$(notdir $@)) ncplib.o @@ -37,3 +43,4 @@ realclean: clean ifeq (.depend,$(wildcard .depend)) include .depend endif + diff --git a/util/fsinfo.c b/util/fsinfo.c new file mode 100644 index 0000000..fda3174 --- /dev/null +++ b/util/fsinfo.c @@ -0,0 +1,46 @@ +/* + * fsinfo.c + * + * Print the info strings of a server, maybe sometime more. + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + +#include +#include "ncplib.h" + +int +main(int argc, char **argv) +{ + struct ncp_conn conn; + char strings[512]; + char *s; + + if (ncp_initialize(&conn, &argc, argv, 0) != 0) + { + perror("Could not open connection"); + return 1; + } + + if (ncp_get_file_server_description_strings(&conn, strings) != 0) + { + perror("could not get strings"); + ncp_close(&conn); + return 1; + } + + s = strings; + while (s < strings+512) + { + if (strlen(s) == 0) + { + break; + } + puts(s); + s += strlen(s)+1; + } + + ncp_close(&conn); + return 0; +} diff --git a/util/ncplib.c b/util/ncplib.c index 7ab262c..c35c9cc 100644 --- a/util/ncplib.c +++ b/util/ncplib.c @@ -1,7 +1,7 @@ /* * ncplib.c * - * Copyright (C) 1995 by Volker Lendecke + * Copyright (C) 1995, 1996 by Volker Lendecke * */ @@ -208,7 +208,7 @@ ipx_sap_find_nearest(int server_type, struct sockaddr_ipx *result, goto finished; } - memset(&addr, 0, sizeof(addr)); + memzero(addr); addr.sipx_family = AF_IPX; addr.sipx_network = htonl(0x0); addr.sipx_port = htons(0x0); @@ -222,7 +222,7 @@ ipx_sap_find_nearest(int server_type, struct sockaddr_ipx *result, *(unsigned short *)data = htons(IPX_SAP_NEAREST_QUERY); *(unsigned short *)&(data[2]) = htons(server_type); - memset(&addr, 0, sizeof(addr)); + memzero(addr); addr.sipx_family = AF_IPX; addr.sipx_port = htons(IPX_SAP_PORT); addr.sipx_type = IPX_SAP_PTYPE; @@ -289,7 +289,7 @@ ipx_make_reachable(IPXNet network) return -1; } - memset(&rip, 0, sizeof(rip)); + memzero(rip); sock = socket(AF_IPX, SOCK_DGRAM, PF_IPX); @@ -305,7 +305,7 @@ ipx_make_reachable(IPXNet network) goto finished; } - memset(&addr, 0, sizeof(addr)); + memzero(addr); addr.sipx_family = AF_IPX; addr.sipx_network = htonl(0x0); addr.sipx_port = htons(0x0); @@ -710,13 +710,19 @@ ncp_connect_any(struct ncp_conn *conn, int wdog_needed) { struct sockaddr_ipx addr; char name[NCP_BINDERY_NAME_LEN]; + int result; if (ipx_sap_find_nearest(IPX_SAP_FILE_SERVER, &addr, name) != 0) { return -1; } - return ncp_connect_addr(conn, &addr, wdog_needed); + if ((result = ncp_connect_addr(conn, &addr, wdog_needed)) != 0) + { + return result; + } + strcpy(conn->server, name); + return 0; } static int @@ -827,6 +833,8 @@ ncp_open_temporary(struct ncp_conn *conn, return result; } + strcpy(conn->server, spec->server); + if (strlen(spec->user) != 0) { if (ncp_login_user(conn, spec->user, spec->password) != 0) @@ -835,11 +843,119 @@ ncp_open_temporary(struct ncp_conn *conn, errno = EACCES; return -1; } + strcpy(conn->user, spec->user); } return 0; } +static int +ncp_open_permanent(struct ncp_conn *conn, + const struct ncp_conn_spec *spec) +{ + FILE *mtab; + struct ncp_conn_ent *conn_ent; + + if (conn == NULL) + { + errno = EINVAL; + return -1; + } + + if (conn->is_connected != NOT_CONNECTED) + { + errno = EBUSY; + return -1; + } + + if ((mtab = fopen(MOUNTED, "r")) == NULL) + { + return -1; + } + + while ((conn_ent = ncp_get_conn_ent(mtab)) != NULL) + { + if (spec != NULL) + { + if ( (conn_ent->uid != spec->uid) + || ( (strlen(spec->server) != 0) + && (strcasecmp(conn_ent->server, + spec->server) != 0)) + || ( (strlen(spec->user) != 0) + && (strcasecmp(conn_ent->user, + spec->user) != 0))) + { + continue; + } + if (strlen(conn_ent->mount_point) + >= sizeof(conn->mount_point)) + { + continue; + } + } + + conn->mount_fid = open(conn_ent->mount_point, O_RDONLY, 0); + if (conn->mount_fid < 0) + { + continue; + } + + conn->i.version = NCP_GET_FS_INFO_VERSION; + + if (ioctl(conn->mount_fid, NCP_IOC_GET_FS_INFO, &(conn->i))<0) + { + close(conn->mount_fid); + continue; + } + + strncpy(conn->server, conn_ent->server, + sizeof(conn->server)); + strncpy(conn->user, conn_ent->user, + sizeof(conn->user)); + strcpy(conn->mount_point, conn_ent->mount_point); + conn->is_connected = CONN_PERMANENT; + fclose(mtab); + return 0; + } + + fclose(mtab); + return -1; +} + +int +ncp_open(struct ncp_conn *conn, const struct ncp_conn_spec *spec) +{ + if (ncp_open_permanent(conn, spec) != 0) + { + return ncp_open_temporary(conn, spec); + } + return 0; +} + + +int +ncp_open_mount(struct ncp_conn *conn, + const char *mount_point) +{ + conn->is_connected = NOT_CONNECTED; + + if (strlen(mount_point) >= sizeof(conn->mount_point)) + { + errno = ENAMETOOLONG; + return -1; + } + + conn->mount_fid = open(mount_point, O_RDONLY, 0); + if (conn->mount_fid < 0) + { + errno = ENODEV; + return -1; + } + strcpy(conn->mount_point, mount_point); + conn->is_connected = CONN_PERMANENT; + return 0; +} + struct ncp_conn_ent * ncp_get_conn_ent(FILE *filep) { @@ -849,8 +965,8 @@ ncp_get_conn_ent(FILE *filep) struct mntent *mnt_ent; int fid; - memset(&server, 0, sizeof(server)); - memset(&entry, 0, sizeof(entry)); + memzero(server); + memzero(entry); while ((mnt_ent = getmntent(filep)) != NULL) { @@ -913,7 +1029,7 @@ ncp_get_nwc_ent(FILE *nwc) char *user; char *password; - memset(&spec, 0, sizeof(spec)); + memzero(spec); spec.uid = getuid(); while (fgets(line, sizeof(line), nwc) != NULL) @@ -1032,10 +1148,12 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, { static struct ncp_conn_spec spec; + struct ncp_conn conn; + FILE *nwc; struct ncp_conn_spec *nwc_ent; - memset(&spec, 0, sizeof(spec)); + memzero(spec); spec.uid = getuid(); if (server != NULL) @@ -1064,7 +1182,6 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, } strcpy(spec.server, nwc_ent->server); strcpy(spec.user, nwc_ent->user); - strcpy(spec.password, nwc_ent->password); } if (user != NULL) @@ -1076,6 +1193,15 @@ 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); + + if (ncp_open_permanent(&conn, &spec) == 0) + { + ncp_close(&conn); + return &spec; + } + if (password != NULL) { if (strlen(password) >= sizeof(spec.password)) @@ -1141,104 +1267,102 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, str_upper(spec.password); return &spec; } - + int -ncp_open(struct ncp_conn *conn, - const struct ncp_conn_spec *spec) +ncp_initialize(struct ncp_conn *conn, + int *argc, char **argv, + int login_necessary) { - FILE *mtab; - struct ncp_conn_ent *conn_ent; + char *server = NULL; + char *user = NULL; + char *password = NULL; + struct ncp_conn_spec *spec; + int i = 1; - if (conn == NULL) + int get_argument(int arg_no, char **target) { - errno = EINVAL; - return -1; - } - - if (conn->is_connected != NOT_CONNECTED) - { - errno = EBUSY; - return -1; - } + int count = 1; - if ((mtab = fopen(MOUNTED, "r")) == NULL) - { - return -1; - } - - while ((conn_ent = ncp_get_conn_ent(mtab)) != NULL) - { - if (spec != NULL) + if (target != NULL) { - if ( (conn_ent->uid != spec->uid) - || ( (strlen(spec->server) != 0) - && (strcasecmp(conn_ent->server, - spec->server) != 0)) - || ( (strlen(spec->user) != 0) - && (strcasecmp(conn_ent->user, - spec->user) != 0))) + if (arg_no+1 >= *argc) { - continue; - } - if (strlen(conn_ent->mount_point) - >= sizeof(conn->mount_point)) - { - continue; + /* No argument to switch */ + return -1; } + *target = argv[arg_no+1]; + count = 2; } - conn->mount_fid = open(conn_ent->mount_point, O_RDONLY, 0); - if (conn->mount_fid < 0) + /* Delete the consumed switch from the argument list + and decrement the argument count */ + while (count+arg_no < *argc) { - continue; + argv[arg_no] = argv[arg_no+count]; + arg_no += 1; } - - conn->i.version = NCP_GET_FS_INFO_VERSION; - - if (ioctl(conn->mount_fid, NCP_IOC_GET_FS_INFO, &(conn->i))<0) - { - close(conn->mount_fid); - continue; - } - - strncpy(conn->server, conn_ent->server, - sizeof(conn->server)); - strncpy(conn->user, conn_ent->user, - sizeof(conn->user)); - strcpy(conn->mount_point, conn_ent->mount_point); - conn->is_connected = CONN_PERMANENT; - fclose(mtab); + *argc -= count; return 0; } - fclose(mtab); + errno = EINVAL; - return ncp_open_temporary(conn, spec); -} - -int -ncp_open_mount(struct ncp_conn *conn, - const char *mount_point) -{ - conn->is_connected = NOT_CONNECTED; - - if (strlen(mount_point) >= sizeof(conn->mount_point)) + while (i < *argc) + { + if ( (argv[i][0] != '-') + || (strlen(argv[i]) != 2)) + { + i += 1; + continue; + } + + switch (argv[i][1]) + { + case 'S': + if (get_argument(i, &server) != 0) + { + return -1; + } + continue; + case 'U': + if (get_argument(i, &user) != 0) + { + return -1; + } + continue; + case 'P': + if (get_argument(i, &password) != 0) + { + return -1; + } + continue; + case 'n': + if (get_argument(i, 0) != 0) + { + return -1; + } + continue; + } + i += 1; + } + + if (login_necessary == 0) + { + errno = 0; + return ncp_open(conn, NULL); + } + + if ((spec = ncp_find_conn_spec(server, user, password, + getuid())) == NULL) { - errno = ENAMETOOLONG; return -1; } - conn->mount_fid = open(mount_point, O_RDONLY, 0); - if (conn->mount_fid < 0) - { - errno = ENODEV; - return -1; - } - strcpy(conn->mount_point, mount_point); - conn->is_connected = CONN_PERMANENT; - return 0; -} + errno = 0; + return ncp_open(conn, spec); +} + static int ncp_request(struct ncp_conn *conn, int function) { @@ -1384,6 +1508,25 @@ ncp_negotiate_buffersize(struct ncp_conn *conn, } +int +ncp_get_file_server_description_strings(struct ncp_conn *conn, + char target[512]) +{ + int result; + + ncp_init_request_s(conn, 201); + + if ((result = ncp_request(conn, 23)) != 0) + { + ncp_unlock_conn(conn); + return result; + } + + memcpy(target, ncp_reply_data(conn, 0), 512); + ncp_unlock_conn(conn); + return 0; +} + /* * result is a 8-byte buffer */ @@ -1574,7 +1717,7 @@ ncp_get_volume_info_with_number(struct ncp_conn *conn, int n, target->available_dir_entries = ncp_reply_dword(conn, 20); target->sectors_per_block = ncp_reply_byte(conn, 28); - memset(&(target->volume_name), 0, sizeof(target->volume_name)); + memzero(target->volume_name); len = ncp_reply_byte(conn, 29); if (len > NCP_VOLNAME_LEN) { @@ -1656,7 +1799,7 @@ ncp_file_search_continue(struct ncp_conn *conn, fsinfo->sequence_no = ntohs(ncp_reply_word(conn, 0)); - memset(&(target->file_name), 0, sizeof(target->file_name)); + memzero(target->file_name); memcpy(&(target->file_name), ncp_reply_data(conn, 4), NCP_MAX_FILENAME); @@ -1721,7 +1864,7 @@ ncp_open_file(struct ncp_conn *conn, memcpy(&(target->file_id), ncp_reply_data(conn, 0), NCP_FILE_ID_LEN); - memset(&(target->file_name), 0, sizeof(target->file_name)); + memzero(target->file_name); memcpy(&(target->file_name), ncp_reply_data(conn, 8), NCP_MAX_FILENAME); @@ -1777,7 +1920,7 @@ ncp_do_create(struct ncp_conn *conn, memcpy(&(target->file_id), ncp_reply_data(conn, 0), NCP_FILE_ID_LEN); - memset(&(target->file_name), 0, sizeof(target->file_name)); + memzero(target->file_name); memcpy(&(target->file_name), ncp_reply_data(conn, 8), NCP_MAX_FILENAME); diff --git a/util/ncplib.h b/util/ncplib.h index 38477e4..4bc2076 100644 --- a/util/ncplib.h +++ b/util/ncplib.h @@ -1,7 +1,7 @@ /* * ncplib.h * - * Copyright (C) 1995 by Volker Lendecke + * Copyright (C) 1995, 1996 by Volker Lendecke * */ @@ -17,6 +17,10 @@ #include "ipxlib.h" +#ifndef memzero +#define memzero(object) memset(&(object), 0, sizeof(object)) +#endif + enum connect_state { NOT_CONNECTED = 0, CONN_PERMANENT, @@ -63,6 +67,16 @@ struct ncp_conn_spec { char password[NCP_BINDERY_NAME_LEN]; }; +/* ncp_initialize is the main entry point for user programs which want + to connect to a NetWare Server. It looks for -S, -U, -P and -n in + the argument list, opens the connection and removes the arguments + from the list. It was designed after the X Windows init + functions. */ +int +ncp_initialize(struct ncp_conn *conn, + int *argc, char **argv, + int login_necessary); + /* Open an existing permanent connection */ int ncp_open(struct ncp_conn *conn, @@ -109,6 +123,10 @@ struct ncp_conn_spec * ncp_find_conn_spec(const char *server, const char *user, const char *password, uid_t uid); +int +ncp_get_file_server_description_strings(struct ncp_conn *conn, + char target[512]); + int ncp_get_encryption_key(struct ncp_conn *conn, char *target); diff --git a/util/ncpmount.c b/util/ncpmount.c index e2161d7..5079390 100644 --- a/util/ncpmount.c +++ b/util/ncpmount.c @@ -192,15 +192,14 @@ main(int argc, char *argv[]) progname = argv[0]; + memzero(data); memzero(spec); memzero(conn); + if (geteuid() != 0) { fprintf(stderr, "%s must be installed suid root\n", progname); exit(1); } - memset(&data, 0, sizeof(data)); - memset(&spec, 0, sizeof(spec)); - data.uid = getuid(); data.gid = getgid(); um = umask(0); @@ -405,7 +404,7 @@ main(int argc, char *argv[]) exit(1); } - memset(&addr, 0, sizeof(addr)); + memzero(addr); addr.sipx_type = NCP_PTYPE; if (bind(data.ncp_fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) diff --git a/util/nprint.c b/util/nprint.c index e0d659a..fd61b8d 100644 --- a/util/nprint.c +++ b/util/nprint.c @@ -1,57 +1,35 @@ /* * nwprint.c * + * Send data to a NetWare print queue. + * * Copyright (C) 1995 by Volker Lendecke * */ #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -/* #include */ /* generates a warning here */ -extern pid_t waitpid(pid_t, int *, int); -#include #include #include #include -#include #include -#include -#include -#include +#include -#include -#include -#include -#include #include "ncplib.h" static char *progname; static void usage(void); +static void +str_upper(char *name); void main(int argc, char *argv[]) { struct ncp_conn conn; - char *server = NULL; - char *user = NULL; - char *password = NULL; - struct ncp_conn_spec *spec; - - char *queue = "*"; + char default_queue[] = "*"; + char *queue = default_queue; int opt; @@ -68,8 +46,13 @@ main(int argc, char *argv[]) progname = argv[0]; - memset(&spec, 0, sizeof(spec)); - memset(&j, 0, sizeof(j)); + memzero(j); memzero(pj); memzero(q); memzero(conn); + + if (ncp_initialize(&conn, &argc, argv, 1) != 0) + { + perror("Could not open connection"); + exit(1); + } /* * Fill in default values for print job @@ -78,9 +61,7 @@ main(int argc, char *argv[]) /* at once */ memset(&(j.j.TargetExecTime), 0xff, sizeof(j.j.TargetExecTime)); j.j.JobType = htons(0); - strcpy(j.j.JobTextDescription, "Test Job"); - - memset(&pj, 0, sizeof(pj)); + strcpy(j.j.JobTextDescription, "No Description"); pj.Version = 0; pj.TabSize = 8; @@ -90,8 +71,7 @@ main(int argc, char *argv[]) pj.Rows = htons(80); strcpy(pj.FnameHeader, "stdin"); - while ((opt = getopt(argc, argv, - "S:U:P:nq:d:p:b:f:l:r:c:t:F:TN"))!=EOF) + while ((opt = getopt(argc, argv, "q:d:p:b:f:l:r:c:t:F:TN"))!=EOF) { switch (opt) { case 'p': @@ -195,39 +175,6 @@ main(int argc, char *argv[]) } j.j.JobType = htons(atoi(optarg)); break; - case 'S': - /* File Server */ - if (strlen(optarg) >= sizeof(spec->server)) - { - fprintf(stderr, "Servername too long:%s\n", - optarg); - exit(1); - } - server = optarg; - break; - case 'U': - /* User to use */ - if (strlen(optarg) >= sizeof(spec->user)) - { - fprintf(stderr, "Username too long: %s\n", - optarg); - exit(1); - } - user = optarg; - break; - case 'P': - /* Password */ - if (strlen(optarg) >= sizeof(spec->password)) - { - printf("password too long\n"); - exit(1); - } - password = optarg; - break; - case 'n': - /* use no password */ - password = ""; - break; case 'q': /* Queue name to print on, default: '*' */ if (strlen(optarg) >= NCP_BINDERY_NAME_LEN) @@ -305,17 +252,7 @@ main(int argc, char *argv[]) memcpy(j.j.ClientRecordArea, &pj, sizeof(pj)); - if ((spec = ncp_find_conn_spec(server, user, password, 0)) == NULL) - { - perror("could not find connection"); - exit(1); - } - - if (ncp_open(&conn, spec) != 0) - { - perror("could not open connection"); - exit(1); - } + str_upper(queue); if (ncp_scan_bindery_object(&conn, 0xffffffff, NCP_BINDERY_PQUEUE, queue, &q) != 0) @@ -346,7 +283,7 @@ main(int argc, char *argv[]) } written += read_this_time; - } while (read_this_time == sizeof(buf)); + } while (read_this_time > 0); close(file); @@ -364,3 +301,12 @@ usage(void) fprintf(stderr, "usage: %s [options] file\n", progname); exit(1); } + +static void +str_upper(char *name) +{ + while (*name) { + *name = toupper(*name); + name = name + 1; + } +} diff --git a/util/nwlsconn.c b/util/nwlsconn.c deleted file mode 100644 index d921a6a..0000000 --- a/util/nwlsconn.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * nwlsconn.c - * - * Copyright (C) 1995 by Volker Lendecke - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "ncplib.h" - -void -main(void) -{ - struct ncp_ioctl_conn conn; - struct passwd *pwd; - - conn.connection = NCP_NO_CONNECTION; - - if (isatty(1)) - { - printf("\n%-30s %-30s %s\n" - "-----------------------------------------------" - "---------------------------\n", - "Server Name", - "NetWare Login Name", - "Conn. Owner"); - } - - while (ncp_list_conn(&conn) == 0) - { - pwd = getpwuid(conn.uid); - printf("%-30s %-30s %s\n", conn.server, conn.user, - pwd == NULL ? "" : pwd->pw_name); - } -} diff --git a/util/pqlist.c b/util/pqlist.c new file mode 100644 index 0000000..3958f65 --- /dev/null +++ b/util/pqlist.c @@ -0,0 +1,75 @@ +/* + * pqlist.c + * + * List all print queues on a server + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + +#include +#include +#include +#include "ncplib.h" + +int +main(int argc, char **argv) +{ + struct ncp_conn conn; + struct ncp_bindery_object q; + int found = 0; + + char default_pattern[] = "*"; + char *pattern = default_pattern; + char *p; + + if (ncp_initialize(&conn, &argc, argv, 1) != 0) + { + perror("Could not open connection"); + 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); + } + + if (isatty(1)) + { + printf("\nServer: %s\n", conn.server); + printf("%-52s%-10s\n" + "-----------------------------------------------" + "-------------\n", + "Print queue name", + "Queue ID"); + } + + q.object_id = 0xffffffff; + + while (ncp_scan_bindery_object(&conn, q.object_id, + NCP_BINDERY_PQUEUE, "*", &q) == 0) + { + found = 1; + printf("%-52s", q.object_name); + printf("%08lx\n", q.object_id); + } + + if ((found == 0) && (isatty(1))) + { + printf("No queues found\n"); + } + + ncp_close(&conn); + return 0; +} diff --git a/util/slist.c b/util/slist.c index e34f569..b0b4206 100644 --- a/util/slist.c +++ b/util/slist.c @@ -1,6 +1,8 @@ /* * slist.c * + * List all file server that are known in the IPX network. + * * Copyright (C) 1995 by Volker Lendecke * */ @@ -18,7 +20,7 @@ main(int argc, char *argv[]) struct ncp_conn conn; struct ncp_bindery_object obj; int found = 0; - char default_pattern[2] = "*"; + char default_pattern[] = "*"; char *pattern = default_pattern; char *p; @@ -38,9 +40,7 @@ main(int argc, char *argv[]) *p = toupper(*p); } - memset(&conn, 0, sizeof(conn)); - - if (ncp_open(&conn, NULL) != 0) + if (ncp_initialize(&conn, &argc, argv, 0) != 0) { perror("ncp_connect"); exit(1);