Compare commits

..

7 Commits

Author SHA1 Message Date
ncpfs archive import
134b5d6ebf Import ncpfs 2.0.6 2026-04-28 20:39:58 +02:00
ncpfs archive import
ab78307868 Import ncpfs 2.0.5 2026-04-28 20:39:58 +02:00
ncpfs archive import
3019bba627 Import ncpfs 2.0.4 2026-04-28 20:39:58 +02:00
ncpfs archive import
011a5107c5 Import ncpfs 2.0.3 2026-04-28 20:39:58 +02:00
ncpfs archive import
7179281575 Import ncpfs 2.0.2 2026-04-28 20:39:58 +02:00
ncpfs archive import
b8d830f9a3 Import ncpfs 2.0.1 2026-04-28 20:39:58 +02:00
ncpfs archive import
b36a27bedb Import ncpfs 2.0.0 2026-04-28 20:39:58 +02:00
74 changed files with 5928 additions and 256 deletions

BIN
.downloads/ncpfs-2.0.0.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-2.0.1.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-2.0.2.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-2.0.3.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-2.0.4.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-2.0.5.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-2.0.6.tgz Normal file

Binary file not shown.

14
BUGS
View File

@@ -5,6 +5,20 @@ But there are really problems that might be fixed in the future.
-------------------------------------------------------------------------------
You might experience lockups of ncpfs volumes. It happens especially
under high network traffic, not necessarily only IPX traffic. I am not
able to reproduce this problem on my machine, so I'm sorry I can not
do anything about that. When such a lockup happens, you have to shut
down the complete ipx subsystem by deleting all ipx interfaces,
unmounting all ncpfs volumes (in this order!) and restarting all
again.
For the kernel hackers who want to look at the problem: The routine
ipx_sendmsg in net/ipx/af_ipx.c sometimes locks forever if called with
nonblock=0. I DO NOT KNOW WHY!!! HELP ME, PLEASE!
-------------------------------------------------------------------------------
'df' returns 0: Free disk space is distributed among the volumes in
NetWare. df is only able to report one number per mounted
filesystem. As connections are quite expensive for NetWare (with

70
Changes
View File

@@ -1,6 +1,74 @@
I only began this file with ncpfs-0.12. If you're interested in older
versions, you can find them on ftp.gwdg.de:/pub/linux/misc/ncpfs/old.
ncpfs-2.0.5 -> ncpfs-2.0.6
- Added a short description of a problem that I need help with to the
file BUGS. If you know a bit of the linux networking code, please
take a look at it. Thanks a lot.
- Added canonic output format to nwpbvalues and the command nwbpset. I
would like to invite you to help building capable bindery management
utilities. For little examples, look at the manual page of nwbpset.
- Added some values to ipxparse. Those interested in NDS should take a
look at it. It's really not much, but maybe it's a beginning.
ncpfs-2.0.4 -> ncpfs-2.0.5
- Removed another bug in nwbpvalues.
- Cleaned up man/Makefile
- Some manpage typos fixed. Thanks to Jim Van Zandt
<jrv@mbunix.mitre.org>
- added nwrights
ncpfs-2.0.3 -> ncpfs-2.0.4
- Changed name of npasswd to nwpasswd, as npasswd collides with
RedHat. Thanks to Mike Slater <mslater@nfinity.com> for pointing me
at this one.
- Put '\r\n' into nwmsg, because sometimes it did not print
correctly. Thanks to Petr Vandrovec Ing. VTEI
<VANDROVE@vcnet.vc.cvut.cz> for this one.
- Improved the ELF Makefile for ELF support. Thanks to Uwe Bonnes
<bon@elektron.ikp.physik.th-darmstadt.de>.
- Removed a very embarassing bug in nwpvalues :-(.
- Added a some routines to nwbpvalues.
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 ..'.
@@ -110,4 +178,4 @@ ncpfs-0.12 -> ncpfs-0.13
- support for automatic loading of ncpfs.o by kerneld.
Thanks to Steven N. Hirsch <hirsch@emba.uvm.edu>.
- 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.

7
FAQ
View File

@@ -37,13 +37,6 @@ packet signatures on the 4.1 server, as ncpfs does not support them.
-------------------------------------------------------------------------------
Q: Does ncpfs support long file names, using the OS/2 namespace?
No. Not yet. I still have to sort out how that really works. But it should
certainly be possible.
-------------------------------------------------------------------------------
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?

View File

@@ -2,29 +2,46 @@
# Makefile for the linux ncp-filesystem routines.
#
VERSION = 0.24
VERSION = 2.0.6
# If you are using kerneld to autoload ncp support,
# uncomment this (kerneld is in linux since about 1.3.57):
#KERNELD = -DHAVE_KERNELD
# If your system is ELF, either also do a 'make install', or append the util/
# directory where the dynamic library resides to the environment
# variable LD_LIBRARY_PATH
HAVE_ELF=$(shell file `which gcc`|grep ELF >/dev/null && echo -n 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 -b3)
KVERSION=$(shell uname -r | cut -b1-3)
ifeq ($(KVERSION),2)
ifeq ($(KVERSION),1.2)
SUBDIRS += kernel-1.2/src
INCLUDES = -I$(TOPDIR)/kernel-1.2
endif
export INCLUDES BINDIR INTERM_BINDIR SBINDIR KERNELD VERSION
export INCLUDES BINDIR INTERM_BINDIR SBINDIR KERNELD VERSION HAVE_ELF
all:
for i in $(SUBDIRS); do make -C $$i all; done
@if [ "$(HAVE_ELF)" = yes ] ;\
then \
echo ; echo ; echo ;\
echo Please add \'`pwd`/util\' to the environment ; \
echo variable LD_LIBRARY_PATH by executing ; \
echo ;\
echo export LD_LIBRARY_PATH=\"\$$LD_LIBRARY_PATH:`pwd`/util\" ; \
echo ;\
echo or do a \'make install\'. ;\
echo ;\
fi
dep:
for i in $(SUBDIRS); do make -C $$i dep; done
@@ -42,7 +59,7 @@ clean:
mrproper: clean
rm -fr $(INTERM_BINDIR)/* ncpfs.tgz
make -C util mrproper
(cd daemon; make clean)
make -C ipxdump mrproper
modules: ncpfs.o
@@ -51,12 +68,10 @@ SRCDIR=$(shell basename $(SRCPATH))
DISTFILE=$(SRCDIR).tgz
dist: mrproper
mv daemon ..
(cd ..; \
tar cvf - $(SRCDIR) | \
gzip -9 > $(DISTFILE); \
mv $(DISTFILE) $(SRCDIR))
mv ../daemon .
make dep
make all

25
README
View File

@@ -3,6 +3,25 @@ some little utilities it also contains nprint, which enables you to
print on NetWare print queues. The opposite side, pserver, is also
provided.
ncpfs works with NetWare versions 3.x and following. It does NOT work
with NetWare version 2.x. Some of the NetWare look-alikes, such as
CD-ROM servers WinNT 3.51 Server are also NOT supported. This
restriction comes from the fact that ncpfs relies heavily on the name
space facilities NetWare supports since version 3. When you want to
mount volumes that have been exported by mars_nwe, you have to
activate the name space calls in mars_nwe's config.h file, although
probably it's more clever to use nfs between two Linux machines.
The user-space utilities such as nprint and the bindery utils should
work with all versions of NetWare.
ncpfs does NOT support access to the NDS, so if you want to mount
volumes exported by a NetWare 4.x server, you will have to install the
bindery emulation on that server. If you need access to the NDS, ask
Caldera for their CND. See http://www.caldera.com for more
information.
INSTALLATION
Before you start the installation, make sure that your kernel has IPX
@@ -33,6 +52,12 @@ ncpfs.
If you are running kerneld, please uncomment the corresponding line in
the Makefile to reflect this.
If your system is ELF, please enable the use of the shared ncp-library
in the Makefile. This will save at least 1MB of disk space.
After you adapted your Makefile, type 'make' and, as root, 'make install'.
HELP
In the meantime my mail volume has grown considerably, so the response

5
TODO
View File

@@ -1,9 +1,6 @@
Here's a list of things I want to do. Feel free to send suggestions,
or even help me ;-).
- little utilities for bindery access, such as nwlsobj, nwlsprop,
nwcreateobj and so on.
- Add flags to pserver's command line, so that the print command can
find out the name of user who printed the job.
@@ -15,6 +12,4 @@ or even help me ;-).
a single NCP connection. This should make the trade-off mentioned in
ncpmount.8 unnecessary.
- long file names
- Do some kind of mapping of NCP uid's to unix uid's

View File

@@ -12,6 +12,7 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <errno.h>
struct option options[] = {
{ "auto_primary", required_argument, NULL, 1 },
@@ -66,8 +67,14 @@ main(int argc, char **argv)
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
if (s < 0) {
int old_errno = errno;
sprintf(errmsg, "%s: socket", progname);
perror(errmsg);
if (old_errno == -EINVAL)
{
fprintf(stderr, "Probably you have no IPX support in "
"your kernel\n");
}
exit(-1);
}

View File

@@ -15,6 +15,7 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <errno.h>
static struct ifreq id;
static char *progname;
@@ -118,8 +119,14 @@ ipx_add_interface(int argc, char **argv)
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
if (s < 0) {
int old_errno = errno;
sprintf(errmsg, "%s: socket", progname);
perror(errmsg);
if (old_errno == -EINVAL)
{
fprintf(stderr, "Probably you have no IPX support in "
"your kernel\n");
}
exit(-1);
}

Binary file not shown.

Binary file not shown.

View File

@@ -89,10 +89,31 @@ struct ncp_reply_header {
__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_ncp (struct sockaddr_ipx *source,
struct sockaddr_ipx *target,
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
@@ -165,6 +186,12 @@ handle_ipx (unsigned char *buf, int length, char *frame, int no)
ipx_print_saddr(&d_addr);
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)
|| (ntohs(d_addr.sipx_port) == 0x451))
{
@@ -253,9 +280,59 @@ handle_ipx (unsigned char *buf, int length, char *frame, int no)
}
void handle_ncp (struct sockaddr_ipx *source,
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,
struct sockaddr_ipx *target,
unsigned char *buf, int length, int no)
{
struct ncp_request_header *rq = (struct ncp_request_header *)buf;
struct ncp_reply_header *rs = (struct ncp_reply_header *)buf;
@@ -263,6 +340,10 @@ void handle_ncp (struct sockaddr_ipx *source,
int data_length = 0;
int i;
static struct sockaddr_ipx request_source;
static struct ncp_request_header request_header;
static char request_data[5];
if (ntohs(rq->type) == NCP_REQUEST)
{
/* Request */
@@ -270,11 +351,19 @@ void handle_ncp (struct sockaddr_ipx *source,
rq->conn_low + 256 * rq->conn_high,
rq->sequence, rq->task);
memcpy(&request_source, source, sizeof(request_source));
memcpy(&request_header, rq, sizeof(request_header));
memcpy(request_data, rq+1, sizeof(request_data));
data = buf + sizeof(struct ncp_request_header);
data_length = length - sizeof(struct ncp_request_header);
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");
@@ -305,6 +394,21 @@ void handle_ncp (struct sockaddr_ipx *source,
case 01:
printf("Get Directory Path\n");
break;
case 02:
printf("Scan Directory Information\n");
break;
case 03:
printf("Get Effective Directory Rights\n");
break;
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;
@@ -314,6 +418,12 @@ void handle_ncp (struct sockaddr_ipx *source,
case 21:
printf("Get Volume Info with handle\n");
break;
case 39:
printf("Add ext. Trustee to Dir or File\n");
break;
case 48:
printf("Get Name Space Directory Entry\n");
break;
}
data += 3;
data_length -= 3;
@@ -326,6 +436,9 @@ void handle_ncp (struct sockaddr_ipx *source,
case 17:
printf("Get Fileserver Information\n");
break;
case 22:
printf("Get Station's logged Info (old)\n");
break;
case 23:
printf("Get Crypt Key\n");
break;
@@ -335,21 +448,54 @@ void handle_ncp (struct sockaddr_ipx *source,
case 28:
printf("Get Connection Information\n");
break;
case 50:
printf("Create Bindery Object\n");
break;
case 53:
printf("Get Bindery Object ID\n");
break;
case 54:
printf("Get Bindery Object Name\n");
break;
case 55:
printf("Scan Bindery Object\n");
break;
case 57:
printf("Create Property\n");
break;
case 59:
printf("Change Property Security\n");
break;
case 60:
printf("Scan Property\n");
break;
case 61:
printf("Read Property Value\n");
break;
case 62:
printf("Write Property Value\n");
break;
case 65:
printf("Add Bindery Object to Set\n");
break;
case 67:
printf("Is Bindery Object in Set\n");
break;
case 70:
printf("Get Bindery Access Level\n");
break;
case 72:
printf("Get Bindery Object Access Level\n");
break;
case 75:
printf("Keyed change password\n");
break;
case 113:
printf("Service Queue Job (old)\n");
break;
case 124:
printf("Service Queue Job \n");
break;
}
data += 3;
@@ -359,6 +505,10 @@ void handle_ncp (struct sockaddr_ipx *source,
printf("fn: %-3d\n", rq->function);
printf("End of Job\n");
break;
case 33:
printf("fn: %-3d\n", rq->function);
printf("Negotiate Buffer size\n");
break;
case 34:
printf("fn: %-3d, subfn: %-3d\n", rq->function,
data[2]);
@@ -381,6 +531,10 @@ void handle_ncp (struct sockaddr_ipx *source,
printf("fn: %-3d\n", rq->function);
printf("Close File\n");
break;
case 67:
printf("fn: %-3d\n", rq->function);
printf("Create File\n");
break;
case 72:
printf("fn: %-3d\n", rq->function);
printf("Read from File\n");
@@ -393,6 +547,11 @@ void handle_ncp (struct sockaddr_ipx *source,
printf("fn: %-3d\n", rq->function);
printf("Set File Time Date Stamp\n");
break;
case 76:
printf("fn: %-3d\n", rq->function);
printf("Open File (old)\n");
break;
case 87:
printf("fn: %-3d, subfn: %-3d\n",
rq->function, data[0]);
@@ -425,10 +584,351 @@ void handle_ncp (struct sockaddr_ipx *source,
case 8:
printf("Delete a File Or Subdirectory\n");
break;
case 12:
printf("Allocate Short Directory Handle\n");
break;
}
data += 1;
data_length -= 1;
break;
case 97:
{
struct INPUT
{
__u16 proposed_max_size;
__u8 security_flag;
} *i = (struct INPUT *)data;
printf("fn: %-3d\n", rq->function);
printf("Get Big Packet NCP Max Packet Size\n");
printf("proposed_max_size: %x\n",
ntohs(i->proposed_max_size));
printf("security_flag: %x\n",
i->security_flag);
break;
}
case 101:
{
struct INPUT
{
__u32 local_conn_id;
__u32 local_max_packet_size;
__u16 local_target_socket;
__u32 local_max_send_size;
__u32 local_max_recv_size;
} *i = (struct INPUT *)data;
printf("fn: %-3d\n", rq->function);
printf("Packet Burst Connection Request\n");
printf("local_conn_id: %lx\n",
ntohl(i->local_conn_id));
printf("local_max_packet_size: %lx\n",
ntohl(i->local_max_packet_size));
printf("local_target_socket: %lx\n",
ntohl(i->local_target_socket));
printf("local_max_send_size: %lx\n",
ntohl(i->local_max_send_size));
printf("local_max_recv_size: %lx\n",
ntohl(i->local_max_recv_size));
}
break;
case 104:
{
printf("fn: %-3d, subfn: %-3d, NDS call\n",
rq->function, data[0]);
/* I took this information from the (german!!)
book 'Einf"uhrung in die NetWare LAN
Analyse', Laura A. Chappell, Dan E. Hakes,
Novell Press, Markt & Technik, ISBN
3-8272-5084-6, and from the book mentioned
in the ncpfs README. I'm not sure it is
correct, because I do not have NW 4.x. If
you have the time, could you watch a NW4
workstation, and tell me whether anything
of this makes sense at all. */
switch(data[0])
{
case 1:
printf("Ping for NDS\n");
break;
case 2:
{
struct INPUT
{
__u8 subfunction_code;
__u32 fragger_handle;
__u32 max_fragment_size;
__u32 message_size;
__u32 fragment_flag;
__u32 verb;
} *i = (struct INPUT *)data;
printf("Send NDS Fragment Request/Reply\n");
printf("fragger_handle: %lx\n",
(unsigned long)i->fragger_handle);
printf("max_fragment_size: %lx\n",
(unsigned long)i->max_fragment_size);
printf("message_size: %lx\n",
(unsigned long)i->message_size);
printf("fragment_flag: %lx\n",
(unsigned long)i->fragment_flag);
printf("verb: %d\n", i->verb);
switch (i->verb)
{
case 1:
printf("Resolve Name\n");
break;
case 2:
printf("Read Entry Information\n");
break;
case 3:
printf("Read\n");
break;
case 4:
printf("Compare\n");
break;
case 5:
printf("List\n");
break;
case 6:
printf("Search Entries\n");
break;
case 7:
printf("Add Entry\n");
break;
case 8:
printf("Remove Entry\n");
break;
case 9:
printf("Modify Entry\n");
break;
case 10:
printf("Modify RDN\n");
break;
case 11:
printf("Create Attribute\n");
break;
case 12:
printf("Read Attribute Definition\n");
break;
case 13:
printf("Remove Attribute Definition\n");
break;
case 14:
printf("Define Class\n");
break;
case 15:
printf("Read Class Definition\n");
break;
case 16:
printf("Modify Class Definition\n");
break;
case 17:
printf("Remove Class Definition\n");
break;
case 18:
printf("List Containable Classes\n");
break;
case 19:
printf("Get Effective Rights\n");
break;
case 20:
printf("Add Partition\n");
break;
case 21:
printf("Remove Partition\n");
break;
case 22:
printf("List Partitions\n");
break;
case 23:
printf("Split Partition\n");
break;
case 24:
printf("Join Partitions\n");
break;
case 25:
printf("Add Replica\n");
break;
case 26:
printf("Remove Replica\n");
break;
case 27:
printf("Open Stream\n");
break;
case 28:
printf("Search Filter\n");
break;
case 29:
printf("Create Subordinate Reference\n");
break;
case 30:
printf("Link Replica\n");
break;
case 31:
printf("Change Replica Type\n");
break;
case 32:
printf("Start Update Schema\n");
break;
case 33:
printf("End Update Schema\n");
break;
case 34:
printf("Update Schema\n");
break;
case 35:
printf("Start Update Replica\n");
break;
case 36:
printf("End Update Replica\n");
break;
case 37:
printf("Update Replica\n");
break;
case 38:
printf("Synchronize Partition\n");
break;
case 39:
printf("Synchronize Schema\n");
break;
case 40:
printf("Read Syntaxes\n");
break;
case 41:
printf("Get Replica Root ID\n");
break;
case 42:
printf("Begin Move Entry\n");
break;
case 43:
printf("Finish Move Entry\n");
break;
case 44:
printf("Release Moved Entry\n");
break;
case 45:
printf("Backup Entry\n");
break;
case 46:
printf("Restore Entry\n");
break;
case 47:
printf("Save DIB\n");
break;
case 48:
case 49:
printf("Unused\n");
break;
case 50:
printf("Close Iteration\n");
break;
case 51:
printf("Unused\n");
break;
case 52:
printf("Audit Skulking\n");
break;
case 53:
printf("Get Server Address\n");
break;
case 54:
printf("Set Keys\n");
break;
case 55:
printf("Change Password\n");
break;
case 56:
printf("Verify Password\n");
break;
case 57:
printf("Begin Login\n");
break;
case 58:
printf("Finish Login\n");
break;
case 59:
printf("Begin Authentication\n");
break;
case 60:
printf("Finish Authentication\n");
break;
case 61:
printf("Logout\n");
break;
case 62:
printf("Repair Ring\n");
break;
case 63:
printf("Repair Timestamps\n");
break;
case 64:
printf("Create Back Link\n");
break;
case 65:
printf("Delete External Reference\n");
break;
case 66:
printf("Rename External Reference\n");
break;
case 67:
printf("Create Directory Entry\n");
break;
case 68:
printf("Remove Directory Entry\n");
break;
case 69:
printf("Designate New Master\n");
break;
case 70:
printf("Change Tree Name\n");
break;
case 71:
printf("Partition Entry Count\n");
break;
case 72:
printf("Check Login Restrictions\n");
break;
case 73:
printf("Start Join\n");
break;
case 74:
printf("Low Level Split\n");
break;
case 75:
printf("Low Level Join\n");
break;
case 76:
printf("Abort Low Level Join\n");
break;
case 77:
printf("Get All Servers\n");
break;
default:
printf("Unknown Verb: %d\n",
data[0]);
break;
}
break;
}
case 3:
printf("Close NDS Fragment\n");
break;
case 4:
printf("Return Bindery Context\n");
break;
case 5:
printf("Monitor NDS connection\n");
break;
case 200:
printf("NDS Auditing\n");
break;
default:
break;
}
}
default:
printf("fn: %-3d\n", rq->function);
}
@@ -444,6 +944,70 @@ void handle_ncp (struct sockaddr_ipx *source,
data = buf + sizeof(struct ncp_reply_header);
data_length = length - sizeof(struct ncp_reply_header);
if ( (memcmp(&request_source, target,
sizeof(request_source)) == 0)
&& (request_header.sequence == rs->sequence))
{
switch (request_header.function)
{
case 22:
switch (request_data[2])
{
case 18:
{
struct XDATA
{
__u8 new_directory_handle;
__u8 access_rights_mask;
} *x = (struct XDATA *)data;
printf("new_directory_handle: %x\n",
x->new_directory_handle);
printf("access_rights_mask: %x\n",
x->access_rights_mask);
}
break;
}
break;
case 72:
printf("Read data\n");
data_length = 0;
break;
case 97:
{
struct XDATA
{
__u16 accepted_max_size;
__u16 echo_socket;
__u8 security_flag;
} *x = (struct XDATA *)data;
printf("accepted_max_size: %x\n",
ntohs(x->accepted_max_size));
printf("echo_socket: %x\n",
ntohs(x->echo_socket));
printf("security_flag: %x\n",
(x->security_flag));
}
break;
case 101:
{
struct XDATA
{
__u8 completion_code;
__u32 remote_target_id;
__u32 remote_max_packet_size;
} *x = (struct XDATA *)data;
printf("completion_code: %x\n",
x->completion_code);
printf("remote_target_id: %lx\n",
ntohl(x->remote_target_id));
printf("remote_max_packet_size: %lx\n",
ntohl(x->remote_max_packet_size));
}
break;
}
}
}
if (data == NULL)

View File

@@ -116,6 +116,12 @@ struct ncp_file_info {
__u16 update_time;
};
/* Defines for Name Spaces */
#define NW_NS_DOS 0
#define NW_NS_MAC 1
#define NW_NS_NFS 2
#define NW_NS_FTAM 3
#define NW_NS_OS2 4
/* Defines for ReturnInformationMask */
#define RIM_NAME (0x0001L)

View File

@@ -21,6 +21,8 @@ struct ncp_server {
interest for us later, so we store
it completely. */
__u8 name_space[NCP_NUMBER_OF_VOLUMES];
struct file *ncp_filp; /* File pointer to ncp socket */
struct file *wdog_filp; /* File pointer to wdog socket */
void *data_ready; /* The wdog socket gets a new

View File

@@ -97,6 +97,20 @@ str_lower(char *name)
}
}
static inline int
ncp_namespace(struct inode *i)
{
struct ncp_server *server = NCP_SERVER(i);
struct nw_info_struct *info = NCP_ISTRUCT(i);
return server->name_space[info->volNumber];
}
static inline int
ncp_preserve_case(struct inode *i)
{
return (ncp_namespace(i) == NW_NS_OS2);
}
static struct file_operations ncp_dir_operations = {
NULL, /* lseek - default */
ncp_dir_read, /* read - bad */
@@ -133,7 +147,7 @@ struct inode_operations ncp_dir_inode_operations = {
/* Here we encapsulate the inode number handling that depends upon the
* mount mode: When we mount a complete server, the memory address of
* the npc_inode_info is used as an inode. When only a single volume
* is mounted, then the DosDirNum is used as the inode number. As this
* is mounted, then the dirEntNum is used as the inode number. As this
* is unique for the complete volume, this should enable the NFS
* exportability of a ncpfs-mounted volume.
*/
@@ -148,7 +162,7 @@ inline ino_t
ncp_info_ino(struct ncp_server *server, struct ncp_inode_info *info)
{
return ncp_single_volume(server)
? info->finfo.i.DosDirNum : (ino_t)info;
? info->finfo.i.dirEntNum : (ino_t)info;
}
static inline int
@@ -351,9 +365,12 @@ ncp_readdir(struct inode *inode, struct file *filp,
c_last_returned_index = 0;
index = 0;
for (i = 0; i < c_size; i++)
if (!ncp_preserve_case(inode))
{
str_lower(c_entry[i].i.entryName);
for (i = 0; i < c_size; i++)
{
str_lower(c_entry[i].i.entryName);
}
}
}
}
@@ -375,7 +392,7 @@ ncp_readdir(struct inode *inode, struct file *filp,
if (ncp_single_volume(server))
{
ino = (ino_t)(entry->i.DosDirNum);
ino = (ino_t)(entry->i.dirEntNum);
}
else
{
@@ -671,7 +688,7 @@ ncp_init_root(struct ncp_server *server)
root->finfo.opened = 0;
i->attributes = aDIR;
i->dataStreamSize = 1024;
i->DosDirNum = 0;
i->dirEntNum = i->DosDirNum = 0;
i->volNumber = NCP_NUMBER_OF_VOLUMES+1; /* illegal volnum */
ncp_date_unix2dos(0, &(i->creationTime), &(i->creationDate));
ncp_date_unix2dos(0, &(i->modifyTime), &(i->modifyDate));
@@ -748,7 +765,7 @@ ncp_find_dir_inode(struct inode *dir, const char *name)
do
{
if ( (result->dir->finfo.i.DosDirNum == dir_info->DosDirNum)
if ( (result->dir->finfo.i.dirEntNum == dir_info->dirEntNum)
&& (result->dir->finfo.i.volNumber == dir_info->volNumber)
&& (strcmp(result->finfo.i.entryName, name) == 0)
/* The root dir is never looked up using this
@@ -776,7 +793,7 @@ ncp_lookup(struct inode *dir, const char *__name, int len,
struct ncp_server *server;
struct ncp_inode_info *result_info;
int found_in_cache;
int down_case = 0;
char name[len+1];
*result = NULL;
@@ -887,20 +904,26 @@ ncp_lookup(struct inode *dir, const char *__name, int len,
if (found_in_cache == 0)
{
int res;
str_upper(name);
DDPRINTK("ncp_lookup: do_lookup on %s/%s\n",
NCP_ISTRUCT(dir)->entryName, name);
if (ncp_is_server_root(dir))
{
str_upper(name);
down_case = 1;
res = ncp_lookup_volume(server, name, &(finfo.i));
}
else
{
if (!ncp_preserve_case(dir))
{
str_upper(name);
down_case = 1;
}
res = ncp_obtain_info(server,
NCP_ISTRUCT(dir)->volNumber,
NCP_ISTRUCT(dir)->DosDirNum,
NCP_ISTRUCT(dir)->dirEntNum,
name, &(finfo.i));
}
if (res != 0)
@@ -912,7 +935,11 @@ ncp_lookup(struct inode *dir, const char *__name, int len,
}
finfo.opened = 0;
str_lower(finfo.i.entryName);
if (down_case != 0)
{
str_lower(finfo.i.entryName);
}
if (!(*result = ncp_iget(dir, &finfo)))
{
@@ -949,7 +976,11 @@ ncp_create(struct inode *dir, const char *name, int len, int mode,
strncpy(_name, name, len);
_name[len] = '\0';
str_upper(_name);
if (!ncp_preserve_case(dir))
{
str_upper(_name);
}
lock_super(dir->i_sb);
if (ncp_open_create_file_or_subdir(NCP_SERVER(dir),
@@ -966,7 +997,11 @@ ncp_create(struct inode *dir, const char *name, int len, int mode,
ncp_invalid_dir_cache(dir);
str_lower(finfo.i.entryName);
if (!ncp_preserve_case(dir))
{
str_lower(finfo.i.entryName);
}
finfo.access = O_RDWR;
if (!(*result = ncp_iget(dir, &finfo)) < 0)
@@ -1000,7 +1035,11 @@ ncp_mkdir(struct inode *dir, const char *name, int len, int mode)
strncpy(_name, name, len);
_name[len] = '\0';
str_upper(_name);
if (!ncp_preserve_case(dir))
{
str_upper(_name);
}
if (!dir || !S_ISDIR(dir->i_mode))
{
@@ -1058,7 +1097,11 @@ ncp_rmdir(struct inode *dir, const char *name, int len)
strncpy(_name, name, len);
_name[len] = '\0';
str_upper(_name);
if (!ncp_preserve_case(dir))
{
str_upper(_name);
}
if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir),
NCP_ISTRUCT(dir),
@@ -1101,7 +1144,11 @@ ncp_unlink(struct inode *dir, const char *name, int len)
{
strncpy(_name, name, len);
_name[len] = '\0';
str_upper(_name);
if (!ncp_preserve_case(dir))
{
str_upper(_name);
}
if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir),
NCP_ISTRUCT(dir),
@@ -1155,11 +1202,19 @@ ncp_rename(struct inode *old_dir, const char *old_name, int old_len,
strncpy(_old_name, old_name, old_len);
_old_name[old_len] = '\0';
str_upper(_old_name);
if (!ncp_preserve_case(old_dir))
{
str_upper(_old_name);
}
strncpy(_new_name, new_name, new_len);
_new_name[new_len] = '\0';
str_upper(_new_name);
if (!ncp_preserve_case(new_dir))
{
str_upper(_new_name);
}
res = ncp_ren_or_mov_file_or_subdir(NCP_SERVER(old_dir),
NCP_ISTRUCT(old_dir), _old_name,

View File

@@ -188,25 +188,6 @@ ncp_get_volume_info_with_number(struct ncp_server *server, int n,
return 0;
}
int
ncp_get_volume_number(struct ncp_server *server, const char *name, int *target)
{
int result;
ncp_init_request_s(server, 5);
ncp_add_pstring(server, name);
if ((result = ncp_request(server, 22)) != 0)
{
ncp_unlock_server(server);
return result;
}
*target = ncp_reply_byte(server, 0);
ncp_unlock_server(server);
return 0;
}
int
ncp_close_file(struct ncp_server *server, const char *file_id)
{
@@ -282,8 +263,8 @@ ncp_obtain_info(struct ncp_server *server,
ncp_init_request(server);
ncp_add_byte(server, 6); /* subfunction */
ncp_add_byte(server, 0); /* dos name space */
ncp_add_byte(server, 0); /* dos name space as dest */
ncp_add_byte(server, server->name_space[vol_num]);
ncp_add_byte(server, server->name_space[vol_num]);
ncp_add_word(server, 0xff); /* get all */
ncp_add_dword(server, RIM_ALL);
ncp_add_handle_path(server, vol_num, dir_base, 1, path);
@@ -299,20 +280,57 @@ ncp_obtain_info(struct ncp_server *server,
return 0;
}
static inline int
ncp_has_os2_namespace(struct ncp_server *server, __u8 volume)
{
int result;
__u8 *namespace;
__u16 no_namespaces;
ncp_init_request(server);
ncp_add_byte(server, 24); /* Subfunction: Get Name Spaces Loaded */
ncp_add_word(server, 0);
ncp_add_byte(server, volume);
if ((result = ncp_request(server, 87)) != 0)
{
ncp_unlock_server(server);
return 0;
}
no_namespaces = ncp_reply_word(server, 0);
namespace = ncp_reply_data(server, 2);
while (no_namespaces > 0)
{
DPRINTK("get_namespaces: found %d on %d\n", *namespace,volume);
if (*namespace == 4)
{
DPRINTK("get_namespaces: found OS2\n");
ncp_unlock_server(server);
return 1;
}
namespace += 1;
no_namespaces -= 1;
}
ncp_unlock_server(server);
return 0;
}
int
ncp_lookup_volume(struct ncp_server *server,
char *volname,
struct nw_info_struct *target)
{
int result;
__u8 vol_num;
__u32 dir_base;
int volnum;
DPRINTK("ncp_lookup_volume: looking up vol %s\n", volname);
ncp_init_request(server);
ncp_add_byte(server, 22); /* Subfunction: Generate dir handle */
ncp_add_byte(server, 0); /* DOS name space */
ncp_add_byte(server, 0); /* DOS namespace */
ncp_add_byte(server, 0); /* reserved */
ncp_add_byte(server, 0); /* reserved */
ncp_add_byte(server, 0); /* reserved */
@@ -329,20 +347,19 @@ ncp_lookup_volume(struct ncp_server *server,
return result;
}
dir_base = ncp_reply_dword(server, 4);
vol_num = ncp_reply_byte(server, 8);
memset(target, 0, sizeof(*target));
target->DosDirNum = target->dirEntNum = ncp_reply_dword(server, 4);
target->volNumber = volnum = ncp_reply_byte(server, 8);
ncp_unlock_server(server);
if ((result = ncp_obtain_info(server, vol_num, dir_base, NULL,
target)) != 0)
{
return result;
}
server->name_space[volnum] = ncp_has_os2_namespace(server,volnum)?4:0;
DPRINTK("ncp_lookup_volume: attribs = %X\n", target->attributes);
DPRINTK("lookup_vol: namespace[%d] = %d\n",
volnum, server->name_space[volnum]);
target->nameLen = strlen(volname);
strcpy(target->entryName, volname);
target->attributes = aDIR;
return 0;
}
@@ -356,14 +373,14 @@ ncp_modify_file_or_subdir_dos_info(struct ncp_server *server,
ncp_init_request(server);
ncp_add_byte(server, 7); /* subfunction */
ncp_add_byte(server, 0); /* dos name space */
ncp_add_byte(server, server->name_space[file->volNumber]);
ncp_add_byte(server, 0); /* reserved */
ncp_add_word(server, 0x8006); /* search attribs: all */
ncp_add_dword(server, info_mask);
ncp_add_mem(server, info, sizeof(*info));
ncp_add_handle_path(server, file->volNumber,
file->DosDirNum, 1, NULL);
file->dirEntNum, 1, NULL);
if ((result = ncp_request(server, 87)) != 0)
{
@@ -383,11 +400,11 @@ ncp_del_file_or_subdir(struct ncp_server *server,
ncp_init_request(server);
ncp_add_byte(server, 8); /* subfunction */
ncp_add_byte(server, 0); /* dos name space */
ncp_add_byte(server, server->name_space[dir->volNumber]);
ncp_add_byte(server, 0); /* reserved */
ncp_add_word(server, 0x8006); /* search attribs: all */
ncp_add_handle_path(server, dir->volNumber,
dir->DosDirNum, 1, name);
dir->dirEntNum, 1, name);
if ((result = ncp_request(server, 87)) != 0)
{
@@ -420,15 +437,16 @@ ncp_open_create_file_or_subdir(struct ncp_server *server,
{
int result;
__u16 search_attribs = 0x0006;
__u8 volume = (dir != NULL) ? dir->volNumber : target->i.volNumber;
if ((create_attributes & aDIR) != 0)
{
search_attribs |= 0x8000;
}
search_attribs |= 0x8000;
}
ncp_init_request(server);
ncp_add_byte(server, 1); /* subfunction */
ncp_add_byte(server, 0); /* dos name space */
ncp_add_byte(server, server->name_space[volume]);
ncp_add_byte(server, open_create_mode);
ncp_add_word(server, search_attribs);
ncp_add_dword(server, RIM_ALL);
@@ -439,13 +457,11 @@ ncp_open_create_file_or_subdir(struct ncp_server *server,
if (dir != NULL)
{
ncp_add_handle_path(server, dir->volNumber,
dir->DosDirNum, 1, name);
ncp_add_handle_path(server, volume, dir->dirEntNum, 1, name);
}
else
{
ncp_add_handle_path(server,
target->i.volNumber, target->i.DosDirNum,
ncp_add_handle_path(server, volume, target->i.dirEntNum,
1, NULL);
}
@@ -481,9 +497,9 @@ ncp_initialize_search(struct ncp_server *server,
ncp_init_request(server);
ncp_add_byte(server, 2); /* subfunction */
ncp_add_byte(server, 0); /* dos name space */
ncp_add_byte(server, server->name_space[dir->volNumber]);
ncp_add_byte(server, 0); /* reserved */
ncp_add_handle_path(server, dir->volNumber, dir->DosDirNum, 1, NULL);
ncp_add_handle_path(server, dir->volNumber, dir->dirEntNum, 1, NULL);
if ((result = ncp_request(server, 87)) != 0)
{
@@ -507,7 +523,7 @@ ncp_search_for_file_or_subdir(struct ncp_server *server,
ncp_init_request(server);
ncp_add_byte(server, 3); /* subfunction */
ncp_add_byte(server, 0); /* dos name space */
ncp_add_byte(server, server->name_space[seq->volNumber]);
ncp_add_byte(server, 0); /* data stream (???) */
ncp_add_word(server, 0xffff); /* Search attribs */
ncp_add_dword(server, RIM_ALL); /* return info mask */
@@ -542,19 +558,19 @@ ncp_ren_or_mov_file_or_subdir(struct ncp_server *server,
ncp_init_request(server);
ncp_add_byte(server, 4); /* subfunction */
ncp_add_byte(server, 0); /* dos name space */
ncp_add_byte(server, server->name_space[old_dir->volNumber]);
ncp_add_byte(server, 1); /* rename flag */
ncp_add_word(server, 0x8006); /* search attributes */
/* source Handle Path */
ncp_add_byte(server, old_dir->volNumber);
ncp_add_dword(server, old_dir->DosDirNum);
ncp_add_dword(server, old_dir->dirEntNum);
ncp_add_byte(server, 1);
ncp_add_byte(server, 1); /* 1 source component */
/* dest Handle Path */
ncp_add_byte(server, new_dir->volNumber);
ncp_add_dword(server, new_dir->DosDirNum);
ncp_add_dword(server, new_dir->dirEntNum);
ncp_add_byte(server, 1);
ncp_add_byte(server, 1); /* 1 destination component */

View File

@@ -1,17 +1,12 @@
MAN1= slist nprint pqlist nsend pserver ncopy
MAN5= nwclient
MAN8= ncpmount ncpumount ipx_configure ipx_interface ipx_internal_net \
ipx_route nwmsg
all:
dep:
install:
for i in $(MAN1); do install $$i.1 -m 755 /usr/local/man/man1; done
for i in $(MAN5); do install $$i.5 -m 755 /usr/local/man/man5; done
for i in $(MAN8); do install $$i.8 -m 755 /usr/local/man/man8; done
for i in *.1; do install $$i -m 755 /usr/local/man/man1; done
for i in *.5; do install $$i -m 755 /usr/local/man/man5; done
for i in *.8; do install $$i -m 755 /usr/local/man/man8; done
clean:
rm -f *~

View File

@@ -57,7 +57,7 @@ protocol Novell NetWare clients use to talk to NetWare servers. ncpfs
was inspired by
.B lwared,
a free NetWare emulator for Linux written by Ales Dryak. See
ftp://klokan.sh.cvut.cz/pub/linux for this very intersting program.
ftp://klokan.sh.cvut.cz/pub/linux for this very interesting program.
.B ncpmount
when invoked with all appropriate arguments attaches, logs in and
@@ -83,7 +83,7 @@ If the real uid of the caller is not root,
checks whether the user is allowed to mount a filesystem on the
mount-point. So it should be safe to make
.B ncpmount
setuid root. The filesystem stores the uid of the user who called
setuid root. The filesystem stores the uid of the user who called
ncpmount. So
.B ncpumount
can check whether the caller is allowed to unmount the filesystem.
@@ -271,7 +271,7 @@ of your server.
.B USER / LOGNAME
.RS 3
The variables USER or LOGNAME may contain the username of the person
using the client. USER is tried first. If it's emtpy, LOGNAME is
using the client. USER is tried first. If it's empty, LOGNAME is
tried.
.RE

View File

@@ -65,14 +65,14 @@ is the name of the server you want to use.
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.
to tell the server about your 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.
command line. You should be careful about using passwords in scripts.
.RE
.B -n

133
man/nwbocreate.8 Normal file
View 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.

119
man/nwbols.1 Normal file
View File

@@ -0,0 +1,119 @@
.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 -o
.I pattern
] [
.B -v
]
.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 -o
.I 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
View 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
View 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
View 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
View 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
View 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.

107
man/nwbpset.1 Normal file
View File

@@ -0,0 +1,107 @@
.TH NWBPSET 1 8/7/1996 nwbpset nwbpset
.SH NAME
nwbpset \- Create a bindery property or set its value
.SH SYNOPSIS
.B nwbpset
[
.B -h
] [
.B -S
.I server
] [
.B -U
.I user name
] [
.B -P
.I password
|
.B -n
] [
.B -C
]
.SH DESCRIPTION
.B nwbpset
Reads a property specification from the standard input and creates and
sets the corresponding property. The format is determined by the
output of 'nwbpvalues -c'. nwbpset will hopefully become an important
part of the bindery management suite of ncpfs, together with
'nwbpvalues -c'. See util/nwbpsecurity for an example.
As another example, look at the following command line:
nwbpvalues -t 1 -o supervisor -p user_defaults -c |\\
sed '2s/.*/ME/'|\\
sed '3s/.*/LOGIN_CONTROL/'|\\
nwbpset
With this command, the property user_defaults of the user object
\'supervisor\' is copied into the property login_control of the user
object \'me\'.
nwbpvalues -t 1 -o me -p login_control -c |\\
sed '9s/.*/ff/'|\\
nwbpset
This command disables the user object me.
Feel free to contribute other examples!
.B nwbpset
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, nwbpset
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
.SH AUTHORS
nwbpset was written by Volker Lendecke. See the Changes file of ncpfs
for other contributors.

135
man/nwbpvalues.1 Normal file
View File

@@ -0,0 +1,135 @@
.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
] [
.B -c
]
.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
.B -c
.RS 3
Use canonical output, to be used with nwbpset.
.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.

View File

@@ -1,4 +1,4 @@
.TH NWCLIENT 5 12/27/1995 nwmount nwmount
.TH NWCLIENT 5 12/27/1995 nwclient nwclient
.SH NAME
nwclient \- configuration file for NWClient program suite
.SH DESCRIPTION
@@ -35,11 +35,11 @@ An example might be the following:
# And a passwordless account on another server
CD-SERV/GUEST -
With these lines in $HOME/.nwclient, calling 'nwmount /mnt' will mount
With these lines in $HOME/.nwclient, calling 'ncpmount /mnt' will mount
the the file server FS311 with user name ME on /mnt after asking the
user for a password.
\'nwmount -S cd-serv /cd' will silently mount the server cd-serv on /cd.
\'ncpmount -S cd-serv /cd' will silently mount the server cd-serv on /cd.
.B nprint
,

52
man/nwfsinfo.1 Normal file
View 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
View 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.

55
man/nwpasswd.1 Normal file
View File

@@ -0,0 +1,55 @@
.TH NWPASSWD 1 06/22/1996 nwpasswd nwpasswd
.SH NAME
nwpasswd \- Change a user's password
.SH SYNOPSIS
.B nwpasswd
[
.B -h
] [
.B -S
.I server
] [
.B -U
.I user name
]
.B -t
.I object type
]
.SH DESCRIPTION
With
.B nwpasswd,
you can change your password on a NetWare server.
.B nwpasswd
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 nwpasswd 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
nwpasswd would not have been possible without the work of Guntram
Blom. Look at nwcrypt.c for his work.

124
man/nwrevoke.8 Normal file
View 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.

41
man/nwrights.1 Normal file
View File

@@ -0,0 +1,41 @@
.TH NWRIGHTS 1 8/1/1996 nwrights nwrights
.SH NAME
nwrights \- Show effective rights for file or directory
.SH SYNOPSIS
.B nwrights
[
.B -h
]
.B file/directory
.SH DESCRIPTION
.B nwrights
asks the NetWare server for the effective rights the user has for a
specific file or directory. The rights the server grants are the
definitive restriction for what you may do with files or
directories. The Linux permission bits are not really relevant, they
can only restrict the possibilities further.
.B nwrights
operates on the current directory or the file or directory that is
given as an argument. Certainly the file or directory you specify has
to reside on a ncpfs mounted directory for nwrights to work properly.
.SH OPTIONS
.B -h
.RS 3
.B -h
is used to print out a short help text.
.RE
.B file/directory
.RS 3
You can specify the file or directory you want information about. The
default is the current working directory.
.RE
.SH AUTHORS
nwrights 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
View 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.

View File

@@ -68,14 +68,14 @@ is the name of the server you want to use.
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.
to tell the server about your 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.
command line. You should be careful about using passwords in scripts.
.RE
.B -n

View File

@@ -1,7 +1,7 @@
Begin3
Title: ncpfs
Version: 0.24
Entered-date: 02. June 1996
Version: 2.0.6
Entered-date: 08. August 1996
Description: With ncpfs you can mount volumes of your netware
server under Linux. You can also print to netware
print queues and spool netware print queues to the
@@ -12,8 +12,8 @@ Keywords: filesystem ncp novell netware printing
Author: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke)
Maintained-by: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke)
Primary-site: ftp.gwdg.de:/pub/linux/misc/ncpfs
Alternate-site: sunsite.unc.edu:/pub/system/Filesystems/ncpfs
~120k ncpfs-0.24.tgz
~ 1k ncpfs-0.24.lsm
Alternate-site: sunsite.unc.edu:/pub/Linux/system/Filesystems/ncpfs
~136k ncpfs-2.0.6.tgz
~ 1k ncpfs-2.0.6.lsm
Copying-policy: GPL
End

View File

@@ -2,17 +2,35 @@
# Makefile for the linux ncp-filesystem routines.
#
USERUTILS = slist pqlist nwfsinfo pserver nprint nsend ncopy
USERUTILS = slist pqlist nwfsinfo pserver nprint nsend ncopy nwpasswd
USERUTILS += nwbols nwbocreate nwborm nwboprops
USERUTILS += nwbpcreate nwbprm nwbpvalues nwbpadd nwbpset
USERUTILS += nwgrant nwrevoke nwuserlist nwrights
UIDUTILS = ncpmount ncpumount
SBINUTILS = nwmsg
UTIL_EXECS = $(USERUTILS) $(UIDUTILS) $(SBINUTILS)
UTILS = $(addprefix $(INTERM_BINDIR)/,$(UTIL_EXECS))
#CFLAGS = -Wall $(INCLUDES) $(KERNELD) -g -DNCPFS_VERSION=\"$(VERSION)\"
CFLAGS = -Wall $(INCLUDES) $(KERNELD) -O2 -DNCPFS_VERSION=\"$(VERSION)\"
CFLAGS = -Wall $(INCLUDES) $(KERNELD) -DNCPFS_VERSION=\"$(VERSION)\"
CC = gcc
#CFLAGS += -g
CFLAGS += -O2
ifeq ($(HAVE_ELF),yes)
PIC_FLAG = -fPIC
NCP_LIB = libncp.so.1.0
LIB_LINK_COMMAND = gcc -shared -Wl,-soname,libncp.so.1 -o $(NCP_LIB)
INSTALL_LIB = install $(NCP_LIB) -m 755 /lib; \
ln -sf $(NCP_LIB) /lib/libncp.so.1; \
ldconfig
export PIC_FLAG
else
NCP_LIB = libncp.a
LIB_LINK_COMMAND = ar r libncp.a
endif
default:
make -C ..
@@ -25,21 +43,28 @@ install: all
do install $(INTERM_BINDIR)/$$i -m 4755 $(BINDIR); done
for i in $(SBINUTILS); \
do install $(INTERM_BINDIR)/$$i -m 755 $(SBINDIR); done
$(INSTALL_LIB)
$(UTILS): $(addsuffix .o,$(UTIL_EXECS)) libncp.a
$(UTILS): $(addsuffix .o,$(UTIL_EXECS)) $(NCP_LIB)
$(CC) -o $@ $(addsuffix .o,$(notdir $@)) -L. -lncp
ncplib.o: ncplib.c ncplib.h ncplib_err.h
$(CC) $(CFLAGS) -finline-functions -c ncplib.c
$(CC) $(CFLAGS) $(PIC_FLAG) -finline-functions -c ncplib.c
COM_ERR_CFILES = com_err/com_err.c com_err/error_message.c com_err/et_name.c \
com_err/init_et.c
libncp.a: ncplib.o ncplib_err.o $(COM_ERR_CFILES)
$(NCP_LIB): ncplib.o ncplib_err.o $(COM_ERR_CFILES)
make -C com_err
ar r libncp.a ncplib.o ncplib_err.o \
$(LIB_LINK_COMMAND) ncplib.o ncplib_err.o \
com_err/com_err.o com_err/error_message.o com_err/et_name.o \
com_err/init_et.o
ln -sf libncp.so.1.0 libncp.so.1
ln -sf libncp.so.1 libncp.so
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
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
@@ -50,7 +75,7 @@ ncplib_err.c: ncplib_err.et
test: test.o ncplib.o
$(CC) -o test test.o ncplib.o
ncptest: ncptest.o libncp.a
ncptest: ncptest.o $(NCP_LIB)
$(CC) -o ncptest ncptest.o -L. -lncp
dep: ncplib_err.h
@@ -59,7 +84,8 @@ dep: ncplib_err.h
clean:
make -C com_err clean
rm -f *.o *~ slist test ncptest ncplib_err.[ch] libncp.a
rm -f *.o *~ slist test ncptest ncplib_err.[ch]
rm -f libncp.*
mrproper: clean
make -C com_err mrproper

View File

@@ -3,7 +3,7 @@
#
OBJECTS = com_err.o error_message.o et_name.o init_et.o
CFLAGS = -Wall -O2
CFLAGS = -Wall -O2 $(PIC_FLAG)
all: $(OBJECTS)

View File

@@ -237,6 +237,10 @@ ipx_sap_find_nearest(int server_type, struct sockaddr_ipx *result,
if ((sock = socket(AF_IPX,SOCK_DGRAM,PF_IPX)) < 0)
{
if (errno == EINVAL)
{
return NCPL_ET_NO_IPX;
}
return errno;
}
@@ -344,7 +348,11 @@ ipx_make_reachable(IPXNet network)
if (sock == -1)
{
return -1;
if (errno == EINVAL)
{
return NCPL_ET_NO_IPX;
}
return errno;
}
opt=1;
@@ -523,11 +531,13 @@ do_ncp_call(struct ncp_conn *conn, int request_size)
int retries = 20;
int len;
long err;
struct ncp_reply_header *r =
(struct ncp_reply_header *)&(conn->packet);
while (retries > 0)
{
struct ncp_reply_header reply;
struct sockaddr_ipx sender;
int sizeofaddr = sizeof(sender);
retries -= 1;
result = sendto(conn->ncp_sock, conn->packet,
@@ -541,30 +551,48 @@ do_ncp_call(struct ncp_conn *conn, int request_size)
}
re_select:
len = ipx_recv(conn->ncp_sock,
conn->packet, NCP_PACKET_SIZE, 0, 3, &err);
len = ipx_recvfrom(conn->ncp_sock,
(char *)&reply, sizeof(reply),
MSG_PEEK, &sender, &sizeofaddr, 3, &err);
if ( (len == sizeof(*r))
&& (r->type == NCP_POSITIVE_ACK))
if ((len < 0) && (err == ETIMEDOUT))
{
goto re_select;
}
if ( (len >= sizeof(*r))
&& (r->type == NCP_REPLY)
&& ( (request.type == NCP_ALLOC_SLOT_REQUEST)
|| ( (r->sequence == request.sequence)
&& (r->conn_low == request.conn_low)
&& (r->conn_high == request.conn_high))))
{
conn->reply_size = len;
break;
continue;
}
if (len < 0)
{
return err;
}
if ( /* Is the sender wrong? */
(memcmp(&sender.sipx_node,
&(conn->i.addr.sipx_node), 6) != 0)
|| (sender.sipx_port != conn->i.addr.sipx_port)
/* Did the sender send a positive acknowledge? */
|| ( (len == sizeof(reply))
&& (reply.type == NCP_POSITIVE_ACK))
/* Did we get a bogus answer? */
|| ( (len < sizeof(reply))
|| (reply.type != NCP_REPLY)
|| ( (request.type != NCP_ALLOC_SLOT_REQUEST)
&& ( (reply.sequence != request.sequence)
|| (reply.conn_low != request.conn_low)
|| (reply.conn_high != request.conn_high)))))
{
/* Then throw away the packet */
ipx_recv(conn->ncp_sock, (char *)&reply, sizeof(reply),
0, 1, &err);
goto re_select;
}
ipx_recv(conn->ncp_sock, conn->packet, NCP_PACKET_SIZE,
0, 1, &err);
conn->reply_size = len;
return 0;
}
return 0;
return ETIMEDOUT;
}
static int
@@ -582,8 +610,9 @@ ncp_mount_request(struct ncp_conn *conn, int function)
if (conn->has_subfunction != 0)
{
*(__u16 *)&(h->data[0]) = conn->current_size
- sizeof(struct ncp_request_header)- 2;
*(__u16 *)&(h->data[0])
= htons(conn->current_size
- sizeof(struct ncp_request_header) - 2);
}
request.function = function;
@@ -620,8 +649,9 @@ ncp_temp_request(struct ncp_conn *conn, int function)
if (conn->has_subfunction != 0)
{
*(__u16 *)&(h->data[0]) = conn->current_size
- sizeof(struct ncp_request_header) - 2;
*(__u16 *)&(h->data[0])
= htons(conn->current_size
- sizeof(struct ncp_request_header) - 2);
}
h->type = NCP_REQUEST;
@@ -650,6 +680,40 @@ ncp_temp_request(struct ncp_conn *conn, int function)
return r->completion_code == 0 ? 0 : NCPL_ET_REQUEST_ERROR;
}
#ifdef PACKET_SIGNATURES
static long
ncp_setup_security(struct ncp_conn *conn)
{
__u8 security;
__u8 accepted_security;
__u16 socket, size;
conn->want_signatures = 0;
if (ncp_get_big_ncp_max_packet_size(conn, 576, 0, &size, &socket,
&accepted_security) != 0)
{
return 0;
}
if ((accepted_security & NCP_SEC_SIGNATURE_REQUESTED) == 0)
{
return 0;
}
security = NCP_SEC_SIGNATURE_REQUESTED;
if (ncp_get_big_ncp_max_packet_size(conn, 576, security,
&size, &socket,
&accepted_security) != 0)
{
return 0;
}
if ((accepted_security & NCP_SEC_SIGNATURE_REQUESTED) != 0)
{
conn->want_signatures = 1;
}
return 0;
}
#endif
static long
ncp_connect_addr(struct ncp_conn *conn, const struct sockaddr_ipx *target,
int wdog_needed)
@@ -1055,6 +1119,15 @@ ncp_open_mount(const char *mount_point, long *err)
}
strcpy(result->mount_point, mount_point);
result->is_connected = CONN_PERMANENT;
result->i.version = NCP_GET_FS_INFO_VERSION;
if (ioctl(result->mount_fid, NCP_IOC_GET_FS_INFO, &(result->i)) != 0)
{
free(result);
*err = NCPL_ET_NO_NCPFS_FILE;
return NULL;
}
return result;
}
@@ -1119,6 +1192,11 @@ long
ncp_close(struct ncp_conn *conn)
{
long result;
if (conn == NULL)
{
return 0;
}
if ((result = ncp_do_close(conn)) != 0)
{
return result;
@@ -1262,7 +1340,7 @@ ncp_get_nwc_ent(FILE *nwc)
}
FILE *
ncp_fopen_nwc(const char *user, const char *mode)
ncp_fopen_nwc(const char *user, const char *mode, long *err)
{
char path[MAXPATHLEN];
char *home = NULL;
@@ -1290,7 +1368,7 @@ ncp_fopen_nwc(const char *user, const char *mode)
if ( (home == NULL)
|| (strlen(home) + sizeof(NWCLIENT) + 2 > sizeof(path)))
{
errno = ENAMETOOLONG;
*err = ENAMETOOLONG;
return NULL;
}
@@ -1300,12 +1378,13 @@ ncp_fopen_nwc(const char *user, const char *mode)
if (stat(path, &st) != 0)
{
*err = errno;
return NULL;
}
if ((st.st_mode & (S_IRWXO | S_IRWXG)) != 0)
{
errno = EINVAL;
*err = NCPL_ET_INVALID_MODE;
return NULL;
}
@@ -1341,11 +1420,9 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
}
else
{
nwc = ncp_fopen_nwc(NULL, NULL);
if (nwc == NULL)
if ((nwc = ncp_fopen_nwc(NULL, NULL, err)) == NULL)
{
*err = NCPL_ET_NO_SPEC;
*err = NCPL_ET_NO_SERVER;
return NULL;
}
@@ -1361,6 +1438,15 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
strcpy(spec.user, nwc_ent->user);
}
str_upper(spec.server);
if (login_necessary == 0)
{
memset(spec.user, 0, sizeof(spec.user));
memset(spec.password, 0, sizeof(spec.password));
return &spec;
}
if (user != NULL)
{
if (strlen(user) >= sizeof(spec.user))
@@ -1371,7 +1457,6 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
strcpy(spec.user, user);
}
str_upper(spec.server);
str_upper(spec.user);
spec.login_type = NCP_BINDERY_USER;
@@ -1392,7 +1477,7 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
}
else
{
if ((nwc = ncp_fopen_nwc(NULL, NULL)) != NULL)
if ((nwc = ncp_fopen_nwc(NULL, NULL, err)) != NULL)
{
while ((nwc_ent = ncp_get_nwc_ent(nwc)) != NULL)
{
@@ -1412,15 +1497,10 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
}
}
if (login_necessary == 0)
{
memset(spec.user, 0, sizeof(spec.user));
memset(spec.password, 0, sizeof(spec.password));
}
if (strlen(spec.user) == 0)
{
return &spec;
*err = NCPL_ET_NO_USER;
return NULL;
}
if ((strlen(spec.password) == 0) && (password == NULL))
@@ -1787,6 +1867,31 @@ ncp_get_file_server_time(struct ncp_conn *conn, time_t *target)
return 0;
}
long
ncp_get_file_server_information(struct ncp_conn *conn,
struct ncp_file_server_info *target)
{
long result;
ncp_init_request_s(conn, 17);
if ((result = ncp_request(conn, 23)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
memcpy(target, ncp_reply_data(conn, 0), sizeof(*target));
target->MaximumServiceConnections
= htons(target->MaximumServiceConnections);
target->ConnectionsInUse
= htons(target->ConnectionsInUse);
target->MaxConnectionsEverUsed
= htons(target->MaxConnectionsEverUsed);
target->NumberMountedVolumes
= htons(target->NumberMountedVolumes);
ncp_unlock_conn(conn);
return 0;
}
long
ncp_get_connlist(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
@@ -1810,6 +1915,57 @@ ncp_get_connlist(struct ncp_conn *conn,
return 0;
}
long
ncp_get_stations_logged_info(struct ncp_conn *conn,
__u32 connection,
struct ncp_bindery_object *target,
time_t *login_time)
{
long result;
ncp_init_request_s(conn, 28);
ncp_add_dword(conn, connection);
if ((result = ncp_request(conn, 23)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
memset(target, 0, sizeof(*target));
target->object_id = ntohl(ncp_reply_dword(conn, 0));
target->object_type = ntohs(ncp_reply_word(conn, 4));
memcpy(target->object_name, ncp_reply_data(conn, 6),
sizeof(target->object_name));
*login_time = nw_to_ctime((struct nw_time_buffer *)
ncp_reply_data(conn, 54));
ncp_unlock_conn(conn);
return 0;
}
long
ncp_get_internet_address(struct ncp_conn *conn,
__u32 connection,
struct sockaddr_ipx *target,
__u8 *conn_type)
{
long result;
ncp_init_request_s(conn, 26);
ncp_add_dword(conn, connection);
if ((result = ncp_request(conn, 23)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
memset(target, 0, sizeof(*target));
target->sipx_network = ncp_reply_dword(conn, 0);
memcpy(&(target->sipx_node), ncp_reply_data(conn, 4), 6);
target->sipx_port = ncp_reply_word(conn, 10);
*conn_type = ncp_reply_byte(conn, 12);
ncp_unlock_conn(conn);
return 0;
}
long
ncp_send_broadcast(struct ncp_conn *conn,
__u8 no_conn, const __u8 *connections,
@@ -1833,7 +1989,7 @@ ncp_send_broadcast(struct ncp_conn *conn,
}
/*
* result is a 8-byte buffer
* target is a 8-byte buffer
*/
long
ncp_get_encryption_key(struct ncp_conn *conn,
@@ -1941,14 +2097,17 @@ ncp_scan_bindery_object(struct ncp_conn *conn,
long
ncp_create_bindery_object(struct ncp_conn *conn,
struct ncp_bindery_object *source)
__u16 object_type,
const char *object_name,
__u8 object_security,
__u8 object_status)
{
long result;
ncp_init_request_s(conn, 50);
ncp_add_byte(conn, source->object_flags);
ncp_add_byte(conn, source->object_security);
ncp_add_word(conn, htons(source->object_type));
ncp_add_pstring(conn, source->object_name);
ncp_add_byte(conn, object_status);
ncp_add_byte(conn, object_security);
ncp_add_word(conn, htons(object_type));
ncp_add_pstring(conn, object_name);
result = ncp_request(conn, 23);
ncp_unlock_conn(conn);
@@ -2139,6 +2298,31 @@ ncp_write_property_value(struct ncp_conn *conn,
return result;
}
long
ncp_get_big_ncp_max_packet_size(struct ncp_conn *conn,
__u16 proposed_max_size,
__u8 proposed_security_flag,
__u16 *accepted_max_size,
__u16 *echo_socket,
__u8 *accepted_security_flag)
{
long result;
ncp_init_request(conn);
ncp_add_word(conn, htons(proposed_max_size));
ncp_add_byte(conn, proposed_security_flag);
if ((result = ncp_request(conn, 97)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
*accepted_max_size = ntohs(ncp_reply_word(conn, 0));
*echo_socket = ntohs(ncp_reply_word(conn, 2));
*accepted_security_flag = ncp_reply_byte(conn, 4);
ncp_unlock_conn(conn);
return 0;
}
long
ncp_login_encrypted(struct ncp_conn *conn,
const struct ncp_bindery_object *object,
@@ -2163,6 +2347,58 @@ ncp_login_encrypted(struct ncp_conn *conn,
return result;
}
long
ncp_login_unencrypted(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const unsigned char *passwd)
{
long result;
ncp_init_request_s(conn, 20);
ncp_add_word(conn, htons(object_type));
ncp_add_pstring(conn, object_name);
ncp_add_pstring(conn, passwd);
result = ncp_request(conn, 23);
ncp_unlock_conn(conn);
return result;
}
long
ncp_change_login_passwd(struct ncp_conn *conn,
const struct ncp_bindery_object *object,
const unsigned char *key,
const unsigned char *oldpasswd,
const unsigned char *newpasswd)
{
long id = htonl(object->object_id);
unsigned char cryptkey[8];
unsigned char newpwd[16]; /* new passwd as stored by server */
unsigned char oldpwd[16]; /* old passwd as stored by server */
unsigned char len;
long result;
memcpy(cryptkey, key, 8);
shuffle((byte *)&id, oldpasswd, strlen(oldpasswd), oldpwd);
shuffle((byte *)&id, newpasswd, strlen(newpasswd), newpwd);
nw_encrypt(cryptkey, oldpwd, cryptkey);
newpassencrypt(oldpwd, newpwd, newpwd);
newpassencrypt(oldpwd+8, newpwd+8, newpwd+8);
if ((len = strlen(newpasswd)) > 63)
{
len = 63;
}
len = ((len ^ oldpwd[0] ^ oldpwd[1]) & 0x7f) | 0x40;
ncp_init_request_s(conn, 75);
ncp_add_mem(conn, cryptkey, 8);
ncp_add_word(conn, htons(object->object_type));
ncp_add_pstring(conn, object->object_name);
ncp_add_byte(conn, len);
ncp_add_mem(conn, newpwd, 16);
result = ncp_request(conn, 23);
ncp_unlock_conn(conn);
return result;
}
long
ncp_login_user(struct ncp_conn *conn,
const unsigned char *username,
@@ -2182,7 +2418,8 @@ ncp_login_object(struct ncp_conn *conn,
struct ncp_bindery_object user;
if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) {
return result;
return ncp_login_unencrypted(conn, login_type, username,
password);
}
if ((result = ncp_get_bindery_object_id(conn, login_type,
@@ -2545,7 +2782,42 @@ ncp_delete_directory(struct ncp_conn *conn,
ncp_unlock_conn(conn);
return result;
}
long
ncp_add_trustee(struct ncp_conn *conn,
int dir_handle, const char *path,
__u32 object_id, __u8 rights)
{
long result;
ncp_init_request_s(conn, 13);
ncp_add_byte(conn, dir_handle);
ncp_add_dword(conn, htonl(object_id));
ncp_add_byte(conn, rights);
ncp_add_pstring(conn, path);
result = ncp_request(conn, 22);
ncp_unlock_conn(conn);
return result;
}
long
ncp_delete_trustee(struct ncp_conn *conn,
int dir_handle, const char *path,__u32 object_id)
{
long result;
ncp_init_request_s(conn, 14);
ncp_add_byte(conn, dir_handle);
ncp_add_dword(conn, htonl(object_id));
ncp_add_byte(conn, 0);
ncp_add_pstring(conn, path);
result = ncp_request(conn, 22);
ncp_unlock_conn(conn);
return result;
}
long
ncp_rename_directory(struct ncp_conn *conn,
int dir_handle,
@@ -2567,7 +2839,7 @@ static void
ncp_add_handle_path(struct ncp_conn *conn,
__u8 vol_num,
__u32 dir_base, int have_dir_base,
char *path)
const char *path)
{
ncp_add_byte(conn, vol_num);
ncp_add_dword(conn, dir_base);
@@ -2600,6 +2872,61 @@ ncp_extract_file_info(void *structure, struct nw_info_struct *target)
return;
}
long
ncp_obtain_file_or_subdir_info(struct ncp_conn *conn,
__u8 source_ns, __u8 target_ns,
__u16 search_attribs, __u32 rim,
__u8 vol, __u32 dirent, const char *path,
struct nw_info_struct *target)
{
long result;
ncp_init_request(conn);
ncp_add_byte(conn, 6);
ncp_add_byte(conn, source_ns);
ncp_add_byte(conn, target_ns);
ncp_add_word(conn, search_attribs);
ncp_add_dword(conn, rim);
ncp_add_handle_path(conn, vol, dirent, 1, path);
if ((result = ncp_request(conn, 87)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
ncp_extract_file_info(ncp_reply_data(conn, 0), target);
ncp_unlock_conn(conn);
return 0;
}
long
ncp_get_eff_directory_rights(struct ncp_conn *conn,
__u8 source_ns, __u8 target_ns,
__u16 search_attribs,
__u8 vol, __u32 dirent, const char *path,
__u16 *my_effective_rights)
{
long result;
ncp_init_request(conn);
ncp_add_byte(conn, 29);
ncp_add_byte(conn, source_ns);
ncp_add_byte(conn, target_ns);
ncp_add_word(conn, search_attribs);
ncp_add_dword(conn, 0);
ncp_add_handle_path(conn, vol, dirent, 1, path);
if ((result = ncp_request(conn, 87)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
*my_effective_rights = ncp_reply_word(conn, 0);
ncp_unlock_conn(conn);
return 0;
}
long
ncp_do_lookup(struct ncp_conn *conn,
struct nw_info_struct *dir,
@@ -2788,7 +3115,7 @@ ncp_initialize_search(struct ncp_conn *conn,
return result;
}
memcpy(&(target->s), ncp_reply_data(conn, 0), sizeof(target->s));
memcpy(&(target->s), ncp_reply_data(conn, 0), 9);
target->namespace = namespace;
ncp_unlock_conn(conn);
@@ -3191,3 +3518,33 @@ ncp_alloc_short_dir_handle(struct ncp_conn *conn,
ncp_unlock_conn(conn);
return result;
}
long
ncp_add_trustee_set(struct ncp_conn *conn,
__u8 volume_number, __u32 dir_entry,
__u16 rights_mask,
int object_count, struct ncp_trustee_struct *rights)
{
long result = 0;
ncp_init_request(conn);
ncp_add_byte(conn, 10); /* subfunction */
ncp_add_byte(conn, 0); /* dos name space */
ncp_add_byte(conn, 0); /* reserved */
ncp_add_word(conn, 0x8006);
ncp_add_word(conn, rights_mask);
ncp_add_word(conn, object_count);
ncp_add_handle_path(conn, volume_number, dir_entry, 1, NULL);
while (object_count > 0)
{
ncp_add_dword(conn, htonl(rights->object_id));
ncp_add_word(conn, rights->rights);
object_count -= 1;
rights += 1;
}
result = ncp_request(conn, 87);
ncp_unlock_conn(conn);
return result;
}

View File

@@ -104,7 +104,7 @@ ncp_initialize_as(int *argc, char **argv,
int login_necessary, int login_type, long *err);
/* Open an existing permanent connection */
/* Open a connection */
struct ncp_conn *
ncp_open(const struct ncp_conn_spec *spec, long *err);
@@ -155,11 +155,48 @@ ncp_get_file_server_description_strings(struct ncp_conn *conn,
long
ncp_get_file_server_time(struct ncp_conn *conn, time_t *target);
struct ncp_file_server_info {
__u8 ServerName[48] __attribute__ ((packed));
__u8 FileServiceVersion __attribute__ ((packed));
__u8 FileServiceSubVersion __attribute__ ((packed));
__u16 MaximumServiceConnections __attribute__ ((packed));
__u16 ConnectionsInUse __attribute__ ((packed));
__u16 NumberMountedVolumes __attribute__ ((packed));
__u8 Revision __attribute__ ((packed));
__u8 SFTLevel __attribute__ ((packed));
__u8 TTSLevel __attribute__ ((packed));
__u16 MaxConnectionsEverUsed __attribute__ ((packed));
__u8 AccountVersion __attribute__ ((packed));
__u8 VAPVersion __attribute__ ((packed));
__u8 QueueVersion __attribute__ ((packed));
__u8 PrintVersion __attribute__ ((packed));
__u8 VirtualConsoleVersion __attribute__ ((packed));
__u8 RestrictionLevel __attribute__ ((packed));
__u8 InternetBridge __attribute__ ((packed));
__u8 Reserved[60] __attribute__ ((packed));
};
long
ncp_get_file_server_information(struct ncp_conn *conn,
struct ncp_file_server_info *target);
long
ncp_get_connlist(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
int *returned_no, __u8 conn_numbers[256]);
long
ncp_get_stations_logged_info(struct ncp_conn *conn,
__u32 connection,
struct ncp_bindery_object *target,
time_t *login_time);
long
ncp_get_internet_address(struct ncp_conn *conn,
__u32 connection,
struct sockaddr_ipx *target,
__u8 *conn_type);
long
ncp_send_broadcast(struct ncp_conn *conn,
__u8 no_conn, const __u8 *connections,
@@ -183,12 +220,27 @@ ncp_scan_bindery_object(struct ncp_conn *conn,
struct ncp_bindery_object *target);
long
ncp_create_bindery_object(struct ncp_conn *conn,
struct ncp_bindery_object *source);
__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_station_addr {
__u32 NetWork __attribute__ ((packed));
__u8 Node[6] __attribute__ ((packed));
__u16 Socket __attribute__ ((packed));
};
struct ncp_prop_login_control {
__u8 AccountExpireDate[3] __attribute__ ((packed));
__u8 Disabled __attribute__ ((packed));
@@ -205,7 +257,7 @@ struct ncp_prop_login_control {
__u32 MaxDiskUsage __attribute__ ((packed));
__u16 BadLoginCount __attribute__ ((packed));
__u32 BadLoginCountDown __attribute__ ((packed));
__u8 LastIntruder[8] __attribute__ ((packed));
struct ncp_station_addr LastIntruder __attribute__ ((packed));
};
long
@@ -250,12 +302,40 @@ ncp_write_property_value(struct ncp_conn *conn,
const char *property_name,
__u8 segment,
struct nw_property *property_value);
/* Bit masks for security flag */
#define NCP_SEC_CHECKSUMMING_REQUESTED (1)
#define NCP_SEC_SIGNATURE_REQUESTED (2)
#define NCP_SEC_COMPLETE_SIGNATURES_REQUESTED (4)
#define NCP_SEC_ENCRYPTION_REQUESTED (8)
#define NCP_SEC_LIP_DISABLED (128)
long
ncp_get_big_ncp_max_packet_size(struct ncp_conn *conn,
__u16 proposed_max_size,
__u8 proposed_security_flag,
__u16 *accepted_max_size,
__u16 *echo_socket,
__u8 *accepted_security_flag);
long
ncp_login_encrypted(struct ncp_conn *conn,
const struct ncp_bindery_object *object,
const unsigned char *key,
const unsigned char *passwd);
long
ncp_login_unencrypted(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const unsigned char *passwd);
long
ncp_change_login_passwd(struct ncp_conn *conn,
const struct ncp_bindery_object *object,
const unsigned char *key,
const unsigned char *oldpasswd,
const unsigned char *newpasswd);
#define NCP_GRACE_PERIOD (0xdf)
long
@@ -331,6 +411,15 @@ ncp_rename_directory(struct ncp_conn *conn,
int dir_handle,
const char *old_path, const char *new_path);
long
ncp_add_trustee(struct ncp_conn *conn,
int dir_handle, const char *path,
__u32 object_id, __u8 rights);
long
ncp_delete_trustee(struct ncp_conn *conn,
int dir_handle, const char *path, __u32 object_id);
long
ncp_read(struct ncp_conn *conn, const char *file_id,
off_t offset, size_t count, char *target);
@@ -348,6 +437,30 @@ ncp_copy_file(struct ncp_conn *conn,
__u32 count,
__u32 *copied_count);
long
ncp_obtain_file_or_subdir_info(struct ncp_conn *conn,
__u8 source_ns, __u8 target_ns,
__u16 search_attribs, __u32 rim,
__u8 vol, __u32 dirent, const char *path,
struct nw_info_struct *target);
#define NCP_PERM_READ (0x001)
#define NCP_PERM_WRITE (0x002)
#define NCP_PERM_OPEN (0x004)
#define NCP_PERM_CREATE (0x008)
#define NCP_PERM_DELETE (0x010)
#define NCP_PERM_OWNER (0x020)
#define NCP_PERM_SEARCH (0x040)
#define NCP_PERM_MODIFY (0x080)
#define NCP_PERM_SUPER (0x100)
long
ncp_get_eff_directory_rights(struct ncp_conn *conn,
__u8 source_ns, __u8 target_ns,
__u16 search_attribs,
__u8 vol, __u32 dirent, const char *path,
__u16 *my_effective_rights);
long
ncp_do_lookup(struct ncp_conn *conn,
struct nw_info_struct *dir,
@@ -435,4 +548,22 @@ ncp_alloc_short_dir_handle(struct ncp_conn *conn,
__u16 alloc_mode,
__u8 *target);
long
ncp_get_effective_dir_rights(struct ncp_conn *conn,
struct nw_info_struct *file,
__u16 *target);
struct ncp_trustee_struct
{
__u32 object_id;
__u16 rights;
};
long
ncp_add_trustee_set(struct ncp_conn *conn,
__u8 volume_number, __u32 dir_entry,
__u16 rights_mask,
int object_count, struct ncp_trustee_struct *rights);
#endif /* _NCPLIB_H */

View File

@@ -3,6 +3,9 @@ error_table NCPL
ec NCPL_ET_NO_SERVER,
"No server found"
ec NCPL_ET_NO_USER,
"No username found"
ec NCPL_ET_HOST_UNKNOWN,
"Server Unknown"
@@ -19,7 +22,7 @@ ec NCPL_ET_NO_SPEC,
"Could not find valid connection spec"
ec NCPL_ET_INVALID_MODE,
"$HOME/.nwclient has invalid mode"
"$HOME/.nwclient has invalid mode, must be 600"
ec NCPL_ET_LOGIN_DENIED,
"Login denied"
@@ -33,4 +36,10 @@ ec NCPL_ET_NO_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"
ec NCPL_ET_NO_NCPFS_FILE,
"The file is probably not on a ncpfs mounted directory"
end

View File

@@ -201,7 +201,7 @@ main(int argc, char *argv[])
upcase_password = 1;
while ((opt = getopt (argc, argv, "CS:U:c:u:g:f:d:P:nhvV:t:r:"))
while ((opt = getopt (argc, argv, "CS:U:c:u:g:f:d:P:nh?vV:t:r:"))
!= EOF)
{
switch (opt)
@@ -310,6 +310,7 @@ main(int argc, char *argv[])
data.retry_count = atoi(optarg);
break;
case 'h':
case '?':
help();
exit(1);
case 'v':

View File

@@ -106,7 +106,119 @@ test_create(struct ncp_conn *conn)
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);
}
}
}
void
test_rights(struct ncp_conn *conn)
{
struct nw_info_struct sys;
struct nw_info_struct me;
__u16 rights;
if (ncp_do_lookup(conn, NULL, "SYS", &sys) != 0)
{
printf("lookup error\n");
return;
}
if (ncp_do_lookup(conn, &sys, "ME", &me) != 0)
{
printf("lookup me error\n");
return;
}
if (ncp_get_eff_directory_rights(conn, 0, 0, 0x8006,
sys.volNumber, sys.DosDirNum, NULL,
&rights) != 0)
{
printf("get sys rights error\n");
return;
}
printf("sys right: %4.4x\n", rights);
if (ncp_get_eff_directory_rights(conn, 0, 0, 0x8006,
me.volNumber, me.DosDirNum, NULL,
&rights) != 0)
{
printf("get me rights error\n");
return;
}
printf("me right: %4.4x\n", rights);
return;
}
int
main(int argc, char *argv[])
@@ -120,7 +232,7 @@ main(int argc, char *argv[])
return 1;
}
test_send(conn);
test_rights(conn);
ncp_close(conn);
return 0;
}

View File

@@ -57,7 +57,7 @@ main(int argc, char *argv[])
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{
com_err(argv[0], err, "in ncp_initialize");
com_err(argv[0], err, "when initializing connection");
exit(1);
}
@@ -78,10 +78,11 @@ main(int argc, char *argv[])
pj.Rows = htons(80);
strcpy(pj.FnameHeader, "stdin");
while ((opt = getopt(argc, argv, "hq:d:p:b:f:l:r:c:t:F:TN"))!=EOF)
while ((opt = getopt(argc, argv, "h?q:d:p:b:f:l:r:c:t:F:TN"))!=EOF)
{
switch (opt) {
case 'h':
case '?':
help();
ncp_close(conn);
exit(1);
@@ -306,8 +307,6 @@ main(int argc, char *argv[])
if (ncp_close_file_and_start_job(conn, q.object_id, &j) != 0) {
printf("close error\n");
ncp_close(conn);
return;
}
ncp_close(conn);

View File

@@ -25,7 +25,7 @@ main(int argc, char **argv)
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{
com_err(argv[0], err, "in ncp_initialize");
com_err(argv[0], err, "when initializing");
exit(1);
}

161
util/nwbocreate.c Normal file
View 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;
}

124
util/nwbols.c Normal file
View File

@@ -0,0 +1,124 @@
/*
* 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"
"-o object Object pattern\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:o:")) != EOF)
{
switch(opt) {
case 'h':
case '?':
help();
exit(1);
case 't':
type = atoi(optarg);
break;
case 'o':
pattern = optarg;
break;
case 'v':
verbose = 1;
break;
default:
usage();
exit(1);
}
}
if (optind < argc)
{
usage();
exit(1);
}
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
View 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
View 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
View 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
View 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
View 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;
}

24
util/nwbpsecurity Executable file
View File

@@ -0,0 +1,24 @@
#!/bin/sh
SECURITY=`nwbpvalues $* -c | head -3 | tail -1`
WRITE=`echo $SECURITY | cut -b1`
READ=`echo $SECURITY | cut -b2`
function print_sec () {
case "$1" in
0 ) echo "Everyone"
;;
1 ) echo "Logged in"
;;
2 ) echo "Object"
;;
3 ) echo "Supervisor"
;;
* ) echo "Bindery"
;;
esac
}
echo -n "Write security: "
print_sec $WRITE
echo -n "Read security : "
print_sec $READ

238
util/nwbpset.c Normal file
View File

@@ -0,0 +1,238 @@
/*
* nwbpset.c
*
* Create a property and set its values
*
* 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");
}
static char *
get_line(char *buf, int len, FILE *stream)
{
char *result = fgets(buf, len, stream);
if (result != NULL)
{
buf[strlen(buf)-1] = '\0'; /* remove newline */
}
return result;
}
int
main(int argc, char *argv[])
{
struct ncp_conn *conn;
char object_name[49];
int object_type = -1;
char property_name[17];
int property_flag, property_security;
struct ncp_property_info info;
long err;
int result = 1;
char buf[512];
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?")) != EOF)
{
switch(opt) {
case 'h':
case '?':
help();
goto finished;
default:
usage();
goto finished;
}
}
memset(buf, 0, sizeof(buf));
if (get_line(buf, sizeof(buf), stdin) == NULL)
{
fprintf(stderr, "Illegal format on stdin\n");
goto finished;
}
object_type = strtoul(buf, NULL, 16);
memset(object_name, 0, sizeof(object_name));
if (get_line(object_name, sizeof(object_name), stdin) == NULL)
{
fprintf(stderr, "Illegal format on stdin\n");
goto finished;
}
memset(property_name, 0, sizeof(property_name));
if (get_line(property_name, sizeof(property_name), stdin) == NULL)
{
fprintf(stderr, "Illegal format on stdin\n");
goto finished;
}
memset(buf, 0, sizeof(buf));
if (get_line(buf, sizeof(buf), stdin) == NULL)
{
fprintf(stderr, "Illegal format on stdin\n");
goto finished;
}
property_flag = (atoi(buf) & 3);
memset(buf, 0, sizeof(buf));
if (get_line(buf, sizeof(buf), stdin) == NULL)
{
fprintf(stderr, "Illegal format on stdin\n");
goto finished;
}
property_security = (strtoul(buf, NULL, 16) & 0xff);
if (ncp_scan_property(conn, object_type, object_name,
0xffffffff, property_name, &info) == 0)
{
/* Property already exists */
if ((property_flag & 2) != (info.property_flags & 2))
{
fprintf(stderr, "Tried to write %s property\n",
(property_flag & 2) != 0 ?
"SET over existing ITEM" :
"ITEM over existing SET");
goto finished;
}
if (info.property_security != property_security)
{
if (ncp_change_property_security(conn, object_type,
object_name,
property_name,
property_security)!=0)
{
fprintf(stderr, "Could not change "
"property security\n");
goto finished;
}
}
}
else
{
if (ncp_create_property(conn, object_type, object_name,
property_name, property_flag,
property_security) != 0)
{
fprintf(stderr, "Could not create property\n");
goto finished;
}
}
if ((property_flag & 2) == 0)
{
/* ITEM property */
int i;
int length;
int segno;
char property_value[255*128];
memset(property_value, 0, sizeof(property_value));
for (i = 0; i < sizeof(property_value); i++)
{
if (get_line(buf, sizeof(buf), stdin) == NULL)
{
break;
}
property_value[i] = strtoul(buf, NULL, 16);
}
length = i-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, &(property_value[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, "Could not write property\n");
goto finished;
}
}
}
else
{
/* SET property */
while (get_line(buf, sizeof(buf), stdin) != NULL)
{
int element_type = strtoul(buf, NULL, 16);
char element_name[49];
memset(element_name, 0, sizeof(element_name));
if (get_line(element_name, sizeof(element_name),
stdin) == NULL)
{
fprintf(stderr, "Illegal format on stdin\n");
goto finished;
}
if (ncp_add_object_to_set(conn, object_type,
object_name, property_name,
element_type,
element_name) != 0)
{
if (conn->completion != 0xE9) /* object already
in set */
{
fprintf(stderr, "Could not add object "
"to set\n");
goto finished;
}
}
}
}
result = 0;
finished:
ncp_close(conn);
return result;
}

465
util/nwbpvalues.c Normal file
View File

@@ -0,0 +1,465 @@
/*
* 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"
"-c Canonical output, for use with nwbpadd\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;
int canonical = 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:vc")) != 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 'c':
canonical = 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;
}
segno += 1;
}
if (canonical != 0)
{
printf("%-4.4x\n%s\n", object_type, object_name);
printf("%s\n%d\n%x\n",
info.property_name, info.property_flags, info.property_security);
}
if ((info.property_flags & 2) == 0)
{
/* ITEM property */
if (canonical != 0)
{
int i;
for (i = 0; i < segno*128; i++)
{
printf("%-2.2x\n", property_value[i]);
}
}
else
{
print_property(property_name, property_value, segno);
}
}
else
{
int objects = 32 * segno;
__u32 *value = (__u32 *)property_value;
int i = 0;
while (i < objects)
{
struct ncp_bindery_object o;
if ((value[i] == 0) || (value[i] == 0xffffffff))
{
/* Continue with next segment */
i = ((i/32) + 1) * 32;
continue;
}
if (ncp_get_bindery_object_name(conn, ntohl(value[i]),
&o) == 0)
{
if (canonical != 0)
{
printf("%-4.4x\n%s\n",
(unsigned int) o.object_type,
o.object_name);
}
else 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);
}
}
i += 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 char *
print_station_addr(char *fmt, struct ncp_station_addr *addr, char *buff)
{
char *ret = buff;
while ( *fmt != 0 )
{
switch ( *fmt )
{
case '%':
switch ( *(++fmt) )
{
case 'N': /* node */
{
int i ;
for ( i = 0 ; i < 6 ; buff += 2 , i++ )
{
sprintf(buff, "%02X",addr->Node[i]);
}
}
break;
case 'S': /* Socket */
sprintf(buff, "%04X", htons(addr->Socket));
buff += 4 ;
break ;
case 'L': /* Lan */
sprintf(buff, "%08lX", htonl(addr->NetWork));
buff += 8 ;
break ;
case '%':
*buff++ = '%';
default:
break ;
}
if (*fmt)
{
fmt++ ;
}
break ;
default:
*buff++ = *fmt++ ;
}
}
*buff = 0 ;
return ret ;
}
void
print_login_control ( __u8 *val )
{
int i , j , mask;
char buff[32];
struct ncp_prop_login_control *a =(struct ncp_prop_login_control *)val;
static char *days[]
= { "Sun" , "Mon" , "Tue" , "Wen" , "Thu" , "Fri" , "Sat" } ;
if (a->LastLogin[2] || a->LastLogin[1] || a->LastLogin[0] ||
a->LastLogin[3] || a->LastLogin[4] || a->LastLogin[5])
{
printf("Last Login: %d.%d.%02d at %2d:%02d:%02d\n",
a->LastLogin[2] , a->LastLogin[1] , a->LastLogin[0] ,
a->LastLogin[3] , a->LastLogin[4] , a->LastLogin[5]);
}
else
{
printf("Never logged in\n");
}
if (a->Disabled != 0)
{
printf(" --- Account disabled ---\n");
}
if (a->AccountExpireDate[2] || a->AccountExpireDate[1] ||
a->AccountExpireDate[0])
{
printf("Account expires on: %d.%d.%d\n",
a->AccountExpireDate[2],
a->AccountExpireDate[1],
a->AccountExpireDate[0]);
}
if (a->PasswordExpireDate[2] || a->PasswordExpireDate[1] ||
a->PasswordExpireDate[0])
{
printf("Password expires on: %d.%d.%d\n" ,
a->PasswordExpireDate[2],
a->PasswordExpireDate[1],
a->PasswordExpireDate[0]);
printf("GraceLogins left: %d\nof max. : %d\n",
a->GraceLogins, a->MaxGraceLogins);
printf("PasswortChangeInterval : %d days\n",
ntohs(a->PasswordExpireInterval));
}
if ((a->RestrictionMask & 2) != 0)
{
printf("New password must be different when changing\n");
}
if ((a->RestrictionMask & 1) != 0)
{
printf("User ist not allowed to change password\n");
}
printf("Minimal password length : %d\n", a->MinPasswordLength);
if (ntohs(a->MaxConnections) != 0)
{
printf("Maximum no of connections: %d\n",
ntohs(a->MaxConnections));
}
if ( a->MaxDiskUsage != 0xFFFFFF7FL )
{
printf("Maximum DiskQuota : %8ld blocks\n",
ntohl(a->MaxDiskUsage));
}
printf("Failed Logins: %5d\n", ntohs(a->BadLoginCount));
if (a->BadLoginCountDown != 0L)
{
printf("Account disabled still %8ld seconds\n",
ntohl(a->BadLoginCountDown));
}
if (a->LastIntruder.NetWork != 0L)
{
printf("Last \'intruder\' address: %s\n" ,
print_station_addr("(%L): %N[%S]" ,
&(a->LastIntruder),buff));
}
if ( a->RestrictionMask & 0xFC )
{
printf("RestrictionMask : %02X\n", a->RestrictionMask);
}
for ( i = 0 ; i < 42 ; i++ )
{
if ( a->ConnectionTimeMask[i] != 0xFF )
{
i = 101;
}
}
if ( i < 100 )
{
return;
}
val = a->ConnectionTimeMask;
printf("Time restrictions: 1 1 1 1 1 1 1 1 1 1 2 2 2 2 ]\n");
printf(" Day [0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 ]\n");
for ( i = 0 ; i < 7 ; i++ )
{
printf (" %s [" , days[i]);
for ( j = 0 ; j < 6 ; j++ )
{
for ( mask = 1 ; mask < 0x100 ; mask <<= 1 )
{
putchar ( (*val & mask) ? '*' : ' ' ) ;
}
val++ ;
}
printf ( "]\n" ) ;
}
}
void
print_addr( __u8 *val)
{
char buff[50];
print_station_addr("(%L): %N[%S]",
(struct ncp_station_addr *)val, buff);
printf("%s\n", buff);
}
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 } ,
{ "LOGIN_CONTROL" , print_login_control } ,
{ "NET_ADDRESS" , print_addr } ,
{ 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");
}
}

View File

@@ -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);
}
}

View File

@@ -11,6 +11,64 @@
#include <unistd.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
main(int argc, char **argv)
{
@@ -18,16 +76,22 @@ main(int argc, char **argv)
int opt;
long err;
progname = argv[0];
if ((conn = ncp_initialize(&argc, argv, 0, &err)) == NULL)
{
com_err(argv[0], err, "in ncp_initialize");
com_err(argv[0], err, "when initializing");
return 1;
}
while ((opt = getopt(argc, argv, "dt")) != EOF)
while ((opt = getopt(argc, argv, "h?dti")) != EOF)
{
switch(opt)
{
case 'h':
case '?':
help();
break;
case 'd':
{
char strings[512];
@@ -68,12 +132,26 @@ main(int argc, char **argv)
fputs(ctime(&t), stdout);
break;
}
default:
printf("unknown option: %c\n", opt);
case 'i':
{
struct ncp_file_server_info info;
if (ncp_get_file_server_information(conn, &info) != 0)
{
perror("Could not get server information");
ncp_close(conn);
return 1;
}
print_info(&info);
break;
}
default:
usage();
goto finished;
}
}
finished:
ncp_close(conn);
return 0;
}

134
util/nwgrant.c Normal file
View 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;
}

View File

@@ -1,62 +0,0 @@
/*
* nwlsobj.c
*
* List bindery objects
*
* 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;
struct ncp_bindery_object o;
int found = 0;
char default_pattern[] = "*";
char *pattern = default_pattern;
char *p;
long err;
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{
com_err(argv[0], err, "in ncp_initialize");
return 1;
}
if (argc > 2)
{
fprintf(stderr, "usage: %s [options]\n", argv[0]);
return 1;
}
if (argc == 2)
{
pattern = argv[1];
}
for (p = pattern; *p != '\0'; p++)
{
*p = toupper(*p);
}
o.object_id = 0xffffffff;
while (ncp_scan_bindery_object(conn, o.object_id,
0xffff, pattern, &o) == 0)
{
found = 1;
printf("%s %08X %04X\n",
o.object_name, (unsigned int)o.object_id,
(unsigned int)o.object_type);
}
ncp_close(conn);
return 0;
}

View File

@@ -130,9 +130,9 @@ main(int argc, char *argv[])
exit(1);
}
fprintf(tty_file, "\r\n\007\007\007Message from NetWare Server: %s\n",
fprintf(tty_file,"\r\n\007\007\007Message from NetWare Server: %s\r\n",
mnt->mnt_fsname);
fprintf(tty_file, "%s\n", message);
fprintf(tty_file, "%s\r\n", message);
fclose(tty_file);
fclose(mtab);
return;

145
util/nwpasswd.c Normal file
View File

@@ -0,0 +1,145 @@
/*
* nwpasswd.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;
}

123
util/nwrevoke.c Normal file
View 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;
}

141
util/nwrights.c Normal file
View File

@@ -0,0 +1,141 @@
/*
* nwrights.c
*
* Show effective rights for dir or file.
*
* 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"
"\n"
"file/directory\n"
"\n");
}
int
main(int argc, char *argv[])
{
struct ncp_conn *conn = NULL;
char *path = ".";
long err;
int result = 1;
int opt;
__u16 rights;
progname = argv[0];
while ((opt = getopt(argc, argv, "h?")) != EOF)
{
switch(opt) {
case 'h':
case '?':
help();
goto finished;
default:
usage();
goto finished;
}
}
if (optind > argc)
{
usage();
goto finished;
}
if (optind == argc-1)
{
path = argv[optind];
}
if ((conn = ncp_open_mount(path, &err)) == NULL)
{
com_err(argv[0], err, "when initializing");
goto finished;
}
if ((err = ncp_get_eff_directory_rights(conn, 0, 0, 0x8006,
conn->i.volume_number,
conn->i.directory_id, NULL,
&rights)) != 0)
{
com_err(argv[0], err, "when finding rights");
goto finished;
}
printf("Your effective rights for %s are: [%c%c%c%c%c%c%c%c]\n",
path,
((rights & NCP_PERM_SUPER ) != 0) ? 'S' : ' ',
((rights & NCP_PERM_READ ) != 0) ? 'R' : ' ',
((rights & NCP_PERM_WRITE ) != 0) ? 'W' : ' ',
((rights & NCP_PERM_CREATE) != 0) ? 'C' : ' ',
((rights & NCP_PERM_DELETE) != 0) ? 'E' : ' ',
((rights & NCP_PERM_MODIFY) != 0) ? 'M' : ' ',
((rights & NCP_PERM_SEARCH) != 0) ? 'F' : ' ',
((rights & NCP_PERM_OWNER ) != 0) ? 'A' : ' ');
if ((rights & NCP_PERM_SUPER ) != 0)
{
printf("(S): You have SUPERVISOR rights\n");
}
if ((rights & NCP_PERM_READ ) != 0)
{
printf("(R): You may READ from files\n");
}
if ((rights & NCP_PERM_WRITE ) != 0)
{
printf("(W): You may WRITE to files\n");
}
if ((rights & NCP_PERM_CREATE) != 0)
{
printf("(C): You may CREATE files\n");
}
if ((rights & NCP_PERM_DELETE) != 0)
{
printf("(E): You may ERASE files\n");
}
if ((rights & NCP_PERM_MODIFY) != 0)
{
printf("(M): You may MODIFY directory\n");
}
if ((rights & NCP_PERM_SEARCH) != 0)
{
printf("(F): You may SCAN for files\n");
}
if ((rights & NCP_PERM_OWNER ) != 0)
{
printf("(A): You may change ACCESS control\n");
}
result = 0;
finished:
ncp_close(conn);
return result;
}

143
util/nwuserlist.c Normal file
View 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;
}

View File

@@ -26,7 +26,7 @@ main(int argc, char **argv)
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{
com_err(argv[0], err, "in ncp_initialize");
com_err(argv[0], err, "when initializing");
return 1;
}

View File

@@ -150,7 +150,7 @@ main(int argc, char *argv[])
if ((conn = ncp_initialize_as(&argc, argv, 1,
NCP_BINDERY_PSERVER, &err)) == NULL)
{
com_err(argv[0], err, "in ncp_initialize");
com_err(argv[0], err, "when initializing");
return 1;
}

View File

@@ -41,9 +41,9 @@ main(int argc, char *argv[])
*p = toupper(*p);
}
if ((conn = ncp_initialize(&argc, argv, 0, &err)) == NULL)
if ((conn = ncp_open(NULL, &err)) == NULL)
{
com_err(argv[0], err, "in ncp_initialize");
com_err(argv[0], err, "in ncp_open");
exit(1);
}