From 7bef99df0f8ee6eb093de1483dba0bdd1ef30236 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.14 --- .downloads/ncpfs-0.14.tgz | Bin 0 -> 70397 bytes BUGS | 17 +- Changes | 9 + Makefile | 4 +- man/ipx_configure.8 | 19 ++- man/ipx_interface.8 | 25 ++- man/ipx_route.8 | 6 +- man/ncpmount.8 | 110 ++++++------ man/ncpumount.8 | 7 +- man/nprint.1 | 42 ++++- man/nwclient.5 | 17 +- man/pqlist.1 | 86 ++++++++-- man/slist.1 | 25 ++- ncpfs-0.13.lsm => ncpfs-0.14.lsm | 8 +- util/Makefile | 7 +- util/fsinfo.c | 60 +++++-- util/ncplib.c | 221 +++++++++++++++++++++++- util/ncplib.h | 42 +++++ util/ncpmount.c | 10 -- util/ncptest.c | 13 +- util/nprint.c | 43 ++++- util/pqlist.c | 2 +- util/pserver.c | 282 +++++++++++++++++++++++++++++++ 23 files changed, 894 insertions(+), 161 deletions(-) create mode 100644 .downloads/ncpfs-0.14.tgz rename ncpfs-0.13.lsm => ncpfs-0.14.lsm (79%) create mode 100644 util/pserver.c diff --git a/.downloads/ncpfs-0.14.tgz b/.downloads/ncpfs-0.14.tgz new file mode 100644 index 0000000000000000000000000000000000000000..1f4e477c1a227d81d014447615b7229b126eea63 GIT binary patch literal 70397 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 T^0WMW(a-+_pFvYs000F5EJU~V literal 0 HcmV?d00001 diff --git a/BUGS b/BUGS index ec20fff..1f44a88 100644 --- a/BUGS +++ b/BUGS @@ -3,6 +3,8 @@ them to be bugs. But there are really problems that might be fixed in the future. +------------------------------------------------------------------------------- + 'df' returns 0: Free disk space is distributed among the volumes in NetWare. df is only able to report one number per mounted filesystem. As connections @@ -10,10 +12,19 @@ are quite expensive for NetWare (with lwared that might change ...), I rejected the alternative to mount only a single volume for a unix mount point. So I simply return 0. +------------------------------------------------------------------------------- -In your kernel log, there will appear messages like +If you use Linux 1.2.x, In your kernel log there will appear messages +like Nov 25 16:09:08 lx01 kernel: alloc_skb called nonatomically from interrupt 0000002e -These are a bit annoying, but completely harmless. Maybe this will be -fixed in the future. +These are a bit annoying, but completely harmless. + +------------------------------------------------------------------------------- + +ncpfs has a problem with NetWare 4.1, when files are created. I think +NW4.1 does not like some of the creation mode bits. If somebody with +access to a NW4.1 server could compile the kernel module for 1.2 with +-DDEBUG_NCP=2, and send me the syslog output gzipped/uuencoded, I +might find out more about that problem. diff --git a/Changes b/Changes index 0882828..035ba36 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,15 @@ I only began this file with ncpfs-0.12. If you're interested in older versions, you can find them on linux01.gwdg.de:/pub/ncpfs/old. +ncpfs-0.13 -> ncpfs-0.14 + +- Improvements of manual pages by B. Galliart and + Terry Dawson +- fsinfo +- pserver.c. Please see this as ALPHA software. There is no + documentation, and it is not tested enough. But it might be useful for + you. + ncpfs-0.12 -> ncpfs-0.13 - support for automatic loading of ncpfs.o by kerneld. diff --git a/Makefile b/Makefile index 3c5ff50..5d38410 100644 --- a/Makefile +++ b/Makefile @@ -16,8 +16,8 @@ SUBDIRS = util ipx-0.75 man # the following lines. You have to recompile your kernel # and say 'y' when 'make config' asks you for IPX and ncpfs. # -SUBDIRS += kernel-1.2/src -INCLUDES = -I$(TOPDIR)/kernel-1.2 +#SUBDIRS += kernel-1.2/src +#INCLUDES = -I$(TOPDIR)/kernel-1.2 # If you are using kerneld to autoload ncp support, # uncomment this (kerneld is in linux since about 1.3.57): diff --git a/man/ipx_configure.8 b/man/ipx_configure.8 index 8bb1c96..0caf463 100644 --- a/man/ipx_configure.8 +++ b/man/ipx_configure.8 @@ -1,6 +1,6 @@ .TH IPX_CONFIGURE 8 "IPX Utilities" "Caldera, Inc." .SH NAME -ipx_configure \- query/configure IPX behavior +ipx_configure \- display/configure IPX behavior .SH SYNOPSIS .B ipx_configure [\-\-help] @@ -8,7 +8,7 @@ ipx_configure \- query/configure IPX behavior [\-\-auto_primary=[on|off]] .SH DESCRIPTION .B ipx_configure -queries or configures IPX behavior with respect to automatic IPX +displays or configures IPX behavior with respect to automatic IPX interface detection. IPX can be configured to automatically create interfaces as they are detected. It can also be configured to automatically select a primary interface when none is explicitly @@ -23,15 +23,20 @@ arguments is described in the section .SS OPTIONS .TP .I "\-\-auto_interface=[on|off]" -This argument either turns on or off the behavior of automatically creating -interfaces. +This argument enables or disables the feature that will automatically detect +whether IPX is use on a network interface. If +.B on +and IPX packets are seen on an interface that interface will be automatically +flagged as an IPX interface. The default setting is +.B off. .TP .I "\-\-auto_primary=[on|off]" -This argument either turns on or off the behavior of automatically selecting -a primary interface. +This argument enables or disables the feature that will automatically select +which IPX interface will be the primary IPX interface. The default setting is +.B off. .TP .I "\-\-help" -Print out information about utility. +Displays summarised usage instructions. .SH FILES .I /proc/net/ipx_interface .SH BUGS diff --git a/man/ipx_interface.8 b/man/ipx_interface.8 index 55eae22..0e93a33 100644 --- a/man/ipx_interface.8 +++ b/man/ipx_interface.8 @@ -1,6 +1,6 @@ .TH IPX_INTERFACE 8 "IPX Utilities" "Caldera, Inc." .SH NAME -ipx_interface \- add, delete, or display an IPX interface +ipx_interface \- add, delete, or display IPX interface configuration. .SH SYNOPSIS .B ipx_interface add [-p] device frame_type [network number] @@ -15,11 +15,11 @@ check device frame_type help .SH DESCRIPTION .B ipx_interface -adds, deletes, or displays IPX interfaces depending on the option selected. +adds, deletes, or displays the configuration of the specified IPX interface. .P An IPX interface is the item to which IPX sockets are bound. -An IPX interface corresponds to an IPX Network Number which corresponds -to a physical device and frame type. A sample IPX Interface would be: +An IPX interface has an associated IPX Network Number, a physical device +and frame type. A sample IPX Interface might look like: .LP Network Number: 0x00ABCDEF .LP @@ -35,22 +35,21 @@ or default interface. .I add This option is used to create an IPX interface. If the .B -p -flag is used, the interface is made -.B -PRIMARY. -The network number can be optionally assigned. If it is not assigned, it -is set to 0 which indicates it should be detected from the traffic on the -network. +flag is used, the interface is flagged as the +.B PRIMARY +interface. The IPX network number may optionally be specified. If it is not +specified it is set to 0 which indicates it should be automatically detected +by analysis of the existing IPX traffic on the network. .TP .I del This option is used to delete an IPX interface. .TP .I check -This option is used to display the device, frame type, and network number -of an IPX interface. +This option is used to display the network number associated with a specified +device and frame type combination. .TP .I help -This option displays information about the utility. +This option displays summarised usage instructions. .SH FILES .I /proc/net/ipx_interface /proc/net/ipx_route .SH BUGS diff --git a/man/ipx_route.8 b/man/ipx_route.8 index 2f8eb3e..011e7bf 100644 --- a/man/ipx_route.8 +++ b/man/ipx_route.8 @@ -1,6 +1,6 @@ .TH IPX_ROUTE 8 "IPX Utilities" "Caldera, Inc." .SH NAME -ipx_route \- add or delete IPX route +ipx_route \- add or delete an IPX route. .SH SYNOPSIS .B ipx_route add target_network router_network router_node @@ -10,11 +10,11 @@ del target_network .SH DESCRIPTION .B ipx_route adds or deletes an IPX route. -The kernel IPX stores only one route per target network at a time. +The kernel IPX software stores only one route to any target network. .SS OPTIONS .TP .I add -This option is used to set up the route to a target network. +This option is used to configure a route to a target network. .TP .I del This option is used to delete the route to a target network. diff --git a/man/ncpmount.8 b/man/ncpmount.8 index 3061872..847588c 100644 --- a/man/ncpmount.8 +++ b/man/ncpmount.8 @@ -1,27 +1,27 @@ .TH NCPMOUNT 8 12/27/1995 ncpmount ncpmount .SH NAME -ncpmount \- mount program for ncpfs +ncpmount \- mount all volumes of a specified Novell fileserver. .SH SYNOPSIS .B ncpmount [ +.B -h +] [ .B -S .I server ] [ -.B -h -] [ -.B -n +.B -U +.I user name ] [ .B -P .I password +| +.B -n ] [ .B -C ] [ .B -c .I client name ] [ -.B -U -.I user name -] [ .B -u .I uid ] [ @@ -37,10 +37,11 @@ ncpmount \- mount program for ncpfs mount-point .SH DESCRIPTION -This program is an interface to the NCP filesystem. +This program is used to mount all volumes of the specified NetWare Fileserver +under the specified mount point. .B ncpfs -is a filesystem which understands the NCP protocol. This is the +is a linux filesystem which understands the NCP protocol. This is the protocol Novell NetWare clients use to talk to NetWare servers. ncpfs was inspired by .B lwared, @@ -48,18 +49,23 @@ a free NetWare emulator for Linux written by Ales Dryak. See ftp://klokan.sh.cvut.cz/pub/linux for this very intersting program. .B ncpmount -looks up the file +when invoked with all appropriate arguments attaches, logs in and +mounts all of the volumes associated with the specified fileserver that are +readable by the user id under the specified mount point. +.B ncpmount +when invoked without any arguments specifying the fileserver, user id and +password checks 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 .nwclient MUST be 600, for security reasons. +to find a file server, a user name and possibly a password to use for the +specified mount point. See nwclient(5) for more information. Please note +that the access permissions of .nwclient MUST be 600, for security reasons. .SH OPTIONS .B mount-point .RS 3 .B mount-point -is the directory you want to mount the filesystem over. It's the same -as in the normal mount command. +is the directory you want to mount the filesystem over. Its function is the +the same as for a normal mount command. If the real uid of the caller is not root, .B ncpmount @@ -87,42 +93,40 @@ is used to print out a short help text. .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. +By default passwords are converted to uppercase before they are sent +to the server because most servers require this. This option disables this +feature ensuring that passwords are sent without any case conversion. .RE .B -n .RS 3 .B -n -should be given to mount shares which do not require a password to log in. +must be specified for logins that do not have a password configured. .RE .B -P .I password .RS 3 -You may want to give the password required by the server on the -command line. You should be careful to use passwords in scripts. +specifies the password to use for the Netware user id. If neither .B -n -nor +nor the .B -P -are given, ncpmount prompts for a password. This makes it difficult to -use in scripts such as /etc/rc. But that's not ncpmount's fault, but a -general problem with the fact that you need a password on every -login. If anybody has a satisfying solution to this problem, please -tell me. +arguments are specified ncpmount will prompt for a password. This +makes it difficult to use in scripts such as /etc/rc. If you want to +have ncpmount work automatically from a script you must include the +appropriate option and be very careful to ensure that appopriate file +permissions are set for the script that includes your password to +ensure that others can not read it. .RE .B -U .I user name .RS 3 -If the user name your NetWare administrator gave to you differs -from your unix user-id, you should use -.B -U -to tell the server about you NetWare user name. +Specifies the Netware user id to use when logging in to the fileserver. If +this option is not specified then ncpmount will attempt to login to the +fileserver using the Linux login id of the user invoking ncpmount. .RE .B -u @@ -130,9 +134,9 @@ to tell the server about you NetWare user name. .B -g .I gid .RS 3 -Currently I did not implement a mapping from NetWare users/groups to -unix users/groups. Unix requires that each file has an owner -and a group it belongs to. With +ncpmount does not yet implement a scheme for mapping NetWare users/groups +to Linux users/groups. Linux requires that each file has an owner and group id. +With .B -u and .B -g @@ -145,19 +149,20 @@ The defaults for these values are the current uid and gid. .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, +of the connection, where owner does not refer to file ownership (that +"owner" is set by the -u argument), but the owner of the mount, ie: who +is allowed to call ncpumount on this mount. The default owner of the +connection and the mount is the user who called ncpmount. This option +allows you to specify that some other user should be set as the owner. + +In this this way it is 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'. +possible because only users who have write permissions on a directory +may issue ncp requests over a connection. The exception to this rule +is the 'mount owner', who is also granted 'request permission'. .RE .B -f @@ -169,14 +174,11 @@ Like .B -u and .B -g, -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 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 -permissions. +these options are used to determine what permissions should be assigned +files and directories of the mounted volumes. The values must be specified +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 permissions. Note that these permissions can differ from the rights the server gives to us. If you do not have write permissions on the server, you @@ -185,7 +187,9 @@ certainly cannot override the restrictions imposed by the server. .RE .SH NOTES -If you have difficulties in mounting, please make sure that you have configured your ipx subsystem correctly. It is especially important that there is a route to the internal network of your server. +You must configure the IPX subsystem before ncpmount will work. +It is especially important that there is a route to the internal network +of your server. .SH ENVIRONMENT VARIABLES .B USER / LOGNAME diff --git a/man/ncpumount.8 b/man/ncpumount.8 index 7848f87..8e38d8f 100644 --- a/man/ncpumount.8 +++ b/man/ncpumount.8 @@ -1,13 +1,14 @@ .TH NCPUMOUNT 8 12/27/1995 ncpumount ncpumount .SH NAME -ncpumount \- umount for normal users +ncpumount \- unmount a NetWare filesystem mounted with ncpmount. .SH SYNOPSIS .B ncpumount .B mount-point .SH DESCRIPTION -With this program, normal users can unmount ncp-filesystems, provided -that it is suid root. +This utility unmounts a NetWare filesystem that was previously mounted +with the ncpmount utility. If the this utility is made suid root then +non-root users will also be able to make use of it. .B ncpumount has been written to give normal linux-users more control over their diff --git a/man/nprint.1 b/man/nprint.1 index 04e6404..850d37a 100644 --- a/man/nprint.1 +++ b/man/nprint.1 @@ -9,18 +9,16 @@ nprint \- NetWare print client ] [ .B -h ] [ -.B -n -] [ -.B -C -] [ .B -U .I user name ] [ .B -P .I password -] [ + | .B -n ] [ +.B -C +] [ .B -q .I queue name ] [ @@ -65,6 +63,13 @@ 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. +.B nprint +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 .nwclient MUST be 600, for security reasons. + .SH OPTIONS .B file .RS 3 @@ -73,6 +78,12 @@ is the name of the file you want to print. If file is '-', or no filename is given, standard input is used. .RE +.B -h +.RS 3 +.B -h +is used to print out a short help text. +.RE + .B -S .I server .RS 3 @@ -105,12 +116,20 @@ prompts for a password. should be given if no password is required for the print request. .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 -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. +present, you must specify it in upper case characters. .RE .B -d @@ -161,6 +180,13 @@ is the number of lines to put on one page. Default: 66 is the number of rows to put on one page. Default: 80 .RE +.B -c +.I copies +.RS 3 +.B copies +tells the print server to the specified number of copies. Default: 1 +.RE + .B -t .I tabs .RS 3 @@ -189,4 +215,8 @@ different from the one currently in the printer, your job is only printed if a printer operator has put in the correct form. .RE +.SH SEE ALSO +.B nwclient(5), slist(1), pqlist(1), ncpmount(8), ncpumount(8) +.SH CREDITS +nprint was written by Volker Lendecke (lendecke@namu01.gwdg.de) diff --git a/man/nwclient.5 b/man/nwclient.5 index 332b156..afe6da3 100644 --- a/man/nwclient.5 +++ b/man/nwclient.5 @@ -13,8 +13,8 @@ connection. Lines beginning with # and empty lines are ignored as comments. Because you can store passwords in .nwclient, the user programs will -only scan .nwclient if ONLY the file owner has any access rights to -the file. +only scan .nwclient when only the file owner has access rights to +the file. The file must be have permissions 0600. To specify a NWClient connection, the name of the file server, the user name to be used and a password is necessary. The server name and @@ -40,3 +40,16 @@ the the file server FS311 with user name ME on /mnt after asking the user for a password. \'nwmount -S cd-serv /cd' will silently mount the server cd-serv on /cd. + +.B nprint +, +.B pqlist +and other user programs that require a valid login also look up +.I $HOME/.nwclient +to find a file server, a user name and possibly a password. + +Please note that the access permissions of .nwclient MUST be 600, for +security reasons. + +.SH SEE ALSO +.B ncpmount(8), ncpumount(8), slist(1), pqlist(1), nprint(1) diff --git a/man/pqlist.1 b/man/pqlist.1 index 8eca8b3..793dce2 100644 --- a/man/pqlist.1 +++ b/man/pqlist.1 @@ -4,25 +4,40 @@ pqlist \- List available NetWare print queues .SH SYNOPSIS .B pqlist [ +.B -h +] [ .B -S .I server ] [ .B -U .I user name ] [ -.B -n -] [ .B -P .I password + | +.B -n +] [ +.B -C ] [ .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. +.B pqlist +lists all the NetWare print queues available to you on some server. +If you are already connected to some server, this one is used. + +If pqlist does not print to a tty, the decorative header line is +not printed, so that you can count the printing queue available +on your server by doing + + pqlist -S server | wc -l + +.B pqlist +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 .nwclient MUST be 600, for security reasons. .SH OPTIONS @@ -34,6 +49,57 @@ 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. +.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 name +.RS 3 +If the user name your NetWare administrator gave to you differs +from your unix user-id, you should use +.B -U +to tell the server about you NetWare user name. +.RE + +.B -P +.I password +.RS 3 +You may want to give the password required by the server on the +command line. You should be careful to use passwords in scripts. +.RE + +.B -n +.RS 3 +.B -n +should be given to mount shares which do not require a password to log in. + +If neither +.B -n +nor +.B -P +are given, pqlist prompts for a password. +.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 + +.SH SEE ALSO +.B nwclient(5), nprint(1), slist(1), ncpmount(8), ncpumount(8) + +.SH CREDITS +pqlist was written by Volker Lendecke (lendecke@namu01.gwdg.de) diff --git a/man/slist.1 b/man/slist.1 index 1ed4b36..13065a6 100644 --- a/man/slist.1 +++ b/man/slist.1 @@ -1,16 +1,16 @@ .TH SLIST 1 01/07/1996 slist slist .SH NAME -slist \- List available NetWare Servers +slist \- Lists 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 +.B slist +lists all 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 @@ -20,10 +20,10 @@ slist | wc -l .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. +is used to list only servers whose names match the specified pattern. 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 @@ -34,3 +34,10 @@ or .TP slist "i*" List all available Netware servers on your Network, that begin with an "I". + + +.SH SEE ALSO +.B ncpmount(8), ncpumount(8), pqlist(1), nprint(1) + +.SH CREDITS +slist was written by Volker Lendecke (lendecke@namu01.gwdg.de) diff --git a/ncpfs-0.13.lsm b/ncpfs-0.14.lsm similarity index 79% rename from ncpfs-0.13.lsm rename to ncpfs-0.14.lsm index 4e237fd..b0fd580 100644 --- a/ncpfs-0.13.lsm +++ b/ncpfs-0.14.lsm @@ -1,7 +1,7 @@ Begin3 Title: ncpfs -Version: 0.13 -Entered-date: 14. January 1996 +Version: 0.14 +Entered-date: 09. February 1996 Description: With ncpfs you can mount volumes of your novell server under Linux. You need kernel 1.2.x or 1.3.54 and above. ncpfs does NOT work with any 1.3.x @@ -11,7 +11,7 @@ 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/ - ~67k ncpfs-0.13.tgz - ~ 1k ncpfs-0.13.lsm + ~70k ncpfs-0.14.tgz + ~ 1k ncpfs-0.14.lsm Copying-policy: GPL End diff --git a/util/Makefile b/util/Makefile index b5ea70c..a831295 100644 --- a/util/Makefile +++ b/util/Makefile @@ -2,11 +2,12 @@ # Makefile for the linux ncp-filesystem routines. # -UTIL_EXECS = ncpmount ncpumount nprint slist pqlist +UTIL_EXECS = ncpmount ncpumount nprint slist pqlist fsinfo pserver UTILS = $(addprefix $(INTERM_BINDIR)/,$(UTIL_EXECS)) UIDUTILS = ncpmount ncpumount -CFLAGS = -Wall $(INCLUDES) -O2 $(KERNELD) +# CFLAGS = -Wall $(INCLUDES) -O2 $(KERNELD) +CFLAGS = -Wall $(INCLUDES) $(KERNELD) -O2 CC = gcc all: $(UTILS) ncptest @@ -17,7 +18,7 @@ install: all for i in $(UIDUTILS); do chmod 4755 $(BINDIR)/$$i; done $(UTILS): $(addsuffix .o,$(UTIL_EXECS)) ncplib.o - $(CC) -s -o $@ $(addsuffix .o,$(notdir $@)) ncplib.o + $(CC) -o $@ $(addsuffix .o,$(notdir $@)) ncplib.o ncplib.o: ncplib.c ncplib.h $(CC) $(CFLAGS) -finline-functions -c ncplib.c diff --git a/util/fsinfo.c b/util/fsinfo.c index fda3174..3b86fcb 100644 --- a/util/fsinfo.c +++ b/util/fsinfo.c @@ -8,14 +8,14 @@ */ #include +#include #include "ncplib.h" int main(int argc, char **argv) { struct ncp_conn conn; - char strings[512]; - char *s; + int opt; if (ncp_initialize(&conn, &argc, argv, 0) != 0) { @@ -23,22 +23,54 @@ main(int argc, char **argv) return 1; } - if (ncp_get_file_server_description_strings(&conn, strings) != 0) + while ((opt = getopt(argc, argv, "dt")) != EOF) { - perror("could not get strings"); - ncp_close(&conn); - return 1; - } - - s = strings; - while (s < strings+512) - { - if (strlen(s) == 0) + switch(opt) { + case 'd': + { + char strings[512]; + char *s; + + if (ncp_get_file_server_description_strings(&conn, + strings) + != 0) + { + perror("could not get strings"); + ncp_close(&conn); + return 1; + } + + s = strings; + while (s < strings+512) + { + if (strlen(s) == 0) + { + break; + } + puts(s); + s += strlen(s)+1; + } + break; + } + case 't': + { + time_t t; + + if (ncp_get_file_server_time(&conn, &t) != 0) + { + perror("could not get server time"); + ncp_close(&conn); + return 1; + } + + fputs(ctime(&t), stdout); + break; + } + default: + printf("unknown option: %c\n", opt); break; } - puts(s); - s += strlen(s)+1; } ncp_close(&conn); diff --git a/util/ncplib.c b/util/ncplib.c index 9d538f7..ba6ed08 100644 --- a/util/ncplib.c +++ b/util/ncplib.c @@ -34,8 +34,13 @@ extern pid_t wait(int *); static int ncp_negotiate_buffersize(struct ncp_conn *conn, int size, int *target); +static int +ncp_login_object(struct ncp_conn *conn, + const unsigned char *username, + int login_type, + const unsigned char *password); -static void +void str_upper(char *name) { while (*name) { @@ -837,7 +842,8 @@ ncp_open_temporary(struct ncp_conn *conn, if (strlen(spec->user) != 0) { - if (ncp_login_user(conn, spec->user, spec->password) != 0) + if (ncp_login_object(conn, spec->user, spec->login_type, + spec->password) != 0) { ncp_close(conn); errno = EACCES; @@ -1269,9 +1275,9 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, } int -ncp_initialize(struct ncp_conn *conn, - int *argc, char **argv, - int login_necessary) +ncp_initialize_as(struct ncp_conn *conn, + int *argc, char **argv, + int login_necessary, int login_type) { char *server = NULL; char *user = NULL; @@ -1361,9 +1367,20 @@ ncp_initialize(struct ncp_conn *conn, errno = 0; + spec->login_type = login_type; + return ncp_open(conn, spec); } +int +ncp_initialize(struct ncp_conn *conn, + int *argc, char **argv, + int login_necessary) +{ + return ncp_initialize_as(conn, argc, argv, login_necessary, + NCP_BINDERY_USER); +} + static int ncp_request(struct ncp_conn *conn, int function) { @@ -1377,12 +1394,49 @@ ncp_request(struct ncp_conn *conn, int function) return -ENOTCONN; } +/****************************************************************************/ +/* */ +/* Helper functions */ +/* */ +/****************************************************************************/ + static inline int min(int a, int b) { return (asecond; + u_time.tm_min = source->minute; + u_time.tm_hour = source->hour; + u_time.tm_mday = source->day; + u_time.tm_mon = source->month - 1; + u_time.tm_year = source->year; + + if (u_time.tm_year < 80) + { + u_time.tm_year += 100; + } + + return mktime(&u_time); +} + static void assert_conn_locked(struct ncp_conn *conn) { @@ -1528,6 +1582,50 @@ ncp_get_file_server_description_strings(struct ncp_conn *conn, return 0; } +int +ncp_get_file_server_time(struct ncp_conn *conn, time_t *target) +{ + int result; + + ncp_init_request(conn); + + if ((result = ncp_request(conn, 20)) != 0) + { + ncp_unlock_conn(conn); + return result; + } + + *target= nw_to_ctime((struct nw_time_buffer *)ncp_reply_data(conn, 0)); + ncp_unlock_conn(conn); + return 0; +} + +int +ncp_get_connlist(struct ncp_conn *conn, __u32 last_id, + __u16 object_type, const char *object_name, + int *returned_no, __u16 conn_numbers[256]) +{ + int result; + + ncp_init_request_s(conn, 27); + ncp_add_dword(conn, htonl(last_id)); + ncp_add_word(conn, htons(object_type)); + ncp_add_pstring(conn, object_name); + + if ((result = ncp_request(conn, 23)) != 0) + { + ncp_unlock_conn(conn); + return result; + } + + *returned_no = ncp_reply_byte(conn, 0); + memcpy(conn_numbers, ncp_reply_data(conn, 1), + sizeof(__u16) * (*returned_no)); + return 0; +} + + + /* * result is a 8-byte buffer */ @@ -1672,6 +1770,15 @@ int ncp_login_user(struct ncp_conn *conn, const unsigned char *username, const unsigned char *password) +{ + return ncp_login_object(conn, username, NCP_BINDERY_USER, password); +} + +static int +ncp_login_object(struct ncp_conn *conn, + const unsigned char *username, + int login_type, + const unsigned char *password) { int result; unsigned char ncp_key[8]; @@ -1681,7 +1788,7 @@ ncp_login_user(struct ncp_conn *conn, return result; } - if ((result = ncp_get_bindery_object_id(conn, NCP_BINDERY_USER, + if ((result = ncp_get_bindery_object_id(conn, login_type, username, &user)) != 0) { return result; } @@ -2394,7 +2501,6 @@ ncp_create_queue_job_and_file(struct ncp_conn *conn, } memcpy(&(job->j), ncp_reply_data(conn, 0), 78); - ConvertToNWfromDWORD(job->j.JobFileHandle, job->file_handle); ncp_unlock_conn(conn); @@ -2419,7 +2525,106 @@ ncp_close_file_and_start_job(struct ncp_conn *conn, ncp_unlock_conn(conn); return 0; -} +} + +int +ncp_attach_to_queue(struct ncp_conn *conn, + __u32 queue_id) +{ + int result; + + ncp_init_request_s(conn, 111); + ncp_add_dword(conn, htonl(queue_id)); + + if ((result = ncp_request(conn, 23)) != 0) { + ncp_unlock_conn(conn); + return result; + } + + ncp_unlock_conn(conn); + return 0; +} + + +int +ncp_detach_from_queue(struct ncp_conn *conn, + __u32 queue_id) +{ + int result; + + ncp_init_request_s(conn, 112); + ncp_add_dword(conn, htonl(queue_id)); + + if ((result = ncp_request(conn, 23)) != 0) { + ncp_unlock_conn(conn); + return result; + } + + ncp_unlock_conn(conn); + return 0; +} + +int +ncp_service_queue_job(struct ncp_conn *conn, __u32 queue_id, __u16 job_type, + struct queue_job *job) +{ + int result; + + ncp_init_request_s(conn, 124); + ncp_add_dword(conn, htonl(queue_id)); + ncp_add_word(conn, htons(job_type)); + + if ((result = ncp_request(conn, 23)) != 0) { + ncp_unlock_conn(conn); + return result; + } + + memcpy(&(job->j), ncp_reply_data(conn, 0), 78); + ConvertToNWfromDWORD(job->j.JobFileHandle, job->file_handle); + + ncp_unlock_conn(conn); + return 0; +} + +int +ncp_finish_servicing_job(struct ncp_conn *conn, __u32 queue_id, + __u32 job_number, __u32 charge_info) +{ + int result; + + ncp_init_request_s(conn, 131); + ncp_add_dword(conn, htonl(queue_id)); + ncp_add_dword(conn, job_number); + ncp_add_dword(conn, htonl(charge_info)); + + if ((result = ncp_request(conn, 23)) != 0) { + ncp_unlock_conn(conn); + return result; + } + + ncp_unlock_conn(conn); + return 0; +} + +int +ncp_abort_servicing_job(struct ncp_conn *conn, __u32 queue_id, + __u32 job_number) +{ + int result; + + ncp_init_request_s(conn, 132); + ncp_add_dword(conn, htonl(queue_id)); + ncp_add_dword(conn, job_number); + + if ((result = ncp_request(conn, 23)) != 0) { + ncp_unlock_conn(conn); + return result; + } + + ncp_unlock_conn(conn); + return 0; +} + static int ncp_do_read(struct ncp_conn *conn, const char *file_id, diff --git a/util/ncplib.h b/util/ncplib.h index 9cc32f0..2483b09 100644 --- a/util/ncplib.h +++ b/util/ncplib.h @@ -14,13 +14,18 @@ #include #include #include +#include #include "ipxlib.h" #ifndef memzero +#include #define memzero(object) memset(&(object), 0, sizeof(object)) #endif +void +str_upper(char *name); + enum connect_state { NOT_CONNECTED = 0, CONN_PERMANENT, @@ -64,6 +69,7 @@ struct ncp_conn_spec { char server[NCP_BINDERY_NAME_LEN]; char user[NCP_BINDERY_NAME_LEN]; uid_t uid; + int login_type; /* NCP_BINDERY_USER / NCP_BINDERY_PSERVER */ char password[NCP_BINDERY_NAME_LEN]; }; @@ -82,6 +88,14 @@ ncp_initialize(struct ncp_conn *conn, int *argc, char **argv, int login_necessary); +/* You can login as another object by this procedure. As a first use + pserver comes to mind. */ +int +ncp_initialize_as(struct ncp_conn *conn, + int *argc, char **argv, + int login_necessary, int login_type); + + /* Open an existing permanent connection */ int ncp_open(struct ncp_conn *conn, @@ -132,6 +146,14 @@ int ncp_get_file_server_description_strings(struct ncp_conn *conn, char target[512]); +int +ncp_get_file_server_time(struct ncp_conn *conn, time_t *target); + +int +ncp_get_connlist(struct ncp_conn *conn, __u32 last_id, + __u16 object_type, const char *object_name, + int *returned_no, __u16 conn_numbers[256]); + int ncp_get_encryption_key(struct ncp_conn *conn, char *target); @@ -286,4 +308,24 @@ ncp_close_file_and_start_job(struct ncp_conn *conn, __u32 queue_id, struct queue_job *job); +int +ncp_attach_to_queue(struct ncp_conn *conn, + __u32 queue_id); + +int +ncp_detach_from_queue(struct ncp_conn *conn, + __u32 queue_id); + +int +ncp_service_queue_job(struct ncp_conn *conn, __u32 queue_id, __u16 job_type, + struct queue_job *job); + +int +ncp_finish_servicing_job(struct ncp_conn *conn, __u32 queue_id, + __u32 job_number, __u32 charge_info); + +int +ncp_abort_servicing_job(struct ncp_conn *conn, __u32 queue_id, + __u32 job_number); + #endif /* _NCPLIB_H */ diff --git a/util/ncpmount.c b/util/ncpmount.c index 5dac6e9..5e1c9cb 100644 --- a/util/ncpmount.c +++ b/util/ncpmount.c @@ -47,7 +47,6 @@ extern pid_t waitpid(pid_t, int *, int); #include "ncplib.h" static char *progname; -static void str_upper(char *name); static void usage(void); static void help(void); @@ -492,15 +491,6 @@ main(int argc, char *argv[]) return 0; } -static void -str_upper(char *name) -{ - while (*name) { - *name = toupper(*name); - name = name + 1; - } -} - static void usage(void) { diff --git a/util/ncptest.c b/util/ncptest.c index 6443a77..1127fcd 100644 --- a/util/ncptest.c +++ b/util/ncptest.c @@ -137,6 +137,16 @@ test_ls(struct ncp_conn *server) return; } +void +test_connlist(struct ncp_conn *conn) +{ + __u16 conn_list[256]; + int no; + + ncp_get_connlist(conn, 0, NCP_BINDERY_USER, "*", &no, conn_list); + return; +} + int main(int argc, char *argv[]) { @@ -148,8 +158,7 @@ main(int argc, char *argv[]) return 1; } - test_ls(&conn); - + test_connlist(&conn); ncp_close(&conn); return 0; } diff --git a/util/nprint.c b/util/nprint.c index fd61b8d..a3f20c3 100644 --- a/util/nprint.c +++ b/util/nprint.c @@ -20,8 +20,7 @@ static char *progname; static void usage(void); -static void -str_upper(char *name); +static void help(void); void main(int argc, char *argv[]) @@ -48,6 +47,13 @@ main(int argc, char *argv[]) memzero(j); memzero(pj); memzero(q); memzero(conn); + if ( (argc == 2) + && (strcmp(argv[1], "-h") == 0)) + { + help(); + exit(0); + } + if (ncp_initialize(&conn, &argc, argv, 1) != 0) { perror("Could not open connection"); @@ -71,9 +77,13 @@ main(int argc, char *argv[]) pj.Rows = htons(80); strcpy(pj.FnameHeader, "stdin"); - while ((opt = getopt(argc, argv, "q:d:p:b:f:l:r:c:t:F:TN"))!=EOF) + while ((opt = getopt(argc, argv, "hq:d:p:b:f:l:r:c:t:F:TN"))!=EOF) { switch (opt) { + case 'h': + help(); + ncp_close(&conn); + exit(1); case 'p': /* Path */ pj.CtrlFlags |= PRINT_BANNER; @@ -303,10 +313,27 @@ usage(void) } static void -str_upper(char *name) +help(void) { - while (*name) { - *name = toupper(*name); - name = name + 1; - } + printf("\n"); + printf("usage: %s [options] mount-point\n", progname); + printf("\n" + "-S server Server name to be used\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" + "-q queue name Name of the printing queue to use\n" + "-d job desc Job description\n" + "-p path name Path name to appear on banner\n" + "-b bannername Banner name (up to 12 chars)\n" + "-f filename Filename to appear on banner\n" + "-l lines Number of lines per page\n" + "-r rows Number of rows per page\n" + "-t tab Number of spaces per tab\n" + "-T Print server tab expantion\n" + "-N Surpress print server form feeds\n" + "-F form # Form number to print on\n" + "-h print this help text\n" + "\n"); } diff --git a/util/pqlist.c b/util/pqlist.c index 3958f65..7fd4421 100644 --- a/util/pqlist.c +++ b/util/pqlist.c @@ -62,7 +62,7 @@ main(int argc, char **argv) { found = 1; printf("%-52s", q.object_name); - printf("%08lx\n", q.object_id); + printf("%08x\n", q.object_id); } if ((found == 0) && (isatty(1))) diff --git a/util/pserver.c b/util/pserver.c new file mode 100644 index 0000000..c7ac77c --- /dev/null +++ b/util/pserver.c @@ -0,0 +1,282 @@ +/* + * pserver.c + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include "ncplib.h" + +struct nw_queue { + struct ncp_conn *conn; + + char queue_name[NCP_BINDERY_NAME_LEN]; + __u32 queue_id; + __u16 job_type; + + char *command; +}; + +static struct nw_queue q; + +static int term_request; + +static int +init_queue(struct ncp_conn *conn, char *queue_name, + char *command, struct nw_queue *q); + +static int +poll_queue(struct nw_queue *q); + +void +usage(void) +{ + /* Obviously, there's more to do */ + return; +} + +#ifndef NCP_BINDERY_PSERVER +#define NCP_BINDERY_PSERVER (0x0007) +#endif + +static void +terminate_handler() +{ + signal(SIGTERM,terminate_handler); + term_request=1; +} + +#if 0 +static void +daemonize() +{ + int fd,c; + + if ((c = fork()) > 0) exit(0); + if (c < 0) + { + fprintf(stderr, "ipxripd: can't fork: %s\n",strerror(errno)); + exit(1); + } + + close(0); + close(1); + close(2); + if ((fd = open("/dev/tty", O_RDWR)) >= 0) + { + ioctl(fd, TIOCNOTTY, NULL); + close(fd); + } +} +#endif + +int +main(int argc, char *argv[]) +{ + struct ncp_conn conn; + int poll_timeout = 30; + int opt; + int job_type = 0xffff; + int debug = 0; + + char *queue_name = NULL; + + char default_command[] = "lpr"; + char *command = default_command; + + if (ncp_initialize_as(&conn, &argc, argv, 1, NCP_BINDERY_PSERVER) != 0) + { + perror("Could not open connection"); + return 1; + } + + while ((opt = getopt(argc, argv, "q:c:j:t:d")) != EOF) + { + switch (opt) + { + case 'q': + queue_name = optarg; + break; + case 'c': + command = optarg; + break; + case 'j': + job_type = atoi(optarg); + break; + case 't': + poll_timeout = atoi(optarg); + break; + case 'd': + debug = 1; + break; + default: + usage(); + return -1; + } + } + + memzero(q); + + if (debug == 0) + { + /* We can not daemonize after ncp_initialize, sorry */ + /* daemonize(); */ + } + + if (init_queue(&conn, queue_name, command, &q) != 0) + { + perror("Could not init queue"); + ncp_close(&conn); + return 1; + } + + q.job_type = job_type; + + term_request = 0; + signal(SIGTERM,terminate_handler); + + while (1) + { + if ( (poll_queue(&q) != 0) + && (term_request == 0)) + { + continue; + } + + if (term_request != 0) + { + break; + } + sleep(poll_timeout); + } + + ncp_detach_from_queue(&conn, q.queue_id); + + ncp_close(&conn); + return 0; +} + +static int +init_queue(struct ncp_conn *conn, char *queue_name, char *command, + struct nw_queue *q) +{ + struct ncp_bindery_object obj; + + str_upper(queue_name); + + q->conn = conn; + q->command = command; + + if (ncp_get_bindery_object_id(conn, NCP_BINDERY_PQUEUE, + queue_name, &obj) != 0) + { + fprintf(stderr, "Queue %s not found\n", queue_name); + return -1; + } + + q->queue_id = obj.object_id; + memcpy(q->queue_name, obj.object_name, sizeof(q->queue_name)); + + if (ncp_attach_to_queue(conn, q->queue_id) != 0) + { + fprintf(stderr, "Could not attach to queue %s\n", + queue_name); + return -1; + } + return 0; +} + + +static int +poll_queue(struct nw_queue *q) +{ + struct queue_job job; + int fd[2]; + int pid; + + if (ncp_service_queue_job(q->conn, q->queue_id, q->job_type, + &job) != 0) + { + /* No job for us */ + return 0; + } + + if (pipe(fd) < 0) + { + perror("pipe"); + goto fail; + } + + if ((pid = fork()) < 0) + { + perror("fork"); + goto fail; + } + + if (pid > 0) + { + /* parent */ + char buf[1024]; + size_t result; + off_t offset = 0; + + close(fd[0]); /* close read end */ + + while ((result = ncp_read(q->conn, job.file_handle, offset, + sizeof(buf), buf)) > 0) + { + offset += result; + if (write(fd[1], buf, result) != result) + { + goto fail; + } + } + + close(fd[1]); /* and close write end */ + + if (waitpid(pid, NULL, 0) < 0) + { + perror("waitpid"); + } + } + else + { + /* child */ + + close(fd[1]); /* close write end */ + + if (fd[0] != STDIN_FILENO) + { + if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO) + { + perror("dup2"); + close(fd[0]); + exit(1); + } + close(fd[0]); + } + + execl("/bin/sh", "sh", "-c", q->command, NULL); + perror("exec"); + close(fd[0]); + exit(1); + } + + ncp_finish_servicing_job(q->conn, q->queue_id, job.j.JobNumber,0); + return 1; + + fail: + ncp_abort_servicing_job(q->conn, q->queue_id, job.j.JobNumber); + /* We tell that we did not have a job to avoid overloading + when something's wrong */ + return 0; +}