Compare commits

..

3 Commits

Author SHA1 Message Date
ncpfs archive import
134b5d6ebf Import ncpfs 2.0.6 2026-04-28 20:39:58 +02:00
ncpfs archive import
ab78307868 Import ncpfs 2.0.5 2026-04-28 20:39:58 +02:00
ncpfs archive import
3019bba627 Import ncpfs 2.0.4 2026-04-28 20:39:58 +02:00
31 changed files with 1484 additions and 75 deletions

BIN
.downloads/ncpfs-2.0.4.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-2.0.5.tgz Normal file

Binary file not shown.

BIN
.downloads/ncpfs-2.0.6.tgz Normal file

Binary file not shown.

14
BUGS
View File

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

29
Changes
View File

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

View File

@@ -2,14 +2,17 @@
# Makefile for the linux ncp-filesystem routines.
#
VERSION = 2.0.3
VERSION = 2.0.6
# If you are using kerneld to autoload ncp support,
# uncomment this (kerneld is in linux since about 1.3.57):
#KERNELD = -DHAVE_KERNELD
# If your system is ELF, please uncomment the following line:
#HAVE_ELF=yes
# 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
@@ -28,6 +31,17 @@ 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

23
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

View File

@@ -329,9 +329,10 @@ int handle_burst(struct sockaddr_ipx *source,
return 1;
}
void handle_ncp (struct sockaddr_ipx *source,
struct sockaddr_ipx *target,
unsigned char *buf, int length, int no)
void
handle_ncp(struct sockaddr_ipx *source,
struct sockaddr_ipx *target,
unsigned char *buf, int length, int no)
{
struct ncp_request_header *rq = (struct ncp_request_header *)buf;
struct ncp_reply_header *rs = (struct ncp_reply_header *)buf;
@@ -339,6 +340,10 @@ void handle_ncp (struct sockaddr_ipx *source,
int data_length = 0;
int i;
static struct sockaddr_ipx request_source;
static struct ncp_request_header request_header;
static char request_data[5];
if (ntohs(rq->type) == NCP_REQUEST)
{
/* Request */
@@ -346,6 +351,10 @@ void handle_ncp (struct sockaddr_ipx *source,
rq->conn_low + 256 * rq->conn_high,
rq->sequence, rq->task);
memcpy(&request_source, source, sizeof(request_source));
memcpy(&request_header, rq, sizeof(request_header));
memcpy(request_data, rq+1, sizeof(request_data));
data = buf + sizeof(struct ncp_request_header);
data_length = length - sizeof(struct ncp_request_header);
@@ -481,6 +490,12 @@ void handle_ncp (struct sockaddr_ipx *source,
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;
@@ -577,13 +592,343 @@ void handle_ncp (struct sockaddr_ipx *source,
data_length -= 1;
break;
case 97:
{
struct INPUT
{
__u16 proposed_max_size;
__u8 security_flag;
} *i = (struct INPUT *)data;
printf("fn: %-3d\n", rq->function);
printf("Get Big Packet NCP Max Packet Size\n");
printf("proposed_max_size: %x\n",
ntohs(i->proposed_max_size));
printf("security_flag: %x\n",
i->security_flag);
break;
}
case 101:
{
struct INPUT
{
__u32 local_conn_id;
__u32 local_max_packet_size;
__u16 local_target_socket;
__u32 local_max_send_size;
__u32 local_max_recv_size;
} *i = (struct INPUT *)data;
printf("fn: %-3d\n", rq->function);
printf("Packet Burst Connection Request\n");
printf("local_conn_id: %lx\n",
ntohl(i->local_conn_id));
printf("local_max_packet_size: %lx\n",
ntohl(i->local_max_packet_size));
printf("local_target_socket: %lx\n",
ntohl(i->local_target_socket));
printf("local_max_send_size: %lx\n",
ntohl(i->local_max_send_size));
printf("local_max_recv_size: %lx\n",
ntohl(i->local_max_recv_size));
}
break;
case 104:
{
printf("fn: %-3d, subfn: %-3d, NDS call\n",
rq->function, data[0]);
/* I took this information from the (german!!)
book 'Einf"uhrung in die NetWare LAN
Analyse', Laura A. Chappell, Dan E. Hakes,
Novell Press, Markt & Technik, ISBN
3-8272-5084-6, and from the book mentioned
in the ncpfs README. I'm not sure it is
correct, because I do not have NW 4.x. If
you have the time, could you watch a NW4
workstation, and tell me whether anything
of this makes sense at all. */
switch(data[0])
{
case 1:
printf("Ping for NDS\n");
break;
case 2:
{
struct INPUT
{
__u8 subfunction_code;
__u32 fragger_handle;
__u32 max_fragment_size;
__u32 message_size;
__u32 fragment_flag;
__u32 verb;
} *i = (struct INPUT *)data;
printf("Send NDS Fragment Request/Reply\n");
printf("fragger_handle: %lx\n",
(unsigned long)i->fragger_handle);
printf("max_fragment_size: %lx\n",
(unsigned long)i->max_fragment_size);
printf("message_size: %lx\n",
(unsigned long)i->message_size);
printf("fragment_flag: %lx\n",
(unsigned long)i->fragment_flag);
printf("verb: %d\n", i->verb);
switch (i->verb)
{
case 1:
printf("Resolve Name\n");
break;
case 2:
printf("Read Entry Information\n");
break;
case 3:
printf("Read\n");
break;
case 4:
printf("Compare\n");
break;
case 5:
printf("List\n");
break;
case 6:
printf("Search Entries\n");
break;
case 7:
printf("Add Entry\n");
break;
case 8:
printf("Remove Entry\n");
break;
case 9:
printf("Modify Entry\n");
break;
case 10:
printf("Modify RDN\n");
break;
case 11:
printf("Create Attribute\n");
break;
case 12:
printf("Read Attribute Definition\n");
break;
case 13:
printf("Remove Attribute Definition\n");
break;
case 14:
printf("Define Class\n");
break;
case 15:
printf("Read Class Definition\n");
break;
case 16:
printf("Modify Class Definition\n");
break;
case 17:
printf("Remove Class Definition\n");
break;
case 18:
printf("List Containable Classes\n");
break;
case 19:
printf("Get Effective Rights\n");
break;
case 20:
printf("Add Partition\n");
break;
case 21:
printf("Remove Partition\n");
break;
case 22:
printf("List Partitions\n");
break;
case 23:
printf("Split Partition\n");
break;
case 24:
printf("Join Partitions\n");
break;
case 25:
printf("Add Replica\n");
break;
case 26:
printf("Remove Replica\n");
break;
case 27:
printf("Open Stream\n");
break;
case 28:
printf("Search Filter\n");
break;
case 29:
printf("Create Subordinate Reference\n");
break;
case 30:
printf("Link Replica\n");
break;
case 31:
printf("Change Replica Type\n");
break;
case 32:
printf("Start Update Schema\n");
break;
case 33:
printf("End Update Schema\n");
break;
case 34:
printf("Update Schema\n");
break;
case 35:
printf("Start Update Replica\n");
break;
case 36:
printf("End Update Replica\n");
break;
case 37:
printf("Update Replica\n");
break;
case 38:
printf("Synchronize Partition\n");
break;
case 39:
printf("Synchronize Schema\n");
break;
case 40:
printf("Read Syntaxes\n");
break;
case 41:
printf("Get Replica Root ID\n");
break;
case 42:
printf("Begin Move Entry\n");
break;
case 43:
printf("Finish Move Entry\n");
break;
case 44:
printf("Release Moved Entry\n");
break;
case 45:
printf("Backup Entry\n");
break;
case 46:
printf("Restore Entry\n");
break;
case 47:
printf("Save DIB\n");
break;
case 48:
case 49:
printf("Unused\n");
break;
case 50:
printf("Close Iteration\n");
break;
case 51:
printf("Unused\n");
break;
case 52:
printf("Audit Skulking\n");
break;
case 53:
printf("Get Server Address\n");
break;
case 54:
printf("Set Keys\n");
break;
case 55:
printf("Change Password\n");
break;
case 56:
printf("Verify Password\n");
break;
case 57:
printf("Begin Login\n");
break;
case 58:
printf("Finish Login\n");
break;
case 59:
printf("Begin Authentication\n");
break;
case 60:
printf("Finish Authentication\n");
break;
case 61:
printf("Logout\n");
break;
case 62:
printf("Repair Ring\n");
break;
case 63:
printf("Repair Timestamps\n");
break;
case 64:
printf("Create Back Link\n");
break;
case 65:
printf("Delete External Reference\n");
break;
case 66:
printf("Rename External Reference\n");
break;
case 67:
printf("Create Directory Entry\n");
break;
case 68:
printf("Remove Directory Entry\n");
break;
case 69:
printf("Designate New Master\n");
break;
case 70:
printf("Change Tree Name\n");
break;
case 71:
printf("Partition Entry Count\n");
break;
case 72:
printf("Check Login Restrictions\n");
break;
case 73:
printf("Start Join\n");
break;
case 74:
printf("Low Level Split\n");
break;
case 75:
printf("Low Level Join\n");
break;
case 76:
printf("Abort Low Level Join\n");
break;
case 77:
printf("Get All Servers\n");
break;
default:
printf("Unknown Verb: %d\n",
data[0]);
break;
}
break;
}
case 3:
printf("Close NDS Fragment\n");
break;
case 4:
printf("Return Bindery Context\n");
break;
case 5:
printf("Monitor NDS connection\n");
break;
case 200:
printf("NDS Auditing\n");
break;
default:
break;
}
}
default:
printf("fn: %-3d\n", rq->function);
}
@@ -599,6 +944,70 @@ void handle_ncp (struct sockaddr_ipx *source,
data = buf + sizeof(struct ncp_reply_header);
data_length = length - sizeof(struct ncp_reply_header);
if ( (memcmp(&request_source, target,
sizeof(request_source)) == 0)
&& (request_header.sequence == rs->sequence))
{
switch (request_header.function)
{
case 22:
switch (request_data[2])
{
case 18:
{
struct XDATA
{
__u8 new_directory_handle;
__u8 access_rights_mask;
} *x = (struct XDATA *)data;
printf("new_directory_handle: %x\n",
x->new_directory_handle);
printf("access_rights_mask: %x\n",
x->access_rights_mask);
}
break;
}
break;
case 72:
printf("Read data\n");
data_length = 0;
break;
case 97:
{
struct XDATA
{
__u16 accepted_max_size;
__u16 echo_socket;
__u8 security_flag;
} *x = (struct XDATA *)data;
printf("accepted_max_size: %x\n",
ntohs(x->accepted_max_size));
printf("echo_socket: %x\n",
ntohs(x->echo_socket));
printf("security_flag: %x\n",
(x->security_flag));
}
break;
case 101:
{
struct XDATA
{
__u8 completion_code;
__u32 remote_target_id;
__u32 remote_max_packet_size;
} *x = (struct XDATA *)data;
printf("completion_code: %x\n",
x->completion_code);
printf("remote_target_id: %lx\n",
ntohl(x->remote_target_id));
printf("remote_max_packet_size: %lx\n",
ntohl(x->remote_max_packet_size));
}
break;
}
}
}
if (data == NULL)

View File

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

@@ -22,9 +22,10 @@ nwbols \- List NetWare Bindery Objects
.B -t
.I type
] [
.B -v
.B -o
.I pattern
] [
.B pattern
.B -v
]
.SH DESCRIPTION
@@ -95,7 +96,8 @@ objects to be listed.
must be given as a decimal number.
.RE
.B pattern
.B -o
.I pattern
.RS 3
Specifying a pattern is another way to restrict the objects
listed. Please note that this pattern is evaluated by the NetWare

107
man/nwbpset.1 Normal file
View File

@@ -0,0 +1,107 @@
.TH NWBPSET 1 8/7/1996 nwbpset nwbpset
.SH NAME
nwbpset \- Create a bindery property or set its value
.SH SYNOPSIS
.B nwbpset
[
.B -h
] [
.B -S
.I server
] [
.B -U
.I user name
] [
.B -P
.I password
|
.B -n
] [
.B -C
]
.SH DESCRIPTION
.B nwbpset
Reads a property specification from the standard input and creates and
sets the corresponding property. The format is determined by the
output of 'nwbpvalues -c'. nwbpset will hopefully become an important
part of the bindery management suite of ncpfs, together with
'nwbpvalues -c'. See util/nwbpsecurity for an example.
As another example, look at the following command line:
nwbpvalues -t 1 -o supervisor -p user_defaults -c |\\
sed '2s/.*/ME/'|\\
sed '3s/.*/LOGIN_CONTROL/'|\\
nwbpset
With this command, the property user_defaults of the user object
\'supervisor\' is copied into the property login_control of the user
object \'me\'.
nwbpvalues -t 1 -o me -p login_control -c |\\
sed '9s/.*/ff/'|\\
nwbpset
This command disables the user object me.
Feel free to contribute other examples!
.B nwbpset
looks up the file
.I $HOME/.nwclient
to find a file server, a user name and possibly a password. See
nwclient(5) for more information. Please note that the access
permissions of $HOME/.nwclient MUST be 600 for security reasons.
.SH OPTIONS
.B -h
.RS 3
.B -h
is used to print out a short help text.
.RE
.B -S
.I server
.RS 3
.B server
is the name of the server you want to use.
.RE
.B -U
.I user
.RS 3
.B user
is the user name to use for login.
.RE
.B -P
.I password
.RS 3
.B password
is the password to use for login. If neither
.B -n
nor
.B -P
are given, and the user has no open connection to the server, nwbpset
prompts for a password.
.RE
.B -n
.RS 3
.B -n
should be given if no password is required for the login.
.RE
.B -C
.RS 3
By default, passwords are converted to uppercase before they are sent
to the server, because most servers require this. You can turn off
this conversion by
.B -C.
.RE
.SH AUTHORS
nwbpset was written by Volker Lendecke. See the Changes file of ncpfs
for other contributors.

View File

@@ -29,6 +29,8 @@ nwbpvalues \- Print a NetWare Bindery Propery's contents
.I property
] [
.B -v
] [
.B -c
]
.SH DESCRIPTION
@@ -122,6 +124,11 @@ the object flags, its security byte and the properties flag is also
listed.
.RE
.B -c
.RS 3
Use canonical output, to be used with nwbpset.
.RE
.SH AUTHORS
nwbpvalues was written by Volker Lendecke with the corresponding
Caldera utility in mind. See the Changes file of ncpfs for other

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
,

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.

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

View File

@@ -2,10 +2,10 @@
# 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 nwuserlist
USERUTILS += nwbpcreate nwbprm nwbpvalues nwbpadd nwbpset
USERUTILS += nwgrant nwrevoke nwuserlist nwrights
UIDUTILS = ncpmount ncpumount
SBINUTILS = nwmsg
@@ -60,6 +60,8 @@ $(NCP_LIB): ncplib.o ncplib_err.o $(COM_ERR_CFILES)
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
@@ -82,8 +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 libncp.so.*
rm -f *.o *~ slist test ncptest ncplib_err.[ch]
rm -f libncp.*
mrproper: clean
make -C com_err mrproper

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;
}
@@ -2255,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,
@@ -2831,6 +2899,34 @@ ncp_obtain_file_or_subdir_info(struct ncp_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,

View File

@@ -235,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));
@@ -251,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
@@ -296,6 +302,22 @@ 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,
@@ -422,6 +444,22 @@ ncp_obtain_file_or_subdir_info(struct ncp_conn *conn,
__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,

View File

@@ -37,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

@@ -182,6 +182,43 @@ test_readdir(struct ncp_conn *conn)
}
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[])
@@ -195,7 +232,7 @@ main(int argc, char *argv[])
return 1;
}
test_readdir(conn);
test_rights(conn);
ncp_close(conn);
return 0;
}

