Compare commits

...

3 Commits

Author SHA1 Message Date
ncpfs archive import
ab78307868 Import ncpfs 2.0.5 2026-04-28 20:39:58 +02:00
ncpfs archive import
3019bba627 Import ncpfs 2.0.4 2026-04-28 20:39:58 +02:00
ncpfs archive import
011a5107c5 Import ncpfs 2.0.3 2026-04-28 20:39:58 +02:00
50 changed files with 1543 additions and 707 deletions

BIN
.downloads/ncpfs-2.0.3.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-2.0.4.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-2.0.5.tgz Normal file

Binary file not shown.

37
Changes
View File

@@ -1,6 +1,41 @@
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.4 -> ncpfs-2.0.5
- Removed another bug in nwbpvalues.
- Cleaned up man/Makefile
- Some manpage typos fixed. Thanks to Jim Van Zandt
<jrv@mbunix.mitre.org>
- added nwrights
ncpfs-2.0.3 -> ncpfs-2.0.4
- Changed name of npasswd to nwpasswd, as npasswd collides with
RedHat. Thanks to Mike Slater <mslater@nfinity.com> for pointing me
at this one.
- Put '\r\n' into nwmsg, because sometimes it did not print
correctly. Thanks to Petr Vandrovec Ing. VTEI
<VANDROVE@vcnet.vc.cvut.cz> for this one.
- Improved the ELF Makefile for ELF support. Thanks to Uwe Bonnes
<bon@elektron.ikp.physik.th-darmstadt.de>.
- Removed a very embarassing bug in nwpvalues :-(.
- Added a some routines to nwbpvalues.
ncpfs-2.0.2 -> ncpfs-2.0.3
- Removed the kernel-2.0 directory. Linus took the patch into 2.0.8.
So, if you want to use long file name support, upgrade to Linux
kernel version 2.0.8.
- Applied the lfn patch to the kernel-1.2 module with some light
testing. If you experience problems, tell it to me, and use the
ncpfs-2.0.2 kernel module, or upgrade to Linux 2.0.8.
- Added unencrypted login when no crypt key is returned.
- Hopefully improved error messages a bit
- Added some values to ipxparse
- For ELF systems, moved ncplib to /lib/libncp.so.1.x. This saves
about 1MB of disk space. As ncpfs grows, the saving will
increase. Please look at the Makefile to enable this.
- Enhanced nwfsinfo a bit. (Even with a manpage!)
- Added nwuserlist.
ncpfs-2.0.1 -> ncpfs-2.0.2
- Added some values to ipxparse.
- Added a patch against 2.0.7 for long file names support. I did not
@@ -133,4 +168,4 @@ ncpfs-0.12 -> ncpfs-0.13
- support for automatic loading of ncpfs.o by kerneld.
Thanks to Steven N. Hirsch <hirsch@emba.uvm.edu>.
- A subtle problem in the read routines has been removed by Uwe Bonnes
<bon@elektron.ikp.physik.th-darmstadt.de>. Thanks a lot.
<bon@elektron.ikp.physik.th-darmstadt.de>. Thanks a lot.

7
FAQ
View File

@@ -37,13 +37,6 @@ packet signatures on the 4.1 server, as ncpfs does not support them.
-------------------------------------------------------------------------------
Q: Does ncpfs support long file names, using the OS/2 namespace?
Yes. But you will have to patch your kernel. Look at the file
kernel-2.0/README for more information.
-------------------------------------------------------------------------------
Q: When I re-export ncpfs-mounted directories via nfs, I get messages like
'pwd: cannot get current directory', and other strange things happen to
the nfs clients. What's wrong?

View File

@@ -2,12 +2,18 @@
# Makefile for the linux ncp-filesystem routines.
#
VERSION = 2.0.2
VERSION = 2.0.5
# If you are using kerneld to autoload ncp support,
# uncomment this (kerneld is in linux since about 1.3.57):
#KERNELD = -DHAVE_KERNELD
# If your system is ELF, either also do a 'make install', or append the util/
# directory where the dynamic library resides to the environment
# variable LD_LIBRARY_PATH
HAVE_ELF=$(shell file `which gcc`|grep ELF >/dev/null && echo -n yes )
TOPDIR = $(shell pwd)
BINDIR = /usr/local/bin
SBINDIR = /sbin
@@ -21,10 +27,21 @@ SUBDIRS += kernel-1.2/src
INCLUDES = -I$(TOPDIR)/kernel-1.2
endif
export INCLUDES BINDIR INTERM_BINDIR SBINDIR KERNELD VERSION
export INCLUDES BINDIR INTERM_BINDIR SBINDIR KERNELD VERSION HAVE_ELF
all:
for i in $(SUBDIRS); do make -C $$i all; done
@if [ "$(HAVE_ELF)" = yes ] ;\
then \
echo ; echo ; echo ;\
echo Please add \'`pwd`/util\' to the environment ; \
echo variable LD_LIBRARY_PATH by executing ; \
echo ;\
echo export LD_LIBRARY_PATH=\"\$$LD_LIBRARY_PATH:`pwd`/util\" ; \
echo ;\
echo or do a \'make install\'. ;\
echo ;\
fi
dep:
for i in $(SUBDIRS); do make -C $$i dep; done

29
README
View File

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

View File

@@ -351,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");
@@ -381,6 +385,9 @@ 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;
@@ -390,6 +397,9 @@ void handle_ncp (struct sockaddr_ipx *source,
case 06:
printf("Get Volume Name\n");
break;
case 10:
printf("Create directory\n");
break;
case 18:
printf("Allocate Permanent Dir Handle\n");
break;
@@ -399,6 +409,9 @@ 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;
@@ -426,21 +439,54 @@ void handle_ncp (struct sockaddr_ipx *source,
case 28:
printf("Get Connection Information\n");
break;
case 50:
printf("Create Bindery Object\n");
break;
case 53:
printf("Get Bindery Object ID\n");
break;
case 54:
printf("Get Bindery Object Name\n");
break;
case 55:
printf("Scan Bindery Object\n");
break;
case 57:
printf("Create Property\n");
break;
case 59:
printf("Change Property Security\n");
break;
case 60:
printf("Scan Property\n");
break;
case 61:
printf("Read Property Value\n");
break;
case 62:
printf("Write Property Value\n");
break;
case 65:
printf("Add Bindery Object to Set\n");
break;
case 67:
printf("Is Bindery Object in Set\n");
break;
case 70:
printf("Get Bindery Access Level\n");
break;
case 72:
printf("Get Bindery Object Access Level\n");
break;
case 75:
printf("Keyed change password\n");
break;
case 113:
printf("Service Queue Job (old)\n");
break;
case 124:
printf("Service Queue Job \n");
break;
}
data += 3;
@@ -476,6 +522,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");
@@ -488,6 +538,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]);

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,18 +0,0 @@
This directory contains the patch you have to apply to the Linux
kernel if you want to use the support for long file names using the
OS/2 namespace on the NetWare server. It did not make it into 2.0, but
patching your kernel is really no problem.
To apply this patch, please take a clean Linux kernel. This patch is
against Linux 2.0.7, but any later kernel version in the 2.0.x series
should also work fine. Please perform the following two steps:
cd /usr/src/linux
patch -p1 </path_to_ncpfs/kernel-2.0/lfn-2.0.7.diff
Please do not forget the -p1 flag for patch. Here I assumed that your
linux kernel resides in /usr/src/linux. After these two steps, you
should recompile your kernel the normal way. If anything goes wrong,
PLEASE first consult the file /usr/src/linux/README for more
information.

