Compare commits

..

1 Commits

Author SHA1 Message Date
ncpfs archive import
011a5107c5 Import ncpfs 2.0.3 2026-04-28 20:39:58 +02:00
40 changed files with 922 additions and 661 deletions

BIN
.downloads/ncpfs-2.0.3.tgz Normal file

Binary file not shown.

18
Changes
View File

@@ -1,6 +1,22 @@
I only began this file with ncpfs-0.12. If you're interested in older I only began this file with ncpfs-0.12. If you're interested in older
versions, you can find them on ftp.gwdg.de:/pub/linux/misc/ncpfs/old. versions, you can find them on ftp.gwdg.de:/pub/linux/misc/ncpfs/old.
ncpfs-2.0.2 -> ncpfs-2.0.3
- Removed the kernel-2.0 directory. Linus took the patch into 2.0.8.
So, if you want to use long file name support, upgrade to Linux
kernel version 2.0.8.
- Applied the lfn patch to the kernel-1.2 module with some light
testing. If you experience problems, tell it to me, and use the
ncpfs-2.0.2 kernel module, or upgrade to Linux 2.0.8.
- Added unencrypted login when no crypt key is returned.
- Hopefully improved error messages a bit
- Added some values to ipxparse
- For ELF systems, moved ncplib to /lib/libncp.so.1.x. This saves
about 1MB of disk space. As ncpfs grows, the saving will
increase. Please look at the Makefile to enable this.
- Enhanced nwfsinfo a bit. (Even with a manpage!)
- Added nwuserlist.
ncpfs-2.0.1 -> ncpfs-2.0.2 ncpfs-2.0.1 -> ncpfs-2.0.2
- Added some values to ipxparse. - Added some values to ipxparse.
- Added a patch against 2.0.7 for long file names support. I did not - Added a patch against 2.0.7 for long file names support. I did not
@@ -133,4 +149,4 @@ ncpfs-0.12 -> ncpfs-0.13
- support for automatic loading of ncpfs.o by kerneld. - support for automatic loading of ncpfs.o by kerneld.
Thanks to Steven N. Hirsch <hirsch@emba.uvm.edu>. Thanks to Steven N. Hirsch <hirsch@emba.uvm.edu>.
- A subtle problem in the read routines has been removed by Uwe Bonnes - A subtle problem in the read routines has been removed by Uwe Bonnes
<bon@elektron.ikp.physik.th-darmstadt.de>. Thanks a lot. <bon@elektron.ikp.physik.th-darmstadt.de>. Thanks a lot.

7
FAQ
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 Q: When I re-export ncpfs-mounted directories via nfs, I get messages like
'pwd: cannot get current directory', and other strange things happen to 'pwd: cannot get current directory', and other strange things happen to
the nfs clients. What's wrong? the nfs clients. What's wrong?

View File

@@ -2,12 +2,15 @@
# Makefile for the linux ncp-filesystem routines. # Makefile for the linux ncp-filesystem routines.
# #
VERSION = 2.0.2 VERSION = 2.0.3
# If you are using kerneld to autoload ncp support, # If you are using kerneld to autoload ncp support,
# uncomment this (kerneld is in linux since about 1.3.57): # uncomment this (kerneld is in linux since about 1.3.57):
#KERNELD = -DHAVE_KERNELD #KERNELD = -DHAVE_KERNELD
# If your system is ELF, please uncomment the following line:
#HAVE_ELF=yes
TOPDIR = $(shell pwd) TOPDIR = $(shell pwd)
BINDIR = /usr/local/bin BINDIR = /usr/local/bin
SBINDIR = /sbin SBINDIR = /sbin
@@ -21,7 +24,7 @@ SUBDIRS += kernel-1.2/src
INCLUDES = -I$(TOPDIR)/kernel-1.2 INCLUDES = -I$(TOPDIR)/kernel-1.2
endif endif
export INCLUDES BINDIR INTERM_BINDIR SBINDIR KERNELD VERSION export INCLUDES BINDIR INTERM_BINDIR SBINDIR KERNELD VERSION HAVE_ELF
all: all:
for i in $(SUBDIRS); do make -C $$i all; done for i in $(SUBDIRS); do make -C $$i all; done

6
README
View File

