Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
134b5d6ebf | ||
|
|
ab78307868 | ||
|
|
3019bba627 |
BIN
.downloads/ncpfs-2.0.4.tgz
Normal file
BIN
.downloads/ncpfs-2.0.4.tgz
Normal file
Binary file not shown.
BIN
.downloads/ncpfs-2.0.5.tgz
Normal file
BIN
.downloads/ncpfs-2.0.5.tgz
Normal file
Binary file not shown.
BIN
.downloads/ncpfs-2.0.6.tgz
Normal file
BIN
.downloads/ncpfs-2.0.6.tgz
Normal file
Binary file not shown.
14
BUGS
14
BUGS
@@ -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
29
Changes
@@ -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
|
||||
|
||||
20
Makefile
20
Makefile
@@ -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
23
README
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
16
man/Makefile
16
man/Makefile
@@ -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 *~
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
107
man/nwbpset.1
Normal 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.
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
,
|
||||
|
||||
@@ -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
41
man/nwrights.1
Normal 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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
24
util/nwbpsecurity
Executable 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
238
util/nwbpset.c
Normal 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;
|
||||
}
|
||||
@@ -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 }
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* npasswd.c
|
||||
* nwpasswd.c
|
||||
*
|
||||
* Change a bindery object's password
|
||||
*
|
||||
141
util/nwrights.c
Normal file
141
util/nwrights.c
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user