View File

@@ -36,6 +36,7 @@ help(void)
"-C Don't convert password to uppercase\n"
"\n"
"-t type Object type to be listed (decimal)\n"
"-o object Object pattern\n"
"-v Verbose listing\n"
"\n");
}
@@ -63,7 +64,7 @@ main(int argc, char **argv)
return 1;
}
while ((opt = getopt(argc, argv, "h?vt:")) != EOF)
while ((opt = getopt(argc, argv, "h?vt:o:")) != EOF)
{
switch(opt) {
case 'h':
@@ -73,6 +74,9 @@ main(int argc, char **argv)
case 't':
type = atoi(optarg);
break;
case 'o':
pattern = optarg;
break;
case 'v':
verbose = 1;
break;
@@ -82,17 +86,12 @@ main(int argc, char **argv)
}
}
if (optind < argc-1)
if (optind < argc)
{
usage();
exit(1);
}
if (optind == argc-1)
{
pattern = argv[optind];
}
for (p = pattern; *p != '\0'; p++)
{
*p = toupper(*p);

24
util/nwbpsecurity Executable file
View File

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

238
util/nwbpset.c Normal file
View File

@@ -0,0 +1,238 @@
/*
* nwbpset.c
*
* Create a property and set its values
*
* Copyright (C) 1996 by Volker Lendecke
*
*/
#include "ncplib.h"
#include <unistd.h>
#include <stdlib.h>
static char *progname;
static void
usage(void)
{
fprintf(stderr, "usage: %s [options]\n", progname);
}
static void
help(void)
{
printf("\n");
printf("usage: %s [options] [values]\n", progname);
printf("\n"
"-h Print this help text\n"
"-S server Server name to be used\n"
"-U username Username sent to server\n"
"-P password Use this password\n"
"-n Do not use any password\n"
"-C Don't convert password to uppercase\n"
"\n");
}
static char *
get_line(char *buf, int len, FILE *stream)
{
char *result = fgets(buf, len, stream);
if (result != NULL)
{
buf[strlen(buf)-1] = '\0'; /* remove newline */
}
return result;
}
int
main(int argc, char *argv[])
{
struct ncp_conn *conn;
char object_name[49];
int object_type = -1;
char property_name[17];
int property_flag, property_security;
struct ncp_property_info info;
long err;
int result = 1;
char buf[512];
int opt;
progname = argv[0];
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
{
com_err(argv[0], err, "when initializing");
goto finished;
}
while ((opt = getopt(argc, argv, "h?")) != EOF)
{
switch(opt) {
case 'h':
case '?':
help();
goto finished;
default:
usage();
goto finished;
}
}
memset(buf, 0, sizeof(buf));
if (get_line(buf, sizeof(buf), stdin) == NULL)
{
fprintf(stderr, "Illegal format on stdin\n");
goto finished;
}
object_type = strtoul(buf, NULL, 16);
memset(object_name, 0, sizeof(object_name));
if (get_line(object_name, sizeof(object_name), stdin) == NULL)
{
fprintf(stderr, "Illegal format on stdin\n");
goto finished;
}
memset(property_name, 0, sizeof(property_name));
if (get_line(property_name, sizeof(property_name), stdin) == NULL)
{
fprintf(stderr, "Illegal format on stdin\n");
goto finished;
}
memset(buf, 0, sizeof(buf));
if (get_line(buf, sizeof(buf), stdin) == NULL)
{
fprintf(stderr, "Illegal format on stdin\n");
goto finished;
}
property_flag = (atoi(buf) & 3);
memset(buf, 0, sizeof(buf));
if (get_line(buf, sizeof(buf), stdin) == NULL)
{
fprintf(stderr, "Illegal format on stdin\n");
goto finished;
}
property_security = (strtoul(buf, NULL, 16) & 0xff);
if (ncp_scan_property(conn, object_type, object_name,
0xffffffff, property_name, &info) == 0)
{
/* Property already exists */
if ((property_flag & 2) != (info.property_flags & 2))
{
fprintf(stderr, "Tried to write %s property\n",
(property_flag & 2) != 0 ?
"SET over existing ITEM" :
"ITEM over existing SET");
goto finished;
}
if (info.property_security != property_security)
{
if (ncp_change_property_security(conn, object_type,
object_name,
property_name,
property_security)!=0)
{
fprintf(stderr, "Could not change "
"property security\n");
goto finished;
}
}
}
else
{
if (ncp_create_property(conn, object_type, object_name,
property_name, property_flag,
property_security) != 0)
{
fprintf(stderr, "Could not create property\n");
goto finished;
}
}
if ((property_flag & 2) == 0)
{
/* ITEM property */
int i;
int length;
int segno;
char property_value[255*128];
memset(property_value, 0, sizeof(property_value));
for (i = 0; i < sizeof(property_value); i++)
{
if (get_line(buf, sizeof(buf), stdin) == NULL)
{
break;
}
property_value[i] = strtoul(buf, NULL, 16);
}
length = i-1;
for (segno = 1; segno <= 255; segno++)
{
struct nw_property segment;
int offset = (segno-1)*128;
if ( offset > length )
{
/* everything written */
break;
}
memcpy(segment.value, &(property_value[offset]), 128);
segment.more_flag = segno*128 < length;
if (ncp_write_property_value(conn, object_type,
object_name,
property_name,
segno, &segment) != 0)
{
fprintf(stderr, "Could not write property\n");
goto finished;
}
}
}
else
{
/* SET property */
while (get_line(buf, sizeof(buf), stdin) != NULL)
{
int element_type = strtoul(buf, NULL, 16);
char element_name[49];
memset(element_name, 0, sizeof(element_name));
if (get_line(element_name, sizeof(element_name),
stdin) == NULL)
{
fprintf(stderr, "Illegal format on stdin\n");
goto finished;
}
if (ncp_add_object_to_set(conn, object_type,
object_name, property_name,
element_type,
element_name) != 0)
{
if (conn->completion != 0xE9) /* object already
in set */
{
fprintf(stderr, "Could not add object "
"to set\n");
goto finished;
}
}
}
}
result = 0;
finished:
ncp_close(conn);
return result;
}

View File

@@ -40,6 +40,7 @@ help(void)
"-t type Object type (decimal value)\n"
"-p property Name of property to be listed\n"
"-v Verbose object listing\n"
"-c Canonical output, for use with nwbpadd\n"
"\n");
}
@@ -53,6 +54,7 @@ main(int argc, char *argv[])
__u8 property_value[255*128];
int segno;
int verbose = 0;
int canonical = 0;
struct nw_property segment;
struct ncp_property_info info;
long err;
@@ -69,7 +71,7 @@ main(int argc, char *argv[])
goto finished;
}
while ((opt = getopt(argc, argv, "h?o:t:p:v")) != EOF)
while ((opt = getopt(argc, argv, "h?o:t:p:vc")) != EOF)
{
switch(opt) {
case 'o':
@@ -92,6 +94,9 @@ main(int argc, char *argv[])
case 'v':
verbose = 1;
break;
case 'c':
canonical = 1;
break;
case 'h':
case '?':
help();
@@ -139,31 +144,59 @@ main(int argc, char *argv[])
{
break;
}
segno += 1;
}
if (canonical != 0)
{
printf("%-4.4x\n%s\n", object_type, object_name);
printf("%s\n%d\n%x\n",
info.property_name, info.property_flags, info.property_security);
}
if ((info.property_flags & 2) == 0)
{
print_property(property_name, property_value, segno);
/* ITEM property */
if (canonical != 0)
{
int i;
for (i = 0; i < segno*128; i++)
{
printf("%-2.2x\n", property_value[i]);
}
}
else
{
print_property(property_name, property_value, segno);
}
}
else
{
int objects = 32 * segno;
__u32 *value = (__u32 *)property_value;
int i;
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)
if (canonical != 0)
{
printf("%-4.4x\n%s\n",
(unsigned int) o.object_type,
o.object_name);
}
else if (verbose != 0)
{
printf("%s %08X %04X\n",
o.object_name,
@@ -175,7 +208,7 @@ main(int argc, char *argv[])
printf("%s\n", o.object_name);
}
}
value += 1;
i += 1;
}
}
result = 0;
@@ -218,6 +251,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 *) ;
@@ -228,6 +429,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

@@ -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
*

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