@@ -39,6 +39,12 @@ ncpfs.
If you are running kerneld, please uncomment the corresponding line in If you are running kerneld, please uncomment the corresponding line in
the Makefile to reflect this. the Makefile to reflect this.
If your system is ELF, please enable the use of the shared ncp-library
in the Makefile. This will save at least 1MB of disk space.
After you adapted your Makefile, type 'make' and, as root, 'make install'.
HELP HELP
In the meantime my mail volume has grown considerably, so the response In the meantime my mail volume has grown considerably, so the response

View File

@@ -351,6 +351,10 @@ void handle_ncp (struct sockaddr_ipx *source,
switch(rq->function) switch(rq->function)
{ {
case 18:
printf("fn: %-3d\n", rq->function);
printf("Get Volume Info with Number\n");
break;
case 20: case 20:
printf("fn: %-3d\n", rq->function); printf("fn: %-3d\n", rq->function);
printf("Get File Server Date and Time\n"); printf("Get File Server Date and Time\n");
@@ -381,6 +385,9 @@ void handle_ncp (struct sockaddr_ipx *source,
case 01: case 01:
printf("Get Directory Path\n"); printf("Get Directory Path\n");
break; break;
case 02:
printf("Scan Directory Information\n");
break;
case 03: case 03:
printf("Get Effective Directory Rights\n"); printf("Get Effective Directory Rights\n");
break; break;
@@ -390,6 +397,9 @@ void handle_ncp (struct sockaddr_ipx *source,
case 06: case 06:
printf("Get Volume Name\n"); printf("Get Volume Name\n");
break; break;
case 10:
printf("Create directory\n");
break;
case 18: case 18:
printf("Allocate Permanent Dir Handle\n"); printf("Allocate Permanent Dir Handle\n");
break; break;
@@ -399,6 +409,9 @@ void handle_ncp (struct sockaddr_ipx *source,
case 21: case 21:
printf("Get Volume Info with handle\n"); printf("Get Volume Info with handle\n");
break; break;
case 39:
printf("Add ext. Trustee to Dir or File\n");
break;
case 48: case 48:
printf("Get Name Space Directory Entry\n"); printf("Get Name Space Directory Entry\n");
break; break;
@@ -426,21 +439,48 @@ void handle_ncp (struct sockaddr_ipx *source,
case 28: case 28:
printf("Get Connection Information\n"); printf("Get Connection Information\n");
break; break;
case 50:
printf("Create Bindery Object\n");
break;
case 53: case 53:
printf("Get Bindery Object ID\n"); printf("Get Bindery Object ID\n");
break; break;
case 54:
printf("Get Bindery Object Name\n");
break;
case 55: case 55:
printf("Scan Bindery Object\n"); printf("Scan Bindery Object\n");
break; break;
case 57:
printf("Create Property\n");
break;
case 59:
printf("Change Property Security\n");
break;
case 60:
printf("Scan Property\n");
break;
case 61: case 61:
printf("Read Property Value\n"); printf("Read Property Value\n");
break; break;
case 62: case 62:
printf("Write Property Value\n"); printf("Write Property Value\n");
break; break;
case 65:
printf("Add Bindery Object to Set\n");
break;
case 67:
printf("Is Bindery Object in Set\n");
break;
case 70: case 70:
printf("Get Bindery Access Level\n"); printf("Get Bindery Access Level\n");
break; break;
case 72:
printf("Get Bindery Object Access Level\n");
break;
case 75:
printf("Keyed change password\n");
break;
} }
data += 3; data += 3;
@@ -476,6 +516,10 @@ void handle_ncp (struct sockaddr_ipx *source,
printf("fn: %-3d\n", rq->function); printf("fn: %-3d\n", rq->function);
printf("Close File\n"); printf("Close File\n");
break; break;
case 67:
printf("fn: %-3d\n", rq->function);
printf("Create File\n");
break;
case 72: case 72:
printf("fn: %-3d\n", rq->function); printf("fn: %-3d\n", rq->function);
printf("Read from File\n"); printf("Read from File\n");
@@ -488,6 +532,11 @@ void handle_ncp (struct sockaddr_ipx *source,
printf("fn: %-3d\n", rq->function); printf("fn: %-3d\n", rq->function);
printf("Set File Time Date Stamp\n"); printf("Set File Time Date Stamp\n");
break; break;
case 76:
printf("fn: %-3d\n", rq->function);
printf("Open File (old)\n");
break;
case 87: case 87:
printf("fn: %-3d, subfn: %-3d\n", printf("fn: %-3d, subfn: %-3d\n",
rq->function, data[0]); rq->function, data[0]);

View File

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

View File

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

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

View File

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

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,5 +1,5 @@
MAN1= slist nprint pqlist nsend pserver ncopy npasswd MAN1= slist nprint pqlist nsend pserver ncopy npasswd
MAN1 += nwbols nwboprops nwbpvalues MAN1 += nwbols nwboprops nwbpvalues nwfsinfo nwuserlist
MAN5= nwclient MAN5= nwclient
MAN8= ncpmount ncpumount ipx_configure ipx_interface ipx_internal_net \ MAN8= ncpmount ncpumount ipx_configure ipx_interface ipx_internal_net \
ipx_route nwmsg ipx_route nwmsg

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

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

View File

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

View File

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

View File

@@ -1149,6 +1149,11 @@ long
ncp_close(struct ncp_conn *conn) ncp_close(struct ncp_conn *conn)
{ {
long result; long result;
if (conn == NULL)
{
return 0;
}
if ((result = ncp_do_close(conn)) != 0) if ((result = ncp_do_close(conn)) != 0)
{ {
return result; return result;
@@ -1292,7 +1297,7 @@ ncp_get_nwc_ent(FILE *nwc)
} }
FILE * FILE *
ncp_fopen_nwc(const char *user, const char *mode) ncp_fopen_nwc(const char *user, const char *mode, long *err)
{ {
char path[MAXPATHLEN]; char path[MAXPATHLEN];
char *home = NULL; char *home = NULL;
@@ -1320,7 +1325,7 @@ ncp_fopen_nwc(const char *user, const char *mode)
if ( (home == NULL) if ( (home == NULL)
|| (strlen(home) + sizeof(NWCLIENT) + 2 > sizeof(path))) || (strlen(home) + sizeof(NWCLIENT) + 2 > sizeof(path)))
{ {
errno = ENAMETOOLONG; *err = ENAMETOOLONG;
return NULL; return NULL;
} }
@@ -1330,12 +1335,13 @@ ncp_fopen_nwc(const char *user, const char *mode)
if (stat(path, &st) != 0) if (stat(path, &st) != 0)
{ {
*err = errno;
return NULL; return NULL;
} }
if ((st.st_mode & (S_IRWXO | S_IRWXG)) != 0) if ((st.st_mode & (S_IRWXO | S_IRWXG)) != 0)
{ {
errno = EINVAL; *err = NCPL_ET_INVALID_MODE;
return NULL; return NULL;
} }
@@ -1371,11 +1377,9 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
} }
else else
{ {
nwc = ncp_fopen_nwc(NULL, NULL); if ((nwc = ncp_fopen_nwc(NULL, NULL, err)) == NULL)
if (nwc == NULL)
{ {
*err = NCPL_ET_NO_SPEC; *err = NCPL_ET_NO_SERVER;
return NULL; return NULL;
} }
@@ -1391,6 +1395,15 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
strcpy(spec.user, nwc_ent->user); strcpy(spec.user, nwc_ent->user);
} }
str_upper(spec.server);
if (login_necessary == 0)
{
memset(spec.user, 0, sizeof(spec.user));
memset(spec.password, 0, sizeof(spec.password));
return &spec;
}
if (user != NULL) if (user != NULL)
{ {
if (strlen(user) >= sizeof(spec.user)) if (strlen(user) >= sizeof(spec.user))
@@ -1401,7 +1414,6 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
strcpy(spec.user, user); strcpy(spec.user, user);
} }
str_upper(spec.server);
str_upper(spec.user); str_upper(spec.user);
spec.login_type = NCP_BINDERY_USER; spec.login_type = NCP_BINDERY_USER;
@@ -1422,7 +1434,7 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
} }
else else
{ {
if ((nwc = ncp_fopen_nwc(NULL, NULL)) != NULL) if ((nwc = ncp_fopen_nwc(NULL, NULL, err)) != NULL)
{ {
while ((nwc_ent = ncp_get_nwc_ent(nwc)) != NULL) while ((nwc_ent = ncp_get_nwc_ent(nwc)) != NULL)
{ {
@@ -1442,15 +1454,10 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password,
} }
} }
if (login_necessary == 0)
{
memset(spec.user, 0, sizeof(spec.user));
memset(spec.password, 0, sizeof(spec.password));
}
if (strlen(spec.user) == 0) if (strlen(spec.user) == 0)
{ {
return &spec; *err = NCPL_ET_NO_USER;
return NULL;
} }
if ((strlen(spec.password) == 0) && (password == NULL)) if ((strlen(spec.password) == 0) && (password == NULL))
@@ -1817,6 +1824,31 @@ ncp_get_file_server_time(struct ncp_conn *conn, time_t *target)
return 0; return 0;
} }
long
ncp_get_file_server_information(struct ncp_conn *conn,
struct ncp_file_server_info *target)
{
long result;
ncp_init_request_s(conn, 17);
if ((result = ncp_request(conn, 23)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
memcpy(target, ncp_reply_data(conn, 0), sizeof(*target));
target->MaximumServiceConnections
= htons(target->MaximumServiceConnections);
target->ConnectionsInUse
= htons(target->ConnectionsInUse);
target->MaxConnectionsEverUsed
= htons(target->MaxConnectionsEverUsed);
target->NumberMountedVolumes
= htons(target->NumberMountedVolumes);
ncp_unlock_conn(conn);
return 0;
}
long long
ncp_get_connlist(struct ncp_conn *conn, ncp_get_connlist(struct ncp_conn *conn,
__u16 object_type, const char *object_name, __u16 object_type, const char *object_name,
@@ -1840,6 +1872,57 @@ ncp_get_connlist(struct ncp_conn *conn,
return 0; return 0;
} }
long
ncp_get_stations_logged_info(struct ncp_conn *conn,
__u32 connection,
struct ncp_bindery_object *target,
time_t *login_time)
{
long result;
ncp_init_request_s(conn, 28);
ncp_add_dword(conn, connection);
if ((result = ncp_request(conn, 23)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
memset(target, 0, sizeof(*target));
target->object_id = ntohl(ncp_reply_dword(conn, 0));
target->object_type = ntohs(ncp_reply_word(conn, 4));
memcpy(target->object_name, ncp_reply_data(conn, 6),
sizeof(target->object_name));
*login_time = nw_to_ctime((struct nw_time_buffer *)
ncp_reply_data(conn, 54));
ncp_unlock_conn(conn);
return 0;
}
long
ncp_get_internet_address(struct ncp_conn *conn,
__u32 connection,
struct sockaddr_ipx *target,
__u8 *conn_type)
{
long result;
ncp_init_request_s(conn, 26);
ncp_add_dword(conn, connection);
if ((result = ncp_request(conn, 23)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
memset(target, 0, sizeof(*target));
target->sipx_network = ncp_reply_dword(conn, 0);
memcpy(&(target->sipx_node), ncp_reply_data(conn, 4), 6);
target->sipx_port = ncp_reply_word(conn, 10);
*conn_type = ncp_reply_byte(conn, 12);
ncp_unlock_conn(conn);
return 0;
}
long long
ncp_send_broadcast(struct ncp_conn *conn, ncp_send_broadcast(struct ncp_conn *conn,
__u8 no_conn, const __u8 *connections, __u8 no_conn, const __u8 *connections,
@@ -2196,6 +2279,21 @@ ncp_login_encrypted(struct ncp_conn *conn,
return result; return result;
} }
long
ncp_login_unencrypted(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const unsigned char *passwd)
{
long result;
ncp_init_request_s(conn, 20);
ncp_add_word(conn, htons(object_type));
ncp_add_pstring(conn, object_name);
ncp_add_pstring(conn, passwd);
result = ncp_request(conn, 23);
ncp_unlock_conn(conn);
return result;
}
long long
ncp_change_login_passwd(struct ncp_conn *conn, ncp_change_login_passwd(struct ncp_conn *conn,
const struct ncp_bindery_object *object, const struct ncp_bindery_object *object,
@@ -2252,7 +2350,8 @@ ncp_login_object(struct ncp_conn *conn,
struct ncp_bindery_object user; struct ncp_bindery_object user;
if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) { if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) {
return result; return ncp_login_unencrypted(conn, login_type, username,
password);
} }
if ((result = ncp_get_bindery_object_id(conn, login_type, if ((result = ncp_get_bindery_object_id(conn, login_type,
@@ -2672,7 +2771,7 @@ static void
ncp_add_handle_path(struct ncp_conn *conn, ncp_add_handle_path(struct ncp_conn *conn,
__u8 vol_num, __u8 vol_num,
__u32 dir_base, int have_dir_base, __u32 dir_base, int have_dir_base,
char *path) const char *path)
{ {
ncp_add_byte(conn, vol_num); ncp_add_byte(conn, vol_num);
ncp_add_dword(conn, dir_base); ncp_add_dword(conn, dir_base);
@@ -2705,6 +2804,33 @@ ncp_extract_file_info(void *structure, struct nw_info_struct *target)
return; return;
} }
long
ncp_obtain_file_or_subdir_info(struct ncp_conn *conn,
__u8 source_ns, __u8 target_ns,
__u16 search_attribs, __u32 rim,
__u8 vol, __u32 dirent, const char *path,
struct nw_info_struct *target)
{
long result;
ncp_init_request(conn);
ncp_add_byte(conn, 6);
ncp_add_byte(conn, source_ns);
ncp_add_byte(conn, target_ns);
ncp_add_word(conn, search_attribs);
ncp_add_dword(conn, rim);
ncp_add_handle_path(conn, vol, dirent, 1, path);
if ((result = ncp_request(conn, 87)) != 0)
{
ncp_unlock_conn(conn);
return result;
}
ncp_extract_file_info(ncp_reply_data(conn, 0), target);
ncp_unlock_conn(conn);
return 0;
}
long long
ncp_do_lookup(struct ncp_conn *conn, ncp_do_lookup(struct ncp_conn *conn,
struct nw_info_struct *dir, struct nw_info_struct *dir,
@@ -2893,7 +3019,7 @@ ncp_initialize_search(struct ncp_conn *conn,
return result; return result;
} }
memcpy(&(target->s), ncp_reply_data(conn, 0), sizeof(target->s)); memcpy(&(target->s), ncp_reply_data(conn, 0), 9);
target->namespace = namespace; target->namespace = namespace;
ncp_unlock_conn(conn); ncp_unlock_conn(conn);

View File

@@ -155,11 +155,48 @@ ncp_get_file_server_description_strings(struct ncp_conn *conn,
long long
ncp_get_file_server_time(struct ncp_conn *conn, time_t *target); ncp_get_file_server_time(struct ncp_conn *conn, time_t *target);
struct ncp_file_server_info {
__u8 ServerName[48] __attribute__ ((packed));
__u8 FileServiceVersion __attribute__ ((packed));
__u8 FileServiceSubVersion __attribute__ ((packed));
__u16 MaximumServiceConnections __attribute__ ((packed));
__u16 ConnectionsInUse __attribute__ ((packed));
__u16 NumberMountedVolumes __attribute__ ((packed));
__u8 Revision __attribute__ ((packed));
__u8 SFTLevel __attribute__ ((packed));
__u8 TTSLevel __attribute__ ((packed));
__u16 MaxConnectionsEverUsed __attribute__ ((packed));
__u8 AccountVersion __attribute__ ((packed));
__u8 VAPVersion __attribute__ ((packed));
__u8 QueueVersion __attribute__ ((packed));
__u8 PrintVersion __attribute__ ((packed));
__u8 VirtualConsoleVersion __attribute__ ((packed));
__u8 RestrictionLevel __attribute__ ((packed));
__u8 InternetBridge __attribute__ ((packed));
__u8 Reserved[60] __attribute__ ((packed));
};
long
ncp_get_file_server_information(struct ncp_conn *conn,
struct ncp_file_server_info *target);
long long
ncp_get_connlist(struct ncp_conn *conn, ncp_get_connlist(struct ncp_conn *conn,
__u16 object_type, const char *object_name, __u16 object_type, const char *object_name,
int *returned_no, __u8 conn_numbers[256]); int *returned_no, __u8 conn_numbers[256]);
long
ncp_get_stations_logged_info(struct ncp_conn *conn,
__u32 connection,
struct ncp_bindery_object *target,
time_t *login_time);
long
ncp_get_internet_address(struct ncp_conn *conn,
__u32 connection,
struct sockaddr_ipx *target,
__u8 *conn_type);
long long
ncp_send_broadcast(struct ncp_conn *conn, ncp_send_broadcast(struct ncp_conn *conn,
__u8 no_conn, const __u8 *connections, __u8 no_conn, const __u8 *connections,
@@ -265,6 +302,11 @@ ncp_login_encrypted(struct ncp_conn *conn,
const unsigned char *key, const unsigned char *key,
const unsigned char *passwd); const unsigned char *passwd);
long
ncp_login_unencrypted(struct ncp_conn *conn,
__u16 object_type, const char *object_name,
const unsigned char *passwd);
long long
ncp_change_login_passwd(struct ncp_conn *conn, ncp_change_login_passwd(struct ncp_conn *conn,
const struct ncp_bindery_object *object, const struct ncp_bindery_object *object,
@@ -373,6 +415,14 @@ ncp_copy_file(struct ncp_conn *conn,
__u32 count, __u32 count,
__u32 *copied_count); __u32 *copied_count);
long
ncp_obtain_file_or_subdir_info(struct ncp_conn *conn,
__u8 source_ns, __u8 target_ns,
__u16 search_attribs, __u32 rim,
__u8 vol, __u32 dirent, const char *path,
struct nw_info_struct *target);
long long
ncp_do_lookup(struct ncp_conn *conn, ncp_do_lookup(struct ncp_conn *conn,
struct nw_info_struct *dir, struct nw_info_struct *dir,

View File

@@ -3,6 +3,9 @@ error_table NCPL
ec NCPL_ET_NO_SERVER, ec NCPL_ET_NO_SERVER,
"No server found" "No server found"
ec NCPL_ET_NO_USER,
"No username found"
ec NCPL_ET_HOST_UNKNOWN, ec NCPL_ET_HOST_UNKNOWN,
"Server Unknown" "Server Unknown"
@@ -19,7 +22,7 @@ ec NCPL_ET_NO_SPEC,
"Could not find valid connection spec" "Could not find valid connection spec"
ec NCPL_ET_INVALID_MODE, ec NCPL_ET_INVALID_MODE,
"$HOME/.nwclient has invalid mode" "$HOME/.nwclient has invalid mode, must be 600"
ec NCPL_ET_LOGIN_DENIED, ec NCPL_ET_LOGIN_DENIED,
"Login denied" "Login denied"

View File

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

View File

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

View File

@@ -53,7 +53,7 @@ main(int argc, char *argv[])
progname = argv[0]; progname = argv[0];
while ((opt = getopt(argc, argv, "hS:U:t:")) != EOF) while ((opt = getopt(argc, argv, "h?S:U:t:")) != EOF)
{ {
switch(opt) { switch(opt) {
case 'S': case 'S':
@@ -66,6 +66,7 @@ main(int argc, char *argv[])
object_type = atoi(optarg); object_type = atoi(optarg);
break; break;
case 'h': case 'h':
case '?':
help(); help();
exit(1); exit(1);
default: default:

View File

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

View File

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

View File

@@ -83,11 +83,11 @@ main(int argc, char *argv[])
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{ {
com_err(argv[0], err, "in ncp_initialize"); com_err(argv[0], err, "when initializing");
goto finished; 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) { switch(opt) {
case 'o': case 'o':
@@ -122,6 +122,7 @@ main(int argc, char *argv[])
} }
break; break;
case 'h': case 'h':
case '?':
help(); help();
goto finished; goto finished;
default: default:

View File

@@ -59,14 +59,15 @@ main(int argc, char **argv)
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{ {
com_err(argv[0], err, "in ncp_initialize"); com_err(argv[0], err, "when initializing");
return 1; return 1;
} }
while ((opt = getopt(argc, argv, "hvt:")) != EOF) while ((opt = getopt(argc, argv, "h?vt:")) != EOF)
{ {
switch(opt) { switch(opt) {
case 'h': case 'h':
case '?':
help(); help();
exit(1); exit(1);
case 't': case 't':

View File

@@ -56,11 +56,11 @@ main(int argc, char *argv[])
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{ {
com_err(argv[0], err, "in ncp_initialize"); com_err(argv[0], err, "when initializing");
goto finished; goto finished;
} }
while ((opt = getopt(argc, argv, "ho:t:v")) != EOF) while ((opt = getopt(argc, argv, "h?o:t:v")) != EOF)
{ {
switch(opt) { switch(opt) {
case 'o': case 'o':
@@ -74,6 +74,7 @@ main(int argc, char *argv[])
verbose = 1; verbose = 1;
break; break;
case 'h': case 'h':
case '?':
help(); help();
goto finished; goto finished;
default: default:

View File

@@ -53,11 +53,11 @@ main(int argc, char *argv[])
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{ {
com_err(argv[0], err, "in ncp_initialize"); com_err(argv[0], err, "when initializing");
goto finished; goto finished;
} }
while ((opt = getopt(argc, argv, "ho:t:")) != EOF) while ((opt = getopt(argc, argv, "h?o:t:")) != EOF)
{ {
switch(opt) { switch(opt) {
case 'o': case 'o':
@@ -68,6 +68,7 @@ main(int argc, char *argv[])
object_type = atoi(optarg); object_type = atoi(optarg);
break; break;
case 'h': case 'h':
case '?':
help(); help();
goto finished; goto finished;
default: default:

View File

@@ -63,11 +63,11 @@ main(int argc, char *argv[])
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{ {
com_err(argv[0], err, "in ncp_initialize"); com_err(argv[0], err, "when initializing");
goto finished; 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) { switch(opt) {
case 'o': case 'o':
@@ -91,6 +91,7 @@ main(int argc, char *argv[])
value = optarg; value = optarg;
break; break;
case 'h': case 'h':
case '?':
help(); help();
goto finished; goto finished;
default: default:

View File

@@ -87,11 +87,11 @@ main(int argc, char *argv[])
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{ {
com_err(argv[0], err, "in ncp_initialize"); com_err(argv[0], err, "when initializing");
goto finished; 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) { switch(opt) {
case 'o': case 'o':
@@ -139,6 +139,7 @@ main(int argc, char *argv[])
} }
break; break;
case 'h': case 'h':
case '?':
help(); help();
goto finished; goto finished;
default: default:

View File

@@ -55,11 +55,11 @@ main(int argc, char *argv[])
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{ {
com_err(argv[0], err, "in ncp_initialize"); com_err(argv[0], err, "when initializing");
goto finished; goto finished;
} }
while ((opt = getopt(argc, argv, "ho:t:p:")) != EOF) while ((opt = getopt(argc, argv, "h?o:t:p:")) != EOF)
{ {
switch(opt) { switch(opt) {
case 'o': case 'o':
@@ -80,6 +80,7 @@ main(int argc, char *argv[])
str_upper(property_name); str_upper(property_name);
break; break;
case 'h': case 'h':
case '?':
help(); help();
goto finished; goto finished;
default: default:

View File

@@ -65,11 +65,11 @@ main(int argc, char *argv[])
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{ {
com_err(argv[0], err, "in ncp_initialize"); com_err(argv[0], err, "when initializing");
goto finished; 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) { switch(opt) {
case 'o': case 'o':
@@ -93,6 +93,7 @@ main(int argc, char *argv[])
verbose = 1; verbose = 1;
break; break;
case 'h': case 'h':
case '?':
help(); help();
goto finished; goto finished;
default: default:

View File

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

View File

@@ -57,11 +57,11 @@ main(int argc, char *argv[])
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{ {
com_err(argv[0], err, "in ncp_initialize"); com_err(argv[0], err, "when initializing");
goto finished; goto finished;
} }
while ((opt = getopt(argc, argv, "ho:t:r:")) != EOF) while ((opt = getopt(argc, argv, "h?o:t:r:")) != EOF)
{ {
switch(opt) { switch(opt) {
case 'o': case 'o':
@@ -75,6 +75,7 @@ main(int argc, char *argv[])
rights = strtol(optarg, NULL, 16); rights = strtol(optarg, NULL, 16);
break; break;
case 'h': case 'h':
case '?':
help(); help();
goto finished; goto finished;
default: default:

View File

@@ -55,11 +55,11 @@ main(int argc, char *argv[])
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{ {
com_err(argv[0], err, "in ncp_initialize"); com_err(argv[0], err, "when initializing");
goto finished; goto finished;
} }
while ((opt = getopt(argc, argv, "ho:t:")) != EOF) while ((opt = getopt(argc, argv, "h?o:t:")) != EOF)
{ {
switch(opt) { switch(opt) {
case 'o': case 'o':
@@ -70,6 +70,7 @@ main(int argc, char *argv[])
object_type = atoi(optarg); object_type = atoi(optarg);
break; break;
case 'h': case 'h':
case '?':
help(); help();
goto finished; goto finished;
default: default:

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) if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{ {
com_err(argv[0], err, "in ncp_initialize"); com_err(argv[0], err, "when initializing");
return 1; return 1;
} }

View File

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