Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
011a5107c5 | ||
|
|
7179281575 | ||
|
|
b8d830f9a3 |
BIN
.downloads/ncpfs-2.0.1.tgz
Normal file
BIN
.downloads/ncpfs-2.0.1.tgz
Normal file
Binary file not shown.
BIN
.downloads/ncpfs-2.0.2.tgz
Normal file
BIN
.downloads/ncpfs-2.0.2.tgz
Normal file
Binary file not shown.
BIN
.downloads/ncpfs-2.0.3.tgz
Normal file
BIN
.downloads/ncpfs-2.0.3.tgz
Normal file
Binary file not shown.
35
Changes
35
Changes
@@ -1,6 +1,39 @@
|
|||||||
I only began this file with ncpfs-0.12. If you're interested in older
|
I only began this file with ncpfs-0.12. If you're interested in older
|
||||||
versions, you can find them on ftp.gwdg.de:/pub/linux/misc/ncpfs/old.
|
versions, you can find them on ftp.gwdg.de:/pub/linux/misc/ncpfs/old.
|
||||||
|
|
||||||
|
ncpfs-2.0.2 -> ncpfs-2.0.3
|
||||||
|
- Removed the kernel-2.0 directory. Linus took the patch into 2.0.8.
|
||||||
|
So, if you want to use long file name support, upgrade to Linux
|
||||||
|
kernel version 2.0.8.
|
||||||
|
- Applied the lfn patch to the kernel-1.2 module with some light
|
||||||
|
testing. If you experience problems, tell it to me, and use the
|
||||||
|
ncpfs-2.0.2 kernel module, or upgrade to Linux 2.0.8.
|
||||||
|
- Added unencrypted login when no crypt key is returned.
|
||||||
|
- Hopefully improved error messages a bit
|
||||||
|
- Added some values to ipxparse
|
||||||
|
- For ELF systems, moved ncplib to /lib/libncp.so.1.x. This saves
|
||||||
|
about 1MB of disk space. As ncpfs grows, the saving will
|
||||||
|
increase. Please look at the Makefile to enable this.
|
||||||
|
- Enhanced nwfsinfo a bit. (Even with a manpage!)
|
||||||
|
- Added nwuserlist.
|
||||||
|
|
||||||
|
ncpfs-2.0.1 -> ncpfs-2.0.2
|
||||||
|
- Added some values to ipxparse.
|
||||||
|
- Added a patch against 2.0.7 for long file names support. I did not
|
||||||
|
apply this change to the 1.2-module. Please upgrade to 2.0.7 if you
|
||||||
|
want to use long file names.
|
||||||
|
- nwbpvalues can print ITEM properties
|
||||||
|
|
||||||
|
ncpfs-2.0.0 -> ncpfs-2.0.1
|
||||||
|
- Added some values to ipxparse.
|
||||||
|
- Added the little bindery utilities. Maybe someone has the time to
|
||||||
|
write a shellscript named 'nwadduser' ?
|
||||||
|
- Fixed a bug that made the __255 message reappear. Many thanks to
|
||||||
|
Guntram Blom for his detailed bug report.
|
||||||
|
- Fixed a bug that made ncpfs incompatible with W95's server
|
||||||
|
capabilities. Thanks to Tomasz Babczynski
|
||||||
|
<faster@dino.ict.pwr.wroc.pl> for this one.
|
||||||
|
|
||||||
ncpfs-0.24 -> ncpfs-2.0.0
|
ncpfs-0.24 -> ncpfs-2.0.0
|
||||||
- Changed the numbering scheme :-).
|
- Changed the numbering scheme :-).
|
||||||
- Added npasswd. Many thanks to Guntram Blom for his work!
|
- Added npasswd. Many thanks to Guntram Blom for his work!
|
||||||
@@ -116,4 +149,4 @@ ncpfs-0.12 -> ncpfs-0.13
|
|||||||
- support for automatic loading of ncpfs.o by kerneld.
|
- support for automatic loading of ncpfs.o by kerneld.
|
||||||
Thanks to Steven N. Hirsch <hirsch@emba.uvm.edu>.
|
Thanks to Steven N. Hirsch <hirsch@emba.uvm.edu>.
|
||||||
- A subtle problem in the read routines has been removed by Uwe Bonnes
|
- A subtle problem in the read routines has been removed by Uwe Bonnes
|
||||||
<bon@elektron.ikp.physik.th-darmstadt.de>. Thanks a lot.
|
<bon@elektron.ikp.physik.th-darmstadt.de>. Thanks a lot.
|
||||||
|
|||||||
7
FAQ
7
FAQ
@@ -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
|
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
|
'pwd: cannot get current directory', and other strange things happen to
|
||||||
the nfs clients. What's wrong?
|
the nfs clients. What's wrong?
|
||||||
|
|||||||
15
Makefile
15
Makefile
@@ -2,26 +2,29 @@
|
|||||||
# Makefile for the linux ncp-filesystem routines.
|
# Makefile for the linux ncp-filesystem routines.
|
||||||
#
|
#
|
||||||
|
|
||||||
VERSION = 2.0.0
|
VERSION = 2.0.3
|
||||||
|
|
||||||
# If you are using kerneld to autoload ncp support,
|
# If you are using kerneld to autoload ncp support,
|
||||||
# uncomment this (kerneld is in linux since about 1.3.57):
|
# uncomment this (kerneld is in linux since about 1.3.57):
|
||||||
#KERNELD = -DHAVE_KERNELD
|
#KERNELD = -DHAVE_KERNELD
|
||||||
|
|
||||||
|
# If your system is ELF, please uncomment the following line:
|
||||||
|
#HAVE_ELF=yes
|
||||||
|
|
||||||
TOPDIR = $(shell pwd)
|
TOPDIR = $(shell pwd)
|
||||||
BINDIR = /usr/local/bin
|
BINDIR = /usr/local/bin
|
||||||
SBINDIR = /sbin
|
SBINDIR = /sbin
|
||||||
INTERM_BINDIR = $(TOPDIR)/bin
|
INTERM_BINDIR = $(TOPDIR)/bin
|
||||||
SUBDIRS = util ipx-1.0 man
|
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
|
SUBDIRS += kernel-1.2/src
|
||||||
INCLUDES = -I$(TOPDIR)/kernel-1.2
|
INCLUDES = -I$(TOPDIR)/kernel-1.2
|
||||||
endif
|
endif
|
||||||
|
|
||||||
export INCLUDES BINDIR INTERM_BINDIR SBINDIR KERNELD VERSION
|
export INCLUDES BINDIR INTERM_BINDIR SBINDIR KERNELD VERSION HAVE_ELF
|
||||||
|
|
||||||
all:
|
all:
|
||||||
for i in $(SUBDIRS); do make -C $$i all; done
|
for i in $(SUBDIRS); do make -C $$i all; done
|
||||||
@@ -42,7 +45,7 @@ clean:
|
|||||||
mrproper: clean
|
mrproper: clean
|
||||||
rm -fr $(INTERM_BINDIR)/* ncpfs.tgz
|
rm -fr $(INTERM_BINDIR)/* ncpfs.tgz
|
||||||
make -C util mrproper
|
make -C util mrproper
|
||||||
(cd daemon; make clean)
|
make -C ipxdump mrproper
|
||||||
|
|
||||||
modules: ncpfs.o
|
modules: ncpfs.o
|
||||||
|
|
||||||
@@ -51,12 +54,10 @@ SRCDIR=$(shell basename $(SRCPATH))
|
|||||||
DISTFILE=$(SRCDIR).tgz
|
DISTFILE=$(SRCDIR).tgz
|
||||||
|
|
||||||
dist: mrproper
|
dist: mrproper
|
||||||
mv daemon ..
|
|
||||||
(cd ..; \
|
(cd ..; \
|
||||||
tar cvf - $(SRCDIR) | \
|
tar cvf - $(SRCDIR) | \
|
||||||
gzip -9 > $(DISTFILE); \
|
gzip -9 > $(DISTFILE); \
|
||||||
mv $(DISTFILE) $(SRCDIR))
|
mv $(DISTFILE) $(SRCDIR))
|
||||||
mv ../daemon .
|
|
||||||
make dep
|
make dep
|
||||||
make all
|
make all
|
||||||
|
|
||||||
|
|||||||
6
README
6
README
@@ -39,6 +39,12 @@ ncpfs.
|
|||||||
If you are running kerneld, please uncomment the corresponding line in
|
If you are running kerneld, please uncomment the corresponding line in
|
||||||
the Makefile to reflect this.
|
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
|
HELP
|
||||||
|
|
||||||
In the meantime my mail volume has grown considerably, so the response
|
In the meantime my mail volume has grown considerably, so the response
|
||||||
|
|||||||
5
TODO
5
TODO
@@ -1,9 +1,6 @@
|
|||||||
Here's a list of things I want to do. Feel free to send suggestions,
|
Here's a list of things I want to do. Feel free to send suggestions,
|
||||||
or even help me ;-).
|
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
|
- Add flags to pserver's command line, so that the print command can
|
||||||
find out the name of user who printed the job.
|
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
|
a single NCP connection. This should make the trade-off mentioned in
|
||||||
ncpmount.8 unnecessary.
|
ncpmount.8 unnecessary.
|
||||||
|
|
||||||
- long file names
|
|
||||||
|
|
||||||
- Do some kind of mapping of NCP uid's to unix uid's
|
- Do some kind of mapping of NCP uid's to unix uid's
|
||||||
|
|||||||
@@ -89,10 +89,31 @@ struct ncp_reply_header {
|
|||||||
__u8 data[0] __attribute__ ((packed));
|
__u8 data[0] __attribute__ ((packed));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define NCP_BURST_PACKET (0x7777)
|
||||||
|
|
||||||
|
struct ncp_burst_header {
|
||||||
|
__u16 type __attribute__ ((packed));
|
||||||
|
__u8 system_flags __attribute__ ((packed));
|
||||||
|
__u8 stream_type __attribute__ ((packed));
|
||||||
|
__u32 source_conn __attribute__ ((packed));
|
||||||
|
__u32 dest_conn __attribute__ ((packed));
|
||||||
|
__u32 packet_sequence __attribute__ ((packed));
|
||||||
|
__u32 send_delay __attribute__ ((packed));
|
||||||
|
__u16 burst_sequence __attribute__ ((packed));
|
||||||
|
__u16 ack_sequence __attribute__ ((packed));
|
||||||
|
__u32 burst_length __attribute__ ((packed));
|
||||||
|
__u32 data_offset __attribute__ ((packed));
|
||||||
|
__u16 data_bytes __attribute__ ((packed));
|
||||||
|
__u16 missing_frags __attribute__ ((packed));
|
||||||
|
};
|
||||||
|
|
||||||
void handle_ipx (unsigned char *buf, int length, char *frame, int no);
|
void handle_ipx (unsigned char *buf, int length, char *frame, int no);
|
||||||
void handle_ncp (struct sockaddr_ipx *source,
|
void handle_ncp (struct sockaddr_ipx *source,
|
||||||
struct sockaddr_ipx *target,
|
struct sockaddr_ipx *target,
|
||||||
unsigned char *buf, int length, int no);
|
unsigned char *buf, int length, int no);
|
||||||
|
int handle_burst(struct sockaddr_ipx *source,
|
||||||
|
struct sockaddr_ipx *target,
|
||||||
|
unsigned char *buf, int length, int no);
|
||||||
|
|
||||||
#define SAP_MAX_SERVER_NAME_LENGTH 48 /* in network packets */
|
#define SAP_MAX_SERVER_NAME_LENGTH 48 /* in network packets */
|
||||||
#define SAP_MAX_SAPS_PER_PACKET 7
|
#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);
|
ipx_print_saddr(&d_addr);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
|
if (handle_burst(&s_addr, &d_addr, buf + sizeof(struct ipx_packet),
|
||||||
|
length - sizeof(struct ipx_packet), no) != 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ( (ntohs(s_addr.sipx_port) == 0x451)
|
if ( (ntohs(s_addr.sipx_port) == 0x451)
|
||||||
|| (ntohs(d_addr.sipx_port) == 0x451))
|
|| (ntohs(d_addr.sipx_port) == 0x451))
|
||||||
{
|
{
|
||||||
@@ -253,6 +280,55 @@ handle_ipx (unsigned char *buf, int length, char *frame, int no)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int handle_burst(struct sockaddr_ipx *source,
|
||||||
|
struct sockaddr_ipx *target,
|
||||||
|
unsigned char *buf, int length, int no)
|
||||||
|
{
|
||||||
|
struct ncp_burst_header *rq = (struct ncp_burst_header *)buf;
|
||||||
|
|
||||||
|
if (rq->type != NCP_BURST_PACKET)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Burst Packet\n");
|
||||||
|
printf("Stream Type: %02X, System Flags: %02X\n",
|
||||||
|
rq->stream_type, rq->system_flags);
|
||||||
|
printf("Source Conn: %08X, Dest Conn: %08X, Packet Seq: %08X\n",
|
||||||
|
rq->source_conn, rq->dest_conn,
|
||||||
|
(unsigned int)ntohl(rq->packet_sequence));
|
||||||
|
printf("Send Delay: %08X, Burst Seq: %04X, Ack Seq: %04X\n",
|
||||||
|
(unsigned int)ntohl(rq->send_delay), ntohs(rq->burst_sequence),
|
||||||
|
ntohs(rq->ack_sequence));
|
||||||
|
printf("Burst Length: %08X\n", (unsigned int)ntohl(rq->burst_length));
|
||||||
|
printf("Data Offset: %08X, Data Bytes: %04X, Missing Frags: %04X\n",
|
||||||
|
(unsigned int)ntohl(rq->data_offset), ntohs(rq->data_bytes),
|
||||||
|
ntohs(rq->missing_frags));
|
||||||
|
|
||||||
|
if (ntohs(rq->data_bytes) == 24)
|
||||||
|
{
|
||||||
|
struct ncp_burst_request
|
||||||
|
{
|
||||||
|
struct ncp_burst_header h __attribute__ ((packed));
|
||||||
|
__u32 function __attribute__ ((packed));
|
||||||
|
__u32 file_handle __attribute__ ((packed));
|
||||||
|
__u8 reserved[8] __attribute__ ((packed));
|
||||||
|
__u32 file_offset __attribute__ ((packed));
|
||||||
|
__u32 number_of_bytes __attribute__ ((packed));
|
||||||
|
} *brq = (struct ncp_burst_request *)rq;
|
||||||
|
|
||||||
|
printf("Assuming Burst Request:\n");
|
||||||
|
printf("%s: Handle %08X, Offset %08X, Bytes %08X\n",
|
||||||
|
brq->function == 1 ? "Read " : "Write",
|
||||||
|
brq->file_handle,
|
||||||
|
(unsigned int)ntohl(brq->file_offset),
|
||||||
|
(unsigned int)ntohl(brq->number_of_bytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
void handle_ncp (struct sockaddr_ipx *source,
|
void handle_ncp (struct sockaddr_ipx *source,
|
||||||
struct sockaddr_ipx *target,
|
struct sockaddr_ipx *target,
|
||||||
unsigned char *buf, int length, int no)
|
unsigned char *buf, int length, int no)
|
||||||
@@ -275,6 +351,10 @@ void handle_ncp (struct sockaddr_ipx *source,
|
|||||||
|
|
||||||
switch(rq->function)
|
switch(rq->function)
|
||||||
{
|
{
|
||||||
|
case 18:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("Get Volume Info with Number\n");
|
||||||
|
break;
|
||||||
case 20:
|
case 20:
|
||||||
printf("fn: %-3d\n", rq->function);
|
printf("fn: %-3d\n", rq->function);
|
||||||
printf("Get File Server Date and Time\n");
|
printf("Get File Server Date and Time\n");
|
||||||
@@ -305,6 +385,21 @@ void handle_ncp (struct sockaddr_ipx *source,
|
|||||||
case 01:
|
case 01:
|
||||||
printf("Get Directory Path\n");
|
printf("Get Directory Path\n");
|
||||||
break;
|
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:
|
case 18:
|
||||||
printf("Allocate Permanent Dir Handle\n");
|
printf("Allocate Permanent Dir Handle\n");
|
||||||
break;
|
break;
|
||||||
@@ -314,6 +409,12 @@ void handle_ncp (struct sockaddr_ipx *source,
|
|||||||
case 21:
|
case 21:
|
||||||
printf("Get Volume Info with handle\n");
|
printf("Get Volume Info with handle\n");
|
||||||
break;
|
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 += 3;
|
||||||
data_length -= 3;
|
data_length -= 3;
|
||||||
@@ -326,6 +427,9 @@ void handle_ncp (struct sockaddr_ipx *source,
|
|||||||
case 17:
|
case 17:
|
||||||
printf("Get Fileserver Information\n");
|
printf("Get Fileserver Information\n");
|
||||||
break;
|
break;
|
||||||
|
case 22:
|
||||||
|
printf("Get Station's logged Info (old)\n");
|
||||||
|
break;
|
||||||
case 23:
|
case 23:
|
||||||
printf("Get Crypt Key\n");
|
printf("Get Crypt Key\n");
|
||||||
break;
|
break;
|
||||||
@@ -335,21 +439,48 @@ void handle_ncp (struct sockaddr_ipx *source,
|
|||||||
case 28:
|
case 28:
|
||||||
printf("Get Connection Information\n");
|
printf("Get Connection Information\n");
|
||||||
break;
|
break;
|
||||||
|
case 50:
|
||||||
|
printf("Create Bindery Object\n");
|
||||||
|
break;
|
||||||
case 53:
|
case 53:
|
||||||
printf("Get Bindery Object ID\n");
|
printf("Get Bindery Object ID\n");
|
||||||
break;
|
break;
|
||||||
|
case 54:
|
||||||
|
printf("Get Bindery Object Name\n");
|
||||||
|
break;
|
||||||
case 55:
|
case 55:
|
||||||
printf("Scan Bindery Object\n");
|
printf("Scan Bindery Object\n");
|
||||||
break;
|
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:
|
case 61:
|
||||||
printf("Read Property Value\n");
|
printf("Read Property Value\n");
|
||||||
break;
|
break;
|
||||||
case 62:
|
case 62:
|
||||||
printf("Write Property Value\n");
|
printf("Write Property Value\n");
|
||||||
break;
|
break;
|
||||||
|
case 65:
|
||||||
|
printf("Add Bindery Object to Set\n");
|
||||||
|
break;
|
||||||
|
case 67:
|
||||||
|
printf("Is Bindery Object in Set\n");
|
||||||
|
break;
|
||||||
case 70:
|
case 70:
|
||||||
printf("Get Bindery Access Level\n");
|
printf("Get Bindery Access Level\n");
|
||||||
break;
|
break;
|
||||||
|
case 72:
|
||||||
|
printf("Get Bindery Object Access Level\n");
|
||||||
|
break;
|
||||||
|
case 75:
|
||||||
|
printf("Keyed change password\n");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
data += 3;
|
data += 3;
|
||||||
@@ -359,6 +490,10 @@ void handle_ncp (struct sockaddr_ipx *source,
|
|||||||
printf("fn: %-3d\n", rq->function);
|
printf("fn: %-3d\n", rq->function);
|
||||||
printf("End of Job\n");
|
printf("End of Job\n");
|
||||||
break;
|
break;
|
||||||
|
case 33:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("Negotiate Buffer size\n");
|
||||||
|
break;
|
||||||
case 34:
|
case 34:
|
||||||
printf("fn: %-3d, subfn: %-3d\n", rq->function,
|
printf("fn: %-3d, subfn: %-3d\n", rq->function,
|
||||||
data[2]);
|
data[2]);
|
||||||
@@ -381,6 +516,10 @@ void handle_ncp (struct sockaddr_ipx *source,
|
|||||||
printf("fn: %-3d\n", rq->function);
|
printf("fn: %-3d\n", rq->function);
|
||||||
printf("Close File\n");
|
printf("Close File\n");
|
||||||
break;
|
break;
|
||||||
|
case 67:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("Create File\n");
|
||||||
|
break;
|
||||||
case 72:
|
case 72:
|
||||||
printf("fn: %-3d\n", rq->function);
|
printf("fn: %-3d\n", rq->function);
|
||||||
printf("Read from File\n");
|
printf("Read from File\n");
|
||||||
@@ -393,6 +532,11 @@ void handle_ncp (struct sockaddr_ipx *source,
|
|||||||
printf("fn: %-3d\n", rq->function);
|
printf("fn: %-3d\n", rq->function);
|
||||||
printf("Set File Time Date Stamp\n");
|
printf("Set File Time Date Stamp\n");
|
||||||
break;
|
break;
|
||||||
|
case 76:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("Open File (old)\n");
|
||||||
|
break;
|
||||||
|
|
||||||
case 87:
|
case 87:
|
||||||
printf("fn: %-3d, subfn: %-3d\n",
|
printf("fn: %-3d, subfn: %-3d\n",
|
||||||
rq->function, data[0]);
|
rq->function, data[0]);
|
||||||
@@ -425,10 +569,21 @@ void handle_ncp (struct sockaddr_ipx *source,
|
|||||||
case 8:
|
case 8:
|
||||||
printf("Delete a File Or Subdirectory\n");
|
printf("Delete a File Or Subdirectory\n");
|
||||||
break;
|
break;
|
||||||
|
case 12:
|
||||||
|
printf("Allocate Short Directory Handle\n");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
data += 1;
|
data += 1;
|
||||||
data_length -= 1;
|
data_length -= 1;
|
||||||
break;
|
break;
|
||||||
|
case 97:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("Get Big Packet NCP Max Packet Size\n");
|
||||||
|
break;
|
||||||
|
case 101:
|
||||||
|
printf("fn: %-3d\n", rq->function);
|
||||||
|
printf("Packet Burst Connection Request\n");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
printf("fn: %-3d\n", rq->function);
|
printf("fn: %-3d\n", rq->function);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,6 +116,12 @@ struct ncp_file_info {
|
|||||||
__u16 update_time;
|
__u16 update_time;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Defines for Name Spaces */
|
||||||
|
#define NW_NS_DOS 0
|
||||||
|
#define NW_NS_MAC 1
|
||||||
|
#define NW_NS_NFS 2
|
||||||
|
#define NW_NS_FTAM 3
|
||||||
|
#define NW_NS_OS2 4
|
||||||
|
|
||||||
/* Defines for ReturnInformationMask */
|
/* Defines for ReturnInformationMask */
|
||||||
#define RIM_NAME (0x0001L)
|
#define RIM_NAME (0x0001L)
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ struct ncp_server {
|
|||||||
interest for us later, so we store
|
interest for us later, so we store
|
||||||
it completely. */
|
it completely. */
|
||||||
|
|
||||||
|
__u8 name_space[NCP_NUMBER_OF_VOLUMES];
|
||||||
|
|
||||||
struct file *ncp_filp; /* File pointer to ncp socket */
|
struct file *ncp_filp; /* File pointer to ncp socket */
|
||||||
struct file *wdog_filp; /* File pointer to wdog socket */
|
struct file *wdog_filp; /* File pointer to wdog socket */
|
||||||
void *data_ready; /* The wdog socket gets a new
|
void *data_ready; /* The wdog socket gets a new
|
||||||
|
|||||||
@@ -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 = {
|
static struct file_operations ncp_dir_operations = {
|
||||||
NULL, /* lseek - default */
|
NULL, /* lseek - default */
|
||||||
ncp_dir_read, /* read - bad */
|
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
|
/* Here we encapsulate the inode number handling that depends upon the
|
||||||
* mount mode: When we mount a complete server, the memory address of
|
* mount mode: When we mount a complete server, the memory address of
|
||||||
* the npc_inode_info is used as an inode. When only a single volume
|
* the npc_inode_info is used as an inode. When only a single volume
|
||||||
* is mounted, then the DosDirNum is used as the inode number. As this
|
* is mounted, then the dirEntNum is used as the inode number. As this
|
||||||
* is unique for the complete volume, this should enable the NFS
|
* is unique for the complete volume, this should enable the NFS
|
||||||
* exportability of a ncpfs-mounted volume.
|
* exportability of a ncpfs-mounted volume.
|
||||||
*/
|
*/
|
||||||
@@ -148,7 +162,7 @@ inline ino_t
|
|||||||
ncp_info_ino(struct ncp_server *server, struct ncp_inode_info *info)
|
ncp_info_ino(struct ncp_server *server, struct ncp_inode_info *info)
|
||||||
{
|
{
|
||||||
return ncp_single_volume(server)
|
return ncp_single_volume(server)
|
||||||
? info->finfo.i.DosDirNum : (ino_t)info;
|
? info->finfo.i.dirEntNum : (ino_t)info;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
@@ -351,9 +365,12 @@ ncp_readdir(struct inode *inode, struct file *filp,
|
|||||||
c_last_returned_index = 0;
|
c_last_returned_index = 0;
|
||||||
index = 0;
|
index = 0;
|
||||||
|
|
||||||
for (i = 0; i < c_size; i++)
|
if (!ncp_preserve_case(inode))
|
||||||
{
|
{
|
||||||
str_lower(c_entry[i].i.entryName);
|
for (i = 0; i < c_size; i++)
|
||||||
|
{
|
||||||
|
str_lower(c_entry[i].i.entryName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -375,7 +392,7 @@ ncp_readdir(struct inode *inode, struct file *filp,
|
|||||||
|
|
||||||
if (ncp_single_volume(server))
|
if (ncp_single_volume(server))
|
||||||
{
|
{
|
||||||
ino = (ino_t)(entry->i.DosDirNum);
|
ino = (ino_t)(entry->i.dirEntNum);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -671,7 +688,7 @@ ncp_init_root(struct ncp_server *server)
|
|||||||
root->finfo.opened = 0;
|
root->finfo.opened = 0;
|
||||||
i->attributes = aDIR;
|
i->attributes = aDIR;
|
||||||
i->dataStreamSize = 1024;
|
i->dataStreamSize = 1024;
|
||||||
i->DosDirNum = 0;
|
i->dirEntNum = i->DosDirNum = 0;
|
||||||
i->volNumber = NCP_NUMBER_OF_VOLUMES+1; /* illegal volnum */
|
i->volNumber = NCP_NUMBER_OF_VOLUMES+1; /* illegal volnum */
|
||||||
ncp_date_unix2dos(0, &(i->creationTime), &(i->creationDate));
|
ncp_date_unix2dos(0, &(i->creationTime), &(i->creationDate));
|
||||||
ncp_date_unix2dos(0, &(i->modifyTime), &(i->modifyDate));
|
ncp_date_unix2dos(0, &(i->modifyTime), &(i->modifyDate));
|
||||||
@@ -748,7 +765,7 @@ ncp_find_dir_inode(struct inode *dir, const char *name)
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if ( (result->dir->finfo.i.DosDirNum == dir_info->DosDirNum)
|
if ( (result->dir->finfo.i.dirEntNum == dir_info->dirEntNum)
|
||||||
&& (result->dir->finfo.i.volNumber == dir_info->volNumber)
|
&& (result->dir->finfo.i.volNumber == dir_info->volNumber)
|
||||||
&& (strcmp(result->finfo.i.entryName, name) == 0)
|
&& (strcmp(result->finfo.i.entryName, name) == 0)
|
||||||
/* The root dir is never looked up using this
|
/* 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_server *server;
|
||||||
struct ncp_inode_info *result_info;
|
struct ncp_inode_info *result_info;
|
||||||
int found_in_cache;
|
int found_in_cache;
|
||||||
|
int down_case = 0;
|
||||||
char name[len+1];
|
char name[len+1];
|
||||||
|
|
||||||
*result = NULL;
|
*result = NULL;
|
||||||
@@ -887,20 +904,26 @@ ncp_lookup(struct inode *dir, const char *__name, int len,
|
|||||||
if (found_in_cache == 0)
|
if (found_in_cache == 0)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
str_upper(name);
|
|
||||||
|
|
||||||
DDPRINTK("ncp_lookup: do_lookup on %s/%s\n",
|
DDPRINTK("ncp_lookup: do_lookup on %s/%s\n",
|
||||||
NCP_ISTRUCT(dir)->entryName, name);
|
NCP_ISTRUCT(dir)->entryName, name);
|
||||||
|
|
||||||
if (ncp_is_server_root(dir))
|
if (ncp_is_server_root(dir))
|
||||||
{
|
{
|
||||||
|
str_upper(name);
|
||||||
|
down_case = 1;
|
||||||
res = ncp_lookup_volume(server, name, &(finfo.i));
|
res = ncp_lookup_volume(server, name, &(finfo.i));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (!ncp_preserve_case(dir))
|
||||||
|
{
|
||||||
|
str_upper(name);
|
||||||
|
down_case = 1;
|
||||||
|
}
|
||||||
res = ncp_obtain_info(server,
|
res = ncp_obtain_info(server,
|
||||||
NCP_ISTRUCT(dir)->volNumber,
|
NCP_ISTRUCT(dir)->volNumber,
|
||||||
NCP_ISTRUCT(dir)->DosDirNum,
|
NCP_ISTRUCT(dir)->dirEntNum,
|
||||||
name, &(finfo.i));
|
name, &(finfo.i));
|
||||||
}
|
}
|
||||||
if (res != 0)
|
if (res != 0)
|
||||||
@@ -912,7 +935,11 @@ ncp_lookup(struct inode *dir, const char *__name, int len,
|
|||||||
}
|
}
|
||||||
|
|
||||||
finfo.opened = 0;
|
finfo.opened = 0;
|
||||||
str_lower(finfo.i.entryName);
|
|
||||||
|
if (down_case != 0)
|
||||||
|
{
|
||||||
|
str_lower(finfo.i.entryName);
|
||||||
|
}
|
||||||
|
|
||||||
if (!(*result = ncp_iget(dir, &finfo)))
|
if (!(*result = ncp_iget(dir, &finfo)))
|
||||||
{
|
{
|
||||||
@@ -949,7 +976,11 @@ ncp_create(struct inode *dir, const char *name, int len, int mode,
|
|||||||
|
|
||||||
strncpy(_name, name, len);
|
strncpy(_name, name, len);
|
||||||
_name[len] = '\0';
|
_name[len] = '\0';
|
||||||
str_upper(_name);
|
|
||||||
|
if (!ncp_preserve_case(dir))
|
||||||
|
{
|
||||||
|
str_upper(_name);
|
||||||
|
}
|
||||||
|
|
||||||
lock_super(dir->i_sb);
|
lock_super(dir->i_sb);
|
||||||
if (ncp_open_create_file_or_subdir(NCP_SERVER(dir),
|
if (ncp_open_create_file_or_subdir(NCP_SERVER(dir),
|
||||||
@@ -966,7 +997,11 @@ ncp_create(struct inode *dir, const char *name, int len, int mode,
|
|||||||
|
|
||||||
ncp_invalid_dir_cache(dir);
|
ncp_invalid_dir_cache(dir);
|
||||||
|
|
||||||
str_lower(finfo.i.entryName);
|
if (!ncp_preserve_case(dir))
|
||||||
|
{
|
||||||
|
str_lower(finfo.i.entryName);
|
||||||
|
}
|
||||||
|
|
||||||
finfo.access = O_RDWR;
|
finfo.access = O_RDWR;
|
||||||
|
|
||||||
if (!(*result = ncp_iget(dir, &finfo)) < 0)
|
if (!(*result = ncp_iget(dir, &finfo)) < 0)
|
||||||
@@ -1000,7 +1035,11 @@ ncp_mkdir(struct inode *dir, const char *name, int len, int mode)
|
|||||||
|
|
||||||
strncpy(_name, name, len);
|
strncpy(_name, name, len);
|
||||||
_name[len] = '\0';
|
_name[len] = '\0';
|
||||||
str_upper(_name);
|
|
||||||
|
if (!ncp_preserve_case(dir))
|
||||||
|
{
|
||||||
|
str_upper(_name);
|
||||||
|
}
|
||||||
|
|
||||||
if (!dir || !S_ISDIR(dir->i_mode))
|
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);
|
strncpy(_name, name, len);
|
||||||
_name[len] = '\0';
|
_name[len] = '\0';
|
||||||
str_upper(_name);
|
|
||||||
|
if (!ncp_preserve_case(dir))
|
||||||
|
{
|
||||||
|
str_upper(_name);
|
||||||
|
}
|
||||||
|
|
||||||
if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir),
|
if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir),
|
||||||
NCP_ISTRUCT(dir),
|
NCP_ISTRUCT(dir),
|
||||||
@@ -1101,7 +1144,11 @@ ncp_unlink(struct inode *dir, const char *name, int len)
|
|||||||
{
|
{
|
||||||
strncpy(_name, name, len);
|
strncpy(_name, name, len);
|
||||||
_name[len] = '\0';
|
_name[len] = '\0';
|
||||||
str_upper(_name);
|
|
||||||
|
if (!ncp_preserve_case(dir))
|
||||||
|
{
|
||||||
|
str_upper(_name);
|
||||||
|
}
|
||||||
|
|
||||||
if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir),
|
if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir),
|
||||||
NCP_ISTRUCT(dir),
|
NCP_ISTRUCT(dir),
|
||||||
@@ -1155,11 +1202,19 @@ ncp_rename(struct inode *old_dir, const char *old_name, int old_len,
|
|||||||
|
|
||||||
strncpy(_old_name, old_name, old_len);
|
strncpy(_old_name, old_name, old_len);
|
||||||
_old_name[old_len] = '\0';
|
_old_name[old_len] = '\0';
|
||||||
str_upper(_old_name);
|
|
||||||
|
if (!ncp_preserve_case(old_dir))
|
||||||
|
{
|
||||||
|
str_upper(_old_name);
|
||||||
|
}
|
||||||
|
|
||||||
strncpy(_new_name, new_name, new_len);
|
strncpy(_new_name, new_name, new_len);
|
||||||
_new_name[new_len] = '\0';
|
_new_name[new_len] = '\0';
|
||||||
str_upper(_new_name);
|
|
||||||
|
if (!ncp_preserve_case(new_dir))
|
||||||
|
{
|
||||||
|
str_upper(_new_name);
|
||||||
|
}
|
||||||
|
|
||||||
res = ncp_ren_or_mov_file_or_subdir(NCP_SERVER(old_dir),
|
res = ncp_ren_or_mov_file_or_subdir(NCP_SERVER(old_dir),
|
||||||
NCP_ISTRUCT(old_dir), _old_name,
|
NCP_ISTRUCT(old_dir), _old_name,
|
||||||
|
|||||||
@@ -188,25 +188,6 @@ ncp_get_volume_info_with_number(struct ncp_server *server, int n,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
ncp_get_volume_number(struct ncp_server *server, const char *name, int *target)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
|
|
||||||
ncp_init_request_s(server, 5);
|
|
||||||
ncp_add_pstring(server, name);
|
|
||||||
|
|
||||||
if ((result = ncp_request(server, 22)) != 0)
|
|
||||||
{
|
|
||||||
ncp_unlock_server(server);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
*target = ncp_reply_byte(server, 0);
|
|
||||||
ncp_unlock_server(server);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
ncp_close_file(struct ncp_server *server, const char *file_id)
|
ncp_close_file(struct ncp_server *server, const char *file_id)
|
||||||
{
|
{
|
||||||
@@ -282,8 +263,8 @@ ncp_obtain_info(struct ncp_server *server,
|
|||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 6); /* subfunction */
|
ncp_add_byte(server, 6); /* subfunction */
|
||||||
ncp_add_byte(server, 0); /* dos name space */
|
ncp_add_byte(server, server->name_space[vol_num]);
|
||||||
ncp_add_byte(server, 0); /* dos name space as dest */
|
ncp_add_byte(server, server->name_space[vol_num]);
|
||||||
ncp_add_word(server, 0xff); /* get all */
|
ncp_add_word(server, 0xff); /* get all */
|
||||||
ncp_add_dword(server, RIM_ALL);
|
ncp_add_dword(server, RIM_ALL);
|
||||||
ncp_add_handle_path(server, vol_num, dir_base, 1, path);
|
ncp_add_handle_path(server, vol_num, dir_base, 1, path);
|
||||||
@@ -299,20 +280,57 @@ ncp_obtain_info(struct ncp_server *server,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
ncp_has_os2_namespace(struct ncp_server *server, __u8 volume)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
__u8 *namespace;
|
||||||
|
__u16 no_namespaces;
|
||||||
|
|
||||||
|
ncp_init_request(server);
|
||||||
|
ncp_add_byte(server, 24); /* Subfunction: Get Name Spaces Loaded */
|
||||||
|
ncp_add_word(server, 0);
|
||||||
|
ncp_add_byte(server, volume);
|
||||||
|
|
||||||
|
if ((result = ncp_request(server, 87)) != 0)
|
||||||
|
{
|
||||||
|
ncp_unlock_server(server);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
no_namespaces = ncp_reply_word(server, 0);
|
||||||
|
namespace = ncp_reply_data(server, 2);
|
||||||
|
|
||||||
|
while (no_namespaces > 0)
|
||||||
|
{
|
||||||
|
DPRINTK("get_namespaces: found %d on %d\n", *namespace,volume);
|
||||||
|
|
||||||
|
if (*namespace == 4)
|
||||||
|
{
|
||||||
|
DPRINTK("get_namespaces: found OS2\n");
|
||||||
|
ncp_unlock_server(server);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
namespace += 1;
|
||||||
|
no_namespaces -= 1;
|
||||||
|
}
|
||||||
|
ncp_unlock_server(server);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
ncp_lookup_volume(struct ncp_server *server,
|
ncp_lookup_volume(struct ncp_server *server,
|
||||||
char *volname,
|
char *volname,
|
||||||
struct nw_info_struct *target)
|
struct nw_info_struct *target)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
__u8 vol_num;
|
int volnum;
|
||||||
__u32 dir_base;
|
|
||||||
|
|
||||||
DPRINTK("ncp_lookup_volume: looking up vol %s\n", volname);
|
DPRINTK("ncp_lookup_volume: looking up vol %s\n", volname);
|
||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 22); /* Subfunction: Generate dir handle */
|
ncp_add_byte(server, 22); /* Subfunction: Generate dir handle */
|
||||||
ncp_add_byte(server, 0); /* DOS name space */
|
ncp_add_byte(server, 0); /* DOS namespace */
|
||||||
ncp_add_byte(server, 0); /* reserved */
|
ncp_add_byte(server, 0); /* reserved */
|
||||||
ncp_add_byte(server, 0); /* reserved */
|
ncp_add_byte(server, 0); /* reserved */
|
||||||
ncp_add_byte(server, 0); /* reserved */
|
ncp_add_byte(server, 0); /* reserved */
|
||||||
@@ -329,20 +347,19 @@ ncp_lookup_volume(struct ncp_server *server,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
dir_base = ncp_reply_dword(server, 4);
|
memset(target, 0, sizeof(*target));
|
||||||
vol_num = ncp_reply_byte(server, 8);
|
target->DosDirNum = target->dirEntNum = ncp_reply_dword(server, 4);
|
||||||
|
target->volNumber = volnum = ncp_reply_byte(server, 8);
|
||||||
ncp_unlock_server(server);
|
ncp_unlock_server(server);
|
||||||
|
|
||||||
if ((result = ncp_obtain_info(server, vol_num, dir_base, NULL,
|
server->name_space[volnum] = ncp_has_os2_namespace(server,volnum)?4:0;
|
||||||
target)) != 0)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
DPRINTK("ncp_lookup_volume: attribs = %X\n", target->attributes);
|
DPRINTK("lookup_vol: namespace[%d] = %d\n",
|
||||||
|
volnum, server->name_space[volnum]);
|
||||||
|
|
||||||
target->nameLen = strlen(volname);
|
target->nameLen = strlen(volname);
|
||||||
strcpy(target->entryName, volname);
|
strcpy(target->entryName, volname);
|
||||||
|
target->attributes = aDIR;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -356,14 +373,14 @@ ncp_modify_file_or_subdir_dos_info(struct ncp_server *server,
|
|||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 7); /* subfunction */
|
ncp_add_byte(server, 7); /* subfunction */
|
||||||
ncp_add_byte(server, 0); /* dos name space */
|
ncp_add_byte(server, server->name_space[file->volNumber]);
|
||||||
ncp_add_byte(server, 0); /* reserved */
|
ncp_add_byte(server, 0); /* reserved */
|
||||||
ncp_add_word(server, 0x8006); /* search attribs: all */
|
ncp_add_word(server, 0x8006); /* search attribs: all */
|
||||||
|
|
||||||
ncp_add_dword(server, info_mask);
|
ncp_add_dword(server, info_mask);
|
||||||
ncp_add_mem(server, info, sizeof(*info));
|
ncp_add_mem(server, info, sizeof(*info));
|
||||||
ncp_add_handle_path(server, file->volNumber,
|
ncp_add_handle_path(server, file->volNumber,
|
||||||
file->DosDirNum, 1, NULL);
|
file->dirEntNum, 1, NULL);
|
||||||
|
|
||||||
if ((result = ncp_request(server, 87)) != 0)
|
if ((result = ncp_request(server, 87)) != 0)
|
||||||
{
|
{
|
||||||
@@ -383,11 +400,11 @@ ncp_del_file_or_subdir(struct ncp_server *server,
|
|||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 8); /* subfunction */
|
ncp_add_byte(server, 8); /* subfunction */
|
||||||
ncp_add_byte(server, 0); /* dos name space */
|
ncp_add_byte(server, server->name_space[dir->volNumber]);
|
||||||
ncp_add_byte(server, 0); /* reserved */
|
ncp_add_byte(server, 0); /* reserved */
|
||||||
ncp_add_word(server, 0x8006); /* search attribs: all */
|
ncp_add_word(server, 0x8006); /* search attribs: all */
|
||||||
ncp_add_handle_path(server, dir->volNumber,
|
ncp_add_handle_path(server, dir->volNumber,
|
||||||
dir->DosDirNum, 1, name);
|
dir->dirEntNum, 1, name);
|
||||||
|
|
||||||
if ((result = ncp_request(server, 87)) != 0)
|
if ((result = ncp_request(server, 87)) != 0)
|
||||||
{
|
{
|
||||||
@@ -420,15 +437,16 @@ ncp_open_create_file_or_subdir(struct ncp_server *server,
|
|||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
__u16 search_attribs = 0x0006;
|
__u16 search_attribs = 0x0006;
|
||||||
|
__u8 volume = (dir != NULL) ? dir->volNumber : target->i.volNumber;
|
||||||
|
|
||||||
if ((create_attributes & aDIR) != 0)
|
if ((create_attributes & aDIR) != 0)
|
||||||
{
|
{
|
||||||
search_attribs |= 0x8000;
|
search_attribs |= 0x8000;
|
||||||
}
|
}
|
||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 1); /* subfunction */
|
ncp_add_byte(server, 1); /* subfunction */
|
||||||
ncp_add_byte(server, 0); /* dos name space */
|
ncp_add_byte(server, server->name_space[volume]);
|
||||||
ncp_add_byte(server, open_create_mode);
|
ncp_add_byte(server, open_create_mode);
|
||||||
ncp_add_word(server, search_attribs);
|
ncp_add_word(server, search_attribs);
|
||||||
ncp_add_dword(server, RIM_ALL);
|
ncp_add_dword(server, RIM_ALL);
|
||||||
@@ -439,13 +457,11 @@ ncp_open_create_file_or_subdir(struct ncp_server *server,
|
|||||||
|
|
||||||
if (dir != NULL)
|
if (dir != NULL)
|
||||||
{
|
{
|
||||||
ncp_add_handle_path(server, dir->volNumber,
|
ncp_add_handle_path(server, volume, dir->dirEntNum, 1, name);
|
||||||
dir->DosDirNum, 1, name);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ncp_add_handle_path(server,
|
ncp_add_handle_path(server, volume, target->i.dirEntNum,
|
||||||
target->i.volNumber, target->i.DosDirNum,
|
|
||||||
1, NULL);
|
1, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -481,9 +497,9 @@ ncp_initialize_search(struct ncp_server *server,
|
|||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 2); /* subfunction */
|
ncp_add_byte(server, 2); /* subfunction */
|
||||||
ncp_add_byte(server, 0); /* dos name space */
|
ncp_add_byte(server, server->name_space[dir->volNumber]);
|
||||||
ncp_add_byte(server, 0); /* reserved */
|
ncp_add_byte(server, 0); /* reserved */
|
||||||
ncp_add_handle_path(server, dir->volNumber, dir->DosDirNum, 1, NULL);
|
ncp_add_handle_path(server, dir->volNumber, dir->dirEntNum, 1, NULL);
|
||||||
|
|
||||||
if ((result = ncp_request(server, 87)) != 0)
|
if ((result = ncp_request(server, 87)) != 0)
|
||||||
{
|
{
|
||||||
@@ -507,7 +523,7 @@ ncp_search_for_file_or_subdir(struct ncp_server *server,
|
|||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 3); /* subfunction */
|
ncp_add_byte(server, 3); /* subfunction */
|
||||||
ncp_add_byte(server, 0); /* dos name space */
|
ncp_add_byte(server, server->name_space[seq->volNumber]);
|
||||||
ncp_add_byte(server, 0); /* data stream (???) */
|
ncp_add_byte(server, 0); /* data stream (???) */
|
||||||
ncp_add_word(server, 0xffff); /* Search attribs */
|
ncp_add_word(server, 0xffff); /* Search attribs */
|
||||||
ncp_add_dword(server, RIM_ALL); /* return info mask */
|
ncp_add_dword(server, RIM_ALL); /* return info mask */
|
||||||
@@ -542,19 +558,19 @@ ncp_ren_or_mov_file_or_subdir(struct ncp_server *server,
|
|||||||
|
|
||||||
ncp_init_request(server);
|
ncp_init_request(server);
|
||||||
ncp_add_byte(server, 4); /* subfunction */
|
ncp_add_byte(server, 4); /* subfunction */
|
||||||
ncp_add_byte(server, 0); /* dos name space */
|
ncp_add_byte(server, server->name_space[old_dir->volNumber]);
|
||||||
ncp_add_byte(server, 1); /* rename flag */
|
ncp_add_byte(server, 1); /* rename flag */
|
||||||
ncp_add_word(server, 0x8006); /* search attributes */
|
ncp_add_word(server, 0x8006); /* search attributes */
|
||||||
|
|
||||||
/* source Handle Path */
|
/* source Handle Path */
|
||||||
ncp_add_byte(server, old_dir->volNumber);
|
ncp_add_byte(server, old_dir->volNumber);
|
||||||
ncp_add_dword(server, old_dir->DosDirNum);
|
ncp_add_dword(server, old_dir->dirEntNum);
|
||||||
ncp_add_byte(server, 1);
|
ncp_add_byte(server, 1);
|
||||||
ncp_add_byte(server, 1); /* 1 source component */
|
ncp_add_byte(server, 1); /* 1 source component */
|
||||||
|
|
||||||
/* dest Handle Path */
|
/* dest Handle Path */
|
||||||
ncp_add_byte(server, new_dir->volNumber);
|
ncp_add_byte(server, new_dir->volNumber);
|
||||||
ncp_add_dword(server, new_dir->DosDirNum);
|
ncp_add_dword(server, new_dir->dirEntNum);
|
||||||
ncp_add_byte(server, 1);
|
ncp_add_byte(server, 1);
|
||||||
ncp_add_byte(server, 1); /* 1 destination component */
|
ncp_add_byte(server, 1); /* 1 destination component */
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
MAN1= slist nprint pqlist nsend pserver ncopy npasswd
|
MAN1= slist nprint pqlist nsend pserver ncopy npasswd
|
||||||
|
MAN1 += nwbols nwboprops nwbpvalues nwfsinfo nwuserlist
|
||||||
MAN5= nwclient
|
MAN5= nwclient
|
||||||
MAN8= ncpmount ncpumount ipx_configure ipx_interface ipx_internal_net \
|
MAN8= ncpmount ncpumount ipx_configure ipx_interface ipx_internal_net \
|
||||||
ipx_route nwmsg
|
ipx_route nwmsg
|
||||||
|
MAN8 += nwbocreate nwborm nwbpadd nwbpcreate nwbprm
|
||||||
|
MAN8 += nwgrant nwrevoke
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
133
man/nwbocreate.8
Normal file
133
man/nwbocreate.8
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
.TH NWBOCREATE 8 7/9/1996 nwbocreate nwbocreate
|
||||||
|
.SH NAME
|
||||||
|
nwbocreate \- Create a NetWare Bindery Object
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nwbocreate
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -U
|
||||||
|
.I user name
|
||||||
|
] [
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
|
|
||||||
|
.B -n
|
||||||
|
] [
|
||||||
|
.B -C
|
||||||
|
] [
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
] [
|
||||||
|
.B -t
|
||||||
|
.I type
|
||||||
|
] [
|
||||||
|
.B -r
|
||||||
|
.I read-flag
|
||||||
|
] [
|
||||||
|
.B -w
|
||||||
|
.I write-flag
|
||||||
|
]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B nwbocreate
|
||||||
|
creates the specified NetWare Bindery Object.
|
||||||
|
|
||||||
|
.B nwbocreate
|
||||||
|
looks up the file
|
||||||
|
.I $HOME/.nwclient
|
||||||
|
to find a file server, a user name and possibly a password. See
|
||||||
|
nwclient(5) for more information. Please note that the access
|
||||||
|
permissions of $HOME/.nwclient MUST be 600 for security reasons.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.B -h
|
||||||
|
.RS 3
|
||||||
|
.B -h
|
||||||
|
is used to print out a short help text.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
.RS 3
|
||||||
|
.B server
|
||||||
|
is the name of the server you want to use.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -U
|
||||||
|
.I user
|
||||||
|
.RS 3
|
||||||
|
.B user
|
||||||
|
is the user name to use for login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
.RS 3
|
||||||
|
.B password
|
||||||
|
is the password to use for login. If neither
|
||||||
|
.B -n
|
||||||
|
nor
|
||||||
|
.B -P
|
||||||
|
are given, and the user has no open connection to the server, nwbocreate
|
||||||
|
prompts for a password.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -n
|
||||||
|
.RS 3
|
||||||
|
.B -n
|
||||||
|
should be given if no password is required for the login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -C
|
||||||
|
.RS 3
|
||||||
|
By default, passwords are converted to uppercase before they are sent
|
||||||
|
to the server, because most servers require this. You can turn off
|
||||||
|
this conversion by
|
||||||
|
.B -C.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
.RS 3
|
||||||
|
The name of the object to be created.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -t
|
||||||
|
.I object type
|
||||||
|
.RS 3
|
||||||
|
The type of the object.
|
||||||
|
.I Object type
|
||||||
|
must be specified as a decimal value. Common values are 1 for user
|
||||||
|
objects, 2 for group objects and 3 for print queues. Other values are
|
||||||
|
allowed, but are usually used for specialized applications.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -r
|
||||||
|
.I read-flag
|
||||||
|
|
||||||
|
.B -w
|
||||||
|
.I write-flag
|
||||||
|
.RS 3
|
||||||
|
|
||||||
|
Read security and write security may each have one of the following values:
|
||||||
|
|
||||||
|
ANYONE: Anyone may access the object
|
||||||
|
LOGGED: Anyone who is logged in may access the
|
||||||
|
object
|
||||||
|
OBJECT: Anyone who is logged in as the object or
|
||||||
|
SUPERVISOR equivalent may access the
|
||||||
|
object
|
||||||
|
SUPERVISOR: Anyone who is logged in as SUPERVISOR
|
||||||
|
equivalent may access the object
|
||||||
|
NETWARE: Only the Bindery may access the object
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.SH AUTHORS
|
||||||
|
nwbocreate was written by Volker Lendecke with the corresponding
|
||||||
|
Caldera utility in mind. See the Changes file of ncpfs for other
|
||||||
|
contributors.
|
||||||
117
man/nwbols.1
Normal file
117
man/nwbols.1
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
.TH NWBOLS 1 7/9/1996 nwbols nwbols
|
||||||
|
.SH NAME
|
||||||
|
nwbols \- List NetWare Bindery Objects
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nwbols
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -U
|
||||||
|
.I user name
|
||||||
|
] [
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
|
|
||||||
|
.B -n
|
||||||
|
] [
|
||||||
|
.B -C
|
||||||
|
] [
|
||||||
|
.B -t
|
||||||
|
.I type
|
||||||
|
] [
|
||||||
|
.B -v
|
||||||
|
] [
|
||||||
|
.B pattern
|
||||||
|
]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B nwbols
|
||||||
|
lists the specified NetWare Bindery Objects visible for the user.
|
||||||
|
|
||||||
|
.B nwbols
|
||||||
|
looks up the file
|
||||||
|
.I $HOME/.nwclient
|
||||||
|
to find a file server, a user name and possibly a password. See
|
||||||
|
nwclient(5) for more information. Please note that the access
|
||||||
|
permissions of $HOME/.nwclient MUST be 600 for security reasons.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.B -h
|
||||||
|
.RS 3
|
||||||
|
.B -h
|
||||||
|
is used to print out a short help text.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
.RS 3
|
||||||
|
.B server
|
||||||
|
is the name of the server you want to use.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -U
|
||||||
|
.I user
|
||||||
|
.RS 3
|
||||||
|
.B user
|
||||||
|
is the user name to use for login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
.RS 3
|
||||||
|
.B password
|
||||||
|
is the password to use for login. If neither
|
||||||
|
.B -n
|
||||||
|
nor
|
||||||
|
.B -P
|
||||||
|
are given, and the user has no open connection to the server, nwbols
|
||||||
|
prompts for a password.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -n
|
||||||
|
.RS 3
|
||||||
|
.B -n
|
||||||
|
should be given if no password is required for the login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -C
|
||||||
|
.RS 3
|
||||||
|
By default, passwords are converted to uppercase before they are sent
|
||||||
|
to the server, because most servers require this. You can turn off
|
||||||
|
this conversion by
|
||||||
|
.B -C.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -t
|
||||||
|
.I type
|
||||||
|
.RS 3
|
||||||
|
You can restrict the objects listed by specifying the type of the
|
||||||
|
objects to be listed.
|
||||||
|
.I type
|
||||||
|
must be given as a decimal number.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B pattern
|
||||||
|
.RS 3
|
||||||
|
Specifying a pattern is another way to restrict the objects
|
||||||
|
listed. Please note that this pattern is evaluated by the NetWare
|
||||||
|
server. grep would be a better candidate for complex patterns.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -v
|
||||||
|
.RS 3
|
||||||
|
By default, the object's name, its ID and its type are listed by
|
||||||
|
.B nwbols.
|
||||||
|
In the verbose mode, activated by
|
||||||
|
.B -v,
|
||||||
|
the object flags, its security byte and the properties flag is also
|
||||||
|
listed.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.SH AUTHORS
|
||||||
|
nwbols was written by Volker Lendecke. See the Changes file of ncpfs
|
||||||
|
for other contributors.
|
||||||
118
man/nwboprops.1
Normal file
118
man/nwboprops.1
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
.TH NWBOPROPS 1 7/9/1996 nwboprops nwboprops
|
||||||
|
.SH NAME
|
||||||
|
nwboprops \- List properies of a NetWare Bindery Object
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nwboprops
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -U
|
||||||
|
.I user name
|
||||||
|
] [
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
|
|
||||||
|
.B -n
|
||||||
|
] [
|
||||||
|
.B -C
|
||||||
|
] [
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
] [
|
||||||
|
.B -t
|
||||||
|
.I type
|
||||||
|
] [
|
||||||
|
.B -v
|
||||||
|
]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B nwboprops
|
||||||
|
lists all the properties of the specified NetWare Bindery Objects.
|
||||||
|
|
||||||
|
.B nwboprops
|
||||||
|
looks up the file
|
||||||
|
.I $HOME/.nwclient
|
||||||
|
to find a file server, a user name and possibly a password. See
|
||||||
|
nwclient(5) for more information. Please note that the access
|
||||||
|
permissions of $HOME/.nwclient MUST be 600 for security reasons.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.B -h
|
||||||
|
.RS 3
|
||||||
|
.B -h
|
||||||
|
is used to print out a short help text.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
.RS 3
|
||||||
|
.B server
|
||||||
|
is the name of the server you want to use.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -U
|
||||||
|
.I user
|
||||||
|
.RS 3
|
||||||
|
.B user
|
||||||
|
is the user name to use for login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
.RS 3
|
||||||
|
.B password
|
||||||
|
is the password to use for login. If neither
|
||||||
|
.B -n
|
||||||
|
nor
|
||||||
|
.B -P
|
||||||
|
are given, and the user has no open connection to the server, nwboprops
|
||||||
|
prompts for a password.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -n
|
||||||
|
.RS 3
|
||||||
|
.B -n
|
||||||
|
should be given if no password is required for the login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -C
|
||||||
|
.RS 3
|
||||||
|
By default, passwords are converted to uppercase before they are sent
|
||||||
|
to the server, because most servers require this. You can turn off
|
||||||
|
this conversion by
|
||||||
|
.B -C.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
.RS 3
|
||||||
|
The name of the object to be inspected.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -t
|
||||||
|
.I object type
|
||||||
|
.RS 3
|
||||||
|
The type of the object.
|
||||||
|
.I Object type
|
||||||
|
must be specified as a decimal value. Common values are 1 for user
|
||||||
|
objects, 2 for group objects and 3 for print queues. Other values are
|
||||||
|
allowed, but are usually used for specialized applications.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -v
|
||||||
|
.RS 3
|
||||||
|
By default, only the property name is listed. In verbose mode,
|
||||||
|
activated by
|
||||||
|
.B -v,
|
||||||
|
the property flag, the property security byte and the value flag are
|
||||||
|
also listed.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.SH AUTHORS
|
||||||
|
nwboprops was written by Volker Lendecke with the corresponding
|
||||||
|
Caldera utility in mind. See the Changes file of ncpfs for other
|
||||||
|
contributors.
|
||||||
106
man/nwborm.8
Normal file
106
man/nwborm.8
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
.TH NWBORM 8 7/9/1996 nwborm nwborm
|
||||||
|
.SH NAME
|
||||||
|
nwborm \- Remove a NetWare Bindery Object
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nwborm
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -U
|
||||||
|
.I user name
|
||||||
|
] [
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
|
|
||||||
|
.B -n
|
||||||
|
] [
|
||||||
|
.B -C
|
||||||
|
] [
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
] [
|
||||||
|
.B -t
|
||||||
|
.I type
|
||||||
|
]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B nwborm
|
||||||
|
removes the specified NetWare Bindery Objects.
|
||||||
|
|
||||||
|
.B nwborm
|
||||||
|
looks up the file
|
||||||
|
.I $HOME/.nwclient
|
||||||
|
to find a file server, a user name and possibly a password. See
|
||||||
|
nwclient(5) for more information. Please note that the access
|
||||||
|
permissions of $HOME/.nwclient MUST be 600 for security reasons.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.B -h
|
||||||
|
.RS 3
|
||||||
|
.B -h
|
||||||
|
is used to print out a short help text.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
.RS 3
|
||||||
|
.B server
|
||||||
|
is the name of the server you want to use.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -U
|
||||||
|
.I user
|
||||||
|
.RS 3
|
||||||
|
.B user
|
||||||
|
is the user name to use for login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
.RS 3
|
||||||
|
.B password
|
||||||
|
is the password to use for login. If neither
|
||||||
|
.B -n
|
||||||
|
nor
|
||||||
|
.B -P
|
||||||
|
are given, and the user has no open connection to the server, nwborm
|
||||||
|
prompts for a password.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -n
|
||||||
|
.RS 3
|
||||||
|
.B -n
|
||||||
|
should be given if no password is required for the login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -C
|
||||||
|
.RS 3
|
||||||
|
By default, passwords are converted to uppercase before they are sent
|
||||||
|
to the server, because most servers require this. You can turn off
|
||||||
|
this conversion by
|
||||||
|
.B -C.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
.RS 3
|
||||||
|
The name of the object to be deleted.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -t
|
||||||
|
.I object type
|
||||||
|
.RS 3
|
||||||
|
The type of the object.
|
||||||
|
.I Object type
|
||||||
|
must be specified as a decimal value. Common values are 1 for user
|
||||||
|
objects, 2 for group objects and 3 for print queues. Other values are
|
||||||
|
allowed, but are usually used for specialized applications.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.SH AUTHORS
|
||||||
|
nwborm was written by Volker Lendecke with the corresponding Caldera
|
||||||
|
utility in mind. See the Changes file of ncpfs for other contributors.
|
||||||
145
man/nwbpadd.8
Normal file
145
man/nwbpadd.8
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
.TH NWBPADD 8 7/9/1996 nwbpadd nwbpadd
|
||||||
|
.SH NAME
|
||||||
|
nwbpadd \- Set the value of a NetWare Bindery Property
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nwbpadd
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -U
|
||||||
|
.I user name
|
||||||
|
] [
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
|
|
||||||
|
.B -n
|
||||||
|
] [
|
||||||
|
.B -C
|
||||||
|
] [
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
] [
|
||||||
|
.B -t
|
||||||
|
.I type
|
||||||
|
] [
|
||||||
|
.B -p
|
||||||
|
.I property
|
||||||
|
]
|
||||||
|
.B value
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B nwbpadd
|
||||||
|
sets the value of a ITEM type property, and adds bindery objects to a
|
||||||
|
SET type property.
|
||||||
|
|
||||||
|
.B nwbpadd
|
||||||
|
looks up the file
|
||||||
|
.I $HOME/.nwclient
|
||||||
|
to find a file server, a user name and possibly a password. See
|
||||||
|
nwclient(5) for more information. Please note that the access
|
||||||
|
permissions of $HOME/.nwclient MUST be 600 for security reasons.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.B -h
|
||||||
|
.RS 3
|
||||||
|
.B -h
|
||||||
|
is used to print out a short help text.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
.RS 3
|
||||||
|
.B server
|
||||||
|
is the name of the server you want to use.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -U
|
||||||
|
.I user
|
||||||
|
.RS 3
|
||||||
|
.B user
|
||||||
|
is the user name to use for login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
.RS 3
|
||||||
|
.B password
|
||||||
|
is the password to use for login. If neither
|
||||||
|
.B -n
|
||||||
|
nor
|
||||||
|
.B -P
|
||||||
|
are given, and the user has no open connection to the server, nwbpadd
|
||||||
|
prompts for a password.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -n
|
||||||
|
.RS 3
|
||||||
|
.B -n
|
||||||
|
should be given if no password is required for the login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -C
|
||||||
|
.RS 3
|
||||||
|
By default, passwords are converted to uppercase before they are sent
|
||||||
|
to the server, because most servers require this. You can turn off
|
||||||
|
this conversion by
|
||||||
|
.B -C.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
.RS 3
|
||||||
|
The name of the object to be touched.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -t
|
||||||
|
.I object type
|
||||||
|
.RS 3
|
||||||
|
The type of the object.
|
||||||
|
.I Object type
|
||||||
|
must be specified as a decimal value. Common values are 1 for user
|
||||||
|
objects, 2 for group objects and 3 for print queues. Other values are
|
||||||
|
allowed, but are usually used for specialized applications.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -p
|
||||||
|
.I property
|
||||||
|
.RS 3
|
||||||
|
The name of the property to be set.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B value
|
||||||
|
.RS 3
|
||||||
|
If property is of type SET, value is an object id in hexadecimal
|
||||||
|
notation. Otherwise, value is either a string value to be written, or
|
||||||
|
a count of bytes to be written. The latter is assumed if more than one
|
||||||
|
value argument is given. The count is decimal, and the following
|
||||||
|
arguments are interpreted as bytes in hexadecimal notation.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
All these examples assume the existence of the file
|
||||||
|
$HOME/.nwclient. Otherwise, the server and user would have to be
|
||||||
|
specified.
|
||||||
|
|
||||||
|
nwbpadd -o linus -t 1 -p groups_i\\'m_in os_hackers
|
||||||
|
|
||||||
|
In this example, user linus is added to the group os_hackers. Please
|
||||||
|
note that the ' has to be quoted.
|
||||||
|
|
||||||
|
nwbpadd -o linus -t 1 -p identification "Linus Torvalds"
|
||||||
|
|
||||||
|
User linus is given his real name :-).
|
||||||
|
|
||||||
|
nwbpadd -o linus -t 1 -p revision -v 04 00 00 01 0b
|
||||||
|
|
||||||
|
A new 4-byte binary value 0x0000010b (hi-lo order, no byte-swapping) is added
|
||||||
|
to the "REVISION" property of the user "linus".
|
||||||
|
|
||||||
|
.SH AUTHORS
|
||||||
|
nwbpadd was written by Volker Lendecke with the corresponding Caldera
|
||||||
|
utility in mind. See the Changes file of ncpfs for other contributors.
|
||||||
154
man/nwbpcreate.8
Normal file
154
man/nwbpcreate.8
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
.TH NWBPCREATE 8 7/9/1996 nwbpcreate nwbpcreate
|
||||||
|
.SH NAME
|
||||||
|
nwbpcreate \- Create a NetWare Bindery Propery
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nwbpcreate
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -U
|
||||||
|
.I user name
|
||||||
|
] [
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
|
|
||||||
|
.B -n
|
||||||
|
] [
|
||||||
|
.B -C
|
||||||
|
] [
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
] [
|
||||||
|
.B -t
|
||||||
|
.I type
|
||||||
|
] [
|
||||||
|
.B -p
|
||||||
|
.I property
|
||||||
|
] [
|
||||||
|
.B -s
|
||||||
|
] [
|
||||||
|
.B -r
|
||||||
|
.I read-flag
|
||||||
|
] [
|
||||||
|
.B -w
|
||||||
|
.I write-flag
|
||||||
|
]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B nwbpcreate
|
||||||
|
creates the specified NetWare Bindery Propery.
|
||||||
|
|
||||||
|
.B nwbpcreate
|
||||||
|
looks up the file
|
||||||
|
.I $HOME/.nwclient
|
||||||
|
to find a file server, a user name and possibly a password. See
|
||||||
|
nwclient(5) for more information. Please note that the access
|
||||||
|
permissions of $HOME/.nwclient MUST be 600 for security reasons.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.B -h
|
||||||
|
.RS 3
|
||||||
|
.B -h
|
||||||
|
is used to print out a short help text.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
.RS 3
|
||||||
|
.B server
|
||||||
|
is the name of the server you want to use.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -U
|
||||||
|
.I user
|
||||||
|
.RS 3
|
||||||
|
.B user
|
||||||
|
is the user name to use for login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
.RS 3
|
||||||
|
.B password
|
||||||
|
is the password to use for login. If neither
|
||||||
|
.B -n
|
||||||
|
nor
|
||||||
|
.B -P
|
||||||
|
are given, and the user has no open connection to the server, nwbpcreate
|
||||||
|
prompts for a password.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -n
|
||||||
|
.RS 3
|
||||||
|
.B -n
|
||||||
|
should be given if no password is required for the login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -C
|
||||||
|
.RS 3
|
||||||
|
By default, passwords are converted to uppercase before they are sent
|
||||||
|
to the server, because most servers require this. You can turn off
|
||||||
|
this conversion by
|
||||||
|
.B -C.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
.RS 3
|
||||||
|
The name of the object to be touched.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -t
|
||||||
|
.I object type
|
||||||
|
.RS 3
|
||||||
|
The type of the object.
|
||||||
|
.I Object type
|
||||||
|
must be specified as a decimal value. Common values are 1 for user
|
||||||
|
objects, 2 for group objects and 3 for print queues. Other values are
|
||||||
|
allowed, but are usually used for specialized applications.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -p
|
||||||
|
.I property
|
||||||
|
.RS 3
|
||||||
|
The name of the property to be created.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -s
|
||||||
|
.RS 3
|
||||||
|
By default,
|
||||||
|
.B nwbpcreate
|
||||||
|
creates properties of type ITEM. If you want to create a property of
|
||||||
|
type SET, such as groups_i\\'m_in, you must use the
|
||||||
|
.B -s
|
||||||
|
option.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -r
|
||||||
|
.I read-flag
|
||||||
|
|
||||||
|
.B -w
|
||||||
|
.I write-flag
|
||||||
|
.RS 3
|
||||||
|
|
||||||
|
Read security and write security may each have one of the following values:
|
||||||
|
|
||||||
|
ANYONE: Anyone may access the property
|
||||||
|
LOGGED: Anyone who is logged in may access the
|
||||||
|
property
|
||||||
|
OBJECT: Anyone who is logged in as the object or
|
||||||
|
SUPERVISOR equivalent may access the
|
||||||
|
property
|
||||||
|
SUPERVISOR: Anyone who is logged in as SUPERVISOR
|
||||||
|
equivalent may access the property
|
||||||
|
NETWARE: Only the Bindery may access the property
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.SH AUTHORS
|
||||||
|
nwbpcreate was written by Volker Lendecke with the corresponding
|
||||||
|
Caldera utility in mind. See the Changes file of ncpfs for other
|
||||||
|
contributors.
|
||||||
116
man/nwbprm.8
Normal file
116
man/nwbprm.8
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
.TH NWBPRM 8 7/9/1996 nwbprm nwbprm
|
||||||
|
.SH NAME
|
||||||
|
nwbprm \- Remove a NetWare Bindery Propery
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nwbprm
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -U
|
||||||
|
.I user name
|
||||||
|
] [
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
|
|
||||||
|
.B -n
|
||||||
|
] [
|
||||||
|
.B -C
|
||||||
|
] [
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
] [
|
||||||
|
.B -t
|
||||||
|
.I type
|
||||||
|
] [
|
||||||
|
.B -p
|
||||||
|
.I property
|
||||||
|
]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B nwbprm
|
||||||
|
removes the specified NetWare Bindery Propery.
|
||||||
|
|
||||||
|
.B nwbprm
|
||||||
|
looks up the file
|
||||||
|
.I $HOME/.nwclient
|
||||||
|
to find a file server, a user name and possibly a password. See
|
||||||
|
nwclient(5) for more information. Please note that the access
|
||||||
|
permissions of $HOME/.nwclient MUST be 600 for security reasons.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.B -h
|
||||||
|
.RS 3
|
||||||
|
.B -h
|
||||||
|
is used to print out a short help text.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
.RS 3
|
||||||
|
.B server
|
||||||
|
is the name of the server you want to use.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -U
|
||||||
|
.I user
|
||||||
|
.RS 3
|
||||||
|
.B user
|
||||||
|
is the user name to use for login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
.RS 3
|
||||||
|
.B password
|
||||||
|
is the password to use for login. If neither
|
||||||
|
.B -n
|
||||||
|
nor
|
||||||
|
.B -P
|
||||||
|
are given, and the user has no open connection to the server, nwbprm
|
||||||
|
prompts for a password.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -n
|
||||||
|
.RS 3
|
||||||
|
.B -n
|
||||||
|
should be given if no password is required for the login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -C
|
||||||
|
.RS 3
|
||||||
|
By default, passwords are converted to uppercase before they are sent
|
||||||
|
to the server, because most servers require this. You can turn off
|
||||||
|
this conversion by
|
||||||
|
.B -C.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
.RS 3
|
||||||
|
The name of the object to be touched.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -t
|
||||||
|
.I object type
|
||||||
|
.RS 3
|
||||||
|
The type of the object.
|
||||||
|
.I Object type
|
||||||
|
must be specified as a decimal value. Common values are 1 for user
|
||||||
|
objects, 2 for group objects and 3 for print queues. Other values are
|
||||||
|
allowed, but are usually used for specialized applications.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -p
|
||||||
|
.I property
|
||||||
|
.RS 3
|
||||||
|
The name of the property to be removed.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.SH AUTHORS
|
||||||
|
nwbprm was written by Volker Lendecke with the corresponding
|
||||||
|
Caldera utility in mind. See the Changes file of ncpfs for other
|
||||||
|
contributors.
|
||||||
128
man/nwbpvalues.1
Normal file
128
man/nwbpvalues.1
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
.TH NWBPVALUES 8 7/9/1996 nwbpvalues nwbpvalues
|
||||||
|
.SH NAME
|
||||||
|
nwbpvalues \- Print a NetWare Bindery Propery's contents
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nwbpvalues
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -U
|
||||||
|
.I user name
|
||||||
|
] [
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
|
|
||||||
|
.B -n
|
||||||
|
] [
|
||||||
|
.B -C
|
||||||
|
] [
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
] [
|
||||||
|
.B -t
|
||||||
|
.I type
|
||||||
|
] [
|
||||||
|
.B -p
|
||||||
|
.I property
|
||||||
|
] [
|
||||||
|
.B -v
|
||||||
|
]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B nwbpvalues
|
||||||
|
prints the contents of a SET property.
|
||||||
|
|
||||||
|
.B nwbpvalues
|
||||||
|
looks up the file
|
||||||
|
.I $HOME/.nwclient
|
||||||
|
to find a file server, a user name and possibly a password. See
|
||||||
|
nwclient(5) for more information. Please note that the access
|
||||||
|
permissions of $HOME/.nwclient MUST be 600 for security reasons.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.B -h
|
||||||
|
.RS 3
|
||||||
|
.B -h
|
||||||
|
is used to print out a short help text.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
.RS 3
|
||||||
|
.B server
|
||||||
|
is the name of the server you want to use.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -U
|
||||||
|
.I user
|
||||||
|
.RS 3
|
||||||
|
.B user
|
||||||
|
is the user name to use for login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
.RS 3
|
||||||
|
.B password
|
||||||
|
is the password to use for login. If neither
|
||||||
|
.B -n
|
||||||
|
nor
|
||||||
|
.B -P
|
||||||
|
are given, and the user has no open connection to the server, nwbpvalues
|
||||||
|
prompts for a password.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -n
|
||||||
|
.RS 3
|
||||||
|
.B -n
|
||||||
|
should be given if no password is required for the login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -C
|
||||||
|
.RS 3
|
||||||
|
By default, passwords are converted to uppercase before they are sent
|
||||||
|
to the server, because most servers require this. You can turn off
|
||||||
|
this conversion by
|
||||||
|
.B -C.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
.RS 3
|
||||||
|
The name of the object to be looked up.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -t
|
||||||
|
.I object type
|
||||||
|
.RS 3
|
||||||
|
The type of the object.
|
||||||
|
.I Object type
|
||||||
|
must be specified as a decimal value. Common values are 1 for user
|
||||||
|
objects, 2 for group objects and 3 for print queues. Other values are
|
||||||
|
allowed, but are usually used for specialized applications.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -p
|
||||||
|
.I property
|
||||||
|
.RS 3
|
||||||
|
The name of the property to be printed.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -v
|
||||||
|
.RS 3
|
||||||
|
By default, the object's name, its ID and its type are listed by
|
||||||
|
.B nwbols.
|
||||||
|
In the verbose mode, activated by
|
||||||
|
.B -v,
|
||||||
|
the object flags, its security byte and the properties flag is also
|
||||||
|
listed.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.SH AUTHORS
|
||||||
|
nwbpvalues was written by Volker Lendecke with the corresponding
|
||||||
|
Caldera utility in mind. See the Changes file of ncpfs for other
|
||||||
|
contributors.
|
||||||
52
man/nwfsinfo.1
Normal file
52
man/nwfsinfo.1
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
.TH NWFSINFO 1 07/22/1996 nwfsinfo nwfsinfo
|
||||||
|
.SH NAME
|
||||||
|
nwfsinfo \- Print some information about the file server
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nwfsinfo
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -t
|
||||||
|
] [
|
||||||
|
.B -i
|
||||||
|
] [
|
||||||
|
.B -d
|
||||||
|
]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B nwfsinfo
|
||||||
|
prints some of the information the NetWare servers present without
|
||||||
|
logging in. The options control what is printed. You should try the
|
||||||
|
different options to find out what is printed when.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.B -h
|
||||||
|
.RS 3
|
||||||
|
With -h nwfsinfo prints a little help text.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
.RS 3
|
||||||
|
is the name of the server you want to know something about.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -t
|
||||||
|
.RS 3
|
||||||
|
Print what the file server believes to be the current time.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -d
|
||||||
|
.RS 3
|
||||||
|
Print the so-called file server description strings.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -i
|
||||||
|
.RS 3
|
||||||
|
Print the extended file server information such as NetWare version,
|
||||||
|
maximum connections an others.
|
||||||
|
.RE
|
||||||
148
man/nwgrant.8
Normal file
148
man/nwgrant.8
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
.TH NWGRANT 8 7/9/1996 nwgrant nwgrant
|
||||||
|
.SH NAME
|
||||||
|
nwgrant \- Add Trustee Rights to a directory
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nwgrant
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -U
|
||||||
|
.I user name
|
||||||
|
] [
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
|
|
||||||
|
.B -n
|
||||||
|
] [
|
||||||
|
.B -C
|
||||||
|
] [
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
] [
|
||||||
|
.B -t
|
||||||
|
.I type
|
||||||
|
] [
|
||||||
|
.B -r
|
||||||
|
.I rights
|
||||||
|
]
|
||||||
|
.B directory
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B nwgrant
|
||||||
|
adds the specified bindery object with the corresponding trustee
|
||||||
|
rights to the directory.
|
||||||
|
|
||||||
|
.B nwgrant
|
||||||
|
looks up the file
|
||||||
|
.I $HOME/.nwclient
|
||||||
|
to find a file server, a user name and possibly a password. See
|
||||||
|
nwclient(5) for more information. Please note that the access
|
||||||
|
permissions of $HOME/.nwclient MUST be 600 for security reasons.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.B -h
|
||||||
|
.RS 3
|
||||||
|
.B -h
|
||||||
|
is used to print out a short help text.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
.RS 3
|
||||||
|
.B server
|
||||||
|
is the name of the server you want to use.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -U
|
||||||
|
.I user
|
||||||
|
.RS 3
|
||||||
|
.B user
|
||||||
|
is the user name to use for login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
.RS 3
|
||||||
|
.B password
|
||||||
|
is the password to use for login. If neither
|
||||||
|
.B -n
|
||||||
|
nor
|
||||||
|
.B -P
|
||||||
|
are given, and the user has no open connection to the server, nwgrant
|
||||||
|
prompts for a password.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -n
|
||||||
|
.RS 3
|
||||||
|
.B -n
|
||||||
|
should be given if no password is required for the login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -C
|
||||||
|
.RS 3
|
||||||
|
By default, passwords are converted to uppercase before they are sent
|
||||||
|
to the server, because most servers require this. You can turn off
|
||||||
|
this conversion by
|
||||||
|
.B -C.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
.RS 3
|
||||||
|
The name of the object to be added as trustee.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -t
|
||||||
|
.I object type
|
||||||
|
.RS 3
|
||||||
|
The type of the object.
|
||||||
|
.I Object type
|
||||||
|
must be specified as a decimal value. Common values are 1 for user
|
||||||
|
objects, 2 for group objects and 3 for print queues. Other values are
|
||||||
|
allowed, but are usually used for specialized applications.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -r
|
||||||
|
.I rights
|
||||||
|
.RS 3
|
||||||
|
You must tell
|
||||||
|
.B nwgrant
|
||||||
|
which rights it should grant to the bindery object.
|
||||||
|
The new rights for the object is specified by
|
||||||
|
.I rights,
|
||||||
|
which is the sum of the following hexadecimal individual rights values:
|
||||||
|
|
||||||
|
00 = no access
|
||||||
|
01 = read access
|
||||||
|
02 = write access
|
||||||
|
04 = open access
|
||||||
|
08 = create access
|
||||||
|
10 = delete access
|
||||||
|
20 = ownership access
|
||||||
|
40 = search access
|
||||||
|
80 = modify access
|
||||||
|
|
||||||
|
for a possible total of "ff" for all rights.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B directory
|
||||||
|
.RS 3
|
||||||
|
You must specify the directory to which to add the object as
|
||||||
|
trustee. This has to be done in fully qualified NetWare notation.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
nwgrant -o linus -t 1 -r ff 'data:home\\linus'
|
||||||
|
|
||||||
|
With this example, user linus is given all rights to his home
|
||||||
|
directory on the data volume. This example assumes the existence of
|
||||||
|
the file $HOME/.nwclient.
|
||||||
|
|
||||||
|
.SH AUTHORS
|
||||||
|
nwgrant was written by Volker Lendecke with the corresponding NetWare
|
||||||
|
utility in mind. See the Changes file of ncpfs for other contributors.
|
||||||
|
|
||||||
124
man/nwrevoke.8
Normal file
124
man/nwrevoke.8
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
.TH NWREVOKE 8 7/9/1996 nwrevoke nwrevoke
|
||||||
|
.SH NAME
|
||||||
|
nwrevoke \- Revoke a Trustee Right from a directory
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nwrevoke
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -U
|
||||||
|
.I user name
|
||||||
|
] [
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
|
|
||||||
|
.B -n
|
||||||
|
] [
|
||||||
|
.B -C
|
||||||
|
] [
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
] [
|
||||||
|
.B -t
|
||||||
|
.I type
|
||||||
|
] [
|
||||||
|
.B -r
|
||||||
|
.I rights
|
||||||
|
]
|
||||||
|
.B directory
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B nwrevoke
|
||||||
|
revokes the specified bindery object with the corresponding trustee
|
||||||
|
rights from the directory.
|
||||||
|
|
||||||
|
.B nwrevoke
|
||||||
|
looks up the file
|
||||||
|
.I $HOME/.nwclient
|
||||||
|
to find a file server, a user name and possibly a password. See
|
||||||
|
nwclient(5) for more information. Please note that the access
|
||||||
|
permissions of $HOME/.nwclient MUST be 600 for security reasons.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.B -h
|
||||||
|
.RS 3
|
||||||
|
.B -h
|
||||||
|
is used to print out a short help text.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
.RS 3
|
||||||
|
.B server
|
||||||
|
is the name of the server you want to use.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -U
|
||||||
|
.I user
|
||||||
|
.RS 3
|
||||||
|
.B user
|
||||||
|
is the user name to use for login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
.RS 3
|
||||||
|
.B password
|
||||||
|
is the password to use for login. If neither
|
||||||
|
.B -n
|
||||||
|
nor
|
||||||
|
.B -P
|
||||||
|
are given, and the user has no open connection to the server, nwrevoke
|
||||||
|
prompts for a password.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -n
|
||||||
|
.RS 3
|
||||||
|
.B -n
|
||||||
|
should be given if no password is required for the login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -C
|
||||||
|
.RS 3
|
||||||
|
By default, passwords are converted to uppercase before they are sent
|
||||||
|
to the server, because most servers require this. You can turn off
|
||||||
|
this conversion by
|
||||||
|
.B -C.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -o
|
||||||
|
.I object name
|
||||||
|
.RS 3
|
||||||
|
The name of the object to be added as trustee.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -t
|
||||||
|
.I object type
|
||||||
|
.RS 3
|
||||||
|
The type of the object.
|
||||||
|
.I Object type
|
||||||
|
must be specified as a decimal value. Common values are 1 for user
|
||||||
|
objects, 2 for group objects and 3 for print queues. Other values are
|
||||||
|
allowed, but are usually used for specialized applications.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B directory
|
||||||
|
.RS 3
|
||||||
|
You must specify the directory from which to remove the object as
|
||||||
|
trustee. This has to be done in fully qualified NetWare notation.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
nwrevoke -o linus -t 1 'src:bsd_src'
|
||||||
|
|
||||||
|
With this example, user linus is removed as trustee from the bsd_src
|
||||||
|
directory on the src volume.
|
||||||
|
|
||||||
|
.SH AUTHORS
|
||||||
|
nwrevoke was written by Volker Lendecke with the corresponding NetWare
|
||||||
|
utility in mind. See the Changes file of ncpfs for other contributors.
|
||||||
|
|
||||||
93
man/nwuserlist.1
Normal file
93
man/nwuserlist.1
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
.TH NWUSERLIST 1 7/22/1996 nwuserlist nwuserlist
|
||||||
|
.SH NAME
|
||||||
|
nwuserlist \- List Users logged in at a NetWare server
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nwuserlist
|
||||||
|
[
|
||||||
|
.B -h
|
||||||
|
] [
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
] [
|
||||||
|
.B -U
|
||||||
|
.I user name
|
||||||
|
] [
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
|
|
||||||
|
.B -n
|
||||||
|
] [
|
||||||
|
.B -C
|
||||||
|
] [
|
||||||
|
.B -a
|
||||||
|
]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B nwuserlist
|
||||||
|
lists the users logged in at a NetWare server, together with their
|
||||||
|
connection number and their login time.
|
||||||
|
|
||||||
|
.B nwuserlist
|
||||||
|
looks up the file
|
||||||
|
.I $HOME/.nwclient
|
||||||
|
to find a file server, a user name and possibly a password. See
|
||||||
|
nwclient(5) for more information. Please note that the access
|
||||||
|
permissions of $HOME/.nwclient MUST be 600 for security reasons.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.B -h
|
||||||
|
.RS 3
|
||||||
|
.B -h
|
||||||
|
is used to print out a short help text.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -S
|
||||||
|
.I server
|
||||||
|
.RS 3
|
||||||
|
.B server
|
||||||
|
is the name of the server you want to use.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -U
|
||||||
|
.I user
|
||||||
|
.RS 3
|
||||||
|
.B user
|
||||||
|
is the user name to use for login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -P
|
||||||
|
.I password
|
||||||
|
.RS 3
|
||||||
|
.B password
|
||||||
|
is the password to use for login. If neither
|
||||||
|
.B -n
|
||||||
|
nor
|
||||||
|
.B -P
|
||||||
|
are given, and the user has no open connection to the server, nwuserlist
|
||||||
|
prompts for a password.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -n
|
||||||
|
.RS 3
|
||||||
|
.B -n
|
||||||
|
should be given if no password is required for the login.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -C
|
||||||
|
.RS 3
|
||||||
|
By default, passwords are converted to uppercase before they are sent
|
||||||
|
to the server, because most servers require this. You can turn off
|
||||||
|
this conversion by
|
||||||
|
.B -C.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.B -a
|
||||||
|
.RS 3
|
||||||
|
With option -a the IPX address of the station the user is logged in
|
||||||
|
from is printed as well.
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.SH AUTHORS
|
||||||
|
nwuserlist was written by Volker Lendecke. See the Changes file of ncpfs
|
||||||
|
for other contributors.
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
Begin3
|
Begin3
|
||||||
Title: ncpfs
|
Title: ncpfs
|
||||||
Version: 2.0.0
|
Version: 2.0.3
|
||||||
Entered-date: 22. June 1996
|
Entered-date: 22. July 1996
|
||||||
Description: With ncpfs you can mount volumes of your netware
|
Description: With ncpfs you can mount volumes of your netware
|
||||||
server under Linux. You can also print to netware
|
server under Linux. You can also print to netware
|
||||||
print queues and spool netware print queues to the
|
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)
|
Author: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke)
|
||||||
Maintained-by: 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
|
Primary-site: ftp.gwdg.de:/pub/linux/misc/ncpfs
|
||||||
Alternate-site: sunsite.unc.edu:/pub/system/Filesystems/ncpfs
|
Alternate-site: sunsite.unc.edu:/pub/Linux/system/Filesystems/ncpfs
|
||||||
~120k ncpfs-2.0.0.tgz
|
~128k ncpfs-2.0.3.tgz
|
||||||
~ 1k ncpfs-2.0.0.lsm
|
~ 1k ncpfs-2.0.3.lsm
|
||||||
Copying-policy: GPL
|
Copying-policy: GPL
|
||||||
End
|
End
|
||||||
@@ -3,16 +3,34 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
USERUTILS = slist pqlist nwfsinfo pserver nprint nsend ncopy npasswd
|
USERUTILS = slist pqlist nwfsinfo pserver nprint nsend ncopy npasswd
|
||||||
|
USERUTILS += nwbols nwbocreate nwborm nwboprops
|
||||||
|
USERUTILS += nwbpcreate nwbprm nwbpvalues nwbpadd
|
||||||
|
USERUTILS += nwgrant nwrevoke nwuserlist
|
||||||
UIDUTILS = ncpmount ncpumount
|
UIDUTILS = ncpmount ncpumount
|
||||||
SBINUTILS = nwmsg
|
SBINUTILS = nwmsg
|
||||||
|
|
||||||
UTIL_EXECS = $(USERUTILS) $(UIDUTILS) $(SBINUTILS)
|
UTIL_EXECS = $(USERUTILS) $(UIDUTILS) $(SBINUTILS)
|
||||||
UTILS = $(addprefix $(INTERM_BINDIR)/,$(UTIL_EXECS))
|
UTILS = $(addprefix $(INTERM_BINDIR)/,$(UTIL_EXECS))
|
||||||
|
|
||||||
#CFLAGS = -Wall $(INCLUDES) $(KERNELD) -g -DNCPFS_VERSION=\"$(VERSION)\"
|
CFLAGS = -Wall $(INCLUDES) $(KERNELD) -DNCPFS_VERSION=\"$(VERSION)\"
|
||||||
CFLAGS = -Wall $(INCLUDES) $(KERNELD) -O2 -DNCPFS_VERSION=\"$(VERSION)\"
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
|
|
||||||
|
#CFLAGS += -g
|
||||||
|
CFLAGS += -O2
|
||||||
|
|
||||||
|
ifeq ($(HAVE_ELF),yes)
|
||||||
|
PIC_FLAG = -fPIC
|
||||||
|
NCP_LIB = libncp.so.1.0
|
||||||
|
LIB_LINK_COMMAND = gcc -shared -Wl,-soname,libncp.so.1 -o $(NCP_LIB)
|
||||||
|
INSTALL_LIB = install $(NCP_LIB) -m 755 /lib; \
|
||||||
|
ln -sf $(NCP_LIB) /lib/libncp.so.1; \
|
||||||
|
ldconfig
|
||||||
|
export PIC_FLAG
|
||||||
|
else
|
||||||
|
NCP_LIB = libncp.a
|
||||||
|
LIB_LINK_COMMAND = ar r libncp.a
|
||||||
|
endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
make -C ..
|
make -C ..
|
||||||
|
|
||||||
@@ -25,21 +43,26 @@ install: all
|
|||||||
do install $(INTERM_BINDIR)/$$i -m 4755 $(BINDIR); done
|
do install $(INTERM_BINDIR)/$$i -m 4755 $(BINDIR); done
|
||||||
for i in $(SBINUTILS); \
|
for i in $(SBINUTILS); \
|
||||||
do install $(INTERM_BINDIR)/$$i -m 755 $(SBINDIR); done
|
do install $(INTERM_BINDIR)/$$i -m 755 $(SBINDIR); done
|
||||||
|
$(INSTALL_LIB)
|
||||||
|
|
||||||
$(UTILS): $(addsuffix .o,$(UTIL_EXECS)) libncp.a
|
$(UTILS): $(addsuffix .o,$(UTIL_EXECS)) $(NCP_LIB)
|
||||||
$(CC) -o $@ $(addsuffix .o,$(notdir $@)) -L. -lncp
|
$(CC) -o $@ $(addsuffix .o,$(notdir $@)) -L. -lncp
|
||||||
|
|
||||||
ncplib.o: ncplib.c ncplib.h ncplib_err.h
|
ncplib.o: ncplib.c ncplib.h ncplib_err.h
|
||||||
$(CC) $(CFLAGS) -finline-functions -c ncplib.c
|
$(CC) $(CFLAGS) $(PIC_FLAG) -finline-functions -c ncplib.c
|
||||||
|
|
||||||
COM_ERR_CFILES = com_err/com_err.c com_err/error_message.c com_err/et_name.c \
|
COM_ERR_CFILES = com_err/com_err.c com_err/error_message.c com_err/et_name.c \
|
||||||
com_err/init_et.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
|
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/com_err.o com_err/error_message.o com_err/et_name.o \
|
||||||
com_err/init_et.o
|
com_err/init_et.o
|
||||||
|
ln -sf libncp.so.1.0 libncp.so.1
|
||||||
|
|
||||||
|
ncplib_err.o: ncplib_err.h ncplib_err.c
|
||||||
|
$(CC) $(CFLAGS) $(PIC_FLAG) -c ncplib_err.c
|
||||||
|
|
||||||
ncplib_err.h: ncplib_err.et
|
ncplib_err.h: ncplib_err.et
|
||||||
com_err/compile_et ncplib_err
|
com_err/compile_et ncplib_err
|
||||||
@@ -50,7 +73,7 @@ ncplib_err.c: ncplib_err.et
|
|||||||
test: test.o ncplib.o
|
test: test.o ncplib.o
|
||||||
$(CC) -o test test.o ncplib.o
|
$(CC) -o test test.o ncplib.o
|
||||||
|
|
||||||
ncptest: ncptest.o libncp.a
|
ncptest: ncptest.o $(NCP_LIB)
|
||||||
$(CC) -o ncptest ncptest.o -L. -lncp
|
$(CC) -o ncptest ncptest.o -L. -lncp
|
||||||
|
|
||||||
dep: ncplib_err.h
|
dep: ncplib_err.h
|
||||||
@@ -60,6 +83,7 @@ dep: ncplib_err.h
|
|||||||
clean:
|
clean:
|
||||||
make -C com_err 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] libncp.a
|
||||||
|
rm -f libncp.so.*
|
||||||
|
|
||||||
mrproper: clean
|
mrproper: clean
|
||||||
make -C com_err mrproper
|
make -C com_err mrproper
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
OBJECTS = com_err.o error_message.o et_name.o init_et.o
|
OBJECTS = com_err.o error_message.o et_name.o init_et.o
|
||||||
CFLAGS = -Wall -O2
|
CFLAGS = -Wall -O2 $(PIC_FLAG)
|
||||||
|
|
||||||
all: $(OBJECTS)
|
all: $(OBJECTS)
|
||||||
|
|
||||||
|
|||||||
297
util/ncplib.c
297
util/ncplib.c
@@ -531,11 +531,13 @@ do_ncp_call(struct ncp_conn *conn, int request_size)
|
|||||||
int retries = 20;
|
int retries = 20;
|
||||||
int len;
|
int len;
|
||||||
long err;
|
long err;
|
||||||
struct ncp_reply_header *r =
|
|
||||||
(struct ncp_reply_header *)&(conn->packet);
|
|
||||||
|
|
||||||
while (retries > 0)
|
while (retries > 0)
|
||||||
{
|
{
|
||||||
|
struct ncp_reply_header reply;
|
||||||
|
struct sockaddr_ipx sender;
|
||||||
|
int sizeofaddr = sizeof(sender);
|
||||||
|
|
||||||
retries -= 1;
|
retries -= 1;
|
||||||
|
|
||||||
result = sendto(conn->ncp_sock, conn->packet,
|
result = sendto(conn->ncp_sock, conn->packet,
|
||||||
@@ -549,30 +551,48 @@ do_ncp_call(struct ncp_conn *conn, int request_size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
re_select:
|
re_select:
|
||||||
len = ipx_recv(conn->ncp_sock,
|
len = ipx_recvfrom(conn->ncp_sock,
|
||||||
conn->packet, NCP_PACKET_SIZE, 0, 3, &err);
|
(char *)&reply, sizeof(reply),
|
||||||
|
MSG_PEEK, &sender, &sizeofaddr, 3, &err);
|
||||||
|
|
||||||
if ( (len == sizeof(*r))
|
if ((len < 0) && (err == ETIMEDOUT))
|
||||||
&& (r->type == NCP_POSITIVE_ACK))
|
|
||||||
{
|
{
|
||||||
goto re_select;
|
continue;
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
{
|
{
|
||||||
return err;
|
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
|
static int
|
||||||
@@ -590,8 +610,9 @@ ncp_mount_request(struct ncp_conn *conn, int function)
|
|||||||
|
|
||||||
if (conn->has_subfunction != 0)
|
if (conn->has_subfunction != 0)
|
||||||
{
|
{
|
||||||
*(__u16 *)&(h->data[0]) = conn->current_size
|
*(__u16 *)&(h->data[0])
|
||||||
- sizeof(struct ncp_request_header)- 2;
|
= htons(conn->current_size
|
||||||
|
- sizeof(struct ncp_request_header) - 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
request.function = function;
|
request.function = function;
|
||||||
@@ -628,8 +649,9 @@ ncp_temp_request(struct ncp_conn *conn, int function)
|
|||||||
|
|
||||||
if (conn->has_subfunction != 0)
|
if (conn->has_subfunction != 0)
|
||||||
{
|
{
|
||||||
*(__u16 *)&(h->data[0]) = conn->current_size
|
*(__u16 *)&(h->data[0])
|
||||||
- sizeof(struct ncp_request_header) - 2;
|
= htons(conn->current_size
|
||||||
|
- sizeof(struct ncp_request_header) - 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
h->type = NCP_REQUEST;
|
h->type = NCP_REQUEST;
|
||||||
@@ -1127,6 +1149,11 @@ long
|
|||||||
ncp_close(struct ncp_conn *conn)
|
ncp_close(struct ncp_conn *conn)
|
||||||
{
|
{
|
||||||
long result;
|
long result;
|
||||||
|
if (conn == NULL)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if ((result = ncp_do_close(conn)) != 0)
|
if ((result = ncp_do_close(conn)) != 0)
|
||||||
{
|
{
|
||||||
return result;
|
return result;
|
||||||
@@ -1270,7 +1297,7 @@ ncp_get_nwc_ent(FILE *nwc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
FILE *
|
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 path[MAXPATHLEN];
|
||||||
char *home = NULL;
|
char *home = NULL;
|
||||||
@@ -1298,7 +1325,7 @@ ncp_fopen_nwc(const char *user, const char *mode)
|
|||||||
if ( (home == NULL)
|
if ( (home == NULL)
|
||||||
|| (strlen(home) + sizeof(NWCLIENT) + 2 > sizeof(path)))
|
|| (strlen(home) + sizeof(NWCLIENT) + 2 > sizeof(path)))
|
||||||
{
|
{
|
||||||
errno = ENAMETOOLONG;
|
*err = ENAMETOOLONG;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1308,12 +1335,13 @@ ncp_fopen_nwc(const char *user, const char *mode)
|
|||||||
|
|
||||||
if (stat(path, &st) != 0)
|
if (stat(path, &st) != 0)
|
||||||
{
|
{
|
||||||
|
*err = errno;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((st.st_mode & (S_IRWXO | S_IRWXG)) != 0)
|
if ((st.st_mode & (S_IRWXO | S_IRWXG)) != 0)
|
||||||
{
|
{
|
||||||
errno = EINVAL;
|
*err = NCPL_ET_INVALID_MODE;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1349,11 +1377,9 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nwc = ncp_fopen_nwc(NULL, NULL);
|
if ((nwc = ncp_fopen_nwc(NULL, NULL, err)) == NULL)
|
||||||
|
|
||||||
if (nwc == NULL)
|
|
||||||
{
|
{
|
||||||
*err = NCPL_ET_NO_SPEC;
|
*err = NCPL_ET_NO_SERVER;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1369,6 +1395,15 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
|
|||||||
strcpy(spec.user, nwc_ent->user);
|
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 (user != NULL)
|
||||||
{
|
{
|
||||||
if (strlen(user) >= sizeof(spec.user))
|
if (strlen(user) >= sizeof(spec.user))
|
||||||
@@ -1379,7 +1414,6 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
|
|||||||
strcpy(spec.user, user);
|
strcpy(spec.user, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
str_upper(spec.server);
|
|
||||||
str_upper(spec.user);
|
str_upper(spec.user);
|
||||||
spec.login_type = NCP_BINDERY_USER;
|
spec.login_type = NCP_BINDERY_USER;
|
||||||
|
|
||||||
@@ -1400,7 +1434,7 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
|
|||||||
}
|
}
|
||||||
else
|
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)
|
while ((nwc_ent = ncp_get_nwc_ent(nwc)) != NULL)
|
||||||
{
|
{
|
||||||
@@ -1420,15 +1454,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)
|
if (strlen(spec.user) == 0)
|
||||||
{
|
{
|
||||||
return &spec;
|
*err = NCPL_ET_NO_USER;
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((strlen(spec.password) == 0) && (password == NULL))
|
if ((strlen(spec.password) == 0) && (password == NULL))
|
||||||
@@ -1795,6 +1824,31 @@ ncp_get_file_server_time(struct ncp_conn *conn, time_t *target)
|
|||||||
return 0;
|
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
|
long
|
||||||
ncp_get_connlist(struct ncp_conn *conn,
|
ncp_get_connlist(struct ncp_conn *conn,
|
||||||
__u16 object_type, const char *object_name,
|
__u16 object_type, const char *object_name,
|
||||||
@@ -1818,6 +1872,57 @@ ncp_get_connlist(struct ncp_conn *conn,
|
|||||||
return 0;
|
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
|
long
|
||||||
ncp_send_broadcast(struct ncp_conn *conn,
|
ncp_send_broadcast(struct ncp_conn *conn,
|
||||||
__u8 no_conn, const __u8 *connections,
|
__u8 no_conn, const __u8 *connections,
|
||||||
@@ -2174,6 +2279,21 @@ ncp_login_encrypted(struct ncp_conn *conn,
|
|||||||
return result;
|
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
|
long
|
||||||
ncp_change_login_passwd(struct ncp_conn *conn,
|
ncp_change_login_passwd(struct ncp_conn *conn,
|
||||||
const struct ncp_bindery_object *object,
|
const struct ncp_bindery_object *object,
|
||||||
@@ -2230,7 +2350,8 @@ ncp_login_object(struct ncp_conn *conn,
|
|||||||
struct ncp_bindery_object user;
|
struct ncp_bindery_object user;
|
||||||
|
|
||||||
if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) {
|
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,
|
if ((result = ncp_get_bindery_object_id(conn, login_type,
|
||||||
@@ -2593,7 +2714,42 @@ ncp_delete_directory(struct ncp_conn *conn,
|
|||||||
ncp_unlock_conn(conn);
|
ncp_unlock_conn(conn);
|
||||||
return result;
|
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
|
long
|
||||||
ncp_rename_directory(struct ncp_conn *conn,
|
ncp_rename_directory(struct ncp_conn *conn,
|
||||||
int dir_handle,
|
int dir_handle,
|
||||||
@@ -2615,7 +2771,7 @@ static void
|
|||||||
ncp_add_handle_path(struct ncp_conn *conn,
|
ncp_add_handle_path(struct ncp_conn *conn,
|
||||||
__u8 vol_num,
|
__u8 vol_num,
|
||||||
__u32 dir_base, int have_dir_base,
|
__u32 dir_base, int have_dir_base,
|
||||||
char *path)
|
const char *path)
|
||||||
{
|
{
|
||||||
ncp_add_byte(conn, vol_num);
|
ncp_add_byte(conn, vol_num);
|
||||||
ncp_add_dword(conn, dir_base);
|
ncp_add_dword(conn, dir_base);
|
||||||
@@ -2648,6 +2804,33 @@ ncp_extract_file_info(void *structure, struct nw_info_struct *target)
|
|||||||
return;
|
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
|
long
|
||||||
ncp_do_lookup(struct ncp_conn *conn,
|
ncp_do_lookup(struct ncp_conn *conn,
|
||||||
struct nw_info_struct *dir,
|
struct nw_info_struct *dir,
|
||||||
@@ -2836,7 +3019,7 @@ ncp_initialize_search(struct ncp_conn *conn,
|
|||||||
return result;
|
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;
|
target->namespace = namespace;
|
||||||
|
|
||||||
ncp_unlock_conn(conn);
|
ncp_unlock_conn(conn);
|
||||||
@@ -3239,3 +3422,33 @@ ncp_alloc_short_dir_handle(struct ncp_conn *conn,
|
|||||||
ncp_unlock_conn(conn);
|
ncp_unlock_conn(conn);
|
||||||
return result;
|
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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -155,11 +155,48 @@ ncp_get_file_server_description_strings(struct ncp_conn *conn,
|
|||||||
long
|
long
|
||||||
ncp_get_file_server_time(struct ncp_conn *conn, time_t *target);
|
ncp_get_file_server_time(struct ncp_conn *conn, time_t *target);
|
||||||
|
|
||||||
|
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
|
long
|
||||||
ncp_get_connlist(struct ncp_conn *conn,
|
ncp_get_connlist(struct ncp_conn *conn,
|
||||||
__u16 object_type, const char *object_name,
|
__u16 object_type, const char *object_name,
|
||||||
int *returned_no, __u8 conn_numbers[256]);
|
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
|
long
|
||||||
ncp_send_broadcast(struct ncp_conn *conn,
|
ncp_send_broadcast(struct ncp_conn *conn,
|
||||||
__u8 no_conn, const __u8 *connections,
|
__u8 no_conn, const __u8 *connections,
|
||||||
@@ -265,6 +302,11 @@ ncp_login_encrypted(struct ncp_conn *conn,
|
|||||||
const unsigned char *key,
|
const unsigned char *key,
|
||||||
const unsigned char *passwd);
|
const unsigned char *passwd);
|
||||||
|
|
||||||
|
long
|
||||||
|
ncp_login_unencrypted(struct ncp_conn *conn,
|
||||||
|
__u16 object_type, const char *object_name,
|
||||||
|
const unsigned char *passwd);
|
||||||
|
|
||||||
long
|
long
|
||||||
ncp_change_login_passwd(struct ncp_conn *conn,
|
ncp_change_login_passwd(struct ncp_conn *conn,
|
||||||
const struct ncp_bindery_object *object,
|
const struct ncp_bindery_object *object,
|
||||||
@@ -347,6 +389,15 @@ ncp_rename_directory(struct ncp_conn *conn,
|
|||||||
int dir_handle,
|
int dir_handle,
|
||||||
const char *old_path, const char *new_path);
|
const char *old_path, const char *new_path);
|
||||||
|
|
||||||
|
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
|
long
|
||||||
ncp_read(struct ncp_conn *conn, const char *file_id,
|
ncp_read(struct ncp_conn *conn, const char *file_id,
|
||||||
off_t offset, size_t count, char *target);
|
off_t offset, size_t count, char *target);
|
||||||
@@ -364,6 +415,14 @@ ncp_copy_file(struct ncp_conn *conn,
|
|||||||
__u32 count,
|
__u32 count,
|
||||||
__u32 *copied_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);
|
||||||
|
|
||||||
|
|
||||||
long
|
long
|
||||||
ncp_do_lookup(struct ncp_conn *conn,
|
ncp_do_lookup(struct ncp_conn *conn,
|
||||||
struct nw_info_struct *dir,
|
struct nw_info_struct *dir,
|
||||||
@@ -451,4 +510,22 @@ ncp_alloc_short_dir_handle(struct ncp_conn *conn,
|
|||||||
__u16 alloc_mode,
|
__u16 alloc_mode,
|
||||||
__u8 *target);
|
__u8 *target);
|
||||||
|
|
||||||
|
long
|
||||||
|
ncp_get_effective_dir_rights(struct ncp_conn *conn,
|
||||||
|
struct nw_info_struct *file,
|
||||||
|
__u16 *target);
|
||||||
|
|
||||||
|
struct ncp_trustee_struct
|
||||||
|
{
|
||||||
|
__u32 object_id;
|
||||||
|
__u16 rights;
|
||||||
|
};
|
||||||
|
|
||||||
|
long
|
||||||
|
ncp_add_trustee_set(struct ncp_conn *conn,
|
||||||
|
__u8 volume_number, __u32 dir_entry,
|
||||||
|
__u16 rights_mask,
|
||||||
|
int object_count, struct ncp_trustee_struct *rights);
|
||||||
|
|
||||||
|
|
||||||
#endif /* _NCPLIB_H */
|
#endif /* _NCPLIB_H */
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ error_table NCPL
|
|||||||
ec NCPL_ET_NO_SERVER,
|
ec NCPL_ET_NO_SERVER,
|
||||||
"No server found"
|
"No server found"
|
||||||
|
|
||||||
|
ec NCPL_ET_NO_USER,
|
||||||
|
"No username found"
|
||||||
|
|
||||||
ec NCPL_ET_HOST_UNKNOWN,
|
ec NCPL_ET_HOST_UNKNOWN,
|
||||||
"Server Unknown"
|
"Server Unknown"
|
||||||
|
|
||||||
@@ -19,7 +22,7 @@ ec NCPL_ET_NO_SPEC,
|
|||||||
"Could not find valid connection spec"
|
"Could not find valid connection spec"
|
||||||
|
|
||||||
ec NCPL_ET_INVALID_MODE,
|
ec NCPL_ET_INVALID_MODE,
|
||||||
"$HOME/.nwclient has invalid mode"
|
"$HOME/.nwclient has invalid mode, must be 600"
|
||||||
|
|
||||||
ec NCPL_ET_LOGIN_DENIED,
|
ec NCPL_ET_LOGIN_DENIED,
|
||||||
"Login denied"
|
"Login denied"
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
upcase_password = 1;
|
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)
|
!= EOF)
|
||||||
{
|
{
|
||||||
switch (opt)
|
switch (opt)
|
||||||
@@ -310,6 +310,7 @@ main(int argc, char *argv[])
|
|||||||
data.retry_count = atoi(optarg);
|
data.retry_count = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
|
case '?':
|
||||||
help();
|
help();
|
||||||
exit(1);
|
exit(1);
|
||||||
case 'v':
|
case 'v':
|
||||||
|
|||||||
@@ -131,6 +131,58 @@ test_change(struct ncp_conn *conn)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
test_readdir(struct ncp_conn *conn)
|
||||||
|
{
|
||||||
|
struct nw_info_struct sys;
|
||||||
|
struct nw_info_struct blub;
|
||||||
|
struct ncp_search_seq seq;
|
||||||
|
struct nw_info_struct entry;
|
||||||
|
|
||||||
|
if (ncp_do_lookup(conn, NULL, "SYS", &sys) != 0)
|
||||||
|
{
|
||||||
|
printf("lookup error\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ncp_do_lookup(conn, &sys, "BLUB", &blub) != 0)
|
||||||
|
{
|
||||||
|
printf("lookup blub error\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_initialize_search(conn, &sys, 0, &seq) != 0)
|
||||||
|
{
|
||||||
|
printf("init error\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (ncp_search_for_file_or_subdir(conn, &seq, &entry) == 0)
|
||||||
|
{
|
||||||
|
struct nw_info_struct nfs;
|
||||||
|
printf("found: %s\n", entry.entryName);
|
||||||
|
if (ncp_obtain_file_or_subdir_info(conn, NW_NS_DOS, NW_NS_NFS,
|
||||||
|
0x8006, RIM_ALL,
|
||||||
|
entry.volNumber,
|
||||||
|
entry.DosDirNum,
|
||||||
|
NULL,
|
||||||
|
&nfs) == 0)
|
||||||
|
{
|
||||||
|
printf("nfs name: %s\n", nfs.entryName);
|
||||||
|
}
|
||||||
|
if (ncp_obtain_file_or_subdir_info(conn, NW_NS_DOS, NW_NS_OS2,
|
||||||
|
0x8006, RIM_ALL,
|
||||||
|
entry.volNumber,
|
||||||
|
entry.DosDirNum,
|
||||||
|
NULL,
|
||||||
|
&nfs) == 0)
|
||||||
|
{
|
||||||
|
printf("os2 name: %s\n", nfs.entryName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@@ -143,7 +195,7 @@ main(int argc, char *argv[])
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
test_change(conn);
|
test_readdir(conn);
|
||||||
ncp_close(conn);
|
ncp_close(conn);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
progname = argv[0];
|
progname = argv[0];
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "hS:U:t:")) != EOF)
|
while ((opt = getopt(argc, argv, "h?S:U:t:")) != EOF)
|
||||||
{
|
{
|
||||||
switch(opt) {
|
switch(opt) {
|
||||||
case 'S':
|
case 'S':
|
||||||
@@ -66,6 +66,7 @@ main(int argc, char *argv[])
|
|||||||
object_type = atoi(optarg);
|
object_type = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
|
case '?':
|
||||||
help();
|
help();
|
||||||
exit(1);
|
exit(1);
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
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);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,10 +78,11 @@ main(int argc, char *argv[])
|
|||||||
pj.Rows = htons(80);
|
pj.Rows = htons(80);
|
||||||
strcpy(pj.FnameHeader, "stdin");
|
strcpy(pj.FnameHeader, "stdin");
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "hq:d:p:b:f:l:r:c:t:F:TN"))!=EOF)
|
while ((opt = getopt(argc, argv, "h?q:d:p:b:f:l:r:c:t:F:TN"))!=EOF)
|
||||||
{
|
{
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'h':
|
case 'h':
|
||||||
|
case '?':
|
||||||
help();
|
help();
|
||||||
ncp_close(conn);
|
ncp_close(conn);
|
||||||
exit(1);
|
exit(1);
|
||||||
@@ -306,8 +307,6 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
if (ncp_close_file_and_start_job(conn, q.object_id, &j) != 0) {
|
if (ncp_close_file_and_start_job(conn, q.object_id, &j) != 0) {
|
||||||
printf("close error\n");
|
printf("close error\n");
|
||||||
ncp_close(conn);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ncp_close(conn);
|
ncp_close(conn);
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
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);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
161
util/nwbocreate.c
Normal file
161
util/nwbocreate.c
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
/*
|
||||||
|
* nwbocreate.c
|
||||||
|
*
|
||||||
|
* Create a bindery object on a NetWare server
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ncplib.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
help(void)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("usage: %s [options]\n", progname);
|
||||||
|
printf("\n"
|
||||||
|
"-h Print this help text\n"
|
||||||
|
"-S server Server name to be used\n"
|
||||||
|
"-U username Username sent to server\n"
|
||||||
|
"-P password Use this password\n"
|
||||||
|
"-n Do not use any password\n"
|
||||||
|
"-C Don't convert password to uppercase\n"
|
||||||
|
"\n"
|
||||||
|
"-o object_name Name of created object\n"
|
||||||
|
"-t type Object type (decimal value)\n"
|
||||||
|
"-r read-flag Read security\n"
|
||||||
|
"-w write-flag Write security\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
parse_security(const char *security)
|
||||||
|
{
|
||||||
|
if (strcasecmp(security, "anyone") == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (strcasecmp(security, "logged") == 0)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (strcasecmp(security, "object") == 0)
|
||||||
|
{
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
if (strcasecmp(security, "supervisor") == 0)
|
||||||
|
{
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
if (strcasecmp(security, "netware") == 0)
|
||||||
|
{
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct ncp_conn *conn;
|
||||||
|
char *object_name = NULL;
|
||||||
|
int object_type = -1;
|
||||||
|
long err;
|
||||||
|
|
||||||
|
int read_sec = 1; /* logged read */
|
||||||
|
int write_sec = 3; /* supervisor write */
|
||||||
|
int result = 1;
|
||||||
|
|
||||||
|
int opt;
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
|
||||||
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o:t:r:w:")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt) {
|
||||||
|
case 'o':
|
||||||
|
object_name = optarg;
|
||||||
|
str_upper(object_name);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
object_type = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
read_sec = parse_security(optarg);
|
||||||
|
if (read_sec < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"%s: Wrong read security\n"
|
||||||
|
"Must be one of anyone, logged, "
|
||||||
|
"object, supervisor or netware\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'w':
|
||||||
|
write_sec = parse_security(optarg);
|
||||||
|
if (write_sec < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"%s: Wrong write security\n"
|
||||||
|
"Must be one of anyone, logged, "
|
||||||
|
"object, supervisor or netware\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help();
|
||||||
|
goto finished;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_type < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object type\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_name == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object name\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_create_bindery_object(conn, object_type, object_name,
|
||||||
|
(write_sec << 4) + read_sec, 0) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Could not create the object\n", argv[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
finished:
|
||||||
|
ncp_close(conn);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
125
util/nwbols.c
Normal file
125
util/nwbols.c
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
/*
|
||||||
|
* nwlsobj.c
|
||||||
|
*
|
||||||
|
* List bindery objects
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "ncplib.h"
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [options] pattern\n", progname);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
help(void)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("usage: %s [options]\n", progname);
|
||||||
|
printf("\n"
|
||||||
|
"-h Print this help text\n"
|
||||||
|
"-S server Server name to be used\n"
|
||||||
|
"-U username Username sent to server\n"
|
||||||
|
"-P password Use this password\n"
|
||||||
|
"-n Do not use any password\n"
|
||||||
|
"-C Don't convert password to uppercase\n"
|
||||||
|
"\n"
|
||||||
|
"-t type Object type to be listed (decimal)\n"
|
||||||
|
"-v Verbose listing\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
struct ncp_conn *conn;
|
||||||
|
struct ncp_bindery_object o;
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
|
char default_pattern[] = "*";
|
||||||
|
char *pattern = default_pattern;
|
||||||
|
char *p;
|
||||||
|
long err;
|
||||||
|
int opt;
|
||||||
|
int verbose = 0;
|
||||||
|
__u16 type = 0xffff;
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
|
||||||
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "when initializing");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?vt:")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt) {
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help();
|
||||||
|
exit(1);
|
||||||
|
case 't':
|
||||||
|
type = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
verbose = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind < argc-1)
|
||||||
|
{
|
||||||
|
usage();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind == argc-1)
|
||||||
|
{
|
||||||
|
pattern = argv[optind];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (p = pattern; *p != '\0'; p++)
|
||||||
|
{
|
||||||
|
*p = toupper(*p);
|
||||||
|
}
|
||||||
|
|
||||||
|
o.object_id = 0xffffffff;
|
||||||
|
|
||||||
|
while (ncp_scan_bindery_object(conn, o.object_id,
|
||||||
|
type, pattern, &o) == 0)
|
||||||
|
{
|
||||||
|
found = 1;
|
||||||
|
if (verbose != 0)
|
||||||
|
{
|
||||||
|
printf("%s %08X %04X %d %02X %d\n",
|
||||||
|
o.object_name, (unsigned int)o.object_id,
|
||||||
|
(unsigned int)o.object_type,
|
||||||
|
o.object_flags, o.object_security,
|
||||||
|
o.object_has_prop);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("%s %08X %04X\n",
|
||||||
|
o.object_name, (unsigned int)o.object_id,
|
||||||
|
(unsigned int)o.object_type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ncp_close(conn);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
121
util/nwboprops.c
Normal file
121
util/nwboprops.c
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
/*
|
||||||
|
* nwboprops.c
|
||||||
|
*
|
||||||
|
* List properties of a bindery object
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ncplib.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
help(void)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("usage: %s [options]\n", progname);
|
||||||
|
printf("\n"
|
||||||
|
"-h Print this help text\n"
|
||||||
|
"-S server Server name to be used\n"
|
||||||
|
"-U username Username sent to server\n"
|
||||||
|
"-P password Use this password\n"
|
||||||
|
"-n Do not use any password\n"
|
||||||
|
"-C Don't convert password to uppercase\n"
|
||||||
|
"\n"
|
||||||
|
"-o object_name Name of object inspected\n"
|
||||||
|
"-t type Object type (decimal value)\n"
|
||||||
|
"-v Verbose listing\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct ncp_conn *conn;
|
||||||
|
char *object_name = NULL;
|
||||||
|
int object_type = -1;
|
||||||
|
long err;
|
||||||
|
|
||||||
|
struct ncp_property_info info;
|
||||||
|
|
||||||
|
int result = 1;
|
||||||
|
int verbose = 0;
|
||||||
|
int opt;
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
|
||||||
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o:t:v")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt) {
|
||||||
|
case 'o':
|
||||||
|
object_name = optarg;
|
||||||
|
str_upper(object_name);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
object_type = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
verbose = 1;
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help();
|
||||||
|
goto finished;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_type < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object type\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_name == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object name\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
info.search_instance = 0xffffffff;
|
||||||
|
|
||||||
|
while (ncp_scan_property(conn, object_type, object_name,
|
||||||
|
info.search_instance, "*", &info) == 0)
|
||||||
|
{
|
||||||
|
if (verbose != 0)
|
||||||
|
{
|
||||||
|
printf("%s %d %02x %d\n",
|
||||||
|
info.property_name, info.property_flags,
|
||||||
|
info.property_security,
|
||||||
|
info.value_available_flag);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("%s\n", info.property_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
finished:
|
||||||
|
ncp_close(conn);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
106
util/nwborm.c
Normal file
106
util/nwborm.c
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* nwborm.c
|
||||||
|
*
|
||||||
|
* Destroy a bindery object on a NetWare server
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ncplib.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
help(void)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("usage: %s [options]\n", progname);
|
||||||
|
printf("\n"
|
||||||
|
"-h Print this help text\n"
|
||||||
|
"-S server Server name to be used\n"
|
||||||
|
"-U username Username sent to server\n"
|
||||||
|
"-P password Use this password\n"
|
||||||
|
"-n Do not use any password\n"
|
||||||
|
"-C Don't convert password to uppercase\n"
|
||||||
|
"\n"
|
||||||
|
"-o object_name Name of object to be removed\n"
|
||||||
|
"-t type Object type (decimal value)\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct ncp_conn *conn;
|
||||||
|
char *object_name = NULL;
|
||||||
|
int object_type = -1;
|
||||||
|
long err;
|
||||||
|
|
||||||
|
int result = 1;
|
||||||
|
|
||||||
|
int opt;
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
|
||||||
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o:t:")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt) {
|
||||||
|
case 'o':
|
||||||
|
object_name = optarg;
|
||||||
|
str_upper(object_name);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
object_type = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help();
|
||||||
|
goto finished;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_type < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object type\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_name == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object name\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_delete_bindery_object(conn, object_type, object_name) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Could not delete the object\n", argv[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
finished:
|
||||||
|
ncp_close(conn);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
247
util/nwbpadd.c
Normal file
247
util/nwbpadd.c
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
/*
|
||||||
|
* nwbpadd.c
|
||||||
|
*
|
||||||
|
* Set the contents of a SET property of a bindery object on a NetWare server
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ncplib.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
help(void)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("usage: %s [options] [values]\n", progname);
|
||||||
|
printf("\n"
|
||||||
|
"-h Print this help text\n"
|
||||||
|
"-S server Server name to be used\n"
|
||||||
|
"-U username Username sent to server\n"
|
||||||
|
"-P password Use this password\n"
|
||||||
|
"-n Do not use any password\n"
|
||||||
|
"-C Don't convert password to uppercase\n"
|
||||||
|
"\n"
|
||||||
|
"-o object_name Name of accessed object\n"
|
||||||
|
"-t type Object type (decimal value)\n"
|
||||||
|
"-p property Name of property to be touched\n"
|
||||||
|
"value value to be added\n"
|
||||||
|
"\n"
|
||||||
|
"If property is of type SET, value is an object id (hex)\n"
|
||||||
|
"Otherwise, value is either a string value to be written, or\n"
|
||||||
|
"a count of bytes to be written. The latter is assumed if\n"
|
||||||
|
"more than one value argument is given. The count is decimal,\n"
|
||||||
|
"and the following arguments are interpreted as bytes in\n"
|
||||||
|
"hexadecimal notation.\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct ncp_conn *conn;
|
||||||
|
char *object_name = NULL;
|
||||||
|
int object_type = -1;
|
||||||
|
char *property_name = NULL;
|
||||||
|
char *value = NULL;
|
||||||
|
struct ncp_property_info info;
|
||||||
|
long err;
|
||||||
|
int result = 1;
|
||||||
|
int opt;
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
|
||||||
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o:t:p:v:")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt) {
|
||||||
|
case 'o':
|
||||||
|
object_name = optarg;
|
||||||
|
str_upper(object_name);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
object_type = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
property_name = optarg;
|
||||||
|
if (strlen(property_name) > 15)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Property Name too long\n",
|
||||||
|
argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
str_upper(property_name);
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
value = optarg;
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help();
|
||||||
|
goto finished;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_type < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object type\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_name == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object name\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (property_name == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify a property name\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind > argc-1)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify a property value\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = argv[optind];
|
||||||
|
optind += 1;
|
||||||
|
|
||||||
|
if (ncp_scan_property(conn, object_type, object_name,
|
||||||
|
0xffffffff, property_name, &info) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Could not find property\n", argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((info.property_flags & 2) != 0)
|
||||||
|
{
|
||||||
|
/* Property is of type SET */
|
||||||
|
struct ncp_bindery_object o;
|
||||||
|
|
||||||
|
if (optind != argc)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: For the SET property %s, you must"
|
||||||
|
" specify an object id as value\n",
|
||||||
|
progname, property_name);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_get_bindery_object_name(conn,
|
||||||
|
ntohl(strtol(value, NULL, 16)),
|
||||||
|
&o) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: %s is not a valid object id\n",
|
||||||
|
progname, value);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_add_object_to_set(conn, object_type, object_name,
|
||||||
|
property_name,
|
||||||
|
o.object_type, o.object_name) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: could not add object %s\n",
|
||||||
|
progname, o.object_name);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Property is of type ITEM */
|
||||||
|
char contents[255*128];
|
||||||
|
int segno = 1;
|
||||||
|
int length;
|
||||||
|
|
||||||
|
memset(contents, 0, sizeof(contents));
|
||||||
|
|
||||||
|
if (optind == argc)
|
||||||
|
{
|
||||||
|
/* value is the string to add */
|
||||||
|
length = strlen(value);
|
||||||
|
if (length >= sizeof(contents))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Value too long\n",
|
||||||
|
progname);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
strcpy(contents, value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* value is the byte count */
|
||||||
|
int i;
|
||||||
|
length = atoi(value);
|
||||||
|
if (length >= sizeof(contents))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Value too long\n",
|
||||||
|
progname);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
if (optind != argc - length)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Byte count does not match"
|
||||||
|
" number of bytes\n", progname);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
while (optind < argc)
|
||||||
|
{
|
||||||
|
contents[i] = strtol(argv[optind], NULL, 16);
|
||||||
|
i += 1;
|
||||||
|
optind += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (segno = 1; segno <= 255; segno++)
|
||||||
|
{
|
||||||
|
struct nw_property segment;
|
||||||
|
int offset = (segno-1)*128;
|
||||||
|
|
||||||
|
if ( offset > length )
|
||||||
|
{
|
||||||
|
/* everything written */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
memcpy(segment.value, &(contents[offset]), 128);
|
||||||
|
segment.more_flag = segno*128 < length;
|
||||||
|
if (ncp_write_property_value(conn, object_type,
|
||||||
|
object_name,
|
||||||
|
property_name,
|
||||||
|
segno, &segment) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Could not write "
|
||||||
|
"property\n", progname);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
finished:
|
||||||
|
ncp_close(conn);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
187
util/nwbpcreate.c
Normal file
187
util/nwbpcreate.c
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
/*
|
||||||
|
* nwbpcreate.c
|
||||||
|
*
|
||||||
|
* Create a property for a bindery object on a NetWare server
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ncplib.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
help(void)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("usage: %s [options]\n", progname);
|
||||||
|
printf("\n"
|
||||||
|
"-h Print this help text\n"
|
||||||
|
"-S server Server name to be used\n"
|
||||||
|
"-U username Username sent to server\n"
|
||||||
|
"-P password Use this password\n"
|
||||||
|
"-n Do not use any password\n"
|
||||||
|
"-C Don't convert password to uppercase\n"
|
||||||
|
"\n"
|
||||||
|
"-o object_name Name of object\n"
|
||||||
|
"-t type Object type (decimal value)\n"
|
||||||
|
"-p property Name of property to be created\n"
|
||||||
|
"-s Property is SET, default: ITEM\n"
|
||||||
|
"-r read-flag Read security\n"
|
||||||
|
"-w write-flag Write security\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
parse_security(const char *security)
|
||||||
|
{
|
||||||
|
if (strcasecmp(security, "anyone") == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (strcasecmp(security, "logged") == 0)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (strcasecmp(security, "object") == 0)
|
||||||
|
{
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
if (strcasecmp(security, "supervisor") == 0)
|
||||||
|
{
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
if (strcasecmp(security, "netware") == 0)
|
||||||
|
{
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct ncp_conn *conn;
|
||||||
|
char *object_name = NULL;
|
||||||
|
int object_type = -1;
|
||||||
|
char *property_name = NULL;
|
||||||
|
int property_is_set = 0;
|
||||||
|
long err;
|
||||||
|
|
||||||
|
int read_sec = 1; /* logged read */
|
||||||
|
int write_sec = 3; /* supervisor write */
|
||||||
|
int result = 1;
|
||||||
|
|
||||||
|
int opt;
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
|
||||||
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o:t:p:sr:w:")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt) {
|
||||||
|
case 'o':
|
||||||
|
object_name = optarg;
|
||||||
|
str_upper(object_name);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
object_type = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
property_name = optarg;
|
||||||
|
if (strlen(property_name) > 15)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Property Name too long\n",
|
||||||
|
argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
str_upper(property_name);
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
property_is_set = 1;
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
read_sec = parse_security(optarg);
|
||||||
|
if (read_sec < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"%s: Wrong read security\n"
|
||||||
|
"Must be one of anyone, logged, "
|
||||||
|
"object, supervisor or netware\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'w':
|
||||||
|
write_sec = parse_security(optarg);
|
||||||
|
if (write_sec < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"%s: Wrong write security\n"
|
||||||
|
"Must be one of anyone, logged, "
|
||||||
|
"object, supervisor or netware\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help();
|
||||||
|
goto finished;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_type < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object type\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_name == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object name\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (property_name == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify a property name\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_create_property(conn, object_type, object_name,
|
||||||
|
property_name,
|
||||||
|
property_is_set ? 2 : 0,
|
||||||
|
(write_sec << 4) + read_sec) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Could not create the property\n",argv[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
finished:
|
||||||
|
ncp_close(conn);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
126
util/nwbprm.c
Normal file
126
util/nwbprm.c
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* nwbprm.c
|
||||||
|
*
|
||||||
|
* Delete a property of a bindery object on a NetWare server
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "ncplib.h"
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [options] [pattern]\n", progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
help(void)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("usage: %s [options]\n", progname);
|
||||||
|
printf("\n"
|
||||||
|
"-h Print this help text\n"
|
||||||
|
"-S server Server name to be used\n"
|
||||||
|
"-U username Username sent to server\n"
|
||||||
|
"-P password Use this password\n"
|
||||||
|
"-n Do not use any password\n"
|
||||||
|
"-C Don't convert password to uppercase\n"
|
||||||
|
"\n"
|
||||||
|
"-o object_name Name of object\n"
|
||||||
|
"-t type Object type (decimal value)\n"
|
||||||
|
"-p property Name of property to be deleted\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct ncp_conn *conn;
|
||||||
|
char *object_name = NULL;
|
||||||
|
int object_type = -1;
|
||||||
|
char *property_name = NULL;
|
||||||
|
long err;
|
||||||
|
|
||||||
|
int result = 1;
|
||||||
|
|
||||||
|
int opt;
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
|
||||||
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o:t:p:")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt) {
|
||||||
|
case 'o':
|
||||||
|
object_name = optarg;
|
||||||
|
str_upper(object_name);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
object_type = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
property_name = optarg;
|
||||||
|
if (strlen(property_name) > 15)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Property Name too long\n",
|
||||||
|
argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
str_upper(property_name);
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help();
|
||||||
|
goto finished;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_type < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object type\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_name == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object name\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (property_name == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify a property name\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_delete_property(conn, object_type, object_name,
|
||||||
|
property_name) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Could not delete the property\n",argv[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
finished:
|
||||||
|
ncp_close(conn);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
262
util/nwbpvalues.c
Normal file
262
util/nwbpvalues.c
Normal file
@@ -0,0 +1,262 @@
|
|||||||
|
/*
|
||||||
|
* nwbpvalues.c
|
||||||
|
*
|
||||||
|
* List the contents of a SET property of a bindery object on a NetWare server
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ncplib.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_property(char *prop_name, __u8 *val, int segments);
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
help(void)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("usage: %s [options]\n", progname);
|
||||||
|
printf("\n"
|
||||||
|
"-h Print this help text\n"
|
||||||
|
"-S server Server name to be used\n"
|
||||||
|
"-U username Username sent to server\n"
|
||||||
|
"-P password Use this password\n"
|
||||||
|
"-n Do not use any password\n"
|
||||||
|
"-C Don't convert password to uppercase\n"
|
||||||
|
"\n"
|
||||||
|
"-o object_name Name of object\n"
|
||||||
|
"-t type Object type (decimal value)\n"
|
||||||
|
"-p property Name of property to be listed\n"
|
||||||
|
"-v Verbose object listing\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct ncp_conn *conn;
|
||||||
|
char *object_name = NULL;
|
||||||
|
int object_type = -1;
|
||||||
|
char *property_name = NULL;
|
||||||
|
__u8 property_value[255*128];
|
||||||
|
int segno;
|
||||||
|
int verbose = 0;
|
||||||
|
struct nw_property segment;
|
||||||
|
struct ncp_property_info info;
|
||||||
|
long err;
|
||||||
|
|
||||||
|
int result = 1;
|
||||||
|
|
||||||
|
int opt;
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
|
||||||
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o:t:p:v")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt) {
|
||||||
|
case 'o':
|
||||||
|
object_name = optarg;
|
||||||
|
str_upper(object_name);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
object_type = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
property_name = optarg;
|
||||||
|
if (strlen(property_name) > 15)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Property Name too long\n",
|
||||||
|
argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
str_upper(property_name);
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
verbose = 1;
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help();
|
||||||
|
goto finished;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_type < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object type\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_name == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object name\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (property_name == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify a property name\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_scan_property(conn, object_type, object_name,
|
||||||
|
0xffffffff, property_name, &info) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Could not find property\n", argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
segno = 1;
|
||||||
|
while (ncp_read_property_value(conn, object_type, object_name,
|
||||||
|
segno, property_name, &segment) == 0)
|
||||||
|
{
|
||||||
|
memcpy(&(property_value[(segno-1)*128]), segment.value, 128);
|
||||||
|
if ((segment.more_flag == 0) || (segno == 255))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ((info.property_flags & 2) == 0)
|
||||||
|
{
|
||||||
|
print_property(property_name, property_value, segno);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int objects = 32 * segno;
|
||||||
|
__u32 *value = (__u32 *)property_value;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < objects; i++)
|
||||||
|
{
|
||||||
|
struct ncp_bindery_object o;
|
||||||
|
|
||||||
|
if ((*value == 0) || (*value == 0xffffffff))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (ncp_get_bindery_object_name(conn, ntohl(*value),
|
||||||
|
&o) == 0)
|
||||||
|
{
|
||||||
|
if (verbose != 0)
|
||||||
|
{
|
||||||
|
printf("%s %08X %04X\n",
|
||||||
|
o.object_name,
|
||||||
|
(unsigned int) o.object_id,
|
||||||
|
(unsigned int) o.object_type);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("%s\n", o.object_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
value += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
finished:
|
||||||
|
ncp_close(conn);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_unknown(__u8 *val)
|
||||||
|
{
|
||||||
|
int j = (128/16);
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for ( i = 0 ; i < 16 ; i++ )
|
||||||
|
{
|
||||||
|
printf ( "%02X " , val[i] );
|
||||||
|
}
|
||||||
|
printf ( " [" );
|
||||||
|
for ( i = 0 ; i < 16 ; i++ )
|
||||||
|
{
|
||||||
|
printf ( "%c" , isprint(val[i]) ? val[i] : '.');
|
||||||
|
}
|
||||||
|
j -= 1;
|
||||||
|
if ( j == 0 )
|
||||||
|
{
|
||||||
|
printf ( "]\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
printf ( "]+\n" ) ;
|
||||||
|
val += 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_string(__u8 *val)
|
||||||
|
{
|
||||||
|
puts(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
char *pname ;
|
||||||
|
void (*func)(__u8 *) ;
|
||||||
|
} formats[] = {
|
||||||
|
{ "DESCRIPTION" , print_string } ,
|
||||||
|
{ "SURNAME" , print_string } ,
|
||||||
|
{ "OBJECT_CLASS" , print_string } ,
|
||||||
|
{ "DESCRIPTION" , print_string } ,
|
||||||
|
{ "IDENTIFICATION" , print_string } ,
|
||||||
|
{ "Q_DIRECTORY" , print_string } ,
|
||||||
|
{ NULL , NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_property(char *prop_name, __u8 *val, int segments)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
void (*f)(__u8 *);
|
||||||
|
|
||||||
|
for (i = 0; formats[i].pname != NULL; i++)
|
||||||
|
{
|
||||||
|
if (strcasecmp(prop_name, formats[i].pname) == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f = formats[i].func;
|
||||||
|
|
||||||
|
if (f != NULL)
|
||||||
|
{
|
||||||
|
f(val);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < segments; i++)
|
||||||
|
{
|
||||||
|
printf("Segment: %03d\n", i+1);
|
||||||
|
print_unknown(&(val[i*128]));
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -11,6 +11,64 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include "ncplib.h"
|
#include "ncplib.h"
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [pattern]\n", progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
help(void)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("usage: %s [options]\n", progname);
|
||||||
|
printf("\n"
|
||||||
|
"-h Print this help text\n"
|
||||||
|
"-S server Server name to be used\n"
|
||||||
|
"\n"
|
||||||
|
"-d Print Description Strings\n"
|
||||||
|
"-t Print File Server's time\n"
|
||||||
|
"-i Print File Server Information\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_info(struct ncp_file_server_info *info)
|
||||||
|
{
|
||||||
|
printf ( "\n" ) ;
|
||||||
|
printf ( "Fileservername %-48.48s\n" , info->ServerName ) ;
|
||||||
|
printf ( "\n" ) ;
|
||||||
|
printf ( "Version %d.%d Revision %c\n" ,
|
||||||
|
info->FileServiceVersion , info->FileServiceSubVersion,
|
||||||
|
info->Revision + 'A' ) ;
|
||||||
|
printf ( "Max. Connections %d\n" ,
|
||||||
|
info->MaximumServiceConnections ) ;
|
||||||
|
printf ( "currently in use %d\n" ,
|
||||||
|
info->ConnectionsInUse ) ;
|
||||||
|
printf ( "peak connections %d\n" ,
|
||||||
|
info->MaxConnectionsEverUsed ) ;
|
||||||
|
printf ( "Max. Volumes %d\n" ,
|
||||||
|
info->NumberMountedVolumes ) ;
|
||||||
|
printf ( "SFTLevel %d\n" ,
|
||||||
|
info->SFTLevel ) ;
|
||||||
|
printf ( "TTSLevel %d\n" ,
|
||||||
|
info->TTSLevel ) ;
|
||||||
|
printf ( "Accountversion %d\n" ,
|
||||||
|
info->AccountVersion ) ;
|
||||||
|
printf ( "Queueversion %d\n" ,
|
||||||
|
info->QueueVersion ) ;
|
||||||
|
printf ( "Printversion %d\n" ,
|
||||||
|
info->PrintVersion ) ;
|
||||||
|
printf ( "Virt.Consolvers. %d\n" ,
|
||||||
|
info->VirtualConsoleVersion ) ;
|
||||||
|
printf ( "RestrictionLevel %d\n" ,
|
||||||
|
info->RestrictionLevel ) ;
|
||||||
|
printf("\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@@ -18,16 +76,22 @@ main(int argc, char **argv)
|
|||||||
int opt;
|
int opt;
|
||||||
long err;
|
long err;
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
|
||||||
if ((conn = ncp_initialize(&argc, argv, 0, &err)) == NULL)
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "dt")) != EOF)
|
while ((opt = getopt(argc, argv, "h?dti")) != EOF)
|
||||||
{
|
{
|
||||||
switch(opt)
|
switch(opt)
|
||||||
{
|
{
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help();
|
||||||
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
{
|
{
|
||||||
char strings[512];
|
char strings[512];
|
||||||
@@ -68,12 +132,26 @@ main(int argc, char **argv)
|
|||||||
fputs(ctime(&t), stdout);
|
fputs(ctime(&t), stdout);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
case 'i':
|
||||||
printf("unknown option: %c\n", opt);
|
{
|
||||||
|
struct ncp_file_server_info info;
|
||||||
|
if (ncp_get_file_server_information(conn, &info) != 0)
|
||||||
|
{
|
||||||
|
perror("Could not get server information");
|
||||||
|
ncp_close(conn);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
print_info(&info);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
finished:
|
||||||
ncp_close(conn);
|
ncp_close(conn);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
134
util/nwgrant.c
Normal file
134
util/nwgrant.c
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
* nwgrant.c
|
||||||
|
*
|
||||||
|
* Add trustee rights to file or directory
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ncplib.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
help(void)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("usage: %s [options] file/directory\n", progname);
|
||||||
|
printf("\n"
|
||||||
|
"-h Print this help text\n"
|
||||||
|
"-S server Server name to be used\n"
|
||||||
|
"-U username Username sent to server\n"
|
||||||
|
"-P password Use this password\n"
|
||||||
|
"-n Do not use any password\n"
|
||||||
|
"-C Don't convert password to uppercase\n"
|
||||||
|
"\n"
|
||||||
|
"-o object_name Name of object added as trustee\n"
|
||||||
|
"-t type Object type (decimal value)\n"
|
||||||
|
"-r rights Rights mask (see manual page)\n"
|
||||||
|
"\n"
|
||||||
|
"directory\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct ncp_conn *conn;
|
||||||
|
char *object_name = NULL;
|
||||||
|
int object_type = -1;
|
||||||
|
struct ncp_bindery_object o;
|
||||||
|
int rights = -1;
|
||||||
|
char *path = NULL;
|
||||||
|
long err;
|
||||||
|
int result = 1;
|
||||||
|
int opt;
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
|
||||||
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o:t:r:")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt) {
|
||||||
|
case 'o':
|
||||||
|
object_name = optarg;
|
||||||
|
str_upper(object_name);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
object_type = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
rights = strtol(optarg, NULL, 16);
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help();
|
||||||
|
goto finished;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_type < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object type\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_name == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object name\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rights < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify a rights mask\n",
|
||||||
|
progname);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind != argc-1)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify a directory\n",
|
||||||
|
progname);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
path = argv[optind];
|
||||||
|
|
||||||
|
if (ncp_get_bindery_object_id(conn, object_type, object_name, &o) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Could not find object %s\n",
|
||||||
|
progname, object_name);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_add_trustee(conn, 0, path, o.object_id, rights) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Could not add trustee rights\n",progname);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
finished:
|
||||||
|
ncp_close(conn);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
123
util/nwrevoke.c
Normal file
123
util/nwrevoke.c
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
/*
|
||||||
|
* nwrevoke.c
|
||||||
|
*
|
||||||
|
* Remove trustee rights from file or directory
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ncplib.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
help(void)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("usage: %s [options] file/directory\n", progname);
|
||||||
|
printf("\n"
|
||||||
|
"-h Print this help text\n"
|
||||||
|
"-S server Server name to be used\n"
|
||||||
|
"-U username Username sent to server\n"
|
||||||
|
"-P password Use this password\n"
|
||||||
|
"-n Do not use any password\n"
|
||||||
|
"-C Don't convert password to uppercase\n"
|
||||||
|
"\n"
|
||||||
|
"-o object_name Name of object removed as trustee\n"
|
||||||
|
"-t type Object type (decimal value)\n"
|
||||||
|
"\n"
|
||||||
|
"file/directory\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct ncp_conn *conn;
|
||||||
|
char *object_name = NULL;
|
||||||
|
int object_type = -1;
|
||||||
|
struct ncp_bindery_object o;
|
||||||
|
char *path = NULL;
|
||||||
|
long err;
|
||||||
|
int result = 1;
|
||||||
|
int opt;
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
|
||||||
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?o:t:")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt) {
|
||||||
|
case 'o':
|
||||||
|
object_name = optarg;
|
||||||
|
str_upper(object_name);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
object_type = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help();
|
||||||
|
goto finished;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_type < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object type\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_name == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify an object name\n",
|
||||||
|
argv[0]);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind != argc-1)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You must specify a directory\n",
|
||||||
|
progname);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
path = argv[optind];
|
||||||
|
|
||||||
|
if (ncp_get_bindery_object_id(conn, object_type, object_name, &o) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Could not find object %s\n",
|
||||||
|
progname, object_name);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_delete_trustee(conn, 0, path, o.object_id) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Could not remove trustee rights\n",
|
||||||
|
progname);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
finished:
|
||||||
|
ncp_close(conn);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
143
util/nwuserlist.c
Normal file
143
util/nwuserlist.c
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
/*
|
||||||
|
* nwfsinfo.c
|
||||||
|
*
|
||||||
|
* Print the info strings of a server, maybe sometime more.
|
||||||
|
*
|
||||||
|
* Copyright (C) 1996 by Volker Lendecke
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "ncplib.h"
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [pattern]\n", progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
str_trim_right(char *s, char c)
|
||||||
|
{
|
||||||
|
int len = strlen(s) - 1;
|
||||||
|
|
||||||
|
while ((len > 0) && (s[len] == c))
|
||||||
|
{
|
||||||
|
s[len] = '\0';
|
||||||
|
len -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
help(void)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("usage: %s [options]\n", progname);
|
||||||
|
printf("\n"
|
||||||
|
"-h Print this help text\n"
|
||||||
|
"-S server Server name to be used\n"
|
||||||
|
"-a Print Station's addr\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
struct ncp_conn *conn;
|
||||||
|
int opt;
|
||||||
|
long err;
|
||||||
|
struct ncp_file_server_info info;
|
||||||
|
struct ncp_bindery_object user;
|
||||||
|
time_t login_time;
|
||||||
|
int i;
|
||||||
|
int print_addr = 0;
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
|
||||||
|
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||||
|
{
|
||||||
|
com_err(argv[0], err, "when initializing");
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "h?a")) != EOF)
|
||||||
|
{
|
||||||
|
switch(opt)
|
||||||
|
{
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help();
|
||||||
|
goto finished;
|
||||||
|
case 'a':
|
||||||
|
print_addr = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncp_get_file_server_information(conn, &info) != 0)
|
||||||
|
{
|
||||||
|
perror("Could not get server information");
|
||||||
|
ncp_close(conn);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isatty(1))
|
||||||
|
{
|
||||||
|
if (print_addr == 0)
|
||||||
|
{
|
||||||
|
printf("\n%-6s%-21s%-12s\n"
|
||||||
|
"---------------------------------------------"
|
||||||
|
"------\n",
|
||||||
|
"Conn",
|
||||||
|
"User name",
|
||||||
|
"Login time");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("\n%-6s%-21s%-27s%-12s\n"
|
||||||
|
"---------------------------------------------"
|
||||||
|
"---------------------------------\n",
|
||||||
|
"Conn",
|
||||||
|
"User name",
|
||||||
|
"Station Address",
|
||||||
|
"Login time");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 1; i <= info.MaximumServiceConnections; i++)
|
||||||
|
{
|
||||||
|
char name[49];
|
||||||
|
name[48] = '\0';
|
||||||
|
if (ncp_get_stations_logged_info(conn, i, &user,
|
||||||
|
&login_time) != 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
memcpy(name, user.object_name, 48);
|
||||||
|
str_trim_right(name, ' ');
|
||||||
|
printf("%4d: %-20s ", i, name);
|
||||||
|
|
||||||
|
if (print_addr != 0)
|
||||||
|
{
|
||||||
|
struct sockaddr_ipx addr;
|
||||||
|
__u8 conn_type;
|
||||||
|
|
||||||
|
memset(&addr, 0, sizeof(addr));
|
||||||
|
ncp_get_internet_address(conn, i, &addr, &conn_type);
|
||||||
|
ipx_print_saddr(&addr);
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s", ctime(&login_time));
|
||||||
|
}
|
||||||
|
|
||||||
|
finished:
|
||||||
|
ncp_close(conn);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -26,7 +26,7 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ main(int argc, char *argv[])
|
|||||||
if ((conn = ncp_initialize_as(&argc, argv, 1,
|
if ((conn = ncp_initialize_as(&argc, argv, 1,
|
||||||
NCP_BINDERY_PSERVER, &err)) == NULL)
|
NCP_BINDERY_PSERVER, &err)) == NULL)
|
||||||
{
|
{
|
||||||
com_err(argv[0], err, "in ncp_initialize");
|
com_err(argv[0], err, "when initializing");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user