View File

@@ -1,498 +0,0 @@
diff -urN 2.0.7/fs/ncpfs/dir.c linux/fs/ncpfs/dir.c
--- 2.0.7/fs/ncpfs/dir.c Mon Jul 8 17:19:03 1996
+++ linux/fs/ncpfs/dir.c Tue Jul 16 17:35:07 1996
@@ -92,6 +92,20 @@
}
}
+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 */
@@ -128,7 +142,7 @@
/* Here we encapsulate the inode number handling that depends upon the
* mount mode: When we mount a complete server, the memory address of
* the ncp_inode_info is used as the inode number. When only a single
- * volume is mounted, then the DosDirNum is used as the inode
+ * volume 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.
*/
@@ -143,7 +157,7 @@
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
@@ -177,8 +191,6 @@
return NULL;
}
-
-
static int
ncp_dir_read(struct inode *inode, struct file *filp, char *buf, int count)
{
@@ -326,9 +338,12 @@
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);
+ }
}
}
}
@@ -345,7 +360,7 @@
if (ncp_single_volume(server))
{
- ino = (ino_t)(entry->i.DosDirNum);
+ ino = (ino_t)(entry->i.dirEntNum);
}
else
{
@@ -652,7 +667,7 @@
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));
@@ -729,7 +744,7 @@
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
@@ -757,6 +772,7 @@
struct ncp_server *server;
struct ncp_inode_info *result_info;
int found_in_cache;
+ int down_case = 0;
char name[len+1];
*result = NULL;
@@ -867,20 +883,26 @@
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)
@@ -892,7 +914,11 @@
}
finfo.opened = 0;
- str_lower(finfo.i.entryName);
+
+ if (down_case != 0)
+ {
+ str_lower(finfo.i.entryName);
+ }
if (!(*result = ncp_iget(dir, &finfo)))
{
@@ -929,7 +955,11 @@
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),
@@ -946,7 +976,11 @@
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)
@@ -980,7 +1014,11 @@
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))
{
@@ -1038,7 +1076,11 @@
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),
@@ -1081,7 +1123,11 @@
{
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),
@@ -1136,11 +1182,19 @@
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,
diff -urN 2.0.7/fs/ncpfs/ncplib_kernel.c linux/fs/ncpfs/ncplib_kernel.c
--- 2.0.7/fs/ncpfs/ncplib_kernel.c Thu Apr 18 08:40:28 1996
+++ linux/fs/ncpfs/ncplib_kernel.c Tue Jul 16 10:52:33 1996
@@ -190,25 +190,6 @@
}
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)
{
int result;
@@ -278,8 +259,8 @@
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);
@@ -295,20 +276,57 @@
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 */
@@ -325,20 +343,19 @@
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;
}
@@ -352,14 +369,14 @@
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);
result = ncp_request(server, 87);
ncp_unlock_server(server);
@@ -374,11 +391,11 @@
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);
result = ncp_request(server, 87);
ncp_unlock_server(server);
@@ -406,15 +423,16 @@
{
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);
@@ -425,13 +443,11 @@
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);
}
@@ -467,9 +483,9 @@
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)
{
@@ -493,7 +509,7 @@
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 */
@@ -528,19 +544,19 @@
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 */
diff -urN 2.0.7/include/linux/ncp.h linux/include/linux/ncp.h
--- 2.0.7/include/linux/ncp.h Thu Apr 18 08:40:36 1996
+++ linux/include/linux/ncp.h Tue Jul 16 17:27:45 1996
@@ -116,6 +116,12 @@
__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)
diff -urN 2.0.7/include/linux/ncp_fs_sb.h linux/include/linux/ncp_fs_sb.h
--- 2.0.7/include/linux/ncp_fs_sb.h Thu Apr 18 08:40:36 1996
+++ linux/include/linux/ncp_fs_sb.h Tue Jul 16 17:35:17 1996
@@ -21,6 +21,8 @@
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 */
struct file *msg_filp; /* File pointer to message socket */

