Compare commits

...

7 Commits

Author SHA1 Message Date
ncpfs archive import
011a5107c5 Import ncpfs 2.0.3 2026-04-28 20:39:58 +02:00
ncpfs archive import
7179281575 Import ncpfs 2.0.2 2026-04-28 20:39:58 +02:00
ncpfs archive import
b8d830f9a3 Import ncpfs 2.0.1 2026-04-28 20:39:58 +02:00
ncpfs archive import
b36a27bedb Import ncpfs 2.0.0 2026-04-28 20:39:58 +02:00
ncpfs archive import
7d0e3d011b Import ncpfs 0.24 2026-04-28 20:39:58 +02:00
ncpfs archive import
84cb1f167d Import ncpfs 0.23 2026-04-28 20:39:58 +02:00
ncpfs archive import
64f006632a Import ncpfs 0.22 2026-04-28 20:39:58 +02:00
68 changed files with 4956 additions and 295 deletions

BIN
.downloads/ncpfs-0.22.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-0.23.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-0.24.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-2.0.0.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-2.0.1.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-2.0.2.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-2.0.3.tgz Normal file

Binary file not shown.

60
Changes
View File

@@ -1,6 +1,64 @@
I only began this file with ncpfs-0.12. If you're interested in older
versions, you can find them on ftp.gwdg.de:/pub/linux/misc/ncpfs/old.
ncpfs-2.0.2 -> ncpfs-2.0.3
- Removed the kernel-2.0 directory. Linus took the patch into 2.0.8.
So, if you want to use long file name support, upgrade to Linux
kernel version 2.0.8.
- Applied the lfn patch to the kernel-1.2 module with some light
testing. If you experience problems, tell it to me, and use the
ncpfs-2.0.2 kernel module, or upgrade to Linux 2.0.8.
- Added unencrypted login when no crypt key is returned.
- Hopefully improved error messages a bit
- Added some values to ipxparse
- For ELF systems, moved ncplib to /lib/libncp.so.1.x. This saves
about 1MB of disk space. As ncpfs grows, the saving will
increase. Please look at the Makefile to enable this.
- Enhanced nwfsinfo a bit. (Even with a manpage!)
- Added nwuserlist.
ncpfs-2.0.1 -> ncpfs-2.0.2
- Added some values to ipxparse.
- Added a patch against 2.0.7 for long file names support. I did not
apply this change to the 1.2-module. Please upgrade to 2.0.7 if you
want to use long file names.
- nwbpvalues can print ITEM properties
ncpfs-2.0.0 -> ncpfs-2.0.1
- Added some values to ipxparse.
- Added the little bindery utilities. Maybe someone has the time to
write a shellscript named 'nwadduser' ?
- Fixed a bug that made the __255 message reappear. Many thanks to
Guntram Blom for his detailed bug report.
- Fixed a bug that made ncpfs incompatible with W95's server
capabilities. Thanks to Tomasz Babczynski
<faster@dino.ict.pwr.wroc.pl> for this one.
ncpfs-0.24 -> ncpfs-2.0.0
- Changed the numbering scheme :-).
- Added npasswd. Many thanks to Guntram Blom for his work!
- Hopefully improved error messages a bit
- Hopefully made slist a bit more robust
ncpfs-0.23 -> ncpfs-0.24
- Fixed a bug that made it impossible to umount a filesystem after you
tried 'mkdir .' or 'mkdir ..'.
- Fixed a bad race condition when opening files.
- Made the default timeout values more robust.
ncpfs-0.22 -> ncpfs-0.23
- Fixed a memory allocation problem in nwmsg.c. Thanks to
Andrew Ross <anr1001@hermes.cam.ac.uk>
- slist hopefully does not ask for a password anymore.
- cleaned up error messages a bit.
- ncpmount now calls modprobe instead of insmod.
ncpfs-0.21 -> ncpfs-0.22
- removed a bad race condition in kernel-1.2/src/dir.c.
- handle 0x9999-responses from the ncp server correctly.
- Bindery functions in ncplib.c by Brian G. Reid (breid@tim.com)
- set blocksize to 512 to satisfy 'du -k'
ncpfs-0.20 -> ncpfs-0.21
- Included two bugfixes in ncplib.c found by Jeff Buhrt
<buhrt@iquest.net>.
@@ -91,4 +149,4 @@ ncpfs-0.12 -> ncpfs-0.13
- support for automatic loading of ncpfs.o by kerneld.
Thanks to Steven N. Hirsch <hirsch@emba.uvm.edu>.
- A subtle problem in the read routines has been removed by Uwe Bonnes
<bon@elektron.ikp.physik.th-darmstadt.de>. Thanks a lot.
<bon@elektron.ikp.physik.th-darmstadt.de>. Thanks a lot.

32
FAQ
View File

@@ -4,10 +4,36 @@ enough.
-------------------------------------------------------------------------------
Q: Does ncpfs support long file names, using the OS/2 namespace?
Q: The ncpfs utilities like slist or ncpmount tell me that they can
not find a server, although I'm sure there are servers on my
net. What's wrong?
No. Not yet. I still have to sort out how that really works. But it should
certainly be possible.
You probably used
ipx_configure --auto_interface=on --auto_primary=on
and you have Windows (95?) workstations on your network. Windows 95
makes Linux configure IPX interfaces for non-existent frame types. To
solve this problem, you have to configure your IPX interface manually
with the command
ipx_interface add -p <device> <frame>
For <device> use eth0, eth1 or whatever you network adapter is
called. The value for <frame> must match the frame type used on your
network. Possible values are 802.2, 802.3, SNAP and EtherII.
-------------------------------------------------------------------------------
Q: I have difficulties with NetWare 4.1. What can I do?
To be honest, I do not really know. Currently my only test equipment
is a NetWare 3.11 server. You should make your 4.1 Server as
3.x-compatible as it can be. As I do not know 4.1, you are on your own
doing this.
A promising hint that has already helped some people is to switch off
packet signatures on the 4.1 server, as ncpfs does not support them.
-------------------------------------------------------------------------------

View File

