diff --git a/.downloads/ncpfs-2.0.1.tgz b/.downloads/ncpfs-2.0.1.tgz new file mode 100644 index 0000000..b75c6ca Binary files /dev/null and b/.downloads/ncpfs-2.0.1.tgz differ diff --git a/Changes b/Changes index 8818fd0..52f7ee7 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,16 @@ I only began this file with ncpfs-0.12. If you're interested in older versions, you can find them on ftp.gwdg.de:/pub/linux/misc/ncpfs/old. +ncpfs-2.0.0 -> ncpfs-2.0.1 +- Added some values to ipxparse. +- Added the little bindery utilities. Maybe someone has the time to + write a shellscript named 'nwadduser' ? +- Fixed a bug that made the __255 message reappear. Many thanks to + Guntram Blom for his detailed bug report. +- Fixed a bug that made ncpfs incompatible with W95's server + capabilities. Thanks to Tomasz Babczynski + for this one. + ncpfs-0.24 -> ncpfs-2.0.0 - Changed the numbering scheme :-). - Added npasswd. Many thanks to Guntram Blom for his work! diff --git a/Makefile b/Makefile index 02a1d3d..3080993 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ # Makefile for the linux ncp-filesystem routines. # -VERSION = 2.0.0 +VERSION = 2.0.1 # If you are using kerneld to autoload ncp support, # uncomment this (kerneld is in linux since about 1.3.57): @@ -14,9 +14,9 @@ SBINDIR = /sbin INTERM_BINDIR = $(TOPDIR)/bin SUBDIRS = util ipx-1.0 man -KVERSION=$(shell uname -r | cut -b3) +KVERSION=$(shell uname -r | cut -b1-3) -ifeq ($(KVERSION),2) +ifeq ($(KVERSION),1.2) SUBDIRS += kernel-1.2/src INCLUDES = -I$(TOPDIR)/kernel-1.2 endif diff --git a/TODO b/TODO index 56c8903..c58ea44 100644 --- a/TODO +++ b/TODO @@ -1,9 +1,6 @@ Here's a list of things I want to do. Feel free to send suggestions, or even help me ;-). -- little utilities for bindery access, such as nwlsobj, nwlsprop, - nwcreateobj and so on. - - Add flags to pserver's command line, so that the print command can find out the name of user who printed the job. diff --git a/ipxdump/ipxparse.c b/ipxdump/ipxparse.c index 7d3dd5c..8ac94cf 100644 --- a/ipxdump/ipxparse.c +++ b/ipxdump/ipxparse.c @@ -305,6 +305,12 @@ void handle_ncp (struct sockaddr_ipx *source, case 01: printf("Get Directory Path\n"); break; + case 05: + printf("Get Volume Number\n"); + break; + case 06: + printf("Get Volume Name\n"); + break; case 18: printf("Allocate Permanent Dir Handle\n"); break; @@ -314,6 +320,9 @@ void handle_ncp (struct sockaddr_ipx *source, case 21: printf("Get Volume Info with handle\n"); break; + case 48: + printf("Get Name Space Directory Entry\n"); + break; } data += 3; data_length -= 3; @@ -326,6 +335,9 @@ void handle_ncp (struct sockaddr_ipx *source, case 17: printf("Get Fileserver Information\n"); break; + case 22: + printf("Get Station's logged Info (old)\n"); + break; case 23: printf("Get Crypt Key\n"); break; @@ -359,6 +371,10 @@ void handle_ncp (struct sockaddr_ipx *source, printf("fn: %-3d\n", rq->function); printf("End of Job\n"); break; + case 33: + printf("fn: %-3d\n", rq->function); + printf("Negotiate Buffer size\n"); + break; case 34: printf("fn: %-3d, subfn: %-3d\n", rq->function, data[2]); @@ -425,10 +441,21 @@ void handle_ncp (struct sockaddr_ipx *source, case 8: printf("Delete a File Or Subdirectory\n"); break; + case 12: + printf("Allocate Short Directory Handle\n"); + break; } data += 1; data_length -= 1; break; + case 97: + printf("fn: %-3d\n", rq->function); + printf("Get Big Packet NCP Max Packet Size\n"); + break; + case 101: + printf("fn: %-3d\n", rq->function); + printf("Packet Burst Connection Request\n"); + break; default: printf("fn: %-3d\n", rq->function); } diff --git a/man/Makefile b/man/Makefile index 21abba7..feb9f2d 100644 --- a/man/Makefile +++ b/man/Makefile @@ -1,7 +1,10 @@ MAN1= slist nprint pqlist nsend pserver ncopy npasswd +MAN1 += nwbols nwboprops nwbpvalues MAN5= nwclient MAN8= ncpmount ncpumount ipx_configure ipx_interface ipx_internal_net \ ipx_route nwmsg +MAN8 += nwbocreate nwborm nwbpadd nwbpcreate nwbprm +MAN8 += nwgrant nwrevoke diff --git a/man/nwbocreate.8 b/man/nwbocreate.8 new file mode 100644 index 0000000..7188d98 --- /dev/null +++ b/man/nwbocreate.8 @@ -0,0 +1,133 @@ +.TH NWBOCREATE 8 7/9/1996 nwbocreate nwbocreate +.SH NAME +nwbocreate \- Create a NetWare Bindery Object +.SH SYNOPSIS +.B nwbocreate +[ +.B -h +] [ +.B -S +.I server +] [ +.B -U +.I user name +] [ +.B -P +.I password + | +.B -n +] [ +.B -C +] [ +.B -o +.I object name +] [ +.B -t +.I type +] [ +.B -r +.I read-flag +] [ +.B -w +.I write-flag +] + +.SH DESCRIPTION +.B nwbocreate +creates the specified NetWare Bindery Object. + +.B nwbocreate +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, nwbocreate +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 -o +.I object name +.RS 3 +The name of the object to be created. +.RE + +.B -t +.I object type +.RS 3 +The type of the object. +.I Object type +must be specified as a decimal value. Common values are 1 for user +objects, 2 for group objects and 3 for print queues. Other values are +allowed, but are usually used for specialized applications. +.RE + +.B -r +.I read-flag + +.B -w +.I write-flag +.RS 3 + +Read security and write security may each have one of the following values: + + ANYONE: Anyone may access the object + LOGGED: Anyone who is logged in may access the + object + OBJECT: Anyone who is logged in as the object or + SUPERVISOR equivalent may access the + object + SUPERVISOR: Anyone who is logged in as SUPERVISOR + equivalent may access the object + NETWARE: Only the Bindery may access the object +.RE + +.SH AUTHORS +nwbocreate was written by Volker Lendecke with the corresponding +Caldera utility in mind. See the Changes file of ncpfs for other +contributors. diff --git a/man/nwbols.1 b/man/nwbols.1 new file mode 100644 index 0000000..8ead31a --- /dev/null +++ b/man/nwbols.1 @@ -0,0 +1,117 @@ +.TH NWBOLS 1 7/9/1996 nwbols nwbols +.SH NAME +nwbols \- List NetWare Bindery Objects +.SH SYNOPSIS +.B nwbols +[ +.B -h +] [ +.B -S +.I server +] [ +.B -U +.I user name +] [ +.B -P +.I password + | +.B -n +] [ +.B -C +] [ +.B -t +.I type +] [ +.B -v +] [ +.B pattern +] + +.SH DESCRIPTION +.B nwbols +lists the specified NetWare Bindery Objects visible for the user. + +.B nwbols +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, nwbols +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 -t +.I type +.RS 3 +You can restrict the objects listed by specifying the type of the +objects to be listed. +.I type +must be given as a decimal number. +.RE + +.B pattern +.RS 3 +Specifying a pattern is another way to restrict the objects +listed. Please note that this pattern is evaluated by the NetWare +server. grep would be a better candidate for complex patterns. +.RE + +.B -v +.RS 3 +By default, the object's name, its ID and its type are listed by +.B nwbols. +In the verbose mode, activated by +.B -v, +the object flags, its security byte and the properties flag is also +listed. +.RE + +.SH AUTHORS +nwbols was written by Volker Lendecke. See the Changes file of ncpfs +for other contributors. diff --git a/man/nwboprops.1 b/man/nwboprops.1 new file mode 100644 index 0000000..df4cc21 --- /dev/null +++ b/man/nwboprops.1 @@ -0,0 +1,118 @@ +.TH NWBOPROPS 1 7/9/1996 nwboprops nwboprops +.SH NAME +nwboprops \- List properies of a NetWare Bindery Object +.SH SYNOPSIS +.B nwboprops +[ +.B -h +] [ +.B -S +.I server +] [ +.B -U +.I user name +] [ +.B -P +.I password + | +.B -n +] [ +.B -C +] [ +.B -o +.I object name +] [ +.B -t +.I type +] [ +.B -v +] + +.SH DESCRIPTION +.B nwboprops +lists all the properties of the specified NetWare Bindery Objects. + +.B nwboprops +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, nwboprops +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 -o +.I object name +.RS 3 +The name of the object to be inspected. +.RE + +.B -t +.I object type +.RS 3 +The type of the object. +.I Object type +must be specified as a decimal value. Common values are 1 for user +objects, 2 for group objects and 3 for print queues. Other values are +allowed, but are usually used for specialized applications. +.RE + +.B -v +.RS 3 +By default, only the property name is listed. In verbose mode, +activated by +.B -v, +the property flag, the property security byte and the value flag are +also listed. +.RE + +.SH AUTHORS +nwboprops was written by Volker Lendecke with the corresponding +Caldera utility in mind. See the Changes file of ncpfs for other +contributors. diff --git a/man/nwborm.8 b/man/nwborm.8 new file mode 100644 index 0000000..f096efc --- /dev/null +++ b/man/nwborm.8 @@ -0,0 +1,106 @@ +.TH NWBORM 8 7/9/1996 nwborm nwborm +.SH NAME +nwborm \- Remove a NetWare Bindery Object +.SH SYNOPSIS +.B nwborm +[ +.B -h +] [ +.B -S +.I server +] [ +.B -U +.I user name +] [ +.B -P +.I password + | +.B -n +] [ +.B -C +] [ +.B -o +.I object name +] [ +.B -t +.I type +] + +.SH DESCRIPTION +.B nwborm +removes the specified NetWare Bindery Objects. + +.B nwborm +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, nwborm +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 -o +.I object name +.RS 3 +The name of the object to be deleted. +.RE + +.B -t +.I object type +.RS 3 +The type of the object. +.I Object type +must be specified as a decimal value. Common values are 1 for user +objects, 2 for group objects and 3 for print queues. Other values are +allowed, but are usually used for specialized applications. +.RE + +.SH AUTHORS +nwborm was written by Volker Lendecke with the corresponding Caldera +utility in mind. See the Changes file of ncpfs for other contributors. diff --git a/man/nwbpadd.8 b/man/nwbpadd.8 new file mode 100644 index 0000000..f4a21c8 --- /dev/null +++ b/man/nwbpadd.8 @@ -0,0 +1,145 @@ +.TH NWBPADD 8 7/9/1996 nwbpadd nwbpadd +.SH NAME +nwbpadd \- Set the value of a NetWare Bindery Property +.SH SYNOPSIS +.B nwbpadd +[ +.B -h +] [ +.B -S +.I server +] [ +.B -U +.I user name +] [ +.B -P +.I password + | +.B -n +] [ +.B -C +] [ +.B -o +.I object name +] [ +.B -t +.I type +] [ +.B -p +.I property +] +.B value + +.SH DESCRIPTION +.B nwbpadd +sets the value of a ITEM type property, and adds bindery objects to a +SET type property. + +.B nwbpadd +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, nwbpadd +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 -o +.I object name +.RS 3 +The name of the object to be touched. +.RE + +.B -t +.I object type +.RS 3 +The type of the object. +.I Object type +must be specified as a decimal value. Common values are 1 for user +objects, 2 for group objects and 3 for print queues. Other values are +allowed, but are usually used for specialized applications. +.RE + +.B -p +.I property +.RS 3 +The name of the property to be set. +.RE + +.B value +.RS 3 +If property is of type SET, value is an object id in hexadecimal +notation. Otherwise, value is either a string value to be written, or +a count of bytes to be written. The latter is assumed if more than one +value argument is given. The count is decimal, and the following +arguments are interpreted as bytes in hexadecimal notation. + +Examples: + +All these examples assume the existence of the file +$HOME/.nwclient. Otherwise, the server and user would have to be +specified. + +nwbpadd -o linus -t 1 -p groups_i\\'m_in os_hackers + +In this example, user linus is added to the group os_hackers. Please +note that the ' has to be quoted. + +nwbpadd -o linus -t 1 -p identification "Linus Torvalds" + +User linus is given his real name :-). + +nwbpadd -o linus -t 1 -p revision -v 04 00 00 01 0b + +A new 4-byte binary value 0x0000010b (hi-lo order, no byte-swapping) is added +to the "REVISION" property of the user "linus". + +.SH AUTHORS +nwbpadd was written by Volker Lendecke with the corresponding Caldera +utility in mind. See the Changes file of ncpfs for other contributors. diff --git a/man/nwbpcreate.8 b/man/nwbpcreate.8 new file mode 100644 index 0000000..14d0b44 --- /dev/null +++ b/man/nwbpcreate.8 @@ -0,0 +1,154 @@ +.TH NWBPCREATE 8 7/9/1996 nwbpcreate nwbpcreate +.SH NAME +nwbpcreate \- Create a NetWare Bindery Propery +.SH SYNOPSIS +.B nwbpcreate +[ +.B -h +] [ +.B -S +.I server +] [ +.B -U +.I user name +] [ +.B -P +.I password +| +.B -n +] [ +.B -C +] [ +.B -o +.I object name +] [ +.B -t +.I type +] [ +.B -p +.I property +] [ +.B -s +] [ +.B -r +.I read-flag +] [ +.B -w +.I write-flag +] + +.SH DESCRIPTION +.B nwbpcreate +creates the specified NetWare Bindery Propery. + +.B nwbpcreate +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, nwbpcreate +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 -o +.I object name +.RS 3 +The name of the object to be touched. +.RE + +.B -t +.I object type +.RS 3 +The type of the object. +.I Object type +must be specified as a decimal value. Common values are 1 for user +objects, 2 for group objects and 3 for print queues. Other values are +allowed, but are usually used for specialized applications. +.RE + +.B -p +.I property +.RS 3 +The name of the property to be created. +.RE + +.B -s +.RS 3 +By default, +.B nwbpcreate +creates properties of type ITEM. If you want to create a property of +type SET, such as groups_i\\'m_in, you must use the +.B -s +option. +.RE + +.B -r +.I read-flag + +.B -w +.I write-flag +.RS 3 + +Read security and write security may each have one of the following values: + + ANYONE: Anyone may access the property + LOGGED: Anyone who is logged in may access the + property + OBJECT: Anyone who is logged in as the object or + SUPERVISOR equivalent may access the + property + SUPERVISOR: Anyone who is logged in as SUPERVISOR + equivalent may access the property + NETWARE: Only the Bindery may access the property +.RE + +.SH AUTHORS +nwbpcreate was written by Volker Lendecke with the corresponding +Caldera utility in mind. See the Changes file of ncpfs for other +contributors. diff --git a/man/nwbprm.8 b/man/nwbprm.8 new file mode 100644 index 0000000..c99b3a3 --- /dev/null +++ b/man/nwbprm.8 @@ -0,0 +1,116 @@ +.TH NWBPRM 8 7/9/1996 nwbprm nwbprm +.SH NAME +nwbprm \- Remove a NetWare Bindery Propery +.SH SYNOPSIS +.B nwbprm +[ +.B -h +] [ +.B -S +.I server +] [ +.B -U +.I user name +] [ +.B -P +.I password +| +.B -n +] [ +.B -C +] [ +.B -o +.I object name +] [ +.B -t +.I type +] [ +.B -p +.I property +] + +.SH DESCRIPTION +.B nwbprm +removes the specified NetWare Bindery Propery. + +.B nwbprm +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, nwbprm +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 -o +.I object name +.RS 3 +The name of the object to be touched. +.RE + +.B -t +.I object type +.RS 3 +The type of the object. +.I Object type +must be specified as a decimal value. Common values are 1 for user +objects, 2 for group objects and 3 for print queues. Other values are +allowed, but are usually used for specialized applications. +.RE + +.B -p +.I property +.RS 3 +The name of the property to be removed. +.RE + +.SH AUTHORS +nwbprm was written by Volker Lendecke with the corresponding +Caldera utility in mind. See the Changes file of ncpfs for other +contributors. diff --git a/man/nwbpvalues.1 b/man/nwbpvalues.1 new file mode 100644 index 0000000..e1daab5 --- /dev/null +++ b/man/nwbpvalues.1 @@ -0,0 +1,132 @@ +.TH NWBPVALUES 8 7/9/1996 nwbpvalues nwbpvalues +.SH NAME +nwbpvalues \- Print a NetWare Bindery Propery's contents +.SH SYNOPSIS +.B nwbpvalues +[ +.B -h +] [ +.B -S +.I server +] [ +.B -U +.I user name +] [ +.B -P +.I password +| +.B -n +] [ +.B -C +] [ +.B -o +.I object name +] [ +.B -t +.I type +] [ +.B -p +.I property +] [ +.B -v +] + +.SH DESCRIPTION +.B nwbpvalues +prints the contents of a SET property. + +.B nwbpvalues +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, nwbpvalues +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 -o +.I object name +.RS 3 +The name of the object to be looked up. +.RE + +.B -t +.I object type +.RS 3 +The type of the object. +.I Object type +must be specified as a decimal value. Common values are 1 for user +objects, 2 for group objects and 3 for print queues. Other values are +allowed, but are usually used for specialized applications. +.RE + +.B -p +.I property +.RS 3 +The name of the property to be printed. +.RE + +.B -v +.RS 3 +By default, the object's name, its ID and its type are listed by +.B nwbols. +In the verbose mode, activated by +.B -v, +the object flags, its security byte and the properties flag is also +listed. +.RE + +.SH BUGS +Only SET properties can be printed. This will hopefully be fixed in +the future. (Feel free to fix this and send me a patch ;-)). + +.SH AUTHORS +nwbpvalues was written by Volker Lendecke with the corresponding +Caldera utility in mind. See the Changes file of ncpfs for other +contributors. diff --git a/man/nwgrant.8 b/man/nwgrant.8 new file mode 100644 index 0000000..f4dff43 --- /dev/null +++ b/man/nwgrant.8 @@ -0,0 +1,148 @@ +.TH NWGRANT 8 7/9/1996 nwgrant nwgrant +.SH NAME +nwgrant \- Add Trustee Rights to a directory +.SH SYNOPSIS +.B nwgrant +[ +.B -h +] [ +.B -S +.I server +] [ +.B -U +.I user name +] [ +.B -P +.I password + | +.B -n +] [ +.B -C +] [ +.B -o +.I object name +] [ +.B -t +.I type +] [ +.B -r +.I rights +] +.B directory + +.SH DESCRIPTION +.B nwgrant +adds the specified bindery object with the corresponding trustee +rights to the directory. + +.B nwgrant +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, nwgrant +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 -o +.I object name +.RS 3 +The name of the object to be added as trustee. +.RE + +.B -t +.I object type +.RS 3 +The type of the object. +.I Object type +must be specified as a decimal value. Common values are 1 for user +objects, 2 for group objects and 3 for print queues. Other values are +allowed, but are usually used for specialized applications. +.RE + +.B -r +.I rights +.RS 3 +You must tell +.B nwgrant +which rights it should grant to the bindery object. +The new rights for the object is specified by +.I rights, +which is the sum of the following hexadecimal individual rights values: + + 00 = no access + 01 = read access + 02 = write access + 04 = open access + 08 = create access + 10 = delete access + 20 = ownership access + 40 = search access + 80 = modify access + +for a possible total of "ff" for all rights. +.RE + +.B directory +.RS 3 +You must specify the directory to which to add the object as +trustee. This has to be done in fully qualified NetWare notation. + +Example: + +nwgrant -o linus -t 1 -r ff 'data:home\\linus' + +With this example, user linus is given all rights to his home +directory on the data volume. This example assumes the existence of +the file $HOME/.nwclient. + +.SH AUTHORS +nwgrant was written by Volker Lendecke with the corresponding NetWare +utility in mind. See the Changes file of ncpfs for other contributors. + diff --git a/man/nwrevoke.8 b/man/nwrevoke.8 new file mode 100644 index 0000000..20d3523 --- /dev/null +++ b/man/nwrevoke.8 @@ -0,0 +1,124 @@ +.TH NWREVOKE 8 7/9/1996 nwrevoke nwrevoke +.SH NAME +nwrevoke \- Revoke a Trustee Right from a directory +.SH SYNOPSIS +.B nwrevoke +[ +.B -h +] [ +.B -S +.I server +] [ +.B -U +.I user name +] [ +.B -P +.I password + | +.B -n +] [ +.B -C +] [ +.B -o +.I object name +] [ +.B -t +.I type +] [ +.B -r +.I rights +] +.B directory + +.SH DESCRIPTION +.B nwrevoke +revokes the specified bindery object with the corresponding trustee +rights from the directory. + +.B nwrevoke +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, nwrevoke +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 -o +.I object name +.RS 3 +The name of the object to be added as trustee. +.RE + +.B -t +.I object type +.RS 3 +The type of the object. +.I Object type +must be specified as a decimal value. Common values are 1 for user +objects, 2 for group objects and 3 for print queues. Other values are +allowed, but are usually used for specialized applications. +.RE + +.B directory +.RS 3 +You must specify the directory from which to remove the object as +trustee. This has to be done in fully qualified NetWare notation. + +Example: + +nwrevoke -o linus -t 1 'src:bsd_src' + +With this example, user linus is removed as trustee from the bsd_src +directory on the src volume. + +.SH AUTHORS +nwrevoke was written by Volker Lendecke with the corresponding NetWare +utility in mind. See the Changes file of ncpfs for other contributors. + diff --git a/ncpfs-2.0.0.lsm b/ncpfs-2.0.1.lsm similarity index 84% rename from ncpfs-2.0.0.lsm rename to ncpfs-2.0.1.lsm index 2ffb659..34d98ae 100644 --- a/ncpfs-2.0.0.lsm +++ b/ncpfs-2.0.1.lsm @@ -1,7 +1,7 @@ Begin3 Title: ncpfs -Version: 2.0.0 -Entered-date: 22. June 1996 +Version: 2.0.1 +Entered-date: 10. 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 @@ -13,7 +13,7 @@ Author: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke) Maintained-by: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke) Primary-site: ftp.gwdg.de:/pub/linux/misc/ncpfs Alternate-site: sunsite.unc.edu:/pub/system/Filesystems/ncpfs - ~120k ncpfs-2.0.0.tgz - ~ 1k ncpfs-2.0.0.lsm + ~124k ncpfs-2.0.1.tgz + ~ 1k ncpfs-2.0.1.lsm Copying-policy: GPL End diff --git a/util/Makefile b/util/Makefile index c21ac1f..782f54c 100644 --- a/util/Makefile +++ b/util/Makefile @@ -3,13 +3,16 @@ # USERUTILS = slist pqlist nwfsinfo pserver nprint nsend ncopy npasswd +USERUTILS += nwbols nwbocreate nwborm nwboprops +USERUTILS += nwbpcreate nwbprm nwbpvalues nwbpadd +USERUTILS += nwgrant nwrevoke 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) -g -DNCPFS_VERSION=\"$(VERSION)\" CFLAGS = -Wall $(INCLUDES) $(KERNELD) -O2 -DNCPFS_VERSION=\"$(VERSION)\" CC = gcc diff --git a/util/ncplib.c b/util/ncplib.c index 8314bf4..d584d0c 100644 --- a/util/ncplib.c +++ b/util/ncplib.c @@ -531,11 +531,13 @@ do_ncp_call(struct ncp_conn *conn, int request_size) int retries = 20; int len; long err; - struct ncp_reply_header *r = - (struct ncp_reply_header *)&(conn->packet); while (retries > 0) { + struct ncp_reply_header reply; + struct sockaddr_ipx sender; + int sizeofaddr = sizeof(sender); + retries -= 1; result = sendto(conn->ncp_sock, conn->packet, @@ -549,30 +551,48 @@ do_ncp_call(struct ncp_conn *conn, int request_size) } re_select: - len = ipx_recv(conn->ncp_sock, - conn->packet, NCP_PACKET_SIZE, 0, 3, &err); + len = ipx_recvfrom(conn->ncp_sock, + (char *)&reply, sizeof(reply), + MSG_PEEK, &sender, &sizeofaddr, 3, &err); - if ( (len == sizeof(*r)) - && (r->type == NCP_POSITIVE_ACK)) + if ((len < 0) && (err == ETIMEDOUT)) { - goto re_select; - } - if ( (len >= sizeof(*r)) - && (r->type == NCP_REPLY) - && ( (request.type == NCP_ALLOC_SLOT_REQUEST) - || ( (r->sequence == request.sequence) - && (r->conn_low == request.conn_low) - && (r->conn_high == request.conn_high)))) - { - conn->reply_size = len; - break; + continue; } if (len < 0) { return err; } + + if ( /* Is the sender wrong? */ + (memcmp(&sender.sipx_node, + &(conn->i.addr.sipx_node), 6) != 0) + || (sender.sipx_port != conn->i.addr.sipx_port) + + /* Did the sender send a positive acknowledge? */ + || ( (len == sizeof(reply)) + && (reply.type == NCP_POSITIVE_ACK)) + + /* Did we get a bogus answer? */ + || ( (len < sizeof(reply)) + || (reply.type != NCP_REPLY) + || ( (request.type != NCP_ALLOC_SLOT_REQUEST) + && ( (reply.sequence != request.sequence) + || (reply.conn_low != request.conn_low) + || (reply.conn_high != request.conn_high))))) + { + /* Then throw away the packet */ + ipx_recv(conn->ncp_sock, (char *)&reply, sizeof(reply), + 0, 1, &err); + goto re_select; + } + + ipx_recv(conn->ncp_sock, conn->packet, NCP_PACKET_SIZE, + 0, 1, &err); + conn->reply_size = len; + return 0; } - return 0; + return ETIMEDOUT; } static int @@ -590,8 +610,9 @@ ncp_mount_request(struct ncp_conn *conn, int function) if (conn->has_subfunction != 0) { - *(__u16 *)&(h->data[0]) = conn->current_size - - sizeof(struct ncp_request_header)- 2; + *(__u16 *)&(h->data[0]) + = htons(conn->current_size + - sizeof(struct ncp_request_header) - 2); } request.function = function; @@ -628,8 +649,9 @@ ncp_temp_request(struct ncp_conn *conn, int function) if (conn->has_subfunction != 0) { - *(__u16 *)&(h->data[0]) = conn->current_size - - sizeof(struct ncp_request_header) - 2; + *(__u16 *)&(h->data[0]) + = htons(conn->current_size + - sizeof(struct ncp_request_header) - 2); } h->type = NCP_REQUEST; @@ -2593,7 +2615,42 @@ ncp_delete_directory(struct ncp_conn *conn, ncp_unlock_conn(conn); return result; } - + +long +ncp_add_trustee(struct ncp_conn *conn, + int dir_handle, const char *path, + __u32 object_id, __u8 rights) +{ + long result; + + ncp_init_request_s(conn, 13); + ncp_add_byte(conn, dir_handle); + ncp_add_dword(conn, htonl(object_id)); + ncp_add_byte(conn, rights); + ncp_add_pstring(conn, path); + + result = ncp_request(conn, 22); + ncp_unlock_conn(conn); + return result; +} + +long +ncp_delete_trustee(struct ncp_conn *conn, + int dir_handle, const char *path,__u32 object_id) +{ + long result; + + ncp_init_request_s(conn, 14); + ncp_add_byte(conn, dir_handle); + ncp_add_dword(conn, htonl(object_id)); + ncp_add_byte(conn, 0); + ncp_add_pstring(conn, path); + + result = ncp_request(conn, 22); + ncp_unlock_conn(conn); + return result; +} + long ncp_rename_directory(struct ncp_conn *conn, int dir_handle, @@ -3239,3 +3296,33 @@ ncp_alloc_short_dir_handle(struct ncp_conn *conn, ncp_unlock_conn(conn); return result; } + +long +ncp_add_trustee_set(struct ncp_conn *conn, + __u8 volume_number, __u32 dir_entry, + __u16 rights_mask, + int object_count, struct ncp_trustee_struct *rights) +{ + long result = 0; + + ncp_init_request(conn); + ncp_add_byte(conn, 10); /* subfunction */ + ncp_add_byte(conn, 0); /* dos name space */ + ncp_add_byte(conn, 0); /* reserved */ + ncp_add_word(conn, 0x8006); + ncp_add_word(conn, rights_mask); + ncp_add_word(conn, object_count); + ncp_add_handle_path(conn, volume_number, dir_entry, 1, NULL); + + while (object_count > 0) + { + ncp_add_dword(conn, htonl(rights->object_id)); + ncp_add_word(conn, rights->rights); + object_count -= 1; + rights += 1; + } + + result = ncp_request(conn, 87); + ncp_unlock_conn(conn); + return result; +} diff --git a/util/ncplib.h b/util/ncplib.h index ff83776..d4fe7bb 100644 --- a/util/ncplib.h +++ b/util/ncplib.h @@ -347,6 +347,15 @@ ncp_rename_directory(struct ncp_conn *conn, int dir_handle, const char *old_path, const char *new_path); +long +ncp_add_trustee(struct ncp_conn *conn, + int dir_handle, const char *path, + __u32 object_id, __u8 rights); + +long +ncp_delete_trustee(struct ncp_conn *conn, + int dir_handle, const char *path, __u32 object_id); + long ncp_read(struct ncp_conn *conn, const char *file_id, off_t offset, size_t count, char *target); @@ -451,4 +460,22 @@ ncp_alloc_short_dir_handle(struct ncp_conn *conn, __u16 alloc_mode, __u8 *target); +long +ncp_get_effective_dir_rights(struct ncp_conn *conn, + struct nw_info_struct *file, + __u16 *target); + +struct ncp_trustee_struct +{ + __u32 object_id; + __u16 rights; +}; + +long +ncp_add_trustee_set(struct ncp_conn *conn, + __u8 volume_number, __u32 dir_entry, + __u16 rights_mask, + int object_count, struct ncp_trustee_struct *rights); + + #endif /* _NCPLIB_H */ diff --git a/util/nwbocreate.c b/util/nwbocreate.c new file mode 100644 index 0000000..a3f3309 --- /dev/null +++ b/util/nwbocreate.c @@ -0,0 +1,160 @@ +/* + * nwbocreate.c + * + * Create a bindery object on a NetWare server + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + +#include "ncplib.h" +#include +#include + +static char *progname; + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [options]\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" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" + "\n" + "-o object_name Name of created object\n" + "-t type Object type (decimal value)\n" + "-r read-flag Read security\n" + "-w write-flag Write security\n" + "\n"); +} + +static int +parse_security(const char *security) +{ + if (strcasecmp(security, "anyone") == 0) + { + return 0; + } + if (strcasecmp(security, "logged") == 0) + { + return 1; + } + if (strcasecmp(security, "object") == 0) + { + return 2; + } + if (strcasecmp(security, "supervisor") == 0) + { + return 3; + } + if (strcasecmp(security, "netware") == 0) + { + return 4; + } + return -1; +} + +int +main(int argc, char *argv[]) +{ + struct ncp_conn *conn; + char *object_name = NULL; + int object_type = -1; + long err; + + int read_sec = 1; /* logged read */ + int write_sec = 3; /* supervisor write */ + int result = 1; + + int opt; + + progname = argv[0]; + + if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) + { + com_err(argv[0], err, "in ncp_initialize"); + goto finished; + } + + while ((opt = getopt(argc, argv, "ho:t:r:w:")) != EOF) + { + switch(opt) { + case 'o': + object_name = optarg; + str_upper(object_name); + break; + case 't': + object_type = atoi(optarg); + break; + case 'r': + read_sec = parse_security(optarg); + if (read_sec < 0) + { + fprintf(stderr, + "%s: Wrong read security\n" + "Must be one of anyone, logged, " + "object, supervisor or netware\n", + argv[0]); + goto finished; + } + break; + case 'w': + write_sec = parse_security(optarg); + if (write_sec < 0) + { + fprintf(stderr, + "%s: Wrong write security\n" + "Must be one of anyone, logged, " + "object, supervisor or netware\n", + argv[0]); + goto finished; + } + break; + case 'h': + help(); + goto finished; + default: + usage(); + goto finished; + } + } + + if (object_type < 0) + { + fprintf(stderr, "%s: You must specify an object type\n", + argv[0]); + goto finished; + } + + if (object_name == NULL) + { + fprintf(stderr, "%s: You must specify an object name\n", + argv[0]); + goto finished; + } + + if (ncp_create_bindery_object(conn, object_type, object_name, + (write_sec << 4) + read_sec, 0) != 0) + { + fprintf(stderr, "%s: Could not create the object\n", argv[0]); + } + else + { + result = 0; + } + + finished: + ncp_close(conn); + return result; +} diff --git a/util/nwbols.c b/util/nwbols.c new file mode 100644 index 0000000..7f0459d --- /dev/null +++ b/util/nwbols.c @@ -0,0 +1,124 @@ +/* + * nwlsobj.c + * + * List bindery objects + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + +#include +#include +#include +#include +#include "ncplib.h" + +static char *progname; + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [options] pattern\n", progname); + return; +} + +static void +help(void) +{ + printf("\n"); + printf("usage: %s [options]\n", progname); + printf("\n" + "-h Print this help text\n" + "-S server Server name to be used\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" + "\n" + "-t type Object type to be listed (decimal)\n" + "-v Verbose listing\n" + "\n"); +} + +int +main(int argc, char **argv) +{ + struct ncp_conn *conn; + struct ncp_bindery_object o; + int found = 0; + + char default_pattern[] = "*"; + char *pattern = default_pattern; + char *p; + long err; + int opt; + int verbose = 0; + __u16 type = 0xffff; + + progname = argv[0]; + + if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) + { + com_err(argv[0], err, "in ncp_initialize"); + return 1; + } + + while ((opt = getopt(argc, argv, "hvt:")) != EOF) + { + switch(opt) { + case 'h': + help(); + exit(1); + case 't': + type = atoi(optarg); + break; + case 'v': + verbose = 1; + break; + default: + usage(); + exit(1); + } + } + + if (optind < argc-1) + { + usage(); + exit(1); + } + + if (optind == argc-1) + { + pattern = argv[optind]; + } + + for (p = pattern; *p != '\0'; p++) + { + *p = toupper(*p); + } + + o.object_id = 0xffffffff; + + while (ncp_scan_bindery_object(conn, o.object_id, + type, pattern, &o) == 0) + { + found = 1; + if (verbose != 0) + { + printf("%s %08X %04X %d %02X %d\n", + o.object_name, (unsigned int)o.object_id, + (unsigned int)o.object_type, + o.object_flags, o.object_security, + o.object_has_prop); + } + else + { + printf("%s %08X %04X\n", + o.object_name, (unsigned int)o.object_id, + (unsigned int)o.object_type); + } + } + + ncp_close(conn); + return 0; +} diff --git a/util/nwboprops.c b/util/nwboprops.c new file mode 100644 index 0000000..a02db3e --- /dev/null +++ b/util/nwboprops.c @@ -0,0 +1,120 @@ +/* + * nwboprops.c + * + * List properties of a bindery object + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + +#include "ncplib.h" +#include +#include + +static char *progname; + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [options]\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" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" + "\n" + "-o object_name Name of object inspected\n" + "-t type Object type (decimal value)\n" + "-v Verbose listing\n" + "\n"); +} + +int +main(int argc, char *argv[]) +{ + struct ncp_conn *conn; + char *object_name = NULL; + int object_type = -1; + long err; + + struct ncp_property_info info; + + int result = 1; + int verbose = 0; + int opt; + + progname = argv[0]; + + if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) + { + com_err(argv[0], err, "in ncp_initialize"); + goto finished; + } + + while ((opt = getopt(argc, argv, "ho:t:v")) != EOF) + { + switch(opt) { + case 'o': + object_name = optarg; + str_upper(object_name); + break; + case 't': + object_type = atoi(optarg); + break; + case 'v': + verbose = 1; + break; + case 'h': + help(); + goto finished; + default: + usage(); + goto finished; + } + } + + if (object_type < 0) + { + fprintf(stderr, "%s: You must specify an object type\n", + argv[0]); + goto finished; + } + + if (object_name == NULL) + { + fprintf(stderr, "%s: You must specify an object name\n", + argv[0]); + goto finished; + } + + info.search_instance = 0xffffffff; + + while (ncp_scan_property(conn, object_type, object_name, + info.search_instance, "*", &info) == 0) + { + if (verbose != 0) + { + printf("%s %d %02x %d\n", + info.property_name, info.property_flags, + info.property_security, + info.value_available_flag); + } + else + { + printf("%s\n", info.property_name); + } + } + + finished: + ncp_close(conn); + return result; +} diff --git a/util/nwborm.c b/util/nwborm.c new file mode 100644 index 0000000..7087a96 --- /dev/null +++ b/util/nwborm.c @@ -0,0 +1,105 @@ +/* + * nwborm.c + * + * Destroy a bindery object on a NetWare server + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + +#include "ncplib.h" +#include +#include + +static char *progname; + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [options]\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" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" + "\n" + "-o object_name Name of object to be removed\n" + "-t type Object type (decimal value)\n" + "\n"); +} + +int +main(int argc, char *argv[]) +{ + struct ncp_conn *conn; + char *object_name = NULL; + int object_type = -1; + long err; + + int result = 1; + + int opt; + + progname = argv[0]; + + if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) + { + com_err(argv[0], err, "in ncp_initialize"); + goto finished; + } + + while ((opt = getopt(argc, argv, "ho:t:")) != EOF) + { + switch(opt) { + case 'o': + object_name = optarg; + str_upper(object_name); + break; + case 't': + object_type = atoi(optarg); + break; + case 'h': + help(); + goto finished; + default: + usage(); + goto finished; + } + } + + if (object_type < 0) + { + fprintf(stderr, "%s: You must specify an object type\n", + argv[0]); + goto finished; + } + + if (object_name == NULL) + { + fprintf(stderr, "%s: You must specify an object name\n", + argv[0]); + goto finished; + } + + if (ncp_delete_bindery_object(conn, object_type, object_name) != 0) + { + fprintf(stderr, "%s: Could not delete the object\n", argv[0]); + } + else + { + result = 0; + } + + finished: + ncp_close(conn); + return result; +} diff --git a/util/nwbpadd.c b/util/nwbpadd.c new file mode 100644 index 0000000..4aec345 --- /dev/null +++ b/util/nwbpadd.c @@ -0,0 +1,246 @@ +/* + * nwbpadd.c + * + * Set the contents of a SET property of a bindery object on a NetWare server + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + +#include "ncplib.h" +#include +#include + +static char *progname; + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [options]\n", progname); +} + +static void +help(void) +{ + printf("\n"); + printf("usage: %s [options] [values]\n", progname); + printf("\n" + "-h Print this help text\n" + "-S server Server name to be used\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" + "\n" + "-o object_name Name of accessed object\n" + "-t type Object type (decimal value)\n" + "-p property Name of property to be touched\n" + "value value to be added\n" + "\n" + "If property is of type SET, value is an object id (hex)\n" + "Otherwise, value is either a string value to be written, or\n" + "a count of bytes to be written. The latter is assumed if\n" + "more than one value argument is given. The count is decimal,\n" + "and the following arguments are interpreted as bytes in\n" + "hexadecimal notation.\n" + "\n"); +} + +int +main(int argc, char *argv[]) +{ + struct ncp_conn *conn; + char *object_name = NULL; + int object_type = -1; + char *property_name = NULL; + char *value = NULL; + struct ncp_property_info info; + long err; + int result = 1; + int opt; + + progname = argv[0]; + + if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) + { + com_err(argv[0], err, "in ncp_initialize"); + goto finished; + } + + while ((opt = getopt(argc, argv, "ho:t:p:v:")) != EOF) + { + switch(opt) { + case 'o': + object_name = optarg; + str_upper(object_name); + break; + case 't': + object_type = atoi(optarg); + break; + case 'p': + property_name = optarg; + if (strlen(property_name) > 15) + { + fprintf(stderr, "%s: Property Name too long\n", + argv[0]); + exit(1); + } + str_upper(property_name); + break; + case 'v': + value = optarg; + break; + case 'h': + help(); + goto finished; + default: + usage(); + goto finished; + } + } + + if (object_type < 0) + { + fprintf(stderr, "%s: You must specify an object type\n", + argv[0]); + goto finished; + } + + if (object_name == NULL) + { + fprintf(stderr, "%s: You must specify an object name\n", + argv[0]); + goto finished; + } + + if (property_name == NULL) + { + fprintf(stderr, "%s: You must specify a property name\n", + argv[0]); + goto finished; + } + + if (optind > argc-1) + { + fprintf(stderr, "%s: You must specify a property value\n", + argv[0]); + goto finished; + } + + value = argv[optind]; + optind += 1; + + if (ncp_scan_property(conn, object_type, object_name, + 0xffffffff, property_name, &info) != 0) + { + fprintf(stderr, "%s: Could not find property\n", argv[0]); + goto finished; + } + + if ((info.property_flags & 2) != 0) + { + /* Property is of type SET */ + struct ncp_bindery_object o; + + if (optind != argc) + { + fprintf(stderr, "%s: For the SET property %s, you must" + " specify an object id as value\n", + progname, property_name); + goto finished; + } + + if (ncp_get_bindery_object_name(conn, + ntohl(strtol(value, NULL, 16)), + &o) != 0) + { + fprintf(stderr, "%s: %s is not a valid object id\n", + progname, value); + goto finished; + } + + if (ncp_add_object_to_set(conn, object_type, object_name, + property_name, + o.object_type, o.object_name) != 0) + { + fprintf(stderr, "%s: could not add object %s\n", + progname, o.object_name); + goto finished; + } + } + else + { + /* Property is of type ITEM */ + char contents[255*128]; + int segno = 1; + int length; + + memset(contents, 0, sizeof(contents)); + + if (optind == argc) + { + /* value is the string to add */ + length = strlen(value); + if (length >= sizeof(contents)) + { + fprintf(stderr, "%s: Value too long\n", + progname); + goto finished; + } + strcpy(contents, value); + } + else + { + /* value is the byte count */ + int i; + length = atoi(value); + if (length >= sizeof(contents)) + { + fprintf(stderr, "%s: Value too long\n", + progname); + goto finished; + } + if (optind != argc - length) + { + fprintf(stderr, "%s: Byte count does not match" + " number of bytes\n", progname); + goto finished; + } + i = 0; + while (optind < argc) + { + contents[i] = strtol(argv[optind], NULL, 16); + i += 1; + optind += 1; + } + } + + for (segno = 1; segno <= 255; segno++) + { + struct nw_property segment; + int offset = (segno-1)*128; + + if ( offset > length ) + { + /* everything written */ + break; + } + memcpy(segment.value, &(contents[offset]), 128); + segment.more_flag = segno*128 < length; + if (ncp_write_property_value(conn, object_type, + object_name, + property_name, + segno, &segment) != 0) + { + fprintf(stderr, "%s: Could not write " + "property\n", progname); + goto finished; + } + } + } + result = 0; + + finished: + ncp_close(conn); + return result; +} diff --git a/util/nwbpcreate.c b/util/nwbpcreate.c new file mode 100644 index 0000000..641ef58 --- /dev/null +++ b/util/nwbpcreate.c @@ -0,0 +1,186 @@ +/* + * nwbpcreate.c + * + * Create a property for a bindery object on a NetWare server + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + +#include "ncplib.h" +#include +#include + +static char *progname; + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [options]\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" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" + "\n" + "-o object_name Name of object\n" + "-t type Object type (decimal value)\n" + "-p property Name of property to be created\n" + "-s Property is SET, default: ITEM\n" + "-r read-flag Read security\n" + "-w write-flag Write security\n" + "\n"); +} + +static int +parse_security(const char *security) +{ + if (strcasecmp(security, "anyone") == 0) + { + return 0; + } + if (strcasecmp(security, "logged") == 0) + { + return 1; + } + if (strcasecmp(security, "object") == 0) + { + return 2; + } + if (strcasecmp(security, "supervisor") == 0) + { + return 3; + } + if (strcasecmp(security, "netware") == 0) + { + return 4; + } + return -1; +} + +int +main(int argc, char *argv[]) +{ + struct ncp_conn *conn; + char *object_name = NULL; + int object_type = -1; + char *property_name = NULL; + int property_is_set = 0; + long err; + + int read_sec = 1; /* logged read */ + int write_sec = 3; /* supervisor write */ + int result = 1; + + int opt; + + progname = argv[0]; + + if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) + { + com_err(argv[0], err, "in ncp_initialize"); + goto finished; + } + + while ((opt = getopt(argc, argv, "ho:t:p:sr:w:")) != EOF) + { + switch(opt) { + case 'o': + object_name = optarg; + str_upper(object_name); + break; + case 't': + object_type = atoi(optarg); + break; + case 'p': + property_name = optarg; + if (strlen(property_name) > 15) + { + fprintf(stderr, "%s: Property Name too long\n", + argv[0]); + exit(1); + } + str_upper(property_name); + break; + case 's': + property_is_set = 1; + break; + case 'r': + read_sec = parse_security(optarg); + if (read_sec < 0) + { + fprintf(stderr, + "%s: Wrong read security\n" + "Must be one of anyone, logged, " + "object, supervisor or netware\n", + argv[0]); + goto finished; + } + break; + case 'w': + write_sec = parse_security(optarg); + if (write_sec < 0) + { + fprintf(stderr, + "%s: Wrong write security\n" + "Must be one of anyone, logged, " + "object, supervisor or netware\n", + argv[0]); + goto finished; + } + break; + case 'h': + help(); + goto finished; + default: + usage(); + goto finished; + } + } + + if (object_type < 0) + { + fprintf(stderr, "%s: You must specify an object type\n", + argv[0]); + goto finished; + } + + if (object_name == NULL) + { + fprintf(stderr, "%s: You must specify an object name\n", + argv[0]); + goto finished; + } + + if (property_name == NULL) + { + fprintf(stderr, "%s: You must specify a property name\n", + argv[0]); + goto finished; + } + + if (ncp_create_property(conn, object_type, object_name, + property_name, + property_is_set ? 2 : 0, + (write_sec << 4) + read_sec) != 0) + { + fprintf(stderr, "%s: Could not create the property\n",argv[0]); + } + else + { + result = 0; + } + + finished: + ncp_close(conn); + return result; +} diff --git a/util/nwbprm.c b/util/nwbprm.c new file mode 100644 index 0000000..3c85356 --- /dev/null +++ b/util/nwbprm.c @@ -0,0 +1,125 @@ +/* + * nwbprm.c + * + * Delete a property of a bindery object on a NetWare server + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + +#include +#include +#include "ncplib.h" + +static char *progname; + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [options] [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" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" + "\n" + "-o object_name Name of object\n" + "-t type Object type (decimal value)\n" + "-p property Name of property to be deleted\n" + "\n"); +} + +int +main(int argc, char *argv[]) +{ + struct ncp_conn *conn; + char *object_name = NULL; + int object_type = -1; + char *property_name = NULL; + long err; + + int result = 1; + + int opt; + + progname = argv[0]; + + if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) + { + com_err(argv[0], err, "in ncp_initialize"); + goto finished; + } + + while ((opt = getopt(argc, argv, "ho:t:p:")) != EOF) + { + switch(opt) { + case 'o': + object_name = optarg; + str_upper(object_name); + break; + case 't': + object_type = atoi(optarg); + break; + case 'p': + property_name = optarg; + if (strlen(property_name) > 15) + { + fprintf(stderr, "%s: Property Name too long\n", + argv[0]); + exit(1); + } + str_upper(property_name); + break; + case 'h': + help(); + goto finished; + default: + usage(); + goto finished; + } + } + + if (object_type < 0) + { + fprintf(stderr, "%s: You must specify an object type\n", + argv[0]); + goto finished; + } + + if (object_name == NULL) + { + fprintf(stderr, "%s: You must specify an object name\n", + argv[0]); + goto finished; + } + + if (property_name == NULL) + { + fprintf(stderr, "%s: You must specify a property name\n", + argv[0]); + goto finished; + } + + if (ncp_delete_property(conn, object_type, object_name, + property_name) != 0) + { + fprintf(stderr, "%s: Could not delete the property\n",argv[0]); + } + else + { + result = 0; + } + + finished: + ncp_close(conn); + return result; +} diff --git a/util/nwbpvalues.c b/util/nwbpvalues.c new file mode 100644 index 0000000..2e171b4 --- /dev/null +++ b/util/nwbpvalues.c @@ -0,0 +1,178 @@ +/* + * nwbpvalues.c + * + * List the contents of a SET property of a bindery object on a NetWare server + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + +#include "ncplib.h" +#include +#include + +static char *progname; + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [options]\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" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" + "\n" + "-o object_name Name of object\n" + "-t type Object type (decimal value)\n" + "-p property Name of property to be listed\n" + "-v Verbose object listing\n" + "\n"); +} + +int +main(int argc, char *argv[]) +{ + struct ncp_conn *conn; + char *object_name = NULL; + int object_type = -1; + char *property_name = NULL; + int segno; + int verbose = 0; + struct nw_property segment; + struct ncp_property_info info; + long err; + + int result = 1; + + int opt; + + progname = argv[0]; + + if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) + { + com_err(argv[0], err, "in ncp_initialize"); + goto finished; + } + + while ((opt = getopt(argc, argv, "ho:t:p:v")) != EOF) + { + switch(opt) { + case 'o': + object_name = optarg; + str_upper(object_name); + break; + case 't': + object_type = atoi(optarg); + break; + case 'p': + property_name = optarg; + if (strlen(property_name) > 15) + { + fprintf(stderr, "%s: Property Name too long\n", + argv[0]); + exit(1); + } + str_upper(property_name); + break; + case 'v': + verbose = 1; + break; + case 'h': + help(); + goto finished; + default: + usage(); + goto finished; + } + } + + if (object_type < 0) + { + fprintf(stderr, "%s: You must specify an object type\n", + argv[0]); + goto finished; + } + + if (object_name == NULL) + { + fprintf(stderr, "%s: You must specify an object name\n", + argv[0]); + goto finished; + } + + if (property_name == NULL) + { + fprintf(stderr, "%s: You must specify a property name\n", + argv[0]); + goto finished; + } + + if (ncp_scan_property(conn, object_type, object_name, + 0xffffffff, property_name, &info) != 0) + { + fprintf(stderr, "%s: Could not find property\n", argv[0]); + goto finished; + } + + if ((info.property_flags & 2) == 0) + { + fprintf(stderr, "%s: Property %s is not of type SET\n", + argv[0], property_name); + goto finished; + } + + segno = 1; + while (ncp_read_property_value(conn, object_type, object_name, + segno, property_name, &segment) == 0) + { + __u32 *value = (__u32 *)(segment.value); + int i; + + for (i = 0; i < 32; i++) + { + struct ncp_bindery_object o; + + if ((*value == 0) || (*value == 0xffffffff)) + { + break; + } + if (ncp_get_bindery_object_name(conn, ntohl(*value), + &o) == 0) + { + if (verbose != 0) + { + printf("%s %08X %04X\n", + o.object_name, + (unsigned int)o.object_id, + (unsigned int)o.object_type); + } + else + { + printf("%s\n", o.object_name); + } + } + value += 1; + } + + if (segment.more_flag == 0) + { + break; + } + segno += 1; + } + result = 0; + + finished: + ncp_close(conn); + return result; +} diff --git a/util/nwgrant.c b/util/nwgrant.c new file mode 100644 index 0000000..9f07752 --- /dev/null +++ b/util/nwgrant.c @@ -0,0 +1,133 @@ +/* + * nwgrant.c + * + * Add trustee rights to file or directory + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + +#include "ncplib.h" +#include +#include + +static char *progname; + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [options]\n", progname); +} + +static void +help(void) +{ + printf("\n"); + printf("usage: %s [options] file/directory\n", progname); + printf("\n" + "-h Print this help text\n" + "-S server Server name to be used\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" + "\n" + "-o object_name Name of object added as trustee\n" + "-t type Object type (decimal value)\n" + "-r rights Rights mask (see manual page)\n" + "\n" + "directory\n" + "\n"); +} + +int +main(int argc, char *argv[]) +{ + struct ncp_conn *conn; + char *object_name = NULL; + int object_type = -1; + struct ncp_bindery_object o; + int rights = -1; + char *path = NULL; + long err; + int result = 1; + int opt; + + progname = argv[0]; + + if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) + { + com_err(argv[0], err, "in ncp_initialize"); + goto finished; + } + + while ((opt = getopt(argc, argv, "ho:t:r:")) != EOF) + { + switch(opt) { + case 'o': + object_name = optarg; + str_upper(object_name); + break; + case 't': + object_type = atoi(optarg); + break; + case 'r': + rights = strtol(optarg, NULL, 16); + break; + case 'h': + help(); + goto finished; + default: + usage(); + goto finished; + } + } + + if (object_type < 0) + { + fprintf(stderr, "%s: You must specify an object type\n", + argv[0]); + goto finished; + } + + if (object_name == NULL) + { + fprintf(stderr, "%s: You must specify an object name\n", + argv[0]); + goto finished; + } + + if (rights < 0) + { + fprintf(stderr, "%s: You must specify a rights mask\n", + progname); + goto finished; + } + + if (optind != argc-1) + { + fprintf(stderr, "%s: You must specify a directory\n", + progname); + goto finished; + } + path = argv[optind]; + + if (ncp_get_bindery_object_id(conn, object_type, object_name, &o) != 0) + { + fprintf(stderr, "%s: Could not find object %s\n", + progname, object_name); + goto finished; + } + + if (ncp_add_trustee(conn, 0, path, o.object_id, rights) != 0) + { + fprintf(stderr, "%s: Could not add trustee rights\n",progname); + goto finished; + } + + result = 0; + + finished: + ncp_close(conn); + return result; +} diff --git a/util/nwlsobj.c b/util/nwlsobj.c deleted file mode 100644 index 13a7c21..0000000 --- a/util/nwlsobj.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * nwlsobj.c - * - * List bindery objects - * - * 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 o; - int found = 0; - - char default_pattern[] = "*"; - char *pattern = default_pattern; - char *p; - long err; - - if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) - { - com_err(argv[0], err, "in ncp_initialize"); - return 1; - } - - if (argc > 2) - { - fprintf(stderr, "usage: %s [options]\n", argv[0]); - return 1; - } - - if (argc == 2) - { - pattern = argv[1]; - } - - for (p = pattern; *p != '\0'; p++) - { - *p = toupper(*p); - } - - o.object_id = 0xffffffff; - - while (ncp_scan_bindery_object(conn, o.object_id, - 0xffff, pattern, &o) == 0) - { - found = 1; - printf("%s %08X %04X\n", - o.object_name, (unsigned int)o.object_id, - (unsigned int)o.object_type); - } - - ncp_close(conn); - return 0; -} diff --git a/util/nwrevoke.c b/util/nwrevoke.c new file mode 100644 index 0000000..0147fb9 --- /dev/null +++ b/util/nwrevoke.c @@ -0,0 +1,122 @@ +/* + * nwrevoke.c + * + * Remove trustee rights from file or directory + * + * Copyright (C) 1996 by Volker Lendecke + * + */ + +#include "ncplib.h" +#include +#include + +static char *progname; + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [options]\n", progname); +} + +static void +help(void) +{ + printf("\n"); + printf("usage: %s [options] file/directory\n", progname); + printf("\n" + "-h Print this help text\n" + "-S server Server name to be used\n" + "-U username Username sent to server\n" + "-P password Use this password\n" + "-n Do not use any password\n" + "-C Don't convert password to uppercase\n" + "\n" + "-o object_name Name of object removed as trustee\n" + "-t type Object type (decimal value)\n" + "\n" + "file/directory\n" + "\n"); +} + +int +main(int argc, char *argv[]) +{ + struct ncp_conn *conn; + char *object_name = NULL; + int object_type = -1; + struct ncp_bindery_object o; + char *path = NULL; + long err; + int result = 1; + int opt; + + progname = argv[0]; + + if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) + { + com_err(argv[0], err, "in ncp_initialize"); + goto finished; + } + + while ((opt = getopt(argc, argv, "ho:t:")) != EOF) + { + switch(opt) { + case 'o': + object_name = optarg; + str_upper(object_name); + break; + case 't': + object_type = atoi(optarg); + break; + case 'h': + help(); + goto finished; + default: + usage(); + goto finished; + } + } + + if (object_type < 0) + { + fprintf(stderr, "%s: You must specify an object type\n", + argv[0]); + goto finished; + } + + if (object_name == NULL) + { + fprintf(stderr, "%s: You must specify an object name\n", + argv[0]); + goto finished; + } + + if (optind != argc-1) + { + fprintf(stderr, "%s: You must specify a directory\n", + progname); + goto finished; + } + path = argv[optind]; + + if (ncp_get_bindery_object_id(conn, object_type, object_name, &o) != 0) + { + fprintf(stderr, "%s: Could not find object %s\n", + progname, object_name); + goto finished; + } + + if (ncp_delete_trustee(conn, 0, path, o.object_id) != 0) + { + fprintf(stderr, "%s: Could not remove trustee rights\n", + progname); + goto finished; + } + + result = 0; + + finished: + ncp_close(conn); + return result; +}