View File

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

View File

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

View File

@@ -65,14 +65,14 @@ is the name of the server you want to use.
If the user name your NetWare administrator gave to you differs
from your unix user-id, you should use
.B -U
to tell the server about you NetWare user name.
to tell the server about your NetWare user name.
.RE
.B -P
.I password
.RS 3
You may want to give the password required by the server on the
command line. You should be careful to use passwords in scripts.
command line. You should be careful about using passwords in scripts.
.RE
.B -n

View File

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

52
man/nwfsinfo.1 Normal file
View File

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

View File

@@ -1,8 +1,8 @@
.TH NPASSWD 1 06/22/1996 npasswd npasswd
.TH NWPASSWD 1 06/22/1996 nwpasswd nwpasswd
.SH NAME
npasswd \- Change a user's password
nwpasswd \- Change a user's password
.SH SYNOPSIS
.B npasswd
.B nwpasswd
[
.B -h
] [
@@ -18,9 +18,9 @@ npasswd \- Change a user's password
.SH DESCRIPTION
With
.B npasswd,
.B nwpasswd,
you can change your password on a NetWare server.
.B npasswd
.B nwpasswd
asks for the old password and twice for the new password. Then it
changes the password on the server.
@@ -28,7 +28,7 @@ changes the password on the server.
.B -h
.RS 3
With -h npasswd prints a little help text.
With -h nwpasswd prints a little help text.
.RE
.B -S
@@ -51,5 +51,5 @@ changed.
.RE
.SH CREDITS
npasswd would not have been possible without the work of Guntram
nwpasswd would not have been possible without the work of Guntram
Blom. Look at nwcrypt.c for his work.

41
man/nwrights.1 Normal file
View File

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

93
man/nwuserlist.1 Normal file
View File

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

View File

@@ -68,14 +68,14 @@ is the name of the server you want to use.
If the user name your NetWare administrator gave to you differs
from your unix user-id, you should use
.B -U
to tell the server about you NetWare user name.
to tell the server about your NetWare user name.
.RE
.B -P
.I password
.RS 3
You may want to give the password required by the server on the
command line. You should be careful to use passwords in scripts.
command line. You should be careful about using passwords in scripts.
.RE
.B -n

View File

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

View File

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

View File

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

View File

@@ -680,6 +680,40 @@ ncp_temp_request(struct ncp_conn *conn, int function)
return r->completion_code == 0 ? 0 : NCPL_ET_REQUEST_ERROR;
}
#ifdef PACKET_SIGNATURES
static long
ncp_setup_security(struct ncp_conn *conn)
{
__u8 security;
__u8 accepted_security;
__u16 socket, size;
conn->want_signatures = 0;
if (ncp_get_big_ncp_max_packet_size(conn, 576, 0, &size, &socket,
&accepted_security) != 0)
{
return 0;
}
if ((accepted_security & NCP_SEC_SIGNATURE_REQUESTED) == 0)
{
return 0;
}
security = NCP_SEC_SIGNATURE_REQUESTED;
if (ncp_get_big_ncp_max_packet_size(conn, 576, security,
&size, &socket,
&accepted_security) != 0)
{
return 0;
}
if ((accepted_security & NCP_SEC_SIGNATURE_REQUESTED) != 0)
{
conn->want_signatures = 1;
}
return 0;
}
#endif
static long
ncp_connect_addr(struct ncp_conn *conn, const struct sockaddr_ipx *target,
int wdog_needed)
@@ -1085,6 +1119,15 @@ ncp_open_mount(const char *mount_point, long *err)
}
strcpy(result->mount_point, mount_point);
result->is_connected = CONN_PERMANENT;
result->i.version = NCP_GET_FS_INFO_VERSION;
if (ioctl(result->mount_fid, NCP_IOC_GET_FS_INFO, &(result->i)) != 0)
{
free(result);
*err = NCPL_ET_NO_NCPFS_FILE;
return NULL;
}
return result;
}
@@ -1149,6 +1192,11 @@ long
ncp_close(struct ncp_conn *conn)
{
long result;
if (conn == NULL)
{
return 0;
}
if ((result = ncp_do_close(conn)) != 0)
{
return result;
@@ -1292,7 +1340,7 @@ ncp_get_nwc_ent(FILE *nwc)
}
FILE *
ncp_fopen_nwc(const char *user, const char *mode)
ncp_fopen_nwc(const char *user, const char *mode, long *err)
{
char path[MAXPATHLEN];
char *home = NULL;
@@ -1320,7 +1368,7 @@ ncp_fopen_nwc(const char *user, const char *mode)
if ( (home == NULL)
|| (strlen(home) + sizeof(NWCLIENT) + 2 > sizeof(path)))
{
errno = ENAMETOOLONG;
*err = ENAMETOOLONG;
return NULL;
}
@@ -1330,12 +1378,13 @@ ncp_fopen_nwc(const char *user, const char *mode)
if (stat(path, &st) != 0)
{
*err = errno;
return NULL;
}
if ((st.st_mode & (S_IRWXO | S_IRWXG)) != 0)
{
errno = EINVAL;
*err = NCPL_ET_INVALID_MODE;
return NULL;
}
@@ -1371,11 +1420,9 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
}
else
{
nwc = ncp_fopen_nwc(NULL, NULL);
if (nwc == NULL)
if ((nwc = ncp_fopen_nwc(NULL, NULL, err)) == NULL)
{
*err = NCPL_ET_NO_SPEC;
*err = NCPL_ET_NO_SERVER;
return NULL;
}
@@ -1391,6 +1438,15 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
strcpy(spec.user, nwc_ent->user);
}
str_upper(spec.server);
if (login_necessary == 0)
{
memset(spec.user, 0, sizeof(spec.user));
memset(spec.password, 0, sizeof(spec.password));
return &spec;
}
if (user != NULL)
{
if (strlen(user) >= sizeof(spec.user))
@@ -1401,7 +1457,6 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
strcpy(spec.user, user);
}
str_upper(spec.server);
str_upper(spec.user);
spec.login_type = NCP_BINDERY_USER;
@@ -1422,7 +1477,7 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
}
else
{
if ((nwc = ncp_fopen_nwc(NULL, NULL)) != NULL)
if ((nwc = ncp_fopen_nwc(NULL, NULL, err)) != NULL)
{
while ((nwc_ent = ncp_get_nwc_ent(nwc)) != NULL)
{
@@ -1442,15 +1497,10 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
}
}
if (login_necessary == 0)
{
memset(spec.user, 0, sizeof(spec.user));
memset(spec.password, 0, sizeof(spec.password));
}
if (strlen(spec.user) == 0)
{
return &spec;
*err = NCPL_ET_NO_USER;
return NULL;
}
if ((strlen(spec.password) == 0) && (password == NULL))
@@ -1817,6 +1867,31 @@ ncp_get_file_server_time(struct ncp_conn *conn, time_t *target)
return 0;
}
long
ncp_get_file_server_information(struct ncp_conn *conn,
struct ncp_file_server_info *target)
{
long result;
ncp_init_request_s(conn, 17);
if ((result = ncp_request(conn, 23)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
memcpy(target, ncp_reply_data(conn, 0), sizeof(*target));
target->MaximumServiceConnections
= htons(target->MaximumServiceConnections);
target->ConnectionsInUse
= htons(target->ConnectionsInUse);
target->MaxConnectionsEverUsed
= htons(target->MaxConnectionsEverUsed);
target->NumberMountedVolumes
= htons(target->NumberMountedVolumes);
ncp_unlock_conn(conn);
return 0;
}
long
ncp_get_connlist(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
@@ -1840,6 +1915,57 @@ ncp_get_connlist(struct ncp_conn *conn,
return 0;
}
long
ncp_get_stations_logged_info(struct ncp_conn *conn,
__u32 connection,
struct ncp_bindery_object *target,
time_t *login_time)
{
long result;
ncp_init_request_s(conn, 28);
ncp_add_dword(conn, connection);
if ((result = ncp_request(conn, 23)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
memset(target, 0, sizeof(*target));
target->object_id = ntohl(ncp_reply_dword(conn, 0));
target->object_type = ntohs(ncp_reply_word(conn, 4));
memcpy(target->object_name, ncp_reply_data(conn, 6),
sizeof(target->object_name));
*login_time = nw_to_ctime((struct nw_time_buffer *)
ncp_reply_data(conn, 54));
ncp_unlock_conn(conn);
return 0;
}
long
ncp_get_internet_address(struct ncp_conn *conn,
__u32 connection,
struct sockaddr_ipx *target,
__u8 *conn_type)
{
long result;
ncp_init_request_s(conn, 26);
ncp_add_dword(conn, connection);
if ((result = ncp_request(conn, 23)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
memset(target, 0, sizeof(*target));
target->sipx_network = ncp_reply_dword(conn, 0);
memcpy(&(target->sipx_node), ncp_reply_data(conn, 4), 6);
target->sipx_port = ncp_reply_word(conn, 10);
*conn_type = ncp_reply_byte(conn, 12);
ncp_unlock_conn(conn);
return 0;
}
long
ncp_send_broadcast(struct ncp_conn *conn,
__u8 no_conn, const __u8 *connections,
@@ -2172,6 +2298,31 @@ ncp_write_property_value(struct ncp_conn *conn,
return result;
}
long
ncp_get_big_ncp_max_packet_size(struct ncp_conn *conn,
__u16 proposed_max_size,
__u8 proposed_security_flag,
__u16 *accepted_max_size,
__u16 *echo_socket,
__u8 *accepted_security_flag)
{
long result;
ncp_init_request(conn);
ncp_add_word(conn, htons(proposed_max_size));
ncp_add_byte(conn, proposed_security_flag);
if ((result = ncp_request(conn, 97)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
*accepted_max_size = ntohs(ncp_reply_word(conn, 0));
*echo_socket = ntohs(ncp_reply_word(conn, 2));
*accepted_security_flag = ncp_reply_byte(conn, 4);
ncp_unlock_conn(conn);
return 0;
}
long
ncp_login_encrypted(struct ncp_conn *conn,
const struct ncp_bindery_object *object,
@@ -2196,6 +2347,21 @@ 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,
@@ -2252,7 +2418,8 @@ ncp_login_object(struct ncp_conn *conn,
struct ncp_bindery_object user;
if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) {
return result;
return ncp_login_unencrypted(conn, login_type, username,
password);
}
if ((result = ncp_get_bindery_object_id(conn, login_type,
@@ -2672,7 +2839,7 @@ static void
ncp_add_handle_path(struct ncp_conn *conn,
__u8 vol_num,
__u32 dir_base, int have_dir_base,
char *path)
const char *path)
{
ncp_add_byte(conn, vol_num);
ncp_add_dword(conn, dir_base);
@@ -2705,6 +2872,61 @@ ncp_extract_file_info(void *structure, struct nw_info_struct *target)
return;
}
long
ncp_obtain_file_or_subdir_info(struct ncp_conn *conn,
__u8 source_ns, __u8 target_ns,
__u16 search_attribs, __u32 rim,
__u8 vol, __u32 dirent, const char *path,
struct nw_info_struct *target)
{
long result;
ncp_init_request(conn);
ncp_add_byte(conn, 6);
ncp_add_byte(conn, source_ns);
ncp_add_byte(conn, target_ns);
ncp_add_word(conn, search_attribs);
ncp_add_dword(conn, rim);
ncp_add_handle_path(conn, vol, dirent, 1, path);
if ((result = ncp_request(conn, 87)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
ncp_extract_file_info(ncp_reply_data(conn, 0), target);
ncp_unlock_conn(conn);
return 0;
}
long
ncp_get_eff_directory_rights(struct ncp_conn *conn,
__u8 source_ns, __u8 target_ns,
__u16 search_attribs,
__u8 vol, __u32 dirent, const char *path,
__u16 *my_effective_rights)
{
long result;
ncp_init_request(conn);
ncp_add_byte(conn, 29);
ncp_add_byte(conn, source_ns);
ncp_add_byte(conn, target_ns);
ncp_add_word(conn, search_attribs);
ncp_add_dword(conn, 0);
ncp_add_handle_path(conn, vol, dirent, 1, path);
if ((result = ncp_request(conn, 87)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
*my_effective_rights = ncp_reply_word(conn, 0);
ncp_unlock_conn(conn);
return 0;
}
long
ncp_do_lookup(struct ncp_conn *conn,
struct nw_info_struct *dir,
@@ -2893,7 +3115,7 @@ ncp_initialize_search(struct ncp_conn *conn,
return result;
}
memcpy(&(target->s), ncp_reply_data(conn, 0), sizeof(target->s));
memcpy(&(target->s), ncp_reply_data(conn, 0), 9);
target->namespace = namespace;
ncp_unlock_conn(conn);

View File

@@ -155,11 +155,48 @@ ncp_get_file_server_description_strings(struct ncp_conn *conn,
long
ncp_get_file_server_time(struct ncp_conn *conn, time_t *target);
struct ncp_file_server_info {
__u8 ServerName[48] __attribute__ ((packed));
__u8 FileServiceVersion __attribute__ ((packed));
__u8 FileServiceSubVersion __attribute__ ((packed));
__u16 MaximumServiceConnections __attribute__ ((packed));
__u16 ConnectionsInUse __attribute__ ((packed));
__u16 NumberMountedVolumes __attribute__ ((packed));
__u8 Revision __attribute__ ((packed));
__u8 SFTLevel __attribute__ ((packed));
__u8 TTSLevel __attribute__ ((packed));
__u16 MaxConnectionsEverUsed __attribute__ ((packed));
__u8 AccountVersion __attribute__ ((packed));
__u8 VAPVersion __attribute__ ((packed));
__u8 QueueVersion __attribute__ ((packed));
__u8 PrintVersion __attribute__ ((packed));
__u8 VirtualConsoleVersion __attribute__ ((packed));
__u8 RestrictionLevel __attribute__ ((packed));
__u8 InternetBridge __attribute__ ((packed));
__u8 Reserved[60] __attribute__ ((packed));
};
long
ncp_get_file_server_information(struct ncp_conn *conn,
struct ncp_file_server_info *target);
long
ncp_get_connlist(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
int *returned_no, __u8 conn_numbers[256]);
long
ncp_get_stations_logged_info(struct ncp_conn *conn,
__u32 connection,
struct ncp_bindery_object *target,
time_t *login_time);
long
ncp_get_internet_address(struct ncp_conn *conn,
__u32 connection,
struct sockaddr_ipx *target,
__u8 *conn_type);
long
ncp_send_broadcast(struct ncp_conn *conn,
__u8 no_conn, const __u8 *connections,
@@ -198,6 +235,12 @@ ncp_change_object_security(struct ncp_conn *conn,
const char *object_name,
__u8 security);
struct ncp_station_addr {
__u32 NetWork __attribute__ ((packed));
__u8 Node[6] __attribute__ ((packed));
__u16 Socket __attribute__ ((packed));
};
struct ncp_prop_login_control {
__u8 AccountExpireDate[3] __attribute__ ((packed));
__u8 Disabled __attribute__ ((packed));
@@ -214,7 +257,7 @@ struct ncp_prop_login_control {
__u32 MaxDiskUsage __attribute__ ((packed));
__u16 BadLoginCount __attribute__ ((packed));
__u32 BadLoginCountDown __attribute__ ((packed));
__u8 LastIntruder[8] __attribute__ ((packed));
struct ncp_station_addr LastIntruder __attribute__ ((packed));
};
long
@@ -259,12 +302,33 @@ ncp_write_property_value(struct ncp_conn *conn,
const char *property_name,
__u8 segment,
struct nw_property *property_value);
/* Bit masks for security flag */
#define NCP_SEC_CHECKSUMMING_REQUESTED (1)
#define NCP_SEC_SIGNATURE_REQUESTED (2)
#define NCP_SEC_COMPLETE_SIGNATURES_REQUESTED (4)
#define NCP_SEC_ENCRYPTION_REQUESTED (8)
#define NCP_SEC_LIP_DISABLED (128)
long
ncp_get_big_ncp_max_packet_size(struct ncp_conn *conn,
__u16 proposed_max_size,
__u8 proposed_security_flag,
__u16 *accepted_max_size,
__u16 *echo_socket,
__u8 *accepted_security_flag);
long
ncp_login_encrypted(struct ncp_conn *conn,
const struct ncp_bindery_object *object,
const unsigned char *key,
const unsigned char *passwd);
long
ncp_login_unencrypted(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const unsigned char *passwd);
long
ncp_change_login_passwd(struct ncp_conn *conn,
const struct ncp_bindery_object *object,
@@ -373,6 +437,30 @@ ncp_copy_file(struct ncp_conn *conn,
__u32 count,
__u32 *copied_count);
long
ncp_obtain_file_or_subdir_info(struct ncp_conn *conn,
__u8 source_ns, __u8 target_ns,
__u16 search_attribs, __u32 rim,
__u8 vol, __u32 dirent, const char *path,
struct nw_info_struct *target);
#define NCP_PERM_READ (0x001)
#define NCP_PERM_WRITE (0x002)
#define NCP_PERM_OPEN (0x004)
#define NCP_PERM_CREATE (0x008)
#define NCP_PERM_DELETE (0x010)
#define NCP_PERM_OWNER (0x020)
#define NCP_PERM_SEARCH (0x040)
#define NCP_PERM_MODIFY (0x080)
#define NCP_PERM_SUPER (0x100)
long
ncp_get_eff_directory_rights(struct ncp_conn *conn,
__u8 source_ns, __u8 target_ns,
__u16 search_attribs,
__u8 vol, __u32 dirent, const char *path,
__u16 *my_effective_rights);
long
ncp_do_lookup(struct ncp_conn *conn,
struct nw_info_struct *dir,

View File

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

View File

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

View File

@@ -131,6 +131,95 @@ test_change(struct ncp_conn *conn)
return 0;
}
void
test_readdir(struct ncp_conn *conn)
{
struct nw_info_struct sys;
struct nw_info_struct blub;
struct ncp_search_seq seq;
struct nw_info_struct entry;
if (ncp_do_lookup(conn, NULL, "SYS", &sys) != 0)
{
printf("lookup error\n");
return;
}
if (ncp_do_lookup(conn, &sys, "BLUB", &blub) != 0)
{
printf("lookup blub error\n");
return;
}
if (ncp_initialize_search(conn, &sys, 0, &seq) != 0)
{
printf("init error\n");
return;
}
while (ncp_search_for_file_or_subdir(conn, &seq, &entry) == 0)
{
struct nw_info_struct nfs;
printf("found: %s\n", entry.entryName);
if (ncp_obtain_file_or_subdir_info(conn, NW_NS_DOS, NW_NS_NFS,
0x8006, RIM_ALL,
entry.volNumber,
entry.DosDirNum,
NULL,
&nfs) == 0)
{
printf("nfs name: %s\n", nfs.entryName);
}
if (ncp_obtain_file_or_subdir_info(conn, NW_NS_DOS, NW_NS_OS2,
0x8006, RIM_ALL,
entry.volNumber,
entry.DosDirNum,
NULL,
&nfs) == 0)
{
printf("os2 name: %s\n", nfs.entryName);
}
}
}
void
test_rights(struct ncp_conn *conn)
{
struct nw_info_struct sys;
struct nw_info_struct me;
__u16 rights;
if (ncp_do_lookup(conn, NULL, "SYS", &sys) != 0)
{
printf("lookup error\n");
return;
}
if (ncp_do_lookup(conn, &sys, "ME", &me) != 0)
{
printf("lookup me error\n");
return;
}
if (ncp_get_eff_directory_rights(conn, 0, 0, 0x8006,
sys.volNumber, sys.DosDirNum, NULL,
&rights) != 0)
{
printf("get sys rights error\n");
return;
}
printf("sys right: %4.4x\n", rights);
if (ncp_get_eff_directory_rights(conn, 0, 0, 0x8006,
me.volNumber, me.DosDirNum, NULL,
&rights) != 0)
{
printf("get me rights error\n");
return;
}
printf("me right: %4.4x\n", rights);
return;
}
int
main(int argc, char *argv[])
{
@@ -143,7 +232,7 @@ main(int argc, char *argv[])
return 1;
}
test_change(conn);
test_rights(conn);
ncp_close(conn);
return 0;
}

View File

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

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

View File

@@ -83,11 +83,11 @@ 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");
goto finished;
}
while ((opt = getopt(argc, argv, "ho:t:r:w:")) != EOF)
while ((opt = getopt(argc, argv, "h?o:t:r:w:")) != EOF)
{
switch(opt) {
case 'o':
@@ -122,6 +122,7 @@ main(int argc, char *argv[])
}
break;
case 'h':
case '?':
help();
goto finished;
default:

View File

@@ -59,14 +59,15 @@ 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;
}
while ((opt = getopt(argc, argv, "hvt:")) != EOF)
while ((opt = getopt(argc, argv, "h?vt:")) != EOF)
{
switch(opt) {
case 'h':
case '?':
help();
exit(1);
case 't':

View File

@@ -56,11 +56,11 @@ 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");
goto finished;
}
while ((opt = getopt(argc, argv, "ho:t:v")) != EOF)
while ((opt = getopt(argc, argv, "h?o:t:v")) != EOF)
{
switch(opt) {
case 'o':
@@ -74,6 +74,7 @@ main(int argc, char *argv[])
verbose = 1;
break;
case 'h':
case '?':
help();
goto finished;
default:

View File

@@ -53,11 +53,11 @@ 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");
goto finished;
}
while ((opt = getopt(argc, argv, "ho:t:")) != EOF)
while ((opt = getopt(argc, argv, "h?o:t:")) != EOF)
{
switch(opt) {
case 'o':
@@ -68,6 +68,7 @@ main(int argc, char *argv[])
object_type = atoi(optarg);
break;
case 'h':
case '?':
help();
goto finished;
default:

View File

@@ -63,11 +63,11 @@ 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");
goto finished;
}
while ((opt = getopt(argc, argv, "ho:t:p:v:")) != EOF)
while ((opt = getopt(argc, argv, "h?o:t:p:v:")) != EOF)
{
switch(opt) {
case 'o':
@@ -91,6 +91,7 @@ main(int argc, char *argv[])
value = optarg;
break;
case 'h':
case '?':
help();
goto finished;
default:

View File

@@ -87,11 +87,11 @@ 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");
goto finished;
}
while ((opt = getopt(argc, argv, "ho:t:p:sr:w:")) != EOF)
while ((opt = getopt(argc, argv, "h?o:t:p:sr:w:")) != EOF)
{
switch(opt) {
case 'o':
@@ -139,6 +139,7 @@ main(int argc, char *argv[])
}
break;
case 'h':
case '?':
help();
goto finished;
default:

View File

@@ -55,11 +55,11 @@ 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");
goto finished;
}
while ((opt = getopt(argc, argv, "ho:t:p:")) != EOF)
while ((opt = getopt(argc, argv, "h?o:t:p:")) != EOF)
{
switch(opt) {
case 'o':
@@ -80,6 +80,7 @@ main(int argc, char *argv[])
str_upper(property_name);
break;
case 'h':
case '?':
help();
goto finished;
default:

View File

@@ -65,11 +65,11 @@ 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");
goto finished;
}
while ((opt = getopt(argc, argv, "ho:t:p:v")) != EOF)
while ((opt = getopt(argc, argv, "h?o:t:p:v")) != EOF)
{
switch(opt) {
case 'o':
@@ -93,6 +93,7 @@ main(int argc, char *argv[])
verbose = 1;
break;
case 'h':
case '?':
help();
goto finished;
default:
@@ -138,6 +139,7 @@ main(int argc, char *argv[])
{
break;
}
segno += 1;
}
@@ -149,17 +151,19 @@ main(int argc, char *argv[])
{
int objects = 32 * segno;
__u32 *value = (__u32 *)property_value;
int i;
int i = 0;
for (i = 0; i < objects; i++)
while (i < objects)
{
struct ncp_bindery_object o;
if ((*value == 0) || (*value == 0xffffffff))
if ((value[i] == 0) || (value[i] == 0xffffffff))
{
break;
/* Continue with next segment */
i = ((i/32) + 1) * 32;
continue;
}
if (ncp_get_bindery_object_name(conn, ntohl(*value),
if (ncp_get_bindery_object_name(conn, ntohl(value[i]),
&o) == 0)
{
if (verbose != 0)
@@ -174,7 +178,7 @@ main(int argc, char *argv[])
printf("%s\n", o.object_name);
}
}
value += 1;
i += 1;
}
}
result = 0;
@@ -217,6 +221,174 @@ print_string(__u8 *val)
puts(val);
}
static char *
print_station_addr(char *fmt, struct ncp_station_addr *addr, char *buff)
{
char *ret = buff;
while ( *fmt != 0 )
{
switch ( *fmt )
{
case '%':
switch ( *(++fmt) )
{
case 'N': /* node */
{
int i ;
for ( i = 0 ; i < 6 ; buff += 2 , i++ )
{
sprintf(buff, "%02X",addr->Node[i]);
}
}
break;
case 'S': /* Socket */
sprintf(buff, "%04X", htons(addr->Socket));
buff += 4 ;
break ;
case 'L': /* Lan */
sprintf(buff, "%08lX", htonl(addr->NetWork));
buff += 8 ;
break ;
case '%':
*buff++ = '%';
default:
break ;
}
if (*fmt)
{
fmt++ ;
}
break ;
default:
*buff++ = *fmt++ ;
}
}
*buff = 0 ;
return ret ;
}
void
print_login_control ( __u8 *val )
{
int i , j , mask;
char buff[32];
struct ncp_prop_login_control *a =(struct ncp_prop_login_control *)val;
static char *days[]
= { "Sun" , "Mon" , "Tue" , "Wen" , "Thu" , "Fri" , "Sat" } ;
if (a->LastLogin[2] || a->LastLogin[1] || a->LastLogin[0] ||
a->LastLogin[3] || a->LastLogin[4] || a->LastLogin[5])
{
printf("Last Login: %d.%d.%02d at %2d:%02d:%02d\n",
a->LastLogin[2] , a->LastLogin[1] , a->LastLogin[0] ,
a->LastLogin[3] , a->LastLogin[4] , a->LastLogin[5]);
}
else
{
printf("Never logged in\n");
}
if (a->Disabled != 0)
{
printf(" --- Account disabled ---\n");
}
if (a->AccountExpireDate[2] || a->AccountExpireDate[1] ||
a->AccountExpireDate[0])
{
printf("Account expires on: %d.%d.%d\n",
a->AccountExpireDate[2],
a->AccountExpireDate[1],
a->AccountExpireDate[0]);
}
if (a->PasswordExpireDate[2] || a->PasswordExpireDate[1] ||
a->PasswordExpireDate[0])
{
printf("Password expires on: %d.%d.%d\n" ,
a->PasswordExpireDate[2],
a->PasswordExpireDate[1],
a->PasswordExpireDate[0]);
printf("GraceLogins left: %d\nof max. : %d\n",
a->GraceLogins, a->MaxGraceLogins);
printf("PasswortChangeInterval : %d days\n",
ntohs(a->PasswordExpireInterval));
}
if ((a->RestrictionMask & 2) != 0)
{
printf("New password must be different when changing\n");
}
if ((a->RestrictionMask & 1) != 0)
{
printf("User ist not allowed to change password\n");
}
printf("Minimal password length : %d\n", a->MinPasswordLength);
if (ntohs(a->MaxConnections) != 0)
{
printf("Maximum no of connections: %d\n",
ntohs(a->MaxConnections));
}
if ( a->MaxDiskUsage != 0xFFFFFF7FL )
{
printf("Maximum DiskQuota : %8ld blocks\n",
ntohl(a->MaxDiskUsage));
}
printf("Failed Logins: %5d\n", ntohs(a->BadLoginCount));
if (a->BadLoginCountDown != 0L)
{
printf("Account disabled still %8ld seconds\n",
ntohl(a->BadLoginCountDown));
}
if (a->LastIntruder.NetWork != 0L)
{
printf("Last \'intruder\' address: %s\n" ,
print_station_addr("(%L): %N[%S]" ,
&(a->LastIntruder),buff));
}
if ( a->RestrictionMask & 0xFC )
{
printf("RestrictionMask : %02X\n", a->RestrictionMask);
}
for ( i = 0 ; i < 42 ; i++ )
{
if ( a->ConnectionTimeMask[i] != 0xFF )
{
i = 101;
}
}
if ( i < 100 )
{
return;
}
val = a->ConnectionTimeMask;
printf("Time restrictions: 1 1 1 1 1 1 1 1 1 1 2 2 2 2 ]\n");
printf(" Day [0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 ]\n");
for ( i = 0 ; i < 7 ; i++ )
{
printf (" %s [" , days[i]);
for ( j = 0 ; j < 6 ; j++ )
{
for ( mask = 1 ; mask < 0x100 ; mask <<= 1 )
{
putchar ( (*val & mask) ? '*' : ' ' ) ;
}
val++ ;
}
printf ( "]\n" ) ;
}
}
void
print_addr( __u8 *val)
{
char buff[50];
print_station_addr("(%L): %N[%S]",
(struct ncp_station_addr *)val, buff);
printf("%s\n", buff);
}
static struct {
char *pname ;
void (*func)(__u8 *) ;
@@ -227,6 +399,8 @@ static struct {
{ "DESCRIPTION" , print_string } ,
{ "IDENTIFICATION" , print_string } ,
{ "Q_DIRECTORY" , print_string } ,
{ "LOGIN_CONTROL" , print_login_control } ,
{ "NET_ADDRESS" , print_addr } ,
{ NULL , NULL }
};

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

View File

@@ -57,11 +57,11 @@ 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");
goto finished;
}
while ((opt = getopt(argc, argv, "ho:t:r:")) != EOF)
while ((opt = getopt(argc, argv, "h?o:t:r:")) != EOF)
{
switch(opt) {
case 'o':
@@ -75,6 +75,7 @@ main(int argc, char *argv[])
rights = strtol(optarg, NULL, 16);
break;
case 'h':
case '?':
help();
goto finished;
default:

View File

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

View File

@@ -1,5 +1,5 @@
/*
* npasswd.c
* nwpasswd.c
*
* Change a bindery object's password
*
@@ -53,7 +53,7 @@ main(int argc, char *argv[])
progname = argv[0];
while ((opt = getopt(argc, argv, "hS:U:t:")) != EOF)
while ((opt = getopt(argc, argv, "h?S:U:t:")) != EOF)
{
switch(opt) {
case 'S':
@@ -66,6 +66,7 @@ main(int argc, char *argv[])
object_type = atoi(optarg);
break;
case 'h':
case '?':
help();
exit(1);
default:

View File

@@ -55,11 +55,11 @@ 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");
goto finished;
}
while ((opt = getopt(argc, argv, "ho:t:")) != EOF)
while ((opt = getopt(argc, argv, "h?o:t:")) != EOF)
{
switch(opt) {
case 'o':
@@ -70,6 +70,7 @@ main(int argc, char *argv[])
object_type = atoi(optarg);
break;
case 'h':
case '?':
help();
goto finished;
default:

141
util/nwrights.c Normal file
View File

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

143
util/nwuserlist.c Normal file
View File

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

View File

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

View File

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