@@ -2,31 +2,32 @@
# Makefile for the linux ncp-filesystem routines.
#
VERSION = 0.21
TOPDIR = $(shell pwd)
BINDIR = /usr/local/bin
SBINDIR = /sbin
INTERM_BINDIR = $(TOPDIR)/bin
SUBDIRS = util ipx-1.0 man
#
# The following 2 lines are for those who use Kernel version 1.2.x.
# If you have a kernel later than 1.3.53, please comment out the
# the following lines. You have to recompile your kernel
# and say 'y' when 'make config' asks you for IPX and ncpfs.
#
SUBDIRS += kernel-1.2/src
INCLUDES = -I$(TOPDIR)/kernel-1.2
VERSION = 2.0.3
# If you are using kerneld to autoload ncp support,
# uncomment this (kerneld is in linux since about 1.3.57):
#KERNELD = -DHAVE_KERNELD
export INCLUDES BINDIR INTERM_BINDIR SBINDIR KERNELD VERSION
# If your system is ELF, please uncomment the following line:
#HAVE_ELF=yes
TOPDIR = $(shell pwd)
BINDIR = /usr/local/bin
SBINDIR = /sbin
INTERM_BINDIR = $(TOPDIR)/bin
SUBDIRS = util ipx-1.0 man
KVERSION=$(shell uname -r | cut -b1-3)
ifeq ($(KVERSION),1.2)
SUBDIRS += kernel-1.2/src
INCLUDES = -I$(TOPDIR)/kernel-1.2
endif
export INCLUDES BINDIR INTERM_BINDIR SBINDIR KERNELD VERSION HAVE_ELF
all:
for i in $(SUBDIRS); do make -C $$i; done
for i in $(SUBDIRS); do make -C $$i all; done
dep:
for i in $(SUBDIRS); do make -C $$i dep; done
@@ -44,6 +45,7 @@ clean:
mrproper: clean
rm -fr $(INTERM_BINDIR)/* ncpfs.tgz
make -C util mrproper
make -C ipxdump mrproper
modules: ncpfs.o
@@ -51,7 +53,11 @@ SRCPATH=$(shell pwd)
SRCDIR=$(shell basename $(SRCPATH))
DISTFILE=$(SRCDIR).tgz
dist: tgz
dist: mrproper
(cd ..; \
tar cvf - $(SRCDIR) | \
gzip -9 > $(DISTFILE); \
mv $(DISTFILE) $(SRCDIR))
make dep
make all

25
README
View File

@@ -3,8 +3,22 @@ some little utilities it also contains nprint, which enables you to
print on NetWare print queues. The opposite side, pserver, is also
provided.
I'm planning major changes in the structure of ncpfs for Linux 2.1.x
which will break the binary compatibility. So I changed the numbering
scheme for ncpfs. ncpfs-2.0.x will be the version to be used with
Linux 2.0.0 and older kernels, and ncpfs-2.1.x will be the version for
the development kernels.
INSTALLATION
Before you start the installation, make sure that your kernel has IPX
support compiled in. When 'make config' asks you for
The IPX protocol (CONFIG_IPX) [N/y/m/?]
simply answer 'y'. Probably you do not need the full internal net that
you are asked for next.
The installation of ncpfs depends on the kernel version you are
using. For kernel 1.2, you should simply type 'make' and look at
what's in the bin/ directory after that. Please be sure that your
@@ -22,10 +36,13 @@ asks for ncpfs. After you have rebooted with the new kernel, 'cat
/proc/filesystems' should show you a line saying that the kernel knows
ncpfs.
With Kernel 1.3.71 or later you also have to modify the Makefile in the
directory you found this README in. Please see the Makefile for the
necessary modifications. Then typing 'make' should work with no
problem.
If you are running kerneld, please uncomment the corresponding line in
the Makefile to reflect this.
If your system is ELF, please enable the use of the shared ncp-library
in the Makefile. This will save at least 1MB of disk space.
After you adapted your Makefile, type 'make' and, as root, 'make install'.
HELP

5
TODO
View File

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

View File

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

View File

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

View File

@@ -236,7 +236,7 @@ handle_frame (unsigned char *buf, int length, struct sockaddr *saddr)
switch( packet_type )
{
case __constant_ntohs(ETH_P_IPX):
handle_ipx("EtherII ", &(buf[sizeof(struct ethhdr)]));
handle_ipx("EtherII", &(buf[sizeof(struct ethhdr)]));
break;
default:
handle_other(buf, length, saddr);

View File

@@ -89,10 +89,31 @@ struct ncp_reply_header {
__u8 data[0] __attribute__ ((packed));
};
#define NCP_BURST_PACKET (0x7777)
struct ncp_burst_header {
__u16 type __attribute__ ((packed));
__u8 system_flags __attribute__ ((packed));
__u8 stream_type __attribute__ ((packed));
__u32 source_conn __attribute__ ((packed));
__u32 dest_conn __attribute__ ((packed));
__u32 packet_sequence __attribute__ ((packed));
__u32 send_delay __attribute__ ((packed));
__u16 burst_sequence __attribute__ ((packed));
__u16 ack_sequence __attribute__ ((packed));
__u32 burst_length __attribute__ ((packed));
__u32 data_offset __attribute__ ((packed));
__u16 data_bytes __attribute__ ((packed));
__u16 missing_frags __attribute__ ((packed));
};
void handle_ipx (unsigned char *buf, int length, char *frame, int no);
void handle_ncp (struct sockaddr_ipx *source,
struct sockaddr_ipx *target,
unsigned char *buf, int length, int no);
int handle_burst(struct sockaddr_ipx *source,
struct sockaddr_ipx *target,
unsigned char *buf, int length, int no);
#define SAP_MAX_SERVER_NAME_LENGTH 48 /* in network packets */
#define SAP_MAX_SAPS_PER_PACKET 7
@@ -165,6 +186,12 @@ handle_ipx (unsigned char *buf, int length, char *frame, int no)
ipx_print_saddr(&d_addr);
printf("\n");
if (handle_burst(&s_addr, &d_addr, buf + sizeof(struct ipx_packet),
length - sizeof(struct ipx_packet), no) != 0)
{
return;
}
if ( (ntohs(s_addr.sipx_port) == 0x451)
|| (ntohs(d_addr.sipx_port) == 0x451))
{
@@ -253,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,
struct sockaddr_ipx *target,
unsigned char *buf, int length, int no)
@@ -275,6 +351,10 @@ void handle_ncp (struct sockaddr_ipx *source,
switch(rq->function)
{
case 18:
printf("fn: %-3d\n", rq->function);
printf("Get Volume Info with Number\n");
break;
case 20:
printf("fn: %-3d\n", rq->function);
printf("Get File Server Date and Time\n");
@@ -305,6 +385,21 @@ void handle_ncp (struct sockaddr_ipx *source,
case 01:
printf("Get Directory Path\n");
break;
case 02:
printf("Scan Directory Information\n");
break;
case 03:
printf("Get Effective Directory Rights\n");
break;
case 05:
printf("Get Volume Number\n");
break;
case 06:
printf("Get Volume Name\n");
break;
case 10:
printf("Create directory\n");
break;
case 18:
printf("Allocate Permanent Dir Handle\n");
break;
@@ -314,6 +409,12 @@ void handle_ncp (struct sockaddr_ipx *source,
case 21:
printf("Get Volume Info with handle\n");
break;
case 39:
printf("Add ext. Trustee to Dir or File\n");
break;
case 48:
printf("Get Name Space Directory Entry\n");
break;
}
data += 3;
data_length -= 3;
@@ -326,6 +427,9 @@ void handle_ncp (struct sockaddr_ipx *source,
case 17:
printf("Get Fileserver Information\n");
break;
case 22:
printf("Get Station's logged Info (old)\n");
break;
case 23:
printf("Get Crypt Key\n");
break;
@@ -335,21 +439,48 @@ void handle_ncp (struct sockaddr_ipx *source,
case 28:
printf("Get Connection Information\n");
break;
case 50:
printf("Create Bindery Object\n");
break;
case 53:
printf("Get Bindery Object ID\n");
break;
case 54:
printf("Get Bindery Object Name\n");
break;
case 55:
printf("Scan Bindery Object\n");
break;
case 57:
printf("Create Property\n");
break;
case 59:
printf("Change Property Security\n");
break;
case 60:
printf("Scan Property\n");
break;
case 61:
printf("Read Property Value\n");
break;
case 62:
printf("Write Property Value\n");
break;
case 65:
printf("Add Bindery Object to Set\n");
break;
case 67:
printf("Is Bindery Object in Set\n");
break;
case 70:
printf("Get Bindery Access Level\n");
break;
case 72:
printf("Get Bindery Object Access Level\n");
break;
case 75:
printf("Keyed change password\n");
break;
}
data += 3;
@@ -359,6 +490,10 @@ void handle_ncp (struct sockaddr_ipx *source,
printf("fn: %-3d\n", rq->function);
printf("End of Job\n");
break;
case 33:
printf("fn: %-3d\n", rq->function);
printf("Negotiate Buffer size\n");
break;
case 34:
printf("fn: %-3d, subfn: %-3d\n", rq->function,
data[2]);
@@ -381,6 +516,10 @@ void handle_ncp (struct sockaddr_ipx *source,
printf("fn: %-3d\n", rq->function);
printf("Close File\n");
break;
case 67:
printf("fn: %-3d\n", rq->function);
printf("Create File\n");
break;
case 72:
printf("fn: %-3d\n", rq->function);
printf("Read from File\n");
@@ -393,6 +532,11 @@ void handle_ncp (struct sockaddr_ipx *source,
printf("fn: %-3d\n", rq->function);
printf("Set File Time Date Stamp\n");
break;
case 76:
printf("fn: %-3d\n", rq->function);
printf("Open File (old)\n");
break;
case 87:
printf("fn: %-3d, subfn: %-3d\n",
rq->function, data[0]);
@@ -425,10 +569,21 @@ void handle_ncp (struct sockaddr_ipx *source,
case 8:
printf("Delete a File Or Subdirectory\n");
break;
case 12:
printf("Allocate Short Directory Handle\n");
break;
}
data += 1;
data_length -= 1;
break;
case 97:
printf("fn: %-3d\n", rq->function);
printf("Get Big Packet NCP Max Packet Size\n");
break;
case 101:
printf("fn: %-3d\n", rq->function);
printf("Packet Burst Connection Request\n");
break;
default:
printf("fn: %-3d\n", rq->function);
}

View File

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

View File

@@ -61,7 +61,7 @@ struct ncp_fs_info {
#define NCP_READDIR_CACHE_SIZE 64
#define NCP_MAX_RPC_TIMEOUT (60) /* 6 seconds */
#define NCP_MAX_RPC_TIMEOUT (6*HZ)
/* Guess, what 0x564c is :-) */
#define NCP_SUPER_MAGIC 0x564c

View File

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

View File

@@ -20,6 +20,7 @@
#include <linux/ncp_fs.h>
#include <asm/segment.h>
#include <linux/errno.h>
#include <linux/locks.h>
#include "ncplib_kernel.h"
struct ncp_dirent {
@@ -96,6 +97,20 @@ str_lower(char *name)
}
}
static inline int
ncp_namespace(struct inode *i)
{
struct ncp_server *server = NCP_SERVER(i);
struct nw_info_struct *info = NCP_ISTRUCT(i);
return server->name_space[info->volNumber];
}
static inline int
ncp_preserve_case(struct inode *i)
{
return (ncp_namespace(i) == NW_NS_OS2);
}
static struct file_operations ncp_dir_operations = {
NULL, /* lseek - default */
ncp_dir_read, /* read - bad */
@@ -132,7 +147,7 @@ struct inode_operations ncp_dir_inode_operations = {
/* Here we encapsulate the inode number handling that depends upon the
* mount mode: When we mount a complete server, the memory address of
* the npc_inode_info is used as an inode. When only a single volume
* is mounted, then the DosDirNum is used as the inode number. As this
* is mounted, then the dirEntNum is used as the inode number. As this
* is unique for the complete volume, this should enable the NFS
* exportability of a ncpfs-mounted volume.
*/
@@ -147,7 +162,7 @@ inline ino_t
ncp_info_ino(struct ncp_server *server, struct ncp_inode_info *info)
{
return ncp_single_volume(server)
? info->finfo.i.DosDirNum : (ino_t)info;
? info->finfo.i.dirEntNum : (ino_t)info;
}
static inline int
@@ -200,12 +215,30 @@ static int c_size;
static int c_seen_eof;
static int c_last_returned_index;
static struct ncp_dirent* c_entry = NULL;
static int c_lock = 0;
static struct wait_queue *c_wait = NULL;
static inline void
ncp_lock_dircache(void)
{
while (c_lock)
sleep_on(&c_wait);
c_lock = 1;
}
static inline void
ncp_unlock_dircache(void)
{
c_lock = 0;
wake_up(&c_wait);
}
static int
ncp_readdir(struct inode *inode, struct file *filp,
struct dirent *dirent, int count)
{
int result, i = 0;
int result = 0;
int i = 0;
int index = 0;
struct ncp_dirent *entry = NULL;
struct ncp_server *server = NCP_SERVER(inode);
@@ -238,6 +271,7 @@ ncp_readdir(struct inode *inode, struct file *filp,
return -EIO;
}
ncp_lock_dircache();
if (c_entry == NULL)
{
i = sizeof (struct ncp_dirent) * NCP_READDIR_CACHE_SIZE;
@@ -245,7 +279,8 @@ ncp_readdir(struct inode *inode, struct file *filp,
if (c_entry == NULL)
{
printk("ncp_readdir: no MEMORY for cache\n");
return -ENOMEM;
result = -ENOMEM;
goto finished;
}
}
@@ -255,10 +290,11 @@ ncp_readdir(struct inode *inode, struct file *filp,
if (filldir(dirent,".",1, filp->f_pos,
ncp_info_ino(server, dir)) < 0)
{
return 0;
goto finished;
}
filp->f_pos += 1;
return ROUND_UP(NAME_OFFSET(dirent)+i+1);
result = ROUND_UP(NAME_OFFSET(dirent)+i+1);
goto finished;
}
if (filp->f_pos == 1)
@@ -266,10 +302,11 @@ ncp_readdir(struct inode *inode, struct file *filp,
if (filldir(dirent,"..",2, filp->f_pos,
ncp_info_ino(server, dir->dir)) < 0)
{
return 0;
goto finished;
}
filp->f_pos += 1;
return ROUND_UP(NAME_OFFSET(dirent)+i+1);
result = ROUND_UP(NAME_OFFSET(dirent)+i+1);
goto finished;
}
if ((inode->i_dev == c_dev) && (inode->i_ino == c_ino))
@@ -286,49 +323,54 @@ ncp_readdir(struct inode *inode, struct file *filp,
}
if ((entry == NULL) && c_seen_eof)
{
return 0;
goto finished;
}
}
if (entry == NULL)
{
int entries;
DDPRINTK("ncp_readdir: Not found in cache.\n");
if (ncp_is_server_root(inode))
{
result = ncp_read_volume_list(server, filp->f_pos,
NCP_READDIR_CACHE_SIZE);
DPRINTK("ncp_read_volume_list returned %d\n", result);
entries = ncp_read_volume_list(server, filp->f_pos,
NCP_READDIR_CACHE_SIZE);
DPRINTK("ncp_read_volume_list returned %d\n", entries);
}
else
{
result = ncp_do_readdir(server, inode, filp->f_pos,
NCP_READDIR_CACHE_SIZE,
c_entry);
DPRINTK("ncp_readdir returned %d\n", result);
entries = ncp_do_readdir(server, inode, filp->f_pos,
NCP_READDIR_CACHE_SIZE,
c_entry);
DPRINTK("ncp_readdir returned %d\n", entries);
}
if (result < 0)
if (entries < 0)
{
c_dev = 0;
c_ino = 0;
return result;
result = entries;
goto finished;
}
if (result > 0)
if (entries > 0)
{
c_seen_eof = (result < NCP_READDIR_CACHE_SIZE);
c_seen_eof = (entries < NCP_READDIR_CACHE_SIZE);
c_dev = inode->i_dev;
c_ino = inode->i_ino;
c_size = result;
c_size = entries;
entry = c_entry;
c_last_returned_index = 0;
index = 0;
for (i = 0; i < c_size; i++)
if (!ncp_preserve_case(inode))
{
str_lower(c_entry[i].i.entryName);
for (i = 0; i < c_size; i++)
{
str_lower(c_entry[i].i.entryName);
}
}
}
}
@@ -336,7 +378,7 @@ ncp_readdir(struct inode *inode, struct file *filp,
if (entry == NULL)
{
/* Nothing found, even from a ncp call */
return 0;
goto finished;
}
if (index < c_size)
@@ -350,7 +392,7 @@ ncp_readdir(struct inode *inode, struct file *filp,
if (ncp_single_volume(server))
{
ino = (ino_t)(entry->i.DosDirNum);
ino = (ino_t)(entry->i.dirEntNum);
}
else
{
@@ -374,15 +416,18 @@ ncp_readdir(struct inode *inode, struct file *filp,
if (filldir(dirent, entry->i.entryName, entry->i.nameLen,
entry->f_pos, ino) < 0)
{
return 0;
goto finished;
}
filp->f_pos += 1;
index += 1;
entry += 1;
return ROUND_UP(NAME_OFFSET(dirent)+i+1);
result = ROUND_UP(NAME_OFFSET(dirent)+i+1);
goto finished;
}
return 0;
finished:
ncp_unlock_dircache();
return result;
}
static int
@@ -643,7 +688,7 @@ ncp_init_root(struct ncp_server *server)
root->finfo.opened = 0;
i->attributes = aDIR;
i->dataStreamSize = 1024;
i->DosDirNum = 0;
i->dirEntNum = i->DosDirNum = 0;
i->volNumber = NCP_NUMBER_OF_VOLUMES+1; /* illegal volnum */
ncp_date_unix2dos(0, &(i->creationTime), &(i->creationDate));
ncp_date_unix2dos(0, &(i->modifyTime), &(i->modifyDate));
@@ -720,7 +765,7 @@ ncp_find_dir_inode(struct inode *dir, const char *name)
do
{
if ( (result->dir->finfo.i.DosDirNum == dir_info->DosDirNum)
if ( (result->dir->finfo.i.dirEntNum == dir_info->dirEntNum)
&& (result->dir->finfo.i.volNumber == dir_info->volNumber)
&& (strcmp(result->finfo.i.entryName, name) == 0)
/* The root dir is never looked up using this
@@ -748,7 +793,7 @@ ncp_lookup(struct inode *dir, const char *__name, int len,
struct ncp_server *server;
struct ncp_inode_info *result_info;
int found_in_cache;
int down_case = 0;
char name[len+1];
*result = NULL;
@@ -800,7 +845,7 @@ ncp_lookup(struct inode *dir, const char *__name, int len,
memcpy(name, __name, len);
name[len] = 0;
lock_super(dir->i_sb);
result_info = ncp_find_dir_inode(dir, name);
if (result_info != 0)
@@ -814,6 +859,7 @@ ncp_lookup(struct inode *dir, const char *__name, int len,
inode number */
*result = iget(dir->i_sb, ncp_info_ino(server, result_info));
unlock_super(dir->i_sb);
iput(dir);
if (*result == NULL)
@@ -828,7 +874,9 @@ ncp_lookup(struct inode *dir, const char *__name, int len,
server. */
found_in_cache = 0;
ncp_lock_dircache();
if ((dir->i_dev == c_dev) && (dir->i_ino == c_ino))
{
int first = c_last_returned_index;
@@ -851,42 +899,56 @@ ncp_lookup(struct inode *dir, const char *__name, int len,
}
while (i != first);
}
ncp_unlock_dircache();
if (found_in_cache == 0)
{
int res;
str_upper(name);
DDPRINTK("ncp_lookup: do_lookup on %s/%s\n",
NCP_ISTRUCT(dir)->entryName, name);
if (ncp_is_server_root(dir))
{
str_upper(name);
down_case = 1;
res = ncp_lookup_volume(server, name, &(finfo.i));
}
else
{
if (!ncp_preserve_case(dir))
{
str_upper(name);
down_case = 1;
}
res = ncp_obtain_info(server,
NCP_ISTRUCT(dir)->volNumber,
NCP_ISTRUCT(dir)->DosDirNum,
NCP_ISTRUCT(dir)->dirEntNum,
name, &(finfo.i));
}
if (res != 0)
{
unlock_super(dir->i_sb);
iput(dir);
return -ENOENT;
}
}
finfo.opened = 0;
str_lower(finfo.i.entryName);
if (down_case != 0)
{
str_lower(finfo.i.entryName);
}
if (!(*result = ncp_iget(dir, &finfo)))
{
unlock_super(dir->i_sb);
iput(dir);
return -EACCES;
}
unlock_super(dir->i_sb);
iput(dir);
return 0;
}
@@ -914,8 +976,13 @@ ncp_create(struct inode *dir, const char *name, int len, int mode,
strncpy(_name, name, len);
_name[len] = '\0';
str_upper(_name);
if (!ncp_preserve_case(dir))
{
str_upper(_name);
}
lock_super(dir->i_sb);
if (ncp_open_create_file_or_subdir(NCP_SERVER(dir),
NCP_ISTRUCT(dir), _name,
OC_MODE_CREATE|OC_MODE_OPEN|
@@ -923,22 +990,29 @@ ncp_create(struct inode *dir, const char *name, int len, int mode,
0, AR_READ|AR_WRITE,
&finfo) != 0)
{
unlock_super(dir->i_sb);
iput(dir);
return -EACCES;
}
ncp_invalid_dir_cache(dir);
str_lower(finfo.i.entryName);
if (!ncp_preserve_case(dir))
{
str_lower(finfo.i.entryName);
}
finfo.access = O_RDWR;
if (!(*result = ncp_iget(dir, &finfo)) < 0)
{
ncp_close_file(NCP_SERVER(dir), finfo.file_handle);
unlock_super(dir->i_sb);
iput(dir);
return -EINVAL;
}
unlock_super(dir->i_sb);
iput(dir);
return 0;
}
@@ -955,12 +1029,17 @@ ncp_mkdir(struct inode *dir, const char *name, int len, int mode)
|| ( (len == 2)
&& (name[1] == '.'))))
{
iput(dir);
return -EEXIST;
}
strncpy(_name, name, len);
_name[len] = '\0';
str_upper(_name);
if (!ncp_preserve_case(dir))
{
str_upper(_name);
}
if (!dir || !S_ISDIR(dir->i_mode))
{
@@ -1018,7 +1097,11 @@ ncp_rmdir(struct inode *dir, const char *name, int len)
strncpy(_name, name, len);
_name[len] = '\0';
str_upper(_name);
if (!ncp_preserve_case(dir))
{
str_upper(_name);
}
if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir),
NCP_ISTRUCT(dir),
@@ -1061,7 +1144,11 @@ ncp_unlink(struct inode *dir, const char *name, int len)
{
strncpy(_name, name, len);
_name[len] = '\0';
str_upper(_name);
if (!ncp_preserve_case(dir))
{
str_upper(_name);
}
if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir),
NCP_ISTRUCT(dir),
@@ -1115,11 +1202,19 @@ ncp_rename(struct inode *old_dir, const char *old_name, int old_len,
strncpy(_old_name, old_name, old_len);
_old_name[old_len] = '\0';
str_upper(_old_name);
if (!ncp_preserve_case(old_dir))
{
str_upper(_old_name);
}
strncpy(_new_name, new_name, new_len);
_new_name[new_len] = '\0';
str_upper(_new_name);
if (!ncp_preserve_case(new_dir))
{
str_upper(_new_name);
}
res = ncp_ren_or_mov_file_or_subdir(NCP_SERVER(old_dir),
NCP_ISTRUCT(old_dir), _old_name,

View File

@@ -21,6 +21,7 @@
#include <linux/stat.h>
#include <linux/mm.h>
#include <linux/ncp_fs.h>
#include <linux/locks.h>
#include "ncplib_kernel.h"
#include <linux/malloc.h>
@@ -50,8 +51,10 @@ ncp_make_open(struct inode *i, int right)
DPRINTK("ncp_make_open: dirent->opened = %d\n", finfo->opened);
lock_super(i->i_sb);
if (finfo->opened == 0)
{
finfo->access = -1;
/* tries max. rights */
if (ncp_open_create_file_or_subdir(NCP_SERVER(i),
NULL, NULL,
@@ -69,12 +72,10 @@ ncp_make_open(struct inode *i, int right)
{
finfo->access = O_RDONLY;
}
else
{
return -EACCES;
}
}
unlock_super(i->i_sb);
if ( ((right == O_RDONLY) && ( (finfo->access == O_RDONLY)
|| (finfo->access == O_RDWR)))
|| ((right == O_WRONLY) && ( (finfo->access == O_WRONLY)

View File

@@ -94,7 +94,7 @@ ncp_read_inode(struct inode *inode)
inode->i_nlink = 1;
inode->i_uid = NCP_SERVER(inode)->m.uid;
inode->i_gid = NCP_SERVER(inode)->m.gid;
inode->i_blksize = 1024;
inode->i_blksize = 512;
inode->i_rdev = 0;
if ((inode->i_blksize != 0) && (inode->i_size != 0))
@@ -132,7 +132,9 @@ static void
ncp_put_inode(struct inode *inode)
{
struct nw_file_info *finfo = NCP_FINFO(inode);
struct super_block *sb = inode->i_sb;
lock_super(sb);
if (finfo->opened != 0)
{
if (ncp_close_file(NCP_SERVER(inode), finfo->file_handle)!=0)
@@ -155,6 +157,7 @@ ncp_put_inode(struct inode *inode)
}
clear_inode(inode);
unlock_super(sb);
}
struct super_block *

View File

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

View File

@@ -222,6 +222,7 @@ do_ncp_rpc_call(struct ncp_server *server, int size)
int timeout;
int retrans;
int major_timeout_seen;
int acknowledge_seen;
int n;
int addrlen;
unsigned long old_mask;
@@ -243,7 +244,8 @@ do_ncp_rpc_call(struct ncp_server *server, int size)
return -EBADF;
}
init_timeout = server->m.time_out;
max_timeout = NCP_MAX_RPC_TIMEOUT*HZ/10;
max_timeout = NCP_MAX_RPC_TIMEOUT;
acknowledge_seen = 0;
retrans = server->m.retry_count;
major_timeout_seen = 0;
old_mask = current->blocked;
@@ -296,11 +298,14 @@ do_ncp_rpc_call(struct ncp_server *server, int size)
{
if (timeout > max_timeout)
{
/* JEJB/JSP 2/7/94
* This is useful to see if the system is
* hanging */
printk("NCP max timeout reached\n");
timeout = max_timeout;
/* JEJB/JSP 2/7/94
* This is useful to see if the system is
* hanging */
if (acknowledge_seen == 0)
{
printk("NCP max timeout reached\n");
}
timeout = max_timeout;
}
current->timeout = jiffies + timeout;
schedule();
@@ -373,6 +378,9 @@ do_ncp_rpc_call(struct ncp_server *server, int size)
sock->ops->recvfrom(sock, (void *)&reply,
sizeof(reply), 1, 0,
NULL, &addrlen);
n = 0;
timeout = max_timeout;
acknowledge_seen = 1;
goto re_select;
}

View File

@@ -1,7 +1,10 @@
MAN1= slist nprint pqlist nsend pserver ncopy
MAN1= slist nprint pqlist nsend pserver ncopy npasswd
MAN1 += nwbols nwboprops nwbpvalues nwfsinfo nwuserlist
MAN5= nwclient
MAN8= ncpmount ncpumount ipx_configure ipx_interface ipx_internal_net \
ipx_route nwmsg
MAN8 += nwbocreate nwborm nwbpadd nwbpcreate nwbprm
MAN8 += nwgrant nwrevoke

55
man/npasswd.1 Normal file
View File

@@ -0,0 +1,55 @@
.TH NPASSWD 1 06/22/1996 npasswd npasswd
.SH NAME
npasswd \- Change a user's password
.SH SYNOPSIS
.B npasswd
[
.B -h
] [
.B -S
.I server
] [
.B -U
.I user name
]
.B -t
.I object type
]
.SH DESCRIPTION
With
.B npasswd,
you can change your password on a NetWare server.
.B npasswd
asks for the old password and twice for the new password. Then it
changes the password on the server.
.SH OPTIONS
.B -h
.RS 3
With -h npasswd prints a little help text.
.RE
.B -S
.I server
.RS 3
is the name of the server you want to use.
.RE
.B -U
.I user name
.RS 3
is the name of the bindery object whose password is to be changed.
.RE
.B -t
.I object type
.RS 3
is the bindery object type of the object whose password is to be
changed.
.RE
.SH CREDITS
npasswd would not have been possible without the work of Guntram
Blom. Look at nwcrypt.c for his work.

133
man/nwbocreate.8 Normal file
View File

@@ -0,0 +1,133 @@
.TH NWBOCREATE 8 7/9/1996 nwbocreate nwbocreate
.SH NAME
nwbocreate \- Create a NetWare Bindery Object
.SH SYNOPSIS
.B nwbocreate
[
.B -h
] [
.B -S
.I server
] [
.B -U
.I user name
] [
.B -P
.I password
|
.B -n
] [
.B -C
] [
.B -o
.I object name
] [
.B -t
.I type
] [
.B -r
.I read-flag
] [
.B -w
.I write-flag
]
.SH DESCRIPTION
.B nwbocreate
creates the specified NetWare Bindery Object.
.B nwbocreate
looks up the file
.I $HOME/.nwclient
to find a file server, a user name and possibly a password. See
nwclient(5) for more information. Please note that the access
permissions of $HOME/.nwclient MUST be 600 for security reasons.
.SH OPTIONS
.B -h
.RS 3
.B -h
is used to print out a short help text.
.RE
.B -S
.I server
.RS 3
.B server
is the name of the server you want to use.
.RE
.B -U
.I user
.RS 3
.B user
is the user name to use for login.
.RE
.B -P
.I password
.RS 3
.B password
is the password to use for login. If neither
.B -n
nor
.B -P
are given, and the user has no open connection to the server, nwbocreate
prompts for a password.
.RE
.B -n
.RS 3
.B -n
should be given if no password is required for the login.
.RE
.B -C
.RS 3
By default, passwords are converted to uppercase before they are sent
to the server, because most servers require this. You can turn off
this conversion by
.B -C.
.RE
.B -o
.I object name
.RS 3
The name of the object to be created.
.RE
.B -t
.I object type
.RS 3
The type of the object.
.I Object type
must be specified as a decimal value. Common values are 1 for user
objects, 2 for group objects and 3 for print queues. Other values are
allowed, but are usually used for specialized applications.
.RE
.B -r
.I read-flag
.B -w
.I write-flag
.RS 3
Read security and write security may each have one of the following values:
ANYONE: Anyone may access the object
LOGGED: Anyone who is logged in may access the
object
OBJECT: Anyone who is logged in as the object or
SUPERVISOR equivalent may access the
object
SUPERVISOR: Anyone who is logged in as SUPERVISOR
equivalent may access the object
NETWARE: Only the Bindery may access the object
.RE
.SH AUTHORS
nwbocreate was written by Volker Lendecke with the corresponding
Caldera utility in mind. See the Changes file of ncpfs for other
contributors.

117
man/nwbols.1 Normal file
View 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
View File

@@ -0,0 +1,118 @@
.TH NWBOPROPS 1 7/9/1996 nwboprops nwboprops
.SH NAME
nwboprops \- List properies of a NetWare Bindery Object
.SH SYNOPSIS
.B nwboprops
[
.B -h
] [
.B -S
.I server
] [
.B -U
.I user name
] [
.B -P
.I password
|
.B -n
] [
.B -C
] [
.B -o
.I object name
] [
.B -t
.I type
] [
.B -v
]
.SH DESCRIPTION
.B nwboprops
lists all the properties of the specified NetWare Bindery Objects.
.B nwboprops
looks up the file
.I $HOME/.nwclient
to find a file server, a user name and possibly a password. See
nwclient(5) for more information. Please note that the access
permissions of $HOME/.nwclient MUST be 600 for security reasons.
.SH OPTIONS
.B -h
.RS 3
.B -h
is used to print out a short help text.
.RE
.B -S
.I server
.RS 3
.B server
is the name of the server you want to use.
.RE
.B -U
.I user
.RS 3
.B user
is the user name to use for login.
.RE
.B -P
.I password
.RS 3
.B password
is the password to use for login. If neither
.B -n
nor
.B -P
are given, and the user has no open connection to the server, nwboprops
prompts for a password.
.RE
.B -n
.RS 3
.B -n
should be given if no password is required for the login.
.RE
.B -C
.RS 3
By default, passwords are converted to uppercase before they are sent
to the server, because most servers require this. You can turn off
this conversion by
.B -C.
.RE
.B -o
.I object name
.RS 3
The name of the object to be inspected.
.RE
.B -t
.I object type
.RS 3
The type of the object.
.I Object type
must be specified as a decimal value. Common values are 1 for user
objects, 2 for group objects and 3 for print queues. Other values are
allowed, but are usually used for specialized applications.
.RE
.B -v
.RS 3
By default, only the property name is listed. In verbose mode,
activated by
.B -v,
the property flag, the property security byte and the value flag are
also listed.
.RE
.SH AUTHORS
nwboprops was written by Volker Lendecke with the corresponding
Caldera utility in mind. See the Changes file of ncpfs for other
contributors.

106
man/nwborm.8 Normal file
View File

@@ -0,0 +1,106 @@
.TH NWBORM 8 7/9/1996 nwborm nwborm
.SH NAME
nwborm \- Remove a NetWare Bindery Object
.SH SYNOPSIS
.B nwborm
[
.B -h
] [
.B -S
.I server
] [
.B -U
.I user name
] [
.B -P
.I password
|
.B -n
] [
.B -C
] [
.B -o
.I object name
] [
.B -t
.I type
]
.SH DESCRIPTION
.B nwborm
removes the specified NetWare Bindery Objects.
.B nwborm
looks up the file
.I $HOME/.nwclient
to find a file server, a user name and possibly a password. See
nwclient(5) for more information. Please note that the access
permissions of $HOME/.nwclient MUST be 600 for security reasons.
.SH OPTIONS
.B -h
.RS 3
.B -h
is used to print out a short help text.
.RE
.B -S
.I server
.RS 3
.B server
is the name of the server you want to use.
.RE
.B -U
.I user
.RS 3
.B user
is the user name to use for login.
.RE
.B -P
.I password
.RS 3
.B password
is the password to use for login. If neither
.B -n
nor
.B -P
are given, and the user has no open connection to the server, nwborm
prompts for a password.
.RE
.B -n
.RS 3
.B -n
should be given if no password is required for the login.
.RE
.B -C
.RS 3
By default, passwords are converted to uppercase before they are sent
to the server, because most servers require this. You can turn off
this conversion by
.B -C.
.RE
.B -o
.I object name
.RS 3
The name of the object to be deleted.
.RE
.B -t
.I object type
.RS 3
The type of the object.
.I Object type
must be specified as a decimal value. Common values are 1 for user
objects, 2 for group objects and 3 for print queues. Other values are
allowed, but are usually used for specialized applications.
.RE
.SH AUTHORS
nwborm was written by Volker Lendecke with the corresponding Caldera
utility in mind. See the Changes file of ncpfs for other contributors.

145
man/nwbpadd.8 Normal file
View File

@@ -0,0 +1,145 @@
.TH NWBPADD 8 7/9/1996 nwbpadd nwbpadd
.SH NAME
nwbpadd \- Set the value of a NetWare Bindery Property
.SH SYNOPSIS
.B nwbpadd
[
.B -h
] [
.B -S
.I server
] [
.B -U
.I user name
] [
.B -P
.I password
|
.B -n
] [
.B -C
] [
.B -o
.I object name
] [
.B -t
.I type
] [
.B -p
.I property
]
.B value
.SH DESCRIPTION
.B nwbpadd
sets the value of a ITEM type property, and adds bindery objects to a
SET type property.
.B nwbpadd
looks up the file
.I $HOME/.nwclient
to find a file server, a user name and possibly a password. See
nwclient(5) for more information. Please note that the access
permissions of $HOME/.nwclient MUST be 600 for security reasons.
.SH OPTIONS
.B -h
.RS 3
.B -h
is used to print out a short help text.
.RE
.B -S
.I server
.RS 3
.B server
is the name of the server you want to use.
.RE
.B -U
.I user
.RS 3
.B user
is the user name to use for login.
.RE
.B -P
.I password
.RS 3
.B password
is the password to use for login. If neither
.B -n
nor
.B -P
are given, and the user has no open connection to the server, nwbpadd
prompts for a password.
.RE
.B -n
.RS 3
.B -n
should be given if no password is required for the login.
.RE
.B -C
.RS 3
By default, passwords are converted to uppercase before they are sent
to the server, because most servers require this. You can turn off
this conversion by
.B -C.
.RE
.B -o
.I object name
.RS 3
The name of the object to be touched.
.RE
.B -t
.I object type
.RS 3
The type of the object.
.I Object type
must be specified as a decimal value. Common values are 1 for user
objects, 2 for group objects and 3 for print queues. Other values are
allowed, but are usually used for specialized applications.
.RE
.B -p
.I property
.RS 3
The name of the property to be set.
.RE
.B value
.RS 3
If property is of type SET, value is an object id in hexadecimal
notation. Otherwise, value is either a string value to be written, or
a count of bytes to be written. The latter is assumed if more than one
value argument is given. The count is decimal, and the following
arguments are interpreted as bytes in hexadecimal notation.
Examples:
All these examples assume the existence of the file
$HOME/.nwclient. Otherwise, the server and user would have to be
specified.
nwbpadd -o linus -t 1 -p groups_i\\'m_in os_hackers
In this example, user linus is added to the group os_hackers. Please
note that the ' has to be quoted.
nwbpadd -o linus -t 1 -p identification "Linus Torvalds"
User linus is given his real name :-).
nwbpadd -o linus -t 1 -p revision -v 04 00 00 01 0b
A new 4-byte binary value 0x0000010b (hi-lo order, no byte-swapping) is added
to the "REVISION" property of the user "linus".
.SH AUTHORS
nwbpadd was written by Volker Lendecke with the corresponding Caldera
utility in mind. See the Changes file of ncpfs for other contributors.

154
man/nwbpcreate.8 Normal file
View File

@@ -0,0 +1,154 @@
.TH NWBPCREATE 8 7/9/1996 nwbpcreate nwbpcreate
.SH NAME
nwbpcreate \- Create a NetWare Bindery Propery
.SH SYNOPSIS
.B nwbpcreate
[
.B -h
] [
.B -S
.I server
] [
.B -U
.I user name
] [
.B -P
.I password
|
.B -n
] [
.B -C
] [
.B -o
.I object name
] [
.B -t
.I type
] [
.B -p
.I property
] [
.B -s
] [
.B -r
.I read-flag
] [
.B -w
.I write-flag
]
.SH DESCRIPTION
.B nwbpcreate
creates the specified NetWare Bindery Propery.
.B nwbpcreate
looks up the file
.I $HOME/.nwclient
to find a file server, a user name and possibly a password. See
nwclient(5) for more information. Please note that the access
permissions of $HOME/.nwclient MUST be 600 for security reasons.
.SH OPTIONS
.B -h
.RS 3
.B -h
is used to print out a short help text.
.RE
.B -S
.I server
.RS 3
.B server
is the name of the server you want to use.
.RE
.B -U
.I user
.RS 3
.B user
is the user name to use for login.
.RE
.B -P
.I password
.RS 3
.B password
is the password to use for login. If neither
.B -n
nor
.B -P
are given, and the user has no open connection to the server, nwbpcreate
prompts for a password.
.RE
.B -n
.RS 3
.B -n
should be given if no password is required for the login.
.RE
.B -C
.RS 3
By default, passwords are converted to uppercase before they are sent
to the server, because most servers require this. You can turn off
this conversion by
.B -C.
.RE
.B -o
.I object name
.RS 3
The name of the object to be touched.
.RE
.B -t
.I object type
.RS 3
The type of the object.
.I Object type
must be specified as a decimal value. Common values are 1 for user
objects, 2 for group objects and 3 for print queues. Other values are
allowed, but are usually used for specialized applications.
.RE
.B -p
.I property
.RS 3
The name of the property to be created.
.RE
.B -s
.RS 3
By default,
.B nwbpcreate
creates properties of type ITEM. If you want to create a property of
type SET, such as groups_i\\'m_in, you must use the
.B -s
option.
.RE
.B -r
.I read-flag
.B -w
.I write-flag
.RS 3
Read security and write security may each have one of the following values:
ANYONE: Anyone may access the property
LOGGED: Anyone who is logged in may access the
property
OBJECT: Anyone who is logged in as the object or
SUPERVISOR equivalent may access the
property
SUPERVISOR: Anyone who is logged in as SUPERVISOR
equivalent may access the property
NETWARE: Only the Bindery may access the property
.RE
.SH AUTHORS
nwbpcreate was written by Volker Lendecke with the corresponding
Caldera utility in mind. See the Changes file of ncpfs for other
contributors.

116
man/nwbprm.8 Normal file
View File

@@ -0,0 +1,116 @@
.TH NWBPRM 8 7/9/1996 nwbprm nwbprm
.SH NAME
nwbprm \- Remove a NetWare Bindery Propery
.SH SYNOPSIS
.B nwbprm
[
.B -h
] [
.B -S
.I server
] [
.B -U
.I user name
] [
.B -P
.I password
|
.B -n
] [
.B -C
] [
.B -o
.I object name
] [
.B -t
.I type
] [
.B -p
.I property
]
.SH DESCRIPTION
.B nwbprm
removes the specified NetWare Bindery Propery.
.B nwbprm
looks up the file
.I $HOME/.nwclient
to find a file server, a user name and possibly a password. See
nwclient(5) for more information. Please note that the access
permissions of $HOME/.nwclient MUST be 600 for security reasons.
.SH OPTIONS
.B -h
.RS 3
.B -h
is used to print out a short help text.
.RE
.B -S
.I server
.RS 3
.B server
is the name of the server you want to use.
.RE
.B -U
.I user
.RS 3
.B user
is the user name to use for login.
.RE
.B -P
.I password
.RS 3
.B password
is the password to use for login. If neither
.B -n
nor
.B -P
are given, and the user has no open connection to the server, nwbprm
prompts for a password.
.RE
.B -n
.RS 3
.B -n
should be given if no password is required for the login.
.RE
.B -C
.RS 3
By default, passwords are converted to uppercase before they are sent
to the server, because most servers require this. You can turn off
this conversion by
.B -C.
.RE
.B -o
.I object name
.RS 3
The name of the object to be touched.
.RE
.B -t
.I object type
.RS 3
The type of the object.
.I Object type
must be specified as a decimal value. Common values are 1 for user
objects, 2 for group objects and 3 for print queues. Other values are
allowed, but are usually used for specialized applications.
.RE
.B -p
.I property
.RS 3
The name of the property to be removed.
.RE
.SH AUTHORS
nwbprm was written by Volker Lendecke with the corresponding
Caldera utility in mind. See the Changes file of ncpfs for other
contributors.

128
man/nwbpvalues.1 Normal file
View 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
View File

@@ -0,0 +1,52 @@
.TH NWFSINFO 1 07/22/1996 nwfsinfo nwfsinfo
.SH NAME
nwfsinfo \- Print some information about the file server
.SH SYNOPSIS
.B nwfsinfo
[
.B -h
] [
.B -S
.I server
] [
.B -t
] [
.B -i
] [
.B -d
]
.SH DESCRIPTION
.B nwfsinfo
prints some of the information the NetWare servers present without
logging in. The options control what is printed. You should try the
different options to find out what is printed when.
.SH OPTIONS
.B -h
.RS 3
With -h nwfsinfo prints a little help text.
.RE
.B -S
.I server
.RS 3
is the name of the server you want to know something about.
.RE
.B -t
.RS 3
Print what the file server believes to be the current time.
.RE
.B -d
.RS 3
Print the so-called file server description strings.
.RE
.B -i
.RS 3
Print the extended file server information such as NetWare version,
maximum connections an others.
.RE

148
man/nwgrant.8 Normal file
View File

@@ -0,0 +1,148 @@
.TH NWGRANT 8 7/9/1996 nwgrant nwgrant
.SH NAME
nwgrant \- Add Trustee Rights to a directory
.SH SYNOPSIS
.B nwgrant
[
.B -h
] [
.B -S
.I server
] [
.B -U
.I user name
] [
.B -P
.I password
|
.B -n
] [
.B -C
] [
.B -o
.I object name
] [
.B -t
.I type
] [
.B -r
.I rights
]
.B directory
.SH DESCRIPTION
.B nwgrant
adds the specified bindery object with the corresponding trustee
rights to the directory.
.B nwgrant
looks up the file
.I $HOME/.nwclient
to find a file server, a user name and possibly a password. See
nwclient(5) for more information. Please note that the access
permissions of $HOME/.nwclient MUST be 600 for security reasons.
.SH OPTIONS
.B -h
.RS 3
.B -h
is used to print out a short help text.
.RE
.B -S
.I server
.RS 3
.B server
is the name of the server you want to use.
.RE
.B -U
.I user
.RS 3
.B user
is the user name to use for login.
.RE
.B -P
.I password
.RS 3
.B password
is the password to use for login. If neither
.B -n
nor
.B -P
are given, and the user has no open connection to the server, nwgrant
prompts for a password.
.RE
.B -n
.RS 3
.B -n
should be given if no password is required for the login.
.RE
.B -C
.RS 3
By default, passwords are converted to uppercase before they are sent
to the server, because most servers require this. You can turn off
this conversion by
.B -C.
.RE
.B -o
.I object name
.RS 3
The name of the object to be added as trustee.
.RE
.B -t
.I object type
.RS 3
The type of the object.
.I Object type
must be specified as a decimal value. Common values are 1 for user
objects, 2 for group objects and 3 for print queues. Other values are
allowed, but are usually used for specialized applications.
.RE
.B -r
.I rights
.RS 3
You must tell
.B nwgrant
which rights it should grant to the bindery object.
The new rights for the object is specified by
.I rights,
which is the sum of the following hexadecimal individual rights values:
00 = no access
01 = read access
02 = write access
04 = open access
08 = create access
10 = delete access
20 = ownership access
40 = search access
80 = modify access
for a possible total of "ff" for all rights.
.RE
.B directory
.RS 3
You must specify the directory to which to add the object as
trustee. This has to be done in fully qualified NetWare notation.
Example:
nwgrant -o linus -t 1 -r ff 'data:home\\linus'
With this example, user linus is given all rights to his home
directory on the data volume. This example assumes the existence of
the file $HOME/.nwclient.
.SH AUTHORS
nwgrant was written by Volker Lendecke with the corresponding NetWare
utility in mind. See the Changes file of ncpfs for other contributors.

124
man/nwrevoke.8 Normal file
View File

@@ -0,0 +1,124 @@
.TH NWREVOKE 8 7/9/1996 nwrevoke nwrevoke
.SH NAME
nwrevoke \- Revoke a Trustee Right from a directory
.SH SYNOPSIS
.B nwrevoke
[
.B -h
] [
.B -S
.I server
] [
.B -U
.I user name
] [
.B -P
.I password
|
.B -n
] [
.B -C
] [
.B -o
.I object name
] [
.B -t
.I type
] [
.B -r
.I rights
]
.B directory
.SH DESCRIPTION
.B nwrevoke
revokes the specified bindery object with the corresponding trustee
rights from the directory.
.B nwrevoke
looks up the file
.I $HOME/.nwclient
to find a file server, a user name and possibly a password. See
nwclient(5) for more information. Please note that the access
permissions of $HOME/.nwclient MUST be 600 for security reasons.
.SH OPTIONS
.B -h
.RS 3
.B -h
is used to print out a short help text.
.RE
.B -S
.I server
.RS 3
.B server
is the name of the server you want to use.
.RE
.B -U
.I user
.RS 3
.B user
is the user name to use for login.
.RE
.B -P
.I password
.RS 3
.B password
is the password to use for login. If neither
.B -n
nor
.B -P
are given, and the user has no open connection to the server, nwrevoke
prompts for a password.
.RE
.B -n
.RS 3
.B -n
should be given if no password is required for the login.
.RE
.B -C
.RS 3
By default, passwords are converted to uppercase before they are sent
to the server, because most servers require this. You can turn off
this conversion by
.B -C.
.RE
.B -o
.I object name
.RS 3
The name of the object to be added as trustee.
.RE
.B -t
.I object type
.RS 3
The type of the object.
.I Object type
must be specified as a decimal value. Common values are 1 for user
objects, 2 for group objects and 3 for print queues. Other values are
allowed, but are usually used for specialized applications.
.RE
.B directory
.RS 3
You must specify the directory from which to remove the object as
trustee. This has to be done in fully qualified NetWare notation.
Example:
nwrevoke -o linus -t 1 'src:bsd_src'
With this example, user linus is removed as trustee from the bsd_src
directory on the src volume.
.SH AUTHORS
nwrevoke was written by Volker Lendecke with the corresponding NetWare
utility in mind. See the Changes file of ncpfs for other contributors.

93
man/nwuserlist.1 Normal file
View File

@@ -0,0 +1,93 @@
.TH NWUSERLIST 1 7/22/1996 nwuserlist nwuserlist
.SH NAME
nwuserlist \- List Users logged in at a NetWare server
.SH SYNOPSIS
.B nwuserlist
[
.B -h
] [
.B -S
.I server
] [
.B -U
.I user name
] [
.B -P
.I password
|
.B -n
] [
.B -C
] [
.B -a
]
.SH DESCRIPTION
.B nwuserlist
lists the users logged in at a NetWare server, together with their
connection number and their login time.
.B nwuserlist
looks up the file
.I $HOME/.nwclient
to find a file server, a user name and possibly a password. See
nwclient(5) for more information. Please note that the access
permissions of $HOME/.nwclient MUST be 600 for security reasons.
.SH OPTIONS
.B -h
.RS 3
.B -h
is used to print out a short help text.
.RE
.B -S
.I server
.RS 3
.B server
is the name of the server you want to use.
.RE
.B -U
.I user
.RS 3
.B user
is the user name to use for login.
.RE
.B -P
.I password
.RS 3
.B password
is the password to use for login. If neither
.B -n
nor
.B -P
are given, and the user has no open connection to the server, nwuserlist
prompts for a password.
.RE
.B -n
.RS 3
.B -n
should be given if no password is required for the login.
.RE
.B -C
.RS 3
By default, passwords are converted to uppercase before they are sent
to the server, because most servers require this. You can turn off
this conversion by
.B -C.
.RE
.B -a
.RS 3
With option -a the IPX address of the station the user is logged in
from is printed as well.
.RE
.SH AUTHORS
nwuserlist was written by Volker Lendecke. See the Changes file of ncpfs
for other contributors.

View File

@@ -1,19 +0,0 @@
Begin3
Title: ncpfs
Version: 0.21
Entered-date: 26. March 1996
Description: With ncpfs you can mount volumes of your netware
server under Linux. You can also print to netware
print queues and spool netware print queues to the
Linux printing system. You need kernel 1.2.x or
1.3.54 and above. ncpfs does NOT work with any 1.3.x
kernel below 1.3.54.
Keywords: filesystem ncp novell netware printing
Author: lendecke@namu01.gwdg.de (Volker Lendecke)
Maintained-by: lendecke@namu01.gwdg.de (Volker Lendecke)
Primary-site: ftp.gwdg.de:/pub/linux/misc/ncpfs
Alternate-site: sunsite.unc.edu:/pub/system/Filesystems/
~111k ncpfs-0.21.tgz
~ 1k ncpfs-0.21.lsm
Copying-policy: GPL
End

19
ncpfs-2.0.3.lsm Normal file
View File

@@ -0,0 +1,19 @@
Begin3
Title: ncpfs
Version: 2.0.3
Entered-date: 22. July 1996
Description: With ncpfs you can mount volumes of your netware
server under Linux. You can also print to netware
print queues and spool netware print queues to the
Linux printing system. You need kernel 1.2.x or
1.3.71 and above. ncpfs does NOT work with any 1.3.x
kernel below 1.3.71.
Keywords: filesystem ncp novell netware printing
Author: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke)
Maintained-by: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke)
Primary-site: ftp.gwdg.de:/pub/linux/misc/ncpfs
Alternate-site: sunsite.unc.edu:/pub/Linux/system/Filesystems/ncpfs
~128k ncpfs-2.0.3.tgz
~ 1k ncpfs-2.0.3.lsm
Copying-policy: GPL
End

View File

@@ -2,17 +2,38 @@
# Makefile for the linux ncp-filesystem routines.
#
USERUTILS = slist pqlist nwfsinfo pserver nprint nsend ncopy
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
SBINUTILS = nwmsg
UTIL_EXECS = $(USERUTILS) $(UIDUTILS) $(SBINUTILS)
UTILS = $(addprefix $(INTERM_BINDIR)/,$(UTIL_EXECS))
#CFLAGS = -Wall $(INCLUDES) $(KERNELD) -g -DNCPFS_VERSION=\"$(VERSION)\"
CFLAGS = -Wall $(INCLUDES) $(KERNELD) -O2 -DNCPFS_VERSION=\"$(VERSION)\"
CFLAGS = -Wall $(INCLUDES) $(KERNELD) -DNCPFS_VERSION=\"$(VERSION)\"
CC = gcc
#CFLAGS += -g
CFLAGS += -O2
ifeq ($(HAVE_ELF),yes)
PIC_FLAG = -fPIC
NCP_LIB = libncp.so.1.0
LIB_LINK_COMMAND = gcc -shared -Wl,-soname,libncp.so.1 -o $(NCP_LIB)
INSTALL_LIB = install $(NCP_LIB) -m 755 /lib; \
ln -sf $(NCP_LIB) /lib/libncp.so.1; \
ldconfig
export PIC_FLAG
else
NCP_LIB = libncp.a
LIB_LINK_COMMAND = ar r libncp.a
endif
default:
make -C ..
all: $(UTILS) ncptest
install: all
@@ -22,21 +43,26 @@ install: all
do install $(INTERM_BINDIR)/$$i -m 4755 $(BINDIR); done
for i in $(SBINUTILS); \
do install $(INTERM_BINDIR)/$$i -m 755 $(SBINDIR); done
$(INSTALL_LIB)
$(UTILS): $(addsuffix .o,$(UTIL_EXECS)) libncp.a
$(UTILS): $(addsuffix .o,$(UTIL_EXECS)) $(NCP_LIB)
$(CC) -o $@ $(addsuffix .o,$(notdir $@)) -L. -lncp
ncplib.o: ncplib.c ncplib.h ncplib_err.h
$(CC) $(CFLAGS) -finline-functions -c ncplib.c
$(CC) $(CFLAGS) $(PIC_FLAG) -finline-functions -c ncplib.c
COM_ERR_CFILES = com_err/com_err.c com_err/error_message.c com_err/et_name.c \
com_err/init_et.c
libncp.a: ncplib.o ncplib_err.o $(COM_ERR_CFILES)
$(NCP_LIB): ncplib.o ncplib_err.o $(COM_ERR_CFILES)
make -C com_err
ar r libncp.a ncplib.o ncplib_err.o \
$(LIB_LINK_COMMAND) ncplib.o ncplib_err.o \
com_err/com_err.o com_err/error_message.o com_err/et_name.o \
com_err/init_et.o
ln -sf libncp.so.1.0 libncp.so.1
ncplib_err.o: ncplib_err.h ncplib_err.c
$(CC) $(CFLAGS) $(PIC_FLAG) -c ncplib_err.c
ncplib_err.h: ncplib_err.et
com_err/compile_et ncplib_err
@@ -47,7 +73,7 @@ ncplib_err.c: ncplib_err.et
test: test.o ncplib.o
$(CC) -o test test.o ncplib.o
ncptest: ncptest.o libncp.a
ncptest: ncptest.o $(NCP_LIB)
$(CC) -o ncptest ncptest.o -L. -lncp
dep: ncplib_err.h
@@ -57,6 +83,7 @@ dep: ncplib_err.h
clean:
make -C com_err clean
rm -f *.o *~ slist test ncptest ncplib_err.[ch] libncp.a
rm -f libncp.so.*
mrproper: clean
make -C com_err mrproper

View File

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

View File

@@ -237,6 +237,10 @@ ipx_sap_find_nearest(int server_type, struct sockaddr_ipx *result,
if ((sock = socket(AF_IPX,SOCK_DGRAM,PF_IPX)) < 0)
{
if (errno == EINVAL)
{
return NCPL_ET_NO_IPX;
}
return errno;
}
@@ -255,6 +259,10 @@ ipx_sap_find_nearest(int server_type, struct sockaddr_ipx *result,
if(bind(sock,(struct sockaddr*)&addr,sizeof(addr))==-1)
{
if (errno == EADDRNOTAVAIL)
{
errno = NCPL_ET_NO_INTERFACE;
}
goto finished;
}
@@ -340,7 +348,11 @@ ipx_make_reachable(IPXNet network)
if (sock == -1)
{
return -1;
if (errno == EINVAL)
{
return NCPL_ET_NO_IPX;
}
return errno;
}
opt=1;
@@ -516,14 +528,16 @@ do_ncp_call(struct ncp_conn *conn, int request_size)
*((struct ncp_request_header *)(&(conn->packet)));
int result;
int retries = 3;
int retries = 20;
int len;
long err;
struct ncp_reply_header *r =
(struct ncp_reply_header *)&(conn->packet);
while (retries > 0)
{
struct ncp_reply_header reply;
struct sockaddr_ipx sender;
int sizeofaddr = sizeof(sender);
retries -= 1;
result = sendto(conn->ncp_sock, conn->packet,
@@ -537,30 +551,48 @@ do_ncp_call(struct ncp_conn *conn, int request_size)
}
re_select:
len = ipx_recv(conn->ncp_sock,
conn->packet, NCP_PACKET_SIZE, 0, 1, &err);
len = ipx_recvfrom(conn->ncp_sock,
(char *)&reply, sizeof(reply),
MSG_PEEK, &sender, &sizeofaddr, 3, &err);
if ( (len == sizeof(*r))
&& (r->type == NCP_POSITIVE_ACK))
if ((len < 0) && (err == ETIMEDOUT))
{
goto re_select;
}
if ( (len >= sizeof(*r))
&& (r->type == NCP_REPLY)
&& ( (request.type == NCP_ALLOC_SLOT_REQUEST)
|| ( (r->sequence == request.sequence)
&& (r->conn_low == request.conn_low)
&& (r->conn_high == request.conn_high))))
{
conn->reply_size = len;
break;
continue;
}
if (len < 0)
{
return err;
}
if ( /* Is the sender wrong? */
(memcmp(&sender.sipx_node,
&(conn->i.addr.sipx_node), 6) != 0)
|| (sender.sipx_port != conn->i.addr.sipx_port)
/* Did the sender send a positive acknowledge? */
|| ( (len == sizeof(reply))
&& (reply.type == NCP_POSITIVE_ACK))
/* Did we get a bogus answer? */
|| ( (len < sizeof(reply))
|| (reply.type != NCP_REPLY)
|| ( (request.type != NCP_ALLOC_SLOT_REQUEST)
&& ( (reply.sequence != request.sequence)
|| (reply.conn_low != request.conn_low)
|| (reply.conn_high != request.conn_high)))))
{
/* Then throw away the packet */
ipx_recv(conn->ncp_sock, (char *)&reply, sizeof(reply),
0, 1, &err);
goto re_select;
}
ipx_recv(conn->ncp_sock, conn->packet, NCP_PACKET_SIZE,
0, 1, &err);
conn->reply_size = len;
return 0;
}
return 0;
return ETIMEDOUT;
}
static int
@@ -578,8 +610,9 @@ ncp_mount_request(struct ncp_conn *conn, int function)
if (conn->has_subfunction != 0)
{
*(__u16 *)&(h->data[0]) = conn->current_size
- sizeof(struct ncp_request_header)- 2;
*(__u16 *)&(h->data[0])
= htons(conn->current_size
- sizeof(struct ncp_request_header) - 2);
}
request.function = function;
@@ -616,8 +649,9 @@ ncp_temp_request(struct ncp_conn *conn, int function)
if (conn->has_subfunction != 0)
{
*(__u16 *)&(h->data[0]) = conn->current_size
- sizeof(struct ncp_request_header) - 2;
*(__u16 *)&(h->data[0])
= htons(conn->current_size
- sizeof(struct ncp_request_header) - 2);
}
h->type = NCP_REQUEST;
@@ -753,9 +787,10 @@ ncp_connect_any(struct ncp_conn *conn, int wdog_needed)
char name[NCP_BINDERY_NAME_LEN];
long result;
if (ipx_sap_find_nearest(IPX_SAP_FILE_SERVER, &addr, name) != 0)
if ((result = ipx_sap_find_nearest(IPX_SAP_FILE_SERVER,
&addr, name)) != 0)
{
return -1;
return result;
}
if ((result = ncp_connect_addr(conn, &addr, wdog_needed)) != 0)
@@ -1114,6 +1149,11 @@ long
ncp_close(struct ncp_conn *conn)
{
long result;
if (conn == NULL)
{
return 0;
}
if ((result = ncp_do_close(conn)) != 0)
{
return result;
@@ -1257,7 +1297,7 @@ ncp_get_nwc_ent(FILE *nwc)
}
FILE *
ncp_fopen_nwc(const char *user, const char *mode)
ncp_fopen_nwc(const char *user, const char *mode, long *err)
{
char path[MAXPATHLEN];
char *home = NULL;
@@ -1285,7 +1325,7 @@ ncp_fopen_nwc(const char *user, const char *mode)
if ( (home == NULL)
|| (strlen(home) + sizeof(NWCLIENT) + 2 > sizeof(path)))
{
errno = ENAMETOOLONG;
*err = ENAMETOOLONG;
return NULL;
}
@@ -1295,12 +1335,13 @@ ncp_fopen_nwc(const char *user, const char *mode)
if (stat(path, &st) != 0)
{
*err = errno;
return NULL;
}
if ((st.st_mode & (S_IRWXO | S_IRWXG)) != 0)
{
errno = EINVAL;
*err = NCPL_ET_INVALID_MODE;
return NULL;
}
@@ -1310,7 +1351,7 @@ ncp_fopen_nwc(const char *user, const char *mode)
struct ncp_conn_spec *
ncp_find_conn_spec(const char *server, const char *user, const char *password,
uid_t uid, long *err)
int login_necessary, uid_t uid, long *err)
{
static struct ncp_conn_spec spec;
@@ -1336,11 +1377,9 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
}
else
{
nwc = ncp_fopen_nwc(NULL, NULL);
if (nwc == NULL)
if ((nwc = ncp_fopen_nwc(NULL, NULL, err)) == NULL)
{
*err = NCPL_ET_NO_SPEC;
*err = NCPL_ET_NO_SERVER;
return NULL;
}
@@ -1356,6 +1395,15 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
strcpy(spec.user, nwc_ent->user);
}
str_upper(spec.server);
if (login_necessary == 0)
{
memset(spec.user, 0, sizeof(spec.user));
memset(spec.password, 0, sizeof(spec.password));
return &spec;
}
if (user != NULL)
{
if (strlen(user) >= sizeof(spec.user))
@@ -1366,7 +1414,6 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
strcpy(spec.user, user);
}
str_upper(spec.server);
str_upper(spec.user);
spec.login_type = NCP_BINDERY_USER;
@@ -1387,7 +1434,7 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
}
else
{
if ((nwc = ncp_fopen_nwc(NULL, NULL)) != NULL)
if ((nwc = ncp_fopen_nwc(NULL, NULL, err)) != NULL)
{
while ((nwc_ent = ncp_get_nwc_ent(nwc)) != NULL)
{
@@ -1409,7 +1456,8 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
if (strlen(spec.user) == 0)
{
return &spec;
*err = NCPL_ET_NO_USER;
return NULL;
}
if ((strlen(spec.password) == 0) && (password == NULL))
@@ -1524,7 +1572,8 @@ ncp_initialize_as(int *argc, char **argv,
i += 1;
}
spec = ncp_find_conn_spec(server, user, password, getuid(), err);
spec = ncp_find_conn_spec(server, user, password, login_necessary,
getuid(), err);
if (spec == NULL)
{
@@ -1775,6 +1824,31 @@ ncp_get_file_server_time(struct ncp_conn *conn, time_t *target)
return 0;
}
long
ncp_get_file_server_information(struct ncp_conn *conn,
struct ncp_file_server_info *target)
{
long result;
ncp_init_request_s(conn, 17);
if ((result = ncp_request(conn, 23)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
memcpy(target, ncp_reply_data(conn, 0), sizeof(*target));
target->MaximumServiceConnections
= htons(target->MaximumServiceConnections);
target->ConnectionsInUse
= htons(target->ConnectionsInUse);
target->MaxConnectionsEverUsed
= htons(target->MaxConnectionsEverUsed);
target->NumberMountedVolumes
= htons(target->NumberMountedVolumes);
ncp_unlock_conn(conn);
return 0;
}
long
ncp_get_connlist(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
@@ -1798,6 +1872,57 @@ ncp_get_connlist(struct ncp_conn *conn,
return 0;
}
long
ncp_get_stations_logged_info(struct ncp_conn *conn,
__u32 connection,
struct ncp_bindery_object *target,
time_t *login_time)
{
long result;
ncp_init_request_s(conn, 28);
ncp_add_dword(conn, connection);
if ((result = ncp_request(conn, 23)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
memset(target, 0, sizeof(*target));
target->object_id = ntohl(ncp_reply_dword(conn, 0));
target->object_type = ntohs(ncp_reply_word(conn, 4));
memcpy(target->object_name, ncp_reply_data(conn, 6),
sizeof(target->object_name));
*login_time = nw_to_ctime((struct nw_time_buffer *)
ncp_reply_data(conn, 54));
ncp_unlock_conn(conn);
return 0;
}
long
ncp_get_internet_address(struct ncp_conn *conn,
__u32 connection,
struct sockaddr_ipx *target,
__u8 *conn_type)
{
long result;
ncp_init_request_s(conn, 26);
ncp_add_dword(conn, connection);
if ((result = ncp_request(conn, 23)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
memset(target, 0, sizeof(*target));
target->sipx_network = ncp_reply_dword(conn, 0);
memcpy(&(target->sipx_node), ncp_reply_data(conn, 4), 6);
target->sipx_port = ncp_reply_word(conn, 10);
*conn_type = ncp_reply_byte(conn, 12);
ncp_unlock_conn(conn);
return 0;
}
long
ncp_send_broadcast(struct ncp_conn *conn,
__u8 no_conn, const __u8 *connections,
@@ -1821,7 +1946,7 @@ ncp_send_broadcast(struct ncp_conn *conn,
}
/*
* result is a 8-byte buffer
* target is a 8-byte buffer
*/
long
ncp_get_encryption_key(struct ncp_conn *conn,
@@ -1878,6 +2003,27 @@ ncp_get_bindery_object_id(struct ncp_conn *conn,
return 0;
}
long
ncp_get_bindery_object_name(struct ncp_conn *conn,
__u32 object_id,
struct ncp_bindery_object *target)
{
long result;
ncp_init_request_s(conn, 54);
ncp_add_dword(conn, htonl(object_id));
if ((result = ncp_request(conn, 23)) != 0) {
ncp_unlock_conn(conn);
return result;
}
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), 48);
ncp_unlock_conn(conn);
return 0;
}
long
ncp_scan_bindery_object(struct ncp_conn *conn,
__u32 last_id, __u16 object_type, char *search_string,
@@ -1906,6 +2052,40 @@ ncp_scan_bindery_object(struct ncp_conn *conn,
return 0;
}
long
ncp_create_bindery_object(struct ncp_conn *conn,
__u16 object_type,
const char *object_name,
__u8 object_security,
__u8 object_status)
{
long result;
ncp_init_request_s(conn, 50);
ncp_add_byte(conn, object_status);
ncp_add_byte(conn, object_security);
ncp_add_word(conn, htons(object_type));
ncp_add_pstring(conn, object_name);
result = ncp_request(conn, 23);
ncp_unlock_conn(conn);
return result;
}
long
ncp_delete_bindery_object(struct ncp_conn *conn,
__u16 object_type,
const char *object_name)
{
long result;
ncp_init_request_s(conn, 51);
ncp_add_word(conn, htons(object_type));
ncp_add_pstring(conn, object_name);
result = ncp_request(conn, 23);
ncp_unlock_conn(conn);
return result;
}
long
ncp_read_property_value(struct ncp_conn *conn,
@@ -1932,6 +2112,149 @@ ncp_read_property_value(struct ncp_conn *conn,
return 0;
}
long
ncp_scan_property(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
__u32 last_id, char *search_string,
struct ncp_property_info *property_info)
{
long result;
ncp_init_request_s(conn, 60);
ncp_add_word(conn, htons(object_type));
ncp_add_pstring(conn, object_name);
ncp_add_dword(conn, htonl(last_id));
ncp_add_pstring(conn, search_string);
if ((result = ncp_request(conn, 23)) != 0) {
ncp_unlock_conn(conn);
return result;
}
memcpy(property_info->property_name,ncp_reply_data(conn, 0), 16);
property_info->property_flags = ncp_reply_byte(conn,16);
property_info->property_security = ncp_reply_byte(conn,17);
property_info->search_instance = ntohl(ncp_reply_dword(conn,18));
property_info->value_available_flag = ncp_reply_byte(conn,22);
property_info->more_properties_flag = ncp_reply_byte(conn,23);
ncp_unlock_conn(conn);
return 0;
}
long
ncp_add_object_to_set(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const char *property_name,
__u16 member_type,
const char *member_name)
{
long result;
ncp_init_request_s(conn, 65);
ncp_add_word(conn, htons(object_type));
ncp_add_pstring(conn, object_name);
ncp_add_pstring(conn, property_name);
ncp_add_word(conn, htons(member_type));
ncp_add_pstring(conn, member_name);
result = ncp_request(conn, 23);
ncp_unlock_conn(conn);
return result;
}
long
ncp_change_property_security(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const char *property_name,
__u8 property_security)
{
long result;
ncp_init_request_s(conn, 59);
ncp_add_word(conn, htons(object_type));
ncp_add_pstring(conn, object_name);
ncp_add_byte(conn, property_security);
ncp_add_pstring(conn, property_name);
result = ncp_request(conn, 23);
ncp_unlock_conn(conn);
return result;
}
long
ncp_create_property(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const char *property_name,
__u8 property_flags, __u8 property_security)
{
long result;
ncp_init_request_s(conn, 57);
ncp_add_word(conn, htons(object_type));
ncp_add_pstring(conn, object_name);
ncp_add_byte(conn, property_flags);
ncp_add_byte(conn, property_security);
ncp_add_pstring(conn, property_name);
result = ncp_request(conn, 23);
ncp_unlock_conn(conn);
return result;
}
long
ncp_delete_object_from_set(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const char *property_name,
__u16 member_type,
const char *member_name)
{
long result;
ncp_init_request_s(conn, 66);
ncp_add_word(conn, htons(object_type));
ncp_add_pstring(conn, object_name);
ncp_add_pstring(conn, property_name);
ncp_add_word(conn, htons(member_type));
ncp_add_pstring(conn, member_name);
result = ncp_request(conn, 23);
ncp_unlock_conn(conn);
return result;
}
long
ncp_delete_property(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const char *property_name)
{
long result;
ncp_init_request_s(conn, 58);
ncp_add_word(conn, htons(object_type));
ncp_add_pstring(conn, object_name);
ncp_add_pstring(conn, property_name);
result = ncp_request(conn, 23);
ncp_unlock_conn(conn);
return result;
}
long
ncp_write_property_value(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const char *property_name,
__u8 segment,
struct nw_property *property_value)
{
long result;
ncp_init_request_s(conn, 62);
ncp_add_word(conn, htons(object_type));
ncp_add_pstring(conn, object_name);
ncp_add_byte(conn,segment);
ncp_add_byte(conn, property_value->more_flag);
ncp_add_pstring(conn, property_name);
ncp_add_mem(conn, property_value->value, 128);
result = ncp_request(conn, 23);
ncp_unlock_conn(conn);
return result;
}
long
ncp_login_encrypted(struct ncp_conn *conn,
const struct ncp_bindery_object *object,
@@ -1956,6 +2279,58 @@ ncp_login_encrypted(struct ncp_conn *conn,
return result;
}
long
ncp_login_unencrypted(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const unsigned char *passwd)
{
long result;
ncp_init_request_s(conn, 20);
ncp_add_word(conn, htons(object_type));
ncp_add_pstring(conn, object_name);
ncp_add_pstring(conn, passwd);
result = ncp_request(conn, 23);
ncp_unlock_conn(conn);
return result;
}
long
ncp_change_login_passwd(struct ncp_conn *conn,
const struct ncp_bindery_object *object,
const unsigned char *key,
const unsigned char *oldpasswd,
const unsigned char *newpasswd)
{
long id = htonl(object->object_id);
unsigned char cryptkey[8];
unsigned char newpwd[16]; /* new passwd as stored by server */
unsigned char oldpwd[16]; /* old passwd as stored by server */
unsigned char len;
long result;
memcpy(cryptkey, key, 8);
shuffle((byte *)&id, oldpasswd, strlen(oldpasswd), oldpwd);
shuffle((byte *)&id, newpasswd, strlen(newpasswd), newpwd);
nw_encrypt(cryptkey, oldpwd, cryptkey);
newpassencrypt(oldpwd, newpwd, newpwd);
newpassencrypt(oldpwd+8, newpwd+8, newpwd+8);
if ((len = strlen(newpasswd)) > 63)
{
len = 63;
}
len = ((len ^ oldpwd[0] ^ oldpwd[1]) & 0x7f) | 0x40;
ncp_init_request_s(conn, 75);
ncp_add_mem(conn, cryptkey, 8);
ncp_add_word(conn, htons(object->object_type));
ncp_add_pstring(conn, object->object_name);
ncp_add_byte(conn, len);
ncp_add_mem(conn, newpwd, 16);
result = ncp_request(conn, 23);
ncp_unlock_conn(conn);
return result;
}
long
ncp_login_user(struct ncp_conn *conn,
const unsigned char *username,
@@ -1975,7 +2350,8 @@ ncp_login_object(struct ncp_conn *conn,
struct ncp_bindery_object user;
if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) {
return result;
return ncp_login_unencrypted(conn, login_type, username,
password);
}
if ((result = ncp_get_bindery_object_id(conn, login_type,
@@ -2338,7 +2714,42 @@ ncp_delete_directory(struct ncp_conn *conn,
ncp_unlock_conn(conn);
return result;
}
long
ncp_add_trustee(struct ncp_conn *conn,
int dir_handle, const char *path,
__u32 object_id, __u8 rights)
{
long result;
ncp_init_request_s(conn, 13);
ncp_add_byte(conn, dir_handle);
ncp_add_dword(conn, htonl(object_id));
ncp_add_byte(conn, rights);
ncp_add_pstring(conn, path);
result = ncp_request(conn, 22);
ncp_unlock_conn(conn);
return result;
}
long
ncp_delete_trustee(struct ncp_conn *conn,
int dir_handle, const char *path,__u32 object_id)
{
long result;
ncp_init_request_s(conn, 14);
ncp_add_byte(conn, dir_handle);
ncp_add_dword(conn, htonl(object_id));
ncp_add_byte(conn, 0);
ncp_add_pstring(conn, path);
result = ncp_request(conn, 22);
ncp_unlock_conn(conn);
return result;
}
long
ncp_rename_directory(struct ncp_conn *conn,
int dir_handle,
@@ -2360,7 +2771,7 @@ static void
ncp_add_handle_path(struct ncp_conn *conn,
__u8 vol_num,
__u32 dir_base, int have_dir_base,
char *path)
const char *path)
{
ncp_add_byte(conn, vol_num);
ncp_add_dword(conn, dir_base);
@@ -2393,6 +2804,33 @@ ncp_extract_file_info(void *structure, struct nw_info_struct *target)
return;
}
long
ncp_obtain_file_or_subdir_info(struct ncp_conn *conn,
__u8 source_ns, __u8 target_ns,
__u16 search_attribs, __u32 rim,
__u8 vol, __u32 dirent, const char *path,
struct nw_info_struct *target)
{
long result;
ncp_init_request(conn);
ncp_add_byte(conn, 6);
ncp_add_byte(conn, source_ns);
ncp_add_byte(conn, target_ns);
ncp_add_word(conn, search_attribs);
ncp_add_dword(conn, rim);
ncp_add_handle_path(conn, vol, dirent, 1, path);
if ((result = ncp_request(conn, 87)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
ncp_extract_file_info(ncp_reply_data(conn, 0), target);
ncp_unlock_conn(conn);
return 0;
}
long
ncp_do_lookup(struct ncp_conn *conn,
struct nw_info_struct *dir,
@@ -2581,7 +3019,7 @@ ncp_initialize_search(struct ncp_conn *conn,
return result;
}
memcpy(&(target->s), ncp_reply_data(conn, 0), sizeof(target->s));
memcpy(&(target->s), ncp_reply_data(conn, 0), 9);
target->namespace = namespace;
ncp_unlock_conn(conn);
@@ -2984,3 +3422,33 @@ ncp_alloc_short_dir_handle(struct ncp_conn *conn,
ncp_unlock_conn(conn);
return result;
}
long
ncp_add_trustee_set(struct ncp_conn *conn,
__u8 volume_number, __u32 dir_entry,
__u16 rights_mask,
int object_count, struct ncp_trustee_struct *rights)
{
long result = 0;
ncp_init_request(conn);
ncp_add_byte(conn, 10); /* subfunction */
ncp_add_byte(conn, 0); /* dos name space */
ncp_add_byte(conn, 0); /* reserved */
ncp_add_word(conn, 0x8006);
ncp_add_word(conn, rights_mask);
ncp_add_word(conn, object_count);
ncp_add_handle_path(conn, volume_number, dir_entry, 1, NULL);
while (object_count > 0)
{
ncp_add_dword(conn, htonl(rights->object_id));
ncp_add_word(conn, rights->rights);
object_count -= 1;
rights += 1;
}
result = ncp_request(conn, 87);
ncp_unlock_conn(conn);
return result;
}

View File

@@ -79,6 +79,15 @@ struct ncp_search_seq {
int namespace;
};
struct ncp_property_info {
__u8 property_name[16];
__u8 property_flags;
__u8 property_security;
__u32 search_instance;
__u8 value_available_flag;
__u8 more_properties_flag;
};
/* ncp_initialize is the main entry point for user programs which want
to connect to a NetWare Server. It looks for -S, -U, -P and -n in
the argument list, opens the connection and removes the arguments
@@ -95,7 +104,7 @@ ncp_initialize_as(int *argc, char **argv,
int login_necessary, int login_type, long *err);
/* Open an existing permanent connection */
/* Open a connection */
struct ncp_conn *
ncp_open(const struct ncp_conn_spec *spec, long *err);
@@ -137,7 +146,7 @@ ncp_get_conn_ent(FILE *filep);
struct ncp_conn_spec *
ncp_find_conn_spec(const char *server, const char *user, const char *password,
uid_t uid, long *err);
int login_necessary, uid_t uid, long *err);
long
ncp_get_file_server_description_strings(struct ncp_conn *conn,
@@ -146,11 +155,48 @@ ncp_get_file_server_description_strings(struct ncp_conn *conn,
long
ncp_get_file_server_time(struct ncp_conn *conn, time_t *target);
struct ncp_file_server_info {
__u8 ServerName[48] __attribute__ ((packed));
__u8 FileServiceVersion __attribute__ ((packed));
__u8 FileServiceSubVersion __attribute__ ((packed));
__u16 MaximumServiceConnections __attribute__ ((packed));
__u16 ConnectionsInUse __attribute__ ((packed));
__u16 NumberMountedVolumes __attribute__ ((packed));
__u8 Revision __attribute__ ((packed));
__u8 SFTLevel __attribute__ ((packed));
__u8 TTSLevel __attribute__ ((packed));
__u16 MaxConnectionsEverUsed __attribute__ ((packed));
__u8 AccountVersion __attribute__ ((packed));
__u8 VAPVersion __attribute__ ((packed));
__u8 QueueVersion __attribute__ ((packed));
__u8 PrintVersion __attribute__ ((packed));
__u8 VirtualConsoleVersion __attribute__ ((packed));
__u8 RestrictionLevel __attribute__ ((packed));
__u8 InternetBridge __attribute__ ((packed));
__u8 Reserved[60] __attribute__ ((packed));
};
long
ncp_get_file_server_information(struct ncp_conn *conn,
struct ncp_file_server_info *target);
long
ncp_get_connlist(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
int *returned_no, __u8 conn_numbers[256]);
long
ncp_get_stations_logged_info(struct ncp_conn *conn,
__u32 connection,
struct ncp_bindery_object *target,
time_t *login_time);
long
ncp_get_internet_address(struct ncp_conn *conn,
__u32 connection,
struct sockaddr_ipx *target,
__u8 *conn_type);
long
ncp_send_broadcast(struct ncp_conn *conn,
__u8 no_conn, const __u8 *connections,
@@ -165,9 +211,29 @@ ncp_get_bindery_object_id(struct ncp_conn *conn,
const char *object_name,
struct ncp_bindery_object *target);
long
ncp_get_bindery_object_name(struct ncp_conn *conn,
__u32 object_id,
struct ncp_bindery_object *target);
long
ncp_scan_bindery_object(struct ncp_conn *conn,
__u32 last_id, __u16 object_type, char *search_string,
struct ncp_bindery_object *target);
long
ncp_create_bindery_object(struct ncp_conn *conn,
__u16 object_type,
const char *object_name,
__u8 object_security,
__u8 object_status);
long
ncp_delete_bindery_object(struct ncp_conn *conn,
__u16 object_type,
const char *object_name);
long
ncp_change_object_security(struct ncp_conn *conn,
__u16 object_type,
const char *object_name,
__u8 security);
struct ncp_prop_login_control {
__u8 AccountExpireDate[3] __attribute__ ((packed));
@@ -194,11 +260,60 @@ ncp_read_property_value(struct ncp_conn *conn,
int segment, const char *prop_name,
struct nw_property *target);
long
ncp_scan_property(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
__u32 last_id, char *search_string,
struct ncp_property_info *property_info);
long
ncp_add_object_to_set(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const char *property_name,
__u16 member_type,
const char *member_name);
long
ncp_change_property_security(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const char *property_name,
__u8 property_security);
long
ncp_create_property(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const char *property_name,
__u8 property_flags, __u8 property_security);
long
ncp_delete_object_from_set(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const char *property_name,
__u16 member_type,
const char *member_name);
long
ncp_delete_property(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const char *property_name);
long
ncp_write_property_value(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const char *property_name,
__u8 segment,
struct nw_property *property_value);
long
ncp_login_encrypted(struct ncp_conn *conn,
const struct ncp_bindery_object *object,
const unsigned char *key,
const unsigned char *passwd);
long
ncp_login_unencrypted(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const unsigned char *passwd);
long
ncp_change_login_passwd(struct ncp_conn *conn,
const struct ncp_bindery_object *object,
const unsigned char *key,
const unsigned char *oldpasswd,
const unsigned char *newpasswd);
#define NCP_GRACE_PERIOD (0xdf)
long
@@ -274,6 +389,15 @@ ncp_rename_directory(struct ncp_conn *conn,
int dir_handle,
const char *old_path, const char *new_path);
long
ncp_add_trustee(struct ncp_conn *conn,
int dir_handle, const char *path,
__u32 object_id, __u8 rights);
long
ncp_delete_trustee(struct ncp_conn *conn,
int dir_handle, const char *path, __u32 object_id);
long
ncp_read(struct ncp_conn *conn, const char *file_id,
off_t offset, size_t count, char *target);
@@ -291,6 +415,14 @@ ncp_copy_file(struct ncp_conn *conn,
__u32 count,
__u32 *copied_count);
long
ncp_obtain_file_or_subdir_info(struct ncp_conn *conn,
__u8 source_ns, __u8 target_ns,
__u16 search_attribs, __u32 rim,
__u8 vol, __u32 dirent, const char *path,
struct nw_info_struct *target);
long
ncp_do_lookup(struct ncp_conn *conn,
struct nw_info_struct *dir,
@@ -378,4 +510,22 @@ ncp_alloc_short_dir_handle(struct ncp_conn *conn,
__u16 alloc_mode,
__u8 *target);
long
ncp_get_effective_dir_rights(struct ncp_conn *conn,
struct nw_info_struct *file,
__u16 *target);
struct ncp_trustee_struct
{
__u32 object_id;
__u16 rights;
};
long
ncp_add_trustee_set(struct ncp_conn *conn,
__u8 volume_number, __u32 dir_entry,
__u16 rights_mask,
int object_count, struct ncp_trustee_struct *rights);
#endif /* _NCPLIB_H */

View File

@@ -3,6 +3,9 @@ error_table NCPL
ec NCPL_ET_NO_SERVER,
"No server found"
ec NCPL_ET_NO_USER,
"No username found"
ec NCPL_ET_HOST_UNKNOWN,
"Server Unknown"
@@ -18,4 +21,22 @@ ec NCPL_ET_MSG_TOO_LONG,
ec NCPL_ET_NO_SPEC,
"Could not find valid connection spec"
ec NCPL_ET_INVALID_MODE,
"$HOME/.nwclient has invalid mode, must be 600"
ec NCPL_ET_LOGIN_DENIED,
"Login denied"
ec NCPL_ET_NO_INTERFACE,
"No primary IPX interface found"
ec NCPL_ET_NO_PASSWORD,
"Could not get password"
ec NCPL_ET_PWD_TOO_LONG,
"Password too long"
ec NCPL_ET_NO_IPX,
"Could not alloc IPX socket. Probably no IPX support in kernel."
end

View File

@@ -10,7 +10,7 @@
* a conditional which leaves out the test and load code.
*
* Even if we _do_ want ncpmount to load the module, passing a
* fully-qualified pathname to insmod causes it to bypass a
* fully-qualified pathname to modprobe causes it to bypass a
* path search. This may lead to ncpfs.o not being found on
* some systems.
*/
@@ -102,7 +102,7 @@ load_ncpfs(void)
else if (pid == 0)
{
/* child */
execl("/sbin/insmod", "insmod", "ncpfs", NULL);
execl("/sbin/modprobe", "modprobe", "ncpfs", NULL);
_exit(127); /* execl error */
}
else
@@ -201,7 +201,7 @@ main(int argc, char *argv[])
upcase_password = 1;
while ((opt = getopt (argc, argv, "CS:U:c:u:g:f:d:P:nhvV:t:r:"))
while ((opt = getopt (argc, argv, "CS:U:c:u:g:f:d:P:nh?vV:t:r:"))
!= EOF)
{
switch (opt)
@@ -310,6 +310,7 @@ main(int argc, char *argv[])
data.retry_count = atoi(optarg);
break;
case 'h':
case '?':
help();
exit(1);
case 'v':
@@ -321,7 +322,7 @@ main(int argc, char *argv[])
}
}
if ((spec = ncp_find_conn_spec(server, user, password, data.uid, &err))
if ((spec = ncp_find_conn_spec(server,user,password,1, data.uid, &err))
== NULL)
{
com_err(progname, err, "in find_conn_spec");

View File

@@ -106,7 +106,82 @@ test_create(struct ncp_conn *conn)
return;
}
}
int
test_change(struct ncp_conn *conn)
{
long result;
unsigned char ncp_key[8];
struct ncp_bindery_object user;
if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) {
return result;
}
if ((result = ncp_get_bindery_object_id(conn, 1,
"ME", &user)) != 0) {
return result;
}
if ((result = ncp_change_login_passwd(conn, &user, ncp_key,
"MEE", "ME")) != 0)
{
return result;
}
return 0;
}
void
test_readdir(struct ncp_conn *conn)
{
struct nw_info_struct sys;
struct nw_info_struct blub;
struct ncp_search_seq seq;
struct nw_info_struct entry;
if (ncp_do_lookup(conn, NULL, "SYS", &sys) != 0)
{
printf("lookup error\n");
return;
}
if (ncp_do_lookup(conn, &sys, "BLUB", &blub) != 0)
{
printf("lookup blub error\n");
return;
}
if (ncp_initialize_search(conn, &sys, 0, &seq) != 0)
{
printf("init error\n");
return;
}
while (ncp_search_for_file_or_subdir(conn, &seq, &entry) == 0)
{
struct nw_info_struct nfs;
printf("found: %s\n", entry.entryName);
if (ncp_obtain_file_or_subdir_info(conn, NW_NS_DOS, NW_NS_NFS,
0x8006, RIM_ALL,
entry.volNumber,
entry.DosDirNum,
NULL,
&nfs) == 0)
{
printf("nfs name: %s\n", nfs.entryName);
}
if (ncp_obtain_file_or_subdir_info(conn, NW_NS_DOS, NW_NS_OS2,
0x8006, RIM_ALL,
entry.volNumber,
entry.DosDirNum,
NULL,
&nfs) == 0)
{
printf("os2 name: %s\n", nfs.entryName);
}
}
}
int
main(int argc, char *argv[])
@@ -120,7 +195,7 @@ main(int argc, char *argv[])
return 1;
}
test_send(conn);
test_readdir(conn);
ncp_close(conn);
return 0;
}

145
util/npasswd.c Normal file
View File

@@ -0,0 +1,145 @@
/*
* npasswd.c
*
* Change a bindery object's password
*
* Copyright (C) 1996 by Volker Lendecke
*
*/
#include "ncplib.h"
#include <unistd.h>
#include <stdlib.h>
static char *progname;
static void
usage(void)
{
fprintf(stderr, "usage: %s [options]\n", progname);
}
static void
help(void)
{
printf("\n");
printf("usage: %s [options]\n", progname);
printf("\n"
"-h Print this help text\n"
"-S server Server name to be used\n"
"-U username Username sent to server\n"
"-t type Object type (decimal value)\n"
"\n");
}
int
main(int argc, char *argv[])
{
struct ncp_conn_spec *spec;
struct ncp_conn *conn;
char *server = NULL;
char *object_name = NULL;
int object_type = NCP_BINDERY_USER;
unsigned char ncp_key[8];
struct ncp_bindery_object user;
long err;
char *str;
char oldpass[200], newpass1[200], newpass2[200];
int opt;
progname = argv[0];
while ((opt = getopt(argc, argv, "h?S:U:t:")) != EOF)
{
switch(opt) {
case 'S':
server = optarg;
break;
case 'U':
object_name = optarg;
break;
case 't':
object_type = atoi(optarg);
break;
case 'h':
case '?':
help();
exit(1);
default:
usage();
exit(1);
}
}
spec = ncp_find_conn_spec(server, object_name, "",
1, getuid(), &err);
if (spec == NULL)
{
com_err(argv[0], err, "trying to find server");
exit(1);
}
spec->login_type = object_type;
printf("Changing password for user %s on server %s\n",
spec->user, spec->server);
str = getpass("Enter old password: ");
if (strlen(str) >= sizeof(oldpass))
{
printf("Password too long\n");
exit(1);
}
strcpy(oldpass, str);
str = getpass("Enter new password: ");
if (strlen(str) >= sizeof(newpass1))
{
printf("Password too long\n");
exit(1);
}
strcpy(newpass1, str);
str = getpass("Re-Enter new password: ");
if (strlen(str) >= sizeof(newpass2))
{
printf("Password too long\n");
exit(1);
}
strcpy(newpass2, str);
str_upper(oldpass);
str_upper(newpass1);
str_upper(newpass2);
if (strcmp(newpass1, newpass2) != 0)
{
printf("You mistype the new password, try again\n");
exit(1);
}
strcpy(spec->password, oldpass);
if ((conn = ncp_open(spec, &err)) == NULL)
{
com_err(argv[0], err, "when trying to open connection");
exit(1);
}
if ( ((err = ncp_get_encryption_key(conn, ncp_key)) != 0)
|| ((err = ncp_get_bindery_object_id(conn, 1, spec->user,
&user)) != 0)
|| ((err = ncp_change_login_passwd(conn, &user, ncp_key,
oldpass, newpass1)) != 0))
{
com_err(argv[0], err, "trying to change password");
}
ncp_close(conn);
return 0;
}

View File

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

View File

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

161
util/nwbocreate.c Normal file
View File

@@ -0,0 +1,161 @@
/*
* nwbocreate.c
*
* Create a bindery object on a NetWare server
*
* Copyright (C) 1996 by Volker Lendecke
*
*/
#include "ncplib.h"
#include <unistd.h>
#include <stdlib.h>
static char *progname;
static void
usage(void)
{
fprintf(stderr, "usage: %s [options]\n", progname);
}
static void
help(void)
{
printf("\n");
printf("usage: %s [options]\n", progname);
printf("\n"
"-h Print this help text\n"
"-S server Server name to be used\n"
"-U username Username sent to server\n"
"-P password Use this password\n"
"-n Do not use any password\n"
"-C Don't convert password to uppercase\n"
"\n"
"-o object_name Name of created object\n"
"-t type Object type (decimal value)\n"
"-r read-flag Read security\n"
"-w write-flag Write security\n"
"\n");
}
static int
parse_security(const char *security)
{
if (strcasecmp(security, "anyone") == 0)
{
return 0;
}
if (strcasecmp(security, "logged") == 0)
{
return 1;
}
if (strcasecmp(security, "object") == 0)
{
return 2;
}
if (strcasecmp(security, "supervisor") == 0)
{
return 3;
}
if (strcasecmp(security, "netware") == 0)
{
return 4;
}
return -1;
}
int
main(int argc, char *argv[])
{
struct ncp_conn *conn;
char *object_name = NULL;
int object_type = -1;
long err;
int read_sec = 1; /* logged read */
int write_sec = 3; /* supervisor write */
int result = 1;
int opt;
progname = argv[0];
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{
com_err(argv[0], err, "when initializing");
goto finished;
}
while ((opt = getopt(argc, argv, "h?o:t:r:w:")) != EOF)
{
switch(opt) {
case 'o':
object_name = optarg;
str_upper(object_name);
break;
case 't':
object_type = atoi(optarg);
break;
case 'r':
read_sec = parse_security(optarg);
if (read_sec < 0)
{
fprintf(stderr,
"%s: Wrong read security\n"
"Must be one of anyone, logged, "
"object, supervisor or netware\n",
argv[0]);
goto finished;
}
break;
case 'w':
write_sec = parse_security(optarg);
if (write_sec < 0)
{
fprintf(stderr,
"%s: Wrong write security\n"
"Must be one of anyone, logged, "
"object, supervisor or netware\n",
argv[0]);
goto finished;
}
break;
case 'h':
case '?':
help();
goto finished;
default:
usage();
goto finished;
}
}
if (object_type < 0)
{
fprintf(stderr, "%s: You must specify an object type\n",
argv[0]);
goto finished;
}
if (object_name == NULL)
{
fprintf(stderr, "%s: You must specify an object name\n",
argv[0]);
goto finished;
}
if (ncp_create_bindery_object(conn, object_type, object_name,
(write_sec << 4) + read_sec, 0) != 0)
{
fprintf(stderr, "%s: Could not create the object\n", argv[0]);
}
else
{
result = 0;
}
finished:
ncp_close(conn);
return result;
}

125
util/nwbols.c Normal file
View 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
View File

@@ -0,0 +1,121 @@
/*
* nwboprops.c
*
* List properties of a bindery object
*
* Copyright (C) 1996 by Volker Lendecke
*
*/
#include "ncplib.h"
#include <unistd.h>
#include <stdlib.h>
static char *progname;
static void
usage(void)
{
fprintf(stderr, "usage: %s [options]\n", progname);
}
static void
help(void)
{
printf("\n");
printf("usage: %s [options]\n", progname);
printf("\n"
"-h Print this help text\n"
"-S server Server name to be used\n"
"-U username Username sent to server\n"
"-P password Use this password\n"
"-n Do not use any password\n"
"-C Don't convert password to uppercase\n"
"\n"
"-o object_name Name of object inspected\n"
"-t type Object type (decimal value)\n"
"-v Verbose listing\n"
"\n");
}
int
main(int argc, char *argv[])
{
struct ncp_conn *conn;
char *object_name = NULL;
int object_type = -1;
long err;
struct ncp_property_info info;
int result = 1;
int verbose = 0;
int opt;
progname = argv[0];
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{
com_err(argv[0], err, "when initializing");
goto finished;
}
while ((opt = getopt(argc, argv, "h?o:t:v")) != EOF)
{
switch(opt) {
case 'o':
object_name = optarg;
str_upper(object_name);
break;
case 't':
object_type = atoi(optarg);
break;
case 'v':
verbose = 1;
break;
case 'h':
case '?':
help();
goto finished;
default:
usage();
goto finished;
}
}
if (object_type < 0)
{
fprintf(stderr, "%s: You must specify an object type\n",
argv[0]);
goto finished;
}
if (object_name == NULL)
{
fprintf(stderr, "%s: You must specify an object name\n",
argv[0]);
goto finished;
}
info.search_instance = 0xffffffff;
while (ncp_scan_property(conn, object_type, object_name,
info.search_instance, "*", &info) == 0)
{
if (verbose != 0)
{
printf("%s %d %02x %d\n",
info.property_name, info.property_flags,
info.property_security,
info.value_available_flag);
}
else
{
printf("%s\n", info.property_name);
}
}
finished:
ncp_close(conn);
return result;
}

106
util/nwborm.c Normal file
View File

@@ -0,0 +1,106 @@
/*
* nwborm.c
*
* Destroy a bindery object on a NetWare server
*
* Copyright (C) 1996 by Volker Lendecke
*
*/
#include "ncplib.h"
#include <unistd.h>
#include <stdlib.h>
static char *progname;
static void
usage(void)
{
fprintf(stderr, "usage: %s [options]\n", progname);
}
static void
help(void)
{
printf("\n");
printf("usage: %s [options]\n", progname);
printf("\n"
"-h Print this help text\n"
"-S server Server name to be used\n"
"-U username Username sent to server\n"
"-P password Use this password\n"
"-n Do not use any password\n"
"-C Don't convert password to uppercase\n"
"\n"
"-o object_name Name of object to be removed\n"
"-t type Object type (decimal value)\n"
"\n");
}
int
main(int argc, char *argv[])
{
struct ncp_conn *conn;
char *object_name = NULL;
int object_type = -1;
long err;
int result = 1;
int opt;
progname = argv[0];
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{
com_err(argv[0], err, "when initializing");
goto finished;
}
while ((opt = getopt(argc, argv, "h?o:t:")) != EOF)
{
switch(opt) {
case 'o':
object_name = optarg;
str_upper(object_name);
break;
case 't':
object_type = atoi(optarg);
break;
case 'h':
case '?':
help();
goto finished;
default:
usage();
goto finished;
}
}
if (object_type < 0)
{
fprintf(stderr, "%s: You must specify an object type\n",
argv[0]);
goto finished;
}
if (object_name == NULL)
{
fprintf(stderr, "%s: You must specify an object name\n",
argv[0]);
goto finished;
}
if (ncp_delete_bindery_object(conn, object_type, object_name) != 0)
{
fprintf(stderr, "%s: Could not delete the object\n", argv[0]);
}
else
{
result = 0;
}
finished:
ncp_close(conn);
return result;
}

247
util/nwbpadd.c Normal file
View File

@@ -0,0 +1,247 @@
/*
* nwbpadd.c
*
* Set the contents of a SET property of a bindery object on a NetWare server
*
* Copyright (C) 1996 by Volker Lendecke
*
*/
#include "ncplib.h"
#include <unistd.h>
#include <stdlib.h>
static char *progname;
static void
usage(void)
{
fprintf(stderr, "usage: %s [options]\n", progname);
}
static void
help(void)
{
printf("\n");
printf("usage: %s [options] [values]\n", progname);
printf("\n"
"-h Print this help text\n"
"-S server Server name to be used\n"
"-U username Username sent to server\n"
"-P password Use this password\n"
"-n Do not use any password\n"
"-C Don't convert password to uppercase\n"
"\n"
"-o object_name Name of accessed object\n"
"-t type Object type (decimal value)\n"
"-p property Name of property to be touched\n"
"value value to be added\n"
"\n"
"If property is of type SET, value is an object id (hex)\n"
"Otherwise, value is either a string value to be written, or\n"
"a count of bytes to be written. The latter is assumed if\n"
"more than one value argument is given. The count is decimal,\n"
"and the following arguments are interpreted as bytes in\n"
"hexadecimal notation.\n"
"\n");
}
int
main(int argc, char *argv[])
{
struct ncp_conn *conn;
char *object_name = NULL;
int object_type = -1;
char *property_name = NULL;
char *value = NULL;
struct ncp_property_info info;
long err;
int result = 1;
int opt;
progname = argv[0];
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{
com_err(argv[0], err, "when initializing");
goto finished;
}
while ((opt = getopt(argc, argv, "h?o:t:p:v:")) != EOF)
{
switch(opt) {
case 'o':
object_name = optarg;
str_upper(object_name);
break;
case 't':
object_type = atoi(optarg);
break;
case 'p':
property_name = optarg;
if (strlen(property_name) > 15)
{
fprintf(stderr, "%s: Property Name too long\n",
argv[0]);
exit(1);
}
str_upper(property_name);
break;
case 'v':
value = optarg;
break;
case 'h':
case '?':
help();
goto finished;
default:
usage();
goto finished;
}
}
if (object_type < 0)
{
fprintf(stderr, "%s: You must specify an object type\n",
argv[0]);
goto finished;
}
if (object_name == NULL)
{
fprintf(stderr, "%s: You must specify an object name\n",
argv[0]);
goto finished;
}
if (property_name == NULL)
{
fprintf(stderr, "%s: You must specify a property name\n",
argv[0]);
goto finished;
}
if (optind > argc-1)
{
fprintf(stderr, "%s: You must specify a property value\n",
argv[0]);
goto finished;
}
value = argv[optind];
optind += 1;
if (ncp_scan_property(conn, object_type, object_name,
0xffffffff, property_name, &info) != 0)
{
fprintf(stderr, "%s: Could not find property\n", argv[0]);
goto finished;
}
if ((info.property_flags & 2) != 0)
{
/* Property is of type SET */
struct ncp_bindery_object o;
if (optind != argc)
{
fprintf(stderr, "%s: For the SET property %s, you must"
" specify an object id as value\n",
progname, property_name);
goto finished;
}
if (ncp_get_bindery_object_name(conn,
ntohl(strtol(value, NULL, 16)),
&o) != 0)
{
fprintf(stderr, "%s: %s is not a valid object id\n",
progname, value);
goto finished;
}
if (ncp_add_object_to_set(conn, object_type, object_name,
property_name,
o.object_type, o.object_name) != 0)
{
fprintf(stderr, "%s: could not add object %s\n",
progname, o.object_name);
goto finished;
}
}
else
{
/* Property is of type ITEM */
char contents[255*128];
int segno = 1;
int length;
memset(contents, 0, sizeof(contents));
if (optind == argc)
{
/* value is the string to add */
length = strlen(value);
if (length >= sizeof(contents))
{
fprintf(stderr, "%s: Value too long\n",
progname);
goto finished;
}
strcpy(contents, value);
}
else
{
/* value is the byte count */
int i;
length = atoi(value);
if (length >= sizeof(contents))
{
fprintf(stderr, "%s: Value too long\n",
progname);
goto finished;
}
if (optind != argc - length)
{
fprintf(stderr, "%s: Byte count does not match"
" number of bytes\n", progname);
goto finished;
}
i = 0;
while (optind < argc)
{
contents[i] = strtol(argv[optind], NULL, 16);
i += 1;
optind += 1;
}
}
for (segno = 1; segno <= 255; segno++)
{
struct nw_property segment;
int offset = (segno-1)*128;
if ( offset > length )
{
/* everything written */
break;
}
memcpy(segment.value, &(contents[offset]), 128);
segment.more_flag = segno*128 < length;
if (ncp_write_property_value(conn, object_type,
object_name,
property_name,
segno, &segment) != 0)
{
fprintf(stderr, "%s: Could not write "
"property\n", progname);
goto finished;
}
}
}
result = 0;
finished:
ncp_close(conn);
return result;
}

187
util/nwbpcreate.c Normal file
View File

@@ -0,0 +1,187 @@
/*
* nwbpcreate.c
*
* Create a property for a bindery object on a NetWare server
*
* Copyright (C) 1996 by Volker Lendecke
*
*/
#include "ncplib.h"
#include <unistd.h>
#include <stdlib.h>
static char *progname;
static void
usage(void)
{
fprintf(stderr, "usage: %s [options]\n", progname);
}
static void
help(void)
{
printf("\n");
printf("usage: %s [options]\n", progname);
printf("\n"
"-h Print this help text\n"
"-S server Server name to be used\n"
"-U username Username sent to server\n"
"-P password Use this password\n"
"-n Do not use any password\n"
"-C Don't convert password to uppercase\n"
"\n"
"-o object_name Name of object\n"
"-t type Object type (decimal value)\n"
"-p property Name of property to be created\n"
"-s Property is SET, default: ITEM\n"
"-r read-flag Read security\n"
"-w write-flag Write security\n"
"\n");
}
static int
parse_security(const char *security)
{
if (strcasecmp(security, "anyone") == 0)
{
return 0;
}
if (strcasecmp(security, "logged") == 0)
{
return 1;
}
if (strcasecmp(security, "object") == 0)
{
return 2;
}
if (strcasecmp(security, "supervisor") == 0)
{
return 3;
}
if (strcasecmp(security, "netware") == 0)
{
return 4;
}
return -1;
}
int
main(int argc, char *argv[])
{
struct ncp_conn *conn;
char *object_name = NULL;
int object_type = -1;
char *property_name = NULL;
int property_is_set = 0;
long err;
int read_sec = 1; /* logged read */
int write_sec = 3; /* supervisor write */
int result = 1;
int opt;
progname = argv[0];
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{
com_err(argv[0], err, "when initializing");
goto finished;
}
while ((opt = getopt(argc, argv, "h?o:t:p:sr:w:")) != EOF)
{
switch(opt) {
case 'o':
object_name = optarg;
str_upper(object_name);
break;
case 't':
object_type = atoi(optarg);
break;
case 'p':
property_name = optarg;
if (strlen(property_name) > 15)
{
fprintf(stderr, "%s: Property Name too long\n",
argv[0]);
exit(1);
}
str_upper(property_name);
break;
case 's':
property_is_set = 1;
break;
case 'r':
read_sec = parse_security(optarg);
if (read_sec < 0)
{
fprintf(stderr,
"%s: Wrong read security\n"
"Must be one of anyone, logged, "
"object, supervisor or netware\n",
argv[0]);
goto finished;
}
break;
case 'w':
write_sec = parse_security(optarg);
if (write_sec < 0)
{
fprintf(stderr,
"%s: Wrong write security\n"
"Must be one of anyone, logged, "
"object, supervisor or netware\n",
argv[0]);
goto finished;
}
break;
case 'h':
case '?':
help();
goto finished;
default:
usage();
goto finished;
}
}
if (object_type < 0)
{
fprintf(stderr, "%s: You must specify an object type\n",
argv[0]);
goto finished;
}
if (object_name == NULL)
{
fprintf(stderr, "%s: You must specify an object name\n",
argv[0]);
goto finished;
}
if (property_name == NULL)
{
fprintf(stderr, "%s: You must specify a property name\n",
argv[0]);
goto finished;
}
if (ncp_create_property(conn, object_type, object_name,
property_name,
property_is_set ? 2 : 0,
(write_sec << 4) + read_sec) != 0)
{
fprintf(stderr, "%s: Could not create the property\n",argv[0]);
}
else
{
result = 0;
}
finished:
ncp_close(conn);
return result;
}

126
util/nwbprm.c Normal file
View File

@@ -0,0 +1,126 @@
/*
* nwbprm.c
*
* Delete a property of a bindery object on a NetWare server
*
* Copyright (C) 1996 by Volker Lendecke
*
*/
#include <unistd.h>
#include <stdlib.h>
#include "ncplib.h"
static char *progname;
static void
usage(void)
{
fprintf(stderr, "usage: %s [options] [pattern]\n", progname);
}
static void
help(void)
{
printf("\n");
printf("usage: %s [options]\n", progname);
printf("\n"
"-h Print this help text\n"
"-S server Server name to be used\n"
"-U username Username sent to server\n"
"-P password Use this password\n"
"-n Do not use any password\n"
"-C Don't convert password to uppercase\n"
"\n"
"-o object_name Name of object\n"
"-t type Object type (decimal value)\n"
"-p property Name of property to be deleted\n"
"\n");
}
int
main(int argc, char *argv[])
{
struct ncp_conn *conn;
char *object_name = NULL;
int object_type = -1;
char *property_name = NULL;
long err;
int result = 1;
int opt;
progname = argv[0];
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{
com_err(argv[0], err, "when initializing");
goto finished;
}
while ((opt = getopt(argc, argv, "h?o:t:p:")) != EOF)
{
switch(opt) {
case 'o':
object_name = optarg;
str_upper(object_name);
break;
case 't':
object_type = atoi(optarg);
break;
case 'p':
property_name = optarg;
if (strlen(property_name) > 15)
{
fprintf(stderr, "%s: Property Name too long\n",
argv[0]);
exit(1);
}
str_upper(property_name);
break;
case 'h':
case '?':
help();
goto finished;
default:
usage();
goto finished;
}
}
if (object_type < 0)
{
fprintf(stderr, "%s: You must specify an object type\n",
argv[0]);
goto finished;
}
if (object_name == NULL)
{
fprintf(stderr, "%s: You must specify an object name\n",
argv[0]);
goto finished;
}
if (property_name == NULL)
{
fprintf(stderr, "%s: You must specify a property name\n",
argv[0]);
goto finished;
}
if (ncp_delete_property(conn, object_type, object_name,
property_name) != 0)
{
fprintf(stderr, "%s: Could not delete the property\n",argv[0]);
}
else
{
result = 0;
}
finished:
ncp_close(conn);
return result;
}

262
util/nwbpvalues.c Normal file
View 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");
}
}

View File

@@ -209,3 +209,131 @@ nw_encrypt(const unsigned char *fra,
}
/*****************************************************************************/
/* */
/* The following code was contributed by */
/* Guntram Blohm <gbl%th7csun1@str.daimler-benz.com> */
/* */
/*****************************************************************************/
/* server side (mars etc.) should:
* store the *encrypted* password internally (output from shuffle)
* verify if nw_encrypt(cryptkey from GetCryptKey, old stored password)
== cryptkey in EncryptedChangePassword request buffer (this means
old password was correct)
* decrypt new password in request buffer using (yet to write) inverse of
newpassencrypt with old stored password as parameter
* compute the length of the unencrypted new password as len ^ (first byte of
old internal password) ^ (second byte of old internal password)
*/
static char
newshuffle[256+16] = {
0x0f, 0x08, 0x05, 0x07, 0x0c, 0x02, 0x0e, 0x09,
0x00, 0x01, 0x06, 0x0d, 0x03, 0x04, 0x0b, 0x0a,
0x02, 0x0c, 0x0e, 0x06, 0x0f, 0x00, 0x01, 0x08,
0x0d, 0x03, 0x0a, 0x04, 0x09, 0x0b, 0x05, 0x07,
0x05, 0x02, 0x09, 0x0f, 0x0c, 0x04, 0x0d, 0x00,
0x0e, 0x0a, 0x06, 0x08, 0x0b, 0x01, 0x03, 0x07,
0x0f, 0x0d, 0x02, 0x06, 0x07, 0x08, 0x05, 0x09,
0x00, 0x04, 0x0c, 0x03, 0x01, 0x0a, 0x0b, 0x0e,
0x05, 0x0e, 0x02, 0x0b, 0x0d, 0x0a, 0x07, 0x00,
0x08, 0x06, 0x04, 0x01, 0x0f, 0x0c, 0x03, 0x09,
0x08, 0x02, 0x0f, 0x0a, 0x05, 0x09, 0x06, 0x0c,
0x00, 0x0b, 0x01, 0x0d, 0x07, 0x03, 0x04, 0x0e,
0x0e, 0x08, 0x00, 0x09, 0x04, 0x0b, 0x02, 0x07,
0x0c, 0x03, 0x0a, 0x05, 0x0d, 0x01, 0x06, 0x0f,
0x01, 0x04, 0x08, 0x0a, 0x0d, 0x0b, 0x07, 0x0e,
0x05, 0x0f, 0x03, 0x09, 0x00, 0x02, 0x06, 0x0c,
0x05, 0x03, 0x0c, 0x08, 0x0b, 0x02, 0x0e, 0x0a,
0x04, 0x01, 0x0d, 0x00, 0x06, 0x07, 0x0f, 0x09,
0x06, 0x00, 0x0b, 0x0e, 0x0d, 0x04, 0x0c, 0x0f,
0x07, 0x02, 0x08, 0x0a, 0x01, 0x05, 0x03, 0x09,
0x0b, 0x05, 0x0a, 0x0e, 0x0f, 0x01, 0x0c, 0x00,
0x06, 0x04, 0x02, 0x09, 0x03, 0x0d, 0x07, 0x08,
0x07, 0x02, 0x0a, 0x00, 0x0e, 0x08, 0x0f, 0x04,
0x0c, 0x0b, 0x09, 0x01, 0x05, 0x0d, 0x03, 0x06,
0x07, 0x04, 0x0f, 0x09, 0x05, 0x01, 0x0c, 0x0b,
0x00, 0x03, 0x08, 0x0e, 0x02, 0x0a, 0x06, 0x0d,
0x09, 0x04, 0x08, 0x00, 0x0a, 0x03, 0x01, 0x0c,
0x05, 0x0f, 0x07, 0x02, 0x0b, 0x0e, 0x06, 0x0d,
0x09, 0x05, 0x04, 0x07, 0x0e, 0x08, 0x03, 0x01,
0x0d, 0x0b, 0x0c, 0x02, 0x00, 0x0f, 0x06, 0x0a,
0x09, 0x0a, 0x0b, 0x0d, 0x05, 0x03, 0x0f, 0x00,
0x01, 0x0c, 0x08, 0x07, 0x06, 0x04, 0x0e, 0x02,
0x03, 0x0e, 0x0f, 0x02, 0x0d, 0x0c, 0x04, 0x05,
0x09, 0x06, 0x00, 0x01, 0x0b, 0x07, 0x0a, 0x08,
};
/*
* verschluesseln des neuen Passworts fuer keyed change password
* Verwendung:
* - Shuffle (aus nwcrypt.c) altes passwort nach old (16 bytes)
* - shuffle neues passwort nach new (16 bytes)
* - nwpassencrypt (diese Funktion) zweimal aufrufen fuer je 8 bytes:
* nwpassencrypt(old+0, new+0, out+0)
* nwpassencrypt(old+8, new+8, out+8)
* - NCP-Buffer aufbauen:
* 2 byte Laenge im Hi-Lo-Format
* 1 byte Funktion (0x4b)
* 8 byte (nwcrypt Ergebnis analog login/verify password)
* 2 byte Objecttype
* 1 byte Objectname-Laenge
* n byte Objectname
* 1 byte (Laenge des eingegebenen neuen Passworts ^ old[0] ^ old[1])&0x7f|0x40
* 16 byte (Ergebnis dieser Funktion doppelt aufgerufen, s.o.)
*/
/*
* Encrypt the new password for keyed change password
* For info on how to use this function, look at ncp_change_login_passwd
* in ncplib.c.
*/
static void
newpassencrypt(char *old, char *new, char *out)
{
char *p, *bx;
char copy[8];
int i, di, ax;
char cl, dl, ch;
memcpy(copy, new, 8);
for (i=0; i<16; i++)
{
for (di=0, ax=0, p=old; di<8; di++, ax+=0x20, p++)
{
cl=newshuffle[(((copy[di]^*p)>>4)&0x0f)+ax+0x10]<<4;
dl=newshuffle[((copy[di]^*p)&0xf)+ax];
copy[di]=cl|dl;
}
ch=old[7];
for (bx=old+7; bx>old; bx--)
{
*bx=((bx[-1]>>4)&0x0f)|((*bx)<<4);
}
*old=((ch>>4)&0x0f)|(*old)<<4;
memset(out, '\0', 8);
for (di=0; di<16; di++)
{
if (newshuffle[di+0x100]&1)
ch=((copy[newshuffle[di+0x100]/2]>>4)&0x0f);
else
ch=copy[newshuffle[di+0x100]/2]&0x0f;
out[di/2]|=((di&1) ? ch<<4 : ch);
}
memcpy(copy, out, 8);
}
}

View File

@@ -11,6 +11,64 @@
#include <unistd.h>
#include "ncplib.h"
static char *progname;
static void
usage(void)
{
fprintf(stderr, "usage: %s [pattern]\n", progname);
}
static void
help(void)
{
printf("\n");
printf("usage: %s [options]\n", progname);
printf("\n"
"-h Print this help text\n"
"-S server Server name to be used\n"
"\n"
"-d Print Description Strings\n"
"-t Print File Server's time\n"
"-i Print File Server Information\n"
"\n");
}
static void
print_info(struct ncp_file_server_info *info)
{
printf ( "\n" ) ;
printf ( "Fileservername %-48.48s\n" , info->ServerName ) ;
printf ( "\n" ) ;
printf ( "Version %d.%d Revision %c\n" ,
info->FileServiceVersion , info->FileServiceSubVersion,
info->Revision + 'A' ) ;
printf ( "Max. Connections %d\n" ,
info->MaximumServiceConnections ) ;
printf ( "currently in use %d\n" ,
info->ConnectionsInUse ) ;
printf ( "peak connections %d\n" ,
info->MaxConnectionsEverUsed ) ;
printf ( "Max. Volumes %d\n" ,
info->NumberMountedVolumes ) ;
printf ( "SFTLevel %d\n" ,
info->SFTLevel ) ;
printf ( "TTSLevel %d\n" ,
info->TTSLevel ) ;
printf ( "Accountversion %d\n" ,
info->AccountVersion ) ;
printf ( "Queueversion %d\n" ,
info->QueueVersion ) ;
printf ( "Printversion %d\n" ,
info->PrintVersion ) ;
printf ( "Virt.Consolvers. %d\n" ,
info->VirtualConsoleVersion ) ;
printf ( "RestrictionLevel %d\n" ,
info->RestrictionLevel ) ;
printf("\n");
return;
}
int
main(int argc, char **argv)
{
@@ -18,16 +76,22 @@ main(int argc, char **argv)
int opt;
long err;
progname = argv[0];
if ((conn = ncp_initialize(&argc, argv, 0, &err)) == NULL)
{
com_err(argv[0], err, "in ncp_initialize");
com_err(argv[0], err, "when initializing");
return 1;
}
while ((opt = getopt(argc, argv, "dt")) != EOF)
while ((opt = getopt(argc, argv, "h?dti")) != EOF)
{
switch(opt)
{
case 'h':
case '?':
help();
break;
case 'd':
{
char strings[512];
@@ -68,12 +132,26 @@ main(int argc, char **argv)
fputs(ctime(&t), stdout);
break;
}
default:
printf("unknown option: %c\n", opt);
case 'i':
{
struct ncp_file_server_info info;
if (ncp_get_file_server_information(conn, &info) != 0)
{
perror("Could not get server information");
ncp_close(conn);
return 1;
}
print_info(&info);
break;
}
default:
usage();
goto finished;
}
}
finished:
ncp_close(conn);
return 0;
}

134
util/nwgrant.c Normal file
View File

@@ -0,0 +1,134 @@
/*
* nwgrant.c
*
* Add trustee rights to file or directory
*
* Copyright (C) 1996 by Volker Lendecke
*
*/
#include "ncplib.h"
#include <unistd.h>
#include <stdlib.h>
static char *progname;
static void
usage(void)
{
fprintf(stderr, "usage: %s [options]\n", progname);
}
static void
help(void)
{
printf("\n");
printf("usage: %s [options] file/directory\n", progname);
printf("\n"
"-h Print this help text\n"
"-S server Server name to be used\n"
"-U username Username sent to server\n"
"-P password Use this password\n"
"-n Do not use any password\n"
"-C Don't convert password to uppercase\n"
"\n"
"-o object_name Name of object added as trustee\n"
"-t type Object type (decimal value)\n"
"-r rights Rights mask (see manual page)\n"
"\n"
"directory\n"
"\n");
}
int
main(int argc, char *argv[])
{
struct ncp_conn *conn;
char *object_name = NULL;
int object_type = -1;
struct ncp_bindery_object o;
int rights = -1;
char *path = NULL;
long err;
int result = 1;
int opt;
progname = argv[0];
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{
com_err(argv[0], err, "when initializing");
goto finished;
}
while ((opt = getopt(argc, argv, "h?o:t:r:")) != EOF)
{
switch(opt) {
case 'o':
object_name = optarg;
str_upper(object_name);
break;
case 't':
object_type = atoi(optarg);
break;
case 'r':
rights = strtol(optarg, NULL, 16);
break;
case 'h':
case '?':
help();
goto finished;
default:
usage();
goto finished;
}
}
if (object_type < 0)
{
fprintf(stderr, "%s: You must specify an object type\n",
argv[0]);
goto finished;
}
if (object_name == NULL)
{
fprintf(stderr, "%s: You must specify an object name\n",
argv[0]);
goto finished;
}
if (rights < 0)
{
fprintf(stderr, "%s: You must specify a rights mask\n",
progname);
goto finished;
}
if (optind != argc-1)
{
fprintf(stderr, "%s: You must specify a directory\n",
progname);
goto finished;
}
path = argv[optind];
if (ncp_get_bindery_object_id(conn, object_type, object_name, &o) != 0)
{
fprintf(stderr, "%s: Could not find object %s\n",
progname, object_name);
goto finished;
}
if (ncp_add_trustee(conn, 0, path, o.object_id, rights) != 0)
{
fprintf(stderr, "%s: Could not add trustee rights\n",progname);
goto finished;
}
result = 0;
finished:
ncp_close(conn);
return result;
}

View File

@@ -1,62 +0,0 @@
/*
* nwlsobj.c
*
* List bindery objects
*
* Copyright (C) 1996 by Volker Lendecke
*
*/
#include <stdio.h>
#include <unistd.h>
#include <ctype.h>
#include "ncplib.h"
int
main(int argc, char **argv)
{
struct ncp_conn *conn;
struct ncp_bindery_object o;
int found = 0;
char default_pattern[] = "*";
char *pattern = default_pattern;
char *p;
long err;
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{
com_err(argv[0], err, "in ncp_initialize");
return 1;
}
if (argc > 2)
{
fprintf(stderr, "usage: %s [options]\n", argv[0]);
return 1;
}
if (argc == 2)
{
pattern = argv[1];
}
for (p = pattern; *p != '\0'; p++)
{
*p = toupper(*p);
}
o.object_id = 0xffffffff;
while (ncp_scan_bindery_object(conn, o.object_id,
0xffff, pattern, &o) == 0)
{
found = 1;
printf("%s %08X %04X\n",
o.object_name, (unsigned int)o.object_id,
(unsigned int)o.object_type);
}
ncp_close(conn);
return 0;
}

View File

@@ -32,6 +32,7 @@ main(int argc, char *argv[])
{
struct ncp_conn *conn;
char message[256];
char *mount_point;
struct ncp_fs_info info;
struct passwd *pwd;
char tty[256];
@@ -53,7 +54,8 @@ main(int argc, char *argv[])
exit(1);
}
if ((conn = ncp_open_mount(argv[1], &err)) == NULL)
mount_point = argv[1];
if ((conn = ncp_open_mount(mount_point, &err)) == NULL)
{
com_err(progname, err, "in ncp_open_mount");
exit(1);
@@ -104,7 +106,7 @@ main(int argc, char *argv[])
while ((mnt = getmntent(mtab)) != NULL)
{
if (strcmp(mnt->mnt_dir, conn->mount_point) == 0)
if (strcmp(mnt->mnt_dir, mount_point) == 0)
{
break;
}

123
util/nwrevoke.c Normal file
View File

@@ -0,0 +1,123 @@
/*
* nwrevoke.c
*
* Remove trustee rights from file or directory
*
* Copyright (C) 1996 by Volker Lendecke
*
*/
#include "ncplib.h"
#include <unistd.h>
#include <stdlib.h>
static char *progname;
static void
usage(void)
{
fprintf(stderr, "usage: %s [options]\n", progname);
}
static void
help(void)
{
printf("\n");
printf("usage: %s [options] file/directory\n", progname);
printf("\n"
"-h Print this help text\n"
"-S server Server name to be used\n"
"-U username Username sent to server\n"
"-P password Use this password\n"
"-n Do not use any password\n"
"-C Don't convert password to uppercase\n"
"\n"
"-o object_name Name of object removed as trustee\n"
"-t type Object type (decimal value)\n"
"\n"
"file/directory\n"
"\n");
}
int
main(int argc, char *argv[])
{
struct ncp_conn *conn;
char *object_name = NULL;
int object_type = -1;
struct ncp_bindery_object o;
char *path = NULL;
long err;
int result = 1;
int opt;
progname = argv[0];
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{
com_err(argv[0], err, "when initializing");
goto finished;
}
while ((opt = getopt(argc, argv, "h?o:t:")) != EOF)
{
switch(opt) {
case 'o':
object_name = optarg;
str_upper(object_name);
break;
case 't':
object_type = atoi(optarg);
break;
case 'h':
case '?':
help();
goto finished;
default:
usage();
goto finished;
}
}
if (object_type < 0)
{
fprintf(stderr, "%s: You must specify an object type\n",
argv[0]);
goto finished;
}
if (object_name == NULL)
{
fprintf(stderr, "%s: You must specify an object name\n",
argv[0]);
goto finished;
}
if (optind != argc-1)
{
fprintf(stderr, "%s: You must specify a directory\n",
progname);
goto finished;
}
path = argv[optind];
if (ncp_get_bindery_object_id(conn, object_type, object_name, &o) != 0)
{
fprintf(stderr, "%s: Could not find object %s\n",
progname, object_name);
goto finished;
}
if (ncp_delete_trustee(conn, 0, path, o.object_id) != 0)
{
fprintf(stderr, "%s: Could not remove trustee rights\n",
progname);
goto finished;
}
result = 0;
finished:
ncp_close(conn);
return result;
}

143
util/nwuserlist.c Normal file
View File

@@ -0,0 +1,143 @@
/*
* nwfsinfo.c
*
* Print the info strings of a server, maybe sometime more.
*
* Copyright (C) 1996 by Volker Lendecke
*
*/
#include <stdio.h>
#include <unistd.h>
#include "ncplib.h"
static char *progname;
static void
usage(void)
{
fprintf(stderr, "usage: %s [pattern]\n", progname);
}
static void
str_trim_right(char *s, char c)
{
int len = strlen(s) - 1;
while ((len > 0) && (s[len] == c))
{
s[len] = '\0';
len -= 1;
}
}
static void
help(void)
{
printf("\n");
printf("usage: %s [options]\n", progname);
printf("\n"
"-h Print this help text\n"
"-S server Server name to be used\n"
"-a Print Station's addr\n"
"\n");
}
int
main(int argc, char **argv)
{
struct ncp_conn *conn;
int opt;
long err;
struct ncp_file_server_info info;
struct ncp_bindery_object user;
time_t login_time;
int i;
int print_addr = 0;
progname = argv[0];
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{
com_err(argv[0], err, "when initializing");
goto finished;
}
while ((opt = getopt(argc, argv, "h?a")) != EOF)
{
switch(opt)
{
case 'h':
case '?':
help();
goto finished;
case 'a':
print_addr = 1;
break;
default:
usage();
goto finished;
}
}
if (ncp_get_file_server_information(conn, &info) != 0)
{
perror("Could not get server information");
ncp_close(conn);
return 1;
}
if (isatty(1))
{
if (print_addr == 0)
{
printf("\n%-6s%-21s%-12s\n"
"---------------------------------------------"
"------\n",
"Conn",
"User name",
"Login time");
}
else
{
printf("\n%-6s%-21s%-27s%-12s\n"
"---------------------------------------------"
"---------------------------------\n",
"Conn",
"User name",
"Station Address",
"Login time");
}
}
for (i = 1; i <= info.MaximumServiceConnections; i++)
{
char name[49];
name[48] = '\0';
if (ncp_get_stations_logged_info(conn, i, &user,
&login_time) != 0)
{
continue;
}
memcpy(name, user.object_name, 48);
str_trim_right(name, ' ');
printf("%4d: %-20s ", i, name);
if (print_addr != 0)
{
struct sockaddr_ipx addr;
__u8 conn_type;
memset(&addr, 0, sizeof(addr));
ncp_get_internet_address(conn, i, &addr, &conn_type);
ipx_print_saddr(&addr);
printf(" ");
}
printf("%s", ctime(&login_time));
}
finished:
ncp_close(conn);
return 0;
}

View File

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

View File

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

View File

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