Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
011a5107c5 | ||
|
|
7179281575 | ||
|
|
b8d830f9a3 | ||
|
|
b36a27bedb | ||
|
|
7d0e3d011b | ||
|
|
84cb1f167d | ||
|
|
64f006632a | ||
|
|
92f749a943 | ||
|
|
6cb56005ea | ||
|
|
0520c1d2f7 | ||
|
|
d5ac4601b1 |
BIN
.downloads/ncpfs-0.18.tgz
Normal file
BIN
.downloads/ncpfs-0.18.tgz
Normal file
Binary file not shown.
BIN
.downloads/ncpfs-0.19.tgz
Normal file
BIN
.downloads/ncpfs-0.19.tgz
Normal file
Binary file not shown.
BIN
.downloads/ncpfs-0.20.tgz
Normal file
BIN
.downloads/ncpfs-0.20.tgz
Normal file
Binary file not shown.
BIN
.downloads/ncpfs-0.21.tgz
Normal file
BIN
.downloads/ncpfs-0.21.tgz
Normal file
Binary file not shown.
BIN
.downloads/ncpfs-0.22.tgz
Normal file
BIN
.downloads/ncpfs-0.22.tgz
Normal file
Binary file not shown.
BIN
.downloads/ncpfs-0.23.tgz
Normal file
BIN
.downloads/ncpfs-0.23.tgz
Normal file
Binary file not shown.
BIN
.downloads/ncpfs-0.24.tgz
Normal file
BIN
.downloads/ncpfs-0.24.tgz
Normal file
Binary file not shown.
BIN
.downloads/ncpfs-2.0.0.tgz
Normal file
BIN
.downloads/ncpfs-2.0.0.tgz
Normal file
Binary file not shown.
BIN
.downloads/ncpfs-2.0.1.tgz
Normal file
BIN
.downloads/ncpfs-2.0.1.tgz
Normal file
Binary file not shown.
BIN
.downloads/ncpfs-2.0.2.tgz
Normal file
BIN
.downloads/ncpfs-2.0.2.tgz
Normal file
Binary file not shown.
BIN
.downloads/ncpfs-2.0.3.tgz
Normal file
BIN
.downloads/ncpfs-2.0.3.tgz
Normal file
Binary file not shown.
101
Changes
101
Changes
@@ -1,5 +1,102 @@
|
|||||||
I only began this file with ncpfs-0.12. If you're interested in older
|
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.
|
versions, you can find them on ftp.gwdg.de:/pub/linux/misc/ncpfs/old.
|
||||||
|
|
||||||
|
ncpfs-2.0.2 -> ncpfs-2.0.3
|
||||||
|
- Removed the kernel-2.0 directory. Linus took the patch into 2.0.8.
|
||||||
|
So, if you want to use long file name support, upgrade to Linux
|
||||||
|
kernel version 2.0.8.
|
||||||
|
- Applied the lfn patch to the kernel-1.2 module with some light
|
||||||
|
testing. If you experience problems, tell it to me, and use the
|
||||||
|
ncpfs-2.0.2 kernel module, or upgrade to Linux 2.0.8.
|
||||||
|
- Added unencrypted login when no crypt key is returned.
|
||||||
|
- Hopefully improved error messages a bit
|
||||||
|
- Added some values to ipxparse
|
||||||
|
- For ELF systems, moved ncplib to /lib/libncp.so.1.x. This saves
|
||||||
|
about 1MB of disk space. As ncpfs grows, the saving will
|
||||||
|
increase. Please look at the Makefile to enable this.
|
||||||
|
- Enhanced nwfsinfo a bit. (Even with a manpage!)
|
||||||
|
- Added nwuserlist.
|
||||||
|
|
||||||
|
ncpfs-2.0.1 -> ncpfs-2.0.2
|
||||||
|
- Added some values to ipxparse.
|
||||||
|
- Added a patch against 2.0.7 for long file names support. I did not
|
||||||
|
apply this change to the 1.2-module. Please upgrade to 2.0.7 if you
|
||||||
|
want to use long file names.
|
||||||
|
- nwbpvalues can print ITEM properties
|
||||||
|
|
||||||
|
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
|
||||||
|
<faster@dino.ict.pwr.wroc.pl> for this one.
|
||||||
|
|
||||||
|
ncpfs-0.24 -> ncpfs-2.0.0
|
||||||
|
- Changed the numbering scheme :-).
|
||||||
|
- Added npasswd. Many thanks to Guntram Blom for his work!
|
||||||
|
- Hopefully improved error messages a bit
|
||||||
|
- Hopefully made slist a bit more robust
|
||||||
|
|
||||||
|
ncpfs-0.23 -> ncpfs-0.24
|
||||||
|
- Fixed a bug that made it impossible to umount a filesystem after you
|
||||||
|
tried 'mkdir .' or 'mkdir ..'.
|
||||||
|
- Fixed a bad race condition when opening files.
|
||||||
|
- Made the default timeout values more robust.
|
||||||
|
|
||||||
|
ncpfs-0.22 -> ncpfs-0.23
|
||||||
|
- Fixed a memory allocation problem in nwmsg.c. Thanks to
|
||||||
|
Andrew Ross <anr1001@hermes.cam.ac.uk>
|
||||||
|
- slist hopefully does not ask for a password anymore.
|
||||||
|
- cleaned up error messages a bit.
|
||||||
|
- ncpmount now calls modprobe instead of insmod.
|
||||||
|
|
||||||
|
ncpfs-0.21 -> ncpfs-0.22
|
||||||
|
- removed a bad race condition in kernel-1.2/src/dir.c.
|
||||||
|
- handle 0x9999-responses from the ncp server correctly.
|
||||||
|
- Bindery functions in ncplib.c by Brian G. Reid (breid@tim.com)
|
||||||
|
- set blocksize to 512 to satisfy 'du -k'
|
||||||
|
|
||||||
|
ncpfs-0.20 -> ncpfs-0.21
|
||||||
|
- Included two bugfixes in ncplib.c found by Jeff Buhrt
|
||||||
|
<buhrt@iquest.net>.
|
||||||
|
- Included a bugfix in kernel code that could only show for servers
|
||||||
|
that do not support namespace calls. I should have tried ncpfs
|
||||||
|
against lwared... Thanks to Neil Turton <ndt1001@chu.cam.ac.uk> for
|
||||||
|
this fix.
|
||||||
|
|
||||||
|
ncpfs-0.19 -> ncpfs-0.20
|
||||||
|
- Changed the home site for ncpfs from linux01.gwdg.de:/pub/ncpfs
|
||||||
|
to ftp.gwdg.de:/pub/linux/misc/ncpfs. linux01 will remain available,
|
||||||
|
but we would like to reduce the load on that machine. Sites
|
||||||
|
mirroring linux01 please redirect your mirror software to
|
||||||
|
ftp.gwdg.de. Thanks.
|
||||||
|
- Removed a bug in ncplib.c that made slist require a full
|
||||||
|
login. Thanks to Neil Turton <ndt1001@chu.cam.ac.uk> for the hint.
|
||||||
|
- The first real user contribution: ncopy by Brian G. Reid
|
||||||
|
(breid@tim.com) and Tom C. Henderson (thenderson@tim.com). Many
|
||||||
|
thanks to you! If you find bugs in ncopy, tell them, not me ;-)
|
||||||
|
- Handle expired passwords. Thanks to "Mathew Lim" <M.Lim@sp.ac.sg>
|
||||||
|
for the hint.
|
||||||
|
|
||||||
|
ncpfs-0.18 -> ncpfs-0.19
|
||||||
|
|
||||||
|
- hacked around in ncplib.[ch] quite heavily.
|
||||||
|
- SAP handling in ipxparse.c. Thanks to Jeff Buhrt <buhrt@iquest.net>
|
||||||
|
- Changed error handling to use the com_err library. This should
|
||||||
|
eventually provide better error messages, because it's now much
|
||||||
|
easier to define nice messages.
|
||||||
|
- If no server is active, report this correctly
|
||||||
|
- added nsend
|
||||||
|
|
||||||
|
ncpfs-0.17 -> ncpfs-0.18
|
||||||
|
|
||||||
|
- Another attempt at solving the problem that -n is not working.
|
||||||
|
- Forgot nprint in 0.17 util/Makefile.
|
||||||
|
- nprint left connections open when it fails
|
||||||
|
- added options -r and -t to ncpmount to tune ncpfs connections.
|
||||||
|
|
||||||
ncpfs-0.16 -> ncpfs-0.17
|
ncpfs-0.16 -> ncpfs-0.17
|
||||||
|
|
||||||
@@ -52,4 +149,4 @@ ncpfs-0.12 -> ncpfs-0.13
|
|||||||
- support for automatic loading of ncpfs.o by kerneld.
|
- support for automatic loading of ncpfs.o by kerneld.
|
||||||
Thanks to Steven N. Hirsch <hirsch@emba.uvm.edu>.
|
Thanks to Steven N. Hirsch <hirsch@emba.uvm.edu>.
|
||||||
- A subtle problem in the read routines has been removed by Uwe Bonnes
|
- A subtle problem in the read routines has been removed by Uwe Bonnes
|
||||||
<bon@elektron.ikp.physik.th-darmstadt.de>. Thanks a lot.
|
<bon@elektron.ikp.physik.th-darmstadt.de>. Thanks a lot.
|
||||||
|
|||||||
67
FAQ
Normal file
67
FAQ
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
There is certainly not enough material to call this an FAQ, but some
|
||||||
|
questions reach me regularly. Probably the documenation is not clear
|
||||||
|
enough.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Q: The ncpfs utilities like slist or ncpmount tell me that they can
|
||||||
|
not find a server, although I'm sure there are servers on my
|
||||||
|
net. What's wrong?
|
||||||
|
|
||||||
|
You probably used
|
||||||
|
|
||||||
|
ipx_configure --auto_interface=on --auto_primary=on
|
||||||
|
|
||||||
|
and you have Windows (95?) workstations on your network. Windows 95
|
||||||
|
makes Linux configure IPX interfaces for non-existent frame types. To
|
||||||
|
solve this problem, you have to configure your IPX interface manually
|
||||||
|
with the command
|
||||||
|
|
||||||
|
ipx_interface add -p <device> <frame>
|
||||||
|
|
||||||
|
For <device> use eth0, eth1 or whatever you network adapter is
|
||||||
|
called. The value for <frame> must match the frame type used on your
|
||||||
|
network. Possible values are 802.2, 802.3, SNAP and EtherII.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Q: I have difficulties with NetWare 4.1. What can I do?
|
||||||
|
|
||||||
|
To be honest, I do not really know. Currently my only test equipment
|
||||||
|
is a NetWare 3.11 server. You should make your 4.1 Server as
|
||||||
|
3.x-compatible as it can be. As I do not know 4.1, you are on your own
|
||||||
|
doing this.
|
||||||
|
|
||||||
|
A promising hint that has already helped some people is to switch off
|
||||||
|
packet signatures on the 4.1 server, as ncpfs does not support them.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Q: When I re-export ncpfs-mounted directories via nfs, I get messages like
|
||||||
|
'pwd: cannot get current directory', and other strange things happen to
|
||||||
|
the nfs clients. What's wrong?
|
||||||
|
|
||||||
|
When you want to export a directory via NFS, you have to do two things:
|
||||||
|
|
||||||
|
- You have to invoke mountd and nfsd with the option --re-export. On my
|
||||||
|
computer, both are invoked at system startup from the file
|
||||||
|
/etc/rc.d/rc.inet2.
|
||||||
|
|
||||||
|
- You can not export a complete NetWare server hierarchy with all volumes
|
||||||
|
under a single mount point. You have to mount a single server volume to
|
||||||
|
make it re-exportable. Invoke ncpmount with the option -V volume to do
|
||||||
|
this.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Q: When I compile ncpfs, I get a message like the following:
|
||||||
|
|
||||||
|
make[1]: Entering directory `/home/me/netware/ncpfs/kernel-1.2/src'
|
||||||
|
gcc -D__KERNEL__ -I. -Wall -Wstrict-prototypes -O2 -DMODULE -fomit-frame-pointer -I/home/me/netware/ncpfs/kernel-1.2 -DNCPFS_VERSION=\"0.17\" -c dir.c
|
||||||
|
dir.c:36: warning: `struct dirent' declared inside parameter list
|
||||||
|
dir.c:36: warning: its scope is only this definition or declaration,
|
||||||
|
...
|
||||||
|
|
||||||
|
You try to compile the part of ncpfs that is meant for kernel 1.2.13 under
|
||||||
|
kernel 1.3.x. Please look at the Makefile and comment out the
|
||||||
|
corresponding lines.
|
||||||
46
Makefile
46
Makefile
@@ -2,31 +2,32 @@
|
|||||||
# Makefile for the linux ncp-filesystem routines.
|
# Makefile for the linux ncp-filesystem routines.
|
||||||
#
|
#
|
||||||
|
|
||||||
VERSION = 0.17
|
VERSION = 2.0.3
|
||||||
TOPDIR = $(shell pwd)
|
|
||||||
|
|
||||||
BINDIR = /usr/local/bin
|
|
||||||
SBINDIR = /sbin
|
|
||||||
INTERM_BINDIR = $(TOPDIR)/bin
|
|
||||||
SUBDIRS = util ipx-1.0 man
|
|
||||||
|
|
||||||
#
|
|
||||||
# The following 2 lines are for those who use Kernel version 1.2.x.
|
|
||||||
# If you have a kernel later than 1.3.53, please comment out the
|
|
||||||
# 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
|
|
||||||
|
|
||||||
# If you are using kerneld to autoload ncp support,
|
# If you are using kerneld to autoload ncp support,
|
||||||
# uncomment this (kerneld is in linux since about 1.3.57):
|
# uncomment this (kerneld is in linux since about 1.3.57):
|
||||||
#KERNELD = -DHAVE_KERNELD
|
#KERNELD = -DHAVE_KERNELD
|
||||||
|
|
||||||
export INCLUDES BINDIR INTERM_BINDIR SBINDIR KERNELD VERSION
|
# If your system is ELF, please uncomment the following line:
|
||||||
|
#HAVE_ELF=yes
|
||||||
|
|
||||||
|
TOPDIR = $(shell pwd)
|
||||||
|
BINDIR = /usr/local/bin
|
||||||
|
SBINDIR = /sbin
|
||||||
|
INTERM_BINDIR = $(TOPDIR)/bin
|
||||||
|
SUBDIRS = util ipx-1.0 man
|
||||||
|
|
||||||
|
KVERSION=$(shell uname -r | cut -b1-3)
|
||||||
|
|
||||||
|
ifeq ($(KVERSION),1.2)
|
||||||
|
SUBDIRS += kernel-1.2/src
|
||||||
|
INCLUDES = -I$(TOPDIR)/kernel-1.2
|
||||||
|
endif
|
||||||
|
|
||||||
|
export INCLUDES BINDIR INTERM_BINDIR SBINDIR KERNELD VERSION HAVE_ELF
|
||||||
|
|
||||||
all:
|
all:
|
||||||
for i in $(SUBDIRS); do make -C $$i; done
|
for i in $(SUBDIRS); do make -C $$i all; done
|
||||||
|
|
||||||
dep:
|
dep:
|
||||||
for i in $(SUBDIRS); do make -C $$i dep; done
|
for i in $(SUBDIRS); do make -C $$i dep; done
|
||||||
@@ -43,7 +44,8 @@ clean:
|
|||||||
|
|
||||||
mrproper: clean
|
mrproper: clean
|
||||||
rm -fr $(INTERM_BINDIR)/* ncpfs.tgz
|
rm -fr $(INTERM_BINDIR)/* ncpfs.tgz
|
||||||
make -C util realclean
|
make -C util mrproper
|
||||||
|
make -C ipxdump mrproper
|
||||||
|
|
||||||
modules: ncpfs.o
|
modules: ncpfs.o
|
||||||
|
|
||||||
@@ -51,7 +53,11 @@ SRCPATH=$(shell pwd)
|
|||||||
SRCDIR=$(shell basename $(SRCPATH))
|
SRCDIR=$(shell basename $(SRCPATH))
|
||||||
DISTFILE=$(SRCDIR).tgz
|
DISTFILE=$(SRCDIR).tgz
|
||||||
|
|
||||||
dist: tgz
|
dist: mrproper
|
||||||
|
(cd ..; \
|
||||||
|
tar cvf - $(SRCDIR) | \
|
||||||
|
gzip -9 > $(DISTFILE); \
|
||||||
|
mv $(DISTFILE) $(SRCDIR))
|
||||||
make dep
|
make dep
|
||||||
make all
|
make all
|
||||||
|
|
||||||
|
|||||||
52
README
52
README
@@ -3,8 +3,22 @@ some little utilities it also contains nprint, which enables you to
|
|||||||
print on NetWare print queues. The opposite side, pserver, is also
|
print on NetWare print queues. The opposite side, pserver, is also
|
||||||
provided.
|
provided.
|
||||||
|
|
||||||
|
I'm planning major changes in the structure of ncpfs for Linux 2.1.x
|
||||||
|
which will break the binary compatibility. So I changed the numbering
|
||||||
|
scheme for ncpfs. ncpfs-2.0.x will be the version to be used with
|
||||||
|
Linux 2.0.0 and older kernels, and ncpfs-2.1.x will be the version for
|
||||||
|
the development kernels.
|
||||||
|
|
||||||
INSTALLATION
|
INSTALLATION
|
||||||
|
|
||||||
|
Before you start the installation, make sure that your kernel has IPX
|
||||||
|
support compiled in. When 'make config' asks you for
|
||||||
|
|
||||||
|
The IPX protocol (CONFIG_IPX) [N/y/m/?]
|
||||||
|
|
||||||
|
simply answer 'y'. Probably you do not need the full internal net that
|
||||||
|
you are asked for next.
|
||||||
|
|
||||||
The installation of ncpfs depends on the kernel version you are
|
The installation of ncpfs depends on the kernel version you are
|
||||||
using. For kernel 1.2, you should simply type 'make' and look at
|
using. For kernel 1.2, you should simply type 'make' and look at
|
||||||
what's in the bin/ directory after that. Please be sure that your
|
what's in the bin/ directory after that. Please be sure that your
|
||||||
@@ -12,10 +26,9 @@ kernel resides in /usr/src/linux, because the file
|
|||||||
kernel-1.2/src/sock.c has to refer directly to it.
|
kernel-1.2/src/sock.c has to refer directly to it.
|
||||||
|
|
||||||
If you use Kernel 1.3, please be sure that you use at least
|
If you use Kernel 1.3, please be sure that you use at least
|
||||||
1.3.54. ncpfs does NOT work with any earlier 1.3.x kernel, especially
|
1.3.71. ncpfs does NOT work with any earlier 1.3.x kernel.
|
||||||
not with 1.3.53, although this one has a fs/ncpfs/ subdirectory.
|
|
||||||
|
|
||||||
If you use Kernel 1.3.54 or later, you might have to recompile your
|
If you use Kernel 1.3.71 or later, you might have to recompile your
|
||||||
kernel. With these kernels, the kernel part of ncpfs is already
|
kernel. With these kernels, the kernel part of ncpfs is already
|
||||||
included in the main source tree. If you want to use ncpfs, you should
|
included in the main source tree. If you want to use ncpfs, you should
|
||||||
say 'y' to 'make config' when you are asked for IPX, and again when it
|
say 'y' to 'make config' when you are asked for IPX, and again when it
|
||||||
@@ -23,10 +36,32 @@ asks for ncpfs. After you have rebooted with the new kernel, 'cat
|
|||||||
/proc/filesystems' should show you a line saying that the kernel knows
|
/proc/filesystems' should show you a line saying that the kernel knows
|
||||||
ncpfs.
|
ncpfs.
|
||||||
|
|
||||||
With Kernel 1.3.54 or later you also have to modify the Makefile in the
|
If you are running kerneld, please uncomment the corresponding line in
|
||||||
directory you found this README in. Please see the Makefile for the
|
the Makefile to reflect this.
|
||||||
necessary modifications. Then typing 'make' should work with no
|
|
||||||
problem.
|
If your system is ELF, please enable the use of the shared ncp-library
|
||||||
|
in the Makefile. This will save at least 1MB of disk space.
|
||||||
|
|
||||||
|
After you adapted your Makefile, type 'make' and, as root, 'make install'.
|
||||||
|
|
||||||
|
|
||||||
|
HELP
|
||||||
|
|
||||||
|
In the meantime my mail volume has grown considerably, so the response
|
||||||
|
time might be better at the LinWare mailing list than at my personal
|
||||||
|
email address. You can mail to and/or subscribe to the LinWare mailing
|
||||||
|
list:
|
||||||
|
|
||||||
|
Topics for the list:
|
||||||
|
- discussing LinWare server, its features, installation problems and bugs
|
||||||
|
- using IPX protocol under Linux
|
||||||
|
- IPX routing and router daemons under Linux
|
||||||
|
- mars_nwe
|
||||||
|
- ncpfs
|
||||||
|
|
||||||
|
You can subscribe to the list by sending the command "add linware" in
|
||||||
|
the mail message body to address: "listserv@sh.cvut.cz". Your
|
||||||
|
postings should be sent to: "linware@sh.cvut.cz".
|
||||||
|
|
||||||
|
|
||||||
USING NCPFS
|
USING NCPFS
|
||||||
@@ -93,3 +128,6 @@ You will not be able to access servers that require packet
|
|||||||
signatures. This seems to be one of Novell's bigger secrets :-(.
|
signatures. This seems to be one of Novell's bigger secrets :-(.
|
||||||
|
|
||||||
Have fun with ncpfs!
|
Have fun with ncpfs!
|
||||||
|
|
||||||
|
Volker
|
||||||
|
lendecke@namu01.gwdg.de
|
||||||
|
|||||||
15
TODO
Normal file
15
TODO
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
Here's a list of things I want to do. Feel free to send suggestions,
|
||||||
|
or even help me ;-).
|
||||||
|
|
||||||
|
- Add flags to pserver's command line, so that the print command can
|
||||||
|
find out the name of user who printed the job.
|
||||||
|
|
||||||
|
- do rtt estimation, like tcp does.
|
||||||
|
|
||||||
|
- Do better connection management. I imagine to create a ncpd.
|
||||||
|
|
||||||
|
- When ncp is done, one can think about mounting several volumes over
|
||||||
|
a single NCP connection. This should make the trade-off mentioned in
|
||||||
|
ncpmount.8 unnecessary.
|
||||||
|
|
||||||
|
- Do some kind of mapping of NCP uid's to unix uid's
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
{ "auto_primary", required_argument, NULL, 1 },
|
{ "auto_primary", required_argument, NULL, 1 },
|
||||||
@@ -66,8 +67,14 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||||
if (s < 0) {
|
if (s < 0) {
|
||||||
|
int old_errno = errno;
|
||||||
sprintf(errmsg, "%s: socket", progname);
|
sprintf(errmsg, "%s: socket", progname);
|
||||||
perror(errmsg);
|
perror(errmsg);
|
||||||
|
if (old_errno == -EINVAL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Probably you have no IPX support in "
|
||||||
|
"your kernel\n");
|
||||||
|
}
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
static struct ifreq id;
|
static struct ifreq id;
|
||||||
static char *progname;
|
static char *progname;
|
||||||
@@ -118,8 +119,14 @@ ipx_add_interface(int argc, char **argv)
|
|||||||
|
|
||||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||||
if (s < 0) {
|
if (s < 0) {
|
||||||
|
int old_errno = errno;
|
||||||
sprintf(errmsg, "%s: socket", progname);
|
sprintf(errmsg, "%s: socket", progname);
|
||||||
perror(errmsg);
|
perror(errmsg);
|
||||||
|
if (old_errno == -EINVAL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Probably you have no IPX support in "
|
||||||
|
"your kernel\n");
|
||||||
|
}
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ struct ipx_packet
|
|||||||
|
|
||||||
|
|
||||||
void handle_frame (unsigned char *buf, int length, struct sockaddr *saddr);
|
void handle_frame (unsigned char *buf, int length, struct sockaddr *saddr);
|
||||||
void handle_ipx (unsigned char *buf);
|
void handle_ipx(char *frame, unsigned char *buf);
|
||||||
|
|
||||||
static int filter = 0;
|
static int filter = 0;
|
||||||
static IPXNode filter_node;
|
static IPXNode filter_node;
|
||||||
@@ -147,7 +147,7 @@ main (int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
handle_ipx (unsigned char *buf)
|
handle_ipx (char *frame, unsigned char *buf)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct ipx_packet *h = (struct ipx_packet *)buf;
|
struct ipx_packet *h = (struct ipx_packet *)buf;
|
||||||
@@ -179,6 +179,8 @@ handle_ipx (unsigned char *buf)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("%s ", frame);
|
||||||
|
|
||||||
for (i = 0; i < length; i++)
|
for (i = 0; i < length; i++)
|
||||||
{
|
{
|
||||||
printf("%2.2X", buf[i]);
|
printf("%2.2X", buf[i]);
|
||||||
@@ -207,23 +209,20 @@ handle_other (unsigned char *buf, int length, struct sockaddr *saddr)
|
|||||||
|
|
||||||
if (*(unsigned short *)p == 0xffff)
|
if (*(unsigned short *)p == 0xffff)
|
||||||
{
|
{
|
||||||
printf("802.3 ");
|
handle_ipx("802.3", p);
|
||||||
handle_ipx(p);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (*(unsigned short *)p == htons(0xe0e0))
|
if ( (*(unsigned short *)p == htons(0xe0e0))
|
||||||
&& (p[2] == 0x03))
|
&& (p[2] == 0x03))
|
||||||
{
|
{
|
||||||
printf("802.2 ");
|
handle_ipx("802.2", p+3);
|
||||||
handle_ipx(p+3);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (memcmp(p, "\252\252\003\000\000\000\201\067", 8) == 0)
|
if (memcmp(p, "\252\252\003\000\000\000\201\067", 8) == 0)
|
||||||
{
|
{
|
||||||
printf("snap ");
|
handle_ipx("snap", p+8);
|
||||||
handle_ipx(p+8);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -237,8 +236,7 @@ handle_frame (unsigned char *buf, int length, struct sockaddr *saddr)
|
|||||||
switch( packet_type )
|
switch( packet_type )
|
||||||
{
|
{
|
||||||
case __constant_ntohs(ETH_P_IPX):
|
case __constant_ntohs(ETH_P_IPX):
|
||||||
printf("EtherII ");
|
handle_ipx("EtherII", &(buf[sizeof(struct ethhdr)]));
|
||||||
handle_ipx(&(buf[sizeof(struct ethhdr)]));
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
handle_other(buf, length, saddr);
|
handle_other(buf, length, saddr);
|
||||||
|
|||||||
@@ -35,6 +35,8 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include "ipxutil.h"
|
#include "ipxutil.h"
|
||||||
|
|
||||||
|
#define DUMPALLSAPS /* #define if you want to dump all SAP's */
|
||||||
|
|
||||||
struct ipx_address
|
struct ipx_address
|
||||||
{
|
{
|
||||||
unsigned long net;
|
unsigned long net;
|
||||||
@@ -87,10 +89,74 @@ struct ncp_reply_header {
|
|||||||
__u8 data[0] __attribute__ ((packed));
|
__u8 data[0] __attribute__ ((packed));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define NCP_BURST_PACKET (0x7777)
|
||||||
|
|
||||||
|
struct ncp_burst_header {
|
||||||
|
__u16 type __attribute__ ((packed));
|
||||||
|
__u8 system_flags __attribute__ ((packed));
|
||||||
|
__u8 stream_type __attribute__ ((packed));
|
||||||
|
__u32 source_conn __attribute__ ((packed));
|
||||||
|
__u32 dest_conn __attribute__ ((packed));
|
||||||
|
__u32 packet_sequence __attribute__ ((packed));
|
||||||
|
__u32 send_delay __attribute__ ((packed));
|
||||||
|
__u16 burst_sequence __attribute__ ((packed));
|
||||||
|
__u16 ack_sequence __attribute__ ((packed));
|
||||||
|
__u32 burst_length __attribute__ ((packed));
|
||||||
|
__u32 data_offset __attribute__ ((packed));
|
||||||
|
__u16 data_bytes __attribute__ ((packed));
|
||||||
|
__u16 missing_frags __attribute__ ((packed));
|
||||||
|
};
|
||||||
|
|
||||||
void handle_ipx (unsigned char *buf, int length, char *frame, int no);
|
void handle_ipx (unsigned char *buf, int length, char *frame, int no);
|
||||||
void handle_ncp (struct sockaddr_ipx *source,
|
void handle_ncp (struct sockaddr_ipx *source,
|
||||||
struct sockaddr_ipx *target,
|
struct sockaddr_ipx *target,
|
||||||
unsigned char *buf, int length, int no);
|
unsigned char *buf, int length, int no);
|
||||||
|
int handle_burst(struct sockaddr_ipx *source,
|
||||||
|
struct sockaddr_ipx *target,
|
||||||
|
unsigned char *buf, int length, int no);
|
||||||
|
|
||||||
|
#define SAP_MAX_SERVER_NAME_LENGTH 48 /* in network packets */
|
||||||
|
#define SAP_MAX_SAPS_PER_PACKET 7
|
||||||
|
#define SAP_SHUTDOWN 16 /* Magic "hops" value to stop SAP advertising */
|
||||||
|
|
||||||
|
/* SAP Query structure (returned in sap_packet as an array)
|
||||||
|
* NBO == Network Byte Order)
|
||||||
|
*/
|
||||||
|
typedef struct saps {
|
||||||
|
__u16 serverType __attribute__ ((packed)); /* NBO */
|
||||||
|
__u8 serverName[SAP_MAX_SERVER_NAME_LENGTH] __attribute__ ((packed));
|
||||||
|
struct ipx_address serverAddress __attribute__ ((packed));
|
||||||
|
__u16 serverHops __attribute__ ((packed)); /* NBO */
|
||||||
|
} SAPS;
|
||||||
|
|
||||||
|
/* General Service/Nearest Server Response SAP packet */
|
||||||
|
union sap_packet {
|
||||||
|
unsigned short sapOperation;
|
||||||
|
struct sap_query {
|
||||||
|
__u16 sapOperation __attribute__ ((packed));
|
||||||
|
__u16 serverType __attribute__ ((packed));
|
||||||
|
} query;
|
||||||
|
struct sap_response {
|
||||||
|
__u16 sapOperation __attribute__ ((packed));
|
||||||
|
/* each SAP can has a max of SAP_MAX_SAPS_PER_PACKET packets */
|
||||||
|
SAPS sap[SAP_MAX_SAPS_PER_PACKET] __attribute__ ((packed));
|
||||||
|
} response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* print out one SAP record */
|
||||||
|
static void
|
||||||
|
print_sap(FILE *file, SAPS *sapp)
|
||||||
|
{
|
||||||
|
fprintf(file, " Name:%s, serverType 0x%x, ",
|
||||||
|
sapp->serverName,
|
||||||
|
ntohs(sapp->serverType));
|
||||||
|
ipx_fprint_network(file, ntohl(sapp->serverAddress.net));
|
||||||
|
fprintf(file, ":");
|
||||||
|
ipx_fprint_node(file, sapp->serverAddress.node);
|
||||||
|
fprintf(file, ":");
|
||||||
|
ipx_fprint_port(file, ntohs(sapp->serverAddress.sock));
|
||||||
|
fprintf(file, " (Hops %d)\n", ntohs(sapp->serverHops));
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
handle_ipx (unsigned char *buf, int length, char *frame, int no)
|
handle_ipx (unsigned char *buf, int length, char *frame, int no)
|
||||||
@@ -98,6 +164,9 @@ handle_ipx (unsigned char *buf, int length, char *frame, int no)
|
|||||||
struct ipx_packet *h = (struct ipx_packet *)buf;
|
struct ipx_packet *h = (struct ipx_packet *)buf;
|
||||||
struct sockaddr_ipx s_addr;
|
struct sockaddr_ipx s_addr;
|
||||||
struct sockaddr_ipx d_addr;
|
struct sockaddr_ipx d_addr;
|
||||||
|
union sap_packet *sappacket;
|
||||||
|
int hbo_dsock; /* Host Byte Order of Destination SOCKet */
|
||||||
|
int hbo_sapop; /* Host Byte Order of SAP OPeration */
|
||||||
|
|
||||||
memset(&s_addr, 0, sizeof(s_addr));
|
memset(&s_addr, 0, sizeof(s_addr));
|
||||||
memset(&d_addr, 0, sizeof(d_addr));
|
memset(&d_addr, 0, sizeof(d_addr));
|
||||||
@@ -117,12 +186,147 @@ handle_ipx (unsigned char *buf, int length, char *frame, int no)
|
|||||||
ipx_print_saddr(&d_addr);
|
ipx_print_saddr(&d_addr);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
|
if (handle_burst(&s_addr, &d_addr, buf + sizeof(struct ipx_packet),
|
||||||
|
length - sizeof(struct ipx_packet), no) != 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ( (ntohs(s_addr.sipx_port) == 0x451)
|
if ( (ntohs(s_addr.sipx_port) == 0x451)
|
||||||
|| (ntohs(d_addr.sipx_port) == 0x451))
|
|| (ntohs(d_addr.sipx_port) == 0x451))
|
||||||
{
|
{
|
||||||
handle_ncp(&s_addr, &d_addr, buf + sizeof(struct ipx_packet),
|
handle_ncp(&s_addr, &d_addr, buf + sizeof(struct ipx_packet),
|
||||||
length - sizeof(struct ipx_packet), no);
|
length - sizeof(struct ipx_packet), no);
|
||||||
}
|
}
|
||||||
|
else /* next 3 handle IPX by type vs by socket (one or other) */
|
||||||
|
/* Note: most things use either ipx_type OR socket, not both */
|
||||||
|
if (h->ipx_type == 0x01)
|
||||||
|
printf(" type 0x01 (RIP packet (router))\n");
|
||||||
|
else
|
||||||
|
if (h->ipx_type == 0x05)
|
||||||
|
printf(" type 0x05 (SPX sequenced packet)\n");
|
||||||
|
else
|
||||||
|
if (h->ipx_type == 0x14)
|
||||||
|
printf(" type 0x14 (propogated Client-NetBios)\n");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hbo_dsock = ntohs(d_addr.sipx_port);
|
||||||
|
if (hbo_dsock == 0x452) /* SAP */
|
||||||
|
{
|
||||||
|
sappacket = (union sap_packet *)
|
||||||
|
(buf + sizeof(struct ipx_packet));
|
||||||
|
hbo_sapop = ntohs(sappacket->sapOperation);
|
||||||
|
if ((hbo_sapop == 0x01) || (hbo_sapop == 0x03))
|
||||||
|
{
|
||||||
|
printf(" type 0x%x, SAP op:0x%x %s Query, "
|
||||||
|
"serverType 0x%x wanted\n",
|
||||||
|
h->ipx_type, hbo_sapop,
|
||||||
|
(hbo_sapop == 0x01)?"General Service" :
|
||||||
|
(hbo_sapop == 0x03)?"Nearest Server" :
|
||||||
|
"Error",
|
||||||
|
ntohs(sappacket->query.serverType));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int hops;
|
||||||
|
|
||||||
|
hops = ntohs(sappacket->
|
||||||
|
response.sap[0].serverHops);
|
||||||
|
printf(" type 0x%x, SAP op:0x%x %s %s\n",
|
||||||
|
h->ipx_type, hbo_sapop,
|
||||||
|
(hbo_sapop == 0x02)
|
||||||
|
? "General Service Response" :
|
||||||
|
(hbo_sapop == 0x04)
|
||||||
|
? "Nearest Server Response" :
|
||||||
|
"Unknown",
|
||||||
|
(hops >= SAP_SHUTDOWN)
|
||||||
|
? "[Shutdown]" : "");
|
||||||
|
|
||||||
|
/* Service ending */
|
||||||
|
if (hops >= SAP_SHUTDOWN)
|
||||||
|
{
|
||||||
|
print_sap(stdout,
|
||||||
|
sappacket->response.sap);
|
||||||
|
}
|
||||||
|
#ifdef DUMPALLSAPS
|
||||||
|
/* If you want to dump all SAP's */
|
||||||
|
else
|
||||||
|
{ int num_saps;
|
||||||
|
SAPS *sapp;
|
||||||
|
|
||||||
|
num_saps = (length
|
||||||
|
- sizeof(struct ipx_packet)
|
||||||
|
- 2) / sizeof(SAPS);
|
||||||
|
|
||||||
|
sapp = sappacket->response.sap;
|
||||||
|
for(; num_saps > 0; sapp++, num_saps--)
|
||||||
|
print_sap(stdout, sapp);
|
||||||
|
}
|
||||||
|
#endif /* DUMPALLSAPS */
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else /* Other IPX types */
|
||||||
|
printf(" type 0x%x, Socket 0x%x (%s)\n", h->ipx_type,
|
||||||
|
hbo_dsock,
|
||||||
|
(hbo_dsock == 0x451) ? "NCP" :
|
||||||
|
/* (hbo_dsock == 0x452) ? "SAP" :*/
|
||||||
|
(hbo_dsock == 0x453) ? "RIP" :
|
||||||
|
(hbo_dsock == 0x455) ? "Client-NetBios" :
|
||||||
|
(hbo_dsock == 0x456) ? "Diags" :
|
||||||
|
(hbo_dsock == 0x002) ? "Xecho" :
|
||||||
|
(hbo_dsock == 0x8063) ? "NVT2" : "Other");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int handle_burst(struct sockaddr_ipx *source,
|
||||||
|
struct sockaddr_ipx *target,
|
||||||
|
unsigned char *buf, int length, int no)
|
||||||
|
{
|
||||||
|
struct ncp_burst_header *rq = (struct ncp_burst_header *)buf;
|
||||||
|
|
||||||
|
if (rq->type != NCP_BURST_PACKET)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Burst Packet\n");
|
||||||
|
printf("Stream Type: %02X, System Flags: %02X\n",
|
||||||
|
rq->stream_type, rq->system_flags);
|
||||||
|
printf("Source Conn: %08X, Dest Conn: %08X, Packet Seq: %08X\n",
|
||||||
|
rq->source_conn, rq->dest_conn,
|
||||||
|
(unsigned int)ntohl(rq->packet_sequence));
|
||||||
|
printf("Send Delay: %08X, Burst Seq: %04X, Ack Seq: %04X\n",
|
||||||
|
(unsigned int)ntohl(rq->send_delay), ntohs(rq->burst_sequence),
|
||||||
|
ntohs(rq->ack_sequence));
|
||||||
|
printf("Burst Length: %08X\n", (unsigned int)ntohl(rq->burst_length));
|
||||||
|
printf("Data Offset: %08X, Data Bytes: %04X, Missing Frags: %04X\n",
|
||||||
|
(unsigned int)ntohl(rq->data_offset), ntohs(rq->data_bytes),
|
||||||
|
ntohs(rq->missing_frags));
|
||||||
|
|
||||||
|
if (ntohs(rq->data_bytes) == 24)
|
||||||
|
{
|
||||||
|
struct ncp_burst_request
|
||||||
|
{
|
||||||
|
struct ncp_burst_header h __attribute__ ((packed));
|
||||||
|
__u32 function __attribute__ ((packed));
|
||||||
|
__u32 file_handle __attribute__ ((packed));
|
||||||
|
__u8 reserved[8] __attribute__ ((packed));
|
||||||
|
__u32 file_offset __attribute__ ((packed));
|
||||||
|
__u32 number_of_bytes __attribute__ ((packed));
|
||||||
|
} *brq = (struct ncp_burst_request *)rq;
|
||||||
|
|
||||||
|
printf("Assuming Burst Request:\n");
|
||||||
|
printf("%s: Handle %08X, Offset %08X, Bytes %08X\n",
|
||||||
|
brq->function == 1 ? "Read " : "Write",
|
||||||
|
brq->file_handle,
|
||||||
|
(unsigned int)ntohl(brq->file_offset),
|
||||||
|
(unsigned int)ntohl(brq->number_of_bytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_ncp (struct sockaddr_ipx *source,
|
void handle_ncp (struct sockaddr_ipx *source,
|
||||||
@@ -147,6 +351,192 @@ void handle_ncp (struct sockaddr_ipx *source,
|
|||||||
|
|
||||||
switch(rq->function)
|
switch(rq->function)
|
||||||
{
|
{
|
||||||
|
case 18:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("Get Volume Info with Number\n");
|
||||||
|
break;
|
||||||
|
case 20:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("Get File Server Date and Time\n");
|
||||||
|
break;
|
||||||
|
case 21:
|
||||||
|
printf("fn: %-3d, subfn: %-3d\n",
|
||||||
|
rq->function, data[2]);
|
||||||
|
switch(data[2])
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
printf("Send Broadcast Message\n");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
printf("Get Broadcast Message\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
data += 3;
|
||||||
|
data_length -= 3;
|
||||||
|
break;
|
||||||
|
case 22:
|
||||||
|
printf("fn: %-3d, subfn: %-3d\n",
|
||||||
|
rq->function, data[2]);
|
||||||
|
switch(data[2])
|
||||||
|
{
|
||||||
|
case 00:
|
||||||
|
printf("Set Directory Handle\n");
|
||||||
|
break;
|
||||||
|
case 01:
|
||||||
|
printf("Get Directory Path\n");
|
||||||
|
break;
|
||||||
|
case 02:
|
||||||
|
printf("Scan Directory Information\n");
|
||||||
|
break;
|
||||||
|
case 03:
|
||||||
|
printf("Get Effective Directory Rights\n");
|
||||||
|
break;
|
||||||
|
case 05:
|
||||||
|
printf("Get Volume Number\n");
|
||||||
|
break;
|
||||||
|
case 06:
|
||||||
|
printf("Get Volume Name\n");
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
printf("Create directory\n");
|
||||||
|
break;
|
||||||
|
case 18:
|
||||||
|
printf("Allocate Permanent Dir Handle\n");
|
||||||
|
break;
|
||||||
|
case 20:
|
||||||
|
printf("Deallocate Directory Handle\n");
|
||||||
|
break;
|
||||||
|
case 21:
|
||||||
|
printf("Get Volume Info with handle\n");
|
||||||
|
break;
|
||||||
|
case 39:
|
||||||
|
printf("Add ext. Trustee to Dir or File\n");
|
||||||
|
break;
|
||||||
|
case 48:
|
||||||
|
printf("Get Name Space Directory Entry\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
data += 3;
|
||||||
|
data_length -= 3;
|
||||||
|
break;
|
||||||
|
case 23:
|
||||||
|
printf("fn: %-3d, subfn: %-3d\n", rq->function,
|
||||||
|
data[2]);
|
||||||
|
switch(data[2])
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
case 24:
|
||||||
|
printf("Encrypted Login\n");
|
||||||
|
break;
|
||||||
|
case 28:
|
||||||
|
printf("Get Connection Information\n");
|
||||||
|
break;
|
||||||
|
case 50:
|
||||||
|
printf("Create Bindery Object\n");
|
||||||
|
break;
|
||||||
|
case 53:
|
||||||
|
printf("Get Bindery Object ID\n");
|
||||||
|
break;
|
||||||
|
case 54:
|
||||||
|
printf("Get Bindery Object Name\n");
|
||||||
|
break;
|
||||||
|
case 55:
|
||||||
|
printf("Scan Bindery Object\n");
|
||||||
|
break;
|
||||||
|
case 57:
|
||||||
|
printf("Create Property\n");
|
||||||
|
break;
|
||||||
|
case 59:
|
||||||
|
printf("Change Property Security\n");
|
||||||
|
break;
|
||||||
|
case 60:
|
||||||
|
printf("Scan Property\n");
|
||||||
|
break;
|
||||||
|
case 61:
|
||||||
|
printf("Read Property Value\n");
|
||||||
|
break;
|
||||||
|
case 62:
|
||||||
|
printf("Write Property Value\n");
|
||||||
|
break;
|
||||||
|
case 65:
|
||||||
|
printf("Add Bindery Object to Set\n");
|
||||||
|
break;
|
||||||
|
case 67:
|
||||||
|
printf("Is Bindery Object in Set\n");
|
||||||
|
break;
|
||||||
|
case 70:
|
||||||
|
printf("Get Bindery Access Level\n");
|
||||||
|
break;
|
||||||
|
case 72:
|
||||||
|
printf("Get Bindery Object Access Level\n");
|
||||||
|
break;
|
||||||
|
case 75:
|
||||||
|
printf("Keyed change password\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
data += 3;
|
||||||
|
data_length -= 3;
|
||||||
|
break;
|
||||||
|
case 24:
|
||||||
|
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]);
|
||||||
|
data += 3;
|
||||||
|
data_length -= 3;
|
||||||
|
break;
|
||||||
|
case 62:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("File Search Initialize\n");
|
||||||
|
break;
|
||||||
|
case 63:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("File Search Continue\n");
|
||||||
|
break;
|
||||||
|
case 64:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("Search for a file\n");
|
||||||
|
break;
|
||||||
|
case 66:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("Close File\n");
|
||||||
|
break;
|
||||||
|
case 67:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("Create File\n");
|
||||||
|
break;
|
||||||
|
case 72:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("Read from File\n");
|
||||||
|
break;
|
||||||
|
case 73:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("Write to File\n");
|
||||||
|
break;
|
||||||
|
case 75:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("Set File Time Date Stamp\n");
|
||||||
|
break;
|
||||||
|
case 76:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("Open File (old)\n");
|
||||||
|
break;
|
||||||
|
|
||||||
case 87:
|
case 87:
|
||||||
printf("fn: %-3d, subfn: %-3d\n",
|
printf("fn: %-3d, subfn: %-3d\n",
|
||||||
rq->function, data[0]);
|
rq->function, data[0]);
|
||||||
@@ -179,61 +569,20 @@ void handle_ncp (struct sockaddr_ipx *source,
|
|||||||
case 8:
|
case 8:
|
||||||
printf("Delete a File Or Subdirectory\n");
|
printf("Delete a File Or Subdirectory\n");
|
||||||
break;
|
break;
|
||||||
|
case 12:
|
||||||
|
printf("Allocate Short Directory Handle\n");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
data += 1;
|
data += 1;
|
||||||
data_length -= 1;
|
data_length -= 1;
|
||||||
break;
|
break;
|
||||||
case 22:
|
case 97:
|
||||||
printf("fn: %-3d, subfn: %-3d\n",
|
|
||||||
rq->function, data[2]);
|
|
||||||
switch(data[2])
|
|
||||||
{
|
|
||||||
case 21:
|
|
||||||
printf("Get Volume Info with handle\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
data += 3;
|
|
||||||
data_length -= 3;
|
|
||||||
break;
|
|
||||||
case 23:
|
|
||||||
printf("fn: %-3d, subfn: %-3d\n", rq->function,
|
|
||||||
data[2]);
|
|
||||||
data += 3;
|
|
||||||
data_length -= 3;
|
|
||||||
break;
|
|
||||||
case 24:
|
|
||||||
printf("fn: %-3d\n", rq->function);
|
printf("fn: %-3d\n", rq->function);
|
||||||
printf("End of Job\n");
|
printf("Get Big Packet NCP Max Packet Size\n");
|
||||||
break;
|
break;
|
||||||
case 34:
|
case 101:
|
||||||
printf("fn: %-3d, subfn: %-3d\n", rq->function,
|
|
||||||
data[2]);
|
|
||||||
data += 3;
|
|
||||||
data_length -= 3;
|
|
||||||
break;
|
|
||||||
case 62:
|
|
||||||
printf("fn: %-3d\n", rq->function);
|
printf("fn: %-3d\n", rq->function);
|
||||||
printf("File Search Initialize\n");
|
printf("Packet Burst Connection Request\n");
|
||||||
break;
|
|
||||||
case 63:
|
|
||||||
printf("fn: %-3d\n", rq->function);
|
|
||||||
printf("File Search Continue\n");
|
|
||||||
break;
|
|
||||||
case 64:
|
|
||||||
printf("fn: %-3d\n", rq->function);
|
|
||||||
printf("Search for a file\n");
|
|
||||||
break;
|
|
||||||
case 66:
|
|
||||||
printf("fn: %-3d\n", rq->function);
|
|
||||||
printf("Close File\n");
|
|
||||||
break;
|
|
||||||
case 73:
|
|
||||||
printf("fn: %-3d\n", rq->function);
|
|
||||||
printf("Write to File\n");
|
|
||||||
break;
|
|
||||||
case 75:
|
|
||||||
printf("fn: %-3d\n", rq->function);
|
|
||||||
printf("Set File Time Date Stamp\n");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf("fn: %-3d\n", rq->function);
|
printf("fn: %-3d\n", rq->function);
|
||||||
@@ -342,4 +691,3 @@ main (int argc, char *argv[])
|
|||||||
|
|
||||||
exit (0);
|
exit (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ ipx_assign_node(IPXNode dest, IPXNode src)
|
|||||||
int
|
int
|
||||||
ipx_node_equal(IPXNode n1, IPXNode n2)
|
ipx_node_equal(IPXNode n1, IPXNode n2)
|
||||||
{
|
{
|
||||||
return memcmp(n1,n2,sizeof(n1))==0;
|
return memcmp(n1,n2,sizeof(IPXNode))==0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|||||||
@@ -116,6 +116,12 @@ struct ncp_file_info {
|
|||||||
__u16 update_time;
|
__u16 update_time;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Defines for Name Spaces */
|
||||||
|
#define NW_NS_DOS 0
|
||||||
|
#define NW_NS_MAC 1
|
||||||
|
#define NW_NS_NFS 2
|
||||||
|
#define NW_NS_FTAM 3
|
||||||
|
#define NW_NS_OS2 4
|
||||||
|
|
||||||
/* Defines for ReturnInformationMask */
|
/* Defines for ReturnInformationMask */
|
||||||
#define RIM_NAME (0x0001L)
|
#define RIM_NAME (0x0001L)
|
||||||
|
|||||||
@@ -34,18 +34,16 @@ struct ncp_fs_info {
|
|||||||
int buffer_size; /* The negotiated buffer size, to be
|
int buffer_size; /* The negotiated buffer size, to be
|
||||||
used for read/write requests! */
|
used for read/write requests! */
|
||||||
|
|
||||||
/* Not used yet, but here some day the namespace numbers will be
|
|
||||||
stored. */
|
|
||||||
int volume_number;
|
int volume_number;
|
||||||
__u32 directory_id;
|
__u32 directory_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NCP_IOC_NCPREQUEST _IOR('n', 1, unsigned char *)
|
#define NCP_IOC_NCPREQUEST _IOR('n', 1, struct ncp_ioctl_request)
|
||||||
#define NCP_IOC_GETMOUNTUID _IOR('u', 1, uid_t)
|
#define NCP_IOC_GETMOUNTUID _IOW('n', 2, uid_t)
|
||||||
#define NCP_IOC_CONN_LOGGED_IN _IO('l', 1)
|
#define NCP_IOC_CONN_LOGGED_IN _IO('n', 3)
|
||||||
|
|
||||||
#define NCP_GET_FS_INFO_VERSION (1)
|
#define NCP_GET_FS_INFO_VERSION (1)
|
||||||
#define NCP_IOC_GET_FS_INFO _IOWR('i', 1, unsigned char *)
|
#define NCP_IOC_GET_FS_INFO _IOWR('n', 4, struct ncp_fs_info)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The packet size to allocate. One page should be enough.
|
* The packet size to allocate. One page should be enough.
|
||||||
@@ -63,7 +61,7 @@ struct ncp_fs_info {
|
|||||||
#define NCP_READDIR_CACHE_SIZE 64
|
#define NCP_READDIR_CACHE_SIZE 64
|
||||||
|
|
||||||
|
|
||||||
#define NCP_MAX_RPC_TIMEOUT (60) /* 6 seconds */
|
#define NCP_MAX_RPC_TIMEOUT (6*HZ)
|
||||||
|
|
||||||
/* Guess, what 0x564c is :-) */
|
/* Guess, what 0x564c is :-) */
|
||||||
#define NCP_SUPER_MAGIC 0x564c
|
#define NCP_SUPER_MAGIC 0x564c
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ struct ncp_server {
|
|||||||
interest for us later, so we store
|
interest for us later, so we store
|
||||||
it completely. */
|
it completely. */
|
||||||
|
|
||||||
|
__u8 name_space[NCP_NUMBER_OF_VOLUMES];
|
||||||
|
|
||||||
struct file *ncp_filp; /* File pointer to ncp socket */
|
struct file *ncp_filp; /* File pointer to ncp socket */
|
||||||
struct file *wdog_filp; /* File pointer to wdog socket */
|
struct file *wdog_filp; /* File pointer to wdog socket */
|
||||||
void *data_ready; /* The wdog socket gets a new
|
void *data_ready; /* The wdog socket gets a new
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#include <linux/ncp_fs.h>
|
#include <linux/ncp_fs.h>
|
||||||
#include <asm/segment.h>
|
#include <asm/segment.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
|
#include <linux/locks.h>
|
||||||
#include "ncplib_kernel.h"
|
#include "ncplib_kernel.h"
|
||||||
|
|
||||||
struct ncp_dirent {
|
struct ncp_dirent {
|
||||||
@@ -96,6 +97,20 @@ str_lower(char *name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
ncp_namespace(struct inode *i)
|
||||||
|
{
|
||||||
|
struct ncp_server *server = NCP_SERVER(i);
|
||||||
|
struct nw_info_struct *info = NCP_ISTRUCT(i);
|
||||||
|
return server->name_space[info->volNumber];
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
ncp_preserve_case(struct inode *i)
|
||||||
|
{
|
||||||
|
return (ncp_namespace(i) == NW_NS_OS2);
|
||||||
|
}
|
||||||
|
|
||||||
static struct file_operations ncp_dir_operations = {
|
static struct file_operations ncp_dir_operations = {
|
||||||
NULL, /* lseek - default */
|
NULL, /* lseek - default */
|
||||||
ncp_dir_read, /* read - bad */
|
ncp_dir_read, /* read - bad */
|
||||||
@@ -132,7 +147,7 @@ struct inode_operations ncp_dir_inode_operations = {
|
|||||||
/* Here we encapsulate the inode number handling that depends upon the
|
/* Here we encapsulate the inode number handling that depends upon the
|
||||||
* mount mode: When we mount a complete server, the memory address of
|
* mount mode: When we mount a complete server, the memory address of
|
||||||
* the npc_inode_info is used as an inode. When only a single volume
|
* the npc_inode_info is used as an inode. When only a single volume
|
||||||
* is mounted, then the DosDirNum is used as the inode number. As this
|
* is mounted, then the dirEntNum is used as the inode number. As this
|
||||||
* is unique for the complete volume, this should enable the NFS
|
* is unique for the complete volume, this should enable the NFS
|
||||||
* exportability of a ncpfs-mounted volume.
|
* exportability of a ncpfs-mounted volume.
|
||||||
*/
|
*/
|
||||||
@@ -147,7 +162,7 @@ inline ino_t
|
|||||||
ncp_info_ino(struct ncp_server *server, struct ncp_inode_info *info)
|
ncp_info_ino(struct ncp_server *server, struct ncp_inode_info *info)
|
||||||
{
|
{
|
||||||
return ncp_single_volume(server)
|
return ncp_single_volume(server)
|
||||||
? info->finfo.i.DosDirNum : (ino_t)info;
|
? info->finfo.i.dirEntNum : (ino_t)info;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
@@ -200,12 +215,30 @@ static int c_size;
|
|||||||
static int c_seen_eof;
|
static int c_seen_eof;
|
||||||
static int c_last_returned_index;
|
static int c_last_returned_index;
|
||||||
static struct ncp_dirent* c_entry = NULL;
|
static struct ncp_dirent* c_entry = NULL;
|
||||||
|
static int c_lock = 0;
|
||||||
|
static struct wait_queue *c_wait = NULL;
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
ncp_lock_dircache(void)
|
||||||
|
{
|
||||||
|
while (c_lock)
|
||||||
|
sleep_on(&c_wait);
|
||||||
|
c_lock = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
ncp_unlock_dircache(void)
|
||||||
|
{
|
||||||
|
c_lock = 0;
|
||||||
|
wake_up(&c_wait);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ncp_readdir(struct inode *inode, struct file *filp,
|
ncp_readdir(struct inode *inode, struct file *filp,
|
||||||
struct dirent *dirent, int count)
|
struct dirent *dirent, int count)
|
||||||
{
|
{
|
||||||
int result, i = 0;
|
int result = 0;
|
||||||
|
int i = 0;
|
||||||
int index = 0;
|
int index = 0;
|
||||||
struct ncp_dirent *entry = NULL;
|
struct ncp_dirent *entry = NULL;
|
||||||
struct ncp_server *server = NCP_SERVER(inode);
|
struct ncp_server *server = NCP_SERVER(inode);
|
||||||
@@ -238,6 +271,7 @@ ncp_readdir(struct inode *inode, struct file *filp,
|
|||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ncp_lock_dircache();
|
||||||
if (c_entry == NULL)
|
if (c_entry == NULL)
|
||||||
{
|
{
|
||||||
i = sizeof (struct ncp_dirent) * NCP_READDIR_CACHE_SIZE;
|
i = sizeof (struct ncp_dirent) * NCP_READDIR_CACHE_SIZE;
|
||||||
@@ -245,7 +279,8 @@ ncp_readdir(struct inode *inode, struct file *filp,
|
|||||||
if (c_entry == NULL)
|
if (c_entry == NULL)
|
||||||
{
|
{
|
||||||
printk("ncp_readdir: no MEMORY for cache\n");
|
printk("ncp_readdir: no MEMORY for cache\n");
|
||||||
return -ENOMEM;
|
result = -ENOMEM;
|
||||||
|
goto finished;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,10 +290,11 @@ ncp_readdir(struct inode *inode, struct file *filp,
|
|||||||
if (filldir(dirent,".",1, filp->f_pos,
|
if (filldir(dirent,".",1, filp->f_pos,
|
||||||
ncp_info_ino(server, dir)) < 0)
|
ncp_info_ino(server, dir)) < 0)
|
||||||
{
|
{
|
||||||
return 0;
|
goto finished;
|
||||||
}
|
}
|
||||||
filp->f_pos += 1;
|
filp->f_pos += 1;
|
||||||
return ROUND_UP(NAME_OFFSET(dirent)+i+1);
|
result = ROUND_UP(NAME_OFFSET(dirent)+i+1);
|
||||||
|
goto finished;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filp->f_pos == 1)
|
if (filp->f_pos == 1)
|
||||||
@@ -266,10 +302,11 @@ ncp_readdir(struct inode *inode, struct file *filp,
|
|||||||
if (filldir(dirent,"..",2, filp->f_pos,
|
if (filldir(dirent,"..",2, filp->f_pos,
|
||||||
ncp_info_ino(server, dir->dir)) < 0)
|
ncp_info_ino(server, dir->dir)) < 0)
|
||||||
{
|
{
|
||||||
return 0;
|
goto finished;
|
||||||
}
|
}
|
||||||
filp->f_pos += 1;
|
filp->f_pos += 1;
|
||||||
return ROUND_UP(NAME_OFFSET(dirent)+i+1);
|
result = ROUND_UP(NAME_OFFSET(dirent)+i+1);
|
||||||
|
goto finished;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((inode->i_dev == c_dev) && (inode->i_ino == c_ino))
|
if ((inode->i_dev == c_dev) && (inode->i_ino == c_ino))
|
||||||
@@ -286,49 +323,54 @@ ncp_readdir(struct inode *inode, struct file *filp,
|
|||||||
}
|
}
|
||||||
if ((entry == NULL) && c_seen_eof)
|
if ((entry == NULL) && c_seen_eof)
|
||||||
{
|
{
|
||||||
return 0;
|
goto finished;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entry == NULL)
|
if (entry == NULL)
|
||||||
{
|
{
|
||||||
|
int entries;
|
||||||
DDPRINTK("ncp_readdir: Not found in cache.\n");
|
DDPRINTK("ncp_readdir: Not found in cache.\n");
|
||||||
|
|
||||||
if (ncp_is_server_root(inode))
|
if (ncp_is_server_root(inode))
|
||||||
{
|
{
|
||||||
result = ncp_read_volume_list(server, filp->f_pos,
|
entries = ncp_read_volume_list(server, filp->f_pos,
|
||||||
NCP_READDIR_CACHE_SIZE);
|
NCP_READDIR_CACHE_SIZE);
|
||||||
DPRINTK("ncp_read_volume_list returned %d\n", result);
|
DPRINTK("ncp_read_volume_list returned %d\n", entries);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result = ncp_do_readdir(server, inode, filp->f_pos,
|
entries = ncp_do_readdir(server, inode, filp->f_pos,
|
||||||
NCP_READDIR_CACHE_SIZE,
|
NCP_READDIR_CACHE_SIZE,
|
||||||
c_entry);
|
c_entry);
|
||||||
DPRINTK("ncp_readdir returned %d\n", result);
|
DPRINTK("ncp_readdir returned %d\n", entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result < 0)
|
if (entries < 0)
|
||||||
{
|
{
|
||||||
c_dev = 0;
|
c_dev = 0;
|
||||||
c_ino = 0;
|
c_ino = 0;
|
||||||
return result;
|
result = entries;
|
||||||
|
goto finished;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result > 0)
|
if (entries > 0)
|
||||||
{
|
{
|
||||||
c_seen_eof = (result < NCP_READDIR_CACHE_SIZE);
|
c_seen_eof = (entries < NCP_READDIR_CACHE_SIZE);
|
||||||
c_dev = inode->i_dev;
|
c_dev = inode->i_dev;
|
||||||
c_ino = inode->i_ino;
|
c_ino = inode->i_ino;
|
||||||
c_size = result;
|
c_size = entries;
|
||||||
entry = c_entry;
|
entry = c_entry;
|
||||||
c_last_returned_index = 0;
|
c_last_returned_index = 0;
|
||||||
index = 0;
|
index = 0;
|
||||||
|
|
||||||
for (i = 0; i < c_size; i++)
|
if (!ncp_preserve_case(inode))
|
||||||
{
|
{
|
||||||
str_lower(c_entry[i].i.entryName);
|
for (i = 0; i < c_size; i++)
|
||||||
|
{
|
||||||
|
str_lower(c_entry[i].i.entryName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -336,7 +378,7 @@ ncp_readdir(struct inode *inode, struct file *filp,
|
|||||||
if (entry == NULL)
|
if (entry == NULL)
|
||||||
{
|
{
|
||||||
/* Nothing found, even from a ncp call */
|
/* Nothing found, even from a ncp call */
|
||||||
return 0;
|
goto finished;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index < c_size)
|
if (index < c_size)
|
||||||
@@ -350,7 +392,7 @@ ncp_readdir(struct inode *inode, struct file *filp,
|
|||||||
|
|
||||||
if (ncp_single_volume(server))
|
if (ncp_single_volume(server))
|
||||||
{
|
{
|
||||||
ino = (ino_t)(entry->i.DosDirNum);
|
ino = (ino_t)(entry->i.dirEntNum);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -374,15 +416,18 @@ ncp_readdir(struct inode *inode, struct file *filp,
|
|||||||
if (filldir(dirent, entry->i.entryName, entry->i.nameLen,
|
if (filldir(dirent, entry->i.entryName, entry->i.nameLen,
|
||||||
entry->f_pos, ino) < 0)
|
entry->f_pos, ino) < 0)
|
||||||
{
|
{
|
||||||
return 0;
|
goto finished;
|
||||||
}
|
}
|
||||||
|
|
||||||
filp->f_pos += 1;
|
filp->f_pos += 1;
|
||||||
index += 1;
|
index += 1;
|
||||||
entry += 1;
|
entry += 1;
|
||||||
return ROUND_UP(NAME_OFFSET(dirent)+i+1);
|
result = ROUND_UP(NAME_OFFSET(dirent)+i+1);
|
||||||
|
goto finished;
|
||||||
}
|
}
|
||||||
return 0;
|
finished:
|
||||||
|
ncp_unlock_dircache();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@@ -407,7 +452,7 @@ ncp_read_volume_list(struct ncp_server *server, int fpos, int cache_size)
|
|||||||
|
|
||||||
if (ncp_get_volume_info_with_number(server, i, &info) != 0)
|
if (ncp_get_volume_info_with_number(server, i, &info) != 0)
|
||||||
{
|
{
|
||||||
return total_count;
|
return (total_count - fpos);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strlen(info.volume_name) > 0)
|
if (strlen(info.volume_name) > 0)
|
||||||
@@ -430,8 +475,8 @@ ncp_read_volume_list(struct ncp_server *server, int fpos, int cache_size)
|
|||||||
info.volume_name,
|
info.volume_name,
|
||||||
&(entry->i)) != 0)
|
&(entry->i)) != 0)
|
||||||
{
|
{
|
||||||
printk("ncpfs: could not lookup vol "
|
DPRINTK("ncpfs: could not lookup vol "
|
||||||
"%s\n", info.volume_name);
|
"%s\n", info.volume_name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -643,7 +688,7 @@ ncp_init_root(struct ncp_server *server)
|
|||||||
root->finfo.opened = 0;
|
root->finfo.opened = 0;
|
||||||
i->attributes = aDIR;
|
i->attributes = aDIR;
|
||||||
i->dataStreamSize = 1024;
|
i->dataStreamSize = 1024;
|
||||||
i->DosDirNum = 0;
|
i->dirEntNum = i->DosDirNum = 0;
|
||||||
i->volNumber = NCP_NUMBER_OF_VOLUMES+1; /* illegal volnum */
|
i->volNumber = NCP_NUMBER_OF_VOLUMES+1; /* illegal volnum */
|
||||||
ncp_date_unix2dos(0, &(i->creationTime), &(i->creationDate));
|
ncp_date_unix2dos(0, &(i->creationTime), &(i->creationDate));
|
||||||
ncp_date_unix2dos(0, &(i->modifyTime), &(i->modifyDate));
|
ncp_date_unix2dos(0, &(i->modifyTime), &(i->modifyDate));
|
||||||
@@ -720,9 +765,15 @@ ncp_find_dir_inode(struct inode *dir, const char *name)
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if ( (result->dir->finfo.i.DosDirNum == dir_info->DosDirNum)
|
if ( (result->dir->finfo.i.dirEntNum == dir_info->dirEntNum)
|
||||||
&& (result->dir->finfo.i.volNumber == dir_info->volNumber)
|
&& (result->dir->finfo.i.volNumber == dir_info->volNumber)
|
||||||
&& (strcmp(result->finfo.i.entryName, name) == 0))
|
&& (strcmp(result->finfo.i.entryName, name) == 0)
|
||||||
|
/* The root dir is never looked up using this
|
||||||
|
* routine. Without the following test a root
|
||||||
|
* directory 'sys' in a volume named 'sys' could
|
||||||
|
* never be looked up, because
|
||||||
|
* server->root->dir==server->root. */
|
||||||
|
&& (result != &(server->root)))
|
||||||
{
|
{
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -742,7 +793,7 @@ ncp_lookup(struct inode *dir, const char *__name, int len,
|
|||||||
struct ncp_server *server;
|
struct ncp_server *server;
|
||||||
struct ncp_inode_info *result_info;
|
struct ncp_inode_info *result_info;
|
||||||
int found_in_cache;
|
int found_in_cache;
|
||||||
|
int down_case = 0;
|
||||||
char name[len+1];
|
char name[len+1];
|
||||||
|
|
||||||
*result = NULL;
|
*result = NULL;
|
||||||
@@ -794,7 +845,7 @@ ncp_lookup(struct inode *dir, const char *__name, int len,
|
|||||||
|
|
||||||
memcpy(name, __name, len);
|
memcpy(name, __name, len);
|
||||||
name[len] = 0;
|
name[len] = 0;
|
||||||
|
lock_super(dir->i_sb);
|
||||||
result_info = ncp_find_dir_inode(dir, name);
|
result_info = ncp_find_dir_inode(dir, name);
|
||||||
|
|
||||||
if (result_info != 0)
|
if (result_info != 0)
|
||||||
@@ -808,6 +859,7 @@ ncp_lookup(struct inode *dir, const char *__name, int len,
|
|||||||
inode number */
|
inode number */
|
||||||
|
|
||||||
*result = iget(dir->i_sb, ncp_info_ino(server, result_info));
|
*result = iget(dir->i_sb, ncp_info_ino(server, result_info));
|
||||||
|
unlock_super(dir->i_sb);
|
||||||
iput(dir);
|
iput(dir);
|
||||||
|
|
||||||
if (*result == NULL)
|
if (*result == NULL)
|
||||||
@@ -822,7 +874,9 @@ ncp_lookup(struct inode *dir, const char *__name, int len,
|
|||||||
server. */
|
server. */
|
||||||
|
|
||||||
found_in_cache = 0;
|
found_in_cache = 0;
|
||||||
|
|
||||||
|
ncp_lock_dircache();
|
||||||
|
|
||||||
if ((dir->i_dev == c_dev) && (dir->i_ino == c_ino))
|
if ((dir->i_dev == c_dev) && (dir->i_ino == c_ino))
|
||||||
{
|
{
|
||||||
int first = c_last_returned_index;
|
int first = c_last_returned_index;
|
||||||
@@ -845,42 +899,56 @@ ncp_lookup(struct inode *dir, const char *__name, int len,
|
|||||||
}
|
}
|
||||||
while (i != first);
|
while (i != first);
|
||||||
}
|
}
|
||||||
|
ncp_unlock_dircache();
|
||||||
|
|
||||||
if (found_in_cache == 0)
|
if (found_in_cache == 0)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
str_upper(name);
|
|
||||||
|
|
||||||
DDPRINTK("ncp_lookup: do_lookup on %s/%s\n",
|
DDPRINTK("ncp_lookup: do_lookup on %s/%s\n",
|
||||||
NCP_ISTRUCT(dir)->entryName, name);
|
NCP_ISTRUCT(dir)->entryName, name);
|
||||||
|
|
||||||
if (ncp_is_server_root(dir))
|
if (ncp_is_server_root(dir))
|
||||||
{
|
{
|
||||||
|
str_upper(name);
|
||||||
|
down_case = 1;
|
||||||
res = ncp_lookup_volume(server, name, &(finfo.i));
|
res = ncp_lookup_volume(server, name, &(finfo.i));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (!ncp_preserve_case(dir))
|
||||||
|
{
|
||||||
|
str_upper(name);
|
||||||
|
down_case = 1;
|
||||||
|
}
|
||||||
res = ncp_obtain_info(server,
|
res = ncp_obtain_info(server,
|
||||||
NCP_ISTRUCT(dir)->volNumber,
|
NCP_ISTRUCT(dir)->volNumber,
|
||||||
NCP_ISTRUCT(dir)->DosDirNum,
|
NCP_ISTRUCT(dir)->dirEntNum,
|
||||||
name, &(finfo.i));
|
name, &(finfo.i));
|
||||||
}
|
}
|
||||||
if (res != 0)
|
if (res != 0)
|
||||||
{
|
{
|
||||||
|
unlock_super(dir->i_sb);
|
||||||
iput(dir);
|
iput(dir);
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
finfo.opened = 0;
|
finfo.opened = 0;
|
||||||
str_lower(finfo.i.entryName);
|
|
||||||
|
if (down_case != 0)
|
||||||
|
{
|
||||||
|
str_lower(finfo.i.entryName);
|
||||||
|
}
|
||||||
|
|
||||||
if (!(*result = ncp_iget(dir, &finfo)))
|
if (!(*result = ncp_iget(dir, &finfo)))
|
||||||
{
|
{
|
||||||
|
unlock_super(dir->i_sb);
|
||||||
iput(dir);
|
iput(dir);
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unlock_super(dir->i_sb);
|
||||||
iput(dir);
|
iput(dir);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -908,8 +976,13 @@ ncp_create(struct inode *dir, const char *name, int len, int mode,
|
|||||||
|
|
||||||
strncpy(_name, name, len);
|
strncpy(_name, name, len);
|
||||||
_name[len] = '\0';
|
_name[len] = '\0';
|
||||||
str_upper(_name);
|
|
||||||
|
|
||||||
|
if (!ncp_preserve_case(dir))
|
||||||
|
{
|
||||||
|
str_upper(_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
lock_super(dir->i_sb);
|
||||||
if (ncp_open_create_file_or_subdir(NCP_SERVER(dir),
|
if (ncp_open_create_file_or_subdir(NCP_SERVER(dir),
|
||||||
NCP_ISTRUCT(dir), _name,
|
NCP_ISTRUCT(dir), _name,
|
||||||
OC_MODE_CREATE|OC_MODE_OPEN|
|
OC_MODE_CREATE|OC_MODE_OPEN|
|
||||||
@@ -917,22 +990,29 @@ ncp_create(struct inode *dir, const char *name, int len, int mode,
|
|||||||
0, AR_READ|AR_WRITE,
|
0, AR_READ|AR_WRITE,
|
||||||
&finfo) != 0)
|
&finfo) != 0)
|
||||||
{
|
{
|
||||||
|
unlock_super(dir->i_sb);
|
||||||
iput(dir);
|
iput(dir);
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
ncp_invalid_dir_cache(dir);
|
ncp_invalid_dir_cache(dir);
|
||||||
|
|
||||||
str_lower(finfo.i.entryName);
|
if (!ncp_preserve_case(dir))
|
||||||
|
{
|
||||||
|
str_lower(finfo.i.entryName);
|
||||||
|
}
|
||||||
|
|
||||||
finfo.access = O_RDWR;
|
finfo.access = O_RDWR;
|
||||||
|
|
||||||
if (!(*result = ncp_iget(dir, &finfo)) < 0)
|
if (!(*result = ncp_iget(dir, &finfo)) < 0)
|
||||||
{
|
{
|
||||||
ncp_close_file(NCP_SERVER(dir), finfo.file_handle);
|
ncp_close_file(NCP_SERVER(dir), finfo.file_handle);
|
||||||
|
unlock_super(dir->i_sb);
|
||||||
iput(dir);
|
iput(dir);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unlock_super(dir->i_sb);
|
||||||
iput(dir);
|
iput(dir);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -949,12 +1029,17 @@ ncp_mkdir(struct inode *dir, const char *name, int len, int mode)
|
|||||||
|| ( (len == 2)
|
|| ( (len == 2)
|
||||||
&& (name[1] == '.'))))
|
&& (name[1] == '.'))))
|
||||||
{
|
{
|
||||||
|
iput(dir);
|
||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(_name, name, len);
|
strncpy(_name, name, len);
|
||||||
_name[len] = '\0';
|
_name[len] = '\0';
|
||||||
str_upper(_name);
|
|
||||||
|
if (!ncp_preserve_case(dir))
|
||||||
|
{
|
||||||
|
str_upper(_name);
|
||||||
|
}
|
||||||
|
|
||||||
if (!dir || !S_ISDIR(dir->i_mode))
|
if (!dir || !S_ISDIR(dir->i_mode))
|
||||||
{
|
{
|
||||||
@@ -1012,7 +1097,11 @@ ncp_rmdir(struct inode *dir, const char *name, int len)
|
|||||||
|
|
||||||
strncpy(_name, name, len);
|
strncpy(_name, name, len);
|
||||||
_name[len] = '\0';
|
_name[len] = '\0';
|
||||||
str_upper(_name);
|
|
||||||
|
if (!ncp_preserve_case(dir))
|
||||||
|
{
|
||||||
|
str_upper(_name);
|
||||||
|
}
|
||||||
|
|
||||||
if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir),
|
if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir),
|
||||||
NCP_ISTRUCT(dir),
|
NCP_ISTRUCT(dir),
|
||||||
@@ -1055,7 +1144,11 @@ ncp_unlink(struct inode *dir, const char *name, int len)
|
|||||||
{
|
{
|
||||||
strncpy(_name, name, len);
|
strncpy(_name, name, len);
|
||||||
_name[len] = '\0';
|
_name[len] = '\0';
|
||||||
str_upper(_name);
|
|
||||||
|
if (!ncp_preserve_case(dir))
|
||||||
|
{
|
||||||
|
str_upper(_name);
|
||||||
|
}
|
||||||
|
|
||||||
if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir),
|
if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir),
|
||||||
NCP_ISTRUCT(dir),
|
NCP_ISTRUCT(dir),
|
||||||
@@ -1109,11 +1202,19 @@ ncp_rename(struct inode *old_dir, const char *old_name, int old_len,
|
|||||||
|
|
||||||
strncpy(_old_name, old_name, old_len);
|
strncpy(_old_name, old_name, old_len);
|
||||||
_old_name[old_len] = '\0';
|
_old_name[old_len] = '\0';
|
||||||
str_upper(_old_name);
|
|
||||||
|
if (!ncp_preserve_case(old_dir))
|
||||||
|
{
|
||||||
|
str_upper(_old_name);
|
||||||
|
}
|
||||||
|
|
||||||
strncpy(_new_name, new_name, new_len);
|
strncpy(_new_name, new_name, new_len);
|
||||||
_new_name[new_len] = '\0';
|
_new_name[new_len] = '\0';
|
||||||
str_upper(_new_name);
|
|
||||||
|
if (!ncp_preserve_case(new_dir))
|
||||||
|
{
|
||||||
|
str_upper(_new_name);
|
||||||
|
}
|
||||||
|
|
||||||
res = ncp_ren_or_mov_file_or_subdir(NCP_SERVER(old_dir),
|
res = ncp_ren_or_mov_file_or_subdir(NCP_SERVER(old_dir),
|
||||||
NCP_ISTRUCT(old_dir), _old_name,
|
NCP_ISTRUCT(old_dir), _old_name,
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
#include <linux/stat.h>
|
#include <linux/stat.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/ncp_fs.h>
|
#include <linux/ncp_fs.h>
|
||||||
|
#include <linux/locks.h>
|
||||||
#include "ncplib_kernel.h"
|
#include "ncplib_kernel.h"
|
||||||
#include <linux/malloc.h>
|
#include <linux/malloc.h>
|
||||||
|
|
||||||
@@ -50,8 +51,10 @@ ncp_make_open(struct inode *i, int right)
|
|||||||
|
|
||||||
DPRINTK("ncp_make_open: dirent->opened = %d\n", finfo->opened);
|
DPRINTK("ncp_make_open: dirent->opened = %d\n", finfo->opened);
|
||||||
|
|
||||||
|
lock_super(i->i_sb);
|
||||||
if (finfo->opened == 0)
|
if (finfo->opened == 0)
|
||||||
{
|
{
|
||||||
|
finfo->access = -1;
|
||||||
/* tries max. rights */
|
/* tries max. rights */
|
||||||
if (ncp_open_create_file_or_subdir(NCP_SERVER(i),
|
if (ncp_open_create_file_or_subdir(NCP_SERVER(i),
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
@@ -69,12 +72,10 @@ ncp_make_open(struct inode *i, int right)
|
|||||||
{
|
{
|
||||||
finfo->access = O_RDONLY;
|
finfo->access = O_RDONLY;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
return -EACCES;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unlock_super(i->i_sb);
|
||||||
|
|
||||||
if ( ((right == O_RDONLY) && ( (finfo->access == O_RDONLY)
|
if ( ((right == O_RDONLY) && ( (finfo->access == O_RDONLY)
|
||||||
|| (finfo->access == O_RDWR)))
|
|| (finfo->access == O_RDWR)))
|
||||||
|| ((right == O_WRONLY) && ( (finfo->access == O_WRONLY)
|
|| ((right == O_WRONLY) && ( (finfo->access == O_WRONLY)
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ ncp_read_inode(struct inode *inode)
|
|||||||
inode->i_nlink = 1;
|
inode->i_nlink = 1;
|
||||||
inode->i_uid = NCP_SERVER(inode)->m.uid;
|
inode->i_uid = NCP_SERVER(inode)->m.uid;
|
||||||
inode->i_gid = NCP_SERVER(inode)->m.gid;
|
inode->i_gid = NCP_SERVER(inode)->m.gid;
|
||||||
inode->i_blksize = 1024;
|
inode->i_blksize = 512;
|
||||||
inode->i_rdev = 0;
|
inode->i_rdev = 0;
|
||||||
|
|
||||||
if ((inode->i_blksize != 0) && (inode->i_size != 0))
|
if ((inode->i_blksize != 0) && (inode->i_size != 0))
|
||||||
@@ -132,7 +132,9 @@ static void
|
|||||||
ncp_put_inode(struct inode *inode)
|
ncp_put_inode(struct inode *inode)
|
||||||
{
|
{
|
||||||
struct nw_file_info *finfo = NCP_FINFO(inode);
|
struct nw_file_info *finfo = NCP_FINFO(inode);
|
||||||
|
struct super_block *sb = inode->i_sb;
|
||||||
|
|
||||||
|
lock_super(sb);
|
||||||
if (finfo->opened != 0)
|
if (finfo->opened != 0)
|
||||||
{
|
{
|
||||||
if (ncp_close_file(NCP_SERVER(inode), finfo->file_handle)!=0)
|
if (ncp_close_file(NCP_SERVER(inode), finfo->file_handle)!=0)
|
||||||
@@ -155,6 +157,7 @@ ncp_put_inode(struct inode *inode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
clear_inode(inode);
|
clear_inode(inode);
|
||||||
|
unlock_super(sb);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct super_block *
|
struct super_block *
|
||||||
|
|||||||
@@ -29,6 +29,26 @@ ncp_ioctl (struct inode * inode, struct file * filp,
|
|||||||
struct ncp_fs_info info;
|
struct ncp_fs_info info;
|
||||||
struct ncp_server *server = NCP_SERVER(inode);
|
struct ncp_server *server = NCP_SERVER(inode);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Binary compatible with 1.3.XX releases.
|
||||||
|
* Take this out in 2.1.0 development series.
|
||||||
|
* <mec@duracef.shout.net> 12 Mar 1996
|
||||||
|
*/
|
||||||
|
switch(cmd) {
|
||||||
|
case _IOR('n', 1, unsigned char *):
|
||||||
|
cmd = NCP_IOC_NCPREQUEST;
|
||||||
|
break;
|
||||||
|
case _IOR('u', 1, uid_t):
|
||||||
|
cmd = NCP_IOC_GETMOUNTUID;
|
||||||
|
break;
|
||||||
|
case _IO('l', 1):
|
||||||
|
cmd = NCP_IOC_CONN_LOGGED_IN;
|
||||||
|
break;
|
||||||
|
case _IOWR('i', 1, unsigned char *):
|
||||||
|
cmd = NCP_IOC_GET_FS_INFO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
switch(cmd) {
|
switch(cmd) {
|
||||||
case NCP_IOC_NCPREQUEST:
|
case NCP_IOC_NCPREQUEST:
|
||||||
|
|
||||||
@@ -116,6 +136,8 @@ ncp_ioctl (struct inode * inode, struct file * filp,
|
|||||||
info.mounted_uid = server->m.mounted_uid;
|
info.mounted_uid = server->m.mounted_uid;
|
||||||
info.connection = server->connection;
|
info.connection = server->connection;
|
||||||
info.buffer_size = server->buffer_size;
|
info.buffer_size = server->buffer_size;
|
||||||
|
info.volume_number = NCP_ISTRUCT(inode)->volNumber;
|
||||||
|
info.directory_id = NCP_ISTRUCT(inode)->DosDirNum;
|
||||||
|
|
||||||
memcpy_tofs((struct ncp_fs_info *)arg, &info, sizeof(info));
|
memcpy_tofs((struct ncp_fs_info *)arg, &info, sizeof(info));
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -188,25 +188,6 @@ ncp_get_volume_info_with_number(struct ncp_server *server, int n,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
ncp_get_volume_number(struct ncp_server *server, const char *name, int *target)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
|
|
||||||
ncp_init_request_s(server, 5);
|
|
||||||
ncp_add_pstring(server, name);
|
|
||||||
|
|
||||||
if ((result = ncp_request(server, 22)) != 0)
|
|
||||||
{
|
|
||||||
ncp_unlock_server(server);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
*target = ncp_reply_byte(server, 0);
|
|
||||||
ncp_unlock_server(server);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
ncp_close_file(struct ncp_server *server, const char *file_id)
|
ncp_close_file(struct ncp_server *server, const char *file_id)
|
||||||
{
|
{
|
||||||
@@ -282,8 +263,8 @@ ncp_obtain_info(struct ncp_server *server,
|
|||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 6); /* subfunction */
|
ncp_add_byte(server, 6); /* subfunction */
|
||||||
ncp_add_byte(server, 0); /* dos name space */
|
ncp_add_byte(server, server->name_space[vol_num]);
|
||||||
ncp_add_byte(server, 0); /* dos name space as dest */
|
ncp_add_byte(server, server->name_space[vol_num]);
|
||||||
ncp_add_word(server, 0xff); /* get all */
|
ncp_add_word(server, 0xff); /* get all */
|
||||||
ncp_add_dword(server, RIM_ALL);
|
ncp_add_dword(server, RIM_ALL);
|
||||||
ncp_add_handle_path(server, vol_num, dir_base, 1, path);
|
ncp_add_handle_path(server, vol_num, dir_base, 1, path);
|
||||||
@@ -299,20 +280,57 @@ ncp_obtain_info(struct ncp_server *server,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
ncp_has_os2_namespace(struct ncp_server *server, __u8 volume)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
__u8 *namespace;
|
||||||
|
__u16 no_namespaces;
|
||||||
|
|
||||||
|
ncp_init_request(server);
|
||||||
|
ncp_add_byte(server, 24); /* Subfunction: Get Name Spaces Loaded */
|
||||||
|
ncp_add_word(server, 0);
|
||||||
|
ncp_add_byte(server, volume);
|
||||||
|
|
||||||
|
if ((result = ncp_request(server, 87)) != 0)
|
||||||
|
{
|
||||||
|
ncp_unlock_server(server);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
no_namespaces = ncp_reply_word(server, 0);
|
||||||
|
namespace = ncp_reply_data(server, 2);
|
||||||
|
|
||||||
|
while (no_namespaces > 0)
|
||||||
|
{
|
||||||
|
DPRINTK("get_namespaces: found %d on %d\n", *namespace,volume);
|
||||||
|
|
||||||
|
if (*namespace == 4)
|
||||||
|
{
|
||||||
|
DPRINTK("get_namespaces: found OS2\n");
|
||||||
|
ncp_unlock_server(server);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
namespace += 1;
|
||||||
|
no_namespaces -= 1;
|
||||||
|
}
|
||||||
|
ncp_unlock_server(server);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
ncp_lookup_volume(struct ncp_server *server,
|
ncp_lookup_volume(struct ncp_server *server,
|
||||||
char *volname,
|
char *volname,
|
||||||
struct nw_info_struct *target)
|
struct nw_info_struct *target)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
__u8 vol_num;
|
int volnum;
|
||||||
__u32 dir_base;
|
|
||||||
|
|
||||||
DPRINTK("ncp_lookup_volume: looking up vol %s\n", volname);
|
DPRINTK("ncp_lookup_volume: looking up vol %s\n", volname);
|
||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 22); /* Subfunction: Generate dir handle */
|
ncp_add_byte(server, 22); /* Subfunction: Generate dir handle */
|
||||||
ncp_add_byte(server, 0); /* DOS name space */
|
ncp_add_byte(server, 0); /* DOS namespace */
|
||||||
ncp_add_byte(server, 0); /* reserved */
|
ncp_add_byte(server, 0); /* reserved */
|
||||||
ncp_add_byte(server, 0); /* reserved */
|
ncp_add_byte(server, 0); /* reserved */
|
||||||
ncp_add_byte(server, 0); /* reserved */
|
ncp_add_byte(server, 0); /* reserved */
|
||||||
@@ -329,20 +347,19 @@ ncp_lookup_volume(struct ncp_server *server,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
dir_base = ncp_reply_dword(server, 4);
|
memset(target, 0, sizeof(*target));
|
||||||
vol_num = ncp_reply_byte(server, 8);
|
target->DosDirNum = target->dirEntNum = ncp_reply_dword(server, 4);
|
||||||
|
target->volNumber = volnum = ncp_reply_byte(server, 8);
|
||||||
ncp_unlock_server(server);
|
ncp_unlock_server(server);
|
||||||
|
|
||||||
if ((result = ncp_obtain_info(server, vol_num, dir_base, NULL,
|
server->name_space[volnum] = ncp_has_os2_namespace(server,volnum)?4:0;
|
||||||
target)) != 0)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
DPRINTK("ncp_lookup_volume: attribs = %X\n", target->attributes);
|
DPRINTK("lookup_vol: namespace[%d] = %d\n",
|
||||||
|
volnum, server->name_space[volnum]);
|
||||||
|
|
||||||
target->nameLen = strlen(volname);
|
target->nameLen = strlen(volname);
|
||||||
strcpy(target->entryName, volname);
|
strcpy(target->entryName, volname);
|
||||||
|
target->attributes = aDIR;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -356,14 +373,14 @@ ncp_modify_file_or_subdir_dos_info(struct ncp_server *server,
|
|||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 7); /* subfunction */
|
ncp_add_byte(server, 7); /* subfunction */
|
||||||
ncp_add_byte(server, 0); /* dos name space */
|
ncp_add_byte(server, server->name_space[file->volNumber]);
|
||||||
ncp_add_byte(server, 0); /* reserved */
|
ncp_add_byte(server, 0); /* reserved */
|
||||||
ncp_add_word(server, 0x8006); /* search attribs: all */
|
ncp_add_word(server, 0x8006); /* search attribs: all */
|
||||||
|
|
||||||
ncp_add_dword(server, info_mask);
|
ncp_add_dword(server, info_mask);
|
||||||
ncp_add_mem(server, info, sizeof(*info));
|
ncp_add_mem(server, info, sizeof(*info));
|
||||||
ncp_add_handle_path(server, file->volNumber,
|
ncp_add_handle_path(server, file->volNumber,
|
||||||
file->DosDirNum, 1, NULL);
|
file->dirEntNum, 1, NULL);
|
||||||
|
|
||||||
if ((result = ncp_request(server, 87)) != 0)
|
if ((result = ncp_request(server, 87)) != 0)
|
||||||
{
|
{
|
||||||
@@ -383,11 +400,11 @@ ncp_del_file_or_subdir(struct ncp_server *server,
|
|||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 8); /* subfunction */
|
ncp_add_byte(server, 8); /* subfunction */
|
||||||
ncp_add_byte(server, 0); /* dos name space */
|
ncp_add_byte(server, server->name_space[dir->volNumber]);
|
||||||
ncp_add_byte(server, 0); /* reserved */
|
ncp_add_byte(server, 0); /* reserved */
|
||||||
ncp_add_word(server, 0x8006); /* search attribs: all */
|
ncp_add_word(server, 0x8006); /* search attribs: all */
|
||||||
ncp_add_handle_path(server, dir->volNumber,
|
ncp_add_handle_path(server, dir->volNumber,
|
||||||
dir->DosDirNum, 1, name);
|
dir->dirEntNum, 1, name);
|
||||||
|
|
||||||
if ((result = ncp_request(server, 87)) != 0)
|
if ((result = ncp_request(server, 87)) != 0)
|
||||||
{
|
{
|
||||||
@@ -420,15 +437,16 @@ ncp_open_create_file_or_subdir(struct ncp_server *server,
|
|||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
__u16 search_attribs = 0x0006;
|
__u16 search_attribs = 0x0006;
|
||||||
|
__u8 volume = (dir != NULL) ? dir->volNumber : target->i.volNumber;
|
||||||
|
|
||||||
if ((create_attributes & aDIR) != 0)
|
if ((create_attributes & aDIR) != 0)
|
||||||
{
|
{
|
||||||
search_attribs |= 0x8000;
|
search_attribs |= 0x8000;
|
||||||
}
|
}
|
||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 1); /* subfunction */
|
ncp_add_byte(server, 1); /* subfunction */
|
||||||
ncp_add_byte(server, 0); /* dos name space */
|
ncp_add_byte(server, server->name_space[volume]);
|
||||||
ncp_add_byte(server, open_create_mode);
|
ncp_add_byte(server, open_create_mode);
|
||||||
ncp_add_word(server, search_attribs);
|
ncp_add_word(server, search_attribs);
|
||||||
ncp_add_dword(server, RIM_ALL);
|
ncp_add_dword(server, RIM_ALL);
|
||||||
@@ -439,13 +457,11 @@ ncp_open_create_file_or_subdir(struct ncp_server *server,
|
|||||||
|
|
||||||
if (dir != NULL)
|
if (dir != NULL)
|
||||||
{
|
{
|
||||||
ncp_add_handle_path(server, dir->volNumber,
|
ncp_add_handle_path(server, volume, dir->dirEntNum, 1, name);
|
||||||
dir->DosDirNum, 1, name);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ncp_add_handle_path(server,
|
ncp_add_handle_path(server, volume, target->i.dirEntNum,
|
||||||
target->i.volNumber, target->i.DosDirNum,
|
|
||||||
1, NULL);
|
1, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -481,9 +497,9 @@ ncp_initialize_search(struct ncp_server *server,
|
|||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 2); /* subfunction */
|
ncp_add_byte(server, 2); /* subfunction */
|
||||||
ncp_add_byte(server, 0); /* dos name space */
|
ncp_add_byte(server, server->name_space[dir->volNumber]);
|
||||||
ncp_add_byte(server, 0); /* reserved */
|
ncp_add_byte(server, 0); /* reserved */
|
||||||
ncp_add_handle_path(server, dir->volNumber, dir->DosDirNum, 1, NULL);
|
ncp_add_handle_path(server, dir->volNumber, dir->dirEntNum, 1, NULL);
|
||||||
|
|
||||||
if ((result = ncp_request(server, 87)) != 0)
|
if ((result = ncp_request(server, 87)) != 0)
|
||||||
{
|
{
|
||||||
@@ -507,7 +523,7 @@ ncp_search_for_file_or_subdir(struct ncp_server *server,
|
|||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 3); /* subfunction */
|
ncp_add_byte(server, 3); /* subfunction */
|
||||||
ncp_add_byte(server, 0); /* dos name space */
|
ncp_add_byte(server, server->name_space[seq->volNumber]);
|
||||||
ncp_add_byte(server, 0); /* data stream (???) */
|
ncp_add_byte(server, 0); /* data stream (???) */
|
||||||
ncp_add_word(server, 0xffff); /* Search attribs */
|
ncp_add_word(server, 0xffff); /* Search attribs */
|
||||||
ncp_add_dword(server, RIM_ALL); /* return info mask */
|
ncp_add_dword(server, RIM_ALL); /* return info mask */
|
||||||
@@ -542,19 +558,19 @@ ncp_ren_or_mov_file_or_subdir(struct ncp_server *server,
|
|||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 4); /* subfunction */
|
ncp_add_byte(server, 4); /* subfunction */
|
||||||
ncp_add_byte(server, 0); /* dos name space */
|
ncp_add_byte(server, server->name_space[old_dir->volNumber]);
|
||||||
ncp_add_byte(server, 1); /* rename flag */
|
ncp_add_byte(server, 1); /* rename flag */
|
||||||
ncp_add_word(server, 0x8006); /* search attributes */
|
ncp_add_word(server, 0x8006); /* search attributes */
|
||||||
|
|
||||||
/* source Handle Path */
|
/* source Handle Path */
|
||||||
ncp_add_byte(server, old_dir->volNumber);
|
ncp_add_byte(server, old_dir->volNumber);
|
||||||
ncp_add_dword(server, old_dir->DosDirNum);
|
ncp_add_dword(server, old_dir->dirEntNum);
|
||||||
ncp_add_byte(server, 1);
|
ncp_add_byte(server, 1);
|
||||||
ncp_add_byte(server, 1); /* 1 source component */
|
ncp_add_byte(server, 1); /* 1 source component */
|
||||||
|
|
||||||
/* dest Handle Path */
|
/* dest Handle Path */
|
||||||
ncp_add_byte(server, new_dir->volNumber);
|
ncp_add_byte(server, new_dir->volNumber);
|
||||||
ncp_add_dword(server, new_dir->DosDirNum);
|
ncp_add_dword(server, new_dir->dirEntNum);
|
||||||
ncp_add_byte(server, 1);
|
ncp_add_byte(server, 1);
|
||||||
ncp_add_byte(server, 1); /* 1 destination component */
|
ncp_add_byte(server, 1); /* 1 destination component */
|
||||||
|
|
||||||
|
|||||||
@@ -222,6 +222,7 @@ do_ncp_rpc_call(struct ncp_server *server, int size)
|
|||||||
int timeout;
|
int timeout;
|
||||||
int retrans;
|
int retrans;
|
||||||
int major_timeout_seen;
|
int major_timeout_seen;
|
||||||
|
int acknowledge_seen;
|
||||||
int n;
|
int n;
|
||||||
int addrlen;
|
int addrlen;
|
||||||
unsigned long old_mask;
|
unsigned long old_mask;
|
||||||
@@ -243,7 +244,8 @@ do_ncp_rpc_call(struct ncp_server *server, int size)
|
|||||||
return -EBADF;
|
return -EBADF;
|
||||||
}
|
}
|
||||||
init_timeout = server->m.time_out;
|
init_timeout = server->m.time_out;
|
||||||
max_timeout = NCP_MAX_RPC_TIMEOUT*HZ/10;
|
max_timeout = NCP_MAX_RPC_TIMEOUT;
|
||||||
|
acknowledge_seen = 0;
|
||||||
retrans = server->m.retry_count;
|
retrans = server->m.retry_count;
|
||||||
major_timeout_seen = 0;
|
major_timeout_seen = 0;
|
||||||
old_mask = current->blocked;
|
old_mask = current->blocked;
|
||||||
@@ -296,11 +298,14 @@ do_ncp_rpc_call(struct ncp_server *server, int size)
|
|||||||
{
|
{
|
||||||
if (timeout > max_timeout)
|
if (timeout > max_timeout)
|
||||||
{
|
{
|
||||||
/* JEJB/JSP 2/7/94
|
/* JEJB/JSP 2/7/94
|
||||||
* This is useful to see if the system is
|
* This is useful to see if the system is
|
||||||
* hanging */
|
* hanging */
|
||||||
printk("NCP max timeout reached\n");
|
if (acknowledge_seen == 0)
|
||||||
timeout = max_timeout;
|
{
|
||||||
|
printk("NCP max timeout reached\n");
|
||||||
|
}
|
||||||
|
timeout = max_timeout;
|
||||||
}
|
}
|
||||||
current->timeout = jiffies + timeout;
|
current->timeout = jiffies + timeout;
|
||||||
schedule();
|
schedule();
|
||||||
@@ -373,6 +378,9 @@ do_ncp_rpc_call(struct ncp_server *server, int size)
|
|||||||
sock->ops->recvfrom(sock, (void *)&reply,
|
sock->ops->recvfrom(sock, (void *)&reply,
|
||||||
sizeof(reply), 1, 0,
|
sizeof(reply), 1, 0,
|
||||||
NULL, &addrlen);
|
NULL, &addrlen);
|
||||||
|
n = 0;
|
||||||
|
timeout = max_timeout;
|
||||||
|
acknowledge_seen = 1;
|
||||||
goto re_select;
|
goto re_select;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -401,9 +409,8 @@ do_ncp_rpc_call(struct ncp_server *server, int size)
|
|||||||
* a null buffer yet. */
|
* a null buffer yet. */
|
||||||
sock->ops->recvfrom(sock, (void *)&reply, sizeof(reply), 1, 0,
|
sock->ops->recvfrom(sock, (void *)&reply, sizeof(reply), 1, 0,
|
||||||
NULL, &addrlen);
|
NULL, &addrlen);
|
||||||
#if 1
|
|
||||||
printk("ncp_rpc_call: reply mismatch\n");
|
DPRINTK("ncp_rpc_call: reply mismatch\n");
|
||||||
#endif
|
|
||||||
goto re_select;
|
goto re_select;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
MAN1= slist nprint pqlist
|
MAN1= slist nprint pqlist nsend pserver ncopy npasswd
|
||||||
|
MAN1 += nwbols nwboprops nwbpvalues nwfsinfo nwuserlist
|
||||||
MAN5= nwclient
|
MAN5= nwclient
|
||||||
MAN8= ncpmount ncpumount ipx_configure ipx_interface ipx_internal_net ipx_route
|
MAN8= ncpmount ncpumount ipx_configure ipx_interface ipx_internal_net \
|
||||||
|
ipx_route nwmsg
|
||||||
|
MAN8 += nwbocreate nwborm nwbpadd nwbpcreate nwbprm
|
||||||
|
MAN8 += nwgrant nwrevoke
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
96
man/ncopy.1
Normal file
96
man/ncopy.1
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
.\"
|
||||||
|
.\" Man page for the ncopy program
|
||||||
|
.\"
|
||||||
|
.TH NCOPY 1 17/03/1996 ncopy ncopy
|
||||||
|
.SH NAME
|
||||||
|
ncopy \- NetWare file copy
|
||||||
|
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B ncopy -V
|
||||||
|
|
||||||
|
.B ncopy
|
||||||
|
[
|
||||||
|
.B -vn
|
||||||
|
]
|
||||||
|
[
|
||||||
|
.B -s
|
||||||
|
.I amount
|
||||||
|
]
|
||||||
|
.B file destinationfile|directory
|
||||||
|
|
||||||
|
.B ncopy
|
||||||
|
[
|
||||||
|
.B -vn
|
||||||
|
]
|
||||||
|
[
|
||||||
|
.B -s
|
||||||
|
.I amount
|
||||||
|
]
|
||||||
|
.B file1
|
||||||
|
[
|
||||||
|
.B file2 ...
|
||||||
|
]
|
||||||
|
.B directory
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
With
|
||||||
|
.B ncopy
|
||||||
|
you can copy files to different locations on a single NetWare file
|
||||||
|
server without generating excess network traffic. The program uses
|
||||||
|
a NetWare function to do the copy rather than transferring the file
|
||||||
|
across the network for both the read and write.
|
||||||
|
|
||||||
|
If the last argument is a directory,
|
||||||
|
.B ncopy
|
||||||
|
will copy the source file(s) into the directory. If only two files
|
||||||
|
are given and the last argument is not a directory, it will copy the
|
||||||
|
source file to the destination file.
|
||||||
|
|
||||||
|
If the source and destination files are not on the same NetWare server
|
||||||
|
(or are not on NetWare servers at all),
|
||||||
|
.B ncopy
|
||||||
|
will do a normal file copy.
|
||||||
|
.SH OPTIONS
|
||||||
|
.B -V
|
||||||
|
.RS 3
|
||||||
|
Show version number and exit
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -v
|
||||||
|
.RS 3
|
||||||
|
Verbose copy. Will show current file and percentage completion.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -n
|
||||||
|
.RS 3
|
||||||
|
Nice NetWare copy. Will sleep for a second between copying blocks on
|
||||||
|
the NetWare server. Gives other people a chance to do some work on
|
||||||
|
the NetWare server when you are copying large files. This has no
|
||||||
|
effect if you are not copying on a NetWare server.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -s
|
||||||
|
.I amount
|
||||||
|
.RS 3
|
||||||
|
Nice time slice factor. Used in conjunction with the
|
||||||
|
.B -n
|
||||||
|
option, this specifies the number of 100K blocks to copy before sleeping.
|
||||||
|
Default is 10. (1 Megabyte)
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.SH BUGS
|
||||||
|
.B ncopy
|
||||||
|
cannot recurse into directories.
|
||||||
|
Does not work on NetWare volumes mounted with the
|
||||||
|
.I -V
|
||||||
|
option to
|
||||||
|
.B ncpmount.
|
||||||
|
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.B ncpmount(8), ncpumount(8)
|
||||||
|
|
||||||
|
.SH CREDITS
|
||||||
|
ncopy was written by Brian G. Reid (breid@tim.com) and
|
||||||
|
Tom C. Henderson (thenderson@tim.com).
|
||||||
|
Many thanks to Volker Lendecke (lendecke@namu01.gwdg.de) for the ncpfs
|
||||||
|
and ncplib which made ncopy possible.
|
||||||
@@ -37,6 +37,12 @@ ncpmount \- mount all volumes of a specified Novell fileserver.
|
|||||||
.B -V
|
.B -V
|
||||||
.I volume
|
.I volume
|
||||||
] [
|
] [
|
||||||
|
.B -t
|
||||||
|
.I time_out
|
||||||
|
] [
|
||||||
|
.B -r
|
||||||
|
.I retry_count
|
||||||
|
] [
|
||||||
.B -v
|
.B -v
|
||||||
]
|
]
|
||||||
mount-point
|
mount-point
|
||||||
@@ -221,6 +227,36 @@ sometime in the future I will make it possible to mount all volumes on
|
|||||||
different mount points, using only one connection.
|
different mount points, using only one connection.
|
||||||
.RE
|
.RE
|
||||||
|
|
||||||
|
.B -t
|
||||||
|
.I time_out
|
||||||
|
.RS 3
|
||||||
|
With
|
||||||
|
.B -t
|
||||||
|
you can adjust the time ncpfs waits for the server to answer a request
|
||||||
|
it sent. Use the option to raise the timeout value when your ncpfs
|
||||||
|
connections seem to be unstable although your servers are well
|
||||||
|
up. This can happen when you have very busy servers, or servers that
|
||||||
|
are very far away.
|
||||||
|
|
||||||
|
.I time_out
|
||||||
|
is specified in 1/100s, the current default value is 60.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -r
|
||||||
|
.I retry_count
|
||||||
|
.RS 3
|
||||||
|
As
|
||||||
|
.B -t, -r
|
||||||
|
can be used to tune the ncpfs connection to the server. With
|
||||||
|
retry_count you can specify how many times ncpfs will attempt to send
|
||||||
|
a packet to the server before it decides the connection is dead. The
|
||||||
|
current default value is 5.
|
||||||
|
|
||||||
|
Currently ncpfs is not too clever when trying to find out that
|
||||||
|
connections are dead. If anybody knows how to do that correctly, as it
|
||||||
|
is done by commercial workstations, please tell me.
|
||||||
|
.RE
|
||||||
|
|
||||||
.B -v
|
.B -v
|
||||||
.RS 3
|
.RS 3
|
||||||
Print ncpfs version number
|
Print ncpfs version number
|
||||||
|
|||||||
55
man/npasswd.1
Normal file
55
man/npasswd.1
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
.TH NPASSWD 1 06/22/1996 npasswd npasswd
|
||||||
|
.SH NAME
|
||||||
|
npasswd \- Change a user's password
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B npasswd
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -U
|
||||||
|
.I user name
|
||||||
|
]
|
||||||
|
.B -t
|
||||||
|
.I object type
|
||||||
|
]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
With
|
||||||
|
.B npasswd,
|
||||||
|
you can change your password on a NetWare server.
|
||||||
|
.B npasswd
|
||||||
|
asks for the old password and twice for the new password. Then it
|
||||||
|
changes the password on the server.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.B -h
|
||||||
|
.RS 3
|
||||||
|
With -h npasswd prints a little help text.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
.RS 3
|
||||||
|
is the name of the server you want to use.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -U
|
||||||
|
.I user name
|
||||||
|
.RS 3
|
||||||
|
is the name of the bindery object whose password is to be changed.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -t
|
||||||
|
.I object type
|
||||||
|
.RS 3
|
||||||
|
is the bindery object type of the object whose password is to be
|
||||||
|
changed.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.SH CREDITS
|
||||||
|
npasswd would not have been possible without the work of Guntram
|
||||||
|
Blom. Look at nwcrypt.c for his work.
|
||||||
108
man/nsend.1
Normal file
108
man/nsend.1
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
.TH NSEND 1 03/21/1996 nsend nsend
|
||||||
|
.SH NAME
|
||||||
|
nsend \- Send messages to users
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nsend
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -U
|
||||||
|
.I user name
|
||||||
|
] [
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
|
|
||||||
|
.B -n
|
||||||
|
] [
|
||||||
|
.B -C
|
||||||
|
]
|
||||||
|
.I user message
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
With
|
||||||
|
.B nsend,
|
||||||
|
you can send messages to the user's workstations.
|
||||||
|
|
||||||
|
.B nsend
|
||||||
|
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 user
|
||||||
|
.RS 3
|
||||||
|
.B user
|
||||||
|
is the NetWare User-ID of the user to receive the message.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B message
|
||||||
|
.RS 3
|
||||||
|
.B message
|
||||||
|
is the message to be sent. Please note that this has to be a single
|
||||||
|
command line argument. If you want to send a message that contains
|
||||||
|
spaces, you have to quote them on the command line. For example, to
|
||||||
|
annoy your system administrator, you should try
|
||||||
|
|
||||||
|
nsend supervisor 'I know how this works!'
|
||||||
|
.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, nsend 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 BUGS
|
||||||
|
nsend only supports servers with up to 255 connections. I do not know
|
||||||
|
the NCP functions for larger servers. If anybody knows them, please
|
||||||
|
tell me!
|
||||||
|
|
||||||
|
.SH SEE ALSO
|
||||||
|
.B nwclient(5), nprint(1), slist(1), ncpmount(8), ncpumount(8)
|
||||||
|
|
||||||
|
.SH CREDITS
|
||||||
|
nsend was written by looking at mars_nwe's message handling. Thanks to
|
||||||
|
Martin Stover <mstover@freeway.de>
|
||||||
133
man/nwbocreate.8
Normal file
133
man/nwbocreate.8
Normal file
@@ -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.
|
||||||
117
man/nwbols.1
Normal file
117
man/nwbols.1
Normal file
@@ -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.
|
||||||
118
man/nwboprops.1
Normal file
118
man/nwboprops.1
Normal file
@@ -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.
|
||||||
106
man/nwborm.8
Normal file
106
man/nwborm.8
Normal file
@@ -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.
|
||||||
145
man/nwbpadd.8
Normal file
145
man/nwbpadd.8
Normal file
@@ -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.
|
||||||
154
man/nwbpcreate.8
Normal file
154
man/nwbpcreate.8
Normal file
@@ -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.
|
||||||
116
man/nwbprm.8
Normal file
116
man/nwbprm.8
Normal file
@@ -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.
|
||||||
128
man/nwbpvalues.1
Normal file
128
man/nwbpvalues.1
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
.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 AUTHORS
|
||||||
|
nwbpvalues was written by Volker Lendecke with the corresponding
|
||||||
|
Caldera utility in mind. See the Changes file of ncpfs for other
|
||||||
|
contributors.
|
||||||
52
man/nwfsinfo.1
Normal file
52
man/nwfsinfo.1
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
.TH NWFSINFO 1 07/22/1996 nwfsinfo nwfsinfo
|
||||||
|
.SH NAME
|
||||||
|
nwfsinfo \- Print some information about the file server
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nwfsinfo
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -t
|
||||||
|
] [
|
||||||
|
.B -i
|
||||||
|
] [
|
||||||
|
.B -d
|
||||||
|
]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B nwfsinfo
|
||||||
|
prints some of the information the NetWare servers present without
|
||||||
|
logging in. The options control what is printed. You should try the
|
||||||
|
different options to find out what is printed when.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.B -h
|
||||||
|
.RS 3
|
||||||
|
With -h nwfsinfo prints a little help text.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
.RS 3
|
||||||
|
is the name of the server you want to know something about.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -t
|
||||||
|
.RS 3
|
||||||
|
Print what the file server believes to be the current time.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -d
|
||||||
|
.RS 3
|
||||||
|
Print the so-called file server description strings.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -i
|
||||||
|
.RS 3
|
||||||
|
Print the extended file server information such as NetWare version,
|
||||||
|
maximum connections an others.
|
||||||
|
.RE
|
||||||
148
man/nwgrant.8
Normal file
148
man/nwgrant.8
Normal file
@@ -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.
|
||||||
|
|
||||||
124
man/nwrevoke.8
Normal file
124
man/nwrevoke.8
Normal file
@@ -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.
|
||||||
|
|
||||||
93
man/nwuserlist.1
Normal file
93
man/nwuserlist.1
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
.TH NWUSERLIST 1 7/22/1996 nwuserlist nwuserlist
|
||||||
|
.SH NAME
|
||||||
|
nwuserlist \- List Users logged in at a NetWare server
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nwuserlist
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -U
|
||||||
|
.I user name
|
||||||
|
] [
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
|
|
||||||
|
.B -n
|
||||||
|
] [
|
||||||
|
.B -C
|
||||||
|
] [
|
||||||
|
.B -a
|
||||||
|
]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B nwuserlist
|
||||||
|
lists the users logged in at a NetWare server, together with their
|
||||||
|
connection number and their login time.
|
||||||
|
|
||||||
|
.B nwuserlist
|
||||||
|
looks up the file
|
||||||
|
.I $HOME/.nwclient
|
||||||
|
to find a file server, a user name and possibly a password. See
|
||||||
|
nwclient(5) for more information. Please note that the access
|
||||||
|
permissions of $HOME/.nwclient MUST be 600 for security reasons.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.B -h
|
||||||
|
.RS 3
|
||||||
|
.B -h
|
||||||
|
is used to print out a short help text.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
.RS 3
|
||||||
|
.B server
|
||||||
|
is the name of the server you want to use.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -U
|
||||||
|
.I user
|
||||||
|
.RS 3
|
||||||
|
.B user
|
||||||
|
is the user name to use for login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
.RS 3
|
||||||
|
.B password
|
||||||
|
is the password to use for login. If neither
|
||||||
|
.B -n
|
||||||
|
nor
|
||||||
|
.B -P
|
||||||
|
are given, and the user has no open connection to the server, nwuserlist
|
||||||
|
prompts for a password.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -n
|
||||||
|
.RS 3
|
||||||
|
.B -n
|
||||||
|
should be given if no password is required for the login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -C
|
||||||
|
.RS 3
|
||||||
|
By default, passwords are converted to uppercase before they are sent
|
||||||
|
to the server, because most servers require this. You can turn off
|
||||||
|
this conversion by
|
||||||
|
.B -C.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -a
|
||||||
|
.RS 3
|
||||||
|
With option -a the IPX address of the station the user is logged in
|
||||||
|
from is printed as well.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.SH AUTHORS
|
||||||
|
nwuserlist was written by Volker Lendecke. See the Changes file of ncpfs
|
||||||
|
for other contributors.
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
Begin3
|
|
||||||
Title: ncpfs
|
|
||||||
Version: 0.17
|
|
||||||
Entered-date: 29. February 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
|
|
||||||
Linux printing system. You need kernel 1.2.x or
|
|
||||||
1.3.54 and above. ncpfs does NOT work with any 1.3.x
|
|
||||||
kernel below 1.3.54.
|
|
||||||
Keywords: filesystem ncp novell netware printing
|
|
||||||
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/
|
|
||||||
~81k ncpfs-0.17.tgz
|
|
||||||
~ 1k ncpfs-0.17.lsm
|
|
||||||
Copying-policy: GPL
|
|
||||||
End
|
|
||||||
19
ncpfs-2.0.3.lsm
Normal file
19
ncpfs-2.0.3.lsm
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
Begin3
|
||||||
|
Title: ncpfs
|
||||||
|
Version: 2.0.3
|
||||||
|
Entered-date: 22. July 1996
|
||||||
|
Description: With ncpfs you can mount volumes of your netware
|
||||||
|
server under Linux. You can also print to netware
|
||||||
|
print queues and spool netware print queues to the
|
||||||
|
Linux printing system. You need kernel 1.2.x or
|
||||||
|
1.3.71 and above. ncpfs does NOT work with any 1.3.x
|
||||||
|
kernel below 1.3.71.
|
||||||
|
Keywords: filesystem ncp novell netware printing
|
||||||
|
Author: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke)
|
||||||
|
Maintained-by: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke)
|
||||||
|
Primary-site: ftp.gwdg.de:/pub/linux/misc/ncpfs
|
||||||
|
Alternate-site: sunsite.unc.edu:/pub/Linux/system/Filesystems/ncpfs
|
||||||
|
~128k ncpfs-2.0.3.tgz
|
||||||
|
~ 1k ncpfs-2.0.3.lsm
|
||||||
|
Copying-policy: GPL
|
||||||
|
End
|
||||||
@@ -2,17 +2,38 @@
|
|||||||
# Makefile for the linux ncp-filesystem routines.
|
# Makefile for the linux ncp-filesystem routines.
|
||||||
#
|
#
|
||||||
|
|
||||||
USERUTILS = slist pqlist nwfsinfo pserver
|
USERUTILS = slist pqlist nwfsinfo pserver nprint nsend ncopy npasswd
|
||||||
|
USERUTILS += nwbols nwbocreate nwborm nwboprops
|
||||||
|
USERUTILS += nwbpcreate nwbprm nwbpvalues nwbpadd
|
||||||
|
USERUTILS += nwgrant nwrevoke nwuserlist
|
||||||
UIDUTILS = ncpmount ncpumount
|
UIDUTILS = ncpmount ncpumount
|
||||||
SBINUTILS = nwmsg
|
SBINUTILS = nwmsg
|
||||||
|
|
||||||
UTIL_EXECS = $(USERUTILS) $(UIDUTILS) $(SBINUTILS)
|
UTIL_EXECS = $(USERUTILS) $(UIDUTILS) $(SBINUTILS)
|
||||||
UTILS = $(addprefix $(INTERM_BINDIR)/,$(UTIL_EXECS))
|
UTILS = $(addprefix $(INTERM_BINDIR)/,$(UTIL_EXECS))
|
||||||
|
|
||||||
#CFLAGS = -Wall $(INCLUDES) $(KERNELD) -g -DNCPFS_VERSION=\"$(VERSION)\"
|
CFLAGS = -Wall $(INCLUDES) $(KERNELD) -DNCPFS_VERSION=\"$(VERSION)\"
|
||||||
CFLAGS = -Wall $(INCLUDES) $(KERNELD) -O2 -DNCPFS_VERSION=\"$(VERSION)\"
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
|
|
||||||
|
#CFLAGS += -g
|
||||||
|
CFLAGS += -O2
|
||||||
|
|
||||||
|
ifeq ($(HAVE_ELF),yes)
|
||||||
|
PIC_FLAG = -fPIC
|
||||||
|
NCP_LIB = libncp.so.1.0
|
||||||
|
LIB_LINK_COMMAND = gcc -shared -Wl,-soname,libncp.so.1 -o $(NCP_LIB)
|
||||||
|
INSTALL_LIB = install $(NCP_LIB) -m 755 /lib; \
|
||||||
|
ln -sf $(NCP_LIB) /lib/libncp.so.1; \
|
||||||
|
ldconfig
|
||||||
|
export PIC_FLAG
|
||||||
|
else
|
||||||
|
NCP_LIB = libncp.a
|
||||||
|
LIB_LINK_COMMAND = ar r libncp.a
|
||||||
|
endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
make -C ..
|
||||||
|
|
||||||
all: $(UTILS) ncptest
|
all: $(UTILS) ncptest
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
@@ -22,26 +43,50 @@ install: all
|
|||||||
do install $(INTERM_BINDIR)/$$i -m 4755 $(BINDIR); done
|
do install $(INTERM_BINDIR)/$$i -m 4755 $(BINDIR); done
|
||||||
for i in $(SBINUTILS); \
|
for i in $(SBINUTILS); \
|
||||||
do install $(INTERM_BINDIR)/$$i -m 755 $(SBINDIR); done
|
do install $(INTERM_BINDIR)/$$i -m 755 $(SBINDIR); done
|
||||||
|
$(INSTALL_LIB)
|
||||||
|
|
||||||
$(UTILS): $(addsuffix .o,$(UTIL_EXECS)) ncplib.o
|
$(UTILS): $(addsuffix .o,$(UTIL_EXECS)) $(NCP_LIB)
|
||||||
$(CC) -o $@ $(addsuffix .o,$(notdir $@)) ncplib.o
|
$(CC) -o $@ $(addsuffix .o,$(notdir $@)) -L. -lncp
|
||||||
|
|
||||||
ncplib.o: ncplib.c ncplib.h
|
ncplib.o: ncplib.c ncplib.h ncplib_err.h
|
||||||
$(CC) $(CFLAGS) -finline-functions -c ncplib.c
|
$(CC) $(CFLAGS) $(PIC_FLAG) -finline-functions -c ncplib.c
|
||||||
|
|
||||||
|
COM_ERR_CFILES = com_err/com_err.c com_err/error_message.c com_err/et_name.c \
|
||||||
|
com_err/init_et.c
|
||||||
|
|
||||||
|
$(NCP_LIB): ncplib.o ncplib_err.o $(COM_ERR_CFILES)
|
||||||
|
make -C com_err
|
||||||
|
$(LIB_LINK_COMMAND) ncplib.o ncplib_err.o \
|
||||||
|
com_err/com_err.o com_err/error_message.o com_err/et_name.o \
|
||||||
|
com_err/init_et.o
|
||||||
|
ln -sf libncp.so.1.0 libncp.so.1
|
||||||
|
|
||||||
|
ncplib_err.o: ncplib_err.h ncplib_err.c
|
||||||
|
$(CC) $(CFLAGS) $(PIC_FLAG) -c ncplib_err.c
|
||||||
|
|
||||||
|
ncplib_err.h: ncplib_err.et
|
||||||
|
com_err/compile_et ncplib_err
|
||||||
|
|
||||||
|
ncplib_err.c: ncplib_err.et
|
||||||
|
com_err/compile_et ncplib_err
|
||||||
|
|
||||||
test: test.o ncplib.o
|
test: test.o ncplib.o
|
||||||
$(CC) -o test test.o ncplib.o
|
$(CC) -o test test.o ncplib.o
|
||||||
|
|
||||||
ncptest: ncptest.o ncplib.o
|
ncptest: ncptest.o $(NCP_LIB)
|
||||||
$(CC) -o ncptest ncptest.o ncplib.o
|
$(CC) -o ncptest ncptest.o -L. -lncp
|
||||||
|
|
||||||
dep:
|
dep: ncplib_err.h
|
||||||
|
make -C com_err dep
|
||||||
$(CPP) -M $(INCLUDES) *.c > .depend
|
$(CPP) -M $(INCLUDES) *.c > .depend
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o *~ slist test ncptest
|
make -C com_err clean
|
||||||
|
rm -f *.o *~ slist test ncptest ncplib_err.[ch] libncp.a
|
||||||
|
rm -f libncp.so.*
|
||||||
|
|
||||||
realclean: clean
|
mrproper: clean
|
||||||
|
make -C com_err mrproper
|
||||||
rm -f $(UTILS) .depend $(DISTFILE)
|
rm -f $(UTILS) .depend $(DISTFILE)
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|||||||
1
util/com_err.h
Symbolic link
1
util/com_err.h
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
com_err/com_err.h
|
||||||
49
util/com_err/ChangeLog
Normal file
49
util/com_err/ChangeLog
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
Wed Jan 31 11:06:08 1996 <tytso@rsts-11.mit.edu>
|
||||||
|
|
||||||
|
* Release of E2fsprogs version 1.02
|
||||||
|
|
||||||
|
Mon Sep 4 21:44:47 1995 Remy Card <card@bbj>
|
||||||
|
|
||||||
|
* Makefile.in: Added support for BSD shared libraries.
|
||||||
|
|
||||||
|
Sat Aug 12 03:11:28 1995 Remy Card <card@bbj>
|
||||||
|
|
||||||
|
* Makefile.in (install): Install static libraries in $(ulibdir)
|
||||||
|
(/usr/lib on Linux) instead of $(libdir) (/lib on Linux).
|
||||||
|
|
||||||
|
Sat Aug 5 11:44:17 1995 Theodore Y. Ts'o <tytso@lurch.mit.edu>
|
||||||
|
|
||||||
|
* Makefile.in (DLL_INSTALL_DIR, ELF_INSTALL_DIR): Set the
|
||||||
|
installation directories correctly.
|
||||||
|
|
||||||
|
Thu Jun 15 23:39:51 1995 Remy Card <card@bbj>
|
||||||
|
|
||||||
|
* Makefile.in: Added support for ELF shared libraries.
|
||||||
|
Fixed typos in the compilation rules.
|
||||||
|
(distclean): Added compile_et.sh.
|
||||||
|
|
||||||
|
Sat Jun 10 19:56:13 1995 Theodore Y. Ts'o <tytso@lurch.mit.edu>
|
||||||
|
|
||||||
|
* compile_et.sh.in: Use ET_DIR instead of srcdir to determine the
|
||||||
|
location of the et directory.
|
||||||
|
|
||||||
|
Thu Jun 8 12:45:41 1995 Miles Bader <miles@churchy.gnu.ai.mit.edu>
|
||||||
|
|
||||||
|
* vfprintf.c (vfprintf): Only compile this function if vfprintf
|
||||||
|
doesn't already exist and _doprnt does.
|
||||||
|
|
||||||
|
* compile_et.sh: Moved to compile_et.sh.in.
|
||||||
|
|
||||||
|
* Makefile.in: Rewritten to conform to GNU coding standards and
|
||||||
|
support separate compilation directories.
|
||||||
|
Don't preprocess compile_et.sh, as this is now done by configure.
|
||||||
|
|
||||||
|
Mon Nov 7 21:17:48 1994 Remy Card <card@bbj>
|
||||||
|
|
||||||
|
* Makefile: Added a dummy install target in case shared libraries
|
||||||
|
are not built.
|
||||||
|
|
||||||
|
Thu Sep 8 22:33:33 1994 (tytso@rsx-11)
|
||||||
|
|
||||||
|
* com_err.c (default_com_err_proc): Reversed order of \n\r to make
|
||||||
|
jik happy.
|
||||||
25
util/com_err/Makefile
Normal file
25
util/com_err/Makefile
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
#
|
||||||
|
# Makefile for the com_err library
|
||||||
|
#
|
||||||
|
|
||||||
|
OBJECTS = com_err.o error_message.o et_name.o init_et.o
|
||||||
|
CFLAGS = -Wall -O2 $(PIC_FLAG)
|
||||||
|
|
||||||
|
all: $(OBJECTS)
|
||||||
|
|
||||||
|
dep:
|
||||||
|
$(CPP) -M $(INCLUDES) *.c > .depend
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o
|
||||||
|
|
||||||
|
mrproper: clean
|
||||||
|
rm -f .depend
|
||||||
|
|
||||||
|
#
|
||||||
|
# include a dependency file if one exists
|
||||||
|
#
|
||||||
|
ifeq (.depend,$(wildcard .depend))
|
||||||
|
include .depend
|
||||||
|
endif
|
||||||
|
|
||||||
96
util/com_err/com_err.3
Normal file
96
util/com_err/com_err.3
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
.\" Copyright (c) 1988 Massachusetts Institute of Technology,
|
||||||
|
.\" Student Information Processing Board. All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" $Header: /mit/krb5/.cvsroot/src/util/et/com_err.3,v 1.1 1993/06/03 12:29:34 tytso Exp $
|
||||||
|
.\"
|
||||||
|
.TH COM_ERR 3 "22 Nov 1988" SIPB
|
||||||
|
.SH NAME
|
||||||
|
com_err \- common error display routine
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.nf
|
||||||
|
#include <com_err.h>
|
||||||
|
.PP
|
||||||
|
void com_err (whoami, code, format, ...);
|
||||||
|
const char *whoami;
|
||||||
|
long code;
|
||||||
|
const char *format;
|
||||||
|
.PP
|
||||||
|
proc = set_com_err_hook (proc);
|
||||||
|
.fi
|
||||||
|
void (*
|
||||||
|
.I proc
|
||||||
|
) (const char *, long, const char *, va_list);
|
||||||
|
.nf
|
||||||
|
.PP
|
||||||
|
proc = reset_com_err_hook ();
|
||||||
|
.PP
|
||||||
|
void initialize_XXXX_error_table ();
|
||||||
|
.fi
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.I Com_err
|
||||||
|
displays an error message on the standard error stream
|
||||||
|
.I stderr
|
||||||
|
(see
|
||||||
|
.IR stdio (3S))
|
||||||
|
composed of the
|
||||||
|
.I whoami
|
||||||
|
string, which should specify the program name or some subportion of
|
||||||
|
a program, followed by an error message generated from the
|
||||||
|
.I code
|
||||||
|
value (derived from
|
||||||
|
.IR compile_et (1)),
|
||||||
|
and a string produced using the
|
||||||
|
.I format
|
||||||
|
string and any following arguments, in the same style as
|
||||||
|
.IR fprintf (3).
|
||||||
|
|
||||||
|
The behavior of
|
||||||
|
.I com_err
|
||||||
|
can be modified using
|
||||||
|
.I set_com_err_hook;
|
||||||
|
this defines a procedure which is called with the arguments passed to
|
||||||
|
.I com_err,
|
||||||
|
instead of the default internal procedure which sends the formatted
|
||||||
|
text to error output. Thus the error messages from a program can all
|
||||||
|
easily be diverted to another form of diagnostic logging, such as
|
||||||
|
.IR syslog (3).
|
||||||
|
.I Reset_com_err_hook
|
||||||
|
may be used to restore the behavior of
|
||||||
|
.I com_err
|
||||||
|
to its default form. Both procedures return the previous ``hook''
|
||||||
|
value. These ``hook'' procedures must have the declaration given for
|
||||||
|
.I proc
|
||||||
|
above in the synopsis.
|
||||||
|
|
||||||
|
The
|
||||||
|
.I initialize_XXXX_error_table
|
||||||
|
routine is generated mechanically by
|
||||||
|
.IR compile_et (1)
|
||||||
|
from a source file containing names and associated strings. Each
|
||||||
|
table has a name of up to four characters, which is used in place of
|
||||||
|
the
|
||||||
|
.B XXXX
|
||||||
|
in the name of the routine. These routines should be called before
|
||||||
|
any of the corresponding error codes are used, so that the
|
||||||
|
.I com_err
|
||||||
|
library will recognize error codes from these tables when they are
|
||||||
|
used.
|
||||||
|
|
||||||
|
The
|
||||||
|
.B com_err.h
|
||||||
|
header file should be included in any source file that uses routines
|
||||||
|
from the
|
||||||
|
.I com_err
|
||||||
|
library; executable files must be linked using
|
||||||
|
.I ``-lcom_err''
|
||||||
|
in order to cause the
|
||||||
|
.I com_err
|
||||||
|
library to be included.
|
||||||
|
|
||||||
|
.\" .IR for manual entries
|
||||||
|
.\" .PP for paragraph breaks
|
||||||
|
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
compile_et (1), syslog (3).
|
||||||
|
|
||||||
|
Ken Raeburn, "A Common Error Description Library for UNIX".
|
||||||
114
util/com_err/com_err.c
Normal file
114
util/com_err/com_err.c
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1987, 1988 by MIT Student Information Processing Board.
|
||||||
|
*
|
||||||
|
* For copyright info, see mit-sipb-copyright.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "com_err.h"
|
||||||
|
#include "mit-sipb-copyright.h"
|
||||||
|
#include "error_table.h"
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
#if !defined(__STDC__) && !defined(STDARG_PROTOTYPES)
|
||||||
|
#include <varargs.h>
|
||||||
|
#define VARARGS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
#ifdef __STDC__
|
||||||
|
default_com_err_proc (const char *whoami, errcode_t code, const
|
||||||
|
char *fmt, va_list args)
|
||||||
|
#else
|
||||||
|
default_com_err_proc (whoami, code, fmt, args)
|
||||||
|
const char *whoami;
|
||||||
|
errcode_t code;
|
||||||
|
const char *fmt;
|
||||||
|
va_list args;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (whoami) {
|
||||||
|
fputs(whoami, stderr);
|
||||||
|
fputs(": ", stderr);
|
||||||
|
}
|
||||||
|
if (code) {
|
||||||
|
fputs(error_message(code), stderr);
|
||||||
|
fputs(" ", stderr);
|
||||||
|
}
|
||||||
|
if (fmt) {
|
||||||
|
vfprintf (stderr, fmt, args);
|
||||||
|
}
|
||||||
|
/* should do this only on a tty in raw mode */
|
||||||
|
putc('\r', stderr);
|
||||||
|
putc('\n', stderr);
|
||||||
|
fflush(stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __STDC__
|
||||||
|
typedef void (*errf) (const char *, errcode_t, const char *, va_list);
|
||||||
|
#else
|
||||||
|
typedef void (*errf) ();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
errf com_err_hook = default_com_err_proc;
|
||||||
|
|
||||||
|
#ifdef __STDC__
|
||||||
|
void com_err_va (const char *whoami, errcode_t code, const char *fmt,
|
||||||
|
va_list args)
|
||||||
|
#else
|
||||||
|
void com_err_va (whoami, code, fmt, args)
|
||||||
|
const char *whoami;
|
||||||
|
errcode_t code;
|
||||||
|
const char *fmt;
|
||||||
|
va_list args;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
(*com_err_hook) (whoami, code, fmt, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef VARARGS
|
||||||
|
void com_err (const char *whoami,
|
||||||
|
errcode_t code,
|
||||||
|
const char *fmt, ...)
|
||||||
|
{
|
||||||
|
#else
|
||||||
|
void com_err (va_alist)
|
||||||
|
va_dcl
|
||||||
|
{
|
||||||
|
const char *whoami, *fmt;
|
||||||
|
errcode_t code;
|
||||||
|
#endif
|
||||||
|
va_list pvar;
|
||||||
|
|
||||||
|
if (!com_err_hook)
|
||||||
|
com_err_hook = default_com_err_proc;
|
||||||
|
#ifdef VARARGS
|
||||||
|
va_start (pvar);
|
||||||
|
whoami = va_arg (pvar, const char *);
|
||||||
|
code = va_arg (pvar, errcode_t);
|
||||||
|
fmt = va_arg (pvar, const char *);
|
||||||
|
#else
|
||||||
|
va_start(pvar, fmt);
|
||||||
|
#endif
|
||||||
|
com_err_va (whoami, code, fmt, pvar);
|
||||||
|
va_end(pvar);
|
||||||
|
}
|
||||||
|
|
||||||
|
errf set_com_err_hook (new_proc)
|
||||||
|
errf new_proc;
|
||||||
|
{
|
||||||
|
errf x = com_err_hook;
|
||||||
|
|
||||||
|
if (new_proc)
|
||||||
|
com_err_hook = new_proc;
|
||||||
|
else
|
||||||
|
com_err_hook = default_com_err_proc;
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
errf reset_com_err_hook () {
|
||||||
|
errf x = com_err_hook;
|
||||||
|
com_err_hook = default_com_err_proc;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
40
util/com_err/com_err.h
Normal file
40
util/com_err/com_err.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Header file for common error description library.
|
||||||
|
*
|
||||||
|
* Copyright 1988, Student Information Processing Board of the
|
||||||
|
* Massachusetts Institute of Technology.
|
||||||
|
*
|
||||||
|
* For copyright and distribution info, see the documentation supplied
|
||||||
|
* with this package.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __COM_ERR_H
|
||||||
|
|
||||||
|
typedef long errcode_t;
|
||||||
|
|
||||||
|
#ifdef __STDC__
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
/* ANSI C -- use prototypes etc */
|
||||||
|
void com_err (const char *, long, const char *, ...);
|
||||||
|
void com_err_va (const char *whoami, errcode_t code, const char *fmt,
|
||||||
|
va_list args);
|
||||||
|
char const *error_message (long);
|
||||||
|
extern void (*com_err_hook) (const char *, long, const char *, va_list);
|
||||||
|
void (*set_com_err_hook (void (*) (const char *, long, const char *, va_list)))
|
||||||
|
(const char *, long, const char *, va_list);
|
||||||
|
void (*reset_com_err_hook (void)) (const char *, long, const char *, va_list);
|
||||||
|
int init_error_table(const char * const *msgs, int base, int count);
|
||||||
|
#else
|
||||||
|
/* no prototypes */
|
||||||
|
void com_err ();
|
||||||
|
void com_err_va ();
|
||||||
|
char *error_message ();
|
||||||
|
extern void (*com_err_hook) ();
|
||||||
|
void (*set_com_err_hook ()) ();
|
||||||
|
void (*reset_com_err_hook ()) ();
|
||||||
|
int init_error_table();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __COM_ERR_H
|
||||||
|
#endif /* ! defined(__COM_ERR_H) */
|
||||||
554
util/com_err/com_err.texinfo
Normal file
554
util/com_err/com_err.texinfo
Normal file
@@ -0,0 +1,554 @@
|
|||||||
|
\input texinfo @c -*-texinfo-*-
|
||||||
|
|
||||||
|
@c $Header: /mit/krb5/.cvsroot/src/util/et/com_err.texinfo,v 1.1 1993/06/03 12:29:38 tytso Exp $
|
||||||
|
@c $Source: /mit/krb5/.cvsroot/src/util/et/com_err.texinfo,v $
|
||||||
|
@c $Locker: $
|
||||||
|
|
||||||
|
@c Note that although this source file is in texinfo format (more
|
||||||
|
@c or less), it is not yet suitable for turning into an ``info''
|
||||||
|
@c file. Sorry, maybe next time.
|
||||||
|
@c
|
||||||
|
@c In order to produce hardcopy documentation from a texinfo file,
|
||||||
|
@c run ``tex com_err.texinfo'' which will load in texinfo.tex,
|
||||||
|
@c provided in this distribution. (texinfo.tex is from the Free
|
||||||
|
@c Software Foundation, and is under different copyright restrictions
|
||||||
|
@c from the rest of this package.)
|
||||||
|
|
||||||
|
@ifinfo
|
||||||
|
@barfo
|
||||||
|
@end ifinfo
|
||||||
|
|
||||||
|
@iftex
|
||||||
|
@tolerance 10000
|
||||||
|
|
||||||
|
@c Mutate section headers...
|
||||||
|
@begingroup
|
||||||
|
@catcode#=6
|
||||||
|
@gdef@secheading#1#2#3{@secheadingi {#3@enspace #1}}
|
||||||
|
@endgroup
|
||||||
|
@end iftex
|
||||||
|
|
||||||
|
@setfilename com_err
|
||||||
|
@settitle A Common Error Description Library for UNIX
|
||||||
|
|
||||||
|
@ifinfo
|
||||||
|
This file documents the use of the Common Error Description library.
|
||||||
|
|
||||||
|
Copyright (C) 1987, 1988 Student Information Processing Board of the
|
||||||
|
Massachusetts Institute of Technology.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software and its
|
||||||
|
documentation for any purpose and without fee is hereby granted, provided
|
||||||
|
that the above copyright notice appear in all copies and that both that
|
||||||
|
copyright notice and this permission notice appear in supporting
|
||||||
|
documentation, and that the names of M.I.T. and the M.I.T. S.I.P.B. not be
|
||||||
|
used in advertising or publicity pertaining to distribution of the software
|
||||||
|
without specific, written prior permission. M.I.T. and the M.I.T. S.I.P.B.
|
||||||
|
make no representations about the suitability of this software for any
|
||||||
|
purpose. It is provided "as is" without express or implied warranty.
|
||||||
|
|
||||||
|
Note that the file texinfo.tex, provided with this distribution, is from
|
||||||
|
the Free Software Foundation, and is under different copyright restrictions
|
||||||
|
from the remainder of this package.
|
||||||
|
|
||||||
|
@end ifinfo
|
||||||
|
|
||||||
|
@ignore
|
||||||
|
Permission is granted to process this file through Tex and print the
|
||||||
|
results, provided the printed document carries copying permission
|
||||||
|
notice identical to this one except for the removal of this paragraph
|
||||||
|
(this paragraph not being relevant to the printed manual).
|
||||||
|
|
||||||
|
@end ignore
|
||||||
|
|
||||||
|
@setchapternewpage odd
|
||||||
|
|
||||||
|
@titlepage
|
||||||
|
@center @titlefont{A Common Error Description}
|
||||||
|
@center @titlefont{Library for UNIX}
|
||||||
|
@sp 2
|
||||||
|
@center Ken Raeburn
|
||||||
|
@center Bill Sommerfeld
|
||||||
|
@sp 1
|
||||||
|
@center MIT Student Information Processing Board
|
||||||
|
@sp 3
|
||||||
|
@center last updated 1 January 1989
|
||||||
|
@center for version 1.2
|
||||||
|
@center ***DRAFT COPY ONLY***
|
||||||
|
|
||||||
|
@vskip 2in
|
||||||
|
|
||||||
|
@center @b{Abstract}
|
||||||
|
|
||||||
|
UNIX has always had a clean and simple system call interface, with a
|
||||||
|
standard set of error codes passed between the kernel and user
|
||||||
|
programs. Unfortunately, the same cannot be said of many of the
|
||||||
|
libraries layered on top of the primitives provided by the kernel.
|
||||||
|
Typically, each one has used a different style of indicating errors to
|
||||||
|
their callers, leading to a total hodgepodge of error handling, and
|
||||||
|
considerable amounts of work for the programmer. This paper describes
|
||||||
|
a library and associated utilities which allows a more uniform way for
|
||||||
|
libraries to return errors to their callers, and for programs to
|
||||||
|
describe errors and exceptional conditions to their users.
|
||||||
|
|
||||||
|
@page
|
||||||
|
@vskip 0pt plus 1filll
|
||||||
|
|
||||||
|
Copyright @copyright{} 1987, 1988 by the Student Information Processing
|
||||||
|
Board of the Massachusetts Institute of Technology.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software and its
|
||||||
|
documentation for any purpose and without fee is hereby granted, provided
|
||||||
|
that the above copyright notice appear in all copies and that both that
|
||||||
|
copyright notice and this permission notice appear in supporting
|
||||||
|
documentation, and that the names of M.I.T. and the M.I.T. S.I.P.B. not be
|
||||||
|
used in advertising or publicity pertaining to distribution of the software
|
||||||
|
without specific, written prior permission. M.I.T. and the M.I.T. S.I.P.B.
|
||||||
|
make no representations about the suitability of this software for any
|
||||||
|
purpose. It is provided "as is" without express or implied warranty.
|
||||||
|
|
||||||
|
Note that the file texinfo.tex, provided with this distribution, is from
|
||||||
|
the Free Software Foundation, and is under different copyright restrictions
|
||||||
|
from the remainder of this package.
|
||||||
|
|
||||||
|
@end titlepage
|
||||||
|
|
||||||
|
@ifinfo
|
||||||
|
@c should put a menu here someday....
|
||||||
|
@end ifinfo
|
||||||
|
|
||||||
|
@page
|
||||||
|
|
||||||
|
@section Why com_err?
|
||||||
|
|
||||||
|
In building application software packages, a programmer often has to
|
||||||
|
deal with a number of libraries, each of which can use a different
|
||||||
|
error-reporting mechanism. Sometimes one of two values is returned,
|
||||||
|
indicating simply SUCCESS or FAILURE, with no description of errors
|
||||||
|
encountered. Sometimes it is an index into a table of text strings,
|
||||||
|
where the name of the table used is dependent on the library being
|
||||||
|
used when the error is generated; since each table starts numbering at
|
||||||
|
0 or 1, additional information as to the source of the error code is
|
||||||
|
needed to determine which table to look at. Sometimes no text messages are
|
||||||
|
supplied at all, and the programmer must supply them at any point at which
|
||||||
|
he may wish to report error conditions.
|
||||||
|
Often, a global variable is assigned some value describing the error, but
|
||||||
|
the programmer has to know in each case whether to look at @code{errno},
|
||||||
|
@code{h_errno}, the return value from @code{hes_err()}, or whatever other
|
||||||
|
variables or routines are specified.
|
||||||
|
And what happens if something
|
||||||
|
in the procedure of
|
||||||
|
examining or reporting the error changes the same variable?
|
||||||
|
|
||||||
|
The package we have developed is an attempt to present a common
|
||||||
|
error-handling mechanism to manipulate the most common form of error code
|
||||||
|
in a fashion that does not have the problems listed above.
|
||||||
|
|
||||||
|
A list of up to 256 text messages is supplied to a translator we have
|
||||||
|
written, along with the three- to four-character ``name'' of the error
|
||||||
|
table. The library using this error table need only call a routine
|
||||||
|
generated from this error-table source to make the table ``known'' to the
|
||||||
|
com_err library, and any error code the library generates can be converted
|
||||||
|
to the corresponding error message. There is also a default format for
|
||||||
|
error codes accidentally returned before making the table known, which is
|
||||||
|
of the form @samp{unknown code foo 32}, where @samp{foo} would be the name
|
||||||
|
of the table.
|
||||||
|
|
||||||
|
@section Error codes
|
||||||
|
|
||||||
|
Error codes themselves are 32 bit (signed) integers, of which the high
|
||||||
|
order 24 bits are an identifier of which error table the error code is
|
||||||
|
from, and the low order 8 bits are a sequential error number within
|
||||||
|
the table. An error code may thus be easily decomposed into its component
|
||||||
|
parts. Only the lowest 32 bits of an error code are considered significant
|
||||||
|
on systems which support wider values.
|
||||||
|
|
||||||
|
Error table 0 is defined to match the UNIX system call error table
|
||||||
|
(@code{sys_errlist}); this allows @code{errno} values to be used directly
|
||||||
|
in the library (assuming that @code{errno} is of a type with the same width
|
||||||
|
as @t{long}). Other error table numbers are formed by compacting together
|
||||||
|
the first four characters of the error table name. The mapping between
|
||||||
|
characters in the name and numeric values in the error code are defined in
|
||||||
|
a system-independent fashion, so that two systems that can pass integral
|
||||||
|
values between them can reliably pass error codes without loss of meaning;
|
||||||
|
this should work even if the character sets used are not the same.
|
||||||
|
(However, if this is to be done, error table 0 should be avoided, since the
|
||||||
|
local system call error tables may differ.)
|
||||||
|
|
||||||
|
Any variable which is to contain an error code should be declared @t{long}.
|
||||||
|
The draft proposed American National Standard for C (as of May, 1988)
|
||||||
|
requires that @t{long} variables be at least 32 bits; any system which does
|
||||||
|
not support 32-bit @t{long} values cannot make use of this package (nor
|
||||||
|
much other software that assumes an ANSI-C environment base) without
|
||||||
|
significant effort.
|
||||||
|
|
||||||
|
@section Error table source file
|
||||||
|
|
||||||
|
The error table source file begins with the declaration of the table name,
|
||||||
|
as
|
||||||
|
|
||||||
|
@example
|
||||||
|
error_table @var{tablename}
|
||||||
|
@end example
|
||||||
|
|
||||||
|
Individual error codes are
|
||||||
|
specified with
|
||||||
|
|
||||||
|
@example
|
||||||
|
error_code @var{ERROR_NAME}, @var{"text message"}
|
||||||
|
@end example
|
||||||
|
|
||||||
|
where @samp{ec} can also be used as a short form of @samp{error_code}. To
|
||||||
|
indicate the end of the table, use @samp{end}. Thus, a (short) sample
|
||||||
|
error table might be:
|
||||||
|
|
||||||
|
@example
|
||||||
|
|
||||||
|
error_table dsc
|
||||||
|
|
||||||
|
error_code DSC_DUP_MTG_NAME,
|
||||||
|
"Meeting already exists"
|
||||||
|
|
||||||
|
ec DSC_BAD_PATH,
|
||||||
|
"A bad meeting pathname was given"
|
||||||
|
|
||||||
|
ec DSC_BAD_MODES,
|
||||||
|
"Invalid mode for this access control list"
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@section The error-table compiler
|
||||||
|
|
||||||
|
The error table compiler is named @code{compile_et}. It takes one
|
||||||
|
argument, the pathname of a file (ending in @samp{.et}, e.g.,
|
||||||
|
@samp{dsc_err.et}) containing an error table source file. It parses the
|
||||||
|
error table, and generates two output files -- a C header file
|
||||||
|
(@samp{discuss_err.h}) which contains definitions of the numerical values
|
||||||
|
of the error codes defined in the error table, and a C source file which
|
||||||
|
should be compiled and linked with the executable. The header file must be
|
||||||
|
included in the source of a module which wishes to reference the error
|
||||||
|
codes defined; the object module generated from the C code may be linked in
|
||||||
|
to a program which wishes to use the printed forms of the error codes.
|
||||||
|
|
||||||
|
This translator accepts a @kbd{-language @var{lang}} argument, which
|
||||||
|
determines for which language (or language variant) the output should be
|
||||||
|
written. At the moment, @var{lang} is currently limited to @kbd{ANSI-C}
|
||||||
|
and @kbd{K&R-C}, and some abbreviated forms of each. Eventually, this will
|
||||||
|
be extended to include some support for C++. The default is currently
|
||||||
|
@kbd{K&R-C}, though the generated sources will have ANSI-C code
|
||||||
|
conditionalized on the symbol @t{__STDC__}.
|
||||||
|
|
||||||
|
@section Run-time support routines
|
||||||
|
|
||||||
|
Any source file which uses the routines supplied with or produced by the
|
||||||
|
com_err package should include the header file @file{<com_err.h>}. It
|
||||||
|
contains declarations and definitions which may be needed on some systems.
|
||||||
|
(Some functions cannot be referenced properly without the return type
|
||||||
|
declarations in this file. Some functions may work properly on most
|
||||||
|
architectures even without the header file, but relying on this is not
|
||||||
|
recommended.)
|
||||||
|
|
||||||
|
The run-time support routines and variables provided via this package
|
||||||
|
include the following:
|
||||||
|
|
||||||
|
@example
|
||||||
|
void initialize_@var{xxxx}_error_table (void);
|
||||||
|
@end example
|
||||||
|
|
||||||
|
One of these routines is built by the error compiler for each error table.
|
||||||
|
It makes the @var{xxxx} error table ``known'' to the error reporting
|
||||||
|
system. By convention, this routine should be called in the initialization
|
||||||
|
routine of the @var{xxxx} library. If the library has no initialization
|
||||||
|
routine, some combination of routines which form the core of the library
|
||||||
|
should ensure that this routine is called. It is not advised to leave it
|
||||||
|
the caller to make this call.
|
||||||
|
|
||||||
|
There is no harm in calling this routine more than once.
|
||||||
|
|
||||||
|
@example
|
||||||
|
#define ERROR_TABLE_BASE_@var{xxxx} @var{nnnnn}L
|
||||||
|
@end example
|
||||||
|
|
||||||
|
This symbol contains the value of the first error code entry in the
|
||||||
|
specified table.
|
||||||
|
This rarely needs be used by the
|
||||||
|
programmer.
|
||||||
|
|
||||||
|
@example
|
||||||
|
const char *error_message (long code);
|
||||||
|
@end example
|
||||||
|
|
||||||
|
This routine returns the character string error message associated
|
||||||
|
with @code{code}; if this is associated with an unknown error table, or
|
||||||
|
if the code is associated with a known error table but the code is not
|
||||||
|
in the table, a string of the form @samp{Unknown code @var{xxxx nn}} is
|
||||||
|
returned, where @var{xxxx} is the error table name produced by
|
||||||
|
reversing the compaction performed on the error table number implied
|
||||||
|
by that error code, and @var{nn} is the offset from that base value.
|
||||||
|
|
||||||
|
Although this routine is available for use when needed, its use should be
|
||||||
|
left to circumstances which render @code{com_err} (below) unusable.
|
||||||
|
|
||||||
|
@example
|
||||||
|
void com_err (const char *whoami, /* module reporting error */
|
||||||
|
long code, /* error code */
|
||||||
|
const char *format, /* format for additional detail */
|
||||||
|
...); /* (extra parameters) */
|
||||||
|
@end example
|
||||||
|
|
||||||
|
This routine provides an alternate way to print error messages to
|
||||||
|
standard error; it allows the error message to be passed in as a
|
||||||
|
parameter, rather than in an external variable. @emph{Provide grammatical
|
||||||
|
context for ``message.''}
|
||||||
|
|
||||||
|
If @var{format} is @code{(char *)NULL}, the formatted message will not be
|
||||||
|
printed. @var{format} may not be omitted.
|
||||||
|
|
||||||
|
@example
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
void com_err_va (const char *whoami,
|
||||||
|
long code,
|
||||||
|
const char *format,
|
||||||
|
va_list args);
|
||||||
|
@end example
|
||||||
|
|
||||||
|
This routine provides an interface, equivalent to @code{com_err} above,
|
||||||
|
which may be used by higher-level variadic functions (functions which
|
||||||
|
accept variable numbers of arguments).
|
||||||
|
|
||||||
|
@example
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
void (*set_com_err_hook (void (*proc) ())) ();
|
||||||
|
|
||||||
|
void (*@var{proc}) (const char *whoami, long code, va_list args);
|
||||||
|
|
||||||
|
void reset_com_err_hook ();
|
||||||
|
@end example
|
||||||
|
|
||||||
|
These two routines allow a routine to be dynamically substituted for
|
||||||
|
@samp{com_err}. After @samp{set_com_err_hook} has been called,
|
||||||
|
calls to @samp{com_err} will turn into calls to the new hook routine.
|
||||||
|
@samp{reset_com_err_hook} turns off this hook. This may intended to
|
||||||
|
be used in daemons (to use a routine which calls @var{syslog(3)}), or
|
||||||
|
in a window system application (which could pop up a dialogue box).
|
||||||
|
|
||||||
|
If a program is to be used in an environment in which simply printing
|
||||||
|
messages to the @code{stderr} stream would be inappropriate (such as in a
|
||||||
|
daemon program which runs without a terminal attached),
|
||||||
|
@code{set_com_err_hook} may be used to redirect output from @code{com_err}.
|
||||||
|
The following is an example of an error handler which uses @var{syslog(3)}
|
||||||
|
as supplied in BSD 4.3:
|
||||||
|
|
||||||
|
@example
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
|
||||||
|
/* extern openlog (const char * name, int logopt, int facility); */
|
||||||
|
/* extern syslog (int priority, char * message, ...); */
|
||||||
|
|
||||||
|
void hook (const char * whoami, long code,
|
||||||
|
const char * format, va_list args)
|
||||||
|
@{
|
||||||
|
char buffer[BUFSIZ];
|
||||||
|
static int initialized = 0;
|
||||||
|
if (!initialized) @{
|
||||||
|
openlog (whoami,
|
||||||
|
LOG_NOWAIT|LOG_CONS|LOG_PID|LOG_NDELAY,
|
||||||
|
LOG_DAEMON);
|
||||||
|
initialized = 1;
|
||||||
|
@}
|
||||||
|
vsprintf (buffer, format, args);
|
||||||
|
syslog (LOG_ERR, "%s %s", error_message (code), buffer);
|
||||||
|
@}
|
||||||
|
@end example
|
||||||
|
|
||||||
|
After making the call
|
||||||
|
@code{set_com_err_hook (hook);},
|
||||||
|
any calls to @code{com_err} will result in messages being sent to the
|
||||||
|
@var{syslogd} daemon for logging.
|
||||||
|
The name of the program, @samp{whoami}, is supplied to the
|
||||||
|
@samp{openlog()} call, and the message is formatted into a buffer and
|
||||||
|
passed to @code{syslog}.
|
||||||
|
|
||||||
|
Note that since the extra arguments to @code{com_err} are passed by
|
||||||
|
reference via the @code{va_list} value @code{args}, the hook routine may
|
||||||
|
place any form of interpretation on them, including ignoring them. For
|
||||||
|
consistency, @code{printf}-style interpretation is suggested, via
|
||||||
|
@code{vsprintf} (or @code{_doprnt} on BSD systems without full support for
|
||||||
|
the ANSI C library).
|
||||||
|
|
||||||
|
@section Coding Conventions
|
||||||
|
|
||||||
|
The following conventions are just some general stylistic conventions
|
||||||
|
to follow when writing robust libraries and programs. Conventions
|
||||||
|
similar to this are generally followed inside the UNIX kernel and most
|
||||||
|
routines in the Multics operating system. In general, a routine
|
||||||
|
either succeeds (returning a zero error code, and doing some side
|
||||||
|
effects in the process), or it fails, doing minimal side effects; in
|
||||||
|
any event, any invariant which the library assumes must be maintained.
|
||||||
|
|
||||||
|
In general, it is not in the domain of non user-interface library
|
||||||
|
routines to write error messages to the user's terminal, or halt the
|
||||||
|
process. Such forms of ``error handling'' should be reserved for
|
||||||
|
failures of internal invariants and consistancy checks only, as it
|
||||||
|
provides the user of the library no way to clean up for himself in the
|
||||||
|
event of total failure.
|
||||||
|
|
||||||
|
Library routines which can fail should be set up to return an error
|
||||||
|
code. This should usually be done as the return value of the
|
||||||
|
function; if this is not acceptable, the routine should return a
|
||||||
|
``null'' value, and put the error code into a parameter passed by
|
||||||
|
reference.
|
||||||
|
|
||||||
|
Routines which use the first style of interface can be used from
|
||||||
|
user-interface levels of a program as follows:
|
||||||
|
|
||||||
|
@example
|
||||||
|
@{
|
||||||
|
if ((code = initialize_world(getuid(), random())) != 0) @{
|
||||||
|
com_err("demo", code,
|
||||||
|
"when trying to initialize world");
|
||||||
|
exit(1);
|
||||||
|
@}
|
||||||
|
if ((database = open_database("my_secrets", &code))==NULL) @{
|
||||||
|
com_err("demo", code,
|
||||||
|
"while opening my_secrets");
|
||||||
|
exit(1);
|
||||||
|
@}
|
||||||
|
@}
|
||||||
|
@end example
|
||||||
|
|
||||||
|
A caller which fails to check the return status is in error. It is
|
||||||
|
possible to look for code which ignores error returns by using lint;
|
||||||
|
look for error messages of the form ``foobar returns value which is
|
||||||
|
sometimes ignored'' or ``foobar returns value which is always
|
||||||
|
ignored.''
|
||||||
|
|
||||||
|
Since libraries may be built out of other libraries, it is often necessary
|
||||||
|
for the success of one routine to depend on another. When a lower level
|
||||||
|
routine returns an error code, the middle level routine has a few possible
|
||||||
|
options. It can simply return the error code to its caller after doing
|
||||||
|
some form of cleanup, it can substitute one of its own, or it can take
|
||||||
|
corrective action of its own and continue normally. For instance, a
|
||||||
|
library routine which makes a ``connect'' system call to make a network
|
||||||
|
connection may reflect the system error code @code{ECONNREFUSED}
|
||||||
|
(Connection refused) to its caller, or it may return a ``server not
|
||||||
|
available, try again later,'' or it may try a different server.
|
||||||
|
|
||||||
|
Cleanup which is typically necessary may include, but not be limited
|
||||||
|
to, freeing allocated memory which will not be needed any more,
|
||||||
|
unlocking concurrancy locks, dropping reference counts, closing file
|
||||||
|
descriptors, or otherwise undoing anything which the procedure did up
|
||||||
|
to this point. When there are a lot of things which can go wrong, it
|
||||||
|
is generally good to write one block of error-handling code which is
|
||||||
|
branched to, using a goto, in the event of failure. A common source
|
||||||
|
of errors in UNIX programs is failing to close file descriptors on
|
||||||
|
error returns; this leaves a number of ``zombied'' file descriptors
|
||||||
|
open, which eventually causes the process to run out of file
|
||||||
|
descriptors and fall over.
|
||||||
|
|
||||||
|
@example
|
||||||
|
@{
|
||||||
|
FILE *f1=NULL, *f2=NULL, *f3=NULL;
|
||||||
|
int status = 0;
|
||||||
|
|
||||||
|
if ( (f1 = fopen(FILE1, "r")) == NULL) @{
|
||||||
|
status = errno;
|
||||||
|
goto error;
|
||||||
|
@}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Crunch for a while
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( (f2 = fopen(FILE2, "w")) == NULL) @{
|
||||||
|
status = errno;
|
||||||
|
goto error;
|
||||||
|
@}
|
||||||
|
|
||||||
|
if ( (f3 = fopen(FILE3, "a+")) == NULL) @{
|
||||||
|
status = errno;
|
||||||
|
goto error;
|
||||||
|
@}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do more processing.
|
||||||
|
*/
|
||||||
|
fclose(f1);
|
||||||
|
fclose(f2);
|
||||||
|
fclose(f3);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
if (f1) fclose(f1);
|
||||||
|
if (f2) fclose(f2);
|
||||||
|
if (f3) fclose(f3);
|
||||||
|
return status;
|
||||||
|
@}
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@section Building and Installation
|
||||||
|
|
||||||
|
The distribution of this package will probably be done as a compressed
|
||||||
|
``tar''-format file available via anonymous FTP from SIPB.MIT.EDU.
|
||||||
|
Retrieve @samp{pub/com_err.tar.Z} and extract the contents. A subdirectory
|
||||||
|
@t{profiled} should be created to hold objects compiled for profiling.
|
||||||
|
Running ``make all'' should then be sufficient to build the library and
|
||||||
|
error-table compiler. The files @samp{libcom_err.a},
|
||||||
|
@samp{libcom_err_p.a}, @samp{com_err.h}, and @samp{compile_et} should be
|
||||||
|
installed for use; @samp{com_err.3} and @samp{compile_et.1} can also be
|
||||||
|
installed as manual pages.
|
||||||
|
|
||||||
|
Potential problems:
|
||||||
|
|
||||||
|
@itemize @bullet
|
||||||
|
|
||||||
|
@item Use of @code{strcasecmp}, a routine provided in BSD for
|
||||||
|
case-insensitive string comparisons. If an equivalent routine is
|
||||||
|
available, you can modify @code{CFLAGS} in the makefile to define
|
||||||
|
@code{strcasecmp} to the name of that routine.
|
||||||
|
|
||||||
|
@item Compilers that defined @code{__STDC__} without providing the header
|
||||||
|
file @code{<stdarg.h>}. One such example is Metaware's High ``C''
|
||||||
|
compiler, as provided at Project Athena on the IBM RT/PC workstation; if
|
||||||
|
@code{__HIGHC__} is defined, it is assumed that @code{<stdarg.h>} is not
|
||||||
|
available, and therefore @code{<varargs.h>} must be used. If the symbol
|
||||||
|
@code{VARARGS} is defined (e.g., in the makefile), @code{<varargs.h>} will
|
||||||
|
be used.
|
||||||
|
|
||||||
|
@item If your linker rejects symbols that are simultaneously defined in two
|
||||||
|
library files, edit @samp{Makefile} to remove @samp{perror.c} from the
|
||||||
|
library. This file contains a version of @var{perror(3)} which calls
|
||||||
|
@code{com_err} instead of calling @code{write} directly.
|
||||||
|
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
As I do not have access to non-BSD systems, there are probably
|
||||||
|
bugs present that may interfere with building or using this package on
|
||||||
|
other systems. If they are reported to me, they can probably be fixed for
|
||||||
|
the next version.
|
||||||
|
|
||||||
|
@section Bug Reports
|
||||||
|
|
||||||
|
Please send any comments or bug reports to the principal author: Ken
|
||||||
|
Raeburn, @t{Raeburn@@Athena.MIT.EDU}.
|
||||||
|
|
||||||
|
@section Acknowledgements
|
||||||
|
|
||||||
|
I would like to thank: Bill Sommerfeld, for his help with some of this
|
||||||
|
documentation, and catching some of the bugs the first time around;
|
||||||
|
Honeywell Information Systems, for not killing off the @emph{Multics}
|
||||||
|
operating system before I had an opportunity to use it; Honeywell's
|
||||||
|
customers, who persuaded them not to do so, for a while; Ted Anderson of
|
||||||
|
CMU, for catching some problems before version 1.2 left the nest; Stan
|
||||||
|
Zanarotti and several others of MIT's Student Information Processing Board,
|
||||||
|
for getting us started with ``discuss,'' for which this package was
|
||||||
|
originally written; and everyone I've talked into --- I mean, asked to read
|
||||||
|
this document and the ``man'' pages.
|
||||||
|
|
||||||
|
@bye
|
||||||
11
util/com_err/compile_et
Executable file
11
util/com_err/compile_et
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
#
|
||||||
|
AWK=/usr/bin/awk
|
||||||
|
DIR=com_err/
|
||||||
|
|
||||||
|
ROOT=`echo $1 | sed -e s/.et$//`
|
||||||
|
BASE=`basename $ROOT`
|
||||||
|
|
||||||
|
$AWK -f ${DIR}/et_h.awk outfile=${BASE}.h $ROOT.et
|
||||||
|
$AWK -f ${DIR}/et_c.awk outfile=${BASE}.c $ROOT.et
|
||||||
79
util/com_err/compile_et.1
Normal file
79
util/com_err/compile_et.1
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
.\" Copyright (c) 1988 Massachusetts Institute of Technology,
|
||||||
|
.\" Student Information Processing Board. All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" $Header: /mit/krb5/.cvsroot/src/util/et/compile_et.1,v 1.1 1993/06/03 12:29:46 tytso Exp $
|
||||||
|
.\"
|
||||||
|
.TH COMPILE_ET 1 "22 Nov 1988" SIPB
|
||||||
|
.SH NAME
|
||||||
|
compile_et \- error table compiler
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B compile_et
|
||||||
|
file
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B Compile_et
|
||||||
|
converts a table listing error-code names and associated messages into
|
||||||
|
a C source file suitable for use with the
|
||||||
|
.IR com_err (3)
|
||||||
|
library.
|
||||||
|
|
||||||
|
The source file name must end with a suffix of ``.et''; the file
|
||||||
|
consists of a declaration supplying the name (up to four characters
|
||||||
|
long) of the error-code table:
|
||||||
|
|
||||||
|
.B error_table
|
||||||
|
.I name
|
||||||
|
|
||||||
|
followed by up to 256 entries of the form:
|
||||||
|
|
||||||
|
.B error_code
|
||||||
|
.I name,
|
||||||
|
"
|
||||||
|
.I string
|
||||||
|
"
|
||||||
|
|
||||||
|
and a final
|
||||||
|
|
||||||
|
.B end
|
||||||
|
|
||||||
|
to indicate the end of the table.
|
||||||
|
|
||||||
|
The name of the table is used to construct the name of a subroutine
|
||||||
|
.I initialize_XXXX_error_table
|
||||||
|
which must be called in order for the
|
||||||
|
.I com_err
|
||||||
|
library to recognize the error table.
|
||||||
|
|
||||||
|
The various error codes defined are assigned sequentially increasing
|
||||||
|
numbers (starting with a large number computed as a hash function of
|
||||||
|
the name of the table); thus for compatibility it is suggested that
|
||||||
|
new codes be added only to the end of an existing table, and that no
|
||||||
|
codes be removed from tables.
|
||||||
|
|
||||||
|
The names defined in the table are placed into a C header file with
|
||||||
|
preprocessor directives defining them as integer constants of up to
|
||||||
|
32 bits in magnitude.
|
||||||
|
|
||||||
|
A C source file is also generated which should be compiled and linked
|
||||||
|
with the object files which reference these error codes; it contains
|
||||||
|
the text of the messages and the initialization subroutine. Both C
|
||||||
|
files have names derived from that of the original source file, with
|
||||||
|
the ``.et'' suffix replaced by ``.c'' and ``.h''.
|
||||||
|
|
||||||
|
A ``#'' in the source file is treated as a comment character, and all
|
||||||
|
remaining text to the end of the source line will be ignored.
|
||||||
|
|
||||||
|
.SH BUGS
|
||||||
|
|
||||||
|
Since
|
||||||
|
.B compile_et
|
||||||
|
uses a very simple parser based on
|
||||||
|
.IR yacc (1),
|
||||||
|
its error recovery leaves much to be desired.
|
||||||
|
|
||||||
|
.\" .IR for manual entries
|
||||||
|
.\" .PP for paragraph breaks
|
||||||
|
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
com_err (3).
|
||||||
|
|
||||||
|
Ken Raeburn, "A Common Error Description Library for UNIX".
|
||||||
82
util/com_err/error_message.c
Normal file
82
util/com_err/error_message.c
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* $Header: /mit/krb5/.cvsroot/src/util/et/error_message.c,v 5.0 1993/04/13 19:56:17 tytso Exp $
|
||||||
|
* $Source: /mit/krb5/.cvsroot/src/util/et/error_message.c,v $
|
||||||
|
* $Locker: $
|
||||||
|
*
|
||||||
|
* Copyright 1987 by the Student Information Processing Board
|
||||||
|
* of the Massachusetts Institute of Technology
|
||||||
|
*
|
||||||
|
* For copyright info, see "mit-sipb-copyright.h".
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include "com_err.h"
|
||||||
|
#include "error_table.h"
|
||||||
|
#include "mit-sipb-copyright.h"
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
static char buffer[25];
|
||||||
|
|
||||||
|
struct et_list * _et_list = (struct et_list *) NULL;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __STDC__
|
||||||
|
const char * error_message (errcode_t code)
|
||||||
|
#else
|
||||||
|
const char * error_message (code)
|
||||||
|
errcode_t code;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
int offset;
|
||||||
|
struct et_list *et;
|
||||||
|
int table_num;
|
||||||
|
int started = 0;
|
||||||
|
char *cp;
|
||||||
|
|
||||||
|
offset = code & ((1<<ERRCODE_RANGE)-1);
|
||||||
|
table_num = code - offset;
|
||||||
|
if (!table_num) {
|
||||||
|
#ifdef HAS_SYS_ERRLIST
|
||||||
|
if (offset < sys_nerr)
|
||||||
|
return(sys_errlist[offset]);
|
||||||
|
else
|
||||||
|
goto oops;
|
||||||
|
#else
|
||||||
|
cp = strerror(offset);
|
||||||
|
if (cp)
|
||||||
|
return(cp);
|
||||||
|
else
|
||||||
|
goto oops;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
for (et = _et_list; et; et = et->next) {
|
||||||
|
if (et->table->base == table_num) {
|
||||||
|
/* This is the right table */
|
||||||
|
if (et->table->n_msgs <= offset)
|
||||||
|
goto oops;
|
||||||
|
return(et->table->msgs[offset]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
oops:
|
||||||
|
strcpy (buffer, "Unknown code ");
|
||||||
|
if (table_num) {
|
||||||
|
strcat (buffer, error_table_name (table_num));
|
||||||
|
strcat (buffer, " ");
|
||||||
|
}
|
||||||
|
for (cp = buffer; *cp; cp++)
|
||||||
|
;
|
||||||
|
if (offset >= 100) {
|
||||||
|
*cp++ = '0' + offset / 100;
|
||||||
|
offset %= 100;
|
||||||
|
started++;
|
||||||
|
}
|
||||||
|
if (started || offset >= 10) {
|
||||||
|
*cp++ = '0' + offset / 10;
|
||||||
|
offset %= 10;
|
||||||
|
}
|
||||||
|
*cp++ = '0' + offset;
|
||||||
|
*cp = '\0';
|
||||||
|
return(buffer);
|
||||||
|
}
|
||||||
35
util/com_err/error_table.h
Normal file
35
util/com_err/error_table.h
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1988 by the Student Information Processing Board of the
|
||||||
|
* Massachusetts Institute of Technology.
|
||||||
|
*
|
||||||
|
* For copyright info, see mit-sipb-copyright.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ET_H
|
||||||
|
/* Are we using ANSI C? */
|
||||||
|
#ifndef __STDC__
|
||||||
|
#define const
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct error_table {
|
||||||
|
char const * const * msgs;
|
||||||
|
long base;
|
||||||
|
int n_msgs;
|
||||||
|
};
|
||||||
|
struct et_list {
|
||||||
|
struct et_list *next;
|
||||||
|
const struct error_table *table;
|
||||||
|
};
|
||||||
|
extern struct et_list * _et_list;
|
||||||
|
|
||||||
|
#define ERRCODE_RANGE 8 /* # of bits to shift table number */
|
||||||
|
#define BITS_PER_CHAR 6 /* # bits to shift per character in name */
|
||||||
|
|
||||||
|
#ifdef __STDC__
|
||||||
|
extern const char *error_table_name(int num);
|
||||||
|
#else
|
||||||
|
extern const char *error_table_name();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define _ET_H
|
||||||
|
#endif
|
||||||
185
util/com_err/et_c.awk
Normal file
185
util/com_err/et_c.awk
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
BEGIN {
|
||||||
|
char_shift=64
|
||||||
|
## "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";
|
||||||
|
c2n["A"]=1
|
||||||
|
c2n["B"]=2
|
||||||
|
c2n["C"]=3
|
||||||
|
c2n["D"]=4
|
||||||
|
c2n["E"]=5
|
||||||
|
c2n["F"]=6
|
||||||
|
c2n["G"]=7
|
||||||
|
c2n["H"]=8
|
||||||
|
c2n["I"]=9
|
||||||
|
c2n["J"]=10
|
||||||
|
c2n["K"]=11
|
||||||
|
c2n["L"]=12
|
||||||
|
c2n["M"]=13
|
||||||
|
c2n["N"]=14
|
||||||
|
c2n["O"]=15
|
||||||
|
c2n["P"]=16
|
||||||
|
c2n["Q"]=17
|
||||||
|
c2n["R"]=18
|
||||||
|
c2n["S"]=19
|
||||||
|
c2n["T"]=20
|
||||||
|
c2n["U"]=21
|
||||||
|
c2n["V"]=22
|
||||||
|
c2n["W"]=23
|
||||||
|
c2n["X"]=24
|
||||||
|
c2n["Y"]=25
|
||||||
|
c2n["Z"]=26
|
||||||
|
c2n["a"]=27
|
||||||
|
c2n["b"]=28
|
||||||
|
c2n["c"]=29
|
||||||
|
c2n["d"]=30
|
||||||
|
c2n["e"]=31
|
||||||
|
c2n["f"]=32
|
||||||
|
c2n["g"]=33
|
||||||
|
c2n["h"]=34
|
||||||
|
c2n["i"]=35
|
||||||
|
c2n["j"]=36
|
||||||
|
c2n["k"]=37
|
||||||
|
c2n["l"]=38
|
||||||
|
c2n["m"]=39
|
||||||
|
c2n["n"]=40
|
||||||
|
c2n["o"]=41
|
||||||
|
c2n["p"]=42
|
||||||
|
c2n["q"]=43
|
||||||
|
c2n["r"]=44
|
||||||
|
c2n["s"]=45
|
||||||
|
c2n["t"]=46
|
||||||
|
c2n["u"]=47
|
||||||
|
c2n["v"]=48
|
||||||
|
c2n["w"]=49
|
||||||
|
c2n["x"]=50
|
||||||
|
c2n["y"]=51
|
||||||
|
c2n["z"]=52
|
||||||
|
c2n["0"]=53
|
||||||
|
c2n["1"]=54
|
||||||
|
c2n["2"]=55
|
||||||
|
c2n["3"]=56
|
||||||
|
c2n["4"]=57
|
||||||
|
c2n["5"]=58
|
||||||
|
c2n["6"]=59
|
||||||
|
c2n["7"]=60
|
||||||
|
c2n["8"]=61
|
||||||
|
c2n["9"]=62
|
||||||
|
c2n["_"]=63
|
||||||
|
}
|
||||||
|
/^#/ { next }
|
||||||
|
/^[ \t]*(error_table|et)[ \t]+[a-zA-Z][a-zA-Z0-9_]+/ {
|
||||||
|
table_number = 0
|
||||||
|
table_name = $2
|
||||||
|
mod_base = 1000000
|
||||||
|
for(i=1; i<=length(table_name); i++) {
|
||||||
|
table_number=(table_number*char_shift)+c2n[substr(table_name,i,1)]
|
||||||
|
}
|
||||||
|
|
||||||
|
# We start playing *_high, *low games here because the some
|
||||||
|
# awk programs do not have the necessary precision (sigh)
|
||||||
|
tab_base_low = table_number % mod_base
|
||||||
|
tab_base_high = int(table_number / mod_base)
|
||||||
|
tab_base_sign = 1;
|
||||||
|
|
||||||
|
# figure out: table_number_base=table_number*256
|
||||||
|
tab_base_low = tab_base_low * 256
|
||||||
|
tab_base_high = (tab_base_high * 256) + \
|
||||||
|
int(tab_base_low / mod_base)
|
||||||
|
tab_base_low = tab_base_low % mod_base
|
||||||
|
|
||||||
|
if (table_number > 128*256*256) {
|
||||||
|
# figure out: table_number_base -= 256*256*256*256
|
||||||
|
# sub_high, sub_low is 256*256*256*256
|
||||||
|
sub_low = 256*256*256 % mod_base
|
||||||
|
sub_high = int(256*256*256 / mod_base)
|
||||||
|
|
||||||
|
sub_low = sub_low * 256
|
||||||
|
sub_high = (sub_high * 256) + int(sub_low / mod_base)
|
||||||
|
sub_low = sub_low % mod_base
|
||||||
|
|
||||||
|
tab_base_low = sub_low - tab_base_low;
|
||||||
|
tab_base_high = sub_high - tab_base_high;
|
||||||
|
tab_base_sign = -1;
|
||||||
|
if (tab_base_low < 0) {
|
||||||
|
tab_base_low = tab_base_low + mod_base
|
||||||
|
tab_base_high--
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print "/*" > outfile
|
||||||
|
print " * " outfile ":" > outfile
|
||||||
|
print " * This file is automatically generated; please do not edit it." > outfile
|
||||||
|
print " */" > outfile
|
||||||
|
|
||||||
|
print "#ifdef __STDC__" > outfile
|
||||||
|
print "#define NOARGS void" > outfile
|
||||||
|
print "#else" > outfile
|
||||||
|
print "#define NOARGS" > outfile
|
||||||
|
print "#define const" > outfile
|
||||||
|
print "#endif" > outfile
|
||||||
|
print "" > outfile
|
||||||
|
print "static const char * const text[] = {" > outfile
|
||||||
|
table_item_count = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
/^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[ \t]*$/ {
|
||||||
|
skipone=1
|
||||||
|
next
|
||||||
|
}
|
||||||
|
|
||||||
|
/^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[ \t]*".*"[ \t]*$/ {
|
||||||
|
text=""
|
||||||
|
for (i=3; i<=NF; i++) {
|
||||||
|
text = text FS $i
|
||||||
|
}
|
||||||
|
text=substr(text,2,length(text)-1);
|
||||||
|
printf "\t%s,\n", text > outfile
|
||||||
|
table_item_count++
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
if (skipone) {
|
||||||
|
printf "\t%s,\n", $0 > outfile
|
||||||
|
table_item_count++
|
||||||
|
}
|
||||||
|
skipone=0
|
||||||
|
}
|
||||||
|
END {
|
||||||
|
|
||||||
|
|
||||||
|
print " 0" > outfile
|
||||||
|
print "};" > outfile
|
||||||
|
print "" > outfile
|
||||||
|
print "struct error_table {" > outfile
|
||||||
|
print " char const * const * msgs;" > outfile
|
||||||
|
print " long base;" > outfile
|
||||||
|
print " int n_msgs;" > outfile
|
||||||
|
print "};" > outfile
|
||||||
|
print "struct et_list {" > outfile
|
||||||
|
print " struct et_list *next;" > outfile
|
||||||
|
print " const struct error_table * table;" > outfile
|
||||||
|
print "};" > outfile
|
||||||
|
print "extern struct et_list *_et_list;" > outfile
|
||||||
|
print "" > outfile
|
||||||
|
if (tab_base_high == 0) {
|
||||||
|
print "static const struct error_table et = { text, " \
|
||||||
|
sprintf("%dL, %d };", tab_base_sign*tab_base_low, \
|
||||||
|
table_item_count) > outfile
|
||||||
|
} else {
|
||||||
|
print "static const struct error_table et = { text, " \
|
||||||
|
sprintf("%d%06dL, %d };", tab_base_sign*tab_base_high, \
|
||||||
|
tab_base_low, table_item_count) > outfile
|
||||||
|
}
|
||||||
|
print "" > outfile
|
||||||
|
print "static struct et_list link = { 0, 0 };" > outfile
|
||||||
|
print "" > outfile
|
||||||
|
print "void initialize_" table_name "_error_table (NOARGS);" > outfile
|
||||||
|
print "" > outfile
|
||||||
|
print "void initialize_" table_name "_error_table (NOARGS) {" > outfile
|
||||||
|
print " if (!link.table) {" > outfile
|
||||||
|
print " link.next = _et_list;" > outfile
|
||||||
|
print " link.table = &et;" > outfile
|
||||||
|
print " _et_list = &link;" > outfile
|
||||||
|
print " }" > outfile
|
||||||
|
print "}" > outfile
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
157
util/com_err/et_h.awk
Normal file
157
util/com_err/et_h.awk
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
BEGIN {
|
||||||
|
char_shift=64
|
||||||
|
## "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";
|
||||||
|
c2n["A"]=1
|
||||||
|
c2n["B"]=2
|
||||||
|
c2n["C"]=3
|
||||||
|
c2n["D"]=4
|
||||||
|
c2n["E"]=5
|
||||||
|
c2n["F"]=6
|
||||||
|
c2n["G"]=7
|
||||||
|
c2n["H"]=8
|
||||||
|
c2n["I"]=9
|
||||||
|
c2n["J"]=10
|
||||||
|
c2n["K"]=11
|
||||||
|
c2n["L"]=12
|
||||||
|
c2n["M"]=13
|
||||||
|
c2n["N"]=14
|
||||||
|
c2n["O"]=15
|
||||||
|
c2n["P"]=16
|
||||||
|
c2n["Q"]=17
|
||||||
|
c2n["R"]=18
|
||||||
|
c2n["S"]=19
|
||||||
|
c2n["T"]=20
|
||||||
|
c2n["U"]=21
|
||||||
|
c2n["V"]=22
|
||||||
|
c2n["W"]=23
|
||||||
|
c2n["X"]=24
|
||||||
|
c2n["Y"]=25
|
||||||
|
c2n["Z"]=26
|
||||||
|
c2n["a"]=27
|
||||||
|
c2n["b"]=28
|
||||||
|
c2n["c"]=29
|
||||||
|
c2n["d"]=30
|
||||||
|
c2n["e"]=31
|
||||||
|
c2n["f"]=32
|
||||||
|
c2n["g"]=33
|
||||||
|
c2n["h"]=34
|
||||||
|
c2n["i"]=35
|
||||||
|
c2n["j"]=36
|
||||||
|
c2n["k"]=37
|
||||||
|
c2n["l"]=38
|
||||||
|
c2n["m"]=39
|
||||||
|
c2n["n"]=40
|
||||||
|
c2n["o"]=41
|
||||||
|
c2n["p"]=42
|
||||||
|
c2n["q"]=43
|
||||||
|
c2n["r"]=44
|
||||||
|
c2n["s"]=45
|
||||||
|
c2n["t"]=46
|
||||||
|
c2n["u"]=47
|
||||||
|
c2n["v"]=48
|
||||||
|
c2n["w"]=49
|
||||||
|
c2n["x"]=50
|
||||||
|
c2n["y"]=51
|
||||||
|
c2n["z"]=52
|
||||||
|
c2n["0"]=53
|
||||||
|
c2n["1"]=54
|
||||||
|
c2n["2"]=55
|
||||||
|
c2n["3"]=56
|
||||||
|
c2n["4"]=57
|
||||||
|
c2n["5"]=58
|
||||||
|
c2n["6"]=59
|
||||||
|
c2n["7"]=60
|
||||||
|
c2n["8"]=61
|
||||||
|
c2n["9"]=62
|
||||||
|
c2n["_"]=63
|
||||||
|
}
|
||||||
|
/^#/ { next }
|
||||||
|
/^[ \t]*(error_table|et)[ \t]+[a-zA-Z][a-zA-Z0-9_]+/ {
|
||||||
|
table_number = 0
|
||||||
|
table_name = $2
|
||||||
|
mod_base = 1000000
|
||||||
|
for(i=1; i<=length(table_name); i++) {
|
||||||
|
table_number=(table_number*char_shift)+c2n[substr(table_name,i,1)]
|
||||||
|
}
|
||||||
|
# We start playing *_high, *low games here because the some
|
||||||
|
# awk programs do not have the necessary precision (sigh)
|
||||||
|
tab_base_low = table_number % mod_base
|
||||||
|
tab_base_high = int(table_number / mod_base)
|
||||||
|
tab_base_sign = 1;
|
||||||
|
|
||||||
|
# figure out: table_number_base=table_number*256
|
||||||
|
tab_base_low = tab_base_low * 256
|
||||||
|
tab_base_high = (tab_base_high * 256) + \
|
||||||
|
int(tab_base_low / mod_base)
|
||||||
|
tab_base_low = tab_base_low % mod_base
|
||||||
|
|
||||||
|
if (table_number > 128*256*256) {
|
||||||
|
# figure out: table_number_base -= 256*256*256*256
|
||||||
|
# sub_high, sub_low is 256*256*256*256
|
||||||
|
sub_low = 256*256*256 % mod_base
|
||||||
|
sub_high = int(256*256*256 / mod_base)
|
||||||
|
|
||||||
|
sub_low = sub_low * 256
|
||||||
|
sub_high = (sub_high * 256) + int(sub_low / mod_base)
|
||||||
|
sub_low = sub_low % mod_base
|
||||||
|
|
||||||
|
tab_base_low = sub_low - tab_base_low;
|
||||||
|
tab_base_high = sub_high - tab_base_high;
|
||||||
|
tab_base_sign = -1;
|
||||||
|
if (tab_base_low < 0) {
|
||||||
|
tab_base_low = tab_base_low + mod_base
|
||||||
|
tab_base_high--
|
||||||
|
}
|
||||||
|
}
|
||||||
|
curr_low = tab_base_low
|
||||||
|
curr_high = tab_base_high
|
||||||
|
curr_sign = tab_base_sign
|
||||||
|
print "/*" > outfile
|
||||||
|
print " * " outfile ":" > outfile
|
||||||
|
print " * This file is automatically generated; please do not edit it." > outfile
|
||||||
|
print " */" > outfile
|
||||||
|
print "#ifdef __STDC__" > outfile
|
||||||
|
print "#define NOARGS void" > outfile
|
||||||
|
print "#else" > outfile
|
||||||
|
print "#define NOARGS" > outfile
|
||||||
|
print "#define const" > outfile
|
||||||
|
print "#endif" > outfile
|
||||||
|
print "" > outfile
|
||||||
|
}
|
||||||
|
|
||||||
|
/^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,/ {
|
||||||
|
tag=substr($2,1,length($2)-1)
|
||||||
|
if (curr_high == 0) {
|
||||||
|
printf "#define %-40s (%dL)\n", tag, \
|
||||||
|
curr_sign*curr_low > outfile
|
||||||
|
} else {
|
||||||
|
printf "#define %-40s (%d%06dL)\n", tag, curr_high*curr_sign, \
|
||||||
|
curr_low > outfile
|
||||||
|
}
|
||||||
|
curr_low += curr_sign;
|
||||||
|
if (curr_low >= mod_base) {
|
||||||
|
curr_low -= mod_base;
|
||||||
|
curr_high++
|
||||||
|
}
|
||||||
|
if (curr_low < 0) {
|
||||||
|
cur_low += mod_base
|
||||||
|
cur_high--
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
END {
|
||||||
|
print "extern void initialize_" table_name "_error_table (NOARGS);" > outfile
|
||||||
|
if (tab_base_high == 0) {
|
||||||
|
print "#define ERROR_TABLE_BASE_" table_name " (" \
|
||||||
|
sprintf("%d", tab_base_sign*tab_base_low) \
|
||||||
|
"L)" > outfile
|
||||||
|
} else {
|
||||||
|
print "#define ERROR_TABLE_BASE_" table_name " (" \
|
||||||
|
sprintf("%d%06d", tab_base_sign*tab_base_high, \
|
||||||
|
tab_base_low) "L)" > outfile
|
||||||
|
}
|
||||||
|
print "" > outfile
|
||||||
|
print "/* for compatibility with older versions... */" > outfile
|
||||||
|
print "#define init_" table_name "_err_tbl initialize_" table_name "_error_table" > outfile
|
||||||
|
print "#define " table_name "_err_base ERROR_TABLE_BASE_" table_name > outfile
|
||||||
|
}
|
||||||
36
util/com_err/et_name.c
Normal file
36
util/com_err/et_name.c
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1987 by MIT Student Information Processing Board
|
||||||
|
*
|
||||||
|
* For copyright info, see mit-sipb-copyright.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "error_table.h"
|
||||||
|
#include "mit-sipb-copyright.h"
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
static const char char_set[] =
|
||||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";
|
||||||
|
|
||||||
|
static char buf[6];
|
||||||
|
|
||||||
|
const char * error_table_name(num)
|
||||||
|
int num;
|
||||||
|
{
|
||||||
|
int ch;
|
||||||
|
int i;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
/* num = aa aaa abb bbb bcc ccc cdd ddd d?? ??? ??? */
|
||||||
|
p = buf;
|
||||||
|
num >>= ERRCODE_RANGE;
|
||||||
|
/* num = ?? ??? ??? aaa aaa bbb bbb ccc ccc ddd ddd */
|
||||||
|
num &= 077777777;
|
||||||
|
/* num = 00 000 000 aaa aaa bbb bbb ccc ccc ddd ddd */
|
||||||
|
for (i = 4; i >= 0; i--) {
|
||||||
|
ch = (num >> BITS_PER_CHAR * i) & ((1 << BITS_PER_CHAR) - 1);
|
||||||
|
if (ch != 0)
|
||||||
|
*p++ = char_set[ch-1];
|
||||||
|
}
|
||||||
|
*p = '\0';
|
||||||
|
return(buf);
|
||||||
|
}
|
||||||
58
util/com_err/init_et.c
Normal file
58
util/com_err/init_et.c
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* $Header: /mit/krb5/.cvsroot/src/util/et/init_et.c,v 5.0 1993/04/13 19:56:25 tytso Exp $
|
||||||
|
* $Source: /mit/krb5/.cvsroot/src/util/et/init_et.c,v $
|
||||||
|
* $Locker: $
|
||||||
|
*
|
||||||
|
* Copyright 1986, 1987, 1988 by MIT Information Systems and
|
||||||
|
* the MIT Student Information Processing Board.
|
||||||
|
*
|
||||||
|
* For copyright info, see mit-sipb-copyright.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#ifdef HAVE_STDLIB_H
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
#include "com_err.h"
|
||||||
|
#include "error_table.h"
|
||||||
|
#include "mit-sipb-copyright.h"
|
||||||
|
|
||||||
|
#ifndef __STDC__
|
||||||
|
#define const
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct foobar {
|
||||||
|
struct et_list etl;
|
||||||
|
struct error_table et;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct et_list * _et_list;
|
||||||
|
|
||||||
|
#ifdef __STDC__
|
||||||
|
int init_error_table(const char * const *msgs, int base, int count)
|
||||||
|
#else
|
||||||
|
int init_error_table(msgs, base, count)
|
||||||
|
const char * const * msgs;
|
||||||
|
int base;
|
||||||
|
int count;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
struct foobar * new_et;
|
||||||
|
|
||||||
|
if (!base || !count || !msgs)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
new_et = (struct foobar *) malloc(sizeof(struct foobar));
|
||||||
|
if (!new_et)
|
||||||
|
return ENOMEM; /* oops */
|
||||||
|
new_et->etl.table = &new_et->et;
|
||||||
|
new_et->et.msgs = msgs;
|
||||||
|
new_et->et.base = base;
|
||||||
|
new_et->et.n_msgs= count;
|
||||||
|
|
||||||
|
new_et->etl.next = _et_list;
|
||||||
|
_et_list = &new_et->etl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
22
util/com_err/internal.h
Normal file
22
util/com_err/internal.h
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* internal include file for com_err package
|
||||||
|
*/
|
||||||
|
#include "mit-sipb-copyright.h"
|
||||||
|
#ifndef __STDC__
|
||||||
|
#undef const
|
||||||
|
#define const
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#ifdef NEED_SYS_ERRLIST
|
||||||
|
extern char const * const sys_errlist[];
|
||||||
|
extern const int sys_nerr;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* AIX and Ultrix have standard conforming header files. */
|
||||||
|
#if !defined(ultrix) && !defined(_AIX)
|
||||||
|
#ifdef __STDC__
|
||||||
|
void perror (const char *);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
19
util/com_err/mit-sipb-copyright.h
Normal file
19
util/com_err/mit-sipb-copyright.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 1987, 1988 by the Student Information Processing Board
|
||||||
|
of the Massachusetts Institute of Technology
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software
|
||||||
|
and its documentation for any purpose and without fee is
|
||||||
|
hereby granted, provided that the above copyright notice
|
||||||
|
appear in all copies and that both that copyright notice and
|
||||||
|
this permission notice appear in supporting documentation,
|
||||||
|
and that the names of M.I.T. and the M.I.T. S.I.P.B. not be
|
||||||
|
used in advertising or publicity pertaining to distribution
|
||||||
|
of the software without specific, written prior permission.
|
||||||
|
M.I.T. and the M.I.T. S.I.P.B. make no representations about
|
||||||
|
the suitability of this software for any purpose. It is
|
||||||
|
provided "as is" without express or implied warranty.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
32
util/ipx_sap_types
Normal file
32
util/ipx_sap_types
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
0001 User
|
||||||
|
0002 User Group
|
||||||
|
0003 Print Queue
|
||||||
|
0004 File Server
|
||||||
|
0005 Job Server
|
||||||
|
0006 Gateway
|
||||||
|
0007 Print Server
|
||||||
|
0008 Archive Server
|
||||||
|
0009 Archive Server
|
||||||
|
000A Job Queue
|
||||||
|
000B Administration
|
||||||
|
0021 NAS SNA Gateway
|
||||||
|
0024 Remote Bridge
|
||||||
|
0026 Bridge Server
|
||||||
|
0027 TCP/IP Gateway
|
||||||
|
002D Time Synchronization VAP
|
||||||
|
002E Archive Server Dynamic SAP
|
||||||
|
0047 Advertising Print Server
|
||||||
|
004B Btrieve VAP 5.0
|
||||||
|
0050 Btrieve VAP
|
||||||
|
0053 Print Queue User
|
||||||
|
007A TES NetWare for VMS
|
||||||
|
0098 NetWare Access Server
|
||||||
|
009A Named Pipe Server
|
||||||
|
009E Portable NetWare Unix
|
||||||
|
0107 NetWare 386
|
||||||
|
0111 Test Server
|
||||||
|
0133 NetWare Name Service
|
||||||
|
0166 NetWare Management
|
||||||
|
026A NetWare Management
|
||||||
|
026B Time Server (NetWare 4.0)
|
||||||
|
0278 NetWare Directory Server (NetWare 4.0)
|
||||||
849
util/ncopy.c
Normal file
849
util/ncopy.c
Normal file
@@ -0,0 +1,849 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* ncopy.c
|
||||||
|
*
|
||||||
|
* Copy file on a Netware server without Network Traffic
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Brian Reid and Tom Henderson.
|
||||||
|
*
|
||||||
|
* Send bug reports for ncopy to "breid@tim.com"
|
||||||
|
*
|
||||||
|
* Still to do: support recursive copy with two arguments
|
||||||
|
* Both must be directories. (similar to rcp -r)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <mntent.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include "ncplib.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct NCPMountRec
|
||||||
|
{
|
||||||
|
char *mountDir;
|
||||||
|
char *server;
|
||||||
|
struct ncp_conn *conn;
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Globals:
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
const char *VersionStr = "0.1";
|
||||||
|
char * ProgramName;
|
||||||
|
|
||||||
|
struct NCPMountRec *NcpMountTable = NULL;
|
||||||
|
int ncpCount = 0;
|
||||||
|
|
||||||
|
/* (initialized) command options */
|
||||||
|
|
||||||
|
int optVersion=0; /* -V TRUE if just want version */
|
||||||
|
int optVerbose=0; /* -v TRUE if want verbose output */
|
||||||
|
int optNice=0; /* -n TRUE if we are cooperative (nice) */
|
||||||
|
int optNiceFactorSel=0; /* -s TRUE if we selected a nice factor */
|
||||||
|
int optNiceFactor=10; /* -s arg, number of 100K blocks to copy
|
||||||
|
before sleeping for a second */
|
||||||
|
__u32 CopyBlockSize = 100000; /* Size of the default block copy size */
|
||||||
|
unsigned int NiceSleepTime=1; /* Number of seconds to sleep in Nice Mode */
|
||||||
|
|
||||||
|
int BlocksCopied=0; /* Number of blocks copied */
|
||||||
|
int MaxNcopyRetries=25; /* Maximum number of times to retry a failed
|
||||||
|
copy before giving up */
|
||||||
|
|
||||||
|
/* Globals needed for signal handlers */
|
||||||
|
int OutputOpen=0; /* True if the ncp output file is open */
|
||||||
|
struct ncp_conn *CurrentConn = NULL; /* Connection of output file */
|
||||||
|
struct ncp_file_info *CurrentFile = NULL; /* File info of output file */
|
||||||
|
|
||||||
|
/* Signal control structures */
|
||||||
|
static struct sigaction sHangupSig;
|
||||||
|
static struct sigaction sInterruptSig;
|
||||||
|
static struct sigaction sQuitSig;
|
||||||
|
static struct sigaction sTermSig;
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static void usage()
|
||||||
|
{
|
||||||
|
fprintf(stderr,"usage: %s [-V]\n", ProgramName);
|
||||||
|
fprintf(stderr," %s [-vn] [-s amt] sourcefile destinationfile|directory\n", ProgramName);
|
||||||
|
fprintf(stderr," %s [-vn] [-s amt] sourcefile [...] directory\n", ProgramName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Return pointer to last component of the path.
|
||||||
|
* Returned string may have one or more "/" left on the end.
|
||||||
|
* ("/" returns pointer to "/", null returns pointer to null)
|
||||||
|
* Return pointer to original string if no "/" in string. (except at end)
|
||||||
|
*/
|
||||||
|
static const char *myBaseName(const char *path)
|
||||||
|
{
|
||||||
|
const char *p;
|
||||||
|
|
||||||
|
for(p = &path[strlen(path)]; p != path; p--) { /* skip ENDING "/" chars */
|
||||||
|
if(*p && *p != '/') break;
|
||||||
|
}
|
||||||
|
if(p==path) return p;
|
||||||
|
for( ; p != path || *p == '/'; p--) {
|
||||||
|
if(*p == '/') return ++p;
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static const char *notDir(const char *path)
|
||||||
|
{
|
||||||
|
struct stat buf;
|
||||||
|
static const char *notDirectory="not a directory";
|
||||||
|
|
||||||
|
if(stat(path, &buf)) return strerror(errno); /* no permission? not exist? */
|
||||||
|
if(!S_ISDIR(buf.st_mode)) return notDirectory; /* not a directory */
|
||||||
|
return (char *) 0; /* OK */
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static int handleOptions(const int argc, char * const argv[])
|
||||||
|
{
|
||||||
|
int opt;
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "vVns:")) != EOF)
|
||||||
|
{
|
||||||
|
switch (opt) {
|
||||||
|
|
||||||
|
case 'V': /* Version */
|
||||||
|
optVersion=1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'v': /* Verbose output */
|
||||||
|
optVerbose=1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'n': /* Nice, cooperative copy */
|
||||||
|
optNice=1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 's': /* Nice Factor */
|
||||||
|
optNiceFactorSel=1;
|
||||||
|
optNiceFactor=atoi(optarg);
|
||||||
|
if (optNiceFactor < 1) {
|
||||||
|
fprintf(stderr,"%s: -s option requires positive numeric argument > 0\n",
|
||||||
|
ProgramName);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: /* invalid options or options without required arguments */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* TODO: if recursive flag last MUST be a directory, even if only 2 args.
|
||||||
|
*/
|
||||||
|
static int validateFileArgs(const int argc, char * const argv[])
|
||||||
|
{
|
||||||
|
const char *p;
|
||||||
|
if (argc == 0) {
|
||||||
|
fprintf(stderr,"%s: No arguments specified.\n", ProgramName);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if(argc == 1) {
|
||||||
|
fprintf(stderr,"%s: No destination specified.\n", ProgramName);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if((argc > 2) && (p=notDir(argv[argc-1]))) { /* last arg MUST be dir */
|
||||||
|
fprintf(stderr,"%s: %s: %s\n", ProgramName, argv[argc-1], p);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Duplicate a string.
|
||||||
|
*/
|
||||||
|
char *duplicateStr(const char *InStr)
|
||||||
|
{
|
||||||
|
char *dup;
|
||||||
|
if (!InStr) return NULL;
|
||||||
|
dup = (char*)malloc(strlen(InStr)+1);
|
||||||
|
if (dup)
|
||||||
|
strcpy(dup,InStr);
|
||||||
|
return dup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* load a table of ncpfs mount points.
|
||||||
|
*/
|
||||||
|
int loadMountTable()
|
||||||
|
{
|
||||||
|
FILE *mountedFile;
|
||||||
|
struct mntent *mountEntry = NULL;
|
||||||
|
ncpCount = 0;
|
||||||
|
if ( (mountedFile = fopen(MOUNTED,"r")) == NULL) {
|
||||||
|
fprintf(stderr,"ncopy: cannot open %s, %s\n",MOUNTED,strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ( (mountEntry = getmntent(mountedFile)) != NULL) {
|
||||||
|
if (!strcmp(mountEntry->mnt_type,"ncpfs"))
|
||||||
|
ncpCount++;
|
||||||
|
}
|
||||||
|
if (ncpCount) {
|
||||||
|
NcpMountTable = (struct NCPMountRec*)
|
||||||
|
malloc(ncpCount * sizeof(struct NCPMountRec));
|
||||||
|
if (!NcpMountTable) {
|
||||||
|
fprintf(stderr,"Out of memory\n");
|
||||||
|
fclose(mountedFile);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
fseek(mountedFile,0,SEEK_SET);
|
||||||
|
ncpCount = 0;
|
||||||
|
while ( (mountEntry = getmntent(mountedFile)) != NULL) {
|
||||||
|
if (!strcmp(mountEntry->mnt_type,"ncpfs")) {
|
||||||
|
NcpMountTable[ncpCount].mountDir = duplicateStr(mountEntry->mnt_dir);
|
||||||
|
NcpMountTable[ncpCount].server =
|
||||||
|
duplicateStr(mountEntry->mnt_fsname);
|
||||||
|
NcpMountTable[ncpCount].conn = NULL;
|
||||||
|
ncpCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(mountedFile);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Releases the table of ncpfs mount points.
|
||||||
|
*/
|
||||||
|
void releaseMountTable()
|
||||||
|
{
|
||||||
|
int loop;
|
||||||
|
if (!ncpCount) return;
|
||||||
|
for (loop = ncpCount; loop; loop--,ncpCount--) {
|
||||||
|
if (NcpMountTable[loop-1].conn) {
|
||||||
|
ncp_close(NcpMountTable[loop-1].conn);
|
||||||
|
NcpMountTable[loop-1].conn = NULL;
|
||||||
|
}
|
||||||
|
free(NcpMountTable[loop-1].server);
|
||||||
|
free(NcpMountTable[loop-1].mountDir);
|
||||||
|
}
|
||||||
|
free(NcpMountTable);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Finds the index into the mount point table that enables ncp copy for
|
||||||
|
* the file.
|
||||||
|
* Returns -1 if the files do not reference the same server.
|
||||||
|
*/
|
||||||
|
int ncpIndex(const char *InputFile, const char *OutputFile)
|
||||||
|
{
|
||||||
|
int loop;
|
||||||
|
char *mountDir;
|
||||||
|
if (!ncpCount) return -1;
|
||||||
|
|
||||||
|
for (loop = 0; loop < ncpCount; loop++) {
|
||||||
|
mountDir = NcpMountTable[loop].mountDir;
|
||||||
|
if (!strncmp(mountDir,InputFile,strlen(mountDir)) &&
|
||||||
|
!strncmp(mountDir,OutputFile,strlen(mountDir))) return loop;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Does a regular buffered file copy.
|
||||||
|
* This is used if we cannot use the Netware file copy.
|
||||||
|
*/
|
||||||
|
int normalFileCopy(const char *InputFile, const char *OutputFile,
|
||||||
|
char *Buffer,int BufferSize,
|
||||||
|
const char *paramInputFile,
|
||||||
|
const char *paramOutputFile)
|
||||||
|
{
|
||||||
|
int fdIn, fdOut;
|
||||||
|
long fileSize,totalSize;
|
||||||
|
struct stat statBuf;
|
||||||
|
fdIn = open(InputFile,O_RDONLY);
|
||||||
|
if (fdIn == -1) {
|
||||||
|
fprintf(stderr,"%s: Cannot open %s, %s\n",ProgramName,paramInputFile,
|
||||||
|
strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (fstat(fdIn,&statBuf)) {
|
||||||
|
fprintf(stderr,"%s: Cannot stat %s, %s\n",ProgramName,paramInputFile,
|
||||||
|
strerror(errno));
|
||||||
|
close(fdIn);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if(S_ISDIR(statBuf.st_mode)) {
|
||||||
|
close(fdIn);
|
||||||
|
fprintf(stderr,"%s: %s: omitting directory\n",ProgramName,paramInputFile);
|
||||||
|
return 0; /* At this point, don't consider this a fatal error */
|
||||||
|
}
|
||||||
|
|
||||||
|
fdOut = open(OutputFile,O_CREAT | O_TRUNC | O_WRONLY,statBuf.st_mode);
|
||||||
|
if (fdOut == -1) {
|
||||||
|
fprintf(stderr,"%s: Cannot create %s, %s\n",ProgramName,paramOutputFile,
|
||||||
|
strerror(errno));
|
||||||
|
close(fdIn);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
fileSize = lseek(fdIn,0,SEEK_END);
|
||||||
|
if (fileSize < 0) {
|
||||||
|
fprintf(stderr,"%s: lseek error on %s, %s\n",ProgramName,paramInputFile,
|
||||||
|
strerror(errno));
|
||||||
|
close(fdOut);
|
||||||
|
close(fdIn);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
lseek(fdIn,0,SEEK_SET);
|
||||||
|
if (optVerbose) {
|
||||||
|
printf("Normal copy: %s -> %s 0%%",paramInputFile,paramOutputFile);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
totalSize = fileSize;
|
||||||
|
while (fileSize) {
|
||||||
|
int currentMove;
|
||||||
|
int writeAmt;
|
||||||
|
currentMove = (fileSize > BufferSize) ? BufferSize : fileSize;
|
||||||
|
if (read(fdIn,Buffer,currentMove) != currentMove) {
|
||||||
|
fprintf(stderr,"%s: Error reading %s, %s\n",ProgramName,paramInputFile,
|
||||||
|
strerror(errno));
|
||||||
|
close(fdIn);
|
||||||
|
close(fdOut);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
writeAmt = write(fdOut,Buffer,currentMove);
|
||||||
|
if (writeAmt < 0) {
|
||||||
|
fprintf(stderr,"%s: Error writing %s, %s\n",ProgramName,paramOutputFile,
|
||||||
|
strerror(errno));
|
||||||
|
close(fdIn);
|
||||||
|
close(fdOut);
|
||||||
|
return 1;
|
||||||
|
} else if (writeAmt == 0) {
|
||||||
|
fprintf(stderr,"%s: Out of space on destination device writing %s\n",
|
||||||
|
ProgramName,OutputFile);
|
||||||
|
close(fdIn);
|
||||||
|
close(fdOut);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
fileSize -= currentMove;
|
||||||
|
if (optVerbose) {
|
||||||
|
printf("\rNormal copy: %s -> %s %ld%%",paramInputFile,paramOutputFile,(100 - (fileSize * 100/totalSize)));
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(fdOut);
|
||||||
|
close(fdIn);
|
||||||
|
if (optVerbose)
|
||||||
|
printf("\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Converts a string to upper case.
|
||||||
|
* Netware file names need to be all upper case.
|
||||||
|
*/
|
||||||
|
char *upString(char *str)
|
||||||
|
{
|
||||||
|
char *alias = str;
|
||||||
|
while (*alias) {
|
||||||
|
*alias = toupper(*alias);
|
||||||
|
++alias;
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Locates the first occurrance of a single character in the input string.
|
||||||
|
* returns -1 if the character is not found.
|
||||||
|
*/
|
||||||
|
int stringPosition(const char *str,char token)
|
||||||
|
{
|
||||||
|
const char *alias = str;
|
||||||
|
while (*alias) {
|
||||||
|
if (*alias == token) return alias - str;
|
||||||
|
alias++;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Walks up the directory path building info structures along the way
|
||||||
|
* in order to get a dir_handle.
|
||||||
|
* This will mangle the input "FileString", leaving just the file name
|
||||||
|
* component in it when it is finished.
|
||||||
|
*/
|
||||||
|
int getDirHandle(struct ncp_conn *conn, char *FileString, __u8 *NewDirHandle)
|
||||||
|
{
|
||||||
|
struct nw_info_struct info1,info2;
|
||||||
|
int currentLevel = 0;
|
||||||
|
int k;
|
||||||
|
struct nw_info_struct *parentInfo = NULL;
|
||||||
|
struct nw_info_struct *currentInfo = NULL;
|
||||||
|
|
||||||
|
while ( (k = stringPosition(FileString,'/')) >= 0) {
|
||||||
|
FileString[k] = 0;
|
||||||
|
if (!currentLevel) {
|
||||||
|
parentInfo = NULL;
|
||||||
|
currentInfo = &info1;
|
||||||
|
} else if (currentLevel % 2) {
|
||||||
|
parentInfo = &info1;
|
||||||
|
currentInfo = &info2;
|
||||||
|
} else {
|
||||||
|
parentInfo = &info2;
|
||||||
|
currentInfo = &info1;
|
||||||
|
}
|
||||||
|
if (ncp_do_lookup(conn, parentInfo, FileString,
|
||||||
|
currentInfo) != 0) {
|
||||||
|
fprintf(stderr,"%s: Ncp lookup failed on directory %s--%s\n",
|
||||||
|
ProgramName,FileString,strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
++currentLevel;
|
||||||
|
memmove(FileString,FileString+k+1,strlen(FileString+k+1)+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_alloc_short_dir_handle(conn, currentInfo, NCP_ALLOC_TEMPORARY,
|
||||||
|
NewDirHandle) != 0) {
|
||||||
|
fprintf(stderr,"%s: Ncp alloc dir handle failed--%s\n",
|
||||||
|
ProgramName,strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Interfaces with the ncplib to do the netware copy of the file.
|
||||||
|
*/
|
||||||
|
int netwareCopyFile(int ncpMountIndex, const char *sourcefile,
|
||||||
|
const char *destfile,
|
||||||
|
const char *paramInputFile,
|
||||||
|
const char *paramOutputFile)
|
||||||
|
{
|
||||||
|
__u8 source_dir_handle;
|
||||||
|
__u8 dest_dir_handle;
|
||||||
|
struct ncp_file_info source_file;
|
||||||
|
struct ncp_file_info dest_file;
|
||||||
|
__u32 amountCopied;
|
||||||
|
__u32 amtLeft;
|
||||||
|
__u32 totalSize;
|
||||||
|
__u32 sourceOff;
|
||||||
|
__u32 thisMove;
|
||||||
|
int stroffset;
|
||||||
|
int retValue;
|
||||||
|
char *sourceDup;
|
||||||
|
char *destDup;
|
||||||
|
struct ncp_conn *sourceconn;
|
||||||
|
int retryCount;
|
||||||
|
long err = 0;
|
||||||
|
|
||||||
|
/* Establish a connection to a Netware mount point if
|
||||||
|
one is not already established. */
|
||||||
|
if (!NcpMountTable[ncpMountIndex].conn) {
|
||||||
|
NcpMountTable[ncpMountIndex].conn =
|
||||||
|
ncp_open_mount(NcpMountTable[ncpMountIndex].mountDir,&err);
|
||||||
|
if (err) {
|
||||||
|
com_err(ProgramName,err,"opening ncp connection on mount point %s",
|
||||||
|
NcpMountTable[ncpMountIndex].mountDir);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sourceconn = NcpMountTable[ncpMountIndex].conn;
|
||||||
|
|
||||||
|
/* Duplicate and upper case the file names so we do not trample
|
||||||
|
on the input strings */
|
||||||
|
stroffset = strlen(NcpMountTable[ncpMountIndex].mountDir) + 1;
|
||||||
|
sourceDup = duplicateStr(sourcefile+stroffset);
|
||||||
|
destDup = duplicateStr(destfile+stroffset);
|
||||||
|
if (!sourceDup || !destDup) {
|
||||||
|
fprintf(stderr,"%s: Malloc failed duplicating file names\n",
|
||||||
|
ProgramName);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
upString(sourceDup);
|
||||||
|
upString(destDup);
|
||||||
|
|
||||||
|
/* Get Handles to the input and output directories */
|
||||||
|
if (getDirHandle(sourceconn,sourceDup,&source_dir_handle) ||
|
||||||
|
getDirHandle(sourceconn,destDup,&dest_dir_handle)) {
|
||||||
|
free(sourceDup);
|
||||||
|
free(destDup);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Open the input and output files. */
|
||||||
|
if (ncp_open_file(sourceconn, source_dir_handle, sourceDup,0,AR_READ,
|
||||||
|
&source_file) != 0) {
|
||||||
|
fprintf(stderr,"%s: Cannot open %s--%s\n",
|
||||||
|
ProgramName,paramInputFile,strerror(errno));
|
||||||
|
free(sourceDup);
|
||||||
|
free(destDup);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_create_file(sourceconn, dest_dir_handle, destDup,
|
||||||
|
source_file.file_attributes, &dest_file) != 0) {
|
||||||
|
fprintf(stderr,"%s: Cannot create %s--%s\n",ProgramName, paramOutputFile,
|
||||||
|
strerror(errno));
|
||||||
|
ncp_close_file(sourceconn,source_file.file_id);
|
||||||
|
free(sourceDup);
|
||||||
|
free(destDup);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/* Set globals in case a signal happens while copying */
|
||||||
|
CurrentConn = sourceconn;
|
||||||
|
CurrentFile = &dest_file;
|
||||||
|
OutputOpen = 1;
|
||||||
|
|
||||||
|
free(sourceDup);
|
||||||
|
free(destDup);
|
||||||
|
|
||||||
|
retValue = 0;
|
||||||
|
if (optVerbose) {
|
||||||
|
printf("NetWare copy: %s -> %s 0%%",paramInputFile,paramOutputFile);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The main copy loop. */
|
||||||
|
|
||||||
|
amtLeft = totalSize = source_file.file_length;
|
||||||
|
sourceOff = 0;
|
||||||
|
retryCount = 0;
|
||||||
|
|
||||||
|
while (amtLeft && retryCount < MaxNcopyRetries) {
|
||||||
|
int ncopyRetValue;
|
||||||
|
if (amtLeft > CopyBlockSize)
|
||||||
|
thisMove = CopyBlockSize;
|
||||||
|
else
|
||||||
|
thisMove = amtLeft;
|
||||||
|
/* If we are being nice and we've copied enough blocks, go to sleep */
|
||||||
|
if (optNice) {
|
||||||
|
if (BlocksCopied == optNiceFactor) {
|
||||||
|
sleep(NiceSleepTime);
|
||||||
|
BlocksCopied=0;
|
||||||
|
} else
|
||||||
|
++BlocksCopied;
|
||||||
|
}
|
||||||
|
ncopyRetValue = ncp_copy_file(sourceconn, source_file.file_id,
|
||||||
|
dest_file.file_id, sourceOff,sourceOff,
|
||||||
|
thisMove,&amountCopied);
|
||||||
|
if (ncopyRetValue != 0) {
|
||||||
|
/* In my testing this only happens when you run out of space
|
||||||
|
on the server.
|
||||||
|
Netware seems to wait a bit before reporting space recently
|
||||||
|
free'd. I will just wait a bit before bombin */
|
||||||
|
sleep(1); /* Sleep for a second and try again */
|
||||||
|
retryCount++;
|
||||||
|
amountCopied = thisMove = 0;
|
||||||
|
}
|
||||||
|
if (amountCopied != thisMove) {
|
||||||
|
fprintf(stderr,"%s: Warning, amountCopied (%u) != thisMove (%u)\n",
|
||||||
|
ProgramName,(unsigned int)amountCopied,(unsigned int)thisMove);
|
||||||
|
}
|
||||||
|
#ifdef NCOPY_DEBUG
|
||||||
|
fprintf(stderr,"Copied %u (actual %u)\n",(unsigned int)thisMove,
|
||||||
|
(unsigned int)amountCopied);
|
||||||
|
#endif
|
||||||
|
amtLeft -= amountCopied;
|
||||||
|
sourceOff += amountCopied;
|
||||||
|
if (optVerbose) {
|
||||||
|
printf("\rNetWare copy: %s -> %s %ld%%",paramInputFile,paramOutputFile,
|
||||||
|
(100 - (long)((float)amtLeft /(float)totalSize * 100.0)));
|
||||||
|
if (retryCount)
|
||||||
|
printf(" %d retries",retryCount);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (retryCount >= MaxNcopyRetries)
|
||||||
|
retValue = 1;
|
||||||
|
if (optVerbose)
|
||||||
|
printf("\n");
|
||||||
|
if (ncp_close_file(sourceconn,dest_file.file_id) != 0) {
|
||||||
|
fprintf(stderr,"%s: Close failed for %s\n",ProgramName,paramOutputFile);
|
||||||
|
retValue = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear signal handling globals */
|
||||||
|
OutputOpen = 0;
|
||||||
|
CurrentConn = NULL;
|
||||||
|
CurrentFile = NULL;
|
||||||
|
|
||||||
|
if (ncp_close_file(sourceconn,source_file.file_id) != 0) {
|
||||||
|
fprintf(stderr,"%s: Close failed for %s\n",ProgramName,paramInputFile);
|
||||||
|
retValue = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_dealloc_dir_handle(sourceconn, dest_dir_handle) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%s: Dealloc dir handle error for %s\n",ProgramName,
|
||||||
|
paramOutputFile);
|
||||||
|
retValue = 1;
|
||||||
|
}
|
||||||
|
if (ncp_dealloc_dir_handle(sourceconn, source_dir_handle) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%s: Dealloc dir handle error for %s\n",ProgramName,
|
||||||
|
paramInputFile);
|
||||||
|
retValue = 1;
|
||||||
|
}
|
||||||
|
return retValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Decides whether to use the traditional file copy or the netware remote
|
||||||
|
* file copy.
|
||||||
|
*/
|
||||||
|
int copyFiles(const char *realsource, const char *realdestination,
|
||||||
|
const char *paraminputfile, const char *paramoutputfile)
|
||||||
|
{
|
||||||
|
int oldUMask;
|
||||||
|
char fileBuffer[24000];
|
||||||
|
int retVal = 0;
|
||||||
|
int ncpMountIndex = ncpIndex(realsource,realdestination);
|
||||||
|
#ifdef NCOPY_DEBUG
|
||||||
|
printf("Real Source '%s'\n"
|
||||||
|
"Real Dest '%s'\n"
|
||||||
|
"Param Src '%s'\n"
|
||||||
|
"Param Dest '%s'\n",realsource,realdestination,paraminputfile,
|
||||||
|
paramoutputfile);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
oldUMask = umask(0);
|
||||||
|
if (ncpMountIndex < 0)
|
||||||
|
retVal = normalFileCopy(realsource,realdestination,fileBuffer,
|
||||||
|
sizeof(fileBuffer),
|
||||||
|
paraminputfile,paramoutputfile);
|
||||||
|
else
|
||||||
|
retVal = netwareCopyFile(ncpMountIndex,realsource,realdestination,
|
||||||
|
paraminputfile,paramoutputfile);
|
||||||
|
umask(oldUMask);
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* HERE
|
||||||
|
*
|
||||||
|
* Brian may NEED "fake" path if he prints error messages?
|
||||||
|
* or I may need a way to get his error messages so I can
|
||||||
|
* print them with the "fake" path.
|
||||||
|
* My current error messages are on the REAL path, which would be confusing...
|
||||||
|
*
|
||||||
|
* (1-source problem, 2-destination problem, 3-other fatal)
|
||||||
|
* We need to decide when to exit or continue the loop,
|
||||||
|
* and what to return when we do exit the loop.
|
||||||
|
* Is it failure if 3 files are to be copied, and 1 fails?
|
||||||
|
* If one copy fails, we stay in the loop, right?
|
||||||
|
* Is it failure if destination fails?
|
||||||
|
* Do we Stay in the loop?
|
||||||
|
*/
|
||||||
|
static int copyRealPaths(const char *source, const char *destination)
|
||||||
|
{
|
||||||
|
char realsource[MAXPATHLEN*2];
|
||||||
|
char realdestination[MAXPATHLEN*2];
|
||||||
|
char dirPart[MAXPATHLEN+1];
|
||||||
|
char filePart[MAXPATHLEN+1];
|
||||||
|
const char *p;
|
||||||
|
|
||||||
|
if(realpath(source, realsource) == 0) { /* the source must at least exist */
|
||||||
|
fprintf(stderr,"%s: %s: %s\n",
|
||||||
|
ProgramName, source, strerror(errno));
|
||||||
|
return 1; /* indicate a "source" problem */
|
||||||
|
}
|
||||||
|
if(realpath(destination, realdestination) == 0) {/* dest file missing? OK */
|
||||||
|
strncpy(dirPart, destination, MAXPATHLEN); /* but "dirpart" must work */
|
||||||
|
dirPart[MAXPATHLEN] = 0;
|
||||||
|
p=myBaseName(dirPart);
|
||||||
|
strcpy(filePart, p);
|
||||||
|
dirPart[p - dirPart] = 0; /* isolates "directory" part from "file part" */
|
||||||
|
if(realpath(dirPart, realdestination) == 0) {
|
||||||
|
fprintf(stderr,"%s: %s: %s\n",
|
||||||
|
ProgramName, dirPart, strerror(errno));
|
||||||
|
return 2; /* indicate a "destination" problem */
|
||||||
|
}
|
||||||
|
if(*realdestination != '/' || *(realdestination+1)) strcat(realdestination, "/");
|
||||||
|
strcat(realdestination, filePart);
|
||||||
|
}
|
||||||
|
/* becomes prog exit code */
|
||||||
|
|
||||||
|
/* Test Cases: (Where file/dir may or may not exist)
|
||||||
|
* "", file, file/, dir, dir/
|
||||||
|
* /, //, /dir, /dir/, /file, /file/,
|
||||||
|
* /tmp/file, /tmp/file/, tmp/file, tmp/file/,
|
||||||
|
* /tmp/dir, /tmp/dir/, tmp/dir, tmp/dir/
|
||||||
|
*/
|
||||||
|
return copyFiles(realsource, realdestination,source,destination);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* guaranteed argc is at least 2 and
|
||||||
|
* if argc > 2 last parameter is a directory
|
||||||
|
* by validateFileArgs()
|
||||||
|
*/
|
||||||
|
static int handleFileArgs(int argc, char * const argv[])
|
||||||
|
{
|
||||||
|
int loop;
|
||||||
|
const char *destination;
|
||||||
|
int copyStatus;
|
||||||
|
int returnCode=0; /* default program exit code */
|
||||||
|
const char *baseNamePtr;
|
||||||
|
char destinationfile[MAXPATHLEN*2];
|
||||||
|
|
||||||
|
destination=argv[argc-1]; /* get LAST argument */
|
||||||
|
for (loop = 0; loop < (argc-1); loop++) { /* all file arguments, but last */
|
||||||
|
strncpy(destinationfile, destination, MAXPATHLEN);
|
||||||
|
destinationfile[MAXPATHLEN]=0;
|
||||||
|
if((argc > 2) || (!notDir(argv[argc-1]))) { /* destination is a dir */
|
||||||
|
if(*destinationfile != '/' || *(destinationfile+1)) strcat(destinationfile,"/");
|
||||||
|
baseNamePtr=myBaseName(argv[loop]); /* get the file name */
|
||||||
|
strcat(destinationfile,baseNamePtr); /* add it on end of directory */
|
||||||
|
}
|
||||||
|
copyStatus=copyRealPaths(argv[loop], destinationfile); /* do the copy */
|
||||||
|
if(copyStatus > 1) return copyStatus; /* fatal failure? bye */
|
||||||
|
if(copyStatus == 1) returnCode=1; /* a partial failure? we can continue */
|
||||||
|
}
|
||||||
|
return returnCode; /* return what will be the program exit code */
|
||||||
|
}
|
||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static void handleSignals(int sigNumber)
|
||||||
|
{
|
||||||
|
/* Ignore Signal Handling while cleaning up */
|
||||||
|
|
||||||
|
/* SIGHUP */
|
||||||
|
sHangupSig.sa_handler=SIG_IGN;
|
||||||
|
if(sigaction(SIGHUP, &sHangupSig, NULL) == -1) {
|
||||||
|
fprintf(stderr,"%s: Reset to ignore SIGHUP signal failed: %s",
|
||||||
|
ProgramName, strerror(errno));
|
||||||
|
}
|
||||||
|
/* SIGINT */
|
||||||
|
sInterruptSig.sa_handler=SIG_IGN;
|
||||||
|
if(sigaction(SIGINT, &sInterruptSig, NULL) == -1) {
|
||||||
|
fprintf(stderr,"%s: Reset to ignore SIGINT signal failed: %s",
|
||||||
|
ProgramName, strerror(errno));
|
||||||
|
}
|
||||||
|
/* SIGQUIT */
|
||||||
|
sQuitSig.sa_handler=SIG_IGN;
|
||||||
|
if(sigaction(SIGQUIT, &sQuitSig, NULL) == -1) {
|
||||||
|
fprintf(stderr,"%s: Reset to ignore SIGQUIT signal failed: %s",
|
||||||
|
ProgramName, strerror(errno));
|
||||||
|
}
|
||||||
|
/* SIGTERM */
|
||||||
|
sTermSig.sa_handler=SIG_IGN;
|
||||||
|
if(sigaction(SIGTERM, &sTermSig, NULL) == -1) {
|
||||||
|
fprintf(stderr,"%s: Reset to ignore SIGTERM signal failed: %s",
|
||||||
|
ProgramName, strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we don't close the ncp output file, we have to ncpumount and
|
||||||
|
ncpmount before we can get rid of it. */
|
||||||
|
if (OutputOpen) {
|
||||||
|
/* Issue a warning if we cannot close the file */
|
||||||
|
/* If an error occurs we probably have to umount/mount to
|
||||||
|
remove the file */
|
||||||
|
if (ncp_close_file(CurrentConn,CurrentFile->file_id) != 0) {
|
||||||
|
fprintf(stderr,"%s: unclean close of output file",ProgramName);
|
||||||
|
}
|
||||||
|
OutputOpen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(128 + sigNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* We'll trap Hangup, Interrupt, Quit or Terminate
|
||||||
|
*/
|
||||||
|
static int trapSignals()
|
||||||
|
{
|
||||||
|
if(sigaction(SIGHUP, NULL, &sHangupSig)) { /* init structure fields */
|
||||||
|
fprintf(stderr,"%s: Get HANGUP signal action failed: %s",
|
||||||
|
ProgramName, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
sHangupSig.sa_handler = handleSignals;
|
||||||
|
if(sigaction(SIGHUP, &sHangupSig, NULL) == -1) {
|
||||||
|
fprintf(stderr,"%s: Reset HANGUP signal action failed: %s",
|
||||||
|
ProgramName, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if(sigaction(SIGINT, NULL, &sInterruptSig)) { /* init structure fields */
|
||||||
|
fprintf(stderr,"%s: Get INTERRUPT signal action failed: %s",
|
||||||
|
ProgramName, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
sInterruptSig.sa_handler = handleSignals;
|
||||||
|
if(sigaction(SIGINT, &sInterruptSig, NULL) == -1) {
|
||||||
|
fprintf(stderr,"%s: Reset INTERRUPT signal action failed: %s",
|
||||||
|
ProgramName, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if(sigaction(SIGQUIT, NULL, &sQuitSig)) { /* init structure fields */
|
||||||
|
fprintf(stderr,"%s: Get QUIT signal action failed: %s",
|
||||||
|
ProgramName, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
sQuitSig.sa_handler = handleSignals;
|
||||||
|
if(sigaction(SIGQUIT, &sQuitSig, NULL) == -1) {
|
||||||
|
fprintf(stderr,"%s: Reset QUIT signal action failed: %s",
|
||||||
|
ProgramName, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if(sigaction(SIGTERM, NULL, &sTermSig)) { /* init structure fields */
|
||||||
|
fprintf(stderr,"%s: Get TERMINATE signal action failed: %s",
|
||||||
|
ProgramName, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
sTermSig.sa_handler = handleSignals;
|
||||||
|
if(sigaction(SIGTERM, &sTermSig, NULL) == -1) {
|
||||||
|
fprintf(stderr,"%s: Reset TERMINATE signal action failed: %s",
|
||||||
|
ProgramName, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int main(int argc, char * const argv[])
|
||||||
|
{
|
||||||
|
int returnCode;
|
||||||
|
ProgramName=argv[0];
|
||||||
|
|
||||||
|
if(handleOptions(argc, argv)) { /* bad option, missing option parameter */
|
||||||
|
usage();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if(optVersion) { /* only option not requiring any arguments */
|
||||||
|
printf("%s version %s\n", ProgramName, VersionStr);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(validateFileArgs(argc - optind, argv + optind)) {
|
||||||
|
usage();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if(trapSignals()) return 1;
|
||||||
|
loadMountTable();
|
||||||
|
returnCode = handleFileArgs(argc - optind, argv + optind);
|
||||||
|
releaseMountTable();
|
||||||
|
return returnCode;
|
||||||
|
}
|
||||||
1628
util/ncplib.c
1628
util/ncplib.c
File diff suppressed because it is too large
Load Diff
315
util/ncplib.h
315
util/ncplib.h
@@ -17,6 +17,7 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include "ipxlib.h"
|
#include "ipxlib.h"
|
||||||
|
#include "com_err.h"
|
||||||
|
|
||||||
#ifndef memzero
|
#ifndef memzero
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -78,46 +79,51 @@ struct ncp_search_seq {
|
|||||||
int namespace;
|
int namespace;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ncp_property_info {
|
||||||
|
__u8 property_name[16];
|
||||||
|
__u8 property_flags;
|
||||||
|
__u8 property_security;
|
||||||
|
__u32 search_instance;
|
||||||
|
__u8 value_available_flag;
|
||||||
|
__u8 more_properties_flag;
|
||||||
|
};
|
||||||
|
|
||||||
/* ncp_initialize is the main entry point for user programs which want
|
/* ncp_initialize is the main entry point for user programs which want
|
||||||
to connect to a NetWare Server. It looks for -S, -U, -P and -n in
|
to connect to a NetWare Server. It looks for -S, -U, -P and -n in
|
||||||
the argument list, opens the connection and removes the arguments
|
the argument list, opens the connection and removes the arguments
|
||||||
from the list. It was designed after the X Windows init
|
from the list. It was designed after the X Windows init
|
||||||
functions. */
|
functions. */
|
||||||
int
|
struct ncp_conn *
|
||||||
ncp_initialize(struct ncp_conn *conn,
|
ncp_initialize(int *argc, char **argv,
|
||||||
int *argc, char **argv,
|
int login_necessary, long *err);
|
||||||
int login_necessary);
|
|
||||||
|
|
||||||
/* You can login as another object by this procedure. As a first use
|
/* You can login as another object by this procedure. As a first use
|
||||||
pserver comes to mind. */
|
pserver comes to mind. */
|
||||||
int
|
struct ncp_conn *
|
||||||
ncp_initialize_as(struct ncp_conn *conn,
|
ncp_initialize_as(int *argc, char **argv,
|
||||||
int *argc, char **argv,
|
int login_necessary, int login_type, long *err);
|
||||||
int login_necessary, int login_type);
|
|
||||||
|
|
||||||
|
|
||||||
/* Open an existing permanent connection */
|
/* Open a connection */
|
||||||
int
|
struct ncp_conn *
|
||||||
ncp_open(struct ncp_conn *conn,
|
ncp_open(const struct ncp_conn_spec *spec, long *err);
|
||||||
const struct ncp_conn_spec *spec);
|
|
||||||
|
|
||||||
/* Open a connection on an existing mount point */
|
/* Open a connection on an existing mount point */
|
||||||
int
|
struct ncp_conn *
|
||||||
ncp_open_mount(struct ncp_conn *conn,
|
ncp_open_mount(const char *mount_point, long *err);
|
||||||
const char *mount_point);
|
|
||||||
|
|
||||||
/* Detach from and destroy a permanent connection */
|
/* Find a permanent connection that fits the spec, return NULL if
|
||||||
int
|
* there is none. */
|
||||||
ncp_destroy_permanent(struct ncp_conn *conn);
|
char *
|
||||||
|
ncp_find_permanent(const struct ncp_conn_spec *spec);
|
||||||
|
|
||||||
/* Create a temporary connection */
|
/* Find the address of a file server */
|
||||||
int
|
struct sockaddr_ipx *
|
||||||
ncp_open_temporary(struct ncp_conn *conn,
|
ncp_find_fileserver(const char *server_name, long *err);
|
||||||
const struct ncp_conn_spec *spec);
|
|
||||||
|
|
||||||
/* Detach from a permanent connection or destroy a temporary
|
/* Detach from a permanent connection or destroy a temporary
|
||||||
connection */
|
connection */
|
||||||
int
|
long
|
||||||
ncp_close(struct ncp_conn *conn);
|
ncp_close(struct ncp_conn *conn);
|
||||||
|
|
||||||
/* like getmntent, get_ncp_conn_ent scans /etc/mtab for usable
|
/* like getmntent, get_ncp_conn_ent scans /etc/mtab for usable
|
||||||
@@ -140,124 +146,267 @@ ncp_get_conn_ent(FILE *filep);
|
|||||||
|
|
||||||
struct ncp_conn_spec *
|
struct ncp_conn_spec *
|
||||||
ncp_find_conn_spec(const char *server, const char *user, const char *password,
|
ncp_find_conn_spec(const char *server, const char *user, const char *password,
|
||||||
uid_t uid);
|
int login_necessary, uid_t uid, long *err);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_get_file_server_description_strings(struct ncp_conn *conn,
|
ncp_get_file_server_description_strings(struct ncp_conn *conn,
|
||||||
char target[512]);
|
char target[512]);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_get_file_server_time(struct ncp_conn *conn, time_t *target);
|
ncp_get_file_server_time(struct ncp_conn *conn, time_t *target);
|
||||||
|
|
||||||
int
|
struct ncp_file_server_info {
|
||||||
ncp_get_connlist(struct ncp_conn *conn, __u32 last_id,
|
__u8 ServerName[48] __attribute__ ((packed));
|
||||||
__u16 object_type, const char *object_name,
|
__u8 FileServiceVersion __attribute__ ((packed));
|
||||||
int *returned_no, __u16 conn_numbers[256]);
|
__u8 FileServiceSubVersion __attribute__ ((packed));
|
||||||
|
__u16 MaximumServiceConnections __attribute__ ((packed));
|
||||||
|
__u16 ConnectionsInUse __attribute__ ((packed));
|
||||||
|
__u16 NumberMountedVolumes __attribute__ ((packed));
|
||||||
|
__u8 Revision __attribute__ ((packed));
|
||||||
|
__u8 SFTLevel __attribute__ ((packed));
|
||||||
|
__u8 TTSLevel __attribute__ ((packed));
|
||||||
|
__u16 MaxConnectionsEverUsed __attribute__ ((packed));
|
||||||
|
__u8 AccountVersion __attribute__ ((packed));
|
||||||
|
__u8 VAPVersion __attribute__ ((packed));
|
||||||
|
__u8 QueueVersion __attribute__ ((packed));
|
||||||
|
__u8 PrintVersion __attribute__ ((packed));
|
||||||
|
__u8 VirtualConsoleVersion __attribute__ ((packed));
|
||||||
|
__u8 RestrictionLevel __attribute__ ((packed));
|
||||||
|
__u8 InternetBridge __attribute__ ((packed));
|
||||||
|
__u8 Reserved[60] __attribute__ ((packed));
|
||||||
|
};
|
||||||
|
|
||||||
int
|
long
|
||||||
|
ncp_get_file_server_information(struct ncp_conn *conn,
|
||||||
|
struct ncp_file_server_info *target);
|
||||||
|
|
||||||
|
long
|
||||||
|
ncp_get_connlist(struct ncp_conn *conn,
|
||||||
|
__u16 object_type, const char *object_name,
|
||||||
|
int *returned_no, __u8 conn_numbers[256]);
|
||||||
|
|
||||||
|
long
|
||||||
|
ncp_get_stations_logged_info(struct ncp_conn *conn,
|
||||||
|
__u32 connection,
|
||||||
|
struct ncp_bindery_object *target,
|
||||||
|
time_t *login_time);
|
||||||
|
|
||||||
|
long
|
||||||
|
ncp_get_internet_address(struct ncp_conn *conn,
|
||||||
|
__u32 connection,
|
||||||
|
struct sockaddr_ipx *target,
|
||||||
|
__u8 *conn_type);
|
||||||
|
|
||||||
|
long
|
||||||
|
ncp_send_broadcast(struct ncp_conn *conn,
|
||||||
|
__u8 no_conn, const __u8 *connections,
|
||||||
|
const char *message);
|
||||||
|
|
||||||
|
long
|
||||||
ncp_get_encryption_key(struct ncp_conn *conn,
|
ncp_get_encryption_key(struct ncp_conn *conn,
|
||||||
char *target);
|
char *target);
|
||||||
int
|
long
|
||||||
ncp_get_bindery_object_id(struct ncp_conn *conn,
|
ncp_get_bindery_object_id(struct ncp_conn *conn,
|
||||||
__u16 object_type,
|
__u16 object_type,
|
||||||
const char *object_name,
|
const char *object_name,
|
||||||
struct ncp_bindery_object *target);
|
struct ncp_bindery_object *target);
|
||||||
int
|
long
|
||||||
|
ncp_get_bindery_object_name(struct ncp_conn *conn,
|
||||||
|
__u32 object_id,
|
||||||
|
struct ncp_bindery_object *target);
|
||||||
|
long
|
||||||
ncp_scan_bindery_object(struct ncp_conn *conn,
|
ncp_scan_bindery_object(struct ncp_conn *conn,
|
||||||
__u32 last_id, __u16 object_type, char *search_string,
|
__u32 last_id, __u16 object_type, char *search_string,
|
||||||
struct ncp_bindery_object *target);
|
struct ncp_bindery_object *target);
|
||||||
int
|
long
|
||||||
|
ncp_create_bindery_object(struct ncp_conn *conn,
|
||||||
|
__u16 object_type,
|
||||||
|
const char *object_name,
|
||||||
|
__u8 object_security,
|
||||||
|
__u8 object_status);
|
||||||
|
long
|
||||||
|
ncp_delete_bindery_object(struct ncp_conn *conn,
|
||||||
|
__u16 object_type,
|
||||||
|
const char *object_name);
|
||||||
|
|
||||||
|
long
|
||||||
|
ncp_change_object_security(struct ncp_conn *conn,
|
||||||
|
__u16 object_type,
|
||||||
|
const char *object_name,
|
||||||
|
__u8 security);
|
||||||
|
|
||||||
|
struct ncp_prop_login_control {
|
||||||
|
__u8 AccountExpireDate[3] __attribute__ ((packed));
|
||||||
|
__u8 Disabled __attribute__ ((packed));
|
||||||
|
__u8 PasswordExpireDate[3] __attribute__ ((packed));
|
||||||
|
__u8 GraceLogins __attribute__ ((packed));
|
||||||
|
__u16 PasswordExpireInterval __attribute__ ((packed));
|
||||||
|
__u8 MaxGraceLogins __attribute__ ((packed));
|
||||||
|
__u8 MinPasswordLength __attribute__ ((packed));
|
||||||
|
__u16 MaxConnections __attribute__ ((packed));
|
||||||
|
__u8 ConnectionTimeMask[42] __attribute__ ((packed));
|
||||||
|
__u8 LastLogin[6] __attribute__ ((packed));
|
||||||
|
__u8 RestrictionMask __attribute__ ((packed));
|
||||||
|
__u8 reserved __attribute__ ((packed));
|
||||||
|
__u32 MaxDiskUsage __attribute__ ((packed));
|
||||||
|
__u16 BadLoginCount __attribute__ ((packed));
|
||||||
|
__u32 BadLoginCountDown __attribute__ ((packed));
|
||||||
|
__u8 LastIntruder[8] __attribute__ ((packed));
|
||||||
|
};
|
||||||
|
|
||||||
|
long
|
||||||
ncp_read_property_value(struct ncp_conn *conn,
|
ncp_read_property_value(struct ncp_conn *conn,
|
||||||
int object_type, const char *object_name,
|
int object_type, const char *object_name,
|
||||||
int segment, const char *prop_name,
|
int segment, const char *prop_name,
|
||||||
struct nw_property *target);
|
struct nw_property *target);
|
||||||
int
|
long
|
||||||
|
ncp_scan_property(struct ncp_conn *conn,
|
||||||
|
__u16 object_type, const char *object_name,
|
||||||
|
__u32 last_id, char *search_string,
|
||||||
|
struct ncp_property_info *property_info);
|
||||||
|
long
|
||||||
|
ncp_add_object_to_set(struct ncp_conn *conn,
|
||||||
|
__u16 object_type, const char *object_name,
|
||||||
|
const char *property_name,
|
||||||
|
__u16 member_type,
|
||||||
|
const char *member_name);
|
||||||
|
long
|
||||||
|
ncp_change_property_security(struct ncp_conn *conn,
|
||||||
|
__u16 object_type, const char *object_name,
|
||||||
|
const char *property_name,
|
||||||
|
__u8 property_security);
|
||||||
|
long
|
||||||
|
ncp_create_property(struct ncp_conn *conn,
|
||||||
|
__u16 object_type, const char *object_name,
|
||||||
|
const char *property_name,
|
||||||
|
__u8 property_flags, __u8 property_security);
|
||||||
|
long
|
||||||
|
ncp_delete_object_from_set(struct ncp_conn *conn,
|
||||||
|
__u16 object_type, const char *object_name,
|
||||||
|
const char *property_name,
|
||||||
|
__u16 member_type,
|
||||||
|
const char *member_name);
|
||||||
|
long
|
||||||
|
ncp_delete_property(struct ncp_conn *conn,
|
||||||
|
__u16 object_type, const char *object_name,
|
||||||
|
const char *property_name);
|
||||||
|
long
|
||||||
|
ncp_write_property_value(struct ncp_conn *conn,
|
||||||
|
__u16 object_type, const char *object_name,
|
||||||
|
const char *property_name,
|
||||||
|
__u8 segment,
|
||||||
|
struct nw_property *property_value);
|
||||||
|
long
|
||||||
ncp_login_encrypted(struct ncp_conn *conn,
|
ncp_login_encrypted(struct ncp_conn *conn,
|
||||||
const struct ncp_bindery_object *object,
|
const struct ncp_bindery_object *object,
|
||||||
const unsigned char *key,
|
const unsigned char *key,
|
||||||
const unsigned char *passwd);
|
const unsigned char *passwd);
|
||||||
int
|
|
||||||
|
long
|
||||||
|
ncp_login_unencrypted(struct ncp_conn *conn,
|
||||||
|
__u16 object_type, const char *object_name,
|
||||||
|
const unsigned char *passwd);
|
||||||
|
|
||||||
|
long
|
||||||
|
ncp_change_login_passwd(struct ncp_conn *conn,
|
||||||
|
const struct ncp_bindery_object *object,
|
||||||
|
const unsigned char *key,
|
||||||
|
const unsigned char *oldpasswd,
|
||||||
|
const unsigned char *newpasswd);
|
||||||
|
|
||||||
|
#define NCP_GRACE_PERIOD (0xdf)
|
||||||
|
|
||||||
|
long
|
||||||
ncp_login_user(struct ncp_conn *conn,
|
ncp_login_user(struct ncp_conn *conn,
|
||||||
const unsigned char *username,
|
const unsigned char *username,
|
||||||
const unsigned char *password);
|
const unsigned char *password);
|
||||||
int
|
long
|
||||||
ncp_get_volume_info_with_number(struct ncp_conn *conn, int n,
|
ncp_get_volume_info_with_number(struct ncp_conn *conn, int n,
|
||||||
struct ncp_volume_info *target);
|
struct ncp_volume_info *target);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_get_volume_number(struct ncp_conn *conn, const char *name,
|
ncp_get_volume_number(struct ncp_conn *conn, const char *name,
|
||||||
int *target);
|
int *target);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_file_search_init(struct ncp_conn *conn,
|
ncp_file_search_init(struct ncp_conn *conn,
|
||||||
int dir_handle, const char *path,
|
int dir_handle, const char *path,
|
||||||
struct ncp_filesearch_info *target);
|
struct ncp_filesearch_info *target);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_file_search_continue(struct ncp_conn *conn,
|
ncp_file_search_continue(struct ncp_conn *conn,
|
||||||
struct ncp_filesearch_info *fsinfo,
|
struct ncp_filesearch_info *fsinfo,
|
||||||
int attributes, const char *path,
|
int attributes, const char *path,
|
||||||
struct ncp_file_info *target);
|
struct ncp_file_info *target);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_get_finfo(struct ncp_conn *conn,
|
ncp_get_finfo(struct ncp_conn *conn,
|
||||||
int dir_handle, const char *path, const char *name,
|
int dir_handle, const char *path, const char *name,
|
||||||
struct ncp_file_info *target);
|
struct ncp_file_info *target);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_open_file(struct ncp_conn *conn,
|
ncp_open_file(struct ncp_conn *conn,
|
||||||
int dir_handle, const char *path,
|
int dir_handle, const char *path,
|
||||||
int attr, int access,
|
int attr, int access,
|
||||||
struct ncp_file_info *target);
|
struct ncp_file_info *target);
|
||||||
int
|
long
|
||||||
ncp_close_file(struct ncp_conn *conn, const char *file_id);
|
ncp_close_file(struct ncp_conn *conn, const char *file_id);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_create_newfile(struct ncp_conn *conn,
|
ncp_create_newfile(struct ncp_conn *conn,
|
||||||
int dir_handle, const char *path,
|
int dir_handle, const char *path,
|
||||||
int attr,
|
int attr,
|
||||||
struct ncp_file_info *target);
|
struct ncp_file_info *target);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_create_file(struct ncp_conn *conn,
|
ncp_create_file(struct ncp_conn *conn,
|
||||||
int dir_handle, const char *path,
|
int dir_handle, const char *path,
|
||||||
int attr,
|
int attr,
|
||||||
struct ncp_file_info *target);
|
struct ncp_file_info *target);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_erase_file(struct ncp_conn *conn,
|
ncp_erase_file(struct ncp_conn *conn,
|
||||||
int dir_handle, const char *path,
|
int dir_handle, const char *path,
|
||||||
int attr);
|
int attr);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_rename_file(struct ncp_conn *conn,
|
ncp_rename_file(struct ncp_conn *conn,
|
||||||
int old_handle, const char *old_path,
|
int old_handle, const char *old_path,
|
||||||
int attr,
|
int attr,
|
||||||
int new_handle, const char *new_path);
|
int new_handle, const char *new_path);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_create_directory(struct ncp_conn *conn,
|
ncp_create_directory(struct ncp_conn *conn,
|
||||||
int dir_handle, const char *path,
|
int dir_handle, const char *path,
|
||||||
int inherit_mask);
|
int inherit_mask);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_delete_directory(struct ncp_conn *conn,
|
ncp_delete_directory(struct ncp_conn *conn,
|
||||||
int dir_handle, const char *path);
|
int dir_handle, const char *path);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_rename_directory(struct ncp_conn *conn,
|
ncp_rename_directory(struct ncp_conn *conn,
|
||||||
int dir_handle,
|
int dir_handle,
|
||||||
const char *old_path, const char *new_path);
|
const char *old_path, const char *new_path);
|
||||||
|
|
||||||
int
|
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,
|
ncp_read(struct ncp_conn *conn, const char *file_id,
|
||||||
off_t offset, size_t count, char *target);
|
off_t offset, size_t count, char *target);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_write(struct ncp_conn *conn, const char *file_id,
|
ncp_write(struct ncp_conn *conn, const char *file_id,
|
||||||
off_t offset, size_t count, const char *source);
|
off_t offset, size_t count, const char *source);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_copy_file(struct ncp_conn *conn,
|
ncp_copy_file(struct ncp_conn *conn,
|
||||||
const char source_file[6],
|
const char source_file[6],
|
||||||
const char target_file[6],
|
const char target_file[6],
|
||||||
@@ -266,24 +415,32 @@ ncp_copy_file(struct ncp_conn *conn,
|
|||||||
__u32 count,
|
__u32 count,
|
||||||
__u32 *copied_count);
|
__u32 *copied_count);
|
||||||
|
|
||||||
int
|
long
|
||||||
|
ncp_obtain_file_or_subdir_info(struct ncp_conn *conn,
|
||||||
|
__u8 source_ns, __u8 target_ns,
|
||||||
|
__u16 search_attribs, __u32 rim,
|
||||||
|
__u8 vol, __u32 dirent, const char *path,
|
||||||
|
struct nw_info_struct *target);
|
||||||
|
|
||||||
|
|
||||||
|
long
|
||||||
ncp_do_lookup(struct ncp_conn *conn,
|
ncp_do_lookup(struct ncp_conn *conn,
|
||||||
struct nw_info_struct *dir,
|
struct nw_info_struct *dir,
|
||||||
char *path, /* may only be one component */
|
char *path, /* may only be one component */
|
||||||
struct nw_info_struct *target);
|
struct nw_info_struct *target);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_modify_file_or_subdir_dos_info(struct ncp_conn *conn,
|
ncp_modify_file_or_subdir_dos_info(struct ncp_conn *conn,
|
||||||
struct nw_info_struct *file,
|
struct nw_info_struct *file,
|
||||||
__u32 info_mask,
|
__u32 info_mask,
|
||||||
struct nw_modify_dos_info *info);
|
struct nw_modify_dos_info *info);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_del_file_or_subdir(struct ncp_conn *conn,
|
ncp_del_file_or_subdir(struct ncp_conn *conn,
|
||||||
struct nw_info_struct *dir, char *name);
|
struct nw_info_struct *dir, char *name);
|
||||||
|
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_open_create_file_or_subdir(struct ncp_conn *conn,
|
ncp_open_create_file_or_subdir(struct ncp_conn *conn,
|
||||||
struct nw_info_struct *dir, char *name,
|
struct nw_info_struct *dir, char *name,
|
||||||
int open_create_mode,
|
int open_create_mode,
|
||||||
@@ -291,66 +448,84 @@ ncp_open_create_file_or_subdir(struct ncp_conn *conn,
|
|||||||
int desired_acc_rights,
|
int desired_acc_rights,
|
||||||
struct nw_file_info *target);
|
struct nw_file_info *target);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_initialize_search(struct ncp_conn *conn,
|
ncp_initialize_search(struct ncp_conn *conn,
|
||||||
const struct nw_info_struct *dir,
|
const struct nw_info_struct *dir,
|
||||||
int namespace,
|
int namespace,
|
||||||
struct ncp_search_seq *target);
|
struct ncp_search_seq *target);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_search_for_file_or_subdir(struct ncp_conn *conn,
|
ncp_search_for_file_or_subdir(struct ncp_conn *conn,
|
||||||
struct ncp_search_seq *seq,
|
struct ncp_search_seq *seq,
|
||||||
struct nw_info_struct *target);
|
struct nw_info_struct *target);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_ren_or_mov_file_or_subdir(struct ncp_conn *conn,
|
ncp_ren_or_mov_file_or_subdir(struct ncp_conn *conn,
|
||||||
struct nw_info_struct *old_dir, char *old_name,
|
struct nw_info_struct *old_dir, char *old_name,
|
||||||
struct nw_info_struct *new_dir, char *new_name);
|
struct nw_info_struct *new_dir, char *new_name);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_create_queue_job_and_file(struct ncp_conn *conn,
|
ncp_create_queue_job_and_file(struct ncp_conn *conn,
|
||||||
__u32 queue_id,
|
__u32 queue_id,
|
||||||
struct queue_job *job);
|
struct queue_job *job);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_close_file_and_start_job(struct ncp_conn *conn,
|
ncp_close_file_and_start_job(struct ncp_conn *conn,
|
||||||
__u32 queue_id,
|
__u32 queue_id,
|
||||||
struct queue_job *job);
|
struct queue_job *job);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_attach_to_queue(struct ncp_conn *conn,
|
ncp_attach_to_queue(struct ncp_conn *conn,
|
||||||
__u32 queue_id);
|
__u32 queue_id);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_detach_from_queue(struct ncp_conn *conn,
|
ncp_detach_from_queue(struct ncp_conn *conn,
|
||||||
__u32 queue_id);
|
__u32 queue_id);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_service_queue_job(struct ncp_conn *conn, __u32 queue_id, __u16 job_type,
|
ncp_service_queue_job(struct ncp_conn *conn, __u32 queue_id, __u16 job_type,
|
||||||
struct queue_job *job);
|
struct queue_job *job);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_finish_servicing_job(struct ncp_conn *conn, __u32 queue_id,
|
ncp_finish_servicing_job(struct ncp_conn *conn, __u32 queue_id,
|
||||||
__u32 job_number, __u32 charge_info);
|
__u32 job_number, __u32 charge_info);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_abort_servicing_job(struct ncp_conn *conn, __u32 queue_id,
|
ncp_abort_servicing_job(struct ncp_conn *conn, __u32 queue_id,
|
||||||
__u32 job_number);
|
__u32 job_number);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_get_broadcast_message(struct ncp_conn *conn, char message[256]);
|
ncp_get_broadcast_message(struct ncp_conn *conn, char message[256]);
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_dealloc_dir_handle(struct ncp_conn *conn, __u8 dir_handle);
|
ncp_dealloc_dir_handle(struct ncp_conn *conn, __u8 dir_handle);
|
||||||
|
|
||||||
#define NCP_ALLOC_PERMANENT (0x0000)
|
#define NCP_ALLOC_PERMANENT (0x0000)
|
||||||
#define NCP_ALLOC_TEMPORARY (0x0001)
|
#define NCP_ALLOC_TEMPORARY (0x0001)
|
||||||
#define NCP_ALLOC_SPECIAL (0x0002)
|
#define NCP_ALLOC_SPECIAL (0x0002)
|
||||||
|
|
||||||
int
|
long
|
||||||
ncp_alloc_short_dir_handle(struct ncp_conn *conn,
|
ncp_alloc_short_dir_handle(struct ncp_conn *conn,
|
||||||
struct nw_info_struct *dir,
|
struct nw_info_struct *dir,
|
||||||
__u16 alloc_mode,
|
__u16 alloc_mode,
|
||||||
__u8 *target);
|
__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 */
|
#endif /* _NCPLIB_H */
|
||||||
|
|||||||
42
util/ncplib_err.et
Normal file
42
util/ncplib_err.et
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
error_table NCPL
|
||||||
|
|
||||||
|
ec NCPL_ET_NO_SERVER,
|
||||||
|
"No server found"
|
||||||
|
|
||||||
|
ec NCPL_ET_NO_USER,
|
||||||
|
"No username found"
|
||||||
|
|
||||||
|
ec NCPL_ET_HOST_UNKNOWN,
|
||||||
|
"Server Unknown"
|
||||||
|
|
||||||
|
ec NCPL_ET_REQUEST_ERROR,
|
||||||
|
"NCP Request returned error code"
|
||||||
|
|
||||||
|
ec NCPL_ET_NAMETOOLONG,
|
||||||
|
"Name too long"
|
||||||
|
|
||||||
|
ec NCPL_ET_MSG_TOO_LONG,
|
||||||
|
"Message too long"
|
||||||
|
|
||||||
|
ec NCPL_ET_NO_SPEC,
|
||||||
|
"Could not find valid connection spec"
|
||||||
|
|
||||||
|
ec NCPL_ET_INVALID_MODE,
|
||||||
|
"$HOME/.nwclient has invalid mode, must be 600"
|
||||||
|
|
||||||
|
ec NCPL_ET_LOGIN_DENIED,
|
||||||
|
"Login denied"
|
||||||
|
|
||||||
|
ec NCPL_ET_NO_INTERFACE,
|
||||||
|
"No primary IPX interface found"
|
||||||
|
|
||||||
|
ec NCPL_ET_NO_PASSWORD,
|
||||||
|
"Could not get password"
|
||||||
|
|
||||||
|
ec NCPL_ET_PWD_TOO_LONG,
|
||||||
|
"Password too long"
|
||||||
|
|
||||||
|
ec NCPL_ET_NO_IPX,
|
||||||
|
"Could not alloc IPX socket. Probably no IPX support in kernel."
|
||||||
|
|
||||||
|
end
|
||||||
108
util/ncpmount.c
108
util/ncpmount.c
@@ -10,7 +10,7 @@
|
|||||||
* a conditional which leaves out the test and load code.
|
* a conditional which leaves out the test and load code.
|
||||||
*
|
*
|
||||||
* Even if we _do_ want ncpmount to load the module, passing a
|
* Even if we _do_ want ncpmount to load the module, passing a
|
||||||
* fully-qualified pathname to insmod causes it to bypass a
|
* fully-qualified pathname to modprobe causes it to bypass a
|
||||||
* path search. This may lead to ncpfs.o not being found on
|
* path search. This may lead to ncpfs.o not being found on
|
||||||
* some systems.
|
* some systems.
|
||||||
*/
|
*/
|
||||||
@@ -45,6 +45,7 @@ extern pid_t waitpid(pid_t, int *, int);
|
|||||||
#include <linux/ncp_fs.h>
|
#include <linux/ncp_fs.h>
|
||||||
#include <linux/ncp_mount.h>
|
#include <linux/ncp_mount.h>
|
||||||
#include "ncplib.h"
|
#include "ncplib.h"
|
||||||
|
#include "com_err.h"
|
||||||
|
|
||||||
static char *progname;
|
static char *progname;
|
||||||
static void usage(void);
|
static void usage(void);
|
||||||
@@ -101,7 +102,7 @@ load_ncpfs(void)
|
|||||||
else if (pid == 0)
|
else if (pid == 0)
|
||||||
{
|
{
|
||||||
/* child */
|
/* child */
|
||||||
execl("/sbin/insmod", "insmod", "ncpfs", NULL);
|
execl("/sbin/modprobe", "modprobe", "ncpfs", NULL);
|
||||||
_exit(127); /* execl error */
|
_exit(127); /* execl error */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -153,9 +154,11 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
int fd, result;
|
int fd, result;
|
||||||
struct sockaddr_ipx addr;
|
struct sockaddr_ipx addr;
|
||||||
|
struct sockaddr_ipx *server_addr;
|
||||||
int addrlen;
|
int addrlen;
|
||||||
|
|
||||||
int upcase_password;
|
int upcase_password;
|
||||||
|
long err;
|
||||||
|
|
||||||
int um;
|
int um;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
@@ -163,6 +166,7 @@ main(int argc, char *argv[])
|
|||||||
char mount_point[MAXPATHLEN];
|
char mount_point[MAXPATHLEN];
|
||||||
struct mntent ment;
|
struct mntent ment;
|
||||||
FILE *mtab;
|
FILE *mtab;
|
||||||
|
char *tmp_mount;
|
||||||
|
|
||||||
char *server = NULL;
|
char *server = NULL;
|
||||||
char *user = NULL;
|
char *user = NULL;
|
||||||
@@ -171,13 +175,13 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
uid_t conn_uid = getuid();
|
uid_t conn_uid = getuid();
|
||||||
|
|
||||||
struct ncp_conn conn;
|
struct ncp_conn *conn;
|
||||||
|
|
||||||
int opt;
|
int opt;
|
||||||
|
|
||||||
progname = argv[0];
|
progname = argv[0];
|
||||||
|
|
||||||
memzero(data); memzero(spec); memzero(conn);
|
memzero(data); memzero(spec);
|
||||||
|
|
||||||
if (geteuid() != 0)
|
if (geteuid() != 0)
|
||||||
{
|
{
|
||||||
@@ -192,10 +196,13 @@ main(int argc, char *argv[])
|
|||||||
data.file_mode = (S_IRWXU|S_IRWXG|S_IRWXO) & ~um;
|
data.file_mode = (S_IRWXU|S_IRWXG|S_IRWXO) & ~um;
|
||||||
data.dir_mode = 0;
|
data.dir_mode = 0;
|
||||||
data.flags |= NCP_MOUNT_SOFT;
|
data.flags |= NCP_MOUNT_SOFT;
|
||||||
|
data.time_out = 60;
|
||||||
|
data.retry_count = 5;
|
||||||
|
|
||||||
upcase_password = 1;
|
upcase_password = 1;
|
||||||
|
|
||||||
while ((opt = getopt (argc, argv, "CS:U:c:u:g:f:d:P:nhvV:")) != EOF)
|
while ((opt = getopt (argc, argv, "CS:U:c:u:g:f:d:P:nh?vV:t:r:"))
|
||||||
|
!= EOF)
|
||||||
{
|
{
|
||||||
switch (opt)
|
switch (opt)
|
||||||
{
|
{
|
||||||
@@ -296,7 +303,14 @@ main(int argc, char *argv[])
|
|||||||
case 'n':
|
case 'n':
|
||||||
password = "";
|
password = "";
|
||||||
break;
|
break;
|
||||||
|
case 't':
|
||||||
|
data.time_out = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
data.retry_count = atoi(optarg);
|
||||||
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
|
case '?':
|
||||||
help();
|
help();
|
||||||
exit(1);
|
exit(1);
|
||||||
case 'v':
|
case 'v':
|
||||||
@@ -308,10 +322,10 @@ main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((spec = ncp_find_conn_spec(server, user, password, data.uid))
|
if ((spec = ncp_find_conn_spec(server,user,password,1, data.uid, &err))
|
||||||
== NULL)
|
== NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Could not find valid server/user\n");
|
com_err(progname, err, "in find_conn_spec");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -367,32 +381,28 @@ main(int argc, char *argv[])
|
|||||||
data.dir_mode |= S_IXOTH;
|
data.dir_mode |= S_IXOTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ncp_open(&conn, spec) != 0)
|
if ((tmp_mount = ncp_find_permanent(spec)) != NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "could not connect to server %s: %s\n",
|
|
||||||
server, strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (conn.is_connected == CONN_PERMANENT)
|
|
||||||
{
|
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"You already have mounted server %s\nas user "
|
"You already have mounted server %s\nas user "
|
||||||
"%s\non mount point %s\n", spec->server, spec->user,
|
"%s\non mount point %s\n", spec->server, spec->user,
|
||||||
conn.mount_point);
|
tmp_mount);
|
||||||
ncp_close(&conn);
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
data.serv_addr = conn.i.addr;
|
if ((server_addr = ncp_find_fileserver(spec->server, &err)) == NULL)
|
||||||
|
{
|
||||||
ncp_close(&conn);
|
com_err("ncpmount", err, "when trying to find %s",
|
||||||
|
spec->server);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
data.serv_addr = *server_addr;
|
||||||
|
|
||||||
data.ncp_fd = socket(AF_IPX, SOCK_DGRAM, PF_IPX);
|
data.ncp_fd = socket(AF_IPX, SOCK_DGRAM, PF_IPX);
|
||||||
if (data.ncp_fd == -1)
|
if (data.ncp_fd == -1)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "could not open ncp socket: %s\n",
|
com_err("ncpmount", err, "opening ncp_socket");
|
||||||
strerror(errno));
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -463,10 +473,11 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
flags = MS_MGC_VAL;
|
flags = MS_MGC_VAL;
|
||||||
|
|
||||||
data.time_out = 20;
|
strcpy(mount_name, spec->server);
|
||||||
data.retry_count = 2;
|
strcat(mount_name, "/");
|
||||||
|
strcat(mount_name, spec->user);
|
||||||
|
|
||||||
result = mount(NULL, mount_point, "ncpfs", flags, (char *)&data);
|
result = mount(mount_name, mount_point, "ncpfs", flags, (char *)&data);
|
||||||
|
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
{
|
{
|
||||||
@@ -474,20 +485,47 @@ main(int argc, char *argv[])
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (ncp_open_mount(&conn, mount_point) != 0)
|
if ((conn = ncp_open_mount(mount_point, &err)) == NULL)
|
||||||
|| (ncp_login_user(&conn, spec->user, spec->password) != 0)
|
|
||||||
|| (ioctl(conn.mount_fid, NCP_IOC_CONN_LOGGED_IN, NULL) != 0))
|
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s: login failed\n", strerror(errno));
|
com_err("ncpmount", err, "attempt to open mount point");
|
||||||
ncp_close(&conn);
|
|
||||||
umount(mount_point);
|
umount(mount_point);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
ncp_close(&conn);
|
|
||||||
|
|
||||||
strcpy(mount_name, spec->server);
|
if ((err = ncp_login_user(conn, spec->user, spec->password)) != 0)
|
||||||
strcat(mount_name, "/");
|
{
|
||||||
strcat(mount_name, spec->user);
|
struct nw_property p;
|
||||||
|
struct ncp_prop_login_control *l
|
||||||
|
= (struct ncp_prop_login_control *)&p;
|
||||||
|
|
||||||
|
if (conn->completion != NCP_GRACE_PERIOD)
|
||||||
|
{
|
||||||
|
com_err("ncpmount", err, "in login");
|
||||||
|
fprintf(stderr, "Login denied\n");
|
||||||
|
ncp_close(conn);
|
||||||
|
umount(mount_point);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "Your password has expired\n");
|
||||||
|
|
||||||
|
if ((err = ncp_read_property_value(conn, NCP_BINDERY_USER,
|
||||||
|
spec->user, 1,
|
||||||
|
"LOGIN_CONTROL", &p)) == 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "You have %d login attempts left\n",
|
||||||
|
l->GraceLogins);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((err = ioctl(conn->mount_fid, NCP_IOC_CONN_LOGGED_IN, NULL)) != 0)
|
||||||
|
{
|
||||||
|
com_err("ncpmount", err, "in logged_indication");
|
||||||
|
ncp_close(conn);
|
||||||
|
umount(mount_point);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
ncp_close(conn);
|
||||||
|
|
||||||
ment.mnt_fsname = mount_name;
|
ment.mnt_fsname = mount_name;
|
||||||
ment.mnt_dir = mount_point;
|
ment.mnt_dir = mount_point;
|
||||||
@@ -545,12 +583,16 @@ help(void)
|
|||||||
printf("\n"
|
printf("\n"
|
||||||
"-S server Server name to be used\n"
|
"-S server Server name to be used\n"
|
||||||
"-U username Username sent to server\n"
|
"-U username Username sent to server\n"
|
||||||
|
"-V volume Volume to mount, for NFS re-export\n"
|
||||||
"-u uid uid the mounted files get\n"
|
"-u uid uid the mounted files get\n"
|
||||||
"-g gid gid the mounted files get\n"
|
"-g gid gid the mounted files get\n"
|
||||||
"-f mode permission the files get (octal notation)\n"
|
"-f mode permission the files get (octal notation)\n"
|
||||||
"-d mode permission the dirs get (octal notation)\n"
|
"-d mode permission the dirs get (octal notation)\n"
|
||||||
"-c uid uid to identify the connection to mount on\n"
|
"-c uid uid to identify the connection to mount on\n"
|
||||||
" Only makes sense for root\n"
|
" Only makes sense for root\n"
|
||||||
|
"-t time_out Waiting time (in 1/100s) to wait for\n"
|
||||||
|
" an answer from the server. Default: 60\n"
|
||||||
|
"-r retry_count Number of retry attempts. Default: 5\n"
|
||||||
"-C Don't convert password to uppercase\n"
|
"-C Don't convert password to uppercase\n"
|
||||||
"-P password Use this password\n"
|
"-P password Use this password\n"
|
||||||
"-n Do not use any password\n"
|
"-n Do not use any password\n"
|
||||||
|
|||||||
210
util/ncptest.c
210
util/ncptest.c
@@ -38,115 +38,35 @@ extern pid_t waitpid(pid_t, int *, int);
|
|||||||
#include "ncplib.h"
|
#include "ncplib.h"
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
test_print(struct ncp_conn *conn)
|
|
||||||
{
|
|
||||||
struct ncp_bindery_object q;
|
|
||||||
struct queue_job j;
|
|
||||||
struct print_job_record pj;
|
|
||||||
int written;
|
|
||||||
|
|
||||||
if (ncp_get_bindery_object_id(conn, NCP_BINDERY_PQUEUE,
|
|
||||||
"Q_DJ500", &q) != 0) {
|
|
||||||
printf("get oid error\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&j, 0, sizeof(j));
|
|
||||||
|
|
||||||
j.j.TargetServerID = 0xffffffff; /* any server */
|
|
||||||
/* at once */
|
|
||||||
memset(&(j.j.TargetExecTime), 0xff, sizeof(j.j.TargetExecTime));
|
|
||||||
j.j.JobType = htons(0);
|
|
||||||
strcpy(j.j.JobTextDescription, "Test Job");
|
|
||||||
|
|
||||||
memset(&pj, 0, sizeof(pj));
|
|
||||||
|
|
||||||
pj.Version = 0;
|
|
||||||
pj.TabSize = 8;
|
|
||||||
pj.Copies = htons(1);
|
|
||||||
pj.CtrlFlags = 0;
|
|
||||||
pj.Lines = htons(66);
|
|
||||||
pj.Rows = htons(80);
|
|
||||||
strcpy(pj.FormName, "test");
|
|
||||||
strcpy(pj.BannerName, "BannerName");
|
|
||||||
strcpy(pj.FnameBanner, "BannerFile");
|
|
||||||
strcpy(pj.FnameHeader, "HeaderName");
|
|
||||||
strcpy(pj.Path, "");
|
|
||||||
|
|
||||||
memcpy(j.j.ClientRecordArea, &pj, sizeof(pj));
|
|
||||||
|
|
||||||
if (ncp_create_queue_job_and_file(conn, q.object_id, &j) != 0) {
|
|
||||||
printf("create error\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((written = ncp_write(conn, j.file_handle, 0, 15,
|
|
||||||
"hallo, wie geht's?")) < 0) {
|
|
||||||
printf("write error\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ncp_close_file_and_start_job(conn, q.object_id, &j) != 0) {
|
|
||||||
printf("close error\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
test_ls(struct ncp_conn *server)
|
|
||||||
{
|
|
||||||
struct nw_info_struct sys;
|
|
||||||
struct nw_info_struct public;
|
|
||||||
struct ncp_search_seq seq;
|
|
||||||
struct nw_info_struct found;
|
|
||||||
int res;
|
|
||||||
|
|
||||||
if (ncp_do_lookup(server, NULL, "SYS", &sys) != 0)
|
|
||||||
{
|
|
||||||
printf("lookup error\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (ncp_do_lookup(server, &sys, "PUBLIC", &public) != 0)
|
|
||||||
{
|
|
||||||
printf("lookup public error\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (ncp_initialize_search(server, &public, 4, &seq) != 0)
|
|
||||||
{
|
|
||||||
printf("init error\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
while ((res=ncp_search_for_file_or_subdir(server,&seq,&found)) == 0)
|
|
||||||
{
|
|
||||||
printf("found %s: %s\n",
|
|
||||||
(found.attributes & aDIR) ? "dir " : "file",
|
|
||||||
found.entryName);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res == 0xfe)
|
|
||||||
{
|
|
||||||
printf("result: no more files\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("other error: %x\n", res);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
test_connlist(struct ncp_conn *conn)
|
test_connlist(struct ncp_conn *conn)
|
||||||
{
|
{
|
||||||
__u16 conn_list[256];
|
__u8 conn_list[256] = {0,};
|
||||||
int no;
|
int no;
|
||||||
|
|
||||||
ncp_get_connlist(conn, 0, NCP_BINDERY_USER, "*", &no, conn_list);
|
ncp_get_connlist(conn, NCP_BINDERY_USER, "SUPERVISOR", &no,
|
||||||
|
conn_list);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
test_send(struct ncp_conn *conn)
|
||||||
|
{
|
||||||
|
__u8 conn_list[256] = {0,};
|
||||||
|
int no;
|
||||||
|
|
||||||
|
if (ncp_get_connlist(conn, NCP_BINDERY_USER, "ME", &no,
|
||||||
|
conn_list) != 0)
|
||||||
|
{
|
||||||
|
no = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (no > 0)
|
||||||
|
{
|
||||||
|
ncp_send_broadcast(conn, no, conn_list, "Hallo");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
void
|
void
|
||||||
test_create(struct ncp_conn *conn)
|
test_create(struct ncp_conn *conn)
|
||||||
{
|
{
|
||||||
@@ -186,20 +106,96 @@ test_create(struct ncp_conn *conn)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
test_change(struct ncp_conn *conn)
|
||||||
|
{
|
||||||
|
long result;
|
||||||
|
unsigned char ncp_key[8];
|
||||||
|
struct ncp_bindery_object user;
|
||||||
|
|
||||||
|
if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((result = ncp_get_bindery_object_id(conn, 1,
|
||||||
|
"ME", &user)) != 0) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((result = ncp_change_login_passwd(conn, &user, ncp_key,
|
||||||
|
"MEE", "ME")) != 0)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
test_readdir(struct ncp_conn *conn)
|
||||||
|
{
|
||||||
|
struct nw_info_struct sys;
|
||||||
|
struct nw_info_struct blub;
|
||||||
|
struct ncp_search_seq seq;
|
||||||
|
struct nw_info_struct entry;
|
||||||
|
|
||||||
|
if (ncp_do_lookup(conn, NULL, "SYS", &sys) != 0)
|
||||||
|
{
|
||||||
|
printf("lookup error\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ncp_do_lookup(conn, &sys, "BLUB", &blub) != 0)
|
||||||
|
{
|
||||||
|
printf("lookup blub error\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_initialize_search(conn, &sys, 0, &seq) != 0)
|
||||||
|
{
|
||||||
|
printf("init error\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (ncp_search_for_file_or_subdir(conn, &seq, &entry) == 0)
|
||||||
|
{
|
||||||
|
struct nw_info_struct nfs;
|
||||||
|
printf("found: %s\n", entry.entryName);
|
||||||
|
if (ncp_obtain_file_or_subdir_info(conn, NW_NS_DOS, NW_NS_NFS,
|
||||||
|
0x8006, RIM_ALL,
|
||||||
|
entry.volNumber,
|
||||||
|
entry.DosDirNum,
|
||||||
|
NULL,
|
||||||
|
&nfs) == 0)
|
||||||
|
{
|
||||||
|
printf("nfs name: %s\n", nfs.entryName);
|
||||||
|
}
|
||||||
|
if (ncp_obtain_file_or_subdir_info(conn, NW_NS_DOS, NW_NS_OS2,
|
||||||
|
0x8006, RIM_ALL,
|
||||||
|
entry.volNumber,
|
||||||
|
entry.DosDirNum,
|
||||||
|
NULL,
|
||||||
|
&nfs) == 0)
|
||||||
|
{
|
||||||
|
printf("os2 name: %s\n", nfs.entryName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct ncp_conn conn;
|
struct ncp_conn *conn;
|
||||||
|
long err;
|
||||||
|
|
||||||
if (ncp_initialize(&conn, &argc, argv, 1) != 0)
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
{
|
{
|
||||||
perror("ncp_initialize");
|
com_err(argv[0], err, "in ncp_initialize");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
test_create(&conn);
|
test_readdir(conn);
|
||||||
ncp_close(&conn);
|
ncp_close(conn);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
145
util/npasswd.c
Normal file
145
util/npasswd.c
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
/*
|
||||||
|
* npasswd.c
|
||||||
|
*
|
||||||
|
* Change a bindery object's password
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ncplib.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
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"
|
||||||
|
"-t type Object type (decimal value)\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct ncp_conn_spec *spec;
|
||||||
|
struct ncp_conn *conn;
|
||||||
|
char *server = NULL;
|
||||||
|
char *object_name = NULL;
|
||||||
|
int object_type = NCP_BINDERY_USER;
|
||||||
|
unsigned char ncp_key[8];
|
||||||
|
struct ncp_bindery_object user;
|
||||||
|
long err;
|
||||||
|
|
||||||
|
char *str;
|
||||||
|
|
||||||
|
char oldpass[200], newpass1[200], newpass2[200];
|
||||||
|
|
||||||
|
int opt;
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?S:U:t:")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt) {
|
||||||
|
case 'S':
|
||||||
|
server = optarg;
|
||||||
|
break;
|
||||||
|
case 'U':
|
||||||
|
object_name = optarg;
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
object_type = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help();
|
||||||
|
exit(1);
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spec = ncp_find_conn_spec(server, object_name, "",
|
||||||
|
1, getuid(), &err);
|
||||||
|
|
||||||
|
if (spec == NULL)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "trying to find server");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
spec->login_type = object_type;
|
||||||
|
|
||||||
|
printf("Changing password for user %s on server %s\n",
|
||||||
|
spec->user, spec->server);
|
||||||
|
|
||||||
|
str = getpass("Enter old password: ");
|
||||||
|
if (strlen(str) >= sizeof(oldpass))
|
||||||
|
{
|
||||||
|
printf("Password too long\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
strcpy(oldpass, str);
|
||||||
|
|
||||||
|
str = getpass("Enter new password: ");
|
||||||
|
if (strlen(str) >= sizeof(newpass1))
|
||||||
|
{
|
||||||
|
printf("Password too long\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
strcpy(newpass1, str);
|
||||||
|
|
||||||
|
str = getpass("Re-Enter new password: ");
|
||||||
|
if (strlen(str) >= sizeof(newpass2))
|
||||||
|
{
|
||||||
|
printf("Password too long\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
strcpy(newpass2, str);
|
||||||
|
|
||||||
|
str_upper(oldpass);
|
||||||
|
str_upper(newpass1);
|
||||||
|
str_upper(newpass2);
|
||||||
|
|
||||||
|
if (strcmp(newpass1, newpass2) != 0)
|
||||||
|
{
|
||||||
|
printf("You mistype the new password, try again\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(spec->password, oldpass);
|
||||||
|
|
||||||
|
if ((conn = ncp_open(spec, &err)) == NULL)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "when trying to open connection");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ((err = ncp_get_encryption_key(conn, ncp_key)) != 0)
|
||||||
|
|| ((err = ncp_get_bindery_object_id(conn, 1, spec->user,
|
||||||
|
&user)) != 0)
|
||||||
|
|| ((err = ncp_change_login_passwd(conn, &user, ncp_key,
|
||||||
|
oldpass, newpass1)) != 0))
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "trying to change password");
|
||||||
|
}
|
||||||
|
|
||||||
|
ncp_close(conn);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -25,7 +25,7 @@ static void help(void);
|
|||||||
void
|
void
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct ncp_conn conn;
|
struct ncp_conn *conn;
|
||||||
|
|
||||||
char default_queue[] = "*";
|
char default_queue[] = "*";
|
||||||
char *queue = default_queue;
|
char *queue = default_queue;
|
||||||
@@ -42,10 +42,11 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
char *file_name;
|
char *file_name;
|
||||||
int file;
|
int file;
|
||||||
|
long err;
|
||||||
|
|
||||||
progname = argv[0];
|
progname = argv[0];
|
||||||
|
|
||||||
memzero(j); memzero(pj); memzero(q); memzero(conn);
|
memzero(j); memzero(pj); memzero(q);
|
||||||
|
|
||||||
if ( (argc == 2)
|
if ( (argc == 2)
|
||||||
&& (strcmp(argv[1], "-h") == 0))
|
&& (strcmp(argv[1], "-h") == 0))
|
||||||
@@ -54,9 +55,9 @@ main(int argc, char *argv[])
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ncp_initialize(&conn, &argc, argv, 1) != 0)
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
{
|
{
|
||||||
perror("Could not open connection");
|
com_err(argv[0], err, "when initializing connection");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,12 +78,13 @@ main(int argc, char *argv[])
|
|||||||
pj.Rows = htons(80);
|
pj.Rows = htons(80);
|
||||||
strcpy(pj.FnameHeader, "stdin");
|
strcpy(pj.FnameHeader, "stdin");
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "hq:d:p:b:f:l:r:c:t:F:TN"))!=EOF)
|
while ((opt = getopt(argc, argv, "h?q:d:p:b:f:l:r:c:t:F:TN"))!=EOF)
|
||||||
{
|
{
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'h':
|
case 'h':
|
||||||
|
case '?':
|
||||||
help();
|
help();
|
||||||
ncp_close(&conn);
|
ncp_close(conn);
|
||||||
exit(1);
|
exit(1);
|
||||||
case 'p':
|
case 'p':
|
||||||
/* Path */
|
/* Path */
|
||||||
@@ -191,6 +193,7 @@ main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
printf("queue name too long: %s\n",
|
printf("queue name too long: %s\n",
|
||||||
optarg);
|
optarg);
|
||||||
|
ncp_close(conn);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
queue = optarg;
|
queue = optarg;
|
||||||
@@ -211,6 +214,7 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
usage();
|
usage();
|
||||||
|
ncp_close(conn);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -218,6 +222,7 @@ main(int argc, char *argv[])
|
|||||||
if (optind != argc-1)
|
if (optind != argc-1)
|
||||||
{
|
{
|
||||||
usage();
|
usage();
|
||||||
|
ncp_close(conn);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,6 +238,7 @@ main(int argc, char *argv[])
|
|||||||
if (file < 0)
|
if (file < 0)
|
||||||
{
|
{
|
||||||
perror("could not open file");
|
perror("could not open file");
|
||||||
|
ncp_close(conn);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -264,17 +270,19 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
str_upper(queue);
|
str_upper(queue);
|
||||||
|
|
||||||
if (ncp_scan_bindery_object(&conn, 0xffffffff, NCP_BINDERY_PQUEUE,
|
if (ncp_scan_bindery_object(conn, 0xffffffff, NCP_BINDERY_PQUEUE,
|
||||||
queue, &q) != 0)
|
queue, &q) != 0)
|
||||||
{
|
{
|
||||||
printf("could not find queue %s\n", queue);
|
printf("could not find queue %s\n", queue);
|
||||||
return;
|
ncp_close(conn);
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ncp_create_queue_job_and_file(&conn, q.object_id, &j) != 0)
|
if (ncp_create_queue_job_and_file(conn, q.object_id, &j) != 0)
|
||||||
{
|
{
|
||||||
printf("create error\n");
|
printf("create error\n");
|
||||||
return;
|
ncp_close(conn);
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
written = 0;
|
written = 0;
|
||||||
@@ -286,7 +294,7 @@ main(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ncp_write(&conn, j.file_handle,
|
if (ncp_write(conn, j.file_handle,
|
||||||
written, read_this_time, buf) < read_this_time)
|
written, read_this_time, buf) < read_this_time)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@@ -297,19 +305,18 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
close(file);
|
close(file);
|
||||||
|
|
||||||
if (ncp_close_file_and_start_job(&conn, q.object_id, &j) != 0) {
|
if (ncp_close_file_and_start_job(conn, q.object_id, &j) != 0) {
|
||||||
printf("close error\n");
|
printf("close error\n");
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
ncp_close(&conn);
|
ncp_close(conn);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
usage(void)
|
usage(void)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "usage: %s [options] file\n", progname);
|
fprintf(stderr, "usage: %s [options] file\n", progname);
|
||||||
exit(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
65
util/nsend.c
Normal file
65
util/nsend.c
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* nsend.c
|
||||||
|
*
|
||||||
|
* Send Messages to users
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include "ncplib.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
struct ncp_conn *conn;
|
||||||
|
__u8 conn_list[256] = {0,};
|
||||||
|
int no_conn;
|
||||||
|
|
||||||
|
char *message = NULL;
|
||||||
|
char *user = NULL;
|
||||||
|
long err;
|
||||||
|
|
||||||
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "when initializing");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc != 3)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [options] user message\n", argv[0]);
|
||||||
|
ncp_close(conn);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
user = argv[1];
|
||||||
|
message = argv[2];
|
||||||
|
|
||||||
|
if ((err = ncp_get_connlist(conn, NCP_BINDERY_USER, user, &no_conn,
|
||||||
|
conn_list)) != 0)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "in get_connlist");
|
||||||
|
ncp_close(conn);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (no_conn == 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "No connection found for %s\n", user);
|
||||||
|
ncp_close(conn);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((err = ncp_send_broadcast(conn, no_conn, conn_list, message)) != 0)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "in send_broadcast");
|
||||||
|
ncp_close(conn);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
ncp_close(conn);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
161
util/nwbocreate.c
Normal file
161
util/nwbocreate.c
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
/*
|
||||||
|
* nwbocreate.c
|
||||||
|
*
|
||||||
|
* Create a bindery object on a NetWare server
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ncplib.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
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, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o: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':
|
||||||
|
case '?':
|
||||||
|
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;
|
||||||
|
}
|
||||||
125
util/nwbols.c
Normal file
125
util/nwbols.c
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
/*
|
||||||
|
* nwlsobj.c
|
||||||
|
*
|
||||||
|
* List bindery objects
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#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, "when initializing");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?vt:")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt) {
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
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;
|
||||||
|
}
|
||||||
121
util/nwboprops.c
Normal file
121
util/nwboprops.c
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
/*
|
||||||
|
* nwboprops.c
|
||||||
|
*
|
||||||
|
* List properties of a bindery object
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ncplib.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
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, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o: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':
|
||||||
|
case '?':
|
||||||
|
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;
|
||||||
|
}
|
||||||
106
util/nwborm.c
Normal file
106
util/nwborm.c
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* nwborm.c
|
||||||
|
*
|
||||||
|
* Destroy a bindery object on a NetWare server
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ncplib.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
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, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o:t:")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt) {
|
||||||
|
case 'o':
|
||||||
|
object_name = optarg;
|
||||||
|
str_upper(object_name);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
object_type = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
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;
|
||||||
|
}
|
||||||
247
util/nwbpadd.c
Normal file
247
util/nwbpadd.c
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
/*
|
||||||
|
* 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 <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
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, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o: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':
|
||||||
|
case '?':
|
||||||
|
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;
|
||||||
|
}
|
||||||
187
util/nwbpcreate.c
Normal file
187
util/nwbpcreate.c
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
/*
|
||||||
|
* nwbpcreate.c
|
||||||
|
*
|
||||||
|
* Create a property for a bindery object on a NetWare server
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ncplib.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
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, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o: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':
|
||||||
|
case '?':
|
||||||
|
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;
|
||||||
|
}
|
||||||
126
util/nwbprm.c
Normal file
126
util/nwbprm.c
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* nwbprm.c
|
||||||
|
*
|
||||||
|
* Delete a property of a bindery object on a NetWare server
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#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, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o: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':
|
||||||
|
case '?':
|
||||||
|
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;
|
||||||
|
}
|
||||||
262
util/nwbpvalues.c
Normal file
262
util/nwbpvalues.c
Normal file
@@ -0,0 +1,262 @@
|
|||||||
|
/*
|
||||||
|
* 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 <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_property(char *prop_name, __u8 *val, int segments);
|
||||||
|
|
||||||
|
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;
|
||||||
|
__u8 property_value[255*128];
|
||||||
|
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, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o: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':
|
||||||
|
case '?':
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
segno = 1;
|
||||||
|
while (ncp_read_property_value(conn, object_type, object_name,
|
||||||
|
segno, property_name, &segment) == 0)
|
||||||
|
{
|
||||||
|
memcpy(&(property_value[(segno-1)*128]), segment.value, 128);
|
||||||
|
if ((segment.more_flag == 0) || (segno == 255))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ((info.property_flags & 2) == 0)
|
||||||
|
{
|
||||||
|
print_property(property_name, property_value, segno);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int objects = 32 * segno;
|
||||||
|
__u32 *value = (__u32 *)property_value;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < objects; 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
finished:
|
||||||
|
ncp_close(conn);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_unknown(__u8 *val)
|
||||||
|
{
|
||||||
|
int j = (128/16);
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for ( i = 0 ; i < 16 ; i++ )
|
||||||
|
{
|
||||||
|
printf ( "%02X " , val[i] );
|
||||||
|
}
|
||||||
|
printf ( " [" );
|
||||||
|
for ( i = 0 ; i < 16 ; i++ )
|
||||||
|
{
|
||||||
|
printf ( "%c" , isprint(val[i]) ? val[i] : '.');
|
||||||
|
}
|
||||||
|
j -= 1;
|
||||||
|
if ( j == 0 )
|
||||||
|
{
|
||||||
|
printf ( "]\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
printf ( "]+\n" ) ;
|
||||||
|
val += 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_string(__u8 *val)
|
||||||
|
{
|
||||||
|
puts(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
char *pname ;
|
||||||
|
void (*func)(__u8 *) ;
|
||||||
|
} formats[] = {
|
||||||
|
{ "DESCRIPTION" , print_string } ,
|
||||||
|
{ "SURNAME" , print_string } ,
|
||||||
|
{ "OBJECT_CLASS" , print_string } ,
|
||||||
|
{ "DESCRIPTION" , print_string } ,
|
||||||
|
{ "IDENTIFICATION" , print_string } ,
|
||||||
|
{ "Q_DIRECTORY" , print_string } ,
|
||||||
|
{ NULL , NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_property(char *prop_name, __u8 *val, int segments)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
void (*f)(__u8 *);
|
||||||
|
|
||||||
|
for (i = 0; formats[i].pname != NULL; i++)
|
||||||
|
{
|
||||||
|
if (strcasecmp(prop_name, formats[i].pname) == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f = formats[i].func;
|
||||||
|
|
||||||
|
if (f != NULL)
|
||||||
|
{
|
||||||
|
f(val);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < segments; i++)
|
||||||
|
{
|
||||||
|
printf("Segment: %03d\n", i+1);
|
||||||
|
print_unknown(&(val[i*128]));
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
128
util/nwcrypt.c
128
util/nwcrypt.c
@@ -209,3 +209,131 @@ nw_encrypt(const unsigned char *fra,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* The following code was contributed by */
|
||||||
|
/* Guntram Blohm <gbl%th7csun1@str.daimler-benz.com> */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/* server side (mars etc.) should:
|
||||||
|
* store the *encrypted* password internally (output from shuffle)
|
||||||
|
* verify if nw_encrypt(cryptkey from GetCryptKey, old stored password)
|
||||||
|
== cryptkey in EncryptedChangePassword request buffer (this means
|
||||||
|
old password was correct)
|
||||||
|
* decrypt new password in request buffer using (yet to write) inverse of
|
||||||
|
newpassencrypt with old stored password as parameter
|
||||||
|
* compute the length of the unencrypted new password as len ^ (first byte of
|
||||||
|
old internal password) ^ (second byte of old internal password)
|
||||||
|
*/
|
||||||
|
|
||||||
|
static char
|
||||||
|
newshuffle[256+16] = {
|
||||||
|
0x0f, 0x08, 0x05, 0x07, 0x0c, 0x02, 0x0e, 0x09,
|
||||||
|
0x00, 0x01, 0x06, 0x0d, 0x03, 0x04, 0x0b, 0x0a,
|
||||||
|
0x02, 0x0c, 0x0e, 0x06, 0x0f, 0x00, 0x01, 0x08,
|
||||||
|
0x0d, 0x03, 0x0a, 0x04, 0x09, 0x0b, 0x05, 0x07,
|
||||||
|
|
||||||
|
0x05, 0x02, 0x09, 0x0f, 0x0c, 0x04, 0x0d, 0x00,
|
||||||
|
0x0e, 0x0a, 0x06, 0x08, 0x0b, 0x01, 0x03, 0x07,
|
||||||
|
0x0f, 0x0d, 0x02, 0x06, 0x07, 0x08, 0x05, 0x09,
|
||||||
|
0x00, 0x04, 0x0c, 0x03, 0x01, 0x0a, 0x0b, 0x0e,
|
||||||
|
|
||||||
|
0x05, 0x0e, 0x02, 0x0b, 0x0d, 0x0a, 0x07, 0x00,
|
||||||
|
0x08, 0x06, 0x04, 0x01, 0x0f, 0x0c, 0x03, 0x09,
|
||||||
|
0x08, 0x02, 0x0f, 0x0a, 0x05, 0x09, 0x06, 0x0c,
|
||||||
|
0x00, 0x0b, 0x01, 0x0d, 0x07, 0x03, 0x04, 0x0e,
|
||||||
|
|
||||||
|
0x0e, 0x08, 0x00, 0x09, 0x04, 0x0b, 0x02, 0x07,
|
||||||
|
0x0c, 0x03, 0x0a, 0x05, 0x0d, 0x01, 0x06, 0x0f,
|
||||||
|
0x01, 0x04, 0x08, 0x0a, 0x0d, 0x0b, 0x07, 0x0e,
|
||||||
|
0x05, 0x0f, 0x03, 0x09, 0x00, 0x02, 0x06, 0x0c,
|
||||||
|
|
||||||
|
0x05, 0x03, 0x0c, 0x08, 0x0b, 0x02, 0x0e, 0x0a,
|
||||||
|
0x04, 0x01, 0x0d, 0x00, 0x06, 0x07, 0x0f, 0x09,
|
||||||
|
0x06, 0x00, 0x0b, 0x0e, 0x0d, 0x04, 0x0c, 0x0f,
|
||||||
|
0x07, 0x02, 0x08, 0x0a, 0x01, 0x05, 0x03, 0x09,
|
||||||
|
|
||||||
|
0x0b, 0x05, 0x0a, 0x0e, 0x0f, 0x01, 0x0c, 0x00,
|
||||||
|
0x06, 0x04, 0x02, 0x09, 0x03, 0x0d, 0x07, 0x08,
|
||||||
|
0x07, 0x02, 0x0a, 0x00, 0x0e, 0x08, 0x0f, 0x04,
|
||||||
|
0x0c, 0x0b, 0x09, 0x01, 0x05, 0x0d, 0x03, 0x06,
|
||||||
|
|
||||||
|
0x07, 0x04, 0x0f, 0x09, 0x05, 0x01, 0x0c, 0x0b,
|
||||||
|
0x00, 0x03, 0x08, 0x0e, 0x02, 0x0a, 0x06, 0x0d,
|
||||||
|
0x09, 0x04, 0x08, 0x00, 0x0a, 0x03, 0x01, 0x0c,
|
||||||
|
0x05, 0x0f, 0x07, 0x02, 0x0b, 0x0e, 0x06, 0x0d,
|
||||||
|
|
||||||
|
0x09, 0x05, 0x04, 0x07, 0x0e, 0x08, 0x03, 0x01,
|
||||||
|
0x0d, 0x0b, 0x0c, 0x02, 0x00, 0x0f, 0x06, 0x0a,
|
||||||
|
0x09, 0x0a, 0x0b, 0x0d, 0x05, 0x03, 0x0f, 0x00,
|
||||||
|
0x01, 0x0c, 0x08, 0x07, 0x06, 0x04, 0x0e, 0x02,
|
||||||
|
|
||||||
|
0x03, 0x0e, 0x0f, 0x02, 0x0d, 0x0c, 0x04, 0x05,
|
||||||
|
0x09, 0x06, 0x00, 0x01, 0x0b, 0x07, 0x0a, 0x08,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* verschluesseln des neuen Passworts fuer keyed change password
|
||||||
|
* Verwendung:
|
||||||
|
* - Shuffle (aus nwcrypt.c) altes passwort nach old (16 bytes)
|
||||||
|
* - shuffle neues passwort nach new (16 bytes)
|
||||||
|
* - nwpassencrypt (diese Funktion) zweimal aufrufen fuer je 8 bytes:
|
||||||
|
* nwpassencrypt(old+0, new+0, out+0)
|
||||||
|
* nwpassencrypt(old+8, new+8, out+8)
|
||||||
|
* - NCP-Buffer aufbauen:
|
||||||
|
* 2 byte Laenge im Hi-Lo-Format
|
||||||
|
* 1 byte Funktion (0x4b)
|
||||||
|
* 8 byte (nwcrypt Ergebnis analog login/verify password)
|
||||||
|
* 2 byte Objecttype
|
||||||
|
* 1 byte Objectname-Laenge
|
||||||
|
* n byte Objectname
|
||||||
|
* 1 byte (Laenge des eingegebenen neuen Passworts ^ old[0] ^ old[1])&0x7f|0x40
|
||||||
|
* 16 byte (Ergebnis dieser Funktion doppelt aufgerufen, s.o.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Encrypt the new password for keyed change password
|
||||||
|
* For info on how to use this function, look at ncp_change_login_passwd
|
||||||
|
* in ncplib.c.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
newpassencrypt(char *old, char *new, char *out)
|
||||||
|
{
|
||||||
|
char *p, *bx;
|
||||||
|
char copy[8];
|
||||||
|
int i, di, ax;
|
||||||
|
char cl, dl, ch;
|
||||||
|
|
||||||
|
memcpy(copy, new, 8);
|
||||||
|
|
||||||
|
for (i=0; i<16; i++)
|
||||||
|
{
|
||||||
|
for (di=0, ax=0, p=old; di<8; di++, ax+=0x20, p++)
|
||||||
|
{
|
||||||
|
cl=newshuffle[(((copy[di]^*p)>>4)&0x0f)+ax+0x10]<<4;
|
||||||
|
dl=newshuffle[((copy[di]^*p)&0xf)+ax];
|
||||||
|
copy[di]=cl|dl;
|
||||||
|
}
|
||||||
|
|
||||||
|
ch=old[7];
|
||||||
|
for (bx=old+7; bx>old; bx--)
|
||||||
|
{
|
||||||
|
*bx=((bx[-1]>>4)&0x0f)|((*bx)<<4);
|
||||||
|
}
|
||||||
|
*old=((ch>>4)&0x0f)|(*old)<<4;
|
||||||
|
|
||||||
|
memset(out, '\0', 8);
|
||||||
|
|
||||||
|
for (di=0; di<16; di++)
|
||||||
|
{
|
||||||
|
if (newshuffle[di+0x100]&1)
|
||||||
|
ch=((copy[newshuffle[di+0x100]/2]>>4)&0x0f);
|
||||||
|
else
|
||||||
|
ch=copy[newshuffle[di+0x100]/2]&0x0f;
|
||||||
|
out[di/2]|=((di&1) ? ch<<4 : ch);
|
||||||
|
}
|
||||||
|
memcpy(copy, out, 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
103
util/nwfsinfo.c
103
util/nwfsinfo.c
@@ -11,33 +11,98 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include "ncplib.h"
|
#include "ncplib.h"
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [pattern]\n", progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
help(void)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("usage: %s [options]\n", progname);
|
||||||
|
printf("\n"
|
||||||
|
"-h Print this help text\n"
|
||||||
|
"-S server Server name to be used\n"
|
||||||
|
"\n"
|
||||||
|
"-d Print Description Strings\n"
|
||||||
|
"-t Print File Server's time\n"
|
||||||
|
"-i Print File Server Information\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_info(struct ncp_file_server_info *info)
|
||||||
|
{
|
||||||
|
printf ( "\n" ) ;
|
||||||
|
printf ( "Fileservername %-48.48s\n" , info->ServerName ) ;
|
||||||
|
printf ( "\n" ) ;
|
||||||
|
printf ( "Version %d.%d Revision %c\n" ,
|
||||||
|
info->FileServiceVersion , info->FileServiceSubVersion,
|
||||||
|
info->Revision + 'A' ) ;
|
||||||
|
printf ( "Max. Connections %d\n" ,
|
||||||
|
info->MaximumServiceConnections ) ;
|
||||||
|
printf ( "currently in use %d\n" ,
|
||||||
|
info->ConnectionsInUse ) ;
|
||||||
|
printf ( "peak connections %d\n" ,
|
||||||
|
info->MaxConnectionsEverUsed ) ;
|
||||||
|
printf ( "Max. Volumes %d\n" ,
|
||||||
|
info->NumberMountedVolumes ) ;
|
||||||
|
printf ( "SFTLevel %d\n" ,
|
||||||
|
info->SFTLevel ) ;
|
||||||
|
printf ( "TTSLevel %d\n" ,
|
||||||
|
info->TTSLevel ) ;
|
||||||
|
printf ( "Accountversion %d\n" ,
|
||||||
|
info->AccountVersion ) ;
|
||||||
|
printf ( "Queueversion %d\n" ,
|
||||||
|
info->QueueVersion ) ;
|
||||||
|
printf ( "Printversion %d\n" ,
|
||||||
|
info->PrintVersion ) ;
|
||||||
|
printf ( "Virt.Consolvers. %d\n" ,
|
||||||
|
info->VirtualConsoleVersion ) ;
|
||||||
|
printf ( "RestrictionLevel %d\n" ,
|
||||||
|
info->RestrictionLevel ) ;
|
||||||
|
printf("\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct ncp_conn conn;
|
struct ncp_conn *conn;
|
||||||
int opt;
|
int opt;
|
||||||
|
long err;
|
||||||
|
|
||||||
if (ncp_initialize(&conn, &argc, argv, 0) != 0)
|
progname = argv[0];
|
||||||
|
|
||||||
|
if ((conn = ncp_initialize(&argc, argv, 0, &err)) == NULL)
|
||||||
{
|
{
|
||||||
perror("Could not open connection");
|
com_err(argv[0], err, "when initializing");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "dt")) != EOF)
|
while ((opt = getopt(argc, argv, "h?dti")) != EOF)
|
||||||
{
|
{
|
||||||
switch(opt)
|
switch(opt)
|
||||||
{
|
{
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help();
|
||||||
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
{
|
{
|
||||||
char strings[512];
|
char strings[512];
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
if (ncp_get_file_server_description_strings(&conn,
|
if (ncp_get_file_server_description_strings(conn,
|
||||||
strings)
|
strings)
|
||||||
!= 0)
|
!= 0)
|
||||||
{
|
{
|
||||||
perror("could not get strings");
|
perror("could not get strings");
|
||||||
ncp_close(&conn);
|
ncp_close(conn);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,22 +122,36 @@ main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
time_t t;
|
time_t t;
|
||||||
|
|
||||||
if (ncp_get_file_server_time(&conn, &t) != 0)
|
if (ncp_get_file_server_time(conn, &t) != 0)
|
||||||
{
|
{
|
||||||
perror("could not get server time");
|
perror("could not get server time");
|
||||||
ncp_close(&conn);
|
ncp_close(conn);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fputs(ctime(&t), stdout);
|
fputs(ctime(&t), stdout);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
case 'i':
|
||||||
printf("unknown option: %c\n", opt);
|
{
|
||||||
|
struct ncp_file_server_info info;
|
||||||
|
if (ncp_get_file_server_information(conn, &info) != 0)
|
||||||
|
{
|
||||||
|
perror("Could not get server information");
|
||||||
|
ncp_close(conn);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
print_info(&info);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ncp_close(&conn);
|
finished:
|
||||||
|
ncp_close(conn);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
134
util/nwgrant.c
Normal file
134
util/nwgrant.c
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
* nwgrant.c
|
||||||
|
*
|
||||||
|
* Add trustee rights to file or directory
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ncplib.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
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, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o: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':
|
||||||
|
case '?':
|
||||||
|
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;
|
||||||
|
}
|
||||||
22
util/nwmsg.c
22
util/nwmsg.c
@@ -30,8 +30,9 @@ static char *progname;
|
|||||||
void
|
void
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct ncp_conn conn;
|
struct ncp_conn *conn;
|
||||||
char message[256];
|
char message[256];
|
||||||
|
char *mount_point;
|
||||||
struct ncp_fs_info info;
|
struct ncp_fs_info info;
|
||||||
struct passwd *pwd;
|
struct passwd *pwd;
|
||||||
char tty[256];
|
char tty[256];
|
||||||
@@ -39,6 +40,7 @@ main(int argc, char *argv[])
|
|||||||
FILE *tty_file;
|
FILE *tty_file;
|
||||||
FILE *mtab;
|
FILE *mtab;
|
||||||
struct mntent *mnt;
|
struct mntent *mnt;
|
||||||
|
long err;
|
||||||
|
|
||||||
|
|
||||||
progname = argv[0];
|
progname = argv[0];
|
||||||
@@ -52,18 +54,18 @@ main(int argc, char *argv[])
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ncp_open_mount(&conn, argv[1]) != 0)
|
mount_point = argv[1];
|
||||||
|
if ((conn = ncp_open_mount(mount_point, &err)) == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s: could not open connection %s\n",
|
com_err(progname, err, "in ncp_open_mount");
|
||||||
progname, argv[1]);
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ncp_get_broadcast_message(&conn, message) != 0)
|
if (ncp_get_broadcast_message(conn, message) != 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s: could not get broadcast message\n",
|
fprintf(stderr, "%s: could not get broadcast message\n",
|
||||||
progname);
|
progname);
|
||||||
ncp_close(&conn);
|
ncp_close(conn);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,15 +80,15 @@ main(int argc, char *argv[])
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
info.version = NCP_GET_FS_INFO_VERSION;
|
info.version = NCP_GET_FS_INFO_VERSION;
|
||||||
if (ioctl(conn.mount_fid, NCP_IOC_GET_FS_INFO, &info) < 0)
|
if (ioctl(conn->mount_fid, NCP_IOC_GET_FS_INFO, &info) < 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s: could not ioctl on connection: %s\n",
|
fprintf(stderr, "%s: could not ioctl on connection: %s\n",
|
||||||
progname, strerror(errno));
|
progname, strerror(errno));
|
||||||
ncp_close(&conn);
|
ncp_close(conn);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ncp_close(&conn);
|
ncp_close(conn);
|
||||||
|
|
||||||
if ((pwd = getpwuid(info.mounted_uid)) == NULL)
|
if ((pwd = getpwuid(info.mounted_uid)) == NULL)
|
||||||
{
|
{
|
||||||
@@ -104,7 +106,7 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
while ((mnt = getmntent(mtab)) != NULL)
|
while ((mnt = getmntent(mtab)) != NULL)
|
||||||
{
|
{
|
||||||
if (strcmp(mnt->mnt_dir, conn.mount_point) == 0)
|
if (strcmp(mnt->mnt_dir, mount_point) == 0)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
123
util/nwrevoke.c
Normal file
123
util/nwrevoke.c
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
/*
|
||||||
|
* nwrevoke.c
|
||||||
|
*
|
||||||
|
* Remove trustee rights from file or directory
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ncplib.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
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, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o:t:")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt) {
|
||||||
|
case 'o':
|
||||||
|
object_name = optarg;
|
||||||
|
str_upper(object_name);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
object_type = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
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;
|
||||||
|
}
|
||||||
143
util/nwuserlist.c
Normal file
143
util/nwuserlist.c
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
/*
|
||||||
|
* nwfsinfo.c
|
||||||
|
*
|
||||||
|
* Print the info strings of a server, maybe sometime more.
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "ncplib.h"
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [pattern]\n", progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
str_trim_right(char *s, char c)
|
||||||
|
{
|
||||||
|
int len = strlen(s) - 1;
|
||||||
|
|
||||||
|
while ((len > 0) && (s[len] == c))
|
||||||
|
{
|
||||||
|
s[len] = '\0';
|
||||||
|
len -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
help(void)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("usage: %s [options]\n", progname);
|
||||||
|
printf("\n"
|
||||||
|
"-h Print this help text\n"
|
||||||
|
"-S server Server name to be used\n"
|
||||||
|
"-a Print Station's addr\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
struct ncp_conn *conn;
|
||||||
|
int opt;
|
||||||
|
long err;
|
||||||
|
struct ncp_file_server_info info;
|
||||||
|
struct ncp_bindery_object user;
|
||||||
|
time_t login_time;
|
||||||
|
int i;
|
||||||
|
int print_addr = 0;
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
|
||||||
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?a")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt)
|
||||||
|
{
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help();
|
||||||
|
goto finished;
|
||||||
|
case 'a':
|
||||||
|
print_addr = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_get_file_server_information(conn, &info) != 0)
|
||||||
|
{
|
||||||
|
perror("Could not get server information");
|
||||||
|
ncp_close(conn);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isatty(1))
|
||||||
|
{
|
||||||
|
if (print_addr == 0)
|
||||||
|
{
|
||||||
|
printf("\n%-6s%-21s%-12s\n"
|
||||||
|
"---------------------------------------------"
|
||||||
|
"------\n",
|
||||||
|
"Conn",
|
||||||
|
"User name",
|
||||||
|
"Login time");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("\n%-6s%-21s%-27s%-12s\n"
|
||||||
|
"---------------------------------------------"
|
||||||
|
"---------------------------------\n",
|
||||||
|
"Conn",
|
||||||
|
"User name",
|
||||||
|
"Station Address",
|
||||||
|
"Login time");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 1; i <= info.MaximumServiceConnections; i++)
|
||||||
|
{
|
||||||
|
char name[49];
|
||||||
|
name[48] = '\0';
|
||||||
|
if (ncp_get_stations_logged_info(conn, i, &user,
|
||||||
|
&login_time) != 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
memcpy(name, user.object_name, 48);
|
||||||
|
str_trim_right(name, ' ');
|
||||||
|
printf("%4d: %-20s ", i, name);
|
||||||
|
|
||||||
|
if (print_addr != 0)
|
||||||
|
{
|
||||||
|
struct sockaddr_ipx addr;
|
||||||
|
__u8 conn_type;
|
||||||
|
|
||||||
|
memset(&addr, 0, sizeof(addr));
|
||||||
|
ncp_get_internet_address(conn, i, &addr, &conn_type);
|
||||||
|
ipx_print_saddr(&addr);
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s", ctime(&login_time));
|
||||||
|
}
|
||||||
|
|
||||||
|
finished:
|
||||||
|
ncp_close(conn);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -15,17 +15,18 @@
|
|||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct ncp_conn conn;
|
struct ncp_conn *conn;
|
||||||
struct ncp_bindery_object q;
|
struct ncp_bindery_object q;
|
||||||
int found = 0;
|
int found = 0;
|
||||||
|
|
||||||
char default_pattern[] = "*";
|
char default_pattern[] = "*";
|
||||||
char *pattern = default_pattern;
|
char *pattern = default_pattern;
|
||||||
char *p;
|
char *p;
|
||||||
|
long err;
|
||||||
|
|
||||||
if (ncp_initialize(&conn, &argc, argv, 1) != 0)
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
{
|
{
|
||||||
perror("Could not open connection");
|
com_err(argv[0], err, "when initializing");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +48,7 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
if (isatty(1))
|
if (isatty(1))
|
||||||
{
|
{
|
||||||
printf("\nServer: %s\n", conn.server);
|
printf("\nServer: %s\n", conn->server);
|
||||||
printf("%-52s%-10s\n"
|
printf("%-52s%-10s\n"
|
||||||
"-----------------------------------------------"
|
"-----------------------------------------------"
|
||||||
"-------------\n",
|
"-------------\n",
|
||||||
@@ -57,8 +58,8 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
q.object_id = 0xffffffff;
|
q.object_id = 0xffffffff;
|
||||||
|
|
||||||
while (ncp_scan_bindery_object(&conn, q.object_id,
|
while (ncp_scan_bindery_object(conn, q.object_id,
|
||||||
NCP_BINDERY_PQUEUE, "*", &q) == 0)
|
NCP_BINDERY_PQUEUE, pattern, &q) == 0)
|
||||||
{
|
{
|
||||||
found = 1;
|
found = 1;
|
||||||
printf("%-52s", q.object_name);
|
printf("%-52s", q.object_name);
|
||||||
@@ -70,6 +71,6 @@ main(int argc, char **argv)
|
|||||||
printf("No queues found\n");
|
printf("No queues found\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
ncp_close(&conn);
|
ncp_close(conn);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,12 +107,13 @@ daemon_init(void)
|
|||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct ncp_conn conn;
|
struct ncp_conn *conn;
|
||||||
int poll_timeout = 30;
|
int poll_timeout = 30;
|
||||||
int opt;
|
int opt;
|
||||||
int job_type = 0xffff;
|
int job_type = 0xffff;
|
||||||
int debug = 0;
|
int debug = 0;
|
||||||
int i;
|
int i;
|
||||||
|
long err;
|
||||||
|
|
||||||
char *queue_name = NULL;
|
char *queue_name = NULL;
|
||||||
|
|
||||||
@@ -146,9 +147,10 @@ main(int argc, char *argv[])
|
|||||||
openlog("pserver", LOG_PID, LOG_LPR);
|
openlog("pserver", LOG_PID, LOG_LPR);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ncp_initialize_as(&conn, &argc, argv, 1, NCP_BINDERY_PSERVER) != 0)
|
if ((conn = ncp_initialize_as(&argc, argv, 1,
|
||||||
|
NCP_BINDERY_PSERVER, &err)) == NULL)
|
||||||
{
|
{
|
||||||
perror("Could not open connection");
|
com_err(argv[0], err, "when initializing");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,10 +195,10 @@ main(int argc, char *argv[])
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (init_queue(&conn, queue_name, command, &q) != 0)
|
if (init_queue(conn, queue_name, command, &q) != 0)
|
||||||
{
|
{
|
||||||
perror("Could not init queue");
|
perror("Could not init queue");
|
||||||
ncp_close(&conn);
|
ncp_close(conn);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,9 +223,9 @@ main(int argc, char *argv[])
|
|||||||
sleep(poll_timeout);
|
sleep(poll_timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
ncp_detach_from_queue(&conn, q.queue_id);
|
ncp_detach_from_queue(conn, q.queue_id);
|
||||||
|
|
||||||
ncp_close(&conn);
|
ncp_close(conn);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
13
util/slist.c
13
util/slist.c
@@ -17,12 +17,13 @@
|
|||||||
void
|
void
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct ncp_conn conn;
|
struct ncp_conn *conn;
|
||||||
struct ncp_bindery_object obj;
|
struct ncp_bindery_object obj;
|
||||||
int found = 0;
|
int found = 0;
|
||||||
char default_pattern[] = "*";
|
char default_pattern[] = "*";
|
||||||
char *pattern = default_pattern;
|
char *pattern = default_pattern;
|
||||||
char *p;
|
char *p;
|
||||||
|
long err;
|
||||||
|
|
||||||
if (argc > 2)
|
if (argc > 2)
|
||||||
{
|
{
|
||||||
@@ -40,9 +41,9 @@ main(int argc, char *argv[])
|
|||||||
*p = toupper(*p);
|
*p = toupper(*p);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ncp_initialize(&conn, &argc, argv, 0) != 0)
|
if ((conn = ncp_open(NULL, &err)) == NULL)
|
||||||
{
|
{
|
||||||
perror("ncp_connect");
|
com_err(argv[0], err, "in ncp_open");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,7 +59,7 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
obj.object_id = 0xffffffff;
|
obj.object_id = 0xffffffff;
|
||||||
|
|
||||||
while (ncp_scan_bindery_object(&conn, obj.object_id,
|
while (ncp_scan_bindery_object(conn, obj.object_id,
|
||||||
NCP_BINDERY_FSERVER, pattern,
|
NCP_BINDERY_FSERVER, pattern,
|
||||||
&obj) == 0)
|
&obj) == 0)
|
||||||
{
|
{
|
||||||
@@ -70,7 +71,7 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
printf("%-52s", obj.object_name);
|
printf("%-52s", obj.object_name);
|
||||||
|
|
||||||
if (ncp_read_property_value(&conn, NCP_BINDERY_FSERVER,
|
if (ncp_read_property_value(conn, NCP_BINDERY_FSERVER,
|
||||||
obj.object_name, 1, "NET_ADDRESS",
|
obj.object_name, 1, "NET_ADDRESS",
|
||||||
&prop) == 0)
|
&prop) == 0)
|
||||||
{
|
{
|
||||||
@@ -86,6 +87,6 @@ main(int argc, char *argv[])
|
|||||||
printf("No servers found\n");
|
printf("No servers found\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
ncp_close(&conn);
|
ncp_close(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user