Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c6c6fbe4ca |
BIN
.downloads/ncpfs-2.1.1.tgz
Normal file
BIN
.downloads/ncpfs-2.1.1.tgz
Normal file
Binary file not shown.
5
BUGS
5
BUGS
@@ -13,8 +13,9 @@ down the complete ipx subsystem by deleting all ipx interfaces,
|
||||
unmounting all ncpfs volumes (in this order!) and restarting all
|
||||
again.
|
||||
|
||||
This problem has been solved by Martin Stover (THANKS!!)
|
||||
See patches/lockup-2.0.30.diff for the fix.
|
||||
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!
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
|
||||
85
Changes
85
Changes
@@ -1,88 +1,9 @@
|
||||
I only began this file with ncpfs-0.12. If you're interested in older
|
||||
versions, you can find them on ftp.gwdg.de:/pub/linux/misc/ncpfs/old.
|
||||
|
||||
[Versions ncpfs-2.0.11.x are available at ftp://platan.vc.cvut.cz/pub/linux/ncpfs]
|
||||
|
||||
ncpfs-2.0.11.19 -> ncpfs-2.0.12
|
||||
- Polished for release 2.0.12
|
||||
- Dave: pserver fixes, including addition of %d flag.
|
||||
|
||||
ncpfs-2.0.11.18 -> ncpfs-2.0.11.19
|
||||
- Dave, VANA: new userspace utilities - pqstat and pqrm
|
||||
|
||||
ncpfs-2.0.11.17 -> ncpfs-2.0.11.18 (no userspace change)
|
||||
- Dave: getwd() did not work on 2.1.x
|
||||
- VANA: Volumes are now allways listed lowercased on 2.1.x
|
||||
|
||||
ncpfs-2.0.11.16 -> ncpfs-2.0.11.17
|
||||
- Dave@imladris.demon.co.uk: Patch to pserver, ncp_get_broadcast_message
|
||||
- VANA & Dave: Cleanup for glibc, I hope that complete (xcpt. few warnings
|
||||
about long int vs. u_int32_t
|
||||
|
||||
ncpfs-2.0.11.15 -> ncpfs-2.0.11.16
|
||||
- VANA: Removed symlink latest from archive :-)
|
||||
- VANA: Added ncp_send_broadcast2
|
||||
|
||||
ncpfs-2.0.11.14 -> ncpfs-2.0.11.15
|
||||
- VANA: Fixed bug: wrong completion code returned when login to server without
|
||||
r/w replica of logged-in user
|
||||
- VANA: It is possible to disable NFS and/or OS2 namespace support in mount
|
||||
|
||||
ncpfs-2.0.11.13 -> ncpfs-2.0.11.14
|
||||
- VANA: One source for 2.0 and 2.1 kernels
|
||||
- Chirstian Groessler: Added strong mounts
|
||||
|
||||
ncpfs-2.0.11.12 -> ncpfs-2.0.11.13
|
||||
- Arne: Signatures added to ncpfs-nds-0.06
|
||||
- VANA: Synchronized sources with Arne
|
||||
|
||||
ncpfs-2.0.11.11 -> ncpfs-2.0.11.12
|
||||
- VANA: Fixed compilation error if compiled against kernel without signatures even
|
||||
if SIGNATURES = 0 set
|
||||
|
||||
ncpfs-2.0.11.10 -> ncpfs-2.0.11.11
|
||||
- VANA: Fixed segfault on invalid user name in NDS mode
|
||||
- VANA: Added locking features (through ncpfs-specific ioctl(2))
|
||||
|
||||
ncpfs-2.0.11.9 -> ncpfs-2.0.11.10
|
||||
- VANA: Synchronized with nds-patches-0.05 from Arne@knoware.nl
|
||||
|
||||
ncpfs-2.0.11.8 -> ncpfs-2.0.11.9
|
||||
- VANA: Added call to lock connection (dropped in 2.0.11.7, sorry)
|
||||
|
||||
ncpfs-2.0.11.7 -> ncpfs-2.0.11.8
|
||||
- VANA: Can be correctly compiled without signatures support in kernel (I hope)
|
||||
- VANA: Fix in kernel in setting task number
|
||||
|
||||
ncpfs-2.0.11.6 -> ncpfs-2.0.11.7
|
||||
- VANA: Codebase synchronized with arne@knoware.nl
|
||||
- ARNE: Gracelogins on NDS
|
||||
- VANA: Removed some (one) compilation warnings
|
||||
|
||||
ncpfs-2.0.11.5 -> ncpfs-2.0.11.6
|
||||
- VANA: Support for NDS login accross servers
|
||||
|
||||
ncpfs-2.0.11.4 -> ncpfs-2.0.11.5
|
||||
- VANA: Cleanup in ndscrypt
|
||||
- VANA: Bugfix: empty password for NDS login is now allowed & works
|
||||
|
||||
ncpfs-2.0.11.3 -> ncpfs-2.0.11.4
|
||||
- Enabled some buffer cleaning
|
||||
- Added parameter "-b" to ncpmount for bindery login to NDS server
|
||||
|
||||
ncpfs-2.0.11.2 -> ncpfs-2.0.11.3
|
||||
- Added NDS support by Arne@knoware.nl; small fixes in code; moved sections
|
||||
to do same things as DOS login does.
|
||||
|
||||
ncpfs-2.0.11.1 -> ncpfs-2.0.11.2
|
||||
- VANA: Fixed that some error conditions in LOGIN should start packet signatures
|
||||
|
||||
ncpfs-2.0.11 -> ncpfs-2.0.11.1
|
||||
- VANA: Added packet signatures by ... (Arne?)
|
||||
|
||||
ncpfs-2.0.10 -> ncpfs-2.0.11
|
||||
- Added Martin's patch to Linux 2.0.30 to get rid of the lockups.
|
||||
MANY thanks to Martin Stover!
|
||||
ncpfs-2.0.10 -> ncpfs-2.1.1
|
||||
- Restructured the kernel part a bit, moved watchdog and message support
|
||||
out of the kernel into ncpmount.
|
||||
|
||||
ncpfs-2.0.9 -> ncpfs-2.0.10
|
||||
- Made nwtrustee hopefully work ;-)
|
||||
|
||||
19
FAQ
19
FAQ
@@ -35,9 +35,6 @@ doing this.
|
||||
A promising hint that has already helped some people is to switch off
|
||||
packet signatures on the 4.1 server, as ncpfs does not support them.
|
||||
|
||||
Note: ncpfs, as of 2.0.12, and kernel 2.1.89, does now support packet
|
||||
signatures.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Q: When I re-export ncpfs-mounted directories via nfs, I get messages like
|
||||
@@ -57,10 +54,14 @@ When you want to export a directory via NFS, you have to do two things:
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Q: I cannot login into server with these utilities. It was possible with an
|
||||
older version.
|
||||
Q: When I compile ncpfs, I get a message like the following:
|
||||
|
||||
A: You are probably connecting into Netware 4.x or IntraNetware. If you want a
|
||||
temporary workaround, add the option "-b" to the ncpmount commandline.
|
||||
For the future you should determine your Directory Services user name and
|
||||
use that instead of your bindery name.
|
||||
make[1]: Entering directory `/home/me/netware/ncpfs/kernel-1.2/src'
|
||||
gcc -D__KERNEL__ -I. -Wall -Wstrict-prototypes -O2 -DMODULE -fomit-frame-pointer -I/home/me/netware/ncpfs/kernel-1.2 -DNCPFS_VERSION=\"0.17\" -c dir.c
|
||||
dir.c:36: warning: `struct dirent' declared inside parameter list
|
||||
dir.c:36: warning: its scope is only this definition or declaration,
|
||||
...
|
||||
|
||||
You try to compile the part of ncpfs that is meant for kernel 1.2.13 under
|
||||
kernel 1.3.x. Please look at the Makefile and comment out the
|
||||
corresponding lines.
|
||||
|
||||
27
Makefile
27
Makefile
@@ -2,7 +2,7 @@
|
||||
# Makefile for the linux ncp-filesystem routines.
|
||||
#
|
||||
|
||||
VERSION = 2.0.12
|
||||
VERSION = 2.1.1
|
||||
|
||||
# If you are using kerneld to autoload ncp support,
|
||||
# uncomment this (kerneld is in linux since about 1.3.57):
|
||||
@@ -14,24 +14,6 @@ KERNELD = -DHAVE_KERNELD
|
||||
HAVE_ELF=$(shell file `whereis gcc|cut -d ' ' -f 2`| \
|
||||
grep ELF >/dev/null && echo -n yes )
|
||||
|
||||
# If you want to include NDS support for ncpmount uncomment this:
|
||||
# WARNING! NDS support is very beta, uncomment only if you are testing
|
||||
# because anything can happen (like crashing the linux box or nw server).
|
||||
NDS_SUPPORT = 1
|
||||
|
||||
# If you want to include packet signature support uncomment this:
|
||||
# WARNING! packet signature support is in beta stage, uncomment only when you
|
||||
# know what you are doing, anything can happen (like crashing the linux box or
|
||||
# netware server).
|
||||
# When enabling, make sure you have applied the kernel patches too,
|
||||
# otherwise the packet signatures won't work.
|
||||
SIGNATURES = 1
|
||||
|
||||
# Include code for Linux2.0.x
|
||||
MOUNT2 = 1
|
||||
# Include code for Linux2.1.x
|
||||
MOUNT3 = 1
|
||||
|
||||
TOPDIR = $(shell pwd)
|
||||
BINDIR = /usr/bin
|
||||
SBINDIR = /sbin
|
||||
@@ -42,14 +24,13 @@ KVERSION=$(shell uname -r | cut -b1-3)
|
||||
INCLUDES=-I$(TOPDIR)/include
|
||||
|
||||
COPT = -O2
|
||||
# COPT += -g
|
||||
COPT += -g
|
||||
CFLAGS = $(COPT) -Wall $(INCLUDES) $(KERNELD) -DNCPFS_VERSION=\"$(VERSION)\"
|
||||
|
||||
export INCLUDES BINDIR SBINDIR KERNELD VERSION HAVE_ELF CFLAGS NDS_SUPPORT \
|
||||
SIGNATURES MOUNT2 MOUNT3
|
||||
export INCLUDES BINDIR SBINDIR KERNELD VERSION HAVE_ELF CFLAGS
|
||||
|
||||
all:
|
||||
set -e; for i in $(SUBDIRS); do make -C $$i all; done
|
||||
for i in $(SUBDIRS); do make -C $$i all; done
|
||||
@if [ "$(HAVE_ELF)" = yes ] ;\
|
||||
then \
|
||||
echo ; echo ; echo ;\
|
||||
|
||||
35
README
35
README
@@ -1,7 +1,7 @@
|
||||
This is ncpfs, a free NetWare client filesystem for Linux. Besides
|
||||
some little utilities it also contains nprint, which enables you to
|
||||
print on NetWare print queues. The opposite side, pserver, is also
|
||||
provided.
|
||||
This is ncpfs, the user utilities that are needed to use the NCP kernel support
|
||||
present in Linux since version 1.3.71. This version of ncpfs is only usable
|
||||
with Linux 2.1.29 and later. To use it, please apply the patch contained in the
|
||||
patches/ directory.
|
||||
|
||||
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
|
||||
@@ -24,28 +24,11 @@ information.
|
||||
|
||||
INSTALLATION
|
||||
|
||||
Before you start the installation, make sure that your kernel has IPX
|
||||
support compiled in. When 'make config' asks you for
|
||||
|
||||
The IPX protocol (CONFIG_IPX) [N/y/m/?]
|
||||
|
||||
simply answer 'y'. Probably you do not need the full internal net that
|
||||
you are asked for next.
|
||||
|
||||
If you are not running kerneld, please comment the corresponding line in
|
||||
the Makefile to reflect this.
|
||||
|
||||
If you are not using 2.0.x kernels, you can comment out MOUNT2=1 line
|
||||
in the Makefile.
|
||||
If you are not using 2.1.x kernels, you can comment out MOUNT3=1 line
|
||||
in the Makefile.
|
||||
|
||||
If you are not using NDS access, you can comment out NDS_SUPPORT=1 in
|
||||
the Makefile.
|
||||
If you are not using packet signatures, you can comment out SIGNATURES=1
|
||||
in the Makefile.
|
||||
|
||||
After you adapted your Makefile, type 'make' and, as root, 'make install'.
|
||||
Before you start the installation of the user utilities, please make sure that
|
||||
your kernel is 2.1.29 or later. If you are using 2.1.29, please apply the patch
|
||||
contained in patches/linux-2.1.29.diff. You have to compile your kernel with
|
||||
IPX and NCP support compiled in. But as you are using a development kernel, you
|
||||
probably know what you're doing :-).
|
||||
|
||||
|
||||
HELP
|
||||
|
||||
18
README.NDS
18
README.NDS
@@ -1,18 +0,0 @@
|
||||
The NDS login code uses the RSA public key cryptosystem. Because of a patent
|
||||
right on this algorithm (U.S. patent #4,405,829, issued 20 Sep 1983), you
|
||||
are probably not allowed to use this code in the U.S.A. and Canada, and
|
||||
possibly neither in other countries. Check this before you use NDS logins!
|
||||
|
||||
The mpilib.c, mpilib.h, platform.h, and usuals.h in the lib/ directory are
|
||||
taken from the PGP 2.3 source distribution (Copyright 1986-92 by Philip
|
||||
Zimmermann), which is distributed under the GPL, as stated below.
|
||||
|
||||
Excerpt from pgpdoc2.txt (contained in pgp23src.zip):
|
||||
"All the source code for PGP is available for free under the "Copyleft"
|
||||
General Public License from the Free Software Foundation (FSF)."
|
||||
|
||||
For more details on the RSA patent see the pgp23src archive, or more recent
|
||||
PGP packages.
|
||||
|
||||
Arne de Bruijn
|
||||
arne@knoware.nl
|
||||
@@ -27,8 +27,7 @@ static int search_utmp(char *user, char *tty);
|
||||
|
||||
static char *progname;
|
||||
|
||||
void
|
||||
main(int argc, char *argv[])
|
||||
void main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
char message[256];
|
||||
@@ -51,27 +50,23 @@ main(int argc, char *argv[])
|
||||
|
||||
openlog("nwmsg", LOG_PID, LOG_LPR);
|
||||
|
||||
if (argc != 2)
|
||||
{
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "usage: %s mount-point\n",
|
||||
progname);
|
||||
exit(1);
|
||||
}
|
||||
mount_point = argv[1];
|
||||
if ((conn = ncp_open_mount(mount_point, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_open_mount(mount_point, &err)) == NULL) {
|
||||
com_err(progname, err, "in ncp_open_mount");
|
||||
exit(1);
|
||||
}
|
||||
if (ncp_get_broadcast_message(conn, message) != 0)
|
||||
{
|
||||
if (ncp_get_broadcast_message(conn, message) != 0) {
|
||||
fprintf(stderr, "%s: could not get broadcast message\n",
|
||||
progname);
|
||||
ncp_close(conn);
|
||||
exit(1);
|
||||
}
|
||||
if (strlen(message) == 0)
|
||||
{
|
||||
if (strlen(message) == 0) {
|
||||
syslog(LOG_DEBUG, "no message");
|
||||
exit(0);
|
||||
}
|
||||
@@ -80,8 +75,7 @@ main(int argc, char *argv[])
|
||||
#endif
|
||||
|
||||
info.version = NCP_GET_FS_INFO_VERSION;
|
||||
if (ioctl(conn->mount_fid, NCP_IOC_GET_FS_INFO, &info) < 0)
|
||||
{
|
||||
if (ioctl(conn->mount_fid, NCP_IOC_GET_FS_INFO, &info) < 0) {
|
||||
fprintf(stderr, "%s: could not ioctl on connection: %s\n",
|
||||
progname, strerror(errno));
|
||||
ncp_close(conn);
|
||||
@@ -89,37 +83,30 @@ main(int argc, char *argv[])
|
||||
}
|
||||
ncp_close(conn);
|
||||
|
||||
if ((pwd = getpwuid(info.mounted_uid)) == NULL)
|
||||
{
|
||||
if ((pwd = getpwuid(info.mounted_uid)) == NULL) {
|
||||
fprintf(stderr, "%s: user %d not known\n",
|
||||
progname, info.mounted_uid);
|
||||
exit(1);
|
||||
}
|
||||
if ((mtab = fopen(MOUNTED, "r")) == NULL)
|
||||
{
|
||||
if ((mtab = fopen(MOUNTED, "r")) == NULL) {
|
||||
fprintf(stderr, "%s: can't open %s\n",
|
||||
progname, MOUNTED);
|
||||
exit(1);
|
||||
}
|
||||
while ((mnt = getmntent(mtab)) != NULL)
|
||||
{
|
||||
if (strcmp(mnt->mnt_dir, mount_point) == 0)
|
||||
{
|
||||
while ((mnt = getmntent(mtab)) != NULL) {
|
||||
if (strcmp(mnt->mnt_dir, mount_point) == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (mnt == NULL)
|
||||
{
|
||||
if (mnt == NULL) {
|
||||
syslog(LOG_DEBUG, "cannot find mtab entry\n");
|
||||
}
|
||||
if (search_utmp(pwd->pw_name, tty) != 0)
|
||||
{
|
||||
if (search_utmp(pwd->pw_name, tty) != 0) {
|
||||
exit(1);
|
||||
}
|
||||
sprintf(tty_path, "/dev/%s", tty);
|
||||
if ((tty_file = fopen(tty_path, "w")) == NULL)
|
||||
{
|
||||
if ((tty_file = fopen(tty_path, "w")) == NULL) {
|
||||
fprintf(stderr, "%s: cannot open %s: %s\n",
|
||||
progname, tty_path, strerror(errno));
|
||||
exit(1);
|
||||
@@ -152,18 +139,16 @@ main(int argc, char *argv[])
|
||||
* term_chk - check that a terminal exists, and get the message bit
|
||||
* and the access time
|
||||
*/
|
||||
static int
|
||||
term_chk(char *tty, int *msgsokP, time_t * atimeP, int *showerror)
|
||||
static int term_chk(char *tty, int *msgsokP, time_t * atimeP, int *showerror)
|
||||
{
|
||||
struct stat s;
|
||||
char path[MAXPATHLEN];
|
||||
|
||||
(void) sprintf(path, "/dev/%s", tty);
|
||||
if (stat(path, &s) < 0)
|
||||
{
|
||||
if (stat(path, &s) < 0) {
|
||||
if (showerror)
|
||||
(void) fprintf(stderr,
|
||||
"write: %s: %s\n", path, strerror(errno));
|
||||
"write: %s: %s\n", path, strerror(errno));
|
||||
return (1);
|
||||
}
|
||||
*msgsokP = (s.st_mode & (S_IWRITE >> 3)) != 0; /* group write bit */
|
||||
@@ -182,8 +167,7 @@ term_chk(char *tty, int *msgsokP, time_t * atimeP, int *showerror)
|
||||
* Special case for writing to yourself - ignore the terminal you're
|
||||
* writing from, unless that's the only terminal with messages enabled.
|
||||
*/
|
||||
static int
|
||||
search_utmp(char *user, char *tty)
|
||||
static int search_utmp(char *user, char *tty)
|
||||
{
|
||||
struct utmp u;
|
||||
time_t bestatime, atime;
|
||||
@@ -191,8 +175,7 @@ search_utmp(char *user, char *tty)
|
||||
|
||||
char atty[sizeof(u.ut_line) + 1];
|
||||
|
||||
if ((ufd = open(_PATH_UTMP, O_RDONLY)) < 0)
|
||||
{
|
||||
if ((ufd = open(_PATH_UTMP, O_RDONLY)) < 0) {
|
||||
perror("utmp");
|
||||
return -1;
|
||||
}
|
||||
@@ -200,8 +183,7 @@ search_utmp(char *user, char *tty)
|
||||
bestatime = 0;
|
||||
user_is_me = 0;
|
||||
while (read(ufd, (char *) &u, sizeof(u)) == sizeof(u))
|
||||
if (strncmp(user, u.ut_name, sizeof(u.ut_name)) == 0)
|
||||
{
|
||||
if (strncmp(user, u.ut_name, sizeof(u.ut_name)) == 0) {
|
||||
++nloggedttys;
|
||||
|
||||
(void) strncpy(atty, u.ut_line, sizeof(u.ut_line));
|
||||
@@ -216,15 +198,13 @@ search_utmp(char *user, char *tty)
|
||||
continue; /* it's not a valid entry */
|
||||
|
||||
++nttys;
|
||||
if (atime > bestatime)
|
||||
{
|
||||
if (atime > bestatime) {
|
||||
bestatime = atime;
|
||||
(void) strcpy(tty, atty);
|
||||
}
|
||||
}
|
||||
(void) close(ufd);
|
||||
if (nloggedttys == 0)
|
||||
{
|
||||
if (nloggedttys == 0) {
|
||||
(void) fprintf(stderr, "write: %s is not logged in\n", user);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
#ifndef __GLIBSTUB_H__
|
||||
#define __GLIBSTUB_H__
|
||||
|
||||
#undef GLIBCHDR
|
||||
#ifdef __GLIBC__
|
||||
#if __GLIBC__ >= 2
|
||||
#define GLIBCHDR
|
||||
#endif
|
||||
#endif
|
||||
#ifdef GLIBCHDR
|
||||
#define HAVE_NETIPX_IPX_H
|
||||
#define HAVE_SYS_MOUNT_H
|
||||
#define HAVE_NET_ROUTE_H
|
||||
#define HAVE_NET_IF_H
|
||||
#else
|
||||
#undef HAVE_NETIPX_IPX_H
|
||||
#undef HAVE_SYS_MOUNT_H
|
||||
#undef HAVE_NET_ROUTE_H
|
||||
#undef HAVE_NET_IF_H
|
||||
#endif
|
||||
#endif /* __GLIBSTUB_H__ */
|
||||
|
||||
@@ -8,13 +8,15 @@
|
||||
#ifndef _IPXLIB_H
|
||||
#define _IPXLIB_H
|
||||
|
||||
#include "kernel/types.h"
|
||||
#include "ncp.h"
|
||||
#include "kernel/ipx.h"
|
||||
|
||||
typedef u_int32_t IPXNet;
|
||||
typedef u_int16_t IPXPort;
|
||||
typedef u_int8_t IPXNode[IPX_NODE_LEN];
|
||||
#include <linux/types.h>
|
||||
#include "ncp.h"
|
||||
#include <linux/ipx.h>
|
||||
#include <stdio.h>
|
||||
|
||||
typedef unsigned long IPXNet;
|
||||
typedef unsigned short IPXPort;
|
||||
typedef unsigned char IPXNode[IPX_NODE_LEN];
|
||||
|
||||
#define IPX_USER_PTYPE (0x00)
|
||||
#define IPX_RIP_PTYPE (0x01)
|
||||
@@ -30,35 +32,30 @@ typedef u_int8_t IPXNode[IPX_NODE_LEN];
|
||||
|
||||
#define IPX_SAP_FILE_SERVER (0x0004)
|
||||
|
||||
struct sap_query
|
||||
{
|
||||
u_int16_t query_type; /* net order */
|
||||
u_int16_t server_type; /* net order */
|
||||
struct sap_query {
|
||||
unsigned short query_type; /* net order */
|
||||
unsigned short server_type; /* net order */
|
||||
};
|
||||
|
||||
struct sap_server_ident
|
||||
{
|
||||
u_int16_t server_type __attribute__((packed));
|
||||
char server_name[48] __attribute__((packed));
|
||||
IPXNet server_network __attribute__((packed));
|
||||
IPXNode server_node __attribute__((packed));
|
||||
IPXPort server_port __attribute__((packed));
|
||||
u_int16_t intermediate_network __attribute__((packed));
|
||||
struct sap_server_ident {
|
||||
unsigned short server_type __attribute__((packed));
|
||||
char server_name[48] __attribute__((packed));
|
||||
IPXNet server_network __attribute__((packed));
|
||||
IPXNode server_node __attribute__((packed));
|
||||
IPXPort server_port __attribute__((packed));
|
||||
unsigned short intermediate_network __attribute__((packed));
|
||||
};
|
||||
|
||||
#define IPX_RIP_REQUEST (0x1)
|
||||
#define IPX_RIP_RESPONSE (0x2)
|
||||
|
||||
struct ipx_rip_packet
|
||||
{
|
||||
u_int16_t operation __attribute__((packed));
|
||||
struct ipx_rt_def
|
||||
{
|
||||
u_int16_t network __attribute__((packed));
|
||||
u_int16_t hops __attribute__((packed));
|
||||
u_int16_t ticks __attribute__((packed));
|
||||
}
|
||||
rt[1] __attribute__((packed));
|
||||
struct ipx_rip_packet {
|
||||
__u16 operation __attribute__((packed));
|
||||
struct ipx_rt_def {
|
||||
__u32 network __attribute__((packed));
|
||||
__u16 hops __attribute__((packed));
|
||||
__u16 ticks __attribute__((packed));
|
||||
} rt[1] __attribute__((packed));
|
||||
};
|
||||
|
||||
#define IPX_BROADCAST_NODE ("\xff\xff\xff\xff\xff\xff")
|
||||
@@ -92,9 +89,4 @@ void
|
||||
int
|
||||
ipx_node_equal(IPXNode n1, IPXNode n2);
|
||||
|
||||
#ifdef __MAKE_NCPMOUNT__
|
||||
int
|
||||
ipx_sscanf_saddr(char* buf, struct sockaddr_ipx* sipx);
|
||||
#endif
|
||||
|
||||
#endif /* _IPXLIB_H */
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
#ifndef _KERNEL_FS_H
|
||||
#define _KERNEL_FS_H
|
||||
|
||||
#include "glibstub.h"
|
||||
#ifdef HAVE_SYS_MOUNT_H
|
||||
#include <sys/mount.h>
|
||||
#else
|
||||
#include <linux/fs.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,11 +0,0 @@
|
||||
#ifndef _KERNEL_IF_H
|
||||
#define _KERNEL_IF_H
|
||||
|
||||
#include "glibstub.h"
|
||||
#ifdef HAVE_NET_IF_H
|
||||
#include <net/if.h>
|
||||
#else
|
||||
#include <linux/if.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,11 +0,0 @@
|
||||
#ifndef _KERNEL_IPX_H
|
||||
#define _KERNEL_IPX_H
|
||||
|
||||
#include "glibstub.h"
|
||||
#ifdef HAVE_NETIPX_IPX_H
|
||||
#include <netipx/ipx.h>
|
||||
#else
|
||||
#include <linux/ipx.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,196 +0,0 @@
|
||||
/*
|
||||
* ncp.h
|
||||
*
|
||||
* Copyright (C) 1995 by Volker Lendecke
|
||||
* Modified for sparc by J.F. Chadima
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_NCP_H
|
||||
#define _LINUX_NCP_H
|
||||
|
||||
#include "kernel/types.h"
|
||||
#include "kernel/ipx.h"
|
||||
|
||||
#define NCP_PTYPE (0x11)
|
||||
#define NCP_PORT (0x0451)
|
||||
|
||||
#define NCP_ALLOC_SLOT_REQUEST (0x1111)
|
||||
#define NCP_REQUEST (0x2222)
|
||||
#define NCP_DEALLOC_SLOT_REQUEST (0x5555)
|
||||
|
||||
struct ncp_request_header {
|
||||
u_int16_t type __attribute__((packed));
|
||||
u_int8_t sequence __attribute__((packed));
|
||||
u_int8_t conn_low __attribute__((packed));
|
||||
u_int8_t task __attribute__((packed));
|
||||
u_int8_t conn_high __attribute__((packed));
|
||||
u_int8_t function __attribute__((packed));
|
||||
u_int8_t data[0] __attribute__((packed));
|
||||
};
|
||||
|
||||
#define NCP_REPLY (0x3333)
|
||||
#define NCP_POSITIVE_ACK (0x9999)
|
||||
|
||||
struct ncp_reply_header {
|
||||
__u16 type __attribute__((packed));
|
||||
__u8 sequence __attribute__((packed));
|
||||
__u8 conn_low __attribute__((packed));
|
||||
__u8 task __attribute__((packed));
|
||||
__u8 conn_high __attribute__((packed));
|
||||
__u8 completion_code __attribute__((packed));
|
||||
__u8 connection_state __attribute__((packed));
|
||||
__u8 data[0] __attribute__((packed));
|
||||
};
|
||||
|
||||
#define NCP_VOLNAME_LEN (16)
|
||||
#define NCP_NUMBER_OF_VOLUMES (64)
|
||||
struct ncp_volume_info {
|
||||
__u32 total_blocks;
|
||||
__u32 free_blocks;
|
||||
__u32 purgeable_blocks;
|
||||
__u32 not_yet_purgeable_blocks;
|
||||
__u32 total_dir_entries;
|
||||
__u32 available_dir_entries;
|
||||
__u8 sectors_per_block;
|
||||
char volume_name[NCP_VOLNAME_LEN + 1];
|
||||
};
|
||||
|
||||
/* these define the attribute byte as seen by NCP */
|
||||
#define aRONLY (ntohl(0x01000000))
|
||||
#define aHIDDEN (ntohl(0x02000000))
|
||||
#define aSYSTEM (ntohl(0x04000000))
|
||||
#define aEXECUTE (ntohl(0x08000000))
|
||||
#define aDIR (ntohl(0x10000000))
|
||||
#define aARCH (ntohl(0x20000000))
|
||||
|
||||
#define AR_READ (ntohs(0x0100))
|
||||
#define AR_WRITE (ntohs(0x0200))
|
||||
#define AR_EXCLUSIVE (ntohs(0x2000))
|
||||
|
||||
#define NCP_FILE_ID_LEN 6
|
||||
|
||||
/* Defines for Name Spaces */
|
||||
#define NW_NS_DOS 0
|
||||
#define NW_NS_MAC 1
|
||||
#define NW_NS_NFS 2
|
||||
#define NW_NS_FTAM 3
|
||||
#define NW_NS_OS2 4
|
||||
|
||||
/* Defines for ReturnInformationMask */
|
||||
#define RIM_NAME (ntohl(0x01000000L))
|
||||
#define RIM_SPACE_ALLOCATED (ntohl(0x02000000L))
|
||||
#define RIM_ATTRIBUTES (ntohl(0x04000000L))
|
||||
#define RIM_DATA_SIZE (ntohl(0x08000000L))
|
||||
#define RIM_TOTAL_SIZE (ntohl(0x10000000L))
|
||||
#define RIM_EXT_ATTR_INFO (ntohl(0x20000000L))
|
||||
#define RIM_ARCHIVE (ntohl(0x40000000L))
|
||||
#define RIM_MODIFY (ntohl(0x80000000L))
|
||||
#define RIM_CREATION (ntohl(0x00010000L))
|
||||
#define RIM_OWNING_NAMESPACE (ntohl(0x00020000L))
|
||||
#define RIM_DIRECTORY (ntohl(0x00040000L))
|
||||
#define RIM_RIGHTS (ntohl(0x00080000L))
|
||||
#define RIM_ALL (ntohl(0xFF0F0000L))
|
||||
#define RIM_COMPRESSED_INFO (ntohl(0x00000080L))
|
||||
|
||||
/* open/create modes */
|
||||
#define OC_MODE_OPEN 0x01
|
||||
#define OC_MODE_TRUNCATE 0x02
|
||||
#define OC_MODE_REPLACE 0x02
|
||||
#define OC_MODE_CREATE 0x08
|
||||
|
||||
/* open/create results */
|
||||
#define OC_ACTION_NONE 0x00
|
||||
#define OC_ACTION_OPEN 0x01
|
||||
#define OC_ACTION_CREATE 0x02
|
||||
#define OC_ACTION_TRUNCATE 0x04
|
||||
#define OC_ACTION_REPLACE 0x04
|
||||
|
||||
/* access rights attributes */
|
||||
#ifndef AR_READ_ONLY
|
||||
#define AR_READ_ONLY 0x0001
|
||||
#define AR_WRITE_ONLY 0x0002
|
||||
#define AR_DENY_READ 0x0004
|
||||
#define AR_DENY_WRITE 0x0008
|
||||
#define AR_COMPATIBILITY 0x0010
|
||||
#define AR_WRITE_THROUGH 0x0040
|
||||
#define AR_OPEN_COMPRESSED 0x0100
|
||||
#endif
|
||||
|
||||
struct nw_info_struct {
|
||||
__u32 spaceAlloc __attribute__((packed));
|
||||
__u32 attributes __attribute__((packed));
|
||||
__u16 flags __attribute__((packed));
|
||||
__u32 dataStreamSize __attribute__((packed));
|
||||
__u32 totalStreamSize __attribute__((packed));
|
||||
__u16 numberOfStreams __attribute__((packed));
|
||||
__u16 creationTime __attribute__((packed));
|
||||
__u16 creationDate __attribute__((packed));
|
||||
__u32 creatorID __attribute__((packed));
|
||||
__u16 modifyTime __attribute__((packed));
|
||||
__u16 modifyDate __attribute__((packed));
|
||||
__u32 modifierID __attribute__((packed));
|
||||
__u16 lastAccessDate __attribute__((packed));
|
||||
__u16 archiveTime __attribute__((packed));
|
||||
__u16 archiveDate __attribute__((packed));
|
||||
__u32 archiverID __attribute__((packed));
|
||||
__u16 inheritedRightsMask __attribute__((packed));
|
||||
__u32 dirEntNum __attribute__((packed));
|
||||
__u32 DosDirNum __attribute__((packed));
|
||||
__u32 volNumber __attribute__((packed));
|
||||
__u32 EADataSize __attribute__((packed));
|
||||
__u32 EAKeyCount __attribute__((packed));
|
||||
__u32 EAKeySize __attribute__((packed));
|
||||
__u32 NSCreator __attribute__((packed));
|
||||
__u8 nameLen __attribute__((packed));
|
||||
__u8 entryName[256] __attribute__((packed));
|
||||
};
|
||||
|
||||
/* modify mask - use with MODIFY_DOS_INFO structure */
|
||||
#define DM_ATTRIBUTES (ntohl(0x02000000L))
|
||||
#define DM_CREATE_DATE (ntohl(0x04000000L))
|
||||
#define DM_CREATE_TIME (ntohl(0x08000000L))
|
||||
#define DM_CREATOR_ID (ntohl(0x10000000L))
|
||||
#define DM_ARCHIVE_DATE (ntohl(0x20000000L))
|
||||
#define DM_ARCHIVE_TIME (ntohl(0x40000000L))
|
||||
#define DM_ARCHIVER_ID (ntohl(0x80000000L))
|
||||
#define DM_MODIFY_DATE (ntohl(0x00010000L))
|
||||
#define DM_MODIFY_TIME (ntohl(0x00020000L))
|
||||
#define DM_MODIFIER_ID (ntohl(0x00040000L))
|
||||
#define DM_LAST_ACCESS_DATE (ntohl(0x00080000L))
|
||||
#define DM_INHERITED_RIGHTS_MASK (ntohl(0x00100000L))
|
||||
#define DM_MAXIMUM_SPACE (ntohl(0x00200000L))
|
||||
|
||||
struct nw_modify_dos_info {
|
||||
__u32 attributes __attribute__((packed));
|
||||
__u16 creationDate __attribute__((packed));
|
||||
__u16 creationTime __attribute__((packed));
|
||||
__u32 creatorID __attribute__((packed));
|
||||
__u16 modifyDate __attribute__((packed));
|
||||
__u16 modifyTime __attribute__((packed));
|
||||
__u32 modifierID __attribute__((packed));
|
||||
__u16 archiveDate __attribute__((packed));
|
||||
__u16 archiveTime __attribute__((packed));
|
||||
__u32 archiverID __attribute__((packed));
|
||||
__u16 lastAccessDate __attribute__((packed));
|
||||
__u16 inheritanceGrantMask __attribute__((packed));
|
||||
__u16 inheritanceRevokeMask __attribute__((packed));
|
||||
__u32 maximumSpace __attribute__((packed));
|
||||
};
|
||||
|
||||
struct nw_file_info {
|
||||
struct nw_info_struct i;
|
||||
int opened;
|
||||
int access;
|
||||
__u32 server_file_handle __attribute__((packed));
|
||||
__u8 open_create_action __attribute__((packed));
|
||||
__u8 file_handle[6] __attribute__((packed));
|
||||
};
|
||||
|
||||
struct nw_search_sequence {
|
||||
__u8 volNumber __attribute__((packed));
|
||||
__u32 dirBase __attribute__((packed));
|
||||
__u32 sequence __attribute__((packed));
|
||||
};
|
||||
|
||||
#endif /* _LINUX_NCP_H */
|
||||
@@ -1,88 +0,0 @@
|
||||
/*
|
||||
* ncp_fs.h
|
||||
*
|
||||
* Copyright (C) 1995, 1996 by Volker Lendecke
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _KERNEL_NCP_FS_H
|
||||
#define _KERNEL_NCP_FS_H
|
||||
|
||||
#include "kernel/fs.h"
|
||||
#include <netinet/in.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
/*
|
||||
* ioctl commands
|
||||
*/
|
||||
|
||||
struct ncp_ioctl_request {
|
||||
unsigned int function;
|
||||
unsigned int size;
|
||||
char *data;
|
||||
};
|
||||
|
||||
struct ncp_fs_info {
|
||||
int version;
|
||||
struct sockaddr_ipx addr;
|
||||
__kerXX_uid_t mounted_uid;
|
||||
int connection; /* Connection number the server assigned us */
|
||||
int buffer_size; /* The negotiated buffer size, to be
|
||||
used for read/write requests! */
|
||||
|
||||
int volume_number;
|
||||
__u32 directory_id;
|
||||
};
|
||||
|
||||
struct ncp_sign_init
|
||||
{
|
||||
char sign_root[8];
|
||||
char sign_last[16];
|
||||
};
|
||||
|
||||
struct ncp_lock_ioctl
|
||||
{
|
||||
#define NCP_LOCK_LOG 0
|
||||
#define NCP_LOCK_SH 1
|
||||
#define NCP_LOCK_EX 2
|
||||
#define NCP_LOCK_CLEAR 256
|
||||
int cmd;
|
||||
int origin;
|
||||
unsigned int offset;
|
||||
unsigned int length;
|
||||
#define NCP_LOCK_DEFAULT_TIMEOUT 18
|
||||
#define NCP_LOCK_MAX_TIMEOUT 180
|
||||
int timeout;
|
||||
};
|
||||
|
||||
struct ncp_setroot_ioctl
|
||||
{
|
||||
int volNumber;
|
||||
int namespace;
|
||||
__u32 dirEntNum;
|
||||
};
|
||||
|
||||
#define NCP_IOC_NCPREQUEST _IOR('n', 1, struct ncp_ioctl_request)
|
||||
#define NCP_IOC_GETMOUNTUID _IOW('n', 2, __kernel_uid_t)
|
||||
#define NCP_IOC_CONN_LOGGED_IN _IO('n', 3)
|
||||
|
||||
#define NCP_GET_FS_INFO_VERSION (1)
|
||||
#define NCP_IOC_GET_FS_INFO _IOWR('n', 4, struct ncp_fs_info)
|
||||
|
||||
#define NCP_IOC_SIGN_INIT _IOR('n', 5, struct ncp_sign_init)
|
||||
#define NCP_IOC_SIGN_WANTED _IOR('n', 6, int)
|
||||
#define NCP_IOC_SET_SIGN_WANTED _IOW('n', 6, int)
|
||||
|
||||
#define NCP_IOC_LOCKUNLOCK _IOR('n', 7, struct ncp_lock_ioctl)
|
||||
|
||||
#define NCP_IOC_GETROOT _IOW('n', 8, struct ncp_setroot_ioctl)
|
||||
#define NCP_IOC_SETROOT _IOR('n', 8, struct ncp_setroot_ioctl)
|
||||
/*
|
||||
* The packet size to allocate. One page should be enough.
|
||||
*/
|
||||
#define NCP_PACKET_SIZE 4070
|
||||
|
||||
#define NCP_MAXPATHLEN 255
|
||||
#define NCP_MAXNAMELEN 14
|
||||
|
||||
#endif /* _LINUX_NCP_FS_H */
|
||||
@@ -1,12 +0,0 @@
|
||||
#ifndef __KERNEL_ROUTE_H__
|
||||
#define __KERNEL_ROUTE_H__
|
||||
|
||||
#include "glibstub.h"
|
||||
#ifdef HAVE_NET_ROUTE_H
|
||||
#include <net/route.h>
|
||||
#else
|
||||
#include <linux/route.h>
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL_ROUTE_H__ */
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
#ifndef __KERNEL_TYPES_H__
|
||||
#define __KERNEL_TYPES_H__
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#undef __u8
|
||||
#undef __u16
|
||||
#undef __u32
|
||||
#define __u8 u_int8_t
|
||||
#define __u16 u_int16_t
|
||||
#define __u32 u_int32_t
|
||||
|
||||
typedef u_int16_t __kerXX_uid_t;
|
||||
|
||||
#include <asm/posix_types.h>
|
||||
|
||||
typedef __kernel_pid_t __ker20_pid_t;
|
||||
typedef __kernel_uid_t __ker20_uid_t;
|
||||
typedef __kernel_gid_t __ker20_gid_t;
|
||||
typedef __kernel_mode_t __ker20_mode_t;
|
||||
|
||||
typedef __kernel_pid_t __ker21_pid_t;
|
||||
typedef __kernel_uid_t __ker21_uid_t;
|
||||
typedef __kernel_gid_t __ker21_gid_t;
|
||||
typedef __kernel_mode_t __ker21_mode_t;
|
||||
|
||||
#ifdef __GLIBC__
|
||||
/* why is this defined in posix_types ???? dirty hack... */
|
||||
#undef __FD_CLR
|
||||
#undef __FD_SET
|
||||
#undef __FD_ISSET
|
||||
#undef __FD_ZERO
|
||||
#ifdef _SELECTBITS_H
|
||||
#undef _SELECTBITS_H
|
||||
#include <selectbits.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL_TYPES_H__ */
|
||||
|
||||
@@ -9,10 +9,10 @@
|
||||
#ifndef _NCP_H
|
||||
#define _NCP_H
|
||||
|
||||
#include "kernel/types.h"
|
||||
#include "kernel/ipx.h"
|
||||
#include "kernel/ncp.h"
|
||||
#include "kernel/ncp_fs.h"
|
||||
#include <linux/types.h>
|
||||
#include <linux/ipx.h>
|
||||
#include <linux/ncp.h>
|
||||
#include <linux/ncp_fs.h>
|
||||
|
||||
#define NCP_BINDERY_USER (0x0001)
|
||||
#define NCP_BINDERY_UGROUP (0x0002)
|
||||
@@ -119,4 +119,5 @@ struct print_job_record {
|
||||
char Path[80] __attribute__((packed));
|
||||
};
|
||||
|
||||
|
||||
#endif /* _NCP_H */
|
||||
|
||||
133
include/ncplib.h
133
include/ncplib.h
@@ -8,17 +8,13 @@
|
||||
#ifndef _NCPLIB_H
|
||||
#define _NCPLIB_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include "ncp.h"
|
||||
#include <linux/ipx.h>
|
||||
#include <sys/param.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
#ifdef SIGNATURES
|
||||
#ifndef NCP_IOC_SIGN_INIT
|
||||
#undef SIGNATURES
|
||||
#endif /* NCP_IOC_SIGN_INIT */
|
||||
#endif /* SIGNATURES */
|
||||
|
||||
#include "ipxlib.h"
|
||||
#include "com_err.h"
|
||||
|
||||
@@ -36,23 +32,21 @@ typedef __u32 dword;
|
||||
#define BSET(buf,pos,val) (BVAL(buf,pos) = (val))
|
||||
|
||||
static inline word
|
||||
WVAL_HL(__u8 * buf, int pos)
|
||||
WVAL_HL(__u8 * buf, int pos)
|
||||
{
|
||||
return PVAL(buf, pos) << 8 | PVAL(buf, pos + 1);
|
||||
}
|
||||
static inline dword
|
||||
DVAL_HL(__u8 * buf, int pos)
|
||||
DVAL_HL(__u8 * buf, int pos)
|
||||
{
|
||||
return WVAL_HL(buf, pos) << 16 | WVAL_HL(buf, pos + 2);
|
||||
}
|
||||
static inline void
|
||||
WSET_HL(__u8 * buf, int pos, word val)
|
||||
static inline void WSET_HL(__u8 * buf, int pos, word val)
|
||||
{
|
||||
BSET(buf, pos, val >> 8);
|
||||
BSET(buf, pos + 1, val & 0xff);
|
||||
}
|
||||
static inline void
|
||||
DSET_HL(__u8 * buf, int pos, dword val)
|
||||
static inline void DSET_HL(__u8 * buf, int pos, dword val)
|
||||
{
|
||||
WSET_HL(buf, pos, val >> 16);
|
||||
WSET_HL(buf, pos + 2, val & 0xffff);
|
||||
@@ -64,22 +58,20 @@ DSET_HL(__u8 * buf, int pos, dword val)
|
||||
#if defined(__i386__)
|
||||
|
||||
static inline word
|
||||
WVAL_LH(__u8 * buf, int pos)
|
||||
WVAL_LH(__u8 * buf, int pos)
|
||||
{
|
||||
return *((word *) (buf + pos));
|
||||
}
|
||||
static inline dword
|
||||
DVAL_LH(__u8 * buf, int pos)
|
||||
DVAL_LH(__u8 * buf, int pos)
|
||||
{
|
||||
return *((dword *) (buf + pos));
|
||||
}
|
||||
static inline void
|
||||
WSET_LH(__u8 * buf, int pos, word val)
|
||||
static inline void WSET_LH(__u8 * buf, int pos, word val)
|
||||
{
|
||||
*((word *) (buf + pos)) = val;
|
||||
}
|
||||
static inline void
|
||||
DSET_LH(__u8 * buf, int pos, dword val)
|
||||
static inline void DSET_LH(__u8 * buf, int pos, dword val)
|
||||
{
|
||||
*((dword *) (buf + pos)) = val;
|
||||
}
|
||||
@@ -87,23 +79,21 @@ DSET_LH(__u8 * buf, int pos, dword val)
|
||||
#else
|
||||
|
||||
static inline word
|
||||
WVAL_LH(__u8 * buf, int pos)
|
||||
WVAL_LH(__u8 * buf, int pos)
|
||||
{
|
||||
return PVAL(buf, pos) | PVAL(buf, pos + 1) << 8;
|
||||
}
|
||||
static inline dword
|
||||
DVAL_LH(__u8 * buf, int pos)
|
||||
DVAL_LH(__u8 * buf, int pos)
|
||||
{
|
||||
return WVAL_LH(buf, pos) | WVAL_LH(buf, pos + 2) << 16;
|
||||
}
|
||||
static inline void
|
||||
WSET_LH(__u8 * buf, int pos, word val)
|
||||
static inline void WSET_LH(__u8 * buf, int pos, word val)
|
||||
{
|
||||
BSET(buf, pos, val & 0xff);
|
||||
BSET(buf, pos + 1, val >> 8);
|
||||
}
|
||||
static inline void
|
||||
DSET_LH(__u8 * buf, int pos, dword val)
|
||||
static inline void DSET_LH(__u8 * buf, int pos, dword val)
|
||||
{
|
||||
WSET_LH(buf, pos, val & 0xffff);
|
||||
WSET_LH(buf, pos + 2, val >> 16);
|
||||
@@ -117,15 +107,13 @@ DSET_LH(__u8 * buf, int pos, dword val)
|
||||
void
|
||||
str_upper(char *name);
|
||||
|
||||
enum connect_state
|
||||
{
|
||||
enum connect_state {
|
||||
NOT_CONNECTED = 0,
|
||||
CONN_PERMANENT,
|
||||
CONN_TEMPORARY
|
||||
};
|
||||
|
||||
struct ncp_conn
|
||||
{
|
||||
struct ncp_conn {
|
||||
|
||||
enum connect_state is_connected;
|
||||
|
||||
@@ -156,17 +144,9 @@ struct ncp_conn
|
||||
int lock;
|
||||
|
||||
char packet[NCP_PACKET_SIZE];
|
||||
#ifdef SIGNATURES
|
||||
/* Fields used to make packet signatures */
|
||||
int sign_wanted;
|
||||
int sign_active;
|
||||
char sign_root[8];
|
||||
char sign_last[16];
|
||||
#endif
|
||||
};
|
||||
|
||||
struct ncp_conn_spec
|
||||
{
|
||||
struct ncp_conn_spec {
|
||||
char server[NCP_BINDERY_NAME_LEN];
|
||||
char user[NCP_BINDERY_NAME_LEN];
|
||||
uid_t uid;
|
||||
@@ -174,14 +154,12 @@ struct ncp_conn_spec
|
||||
char password[NCP_BINDERY_NAME_LEN];
|
||||
};
|
||||
|
||||
struct ncp_search_seq
|
||||
{
|
||||
struct ncp_search_seq {
|
||||
struct nw_search_sequence s;
|
||||
int namespace;
|
||||
};
|
||||
|
||||
struct ncp_property_info
|
||||
{
|
||||
struct ncp_property_info {
|
||||
__u8 property_name[16];
|
||||
__u8 property_flags;
|
||||
__u8 property_security;
|
||||
@@ -235,8 +213,7 @@ long
|
||||
/* like getmntent, get_ncp_conn_ent scans /etc/mtab for usable
|
||||
connections */
|
||||
|
||||
struct ncp_conn_ent
|
||||
{
|
||||
struct ncp_conn_ent {
|
||||
char server[NCP_BINDERY_NAME_LEN];
|
||||
char user[NCP_BINDERY_NAME_LEN];
|
||||
uid_t uid;
|
||||
@@ -264,8 +241,7 @@ long
|
||||
long
|
||||
ncp_set_file_server_time(struct ncp_conn *conn, time_t * source);
|
||||
|
||||
struct ncp_file_server_info
|
||||
{
|
||||
struct ncp_file_server_info {
|
||||
__u8 ServerName[48] __attribute__((packed));
|
||||
__u8 FileServiceVersion __attribute__((packed));
|
||||
__u8 FileServiceSubVersion __attribute__((packed));
|
||||
@@ -312,11 +288,6 @@ long
|
||||
__u8 no_conn, const __u8 * connections,
|
||||
const char *message);
|
||||
|
||||
long
|
||||
ncp_send_broadcast2(struct ncp_conn *conn,
|
||||
unsigned int conns, const unsigned int* connlist,
|
||||
const char* message);
|
||||
|
||||
long
|
||||
ncp_get_encryption_key(struct ncp_conn *conn,
|
||||
char *target);
|
||||
@@ -331,7 +302,7 @@ long
|
||||
struct ncp_bindery_object *target);
|
||||
long
|
||||
ncp_scan_bindery_object(struct ncp_conn *conn,
|
||||
__u32 last_id, __u16 object_type, char *search_string,
|
||||
__u32 last_id, __u16 object_type, char *search_string,
|
||||
struct ncp_bindery_object *target);
|
||||
long
|
||||
ncp_create_bindery_object(struct ncp_conn *conn,
|
||||
@@ -350,15 +321,13 @@ long
|
||||
const char *object_name,
|
||||
__u8 security);
|
||||
|
||||
struct ncp_station_addr
|
||||
{
|
||||
struct ncp_station_addr {
|
||||
__u32 NetWork __attribute__((packed));
|
||||
__u8 Node[6] __attribute__((packed));
|
||||
__u16 Socket __attribute__((packed));
|
||||
};
|
||||
|
||||
struct ncp_prop_login_control
|
||||
{
|
||||
struct ncp_prop_login_control {
|
||||
__u8 AccountExpireDate[3] __attribute__((packed));
|
||||
__u8 Disabled __attribute__((packed));
|
||||
__u8 PasswordExpireDate[3] __attribute__((packed));
|
||||
@@ -453,7 +422,6 @@ long
|
||||
const unsigned char *oldpasswd,
|
||||
const unsigned char *newpasswd);
|
||||
|
||||
#define NWE_SIGNATURE_LEVEL_CONFLICT (0x8861)
|
||||
#define NCP_GRACE_PERIOD (0xdf)
|
||||
|
||||
long
|
||||
@@ -622,35 +590,14 @@ long
|
||||
|
||||
long
|
||||
ncp_ren_or_mov_file_or_subdir(struct ncp_conn *conn,
|
||||
struct nw_info_struct *old_dir, char *old_name,
|
||||
struct nw_info_struct *new_dir, char *new_name);
|
||||
struct nw_info_struct *old_dir, char *old_name,
|
||||
struct nw_info_struct *new_dir, char *new_name);
|
||||
|
||||
long
|
||||
ncp_create_queue_job_and_file(struct ncp_conn *conn,
|
||||
__u32 queue_id,
|
||||
struct queue_job *job);
|
||||
|
||||
long
|
||||
ncp_get_queue_length(struct ncp_conn *conn,
|
||||
__u32 queue_id,
|
||||
__u32 *queue_length);
|
||||
|
||||
long
|
||||
ncp_get_queue_job_ids(struct ncp_conn *conn,
|
||||
__u32 queue_id,
|
||||
__u32 queue_section,
|
||||
__u32 *length1,
|
||||
__u32 *length2,
|
||||
__u32 ids[]);
|
||||
long
|
||||
ncp_get_queue_job_info(struct ncp_conn *conn,
|
||||
__u32 queue_id,
|
||||
__u32 job_id,
|
||||
struct nw_queue_job_entry *jobdata);
|
||||
|
||||
long
|
||||
NWRemoveJobFromQueue2(struct ncp_conn* conn, __u32 queue_id, __u32 job_id);
|
||||
|
||||
long
|
||||
ncp_close_file_and_start_job(struct ncp_conn *conn,
|
||||
__u32 queue_id,
|
||||
@@ -697,8 +644,7 @@ long
|
||||
struct nw_info_struct *file,
|
||||
__u16 * target);
|
||||
|
||||
struct ncp_trustee_struct
|
||||
{
|
||||
struct ncp_trustee_struct {
|
||||
__u32 object_id;
|
||||
__u16 rights;
|
||||
};
|
||||
@@ -708,31 +654,6 @@ long
|
||||
__u8 volume_number, __u32 dir_entry,
|
||||
__u16 rights_mask,
|
||||
int object_count, struct ncp_trustee_struct *rights);
|
||||
#ifdef SIGNATURES
|
||||
long
|
||||
ncp_sign_start(struct ncp_conn *conn, const char *sign_root);
|
||||
#endif
|
||||
#ifdef NDS_SUPPORT
|
||||
long
|
||||
ncp_send_nds_frag(struct ncp_conn *conn,
|
||||
int ndsverb,
|
||||
char *inbuf, int inbuflen,
|
||||
char *outbuf, int outbufsize, int *outbuflen);
|
||||
|
||||
long
|
||||
ncp_send_nds(struct ncp_conn *conn, int fn,
|
||||
char *data_in, int data_in_len,
|
||||
char *data_out, int data_out_max, int *data_out_len);
|
||||
|
||||
long
|
||||
ncp_change_conn_state(struct ncp_conn *conn, int new_state);
|
||||
|
||||
struct ncp_conn *
|
||||
ncp_open_addr(struct sockaddr_ipx *target, long *err);
|
||||
|
||||
int
|
||||
ncp_get_mount_uid(int fid, uid_t* uid);
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _NCPLIB_H */
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
#ifdef SIGNATURES
|
||||
/*
|
||||
* ncpsign.h
|
||||
*
|
||||
* Arne de Bruijn (arne@knoware.nl), 1997
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _NCPSIGN_H
|
||||
#define _NCPSIGN_H
|
||||
|
||||
#include "ncplib.h"
|
||||
|
||||
void sign_init(const char *logindata, char *sign_root);
|
||||
void sign_packet(struct ncp_conn *conn, int *size);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
NDS client for ncpfs
|
||||
Copyright (C) 1997 Arne de Bruijn
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef _NDSLIB_H_
|
||||
#define _NDSLIB_H_
|
||||
|
||||
#include "ncplib.h"
|
||||
typedef unsigned short uni_char;
|
||||
|
||||
#define NDS_GRACE_PERIOD -223
|
||||
|
||||
int strlen_u(const uni_char *s);
|
||||
void strcpy_uc(char *d, const uni_char *s);
|
||||
void strcpy_cu(uni_char *d, const char *s);
|
||||
long nds_get_server_name(struct ncp_conn *conn, uni_char **server_name);
|
||||
long nds_get_tree_name(struct ncp_conn *conn, char *name, int name_buf_len);
|
||||
long nds_login_auth(struct ncp_conn *conn, const char *user, const char *pwd);
|
||||
|
||||
#endif /* ifndef _NDSLIB_H_ */
|
||||
@@ -1,4 +1,4 @@
|
||||
CFLAGS = -O2 -Wall -I../include
|
||||
CFLAGS = -O2 -Wall
|
||||
UTILS = ipx_configure ipx_interface ipx_internal_net ipx_route
|
||||
|
||||
all: $(UTILS)
|
||||
|
||||
@@ -5,8 +5,7 @@
|
||||
#include <sys/socket.h>
|
||||
#include <errno.h>
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct sockaddr_ipx sipx;
|
||||
int s;
|
||||
@@ -15,8 +14,7 @@ main(int argc, char **argv)
|
||||
int len;
|
||||
|
||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (s < 0)
|
||||
{
|
||||
if (s < 0) {
|
||||
perror("IPX: socket: ");
|
||||
exit(-1);
|
||||
}
|
||||
@@ -26,16 +24,14 @@ main(int argc, char **argv)
|
||||
sipx.sipx_type = 17;
|
||||
len = sizeof(sipx);
|
||||
result = bind(s, (struct sockaddr *) &sipx, sizeof(sipx));
|
||||
if (result < 0)
|
||||
{
|
||||
if (result < 0) {
|
||||
perror("IPX: bind: ");
|
||||
exit(-1);
|
||||
}
|
||||
msg[0] = '\0';
|
||||
result = recvfrom(s, msg, sizeof(msg), 0, (struct sockaddr *) &sipx,
|
||||
&len);
|
||||
if (result < 0)
|
||||
{
|
||||
if (result < 0) {
|
||||
perror("IPX: recvfrom: ");
|
||||
}
|
||||
printf("From %08lX:%02X%02X%02X%02X%02X%02X:%04X\n",
|
||||
|
||||
@@ -9,8 +9,7 @@
|
||||
#include <sys/socket.h>
|
||||
#include <errno.h>
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct sockaddr_ipx sipx;
|
||||
int s;
|
||||
@@ -19,8 +18,7 @@ main(int argc, char **argv)
|
||||
int len = sizeof(sipx);
|
||||
|
||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (s < 0)
|
||||
{
|
||||
if (s < 0) {
|
||||
perror("IPX: socket: ");
|
||||
exit(-1);
|
||||
}
|
||||
@@ -30,8 +28,7 @@ main(int argc, char **argv)
|
||||
sipx.sipx_type = 17;
|
||||
|
||||
result = bind(s, (struct sockaddr *) &sipx, sizeof(sipx));
|
||||
if (result < 0)
|
||||
{
|
||||
if (result < 0) {
|
||||
perror("IPX: bind: ");
|
||||
exit(-1);
|
||||
}
|
||||
@@ -39,8 +36,7 @@ main(int argc, char **argv)
|
||||
sipx.sipx_port = htons(0x5000);
|
||||
result = sendto(s, msg, sizeof(msg), 0, (struct sockaddr *) &sipx,
|
||||
sizeof(sipx));
|
||||
if (result < 0)
|
||||
{
|
||||
if (result < 0) {
|
||||
perror("IPX: send: ");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
@@ -9,15 +9,13 @@
|
||||
#include <sys/socket.h>
|
||||
#include <errno.h>
|
||||
|
||||
struct rip_data
|
||||
{
|
||||
struct rip_data {
|
||||
unsigned long rip_net;
|
||||
unsigned short rip_hops __attribute__((packed));
|
||||
unsigned short rip_ticks __attribute__((packed));
|
||||
};
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct sockaddr_ipx sipx;
|
||||
int result;
|
||||
@@ -28,8 +26,7 @@ main(int argc, char **argv)
|
||||
struct rip_data *rp;
|
||||
|
||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (s < 0)
|
||||
{
|
||||
if (s < 0) {
|
||||
perror("IPX: socket: ");
|
||||
exit(-1);
|
||||
}
|
||||
@@ -38,18 +35,15 @@ main(int argc, char **argv)
|
||||
sipx.sipx_port = htons(0x453);
|
||||
sipx.sipx_type = 17;
|
||||
result = bind(s, (struct sockaddr *) &sipx, sizeof(sipx));
|
||||
if (result < 0)
|
||||
{
|
||||
if (result < 0) {
|
||||
perror("IPX: bind: ");
|
||||
exit(-1);
|
||||
}
|
||||
while (1)
|
||||
{
|
||||
while (1) {
|
||||
len = sizeof(sipx);
|
||||
result = recvfrom(s, msg, sizeof(msg), 0,
|
||||
(struct sockaddr *) &sipx, &len);
|
||||
if (result < 0)
|
||||
{
|
||||
if (result < 0) {
|
||||
perror("IPX: recvfrom");
|
||||
exit(-1);
|
||||
}
|
||||
@@ -62,8 +56,7 @@ main(int argc, char **argv)
|
||||
sipx.sipx_node[6], sipx.sipx_node[5]);
|
||||
bptr += 2;
|
||||
rp = (struct rip_data *) bptr;
|
||||
while (result >= sizeof(struct rip_data))
|
||||
{
|
||||
while (result >= sizeof(struct rip_data)) {
|
||||
printf("\tNET: %08lX HOPS: %d\n", ntohl(rp->rip_net),
|
||||
ntohs(rp->rip_hops));
|
||||
result -= sizeof(struct rip_data);
|
||||
|
||||
@@ -10,8 +10,7 @@
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
struct sap_data
|
||||
{
|
||||
struct sap_data {
|
||||
unsigned short sap_type __attribute__((packed));
|
||||
char sap_name[48] __attribute__((packed));
|
||||
unsigned long sap_net __attribute__((packed));
|
||||
@@ -20,8 +19,7 @@ struct sap_data
|
||||
unsigned short sap_hops __attribute__((packed));
|
||||
};
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int s;
|
||||
int result;
|
||||
@@ -33,14 +31,12 @@ main(int argc, char **argv)
|
||||
struct sap_data *sp;
|
||||
|
||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (s < 0)
|
||||
{
|
||||
if (s < 0) {
|
||||
perror("IPX: socket: ");
|
||||
exit(-1);
|
||||
}
|
||||
result = setsockopt(s, SOL_SOCKET, SO_DEBUG, &val, 4);
|
||||
if (result < 0)
|
||||
{
|
||||
if (result < 0) {
|
||||
perror("IPX: setsockopt: ");
|
||||
exit(-1);
|
||||
}
|
||||
@@ -50,18 +46,15 @@ main(int argc, char **argv)
|
||||
sipx.sipx_type = 17;
|
||||
|
||||
result = bind(s, (struct sockaddr *) &sipx, sizeof(sipx));
|
||||
if (result < 0)
|
||||
{
|
||||
if (result < 0) {
|
||||
perror("IPX: bind: ");
|
||||
exit(-1);
|
||||
}
|
||||
while (1)
|
||||
{
|
||||
while (1) {
|
||||
len = 1024;
|
||||
result = recvfrom(s, msg, sizeof(msg), 0,
|
||||
(struct sockaddr *) &sipx, &len);
|
||||
if (result < 0)
|
||||
{
|
||||
if (result < 0) {
|
||||
perror("IPX: recvfrom: ");
|
||||
exit(-1);
|
||||
}
|
||||
@@ -74,8 +67,7 @@ main(int argc, char **argv)
|
||||
|
||||
bptr += 2;
|
||||
sp = (struct sap_data *) bptr;
|
||||
while (result >= sizeof(struct sap_data))
|
||||
{
|
||||
while (result >= sizeof(struct sap_data)) {
|
||||
int i;
|
||||
|
||||
sp->sap_name[32] = '\0';
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include <ctype.h>
|
||||
#include <getopt.h>
|
||||
#include <strings.h>
|
||||
#include "kernel/ipx.h"
|
||||
#include <linux/ipx.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/ioctl.h>
|
||||
@@ -24,8 +24,7 @@ struct option options[] =
|
||||
|
||||
char *progname;
|
||||
|
||||
void
|
||||
usage(void)
|
||||
void usage(void)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Usage: %s --auto_primary=[on|off]\n\
|
||||
@@ -34,27 +33,23 @@ Usage: %s --help\n\
|
||||
Usage: %s\n", progname, progname, progname, progname);
|
||||
}
|
||||
|
||||
int
|
||||
map_string_to_bool(char *optarg)
|
||||
int map_string_to_bool(char *optarg)
|
||||
{
|
||||
if ((strcasecmp(optarg, "ON") == 0) ||
|
||||
(strcasecmp(optarg, "TRUE") == 0) ||
|
||||
(strcasecmp(optarg, "SET") == 0) ||
|
||||
(strcasecmp(optarg, "YES") == 0))
|
||||
{
|
||||
(strcasecmp(optarg, "YES") == 0)) {
|
||||
return 1;
|
||||
} else if ((strcasecmp(optarg, "OFF") == 0) ||
|
||||
(strcasecmp(optarg, "FALSE") == 0) ||
|
||||
(strcasecmp(optarg, "CLEAR") == 0) ||
|
||||
(strcasecmp(optarg, "NO") == 0))
|
||||
{
|
||||
(strcasecmp(optarg, "NO") == 0)) {
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int s;
|
||||
int result;
|
||||
@@ -68,13 +63,11 @@ main(int argc, char **argv)
|
||||
progname = argv[0];
|
||||
|
||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (s < 0)
|
||||
{
|
||||
if (s < 0) {
|
||||
int old_errno = errno;
|
||||
sprintf(errmsg, "%s: socket", progname);
|
||||
perror(errmsg);
|
||||
if (old_errno == -EINVAL)
|
||||
{
|
||||
if (old_errno == -EINVAL) {
|
||||
fprintf(stderr, "Probably you have no IPX support in "
|
||||
"your kernel\n");
|
||||
}
|
||||
@@ -82,24 +75,20 @@ main(int argc, char **argv)
|
||||
}
|
||||
sprintf(errmsg, "%s: ioctl", progname);
|
||||
while ((result = getopt_long(argc, argv, "", options,
|
||||
&option_index)) != -1)
|
||||
{
|
||||
switch (result)
|
||||
{
|
||||
&option_index)) != -1) {
|
||||
switch (result) {
|
||||
case 1:
|
||||
if (got_auto_pri)
|
||||
break;
|
||||
got_auto_pri++;
|
||||
|
||||
val = map_string_to_bool(optarg);
|
||||
if (val < 0)
|
||||
{
|
||||
if (val < 0) {
|
||||
usage();
|
||||
exit(-1);
|
||||
}
|
||||
result = ioctl(s, SIOCAIPXPRISLT, &val);
|
||||
if (result < 0)
|
||||
{
|
||||
if (result < 0) {
|
||||
perror(errmsg);
|
||||
exit(-1);
|
||||
}
|
||||
@@ -110,14 +99,12 @@ main(int argc, char **argv)
|
||||
got_auto_itf++;
|
||||
|
||||
val = map_string_to_bool(optarg);
|
||||
if (val < 0)
|
||||
{
|
||||
if (val < 0) {
|
||||
usage();
|
||||
exit(-1);
|
||||
}
|
||||
result = ioctl(s, SIOCAIPXITFCRT, &val);
|
||||
if (result < 0)
|
||||
{
|
||||
if (result < 0) {
|
||||
perror(errmsg);
|
||||
exit(-1);
|
||||
}
|
||||
@@ -128,17 +115,15 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
result = ioctl(s, SIOCIPXCFGDATA, &data);
|
||||
if (result < 0)
|
||||
{
|
||||
if (result < 0) {
|
||||
perror(errmsg);
|
||||
exit(-1);
|
||||
}
|
||||
if (argc == 1)
|
||||
{
|
||||
if (argc == 1) {
|
||||
fprintf(stdout, "Auto Primary Select is %s\n\
|
||||
Auto Interface Create is %s\n",
|
||||
(data.ipxcfg_auto_select_primary) ? "ON" : "OFF",
|
||||
(data.ipxcfg_auto_create_interfaces) ? "ON" : "OFF");
|
||||
(data.ipxcfg_auto_create_interfaces) ? "ON" : "OFF");
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <strings.h>
|
||||
#include <netinet/in.h>
|
||||
#include "kernel/ipx.h"
|
||||
#include "kernel/if.h"
|
||||
#include <linux/ipx.h>
|
||||
#include <linux/if.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/ioctl.h>
|
||||
@@ -21,8 +21,7 @@
|
||||
static struct ifreq id;
|
||||
static char *progname;
|
||||
|
||||
void
|
||||
usage(void)
|
||||
void usage(void)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s add [-p] device frame_type [net_number]\n\
|
||||
Usage: %s del device frame_type\n\
|
||||
@@ -31,12 +30,11 @@ Usage: %s check device frame_type\n", progname, progname, progname, progname);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
struct frame_type
|
||||
{
|
||||
struct frame_type {
|
||||
char *ft_name;
|
||||
unsigned char ft_val;
|
||||
}
|
||||
frame_types[] =
|
||||
} frame_types[] =
|
||||
|
||||
{
|
||||
{
|
||||
"802.2", IPX_FRAME_8022
|
||||
@@ -63,22 +61,19 @@ frame_types[] =
|
||||
|
||||
#define NFTYPES (sizeof(frame_types)/sizeof(struct frame_type))
|
||||
|
||||
int
|
||||
lookup_frame_type(char *frame)
|
||||
int lookup_frame_type(char *frame)
|
||||
{
|
||||
int j;
|
||||
|
||||
for (j = 0; (j < NFTYPES) &&
|
||||
(strcasecmp(frame_types[j].ft_name, frame));
|
||||
j++)
|
||||
;
|
||||
j++);
|
||||
|
||||
if (j != NFTYPES)
|
||||
return j;
|
||||
|
||||
fprintf(stderr, "%s: Frame type must be", progname);
|
||||
for (j = 0; j < NFTYPES; j++)
|
||||
{
|
||||
for (j = 0; j < NFTYPES; j++) {
|
||||
fprintf(stderr, "%s%s",
|
||||
(j == NFTYPES - 1) ? " or " : " ",
|
||||
frame_types[j].ft_name);
|
||||
@@ -87,8 +82,7 @@ lookup_frame_type(char *frame)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
ipx_add_interface(int argc, char **argv)
|
||||
int ipx_add_interface(int argc, char **argv)
|
||||
{
|
||||
struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &id.ifr_addr;
|
||||
int s;
|
||||
@@ -101,24 +95,19 @@ ipx_add_interface(int argc, char **argv)
|
||||
sipx->sipx_special = IPX_SPECIAL_NONE;
|
||||
sipx->sipx_network = 0L;
|
||||
sipx->sipx_type = IPX_FRAME_NONE;
|
||||
while ((c = getopt(argc, argv, "p")) > 0)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
while ((c = getopt(argc, argv, "p")) > 0) {
|
||||
switch (c) {
|
||||
case 'p':
|
||||
sipx->sipx_special = IPX_PRIMARY;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (((i = (argc - optind)) < 2) || (i > 3))
|
||||
{
|
||||
if (((i = (argc - optind)) < 2) || (i > 3)) {
|
||||
usage();
|
||||
}
|
||||
for (i = optind; i < argc; i++)
|
||||
{
|
||||
switch (i - optind)
|
||||
{
|
||||
for (i = optind; i < argc; i++) {
|
||||
switch (i - optind) {
|
||||
case 0: /* Physical Device - Required */
|
||||
strcpy(id.ifr_name, argv[i]);
|
||||
break;
|
||||
@@ -131,10 +120,9 @@ ipx_add_interface(int argc, char **argv)
|
||||
|
||||
case 2: /* Network Number - Optional */
|
||||
netnum = strtoul(argv[i], (char **) NULL, 16);
|
||||
if (netnum == 0xffffffffL)
|
||||
{
|
||||
if (netnum == 0xffffffffL) {
|
||||
fprintf(stderr,
|
||||
"%s: Inappropriate network number %08lX\n",
|
||||
"%s: Inappropriate network number %08lX\n",
|
||||
progname, netnum);
|
||||
exit(-1);
|
||||
}
|
||||
@@ -144,13 +132,11 @@ ipx_add_interface(int argc, char **argv)
|
||||
}
|
||||
|
||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (s < 0)
|
||||
{
|
||||
if (s < 0) {
|
||||
int old_errno = errno;
|
||||
sprintf(errmsg, "%s: socket", progname);
|
||||
perror(errmsg);
|
||||
if (old_errno == -EINVAL)
|
||||
{
|
||||
if (old_errno == -EINVAL) {
|
||||
fprintf(stderr, "Probably you have no IPX support in "
|
||||
"your kernel\n");
|
||||
}
|
||||
@@ -159,8 +145,7 @@ ipx_add_interface(int argc, char **argv)
|
||||
i = 0;
|
||||
sipx->sipx_family = AF_IPX;
|
||||
sipx->sipx_action = IPX_CRTITF;
|
||||
do
|
||||
{
|
||||
do {
|
||||
result = ioctl(s, SIOCSIFADDR, &id);
|
||||
i++;
|
||||
}
|
||||
@@ -169,15 +154,14 @@ ipx_add_interface(int argc, char **argv)
|
||||
if (result == 0)
|
||||
exit(0);
|
||||
|
||||
switch (errno)
|
||||
{
|
||||
switch (errno) {
|
||||
case EEXIST:
|
||||
fprintf(stderr, "%s: Primary network already selected.\n",
|
||||
progname);
|
||||
break;
|
||||
case EADDRINUSE:
|
||||
fprintf(stderr, "%s: Network number (%08X) already in use.\n",
|
||||
progname, (u_int32_t)htonl(sipx->sipx_network));
|
||||
fprintf(stderr, "%s: Network number (%08lX) already in use.\n",
|
||||
progname, htonl(sipx->sipx_network));
|
||||
break;
|
||||
case EPROTONOSUPPORT:
|
||||
fprintf(stderr, "%s: Invalid frame type (%s).\n",
|
||||
@@ -208,8 +192,7 @@ ipx_add_interface(int argc, char **argv)
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
int
|
||||
ipx_delall_interface(int argc, char **argv)
|
||||
int ipx_delall_interface(int argc, char **argv)
|
||||
{
|
||||
struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &id.ifr_addr;
|
||||
int s;
|
||||
@@ -222,31 +205,26 @@ ipx_delall_interface(int argc, char **argv)
|
||||
FILE *fp;
|
||||
|
||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (s < 0)
|
||||
{
|
||||
if (s < 0) {
|
||||
sprintf(errmsg, "%s: socket", progname);
|
||||
perror(errmsg);
|
||||
exit(-1);
|
||||
}
|
||||
fp = fopen("/proc/net/ipx_interface", "r");
|
||||
if (fp == NULL)
|
||||
{
|
||||
if (fp == NULL) {
|
||||
fprintf(stderr,
|
||||
"%s: Unable to open \"/proc/net/ipx_interface.\"\n",
|
||||
"%s: Unable to open \"/proc/net/ipx_interface.\"\n",
|
||||
progname);
|
||||
exit(-1);
|
||||
}
|
||||
fgets(buffer, 80, fp);
|
||||
while (fscanf(fp, "%s %s %s %s %s", buffer, buffer, buffer,
|
||||
device, frame_type) == 5)
|
||||
{
|
||||
device, frame_type) == 5) {
|
||||
|
||||
sipx->sipx_network = 0L;
|
||||
if (strcasecmp(device, "Internal") == 0)
|
||||
{
|
||||
if (strcasecmp(device, "Internal") == 0) {
|
||||
sipx->sipx_special = IPX_INTERNAL;
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
sipx->sipx_special = IPX_SPECIAL_NONE;
|
||||
strcpy(id.ifr_name, device);
|
||||
fti = lookup_frame_type(frame_type);
|
||||
@@ -260,8 +238,7 @@ ipx_delall_interface(int argc, char **argv)
|
||||
result = ioctl(s, SIOCSIFADDR, &id);
|
||||
if (result == 0)
|
||||
continue;
|
||||
switch (errno)
|
||||
{
|
||||
switch (errno) {
|
||||
case EPROTONOSUPPORT:
|
||||
fprintf(stderr, "%s: Invalid frame type (%s).\n",
|
||||
progname, frame_type);
|
||||
@@ -284,8 +261,7 @@ ipx_delall_interface(int argc, char **argv)
|
||||
exit(0);
|
||||
}
|
||||
|
||||
int
|
||||
ipx_del_interface(int argc, char **argv)
|
||||
int ipx_del_interface(int argc, char **argv)
|
||||
{
|
||||
struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &id.ifr_addr;
|
||||
int s;
|
||||
@@ -293,8 +269,7 @@ ipx_del_interface(int argc, char **argv)
|
||||
char errmsg[80];
|
||||
int fti;
|
||||
|
||||
if (argc != 3)
|
||||
{
|
||||
if (argc != 3) {
|
||||
usage();
|
||||
}
|
||||
sipx->sipx_network = 0L;
|
||||
@@ -306,8 +281,7 @@ ipx_del_interface(int argc, char **argv)
|
||||
sipx->sipx_type = frame_types[fti].ft_val;
|
||||
|
||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (s < 0)
|
||||
{
|
||||
if (s < 0) {
|
||||
sprintf(errmsg, "%s: socket", progname);
|
||||
perror(errmsg);
|
||||
exit(-1);
|
||||
@@ -318,8 +292,7 @@ ipx_del_interface(int argc, char **argv)
|
||||
if (result == 0)
|
||||
exit(0);
|
||||
|
||||
switch (errno)
|
||||
{
|
||||
switch (errno) {
|
||||
case EPROTONOSUPPORT:
|
||||
fprintf(stderr, "%s: Invalid frame type (%s).\n",
|
||||
progname, frame_types[fti].ft_name);
|
||||
@@ -340,8 +313,7 @@ ipx_del_interface(int argc, char **argv)
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
int
|
||||
ipx_check_interface(int argc, char **argv)
|
||||
int ipx_check_interface(int argc, char **argv)
|
||||
{
|
||||
struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &id.ifr_addr;
|
||||
int s;
|
||||
@@ -349,8 +321,7 @@ ipx_check_interface(int argc, char **argv)
|
||||
char errmsg[80];
|
||||
int fti;
|
||||
|
||||
if (argc != 3)
|
||||
{
|
||||
if (argc != 3) {
|
||||
usage();
|
||||
}
|
||||
sipx->sipx_network = 0L;
|
||||
@@ -361,27 +332,24 @@ ipx_check_interface(int argc, char **argv)
|
||||
sipx->sipx_type = frame_types[fti].ft_val;
|
||||
|
||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (s < 0)
|
||||
{
|
||||
if (s < 0) {
|
||||
sprintf(errmsg, "%s: socket", progname);
|
||||
perror(errmsg);
|
||||
exit(-1);
|
||||
}
|
||||
sipx->sipx_family = AF_IPX;
|
||||
result = ioctl(s, SIOCGIFADDR, &id);
|
||||
if (result == 0)
|
||||
{
|
||||
if (result == 0) {
|
||||
printf(
|
||||
"IPX Address for (%s, %s) is %08X:%02X%02X%02X%02X%02X%02X.\n",
|
||||
"IPX Address for (%s, %s) is %08lX:%02X%02X%02X%02X%02X%02X.\n",
|
||||
argv[1], frame_types[fti].ft_name,
|
||||
(u_int32_t)htonl(sipx->sipx_network), sipx->sipx_node[0],
|
||||
htonl(sipx->sipx_network), sipx->sipx_node[0],
|
||||
sipx->sipx_node[1], sipx->sipx_node[2],
|
||||
sipx->sipx_node[3], sipx->sipx_node[4],
|
||||
sipx->sipx_node[5]);
|
||||
exit(0);
|
||||
}
|
||||
switch (errno)
|
||||
{
|
||||
switch (errno) {
|
||||
case EPROTONOSUPPORT:
|
||||
fprintf(stderr, "%s: Invalid frame type (%s).\n",
|
||||
progname, frame_types[fti].ft_name);
|
||||
@@ -402,34 +370,28 @@ ipx_check_interface(int argc, char **argv)
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i;
|
||||
|
||||
progname = argv[0];
|
||||
if (argc < 2)
|
||||
{
|
||||
if (argc < 2) {
|
||||
usage();
|
||||
exit(-1);
|
||||
}
|
||||
if (strncasecmp(argv[1], "add", 3) == 0)
|
||||
{
|
||||
if (strncasecmp(argv[1], "add", 3) == 0) {
|
||||
for (i = 1; i < (argc - 1); i++)
|
||||
argv[i] = argv[i + 1];
|
||||
ipx_add_interface(argc - 1, argv);
|
||||
} else if (strncasecmp(argv[1], "delall", 6) == 0)
|
||||
{
|
||||
} else if (strncasecmp(argv[1], "delall", 6) == 0) {
|
||||
for (i = 1; i < (argc - 1); i++)
|
||||
argv[i] = argv[i + 1];
|
||||
ipx_delall_interface(argc - 1, argv);
|
||||
} else if (strncasecmp(argv[1], "del", 3) == 0)
|
||||
{
|
||||
} else if (strncasecmp(argv[1], "del", 3) == 0) {
|
||||
for (i = 1; i < (argc - 1); i++)
|
||||
argv[i] = argv[i + 1];
|
||||
ipx_del_interface(argc - 1, argv);
|
||||
} else if (strncasecmp(argv[1], "check", 5) == 0)
|
||||
{
|
||||
} else if (strncasecmp(argv[1], "check", 5) == 0) {
|
||||
for (i = 1; i < (argc - 1); i++)
|
||||
argv[i] = argv[i + 1];
|
||||
ipx_check_interface(argc - 1, argv);
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
#include <errno.h>
|
||||
#include <strings.h>
|
||||
#include <netinet/in.h>
|
||||
#include "kernel/ipx.h"
|
||||
#include "kernel/if.h"
|
||||
#include <linux/ipx.h>
|
||||
#include <linux/if.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/ioctl.h>
|
||||
@@ -18,32 +18,26 @@
|
||||
static struct ifreq id;
|
||||
static char *progname;
|
||||
|
||||
void
|
||||
usage(void)
|
||||
void usage(void)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s add net_number(hex) node(hex)\n\
|
||||
Usage: %s del\n", progname, progname);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
int
|
||||
map_char_to_val(char dig)
|
||||
int map_char_to_val(char dig)
|
||||
{
|
||||
char digit = tolower(dig);
|
||||
if ((digit >= '0') && (digit <= '9'))
|
||||
{
|
||||
if ((digit >= '0') && (digit <= '9')) {
|
||||
return digit - '0';
|
||||
} else if ((digit >= 'a') && (digit <= 'f'))
|
||||
{
|
||||
} else if ((digit >= 'a') && (digit <= 'f')) {
|
||||
return (10 + (digit - 'a'));
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
ipx_add_internal_net(int argc, char **argv)
|
||||
int ipx_add_internal_net(int argc, char **argv)
|
||||
{
|
||||
struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &id.ifr_addr;
|
||||
int s;
|
||||
@@ -57,45 +51,38 @@ ipx_add_internal_net(int argc, char **argv)
|
||||
char *tin;
|
||||
int i;
|
||||
|
||||
if (argc != 3)
|
||||
{
|
||||
if (argc != 3) {
|
||||
usage();
|
||||
}
|
||||
netnum = strtoul(argv[1], (char **) NULL, 16);
|
||||
if ((netnum == 0L) || (netnum == 0xffffffffL))
|
||||
{
|
||||
if ((netnum == 0L) || (netnum == 0xffffffffL)) {
|
||||
fprintf(stderr, "%s: Inappropriate network number %08lX\n",
|
||||
progname, netnum);
|
||||
exit(-1);
|
||||
}
|
||||
node = argv[2];
|
||||
nodelen = strlen(node);
|
||||
if (nodelen > 12)
|
||||
{
|
||||
if (nodelen > 12) {
|
||||
fprintf(stderr, "%s: Node length is too long (> 12).\n", progname);
|
||||
exit(-1);
|
||||
}
|
||||
for (i = 0; (i < nodelen) && isxdigit(node[i]); i++)
|
||||
;
|
||||
for (i = 0; (i < nodelen) && isxdigit(node[i]); i++);
|
||||
|
||||
if (i < nodelen)
|
||||
{
|
||||
if (i < nodelen) {
|
||||
fprintf(stderr, "%s: Invalid value in node, must be hex digits.\n",
|
||||
progname);
|
||||
exit(-1);
|
||||
}
|
||||
strcpy(tmpnode, "000000000000");
|
||||
memcpy(&(tmpnode[12 - nodelen]), node, nodelen);
|
||||
for (tin = tmpnode, tout = sipx->sipx_node; *tin != '\0'; tin += 2, tout++)
|
||||
{
|
||||
for (tin = tmpnode, tout = sipx->sipx_node; *tin != '\0'; tin += 2, tout++) {
|
||||
*tout = (unsigned char) map_char_to_val(*tin);
|
||||
*tout <<= 4;
|
||||
*tout |= (unsigned char) map_char_to_val(*(tin + 1));
|
||||
}
|
||||
|
||||
if ((memcmp(sipx->sipx_node, "\0\0\0\0\0\0\0\0", IPX_NODE_LEN) == 0) ||
|
||||
(memcmp(sipx->sipx_node, "\377\377\377\377\377\377", IPX_NODE_LEN) == 0))
|
||||
{
|
||||
(memcmp(sipx->sipx_node, "\377\377\377\377\377\377", IPX_NODE_LEN) == 0)) {
|
||||
fprintf(stderr, "%s: Node is invalid.\n", progname);
|
||||
exit(-1);
|
||||
}
|
||||
@@ -103,8 +90,7 @@ ipx_add_internal_net(int argc, char **argv)
|
||||
sipx->sipx_type = IPX_FRAME_NONE;
|
||||
sipx->sipx_special = IPX_INTERNAL;
|
||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (s < 0)
|
||||
{
|
||||
if (s < 0) {
|
||||
sprintf(errmsg, "%s: socket", progname);
|
||||
perror(errmsg);
|
||||
exit(-1);
|
||||
@@ -112,8 +98,7 @@ ipx_add_internal_net(int argc, char **argv)
|
||||
sipx->sipx_family = AF_IPX;
|
||||
sipx->sipx_action = IPX_CRTITF;
|
||||
i = 0;
|
||||
do
|
||||
{
|
||||
do {
|
||||
result = ioctl(s, SIOCSIFADDR, &id);
|
||||
i++;
|
||||
}
|
||||
@@ -122,19 +107,18 @@ ipx_add_internal_net(int argc, char **argv)
|
||||
if (result == 0)
|
||||
exit(0);
|
||||
|
||||
switch (errno)
|
||||
{
|
||||
switch (errno) {
|
||||
case EEXIST:
|
||||
fprintf(stderr, "%s: Primary network already selected.\n",
|
||||
progname);
|
||||
break;
|
||||
case EADDRINUSE:
|
||||
fprintf(stderr, "%s: Network number (%08X) already in use.\n",
|
||||
progname, (u_int32_t)htonl(sipx->sipx_network));
|
||||
fprintf(stderr, "%s: Network number (%08lX) already in use.\n",
|
||||
progname, htonl(sipx->sipx_network));
|
||||
break;
|
||||
case EAGAIN:
|
||||
fprintf(stderr,
|
||||
"%s: Insufficient memory to create internal net.\n",
|
||||
"%s: Insufficient memory to create internal net.\n",
|
||||
progname);
|
||||
break;
|
||||
default:
|
||||
@@ -145,23 +129,20 @@ ipx_add_internal_net(int argc, char **argv)
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
int
|
||||
ipx_del_internal_net(int argc, char **argv)
|
||||
int ipx_del_internal_net(int argc, char **argv)
|
||||
{
|
||||
struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &id.ifr_addr;
|
||||
int s;
|
||||
int result;
|
||||
char errmsg[80];
|
||||
|
||||
if (argc != 1)
|
||||
{
|
||||
if (argc != 1) {
|
||||
usage();
|
||||
}
|
||||
sipx->sipx_network = 0L;
|
||||
sipx->sipx_special = IPX_INTERNAL;
|
||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (s < 0)
|
||||
{
|
||||
if (s < 0) {
|
||||
sprintf(errmsg, "%s: socket", progname);
|
||||
perror(errmsg);
|
||||
exit(-1);
|
||||
@@ -172,8 +153,7 @@ ipx_del_internal_net(int argc, char **argv)
|
||||
if (result == 0)
|
||||
exit(0);
|
||||
|
||||
switch (errno)
|
||||
{
|
||||
switch (errno) {
|
||||
case ENOENT:
|
||||
fprintf(stderr, "%s: No internal network configured.\n", progname);
|
||||
break;
|
||||
@@ -185,24 +165,20 @@ ipx_del_internal_net(int argc, char **argv)
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i;
|
||||
|
||||
progname = argv[0];
|
||||
if (argc < 2)
|
||||
{
|
||||
if (argc < 2) {
|
||||
usage();
|
||||
exit(-1);
|
||||
}
|
||||
if (strncasecmp(argv[1], "add", 3) == 0)
|
||||
{
|
||||
if (strncasecmp(argv[1], "add", 3) == 0) {
|
||||
for (i = 1; i < (argc - 1); i++)
|
||||
argv[i] = argv[i + 1];
|
||||
ipx_add_internal_net(argc - 1, argv);
|
||||
} else if (strncasecmp(argv[1], "del", 3) == 0)
|
||||
{
|
||||
} else if (strncasecmp(argv[1], "del", 3) == 0) {
|
||||
for (i = 1; i < (argc - 1); i++)
|
||||
argv[i] = argv[i + 1];
|
||||
ipx_del_internal_net(argc - 1, argv);
|
||||
|
||||
@@ -11,33 +11,28 @@
|
||||
#include <errno.h>
|
||||
#include <strings.h>
|
||||
#include <netinet/in.h>
|
||||
#include "kernel/ipx.h"
|
||||
#include <linux/ipx.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include "kernel/route.h"
|
||||
#include <linux/route.h>
|
||||
|
||||
static struct rtentry rd;
|
||||
static char *progname;
|
||||
|
||||
int
|
||||
map_char_to_val(char dig)
|
||||
int map_char_to_val(char dig)
|
||||
{
|
||||
char digit = tolower(dig);
|
||||
if ((digit >= '0') && (digit <= '9'))
|
||||
{
|
||||
if ((digit >= '0') && (digit <= '9')) {
|
||||
return digit - '0';
|
||||
} else if ((digit >= 'a') && (digit <= 'f'))
|
||||
{
|
||||
} else if ((digit >= 'a') && (digit <= 'f')) {
|
||||
return (10 + (digit - 'a'));
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
usage(void)
|
||||
void usage(void)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Usage: %s add network(hex) router_network(hex) router_node(hex)\n\
|
||||
@@ -45,8 +40,7 @@ Usage: %s del network(hex)\n", progname, progname);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
int
|
||||
ipx_add_route(int argc, char **argv)
|
||||
int ipx_add_route(int argc, char **argv)
|
||||
{
|
||||
/* Router */
|
||||
struct sockaddr_ipx *sr = (struct sockaddr_ipx *) &rd.rt_gateway;
|
||||
@@ -68,8 +62,7 @@ ipx_add_route(int argc, char **argv)
|
||||
|
||||
/* Network Number */
|
||||
netnum = strtoul(argv[1], (char **) NULL, 16);
|
||||
if ((netnum == 0xffffffffL) || (netnum == 0L))
|
||||
{
|
||||
if ((netnum == 0xffffffffL) || (netnum == 0L)) {
|
||||
fprintf(stderr, "%s: Inappropriate network number %08lX\n",
|
||||
progname, netnum);
|
||||
exit(-1);
|
||||
@@ -79,8 +72,7 @@ ipx_add_route(int argc, char **argv)
|
||||
|
||||
/* Router Network Number */
|
||||
netnum = strtoul(argv[2], (char **) NULL, 16);
|
||||
if ((netnum == 0xffffffffL) || (netnum == 0L))
|
||||
{
|
||||
if ((netnum == 0xffffffffL) || (netnum == 0L)) {
|
||||
fprintf(stderr, "%s: Inappropriate network number %08lX\n",
|
||||
progname, netnum);
|
||||
exit(-1);
|
||||
@@ -90,47 +82,40 @@ ipx_add_route(int argc, char **argv)
|
||||
/* Router Node */
|
||||
node = argv[3];
|
||||
nodelen = strlen(node);
|
||||
if (nodelen > 12)
|
||||
{
|
||||
if (nodelen > 12) {
|
||||
fprintf(stderr, "%s: Node length is too long (> 12).\n",
|
||||
progname);
|
||||
exit(-1);
|
||||
}
|
||||
for (i = 0; (i < nodelen) && isxdigit(node[i]); i++)
|
||||
;
|
||||
for (i = 0; (i < nodelen) && isxdigit(node[i]); i++);
|
||||
|
||||
if (i < nodelen)
|
||||
{
|
||||
if (i < nodelen) {
|
||||
fprintf(stderr, "%s: Invalid value in node, must be hex digits.\n",
|
||||
progname);
|
||||
exit(-1);
|
||||
}
|
||||
strcpy(tmpnode, "000000000000");
|
||||
memcpy(&(tmpnode[12 - nodelen]), node, nodelen);
|
||||
for (tin = tmpnode, tout = sr->sipx_node; *tin != '\0'; tin += 2, tout++)
|
||||
{
|
||||
for (tin = tmpnode, tout = sr->sipx_node; *tin != '\0'; tin += 2, tout++) {
|
||||
*tout = (unsigned char) map_char_to_val(*tin);
|
||||
*tout <<= 4;
|
||||
*tout |= (unsigned char) map_char_to_val(*(tin + 1));
|
||||
}
|
||||
|
||||
if ((memcmp(sr->sipx_node, "\0\0\0\0\0\0\0\0", IPX_NODE_LEN) == 0) ||
|
||||
(memcmp(sr->sipx_node, "\377\377\377\377\377\377", IPX_NODE_LEN) == 0))
|
||||
{
|
||||
(memcmp(sr->sipx_node, "\377\377\377\377\377\377", IPX_NODE_LEN) == 0)) {
|
||||
fprintf(stderr, "%s: Node (%s) is invalid.\n", progname, tmpnode);
|
||||
exit(-1);
|
||||
}
|
||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (s < 0)
|
||||
{
|
||||
if (s < 0) {
|
||||
sprintf(errmsg, "%s: socket", progname);
|
||||
perror(errmsg);
|
||||
exit(-1);
|
||||
}
|
||||
sr->sipx_family = st->sipx_family = AF_IPX;
|
||||
i = 0;
|
||||
do
|
||||
{
|
||||
do {
|
||||
result = ioctl(s, SIOCADDRT, &rd);
|
||||
i++;
|
||||
}
|
||||
@@ -139,11 +124,10 @@ ipx_add_route(int argc, char **argv)
|
||||
if (result == 0)
|
||||
exit(0);
|
||||
|
||||
switch (errno)
|
||||
{
|
||||
switch (errno) {
|
||||
case ENETUNREACH:
|
||||
fprintf(stderr, "%s: Router network (%08X) not reachable.\n",
|
||||
progname, (u_int32_t)htonl(sr->sipx_network));
|
||||
fprintf(stderr, "%s: Router network (%08lX) not reachable.\n",
|
||||
progname, htonl(sr->sipx_network));
|
||||
break;
|
||||
default:
|
||||
sprintf(errmsg, "%s: ioctl", progname);
|
||||
@@ -153,8 +137,7 @@ ipx_add_route(int argc, char **argv)
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
int
|
||||
ipx_del_route(int argc, char **argv)
|
||||
int ipx_del_route(int argc, char **argv)
|
||||
{
|
||||
/* Router */
|
||||
struct sockaddr_ipx *sr = (struct sockaddr_ipx *) &rd.rt_gateway;
|
||||
@@ -165,15 +148,13 @@ ipx_del_route(int argc, char **argv)
|
||||
unsigned long netnum;
|
||||
char errmsg[80];
|
||||
|
||||
if (argc != 2)
|
||||
{
|
||||
if (argc != 2) {
|
||||
usage();
|
||||
}
|
||||
rd.rt_flags = RTF_GATEWAY;
|
||||
/* Network Number */
|
||||
netnum = strtoul(argv[1], (char **) NULL, 16);
|
||||
if ((netnum == 0xffffffffL) || (netnum == 0L))
|
||||
{
|
||||
if ((netnum == 0xffffffffL) || (netnum == 0L)) {
|
||||
fprintf(stderr, "%s: Inappropriate network number %08lX.\n",
|
||||
progname, netnum);
|
||||
exit(-1);
|
||||
@@ -182,8 +163,7 @@ ipx_del_route(int argc, char **argv)
|
||||
|
||||
st->sipx_family = sr->sipx_family = AF_IPX;
|
||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (s < 0)
|
||||
{
|
||||
if (s < 0) {
|
||||
sprintf(errmsg, "%s: socket", progname);
|
||||
perror(errmsg);
|
||||
exit(-1);
|
||||
@@ -192,8 +172,7 @@ ipx_del_route(int argc, char **argv)
|
||||
if (result == 0)
|
||||
exit(0);
|
||||
|
||||
switch (errno)
|
||||
{
|
||||
switch (errno) {
|
||||
case ENOENT:
|
||||
fprintf(stderr, "%s: Route not found for network %08lX.\n",
|
||||
progname, netnum);
|
||||
@@ -210,24 +189,20 @@ ipx_del_route(int argc, char **argv)
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i;
|
||||
|
||||
progname = argv[0];
|
||||
if (argc < 2)
|
||||
{
|
||||
if (argc < 2) {
|
||||
usage();
|
||||
exit(-1);
|
||||
}
|
||||
if (strncasecmp(argv[1], "add", 3) == 0)
|
||||
{
|
||||
if (strncasecmp(argv[1], "add", 3) == 0) {
|
||||
for (i = 1; i < (argc - 1); i++)
|
||||
argv[i] = argv[i + 1];
|
||||
ipx_add_route(argc - 1, argv);
|
||||
} else if (strncasecmp(argv[1], "del", 3) == 0)
|
||||
{
|
||||
} else if (strncasecmp(argv[1], "del", 3) == 0) {
|
||||
for (i = 1; i < (argc - 1); i++)
|
||||
argv[i] = argv[i + 1];
|
||||
ipx_del_route(argc - 1, argv);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
EXEC= ipxdump ipxparse
|
||||
|
||||
CFLAGS= -Wall -O2 -I../include
|
||||
CFLAGS= -Wall -O2
|
||||
OBJECTS= ipxutil.o
|
||||
|
||||
all: $(EXEC)
|
||||
|
||||
@@ -21,27 +21,26 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/if_ether.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <strings.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <net/if.h>
|
||||
#include <linux/if.h>
|
||||
#include <signal.h>
|
||||
#include <netinet/ip.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/tcp.h>
|
||||
#include <netinet/protocols.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <signal.h>
|
||||
#include "ipxutil.h"
|
||||
|
||||
struct ipx_address
|
||||
{
|
||||
struct ipx_address {
|
||||
unsigned long net;
|
||||
unsigned char node[IPX_NODE_LEN];
|
||||
unsigned short sock;
|
||||
};
|
||||
|
||||
struct ipx_packet
|
||||
{
|
||||
struct ipx_packet {
|
||||
unsigned short ipx_checksum;
|
||||
#define IPX_NO_CHECKSUM 0xFFFF
|
||||
unsigned short ipx_pktsize;
|
||||
@@ -65,14 +64,12 @@ static int filter = 0;
|
||||
static IPXNode filter_node;
|
||||
|
||||
static int exit_request = 0;
|
||||
static void
|
||||
int_handler()
|
||||
static void int_handler()
|
||||
{
|
||||
exit_request = 1;
|
||||
}
|
||||
|
||||
void
|
||||
main(int argc, char *argv[])
|
||||
void main(int argc, char *argv[])
|
||||
{
|
||||
int sd;
|
||||
struct ifreq ifr, oldifr;
|
||||
@@ -84,17 +81,14 @@ main(int argc, char *argv[])
|
||||
|
||||
signal(SIGINT, int_handler);
|
||||
|
||||
if (argc > 1)
|
||||
{
|
||||
if (ipx_sscanf_node(argv[1], filter_node) != 0)
|
||||
{
|
||||
if (argc > 1) {
|
||||
if (ipx_sscanf_node(argv[1], filter_node) != 0) {
|
||||
fprintf(stderr, "usage: %s [node]\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
filter = 1;
|
||||
}
|
||||
if ((sd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL))) < 0)
|
||||
{
|
||||
if ((sd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL))) < 0) {
|
||||
perror("Can't get socket");
|
||||
fprintf(stderr, "You must run %s as root\n", argv[0]);
|
||||
exit(1);
|
||||
@@ -102,8 +96,7 @@ main(int argc, char *argv[])
|
||||
/* SET PROMISC */
|
||||
|
||||
strcpy(oldifr.ifr_name, device);
|
||||
if (ioctl(sd, SIOCGIFFLAGS, &oldifr) < 0)
|
||||
{
|
||||
if (ioctl(sd, SIOCGIFFLAGS, &oldifr) < 0) {
|
||||
close(sd);
|
||||
perror("Can't get flags");
|
||||
exit(2);
|
||||
@@ -112,14 +105,12 @@ main(int argc, char *argv[])
|
||||
ifr = oldifr;
|
||||
ifr.ifr_flags |= IFF_PROMISC;
|
||||
|
||||
if (ioctl(sd, SIOCSIFFLAGS, &ifr) < 0)
|
||||
{
|
||||
if (ioctl(sd, SIOCSIFFLAGS, &ifr) < 0) {
|
||||
close(sd);
|
||||
perror("Can't set flags");
|
||||
exit(3);
|
||||
}
|
||||
while (exit_request == 0)
|
||||
{
|
||||
while (exit_request == 0) {
|
||||
/* This is the main data-gathering loop; keep it small
|
||||
and fast */
|
||||
sizeaddr = sizeof(saddr);
|
||||
@@ -131,8 +122,7 @@ main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
/* This should be rewritten to cooperate with other net tools */
|
||||
if (ioctl(sd, SIOCSIFFLAGS, &oldifr) < 0)
|
||||
{
|
||||
if (ioctl(sd, SIOCSIFFLAGS, &oldifr) < 0) {
|
||||
close(sd);
|
||||
perror("Can't set flags");
|
||||
exit(4);
|
||||
@@ -141,8 +131,7 @@ main(int argc, char *argv[])
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void
|
||||
handle_ipx(char *frame, unsigned char *buf)
|
||||
void handle_ipx(char *frame, unsigned char *buf)
|
||||
{
|
||||
int i;
|
||||
struct ipx_packet *h = (struct ipx_packet *) buf;
|
||||
@@ -162,38 +151,32 @@ handle_ipx(char *frame, unsigned char *buf)
|
||||
d_addr.sipx_port = h->ipx_dest.sock;
|
||||
d_addr.sipx_network = h->ipx_dest.net;
|
||||
|
||||
if (filter != 0)
|
||||
{
|
||||
if (filter != 0) {
|
||||
if ((memcmp(filter_node, s_addr.sipx_node,
|
||||
sizeof(filter_node)) != 0)
|
||||
&& (memcmp(filter_node, d_addr.sipx_node,
|
||||
sizeof(filter_node)) != 0))
|
||||
{
|
||||
sizeof(filter_node)) != 0)) {
|
||||
/* Not for us */
|
||||
return;
|
||||
}
|
||||
}
|
||||
printf("%s ", frame);
|
||||
|
||||
for (i = 0; i < length; i++)
|
||||
{
|
||||
for (i = 0; i < length; i++) {
|
||||
printf("%2.2X", buf[i]);
|
||||
}
|
||||
printf("\n");
|
||||
if (!isatty(STDOUT_FILENO))
|
||||
{
|
||||
if (!isatty(STDOUT_FILENO)) {
|
||||
fflush(stdout);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
handle_other(unsigned char *buf, int length, struct sockaddr *saddr)
|
||||
void handle_other(unsigned char *buf, int length, struct sockaddr *saddr)
|
||||
{
|
||||
struct ethhdr *eth = (struct ethhdr *) buf;
|
||||
unsigned char *p = &(buf[sizeof(struct ethhdr)]);
|
||||
|
||||
if (ntohs(eth->h_proto) < 1536)
|
||||
{
|
||||
if (ntohs(eth->h_proto) < 1536) {
|
||||
/* This is a magic hack to spot IPX packets. Older
|
||||
* Novell breaks the protocol design and runs IPX over
|
||||
* 802.3 without an 802.2 LLC layer. We look for FFFF
|
||||
@@ -201,33 +184,28 @@ handle_other(unsigned char *buf, int length, struct sockaddr *saddr)
|
||||
* for fault tolerant netware but does for the rest.
|
||||
*/
|
||||
|
||||
if (*(unsigned short *) p == 0xffff)
|
||||
{
|
||||
if (*(unsigned short *) p == 0xffff) {
|
||||
handle_ipx("802.3", p);
|
||||
return;
|
||||
}
|
||||
if ((*(unsigned short *) p == htons(0xe0e0))
|
||||
&& (p[2] == 0x03))
|
||||
{
|
||||
&& (p[2] == 0x03)) {
|
||||
handle_ipx("802.2", p + 3);
|
||||
return;
|
||||
}
|
||||
if (memcmp(p, "\252\252\003\000\000\000\201\067", 8) == 0)
|
||||
{
|
||||
if (memcmp(p, "\252\252\003\000\000\000\201\067", 8) == 0) {
|
||||
handle_ipx("snap", p + 8);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
handle_frame(unsigned char *buf, int length, struct sockaddr *saddr)
|
||||
void handle_frame(unsigned char *buf, int length, struct sockaddr *saddr)
|
||||
{
|
||||
/* Ethernet packet type ID field */
|
||||
unsigned short packet_type = ((struct ethhdr *) buf)->h_proto;
|
||||
switch (htons(packet_type))
|
||||
{
|
||||
case ETH_P_IPX:
|
||||
switch (packet_type) {
|
||||
case __constant_ntohs(ETH_P_IPX):
|
||||
handle_ipx("EtherII", &(buf[sizeof(struct ethhdr)]));
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -21,34 +21,29 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/if_ether.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <strings.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <net/if.h>
|
||||
#include <linux/if.h>
|
||||
#include <signal.h>
|
||||
#include <netinet/ip.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/tcp.h>
|
||||
#include <netinet/protocols.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <signal.h>
|
||||
#include <ctype.h>
|
||||
#include "ipxutil.h"
|
||||
|
||||
#define __u8 u_int8_t
|
||||
#define __u16 u_int16_t
|
||||
#define __u32 u_int32_t
|
||||
|
||||
#define DUMPALLSAPS /* #define if you want to dump all SAP's */
|
||||
|
||||
struct ipx_address
|
||||
{
|
||||
struct ipx_address {
|
||||
unsigned long net;
|
||||
unsigned char node[IPX_NODE_LEN];
|
||||
unsigned short sock;
|
||||
};
|
||||
|
||||
struct ipx_packet
|
||||
{
|
||||
struct ipx_packet {
|
||||
unsigned short ipx_checksum;
|
||||
#define IPX_NO_CHECKSUM 0xFFFF
|
||||
unsigned short ipx_pktsize;
|
||||
@@ -68,8 +63,7 @@ struct ipx_packet
|
||||
#define NCP_REQUEST (0x2222)
|
||||
#define NCP_DEALLOC_SLOT_REQUEST (0x5555)
|
||||
|
||||
struct ncp_request_header
|
||||
{
|
||||
struct ncp_request_header {
|
||||
__u16 type __attribute__((packed));
|
||||
__u8 sequence __attribute__((packed));
|
||||
__u8 conn_low __attribute__((packed));
|
||||
@@ -82,8 +76,7 @@ struct ncp_request_header
|
||||
#define NCP_REPLY (0x3333)
|
||||
#define NCP_POSITIVE_ACK (0x9999)
|
||||
|
||||
struct ncp_reply_header
|
||||
{
|
||||
struct ncp_reply_header {
|
||||
__u16 type __attribute__((packed));
|
||||
__u8 sequence __attribute__((packed));
|
||||
__u8 conn_low __attribute__((packed));
|
||||
@@ -96,8 +89,7 @@ struct ncp_reply_header
|
||||
|
||||
#define NCP_BURST_PACKET (0x7777)
|
||||
|
||||
struct ncp_burst_header
|
||||
{
|
||||
struct ncp_burst_header {
|
||||
__u16 type __attribute__((packed));
|
||||
__u8 system_flags __attribute__((packed));
|
||||
__u8 stream_type __attribute__((packed));
|
||||
@@ -128,37 +120,29 @@ int handle_burst(struct sockaddr_ipx *source,
|
||||
/* SAP Query structure (returned in sap_packet as an array)
|
||||
* NBO == Network Byte Order)
|
||||
*/
|
||||
typedef struct saps
|
||||
{
|
||||
typedef struct saps {
|
||||
__u16 serverType __attribute__((packed)); /* NBO */
|
||||
__u8 serverName[SAP_MAX_SERVER_NAME_LENGTH] __attribute__((packed));
|
||||
struct ipx_address serverAddress __attribute__((packed));
|
||||
__u16 serverHops __attribute__((packed)); /* NBO */
|
||||
}
|
||||
SAPS;
|
||||
} SAPS;
|
||||
|
||||
/* General Service/Nearest Server Response SAP packet */
|
||||
union sap_packet
|
||||
{
|
||||
union sap_packet {
|
||||
unsigned short sapOperation;
|
||||
struct sap_query
|
||||
{
|
||||
struct sap_query {
|
||||
__u16 sapOperation __attribute__((packed));
|
||||
__u16 serverType __attribute__((packed));
|
||||
}
|
||||
query;
|
||||
struct sap_response
|
||||
{
|
||||
} query;
|
||||
struct sap_response {
|
||||
__u16 sapOperation __attribute__((packed));
|
||||
/* each SAP can has a max of SAP_MAX_SAPS_PER_PACKET packets */
|
||||
SAPS sap[SAP_MAX_SAPS_PER_PACKET] __attribute__((packed));
|
||||
}
|
||||
response;
|
||||
} response;
|
||||
};
|
||||
|
||||
/* print out one SAP record */
|
||||
static void
|
||||
print_sap(FILE * file, SAPS * sapp)
|
||||
static void print_sap(FILE * file, SAPS * sapp)
|
||||
{
|
||||
fprintf(file, " Name:%s, serverType 0x%x, ",
|
||||
sapp->serverName,
|
||||
@@ -171,8 +155,7 @@ print_sap(FILE * file, SAPS * sapp)
|
||||
fprintf(file, " (Hops %d)\n", ntohs(sapp->serverHops));
|
||||
}
|
||||
|
||||
void
|
||||
handle_ipx(unsigned char *buf, int length, char *frame, int no)
|
||||
void handle_ipx(unsigned char *buf, int length, char *frame, int no)
|
||||
{
|
||||
struct ipx_packet *h = (struct ipx_packet *) buf;
|
||||
struct sockaddr_ipx s_addr;
|
||||
@@ -200,13 +183,11 @@ handle_ipx(unsigned char *buf, int length, char *frame, int no)
|
||||
printf("\n");
|
||||
|
||||
if (handle_burst(&s_addr, &d_addr, buf + sizeof(struct ipx_packet),
|
||||
length - sizeof(struct ipx_packet), no) != 0)
|
||||
{
|
||||
length - sizeof(struct ipx_packet), no) != 0) {
|
||||
return;
|
||||
}
|
||||
if ((ntohs(s_addr.sipx_port) == 0x451)
|
||||
|| (ntohs(d_addr.sipx_port) == 0x451))
|
||||
{
|
||||
|| (ntohs(d_addr.sipx_port) == 0x451)) {
|
||||
handle_ncp(&s_addr, &d_addr, buf + sizeof(struct ipx_packet),
|
||||
length - sizeof(struct ipx_packet), no);
|
||||
} else
|
||||
@@ -217,25 +198,21 @@ handle_ipx(unsigned char *buf, int length, char *frame, int no)
|
||||
printf(" type 0x05 (SPX sequenced packet)\n");
|
||||
else if (h->ipx_type == 0x14)
|
||||
printf(" type 0x14 (propogated Client-NetBios)\n");
|
||||
else
|
||||
{
|
||||
else {
|
||||
hbo_dsock = ntohs(d_addr.sipx_port);
|
||||
if (hbo_dsock == 0x452) /* SAP */
|
||||
{
|
||||
if (hbo_dsock == 0x452) { /* SAP */
|
||||
sappacket = (union sap_packet *)
|
||||
(buf + sizeof(struct ipx_packet));
|
||||
hbo_sapop = ntohs(sappacket->sapOperation);
|
||||
if ((hbo_sapop == 0x01) || (hbo_sapop == 0x03))
|
||||
{
|
||||
if ((hbo_sapop == 0x01) || (hbo_sapop == 0x03)) {
|
||||
printf(" type 0x%x, SAP op:0x%x %s Query, "
|
||||
"serverType 0x%x wanted\n",
|
||||
h->ipx_type, hbo_sapop,
|
||||
(hbo_sapop == 0x01) ? "General Service" :
|
||||
(hbo_sapop == 0x03) ? "Nearest Server" :
|
||||
(hbo_sapop == 0x01) ? "General Service" :
|
||||
(hbo_sapop == 0x03) ? "Nearest Server" :
|
||||
"Error",
|
||||
ntohs(sappacket->query.serverType));
|
||||
} else
|
||||
{
|
||||
ntohs(sappacket->query.serverType));
|
||||
} else {
|
||||
int hops;
|
||||
|
||||
hops = ntohs(sappacket->
|
||||
@@ -251,20 +228,18 @@ handle_ipx(unsigned char *buf, int length, char *frame, int no)
|
||||
? "[Shutdown]" : "");
|
||||
|
||||
/* Service ending */
|
||||
if (hops >= SAP_SHUTDOWN)
|
||||
{
|
||||
if (hops >= SAP_SHUTDOWN) {
|
||||
print_sap(stdout,
|
||||
sappacket->response.sap);
|
||||
sappacket->response.sap);
|
||||
}
|
||||
#ifdef DUMPALLSAPS
|
||||
/* If you want to dump all SAP's */
|
||||
else
|
||||
{
|
||||
else {
|
||||
int num_saps;
|
||||
SAPS *sapp;
|
||||
|
||||
num_saps = (length
|
||||
- sizeof(struct ipx_packet)
|
||||
- sizeof(struct ipx_packet)
|
||||
- 2) / sizeof(SAPS);
|
||||
|
||||
sapp = sappacket->response.sap;
|
||||
@@ -288,15 +263,13 @@ handle_ipx(unsigned char *buf, int length, char *frame, int no)
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
handle_burst(struct sockaddr_ipx *source,
|
||||
struct sockaddr_ipx *target,
|
||||
unsigned char *buf, int length, int no)
|
||||
int handle_burst(struct sockaddr_ipx *source,
|
||||
struct sockaddr_ipx *target,
|
||||
unsigned char *buf, int length, int no)
|
||||
{
|
||||
struct ncp_burst_header *rq = (struct ncp_burst_header *) buf;
|
||||
|
||||
if (rq->type != NCP_BURST_PACKET)
|
||||
{
|
||||
if (rq->type != NCP_BURST_PACKET) {
|
||||
return 0;
|
||||
}
|
||||
printf("Burst Packet\n");
|
||||
@@ -306,25 +279,22 @@ handle_burst(struct sockaddr_ipx *source,
|
||||
rq->source_conn, rq->dest_conn,
|
||||
(unsigned int) ntohl(rq->packet_sequence));
|
||||
printf("Send Delay: %08X, Burst Seq: %04X, Ack Seq: %04X\n",
|
||||
(unsigned int) ntohl(rq->send_delay), ntohs(rq->burst_sequence),
|
||||
(unsigned int) ntohl(rq->send_delay), ntohs(rq->burst_sequence),
|
||||
ntohs(rq->ack_sequence));
|
||||
printf("Burst Length: %08X\n", (unsigned int) ntohl(rq->burst_length));
|
||||
printf("Data Offset: %08X, Data Bytes: %04X, Missing Frags: %04X\n",
|
||||
(unsigned int) ntohl(rq->data_offset), ntohs(rq->data_bytes),
|
||||
(unsigned int) ntohl(rq->data_offset), ntohs(rq->data_bytes),
|
||||
ntohs(rq->missing_frags));
|
||||
|
||||
if (ntohs(rq->data_bytes) == 24)
|
||||
{
|
||||
struct ncp_burst_request
|
||||
{
|
||||
if (ntohs(rq->data_bytes) == 24) {
|
||||
struct ncp_burst_request {
|
||||
struct ncp_burst_header h __attribute__((packed));
|
||||
__u32 function __attribute__((packed));
|
||||
__u32 file_handle __attribute__((packed));
|
||||
__u8 reserved[8] __attribute__((packed));
|
||||
__u32 file_offset __attribute__((packed));
|
||||
__u32 number_of_bytes __attribute__((packed));
|
||||
}
|
||||
*brq = (struct ncp_burst_request *) rq;
|
||||
} *brq = (struct ncp_burst_request *) rq;
|
||||
|
||||
printf("Assuming Burst Request:\n");
|
||||
printf("%s: Handle %08X, Offset %08X, Bytes %08X\n",
|
||||
@@ -337,10 +307,9 @@ 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;
|
||||
@@ -352,8 +321,7 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
static struct ncp_request_header request_header;
|
||||
static char request_data[5];
|
||||
|
||||
if (ntohs(rq->type) == NCP_REQUEST)
|
||||
{
|
||||
if (ntohs(rq->type) == NCP_REQUEST) {
|
||||
/* Request */
|
||||
printf("NCP request: conn: %-5d, seq: %-3d, task: %-3d, ",
|
||||
rq->conn_low + 256 * rq->conn_high,
|
||||
@@ -366,8 +334,7 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
data = buf + sizeof(struct ncp_request_header);
|
||||
data_length = length - sizeof(struct ncp_request_header);
|
||||
|
||||
switch (rq->function)
|
||||
{
|
||||
switch (rq->function) {
|
||||
case 18:
|
||||
printf("fn: %-3d\n", rq->function);
|
||||
printf("Get Volume Info with Number\n");
|
||||
@@ -379,8 +346,7 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
case 21:
|
||||
printf("fn: %-3d, subfn: %-3d\n",
|
||||
rq->function, data[2]);
|
||||
switch (data[2])
|
||||
{
|
||||
switch (data[2]) {
|
||||
case 0:
|
||||
printf("Send Broadcast Message\n");
|
||||
break;
|
||||
@@ -394,8 +360,7 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
case 22:
|
||||
printf("fn: %-3d, subfn: %-3d\n",
|
||||
rq->function, data[2]);
|
||||
switch (data[2])
|
||||
{
|
||||
switch (data[2]) {
|
||||
case 00:
|
||||
printf("Set Directory Handle\n");
|
||||
break;
|
||||
@@ -439,8 +404,7 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
case 23:
|
||||
printf("fn: %-3d, subfn: %-3d\n", rq->function,
|
||||
data[2]);
|
||||
switch (data[2])
|
||||
{
|
||||
switch (data[2]) {
|
||||
case 17:
|
||||
printf("Get Fileserver Information\n");
|
||||
break;
|
||||
@@ -563,8 +527,7 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
case 87:
|
||||
printf("fn: %-3d, subfn: %-3d\n",
|
||||
rq->function, data[0]);
|
||||
switch (data[0])
|
||||
{
|
||||
switch (data[0]) {
|
||||
case 1:
|
||||
{
|
||||
unsigned char *p = &(data[0]);
|
||||
@@ -574,7 +537,7 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
printf("Search Attributes: %x\n",
|
||||
*(__u16 *) & (p[3]));
|
||||
printf("Return Information Mask: %x\n",
|
||||
(unsigned int) (*(__u32 *) & (p[5])));
|
||||
(unsigned int) (*(__u32 *) & (p[5])));
|
||||
printf("Desired Access Rights: %x\n",
|
||||
*(__u16 *) & (p[9]));
|
||||
break;
|
||||
@@ -601,12 +564,10 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
break;
|
||||
case 97:
|
||||
{
|
||||
struct INPUT
|
||||
{
|
||||
struct INPUT {
|
||||
__u16 proposed_max_size;
|
||||
__u8 security_flag;
|
||||
}
|
||||
*i = (struct INPUT *) data;
|
||||
} *i = (struct INPUT *) data;
|
||||
|
||||
printf("fn: %-3d\n", rq->function);
|
||||
printf("Get Big Packet NCP Max Packet Size\n");
|
||||
@@ -618,15 +579,13 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
}
|
||||
case 101:
|
||||
{
|
||||
struct INPUT
|
||||
{
|
||||
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;
|
||||
} *i = (struct INPUT *) data;
|
||||
|
||||
printf("fn: %-3d\n", rq->function);
|
||||
printf("Packet Burst Connection Request\n");
|
||||
@@ -658,23 +617,20 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
workstation, and tell me whether anything
|
||||
of this makes sense at all. */
|
||||
|
||||
switch (data[0])
|
||||
{
|
||||
switch (data[0]) {
|
||||
case 1:
|
||||
printf("Ping for NDS\n");
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
struct INPUT
|
||||
{
|
||||
struct INPUT {
|
||||
__u8 subfunction_code;
|
||||
__u32 fragger_handle;
|
||||
__u32 max_fragment_size;
|
||||
__u32 message_size;
|
||||
__u32 fragment_flag;
|
||||
__u32 verb;
|
||||
}
|
||||
*i = (struct INPUT *) data;
|
||||
} *i = (struct INPUT *) data;
|
||||
printf("Send NDS Fragment Request/Reply\n");
|
||||
printf("fragger_handle: %lx\n",
|
||||
(unsigned long) i->fragger_handle);
|
||||
@@ -686,8 +642,7 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
(unsigned long) i->fragment_flag);
|
||||
printf("verb: %d\n", i->verb);
|
||||
|
||||
switch (i->verb)
|
||||
{
|
||||
switch (i->verb) {
|
||||
case 1:
|
||||
printf("Resolve Name\n");
|
||||
break;
|
||||
@@ -944,8 +899,7 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
printf("fn: %-3d\n", rq->function);
|
||||
}
|
||||
}
|
||||
if (ntohs(rs->type) == NCP_REPLY)
|
||||
{
|
||||
if (ntohs(rs->type) == NCP_REPLY) {
|
||||
printf("NCP respons: conn: %-5d, seq: %-3d, task: %-3d, ",
|
||||
rs->conn_low + 256 * rs->conn_high,
|
||||
rs->sequence, rs->task);
|
||||
@@ -957,25 +911,20 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
|
||||
if ((memcmp(&request_source, target,
|
||||
sizeof(request_source)) == 0)
|
||||
&& (request_header.sequence == rs->sequence))
|
||||
{
|
||||
switch (request_header.function)
|
||||
{
|
||||
&& (request_header.sequence == rs->sequence)) {
|
||||
switch (request_header.function) {
|
||||
case 22:
|
||||
switch (request_data[2])
|
||||
{
|
||||
switch (request_data[2]) {
|
||||
case 18:
|
||||
{
|
||||
struct XDATA
|
||||
{
|
||||
struct XDATA {
|
||||
__u8 new_directory_handle;
|
||||
__u8 access_rights_mask;
|
||||
}
|
||||
*x = (struct XDATA *) data;
|
||||
} *x = (struct XDATA *) data;
|
||||
printf("new_directory_handle: %x\n",
|
||||
x->new_directory_handle);
|
||||
x->new_directory_handle);
|
||||
printf("access_rights_mask: %x\n",
|
||||
x->access_rights_mask);
|
||||
x->access_rights_mask);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -986,15 +935,13 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
break;
|
||||
case 97:
|
||||
{
|
||||
struct XDATA
|
||||
{
|
||||
struct XDATA {
|
||||
__u16 accepted_max_size;
|
||||
__u16 echo_socket;
|
||||
__u8 security_flag;
|
||||
}
|
||||
*x = (struct XDATA *) data;
|
||||
} *x = (struct XDATA *) data;
|
||||
printf("accepted_max_size: %x\n",
|
||||
ntohs(x->accepted_max_size));
|
||||
ntohs(x->accepted_max_size));
|
||||
printf("echo_socket: %x\n",
|
||||
ntohs(x->echo_socket));
|
||||
printf("security_flag: %x\n",
|
||||
@@ -1003,55 +950,44 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
break;
|
||||
case 101:
|
||||
{
|
||||
struct XDATA
|
||||
{
|
||||
struct XDATA {
|
||||
__u8 completion_code;
|
||||
__u32 remote_target_id;
|
||||
__u32 remote_max_packet_size;
|
||||
}
|
||||
*x = (struct XDATA *) data;
|
||||
} *x = (struct XDATA *) data;
|
||||
printf("completion_code: %x\n",
|
||||
x->completion_code);
|
||||
printf("remote_target_id: %lx\n",
|
||||
ntohl(x->remote_target_id));
|
||||
ntohl(x->remote_target_id));
|
||||
printf("remote_max_packet_size: %lx\n",
|
||||
ntohl(x->remote_max_packet_size));
|
||||
ntohl(x->remote_max_packet_size));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (data == NULL)
|
||||
{
|
||||
if (data == NULL) {
|
||||
data = buf;
|
||||
data_length = length;
|
||||
}
|
||||
i = 0;
|
||||
while (i < data_length)
|
||||
{
|
||||
while (i < data_length) {
|
||||
int j;
|
||||
for (j = i; j < i + 16; j++)
|
||||
{
|
||||
if (j >= data_length)
|
||||
{
|
||||
for (j = i; j < i + 16; j++) {
|
||||
if (j >= data_length) {
|
||||
printf(" ");
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
printf("%-2.2X", data[j]);
|
||||
}
|
||||
}
|
||||
printf(" ");
|
||||
for (j = i; j < i + 16; j++)
|
||||
{
|
||||
if (j >= data_length)
|
||||
{
|
||||
for (j = i; j < i + 16; j++) {
|
||||
if (j >= data_length) {
|
||||
break;
|
||||
}
|
||||
if (isprint(data[j]))
|
||||
{
|
||||
if (isprint(data[j])) {
|
||||
printf("%c", data[j]);
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
printf(".");
|
||||
}
|
||||
}
|
||||
@@ -1062,8 +998,7 @@ handle_ncp(struct sockaddr_ipx *source,
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
main(int argc, char *argv[])
|
||||
void main(int argc, char *argv[])
|
||||
{
|
||||
unsigned char buf[16384];
|
||||
unsigned char packet[8192];
|
||||
@@ -1071,16 +1006,13 @@ main(int argc, char *argv[])
|
||||
int len;
|
||||
int i = 1;
|
||||
|
||||
while (fgets(buf, sizeof(buf), stdin) != NULL)
|
||||
{
|
||||
if (strlen(buf) == sizeof(buf) - 1)
|
||||
{
|
||||
while (fgets(buf, sizeof(buf), stdin) != NULL) {
|
||||
if (strlen(buf) == sizeof(buf) - 1) {
|
||||
fprintf(stderr, "line too long\n");
|
||||
exit(1);
|
||||
}
|
||||
b = strchr(buf, ' ');
|
||||
if (b == NULL)
|
||||
{
|
||||
if (b == NULL) {
|
||||
fprintf(stderr, "illegal line format\n");
|
||||
exit(1);
|
||||
}
|
||||
@@ -1088,11 +1020,9 @@ main(int argc, char *argv[])
|
||||
b += 1;
|
||||
len = 0;
|
||||
|
||||
while ((b[0] != '\0') && (b[1] != '\0'))
|
||||
{
|
||||
while ((b[0] != '\0') && (b[1] != '\0')) {
|
||||
unsigned int value;
|
||||
if (sscanf(b, "%2x", &value) != 1)
|
||||
{
|
||||
if (sscanf(b, "%2x", &value) != 1) {
|
||||
fprintf(stderr, "illegal packet\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -27,8 +27,7 @@
|
||||
#include <netinet/in.h>
|
||||
#include "ipxutil.h"
|
||||
|
||||
void
|
||||
ipx_fprint_node(FILE * file, IPXNode node)
|
||||
void ipx_fprint_node(FILE * file, IPXNode node)
|
||||
{
|
||||
fprintf(file, "%02X%02X%02X%02X%02X%02X",
|
||||
(unsigned char) node[0],
|
||||
@@ -40,20 +39,17 @@ ipx_fprint_node(FILE * file, IPXNode node)
|
||||
);
|
||||
}
|
||||
|
||||
void
|
||||
ipx_fprint_network(FILE * file, IPXNet net)
|
||||
void ipx_fprint_network(FILE * file, IPXNet net)
|
||||
{
|
||||
fprintf(file, "%08lX", net);
|
||||
}
|
||||
|
||||
void
|
||||
ipx_fprint_port(FILE * file, IPXPort port)
|
||||
void ipx_fprint_port(FILE * file, IPXPort port)
|
||||
{
|
||||
fprintf(file, "%04X", port);
|
||||
}
|
||||
|
||||
void
|
||||
ipx_fprint_saddr(FILE * file, struct sockaddr_ipx *sipx)
|
||||
void ipx_fprint_saddr(FILE * file, struct sockaddr_ipx *sipx)
|
||||
{
|
||||
ipx_fprint_network(file, ntohl(sipx->sipx_network));
|
||||
fprintf(file, ":");
|
||||
@@ -62,66 +58,55 @@ ipx_fprint_saddr(FILE * file, struct sockaddr_ipx *sipx)
|
||||
ipx_fprint_port(file, ntohs(sipx->sipx_port));
|
||||
}
|
||||
|
||||
void
|
||||
ipx_print_node(IPXNode node)
|
||||
void ipx_print_node(IPXNode node)
|
||||
{
|
||||
ipx_fprint_node(stdout, node);
|
||||
}
|
||||
|
||||
void
|
||||
ipx_print_network(IPXNet net)
|
||||
void ipx_print_network(IPXNet net)
|
||||
{
|
||||
ipx_fprint_network(stdout, net);
|
||||
}
|
||||
|
||||
void
|
||||
ipx_print_port(IPXPort port)
|
||||
void ipx_print_port(IPXPort port)
|
||||
{
|
||||
ipx_fprint_port(stdout, port);
|
||||
}
|
||||
|
||||
void
|
||||
ipx_print_saddr(struct sockaddr_ipx *sipx)
|
||||
void ipx_print_saddr(struct sockaddr_ipx *sipx)
|
||||
{
|
||||
ipx_fprint_saddr(stdout, sipx);
|
||||
}
|
||||
|
||||
void
|
||||
ipx_assign_node(IPXNode dest, IPXNode src)
|
||||
void ipx_assign_node(IPXNode dest, IPXNode src)
|
||||
{
|
||||
memcpy(dest, src, sizeof(IPXNode));
|
||||
}
|
||||
|
||||
int
|
||||
ipx_node_equal(IPXNode n1, IPXNode n2)
|
||||
int ipx_node_equal(IPXNode n1, IPXNode n2)
|
||||
{
|
||||
return memcmp(n1, n2, sizeof(IPXNode)) == 0;
|
||||
}
|
||||
|
||||
int
|
||||
ipx_sscanf_node(char *buf, IPXNode node)
|
||||
int ipx_sscanf_node(char *buf, IPXNode node)
|
||||
{
|
||||
int i;
|
||||
int n[6];
|
||||
|
||||
if ((i = sscanf(buf, "%2x%2x%2x%2x%2x%2x",
|
||||
&(n[0]), &(n[1]), &(n[2]),
|
||||
&(n[3]), &(n[4]), &(n[5]))) != 6)
|
||||
{
|
||||
&(n[3]), &(n[4]), &(n[5]))) != 6) {
|
||||
return -1;
|
||||
}
|
||||
for (i = 0; i < 6; i++)
|
||||
{
|
||||
for (i = 0; i < 6; i++) {
|
||||
node[i] = n[i];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
ipx_sscanf_net(char *buf, IPXNet * target)
|
||||
int ipx_sscanf_net(char *buf, IPXNet * target)
|
||||
{
|
||||
if (sscanf(buf, "%8lX", target) == 1)
|
||||
{
|
||||
if (sscanf(buf, "%8lX", target) == 1) {
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#define __IPXUTIL_H__
|
||||
|
||||
#include <stdio.h>
|
||||
#include "kernel/ipx.h"
|
||||
#include <linux/ipx.h>
|
||||
|
||||
#define IPX_MAX_ERROR (255)
|
||||
#define IPX_THIS_NET (0)
|
||||
|
||||
25
lib/Makefile
25
lib/Makefile
@@ -19,15 +19,6 @@ endif
|
||||
|
||||
CFLAGS += $(PIC_FLAG)
|
||||
|
||||
ifdef NDS_SUPPORT
|
||||
CFLAGS += -DNDS_SUPPORT
|
||||
NDS_OBJ = ndslib.o mpilib.o ndscrypt.o
|
||||
endif
|
||||
ifdef SIGNATURES
|
||||
CFLAGS += -DSIGNATURES
|
||||
SIGN_OBJ = ncpsign.o
|
||||
endif
|
||||
|
||||
default:
|
||||
make -C ..
|
||||
|
||||
@@ -36,17 +27,8 @@ all: libcom_err.a ncplib_err.o $(NCP_LIB)
|
||||
install:
|
||||
$(INSTALL_LIB)
|
||||
|
||||
mpilib.o: mpilib.c
|
||||
$(CC) $(CFLAGS) -DPORTABLE -DSMITH -DUNIT32 -DMUNIT16 -c mpilib.c
|
||||
ndscrypt.o: ndscrypt.c
|
||||
$(CC) $(CFLAGS) -c ndscrypt.c
|
||||
ndslib.o: ndslib.c
|
||||
$(CC) $(CFLAGS) -DPORTABLE -DSMITH -DUNIT32 -DMUNIT16 -c ndslib.c
|
||||
|
||||
ncpsign.o: ncpsign.c
|
||||
$(CC) $(CFLAGS) -c ncpsign.c
|
||||
ncplib.o: ncplib.c ncplib_err.h
|
||||
$(CC) $(CFLAGS) -c ncplib.c
|
||||
$(CC) $(CFLAGS) -c ncplib.c
|
||||
|
||||
COM_ERR_CFILES = com_err/com_err.c com_err/error_message.c com_err/et_name.c \
|
||||
com_err/init_et.c
|
||||
@@ -56,9 +38,8 @@ COM_ERR_OFILES = com_err/com_err.o com_err/error_message.o com_err/et_name.o \
|
||||
libcom_err.a: $(COM_ERR_CFILES)
|
||||
make -C com_err
|
||||
|
||||
$(NCP_LIB): ncplib.o ncplib_err.o libcom_err.a $(SIGN_OBJ) $(NDS_OBJ)
|
||||
$(LIB_LINK_COMMAND) ncplib.o ncplib_err.o $(SIGN_OBJ) \
|
||||
$(COM_ERR_OFILES) $(NDS_OBJ)
|
||||
$(NCP_LIB): ncplib.o ncplib_err.o libcom_err.a
|
||||
$(LIB_LINK_COMMAND) ncplib.o ncplib_err.o $(COM_ERR_OFILES)
|
||||
ln -sf libncp.so.1.0 libncp.so.1
|
||||
ln -sf libncp.so.1 libncp.so
|
||||
export LD_LIBRARY_PATH=`pwd`:LD_LIBRARY_PATH
|
||||
|
||||
@@ -17,28 +17,25 @@
|
||||
|
||||
static void
|
||||
#ifdef __STDC__
|
||||
default_com_err_proc(const char *whoami, errcode_t code, const
|
||||
char *fmt, va_list args)
|
||||
default_com_err_proc(const char *whoami, errcode_t code, const
|
||||
char *fmt, va_list args)
|
||||
#else
|
||||
default_com_err_proc(whoami, code, fmt, args)
|
||||
default_com_err_proc(whoami, code, fmt, args)
|
||||
const char *whoami;
|
||||
errcode_t code;
|
||||
const char *fmt;
|
||||
va_list args;
|
||||
#endif
|
||||
{
|
||||
if (whoami)
|
||||
{
|
||||
if (whoami) {
|
||||
fputs(whoami, stderr);
|
||||
fputs(": ", stderr);
|
||||
}
|
||||
if (code)
|
||||
{
|
||||
if (code) {
|
||||
fputs(error_message(code), stderr);
|
||||
fputs(" ", stderr);
|
||||
}
|
||||
if (fmt)
|
||||
{
|
||||
if (fmt) {
|
||||
vfprintf(stderr, fmt, args);
|
||||
}
|
||||
/* should do this only on a tty in raw mode */
|
||||
@@ -56,12 +53,10 @@ typedef void (*errf) ();
|
||||
errf com_err_hook = default_com_err_proc;
|
||||
|
||||
#ifdef __STDC__
|
||||
void
|
||||
com_err_va(const char *whoami, errcode_t code, const char *fmt,
|
||||
va_list args)
|
||||
void com_err_va(const char *whoami, errcode_t code, const char *fmt,
|
||||
va_list args)
|
||||
#else
|
||||
void
|
||||
com_err_va(whoami, code, fmt, args)
|
||||
void com_err_va(whoami, code, fmt, args)
|
||||
const char *whoami;
|
||||
errcode_t code;
|
||||
const char *fmt;
|
||||
@@ -72,14 +67,12 @@ va_list args;
|
||||
}
|
||||
|
||||
#ifndef VARARGS
|
||||
void
|
||||
com_err(const char *whoami,
|
||||
errcode_t code,
|
||||
const char *fmt,...)
|
||||
void com_err(const char *whoami,
|
||||
errcode_t code,
|
||||
const char *fmt,...)
|
||||
{
|
||||
#else
|
||||
void
|
||||
com_err(va_alist)
|
||||
void com_err(va_alist)
|
||||
va_dcl
|
||||
{
|
||||
const char *whoami, *fmt;
|
||||
|
||||
@@ -24,10 +24,10 @@ struct et_list *_et_list = (struct et_list *) NULL;
|
||||
|
||||
#ifdef __STDC__
|
||||
const char *
|
||||
error_message(errcode_t code)
|
||||
error_message(errcode_t code)
|
||||
#else
|
||||
const char *
|
||||
error_message(code)
|
||||
error_message(code)
|
||||
errcode_t code;
|
||||
#endif
|
||||
{
|
||||
@@ -39,8 +39,7 @@ errcode_t code;
|
||||
|
||||
offset = code & ((1 << ERRCODE_RANGE) - 1);
|
||||
table_num = code - offset;
|
||||
if (!table_num)
|
||||
{
|
||||
if (!table_num) {
|
||||
#ifdef HAS_SYS_ERRLIST
|
||||
if (offset < sys_nerr)
|
||||
return (sys_errlist[offset]);
|
||||
@@ -54,10 +53,8 @@ errcode_t code;
|
||||
goto oops;
|
||||
#endif
|
||||
}
|
||||
for (et = _et_list; et; et = et->next)
|
||||
{
|
||||
if (et->table->base == table_num)
|
||||
{
|
||||
for (et = _et_list; et; et = et->next) {
|
||||
if (et->table->base == table_num) {
|
||||
/* This is the right table */
|
||||
if (et->table->n_msgs <= offset)
|
||||
goto oops;
|
||||
@@ -66,21 +63,17 @@ errcode_t code;
|
||||
}
|
||||
oops:
|
||||
strcpy(buffer, "Unknown code ");
|
||||
if (table_num)
|
||||
{
|
||||
if (table_num) {
|
||||
strcat(buffer, error_table_name(table_num));
|
||||
strcat(buffer, " ");
|
||||
}
|
||||
for (cp = buffer; *cp; cp++)
|
||||
;
|
||||
if (offset >= 100)
|
||||
{
|
||||
for (cp = buffer; *cp; cp++);
|
||||
if (offset >= 100) {
|
||||
*cp++ = '0' + offset / 100;
|
||||
offset %= 100;
|
||||
started++;
|
||||
}
|
||||
if (started || offset >= 10)
|
||||
{
|
||||
if (started || offset >= 10) {
|
||||
*cp++ = '0' + offset / 10;
|
||||
offset %= 10;
|
||||
}
|
||||
|
||||
@@ -11,14 +11,12 @@
|
||||
#define const
|
||||
#endif
|
||||
|
||||
struct error_table
|
||||
{
|
||||
struct error_table {
|
||||
char const *const *msgs;
|
||||
long base;
|
||||
int n_msgs;
|
||||
};
|
||||
struct et_list
|
||||
{
|
||||
struct et_list {
|
||||
struct et_list *next;
|
||||
const struct error_table *table;
|
||||
};
|
||||
|
||||
@@ -14,7 +14,7 @@ static const char char_set[] =
|
||||
static char buf[6];
|
||||
|
||||
const char *
|
||||
error_table_name(num)
|
||||
error_table_name(num)
|
||||
int num;
|
||||
{
|
||||
int ch;
|
||||
@@ -27,8 +27,7 @@ int num;
|
||||
/* num = ?? ??? ??? aaa aaa bbb bbb ccc ccc ddd ddd */
|
||||
num &= 077777777;
|
||||
/* num = 00 000 000 aaa aaa bbb bbb ccc ccc ddd ddd */
|
||||
for (i = 4; i >= 0; i--)
|
||||
{
|
||||
for (i = 4; i >= 0; i--) {
|
||||
ch = (num >> BITS_PER_CHAR * i) & ((1 << BITS_PER_CHAR) - 1);
|
||||
if (ch != 0)
|
||||
*p++ = char_set[ch - 1];
|
||||
|
||||
@@ -23,8 +23,7 @@
|
||||
#define const
|
||||
#endif
|
||||
|
||||
struct foobar
|
||||
{
|
||||
struct foobar {
|
||||
struct et_list etl;
|
||||
struct error_table et;
|
||||
};
|
||||
@@ -32,11 +31,9 @@ struct foobar
|
||||
extern struct et_list *_et_list;
|
||||
|
||||
#ifdef __STDC__
|
||||
int
|
||||
init_error_table(const char *const *msgs, int base, int count)
|
||||
int init_error_table(const char *const *msgs, int base, int count)
|
||||
#else
|
||||
int
|
||||
init_error_table(msgs, base, count)
|
||||
int init_error_table(msgs, base, count)
|
||||
const char *const *msgs;
|
||||
int base;
|
||||
int count;
|
||||
|
||||
1881
lib/mpilib.c
1881
lib/mpilib.c
File diff suppressed because it is too large
Load Diff
468
lib/mpilib.h
468
lib/mpilib.h
@@ -1,468 +0,0 @@
|
||||
/* C include file for MPI multiprecision integer math routines.
|
||||
|
||||
Boulder Software Engineering
|
||||
3021 Eleventh Street
|
||||
Boulder, CO 80304
|
||||
(303) 541-0140
|
||||
|
||||
(c) Copyright 1986-92 by Philip Zimmermann. All rights reserved.
|
||||
The author assumes no liability for damages resulting from the use
|
||||
of this software, even if the damage results from defects in this
|
||||
software. No warranty is expressed or implied.
|
||||
|
||||
These routines implement all of the multiprecision arithmetic necessary
|
||||
for Rivest-Shamir-Adleman (RSA) public key cryptography, as well as
|
||||
other number-theoretic algorithms such as ElGamal, Diffie-Hellman,
|
||||
or Rabin.
|
||||
|
||||
Although originally developed in Microsoft C for the IBM PC, this code
|
||||
contains few machine dependencies. It assumes 2's complement
|
||||
arithmetic. It can be adapted to 8-bit, 16-bit, or 32-bit machines,
|
||||
lowbyte-highbyte order or highbyte-lowbyte order. This version
|
||||
has been converted to ANSI C.
|
||||
|
||||
Modified 8 Apr 92 - HAJK - Implement new VAX/VMS primitive support.
|
||||
Modified 29 Nov 92 - Thad Smith
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include "usuals.h" /* typedefs for byte, word16, boolean, etc. */
|
||||
#include "platform.h" /* customization for different environments */
|
||||
|
||||
/* Platform customization:
|
||||
* A version which runs on almost any computer can be implemented by
|
||||
* defining PORTABLE and MPORTABLE, preferably as a command line
|
||||
* parameter. Faster versions can be generated by specifying specific
|
||||
* parameters, such as size of unit and MULTUNIT, and by supplying some
|
||||
* of the critical in assembly. See the file platform.h for more
|
||||
* details on customization.
|
||||
*
|
||||
* The symbol HIGHFIRST, designating that integers and longs are stored
|
||||
* with the most significant bit in the lowest address, should be defined
|
||||
* on the command line for compiling all files, since it is used by files
|
||||
* other than the mpilib routines.
|
||||
*/
|
||||
|
||||
#ifndef ALIGN
|
||||
#define ALIGN
|
||||
#endif
|
||||
|
||||
#ifndef PEASANT /* if not Russian peasant modulo multiply algorithm */
|
||||
#ifndef MERRITT /* if not Merritt's modmult */
|
||||
#ifndef UPTON /* if not Upton's modmult */
|
||||
#ifndef SMITH
|
||||
#define SMITH /* default: use Smith's modmult algorithm */
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef SMITH
|
||||
#define UPTON_OR_SMITH /* enable common code */
|
||||
#endif
|
||||
#ifdef UPTON
|
||||
#define UPTON_OR_SMITH /* enable common code */
|
||||
#endif
|
||||
|
||||
#ifndef UNIT32
|
||||
#ifndef UNIT8
|
||||
#define UNIT16 /* default--use 16-bit units */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*** CAUTION: If your machine has an unusual word size that is not a
|
||||
power of 2 (8, 16, 32, or 64) bits wide, then the macros here that
|
||||
use the symbol "LOG_UNITSIZE" must be changed.
|
||||
***/
|
||||
|
||||
#ifdef UNIT8
|
||||
typedef unsigned char unit;
|
||||
typedef signed char signedunit;
|
||||
#define UNITSIZE 8 /* number of bits in a unit */
|
||||
#define LOG_UNITSIZE 3
|
||||
#define uppermostbit ((unit) 0x80)
|
||||
#define BYTES_PER_UNIT 1 /* number of bytes in a unit */
|
||||
#define units2bits(n) ((n) << 3) /* fast multiply by UNITSIZE */
|
||||
#define units2bytes(n) (n)
|
||||
#define bits2units(n) (((n)+7) >> 3)
|
||||
#define bytes2units(n) (n)
|
||||
#endif
|
||||
|
||||
#ifdef UNIT16
|
||||
typedef word16 unit;
|
||||
typedef short signedunit;
|
||||
#define UNITSIZE 16 /* number of bits in a unit */
|
||||
#define LOG_UNITSIZE 4
|
||||
#define uppermostbit ((unit) 0x8000)
|
||||
#define BYTES_PER_UNIT 2 /* number of bytes in a unit */
|
||||
#define units2bits(n) ((n) << 4) /* fast multiply by UNITSIZE */
|
||||
#define units2bytes(n) ((n) << 1)
|
||||
#define bits2units(n) (((n)+15) >> 4)
|
||||
#define bytes2units(n) (((n)+1) >> 1)
|
||||
#endif
|
||||
|
||||
#ifdef UNIT32
|
||||
typedef word32 unit;
|
||||
typedef long signedunit;
|
||||
#define UNITSIZE 32 /* number of bits in a unit */
|
||||
#define LOG_UNITSIZE 5
|
||||
#define uppermostbit ((unit) 0x80000000L)
|
||||
#define BYTES_PER_UNIT 4 /* number of bytes in a unit */
|
||||
#define units2bits(n) ((n) << 5) /* fast multiply by UNITSIZE */
|
||||
#define units2bytes(n) ((n) << 2)
|
||||
#define bits2units(n) (((n)+31) >> 5)
|
||||
#define bytes2units(n) (((n)+3) >> 2)
|
||||
#endif
|
||||
|
||||
#define power_of_2(b) ((unit) 1 << (b)) /* computes power-of-2 bit masks */
|
||||
#define bits2bytes(n) (((n)+7) >> 3)
|
||||
/* Some C compilers (like the ADSP2101) will not always collapse constant
|
||||
expressions at compile time if the expressions contain shift operators. */
|
||||
/* #define uppermostbit power_of_2(UNITSIZE-1) */
|
||||
/* #define UNITSIZE units2bits(1) */ /* number of bits in a unit */
|
||||
/* #define bytes2units(n) bits2units((n)<<3) */
|
||||
/* #define BYTES_PER_UNIT (UNITSIZE >> 3) */
|
||||
/* LOG_UNITSIZE is the log base 2 of UNITSIZE, ie: 4 for 16-bit units */
|
||||
/* #define units2bits(n) ((n) << LOG_UNITSIZE) */ /* fast multiply by UNITSIZE */
|
||||
/* #define units2bytes(n) ((n) << (LOG_UNITSIZE-3)) */
|
||||
/* #define bits2units(n) (((n)+(UNITSIZE-1)) >> LOG_UNITSIZE) */
|
||||
/* #define bytes2units(n) (((n)+(BYTES_PER_UNIT-1)) >> (LOG_UNITSIZE-3)) */
|
||||
|
||||
typedef unit *unitptr;
|
||||
|
||||
|
||||
/*--------------------- Byte ordering stuff -------------------*/
|
||||
#ifdef HIGHFIRST
|
||||
|
||||
/* these definitions assume MSB comes first */
|
||||
#define tohigher(n) (-(n)) /* offset towards higher unit */
|
||||
#define pre_higherunit(r) (--(r))
|
||||
#define pre_lowerunit(r) (++(r))
|
||||
#define post_higherunit(r) ((r)--)
|
||||
#define post_lowerunit(r) ((r)++)
|
||||
#define bit_index(n) (global_precision-bits2units((n)+1))
|
||||
#define lsbptr(r,prec) ((r)+(prec)-1)
|
||||
#define make_lsbptr(r,prec) (r) = lsbptr(r,prec)
|
||||
#define unmake_lsbptr(r,prec) (r) = ((r)-(prec)+1)
|
||||
#define msbptr(r,prec) (r)
|
||||
#define make_msbptr(r,prec) /* (r) = msbptr(r,prec) */
|
||||
|
||||
/* The macro rescale(r,current_precision,new_precision) rescales
|
||||
a multiprecision integer by adjusting r and its precision to new values.
|
||||
It can be used to reverse the effects of the normalize
|
||||
routine given above. See the comments in normalize concerning
|
||||
Intel vs. Motorola LSB/MSB conventions.
|
||||
WARNING: You can only safely call rescale on registers that
|
||||
you have previously normalized with the above normalize routine,
|
||||
or are known to be big enough for the new precision. You may
|
||||
specify a new precision that is smaller than the current precision.
|
||||
You must be careful not to specify a new_precision value that is
|
||||
too big, or which adjusts the r pointer out of range.
|
||||
*/
|
||||
#define rescale(r,currentp,newp) r -= ((newp) - (currentp))
|
||||
|
||||
/* The macro normalize(r,precision) "normalizes" a multiprecision integer
|
||||
by adjusting r and precision to new values. For Motorola-style processors
|
||||
(MSB-first), r is a pointer to the MSB of the register, and must
|
||||
be adjusted to point to the first nonzero unit. For Intel/VAX-style
|
||||
(LSB-first) processors, r is a pointer to the LSB of the register,
|
||||
and must be left unchanged. The precision counter is always adjusted,
|
||||
regardless of processor type. In the case of precision = 0,
|
||||
r becomes undefined.
|
||||
*/
|
||||
#define normalize(r,prec) \
|
||||
{ prec = significance(r); r += (global_precision-(prec)); }
|
||||
|
||||
#else /* LOWFIRST byte order */
|
||||
|
||||
/* these definitions assume LSB comes first */
|
||||
#define tohigher(n) (n) /* offset towards higher unit */
|
||||
#define pre_higherunit(r) (++(r))
|
||||
#define pre_lowerunit(r) (--(r))
|
||||
#define post_higherunit(r) ((r)++)
|
||||
#define post_lowerunit(r) ((r)--)
|
||||
#define bit_index(n) (bits2units((n)+1)-1)
|
||||
#define lsbptr(r,prec) (r)
|
||||
#define make_lsbptr(r,prec) /* (r) = lsbptr(r,prec) */
|
||||
#define unmake_lsbptr(r,prec) /* (r) = (r) */
|
||||
#define msbptr(r,prec) ((r)+(prec)-1)
|
||||
#define make_msbptr(r,prec) (r) = msbptr(r,prec)
|
||||
|
||||
#define rescale(r,currentp,newp) /* nil statement */
|
||||
#define normalize(r,prec) prec = significance(r)
|
||||
|
||||
#endif /* LOWFIRST byte order */
|
||||
/*------------------ End byte ordering stuff -------------------*/
|
||||
|
||||
/* Note that the address calculations require that lsbptr, msbptr,
|
||||
make_lsbptr, make_msbptr, mp_tstbit, mp_setbit, mp_clrbit,
|
||||
and bitptr all have unitptr arguments, not byte pointer arguments. */
|
||||
#define bitptr(r,n) &((r)[bit_index(n)])
|
||||
#define bitmsk(n) power_of_2((n) & (UNITSIZE-1))
|
||||
/* bitmsk() assumes UNITSIZE is a power of 2 */
|
||||
#define mp_tstbit(r,n) (*bitptr(r,n) & bitmsk(n))
|
||||
#define mp_setbit(r,n) (*bitptr(r,n) |= bitmsk(n))
|
||||
#define mp_clrbit(r,n) (*bitptr(r,n) &= ~bitmsk(n))
|
||||
#define msunit(r) (*msbptr(r,global_precision))
|
||||
#define lsunit(r) (*lsbptr(r,global_precision))
|
||||
/* #define mp_tstminus(r) ((msunit(r) & uppermostbit)!=0) */
|
||||
#define mp_tstminus(r) ((signedunit) msunit(r) < 0)
|
||||
|
||||
|
||||
/* set working precision to specified number of bits. */
|
||||
#ifdef mp_setp
|
||||
void mp_setp(short nbits);
|
||||
#define set_precision(prec) mp_setp(units2bits(global_precision=(prec)))
|
||||
#else
|
||||
#define set_precision(prec) (global_precision = (prec))
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef PEASANT
|
||||
|
||||
/* Define C names for Russian peasant modmult primitives. */
|
||||
#define stage_modulus stage_peasant_modulus
|
||||
#define mp_modmult peasant_modmult
|
||||
#define modmult_burn peasant_burn
|
||||
#define SLOP_BITS PEASANT_SLOP_BITS
|
||||
|
||||
#else /* not PEASANT */
|
||||
#ifdef MERRITT
|
||||
/* Define C names for Merritt's modmult primitives. */
|
||||
#define stage_modulus stage_merritt_modulus
|
||||
#define mp_modmult merritt_modmult
|
||||
#define modmult_burn merritt_burn
|
||||
#define SLOP_BITS MERRITT_SLOP_BITS
|
||||
|
||||
#else /* not PEASANT, MERRITT */
|
||||
#ifdef UPTON
|
||||
/* Define C names for Upton's modmult primitives. */
|
||||
#define stage_modulus stage_upton_modulus
|
||||
#define mp_modmult upton_modmult
|
||||
#define modmult_burn upton_burn
|
||||
#define SLOP_BITS UPTON_SLOP_BITS
|
||||
|
||||
#else /* not PEASANT, MERRITT, UPTON */
|
||||
#ifdef SMITH
|
||||
/* Define C names for Smith's modmult primitives. */
|
||||
#define stage_modulus stage_smith_modulus
|
||||
#define mp_modmult smith_modmult
|
||||
#define modmult_burn smith_burn
|
||||
#define SLOP_BITS SMITH_SLOP_BITS
|
||||
|
||||
#endif /* SMITH */
|
||||
#endif /* UPTON */
|
||||
#endif /* MERRITT */
|
||||
#endif /* PEASANT */
|
||||
|
||||
|
||||
#define mp_shift_left(r1) mp_rotate_left(r1,(boolean)0)
|
||||
/* multiprecision shift left 1 bit */
|
||||
|
||||
#define mp_add(r1,r2) mp_addc(r1,r2,(boolean)0)
|
||||
/* multiprecision add with no carry */
|
||||
|
||||
#define mp_sub(r1,r2) mp_subb(r1,r2,(boolean)0)
|
||||
/* multiprecision subtract with no borrow */
|
||||
|
||||
#define mp_abs(r) (mp_tstminus(r) ? (mp_neg(r),TRUE) : FALSE)
|
||||
|
||||
#define msub(r,m) if (mp_compare(r,m) >= 0) mp_sub(r,m)
|
||||
/* Prevents r from getting bigger than modulus m */
|
||||
|
||||
#define testeq(r,i) \
|
||||
( (lsunit(r)==(i)) && (significance(r)<=1) )
|
||||
|
||||
#define testne(r,i) \
|
||||
( (lsunit(r)!=(i)) || (significance(r)>1) )
|
||||
|
||||
#define testge(r,i) \
|
||||
( (lsunit(r)>=(i)) || (significance(r)>1) )
|
||||
|
||||
#define testle(r,i) \
|
||||
( (lsunit(r)<=(i)) && (significance(r)<=1) )
|
||||
|
||||
#define mp_square(r1,r2) mp_mult(r1,r2,r2)
|
||||
/* Square r2, returning product in r1 */
|
||||
|
||||
#define mp_modsquare(r1,r2) mp_modmult(r1,r2,r2)
|
||||
/* Square r2, returning modulo'ed product in r1 */
|
||||
|
||||
#define countbytes(r) ((countbits(r)+7)>>3)
|
||||
|
||||
/* SLOP_BITS is how many "carry bits" to allow for intermediate
|
||||
calculation results to exceed the size of the modulus.
|
||||
It is used by modexp to give some overflow elbow room for
|
||||
modmult to use to perform modulo operations with the modulus.
|
||||
The number of slop bits required is determined by the modmult
|
||||
algorithm. The Russian peasant modmult algorithm only requires
|
||||
1 slop bit, for example. Note that if we use an external assembly
|
||||
modmult routine, SLOP_BITS may be meaningless or may be defined in a
|
||||
non-constant manner.
|
||||
*/
|
||||
#define PEASANT_SLOP_BITS 1
|
||||
#define MERRITT_SLOP_BITS UNITSIZE
|
||||
#define UPTON_SLOP_BITS (UNITSIZE/2)
|
||||
#ifdef mp_smul /* old version requires MS word = 0 */
|
||||
#define SMITH_SLOP_BITS UNITSIZE
|
||||
#else /* mp_smula or C version of mp_smul */
|
||||
#define SMITH_SLOP_BITS 0
|
||||
#endif /* mp_smul */
|
||||
|
||||
/* MAX_BIT_PRECISION is upper limit that assembly primitives can handle.
|
||||
It must be less than 32704 bits, or 4088 bytes. It should be an
|
||||
integer multiple of UNITSIZE*2.
|
||||
*/
|
||||
#if (SLOP_BITS > 0)
|
||||
#define MAX_BIT_PRECISION (1280+(2*UNITSIZE))
|
||||
#else
|
||||
#define MAX_BIT_PRECISION 1280
|
||||
#endif
|
||||
#define MAX_BYTE_PRECISION (MAX_BIT_PRECISION/8)
|
||||
#define MAX_UNIT_PRECISION (MAX_BIT_PRECISION/UNITSIZE)
|
||||
|
||||
|
||||
/* global_precision is the unit precision last set by set_precision */
|
||||
extern short global_precision;
|
||||
|
||||
|
||||
/* The "bit sniffer" macros all begin sniffing at the MSB.
|
||||
They are used internally by all the various multiply, divide,
|
||||
modulo, exponentiation, and square root functions.
|
||||
*/
|
||||
#define sniff_bit(bptr,bitmask) (*(bptr) & bitmask)
|
||||
|
||||
#define init_bitsniffer(bptr,bitmask,prec,bits) \
|
||||
{ normalize(bptr,prec); \
|
||||
if (!prec) \
|
||||
return(0); \
|
||||
bits = units2bits(prec); \
|
||||
make_msbptr(bptr,prec); bitmask = uppermostbit; \
|
||||
while (!sniff_bit(bptr,bitmask)) \
|
||||
{ bitmask >>= 1; bits--; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define bump_bitsniffer(bptr,bitmask) \
|
||||
{ if (!(bitmask >>= 1)) \
|
||||
{ bitmask = uppermostbit; \
|
||||
post_lowerunit(bptr); \
|
||||
} \
|
||||
}
|
||||
|
||||
/* bump_2bitsniffers is used internally by mp_udiv. */
|
||||
#define bump_2bitsniffers(bptr,bptr2,bitmask) \
|
||||
{ if (!(bitmask >>= 1)) \
|
||||
{ bitmask = uppermostbit; \
|
||||
post_lowerunit(bptr); \
|
||||
post_lowerunit(bptr2); \
|
||||
} \
|
||||
}
|
||||
|
||||
/* stuff_bit is used internally by mp_udiv and mp_sqrt. */
|
||||
#define stuff_bit(bptr,bitmask) *(bptr) |= bitmask
|
||||
|
||||
|
||||
boolean mp_addc
|
||||
(register unitptr r1,register unitptr r2,register boolean carry);
|
||||
/* multiprecision add with carry r2 to r1, result in r1 */
|
||||
|
||||
boolean mp_subb
|
||||
(register unitptr r1,register unitptr r2,register boolean borrow);
|
||||
/* multiprecision subtract with borrow, r2 from r1, result in r1 */
|
||||
|
||||
boolean mp_rotate_left(register unitptr r1,register boolean carry);
|
||||
/* multiprecision rotate left 1 bit with carry, result in r1. */
|
||||
|
||||
void mp_shift_right_bits(register unitptr r1,register short bits);
|
||||
/* multiprecision shift right bits, result in r1. */
|
||||
|
||||
short mp_compare(register unitptr r1,register unitptr r2);
|
||||
/* Compares registers *r1, *r2, and returns -1, 0, or 1 */
|
||||
|
||||
boolean mp_inc(register unitptr r);
|
||||
/* Increment multiprecision integer r. */
|
||||
|
||||
boolean mp_dec(register unitptr r);
|
||||
/* Decrement multiprecision integer r. */
|
||||
|
||||
void mp_neg(register unitptr r);
|
||||
/* Compute 2's complement, the arithmetic negative, of r */
|
||||
|
||||
#ifndef mp_move
|
||||
#define mp_move(d,s) memcpy((void*)(d), (void*)(s), \
|
||||
units2bytes(global_precision))
|
||||
#endif
|
||||
#ifndef unitfill0
|
||||
#define unitfill0(r,ct) memset((void*)(r), 0, units2bytes(ct))
|
||||
#endif
|
||||
|
||||
#ifndef mp_burn
|
||||
#define mp_burn(r) mp_init(r,0) /* for burning the evidence */
|
||||
#define mp_init0(r) mp_init(r,0)
|
||||
#endif
|
||||
|
||||
#define empty_array(r) unitfill0(r, sizeof(r)/sizeof(r[0])/sizeof(unit))
|
||||
|
||||
void mp_init(register unitptr r, word16 value);
|
||||
/* Init multiprecision register r with short value. */
|
||||
|
||||
short significance(register unitptr r);
|
||||
/* Returns number of significant units in r */
|
||||
|
||||
int mp_udiv(register unitptr remainder,register unitptr quotient,
|
||||
register unitptr dividend,register unitptr divisor);
|
||||
/* Unsigned divide, treats both operands as positive. */
|
||||
|
||||
int mp_recip(register unitptr quotient,register unitptr divisor);
|
||||
/* Compute reciprocal as 1/divisor. Used by faster modmult. */
|
||||
|
||||
int mp_div(register unitptr remainder,register unitptr quotient,
|
||||
register unitptr dividend,register unitptr divisor);
|
||||
/* Signed divide, either or both operands may be negative. */
|
||||
|
||||
word16 mp_shortdiv(register unitptr quotient,
|
||||
register unitptr dividend,register word16 divisor);
|
||||
/* Returns short remainder of unsigned divide. */
|
||||
|
||||
int mp_mod(register unitptr remainder,
|
||||
register unitptr dividend,register unitptr divisor);
|
||||
/* Unsigned divide, treats both operands as positive. */
|
||||
|
||||
word16 mp_shortmod(register unitptr dividend,register word16 divisor);
|
||||
/* Just returns short remainder of unsigned divide. */
|
||||
|
||||
int mp_mult(register unitptr prod,
|
||||
register unitptr multiplicand,register unitptr multiplier);
|
||||
/* Computes multiprecision prod = multiplicand * multiplier */
|
||||
|
||||
int countbits(unitptr r);
|
||||
/* Returns number of significant bits in r. */
|
||||
|
||||
int stage_peasant_modulus(unitptr n);
|
||||
int stage_merritt_modulus(unitptr n);
|
||||
int stage_upton_modulus(unitptr n);
|
||||
int stage_smith_modulus(unitptr n);
|
||||
/* Must pass modulus to stage_modulus before calling modmult. */
|
||||
|
||||
int peasant_modmult(register unitptr prod,
|
||||
unitptr multiplicand,register unitptr multiplier);
|
||||
int merritt_modmult(register unitptr prod,
|
||||
unitptr multiplicand,register unitptr multiplier);
|
||||
int upton_modmult(register unitptr prod,
|
||||
unitptr multiplicand,register unitptr multiplier);
|
||||
int smith_modmult(register unitptr prod,
|
||||
unitptr multiplicand,register unitptr multiplier);
|
||||
/* Performs combined multiply/modulo operation, with global modulus */
|
||||
|
||||
|
||||
|
||||
int mp_modexp(register unitptr expout,register unitptr expin,
|
||||
register unitptr exponent,register unitptr modulus);
|
||||
/* Combined exponentiation/modulo algorithm. */
|
||||
|
||||
int mp_modexp_crt(unitptr expout, unitptr expin,
|
||||
unitptr p, unitptr q, unitptr ep, unitptr eq, unitptr u);
|
||||
/* exponentiation and modulo using Chinese Remainder Theorem */
|
||||
|
||||
/****************** end of MPI library ****************************/
|
||||
1869
lib/ncplib.c
1869
lib/ncplib.c
File diff suppressed because it is too large
Load Diff
@@ -42,16 +42,4 @@ ec NCPL_ET_NO_IPX,
|
||||
ec NCPL_ET_NO_NCPFS_FILE,
|
||||
"The file is probably not on a ncpfs mounted directory"
|
||||
|
||||
ec NCPL_ET_REPLY_FORMAT,
|
||||
"The reply packet is not in the expected format"
|
||||
|
||||
ec NCPL_ET_REPLY_TOO_LARGE,
|
||||
"The reply packet/message is too large for the allocated buffer"
|
||||
|
||||
ec NCPL_ET_SIGNATURE_FAILED,
|
||||
"Packet signature initializing failed"
|
||||
|
||||
ec NCPL_ET_TRANSPORT_UNKNOWN,
|
||||
"Unknown transport type"
|
||||
|
||||
end
|
||||
end
|
||||
103
lib/ncpsign.c
103
lib/ncpsign.c
@@ -1,103 +0,0 @@
|
||||
#ifdef SIGNATURES
|
||||
/*
|
||||
* ncpsign.c
|
||||
*
|
||||
* Arne de Bruijn (arne@knoware.nl), 1997
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include "ncplib.h"
|
||||
#include "ncpsign.h"
|
||||
|
||||
#define rol32(i,c) (((((i)&0xffffffff)<<c)&0xffffffff)| \
|
||||
(((i)&0xffffffff)>>(32-c)))
|
||||
/* i386: 32-bit, little endian, handles mis-alignment */
|
||||
#ifdef __i386__
|
||||
#define GET_LE32(p) (*(int *)(p))
|
||||
#define PUT_LE32(p,v) { *(int *)(p)=v; }
|
||||
#else
|
||||
#define GET_LE32(p) DVAL_LH(p,0)
|
||||
#define PUT_LE32(p,v) DSET_LH(p,0,v)
|
||||
#endif
|
||||
|
||||
#define min(a,b) ((a)<(b)?(a):(b))
|
||||
|
||||
static void nwsign(char *r_data1, char *r_data2, char *outdata) {
|
||||
int i;
|
||||
unsigned int w0,w1,w2,w3;
|
||||
static int rbit[4]={0, 2, 1, 3};
|
||||
#ifdef __i386__
|
||||
unsigned int *data2=(int *)r_data2;
|
||||
#else
|
||||
unsigned int data2[16];
|
||||
for (i=0;i<16;i++)
|
||||
data2[i]=GET_LE32(r_data2+(i<<2));
|
||||
#endif
|
||||
w0=GET_LE32(r_data1);
|
||||
w1=GET_LE32(r_data1+4);
|
||||
w2=GET_LE32(r_data1+8);
|
||||
w3=GET_LE32(r_data1+12);
|
||||
for (i=0;i<16;i+=4) {
|
||||
w0=rol32(w0 + ((w1 & w2) | ((~w1) & w3)) + data2[i+0],3);
|
||||
w3=rol32(w3 + ((w0 & w1) | ((~w0) & w2)) + data2[i+1],7);
|
||||
w2=rol32(w2 + ((w3 & w0) | ((~w3) & w1)) + data2[i+2],11);
|
||||
w1=rol32(w1 + ((w2 & w3) | ((~w2) & w0)) + data2[i+3],19);
|
||||
}
|
||||
for (i=0;i<4;i++) {
|
||||
w0=rol32(w0 + (((w2 | w3) & w1) | (w2 & w3)) + 0x5a827999 + data2[i+0],3);
|
||||
w3=rol32(w3 + (((w1 | w2) & w0) | (w1 & w2)) + 0x5a827999 + data2[i+4],5);
|
||||
w2=rol32(w2 + (((w0 | w1) & w3) | (w0 & w1)) + 0x5a827999 + data2[i+8],9);
|
||||
w1=rol32(w1 + (((w3 | w0) & w2) | (w3 & w0)) + 0x5a827999 + data2[i+12],13);
|
||||
}
|
||||
for (i=0;i<4;i++) {
|
||||
w0=rol32(w0 + ((w1 ^ w2) ^ w3) + 0x6ed9eba1 + data2[rbit[i]+0],3);
|
||||
w3=rol32(w3 + ((w0 ^ w1) ^ w2) + 0x6ed9eba1 + data2[rbit[i]+8],9);
|
||||
w2=rol32(w2 + ((w3 ^ w0) ^ w1) + 0x6ed9eba1 + data2[rbit[i]+4],11);
|
||||
w1=rol32(w1 + ((w2 ^ w3) ^ w0) + 0x6ed9eba1 + data2[rbit[i]+12],15);
|
||||
}
|
||||
PUT_LE32(outdata,(w0+GET_LE32(r_data1)) & 0xffffffff);
|
||||
PUT_LE32(outdata+4,(w1+GET_LE32(r_data1+4)) & 0xffffffff);
|
||||
PUT_LE32(outdata+8,(w2+GET_LE32(r_data1+8)) & 0xffffffff);
|
||||
PUT_LE32(outdata+12,(w3+GET_LE32(r_data1+12)) & 0xffffffff);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize packet signatures
|
||||
* The first 16 bytes of logindata are the shuffled password,
|
||||
* the last 8 bytes the encryption key as received from the server.
|
||||
*/
|
||||
void sign_init(const char *logindata, char *sign_root) {
|
||||
char initlast[16]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,
|
||||
0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10};
|
||||
char *initdata="Authorized NetWare Client";
|
||||
char msg[64];
|
||||
char hash[16];
|
||||
|
||||
memset(msg, 0, 64);
|
||||
memcpy(msg, logindata, 24);
|
||||
memcpy(msg + 24, initdata, 25);
|
||||
nwsign(initlast, msg, hash);
|
||||
|
||||
memcpy(sign_root, hash, 8);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make a signature for the current packet and add it at the end of the
|
||||
* packet.
|
||||
*/
|
||||
void sign_packet(struct ncp_conn *conn, int *size) {
|
||||
char data[64];
|
||||
|
||||
memset(data,0,64);
|
||||
memcpy(data,conn->sign_root,8);
|
||||
PUT_LE32(data+8,(*size));
|
||||
memcpy(data+12,conn->packet+sizeof(struct ncp_request_header)-1,
|
||||
min((*size)-sizeof(struct ncp_request_header)+1,52));
|
||||
|
||||
nwsign(conn->sign_last,data,conn->sign_last);
|
||||
|
||||
memcpy(conn->packet+(*size),conn->sign_last,8);
|
||||
(*size)+=8;
|
||||
}
|
||||
#endif
|
||||
295
lib/ndscrypt.c
295
lib/ndscrypt.c
@@ -1,295 +0,0 @@
|
||||
/*
|
||||
NDS client for ncpfs
|
||||
Copyright (C) 1997 Arne de Bruijn
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include "ndscrypt.h"
|
||||
|
||||
static unsigned int rol16(unsigned int i, int c) {
|
||||
return ((i << c) & 65535) | ((unsigned int)(i & 65535) >> (16 - c));
|
||||
}
|
||||
static unsigned int ror16(unsigned int i, int c) {
|
||||
return ((unsigned int)(i & 65535) >> c) | ((i << (16 - c)) & 65535);
|
||||
}
|
||||
|
||||
char nwcryptdata[256]={
|
||||
0xD9,0x78,0xF9,0xC4,0x19,0xDD,0xB5,0xED,0x28,0xE9,0xFD,0x79,
|
||||
0x4A,0xA0,0xD8,0x9D,0xC6,0x7E,0x37,0x83,0x2B,0x76,0x53,0x8E,
|
||||
0x62,0x4C,0x64,0x88,0x44,0x8B,0xFB,0xA2,0x17,0x9A,0x59,0xF5,
|
||||
0x87,0xB3,0x4F,0x13,0x61,0x45,0x6D,0x8D,0x09,0x81,0x7D,0x32,
|
||||
0xBD,0x8F,0x40,0xEB,0x86,0xB7,0x7B,0x0B,0xF0,0x95,0x21,0x22,
|
||||
0x5C,0x6B,0x4E,0x82,0x54,0xD6,0x65,0x93,0xCE,0x60,0xB2,0x1C,
|
||||
0x73,0x56,0xC0,0x14,0xA7,0x8C,0xF1,0xDC,0x12,0x75,0xCA,0x1F,
|
||||
0x3B,0xBE,0xE4,0xD1,0x42,0x3D,0xD4,0x30,0xA3,0x3C,0xB6,0x26,
|
||||
0x6F,0xBF,0x0E,0xDA,0x46,0x69,0x07,0x57,0x27,0xF2,0x1D,0x9B,
|
||||
0xBC,0x94,0x43,0x03,0xF8,0x11,0xC7,0xF6,0x90,0xEF,0x3E,0xE7,
|
||||
0x06,0xC3,0xD5,0x2F,0xC8,0x66,0x1E,0xD7,0x08,0xE8,0xEA,0xDE,
|
||||
0x80,0x52,0xEE,0xF7,0x84,0xAA,0x72,0xAC,0x35,0x4D,0x6A,0x2A,
|
||||
0x96,0x1A,0xD2,0x71,0x5A,0x15,0x49,0x74,0x4B,0x9F,0xD0,0x5E,
|
||||
0x04,0x18,0xA4,0xEC,0xC2,0xE0,0x41,0x6E,0x0F,0x51,0xCB,0xCC,
|
||||
0x24,0x91,0xAF,0x50,0xA1,0xF4,0x70,0x39,0x99,0x7C,0x3A,0x85,
|
||||
0x23,0xB8,0xB4,0x7A,0xFC,0x02,0x36,0x5B,0x25,0x55,0x97,0x31,
|
||||
0x2D,0x5D,0xFA,0x98,0xE3,0x8A,0x92,0xAE,0x05,0xDF,0x29,0x10,
|
||||
0x67,0x6C,0xBA,0xC9,0xD3,0x00,0xE6,0xCF,0xE1,0x9E,0xA8,0x2C,
|
||||
0x63,0x16,0x01,0x3F,0x58,0xE2,0x89,0xA9,0x0D,0x38,0x34,0x1B,
|
||||
0xAB,0x33,0xFF,0xB0,0xBB,0x48,0x0C,0x5F,0xB9,0xB1,0xCD,0x2E,
|
||||
0xC5,0xF3,0xDB,0x47,0xE5,0xA5,0x9C,0x77,0x0A,0xA6,0x20,0x68,
|
||||
0xFE,0x7F,0xC1,0xAD};
|
||||
|
||||
#if 0
|
||||
char shuffle_table[32]=
|
||||
{0x48,0x93,0x46,0x67,0x98,0x3D,0xE6,0x8D,
|
||||
0xB7,0x10,0x7A,0x26,0x5A,0xB9,0xB1,0x35,
|
||||
0x6B,0x0F,0xD5,0x70,0xAE,0xFB,0xAD,0x11,
|
||||
0xF4,0x47,0xDC,0xA7,0xEC,0xCF,0x50,0xC0};
|
||||
|
||||
char shuffle_table2[256] =
|
||||
{0x7,0x8,0x0,0x8,0x6,0x4,0xE,0x4,0x5,0xC,0x1,0x7,0xB,0xF,0xA,0x8,
|
||||
0xF,0x8,0xC,0xC,0x9,0x4,0x1,0xE,0x4,0x6,0x2,0x4,0x0,0xA,0xB,0x9,
|
||||
0x2,0xF,0xB,0x1,0xD,0x2,0x1,0x9,0x5,0xE,0x7,0x0,0x0,0x2,0x6,0x6,
|
||||
0x0,0x7,0x3,0x8,0x2,0x9,0x3,0xF,0x7,0xF,0xC,0xF,0x6,0x4,0xA,0x0,
|
||||
0x2,0x3,0xA,0xB,0xD,0x8,0x3,0xA,0x1,0x7,0xC,0xF,0x1,0x8,0x9,0xD,
|
||||
0x9,0x1,0x9,0x4,0xE,0x4,0xC,0x5,0x5,0xC,0x8,0xB,0x2,0x3,0x9,0xE,
|
||||
0x7,0x7,0x6,0x9,0xE,0xF,0xC,0x8,0xD,0x1,0xA,0x6,0xE,0xD,0x0,0x7,
|
||||
0x7,0xA,0x0,0x1,0xF,0x5,0x4,0xB,0x7,0xB,0xE,0xC,0x9,0x5,0xD,0x1,
|
||||
0xB,0xD,0x1,0x3,0x5,0xD,0xE,0x6,0x3,0x0,0xB,0xB,0xF,0x3,0x6,0x4,
|
||||
0x9,0xD,0xA,0x3,0x1,0x4,0x9,0x4,0x8,0x3,0xB,0xE,0x5,0x0,0x5,0x2,
|
||||
0xC,0xB,0xD,0x5,0xD,0x5,0xD,0x2,0xD,0x9,0xA,0xC,0xA,0x0,0xB,0x3,
|
||||
0x5,0x3,0x6,0x9,0x5,0x1,0xE,0xE,0x0,0xE,0x8,0x2,0xD,0x2,0x2,0x0,
|
||||
0x4,0xF,0x8,0x5,0x9,0x6,0x8,0x6,0xB,0xA,0xB,0xF,0x0,0x7,0x2,0x8,
|
||||
0xC,0x7,0x3,0xA,0x1,0x4,0x2,0x5,0xF,0x7,0xA,0xC,0xE,0x5,0x9,0x3,
|
||||
0xE,0x7,0x1,0x2,0xE,0x1,0xF,0x4,0xA,0x6,0xC,0x6,0xF,0x4,0x3,0x0,
|
||||
0xC,0x0,0x3,0x6,0xF,0x8,0x7,0xB,0x2,0xD,0xC,0x6,0xA,0xA,0x8,0xD};
|
||||
#endif
|
||||
|
||||
char nwhashdata[256] =
|
||||
{0xBD,0x56,0xEA,0xF2,0xA2,0xF1,0xAC,0x2A,0xB0,0x93,0xD1,0x9C,
|
||||
0x1B,0x33,0xFD,0xD0,0x30,0x04,0xB6,0xDC,0x7D,0xDF,0x32,0x4B,
|
||||
0xF7,0xCB,0x45,0x9B,0x31,0xBB,0x21,0x5A,0x41,0x9F,0xE1,0xD9,
|
||||
0x4A,0x4D,0x9E,0xDA,0xA0,0x68,0x2C,0xC3,0x27,0x5F,0x80,0x36,
|
||||
0x3E,0xEE,0xFB,0x95,0x1A,0xFE,0xCE,0xA8,0x34,0xA9,0x13,0xF0,
|
||||
0xA6,0x3F,0xD8,0x0C,0x78,0x24,0xAF,0x23,0x52,0xC1,0x67,0x17,
|
||||
0xF5,0x66,0x90,0xE7,0xE8,0x07,0xB8,0x60,0x48,0xE6,0x1E,0x53,
|
||||
0xF3,0x92,0xA4,0x72,0x8C,0x08,0x15,0x6E,0x86,0x00,0x84,0xFA,
|
||||
0xF4,0x7F,0x8A,0x42,0x19,0xF6,0xDB,0xCD,0x14,0x8D,0x50,0x12,
|
||||
0xBA,0x3C,0x06,0x4E,0xEC,0xB3,0x35,0x11,0xA1,0x88,0x8E,0x2B,
|
||||
0x94,0x99,0xB7,0x71,0x74,0xD3,0xE4,0xBF,0x3A,0xDE,0x96,0x0E,
|
||||
0xBC,0x0A,0xED,0x77,0xFC,0x37,0x6B,0x03,0x79,0x89,0x62,0xC6,
|
||||
0xD7,0xC0,0xD2,0x7C,0x6A,0x8B,0x22,0xA3,0x5B,0x05,0x5D,0x02,
|
||||
0x75,0xD5,0x61,0xE3,0x18,0x8F,0x55,0x51,0xAD,0x1F,0x0B,0x5E,
|
||||
0x85,0xE5,0xC2,0x57,0x63,0xCA,0x3D,0x6C,0xB4,0xC5,0xCC,0x70,
|
||||
0xB2,0x91,0x59,0x0D,0x47,0x20,0xC8,0x4F,0x58,0xE0,0x01,0xE2,
|
||||
0x16,0x38,0xC4,0x6F,0x3B,0x0F,0x65,0x46,0xBE,0x7E,0x2D,0x7B,
|
||||
0x82,0xF9,0x40,0xB5,0x1D,0x73,0xF8,0xEB,0x26,0xC7,0x87,0x97,
|
||||
0x25,0x54,0xB1,0x28,0xAA,0x98,0x9D,0xA5,0x64,0x6D,0x7A,0xD4,
|
||||
0x10,0x81,0x44,0xEF,0x49,0xD6,0xAE,0x2E,0xDD,0x76,0x5C,0x2F,
|
||||
0xA7,0x1C,0xC9,0x09,0x69,0x9A,0x83,0xCF,0x29,0x39,0xB9,0xE9,
|
||||
0x4C,0xFF,0x43,0xAB};
|
||||
|
||||
|
||||
void nwencrypt(const unsigned short *cryptbuf, const char *in, char *out) {
|
||||
int i, j;
|
||||
register unsigned int i1, i2, i3, i4;
|
||||
unsigned short *p;
|
||||
|
||||
i1 = *((unsigned short *)in);
|
||||
i2 = *((unsigned short *)in + 1);
|
||||
i3 = *((unsigned short *)in + 2);
|
||||
i4 = *((unsigned short *)in + 3);
|
||||
p = (unsigned short *)cryptbuf;
|
||||
for (j = 3; j; j--) {
|
||||
for (i = (j == 2) ? 6 : 5; i; i--) {
|
||||
i1 = rol16(i1 + (*p++) + (i4 & i3) + (~i4 & i2), 1);
|
||||
i2 = rol16(i2 + (*p++) + (i1 & i4) + (~i1 & i3), 2);
|
||||
i3 = rol16(i3 + (*p++) + (i2 & i1) + (~i2 & i4), 3);
|
||||
i4 = rol16(i4 + (*p++) + (i3 & i2) + (~i3 & i1), 5);
|
||||
}
|
||||
if (j > 1) {
|
||||
i1 += cryptbuf[i4 & 63];
|
||||
i2 += cryptbuf[i1 & 63];
|
||||
i3 += cryptbuf[i2 & 63];
|
||||
i4 += cryptbuf[i3 & 63];
|
||||
}
|
||||
}
|
||||
*((unsigned short *)out) = i1;
|
||||
*((unsigned short *)out + 1) = i2;
|
||||
*((unsigned short *)out + 2) = i3;
|
||||
*((unsigned short *)out + 3) = i4;
|
||||
}
|
||||
|
||||
void nwdecrypt(const unsigned short *cryptbuf, const char *in, char *out) {
|
||||
int i, j;
|
||||
unsigned short *p;
|
||||
register unsigned int i1, i2, i3, i4;
|
||||
|
||||
i1 = *((unsigned short *)in);
|
||||
i2 = *((unsigned short *)in + 1);
|
||||
i3 = *((unsigned short *)in + 2);
|
||||
i4 = *((unsigned short *)in + 3);
|
||||
p = (unsigned short *)cryptbuf + 64;
|
||||
for (j = 3; j; j--) {
|
||||
for (i = (j == 2) ? 6 : 5; i; i--) {
|
||||
i4 = ror16(i4, 5) - (~i3 & i1) - (i3 & i2) - (*--p);
|
||||
i3 = ror16(i3, 3) - (~i2 & i4) - (i2 & i1) - (*--p);
|
||||
i2 = ror16(i2, 2) - (~i1 & i3) - (i1 & i4) - (*--p);
|
||||
i1 = ror16(i1, 1) - (~i4 & i2) - (i4 & i3) - (*--p);
|
||||
}
|
||||
if (j > 1) {
|
||||
i4 -= cryptbuf[i3 & 63];
|
||||
i3 -= cryptbuf[i2 & 63];
|
||||
i2 -= cryptbuf[i1 & 63];
|
||||
i1 -= cryptbuf[i4 & 63];
|
||||
}
|
||||
}
|
||||
*((unsigned short *)out) = i1;
|
||||
*((unsigned short *)out + 1) = i2;
|
||||
*((unsigned short *)out + 2) = i3;
|
||||
*((unsigned short *)out + 3) = i4;
|
||||
}
|
||||
|
||||
void nwcryptinit(unsigned short *scryptbuf, const char *key) {
|
||||
int i;
|
||||
unsigned char cryptbuf[128], *p;
|
||||
|
||||
memcpy(cryptbuf, key, 8);
|
||||
for (i = 0; i < 120; i++)
|
||||
cryptbuf[i + 8] =
|
||||
nwcryptdata[(unsigned char)(cryptbuf[i] + cryptbuf[i + 7]) & 255];
|
||||
cryptbuf[128 - 8] = nwcryptdata[(unsigned char)cryptbuf[128 - 8] & 255];
|
||||
for (i = 127 - 8; i >= 0; i--)
|
||||
cryptbuf[i] = nwcryptdata[(unsigned char)cryptbuf[i + 1] ^
|
||||
(unsigned char)cryptbuf[i + 8]];
|
||||
for (i = 0, p = cryptbuf; i < 64; i++, p += 2)
|
||||
scryptbuf[i] = (*p) | (*(p+1)) << 8;
|
||||
}
|
||||
|
||||
void nwencryptblock(const char *cryptkey, const char *buf, int buflen,
|
||||
char *outbuf) {
|
||||
int i;
|
||||
char nhash[8];
|
||||
unsigned short cryptbuf[64];
|
||||
|
||||
nwcryptinit(cryptbuf, cryptkey);
|
||||
memset(nhash, 0, 8);
|
||||
while (buflen >= 8) {
|
||||
for (i = 0; i < 8; i++, buf++)
|
||||
nhash[i] ^= *buf;
|
||||
nwencrypt(cryptbuf, nhash, nhash);
|
||||
memcpy(outbuf, nhash, 8);
|
||||
outbuf += 8;
|
||||
buflen -= 8;
|
||||
}
|
||||
memset(cryptbuf, 0, sizeof(cryptbuf));
|
||||
}
|
||||
|
||||
void nwdecryptblock(const char *cryptkey, const char *buf, int buflen,
|
||||
char *outbuf) {
|
||||
int i;
|
||||
char nhash[16], *p;
|
||||
unsigned short cryptbuf[64];
|
||||
|
||||
nwcryptinit(cryptbuf, cryptkey);
|
||||
memset(nhash, 0, 16);
|
||||
p = nhash;
|
||||
while (buflen >= 8) {
|
||||
memcpy(p, buf, 8);
|
||||
p = nhash + 8 - (p - nhash);
|
||||
nwdecrypt(cryptbuf, buf, outbuf);
|
||||
for (i = 0; i < 8; i++, outbuf++)
|
||||
*outbuf ^= p[i];
|
||||
buf += 8;
|
||||
buflen -= 8;
|
||||
}
|
||||
memset(cryptbuf, 0, sizeof(cryptbuf));
|
||||
}
|
||||
|
||||
void nwhash1(char *hash, int hashlen, const char *data, int datalen) {
|
||||
unsigned char *hp, *hp1, *dp, *hend, c;
|
||||
|
||||
hp1 = (hp = (unsigned char *)hash) + 1;
|
||||
hend = hp + hashlen;
|
||||
dp = (unsigned char *)data;
|
||||
while (datalen--) {
|
||||
*hp = nwhashdata[*hp1 ^ *hp] ^ *dp++;
|
||||
hp = hp1++;
|
||||
if (hp1 == hend)
|
||||
hp1 = (unsigned char *)hash;
|
||||
}
|
||||
while (hp-- > (unsigned char *)hash) {
|
||||
hp1 = (unsigned char *)hash;
|
||||
c = *hp1++;
|
||||
while (*(hp1 - 1) = *hp1, ++hp1 < (unsigned char *)hash + hashlen);
|
||||
*(hp1 - 1) = c;
|
||||
}
|
||||
}
|
||||
|
||||
void nwhash2(char *hashbuf, char c) {
|
||||
int i, j;
|
||||
char *p = hashbuf + hashbuf[0x40];
|
||||
|
||||
p[0x20] = p[0x00] ^ (p[0x10] = c);
|
||||
hashbuf[0x41] = (p[0x30] ^= nwhashdata[(unsigned char)(c ^ hashbuf[0x41])]);
|
||||
if (!(hashbuf[0x40] = (hashbuf[0x40] + 1) & 15)) {
|
||||
c = 0;
|
||||
for (i = 18; i; i--)
|
||||
for (j = 48, p = hashbuf; j; j--)
|
||||
c = (*(p++) ^= nwhashdata[((unsigned char)c + j) & 255]);
|
||||
}
|
||||
}
|
||||
|
||||
void nwhash2block(char *hashbuf, const char *data, int datalen) {
|
||||
while (datalen--)
|
||||
nwhash2(hashbuf, *data++);
|
||||
}
|
||||
|
||||
void nwhash2end(char *hashbuf) {
|
||||
int i, j;
|
||||
|
||||
for(j = i = 16 - hashbuf[0x40]; j; j--)
|
||||
nwhash2(hashbuf, i);
|
||||
for(i = 0x30; i < 0x40; i++)
|
||||
nwhash2(hashbuf, hashbuf[i]);
|
||||
}
|
||||
|
||||
#if 0
|
||||
void shuffle(const char *objid, const char *pwd, char *out) {
|
||||
unsigned char temp[32];
|
||||
int i, j, k;
|
||||
i = strlen(pwd);
|
||||
memset(temp, 0, 32);
|
||||
for (j = 0; j < i; j++)
|
||||
temp[j & 31] ^= pwd[j];
|
||||
if (i)
|
||||
for (j = i; j < 32; j += i) {
|
||||
temp[j++] = shuffle_table[j];
|
||||
k = 32 - j;
|
||||
memcpy(temp + j, pwd, (k > i) ? i : k);
|
||||
}
|
||||
for (i = 0; i < 32; i++)
|
||||
temp[i] ^= objid[i & 3];
|
||||
j = 0;
|
||||
for (k = 0; k < 2; k++)
|
||||
for (i = 0; i < 32; i++)
|
||||
(char)j += temp[i] = (temp[i] + j) ^
|
||||
(temp[(i + j) & 31] - shuffle_table[i]);
|
||||
for (i = 0; i < 16; i++)
|
||||
out[i] = shuffle_table2[temp[i * 2]] |
|
||||
(shuffle_table2[temp[i * 2 + 1]] << 4);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
/*
|
||||
NDS client for ncpfs
|
||||
Copyright (C) 1997 Arne de Bruijn
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef _NDSCRYPT_H
|
||||
#define _NDSCRYPT_H
|
||||
|
||||
#include <string.h>
|
||||
|
||||
void nwencrypt(const unsigned short *cryptbuf, const char *in, char *out);
|
||||
void nwdecrypt(const unsigned short *cryptbuf, const char *in, char *out);
|
||||
void nwcryptinit(unsigned short *scryptbuf, const char *key);
|
||||
void nwencryptblock(const char *cryptkey, const char *buf, int buflen,
|
||||
char *outbuf);
|
||||
void nwdecryptblock(const char *cryptkey, const char *buf, int buflen,
|
||||
char *outbuf);
|
||||
|
||||
#define nwhash1init(hash, hashlen) memset(hash, 0, hashlen)
|
||||
void nwhash1(char *hash, int hashlen, const char *data, int datalen);
|
||||
|
||||
#define nwhash2init(hashbuf) memset(hashbuf, 0, 0x42)
|
||||
void nwhash2(char *hashbuf, char c);
|
||||
void nwhash2block(char *hashbuf, const char *data, int datalen);
|
||||
void nwhash2end(char *hashbuf);
|
||||
|
||||
#if 0
|
||||
void shuffle(const char *objid, const char *pwd, char *out);
|
||||
#else
|
||||
void shuffle(const char *objid, const char *pwd, int buflen, char *out);
|
||||
#endif
|
||||
|
||||
#endif /* _NDSCRYPT_H */
|
||||
1235
lib/ndslib.c
1235
lib/ndslib.c
File diff suppressed because it is too large
Load Diff
@@ -92,20 +92,20 @@ typedef unsigned char buf4[4];
|
||||
|
||||
static unsigned char encrypttable[256] =
|
||||
{0x7, 0x8, 0x0, 0x8, 0x6, 0x4, 0xE, 0x4, 0x5, 0xC, 0x1, 0x7, 0xB, 0xF, 0xA, 0x8,
|
||||
0xF, 0x8, 0xC, 0xC, 0x9, 0x4, 0x1, 0xE, 0x4, 0x6, 0x2, 0x4, 0x0, 0xA, 0xB, 0x9,
|
||||
0x2, 0xF, 0xB, 0x1, 0xD, 0x2, 0x1, 0x9, 0x5, 0xE, 0x7, 0x0, 0x0, 0x2, 0x6, 0x6,
|
||||
0x0, 0x7, 0x3, 0x8, 0x2, 0x9, 0x3, 0xF, 0x7, 0xF, 0xC, 0xF, 0x6, 0x4, 0xA, 0x0,
|
||||
0x2, 0x3, 0xA, 0xB, 0xD, 0x8, 0x3, 0xA, 0x1, 0x7, 0xC, 0xF, 0x1, 0x8, 0x9, 0xD,
|
||||
0x9, 0x1, 0x9, 0x4, 0xE, 0x4, 0xC, 0x5, 0x5, 0xC, 0x8, 0xB, 0x2, 0x3, 0x9, 0xE,
|
||||
0x7, 0x7, 0x6, 0x9, 0xE, 0xF, 0xC, 0x8, 0xD, 0x1, 0xA, 0x6, 0xE, 0xD, 0x0, 0x7,
|
||||
0x7, 0xA, 0x0, 0x1, 0xF, 0x5, 0x4, 0xB, 0x7, 0xB, 0xE, 0xC, 0x9, 0x5, 0xD, 0x1,
|
||||
0xB, 0xD, 0x1, 0x3, 0x5, 0xD, 0xE, 0x6, 0x3, 0x0, 0xB, 0xB, 0xF, 0x3, 0x6, 0x4,
|
||||
0x9, 0xD, 0xA, 0x3, 0x1, 0x4, 0x9, 0x4, 0x8, 0x3, 0xB, 0xE, 0x5, 0x0, 0x5, 0x2,
|
||||
0xC, 0xB, 0xD, 0x5, 0xD, 0x5, 0xD, 0x2, 0xD, 0x9, 0xA, 0xC, 0xA, 0x0, 0xB, 0x3,
|
||||
0x5, 0x3, 0x6, 0x9, 0x5, 0x1, 0xE, 0xE, 0x0, 0xE, 0x8, 0x2, 0xD, 0x2, 0x2, 0x0,
|
||||
0x4, 0xF, 0x8, 0x5, 0x9, 0x6, 0x8, 0x6, 0xB, 0xA, 0xB, 0xF, 0x0, 0x7, 0x2, 0x8,
|
||||
0xC, 0x7, 0x3, 0xA, 0x1, 0x4, 0x2, 0x5, 0xF, 0x7, 0xA, 0xC, 0xE, 0x5, 0x9, 0x3,
|
||||
0xE, 0x7, 0x1, 0x2, 0xE, 0x1, 0xF, 0x4, 0xA, 0x6, 0xC, 0x6, 0xF, 0x4, 0x3, 0x0,
|
||||
0xF, 0x8, 0xC, 0xC, 0x9, 0x4, 0x1, 0xE, 0x4, 0x6, 0x2, 0x4, 0x0, 0xA, 0xB, 0x9,
|
||||
0x2, 0xF, 0xB, 0x1, 0xD, 0x2, 0x1, 0x9, 0x5, 0xE, 0x7, 0x0, 0x0, 0x2, 0x6, 0x6,
|
||||
0x0, 0x7, 0x3, 0x8, 0x2, 0x9, 0x3, 0xF, 0x7, 0xF, 0xC, 0xF, 0x6, 0x4, 0xA, 0x0,
|
||||
0x2, 0x3, 0xA, 0xB, 0xD, 0x8, 0x3, 0xA, 0x1, 0x7, 0xC, 0xF, 0x1, 0x8, 0x9, 0xD,
|
||||
0x9, 0x1, 0x9, 0x4, 0xE, 0x4, 0xC, 0x5, 0x5, 0xC, 0x8, 0xB, 0x2, 0x3, 0x9, 0xE,
|
||||
0x7, 0x7, 0x6, 0x9, 0xE, 0xF, 0xC, 0x8, 0xD, 0x1, 0xA, 0x6, 0xE, 0xD, 0x0, 0x7,
|
||||
0x7, 0xA, 0x0, 0x1, 0xF, 0x5, 0x4, 0xB, 0x7, 0xB, 0xE, 0xC, 0x9, 0x5, 0xD, 0x1,
|
||||
0xB, 0xD, 0x1, 0x3, 0x5, 0xD, 0xE, 0x6, 0x3, 0x0, 0xB, 0xB, 0xF, 0x3, 0x6, 0x4,
|
||||
0x9, 0xD, 0xA, 0x3, 0x1, 0x4, 0x9, 0x4, 0x8, 0x3, 0xB, 0xE, 0x5, 0x0, 0x5, 0x2,
|
||||
0xC, 0xB, 0xD, 0x5, 0xD, 0x5, 0xD, 0x2, 0xD, 0x9, 0xA, 0xC, 0xA, 0x0, 0xB, 0x3,
|
||||
0x5, 0x3, 0x6, 0x9, 0x5, 0x1, 0xE, 0xE, 0x0, 0xE, 0x8, 0x2, 0xD, 0x2, 0x2, 0x0,
|
||||
0x4, 0xF, 0x8, 0x5, 0x9, 0x6, 0x8, 0x6, 0xB, 0xA, 0xB, 0xF, 0x0, 0x7, 0x2, 0x8,
|
||||
0xC, 0x7, 0x3, 0xA, 0x1, 0x4, 0x2, 0x5, 0xF, 0x7, 0xA, 0xC, 0xE, 0x5, 0x9, 0x3,
|
||||
0xE, 0x7, 0x1, 0x2, 0xE, 0x1, 0xF, 0x4, 0xA, 0x6, 0xC, 0x6, 0xF, 0x4, 0x3, 0x0,
|
||||
0xC, 0x0, 0x3, 0x6, 0xF, 0x8, 0x7, 0xB, 0x2, 0xD, 0xC, 0x6, 0xA, 0xA, 0x8, 0xD};
|
||||
|
||||
static buf32 encryptkeys =
|
||||
@@ -115,8 +115,7 @@ static buf32 encryptkeys =
|
||||
0xF4, 0x47, 0xDC, 0xA7, 0xEC, 0xCF, 0x50, 0xC0};
|
||||
|
||||
|
||||
static void
|
||||
shuffle1(buf32 temp, unsigned char *target)
|
||||
static void shuffle1(buf32 temp, unsigned char *target)
|
||||
{
|
||||
short b4;
|
||||
unsigned char b3;
|
||||
@@ -124,63 +123,51 @@ shuffle1(buf32 temp, unsigned char *target)
|
||||
|
||||
b4 = 0;
|
||||
|
||||
for (b2 = 0; b2 <= 1; ++b2)
|
||||
{
|
||||
for (s = 0; s <= 31; ++s)
|
||||
{
|
||||
for (b2 = 0; b2 <= 1; ++b2) {
|
||||
for (s = 0; s <= 31; ++s) {
|
||||
b3 = (temp[s] + b4) ^ (temp[(s + b4) & 31] - encryptkeys[s]);
|
||||
b4 = b4 + b3;
|
||||
temp[s] = b3;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i <= 15; ++i)
|
||||
{
|
||||
for (i = 0; i <= 15; ++i) {
|
||||
target[i] = encrypttable[temp[2 * i]]
|
||||
| (encrypttable[temp[2 * i + 1]] << 4);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
shuffle(const unsigned char *lon, const unsigned char *buf, int buflen,
|
||||
unsigned char *target)
|
||||
static void shuffle(const unsigned char *lon, const unsigned char *buf, int buflen,
|
||||
unsigned char *target)
|
||||
{
|
||||
int b2, d, s;
|
||||
buf32 temp;
|
||||
|
||||
while ((buflen > 0)
|
||||
&& (buf[buflen - 1] == 0))
|
||||
{
|
||||
&& (buf[buflen - 1] == 0)) {
|
||||
buflen = buflen - 1;
|
||||
}
|
||||
|
||||
for (s = 0; s < 32; s++)
|
||||
{
|
||||
for (s = 0; s < 32; s++) {
|
||||
temp[s] = 0;
|
||||
}
|
||||
|
||||
d = 0;
|
||||
while (buflen >= 32)
|
||||
{
|
||||
for (s = 0; s <= 31; ++s)
|
||||
{
|
||||
while (buflen >= 32) {
|
||||
for (s = 0; s <= 31; ++s) {
|
||||
temp[s] = temp[s] ^ buf[d];
|
||||
d = d + 1;
|
||||
}
|
||||
buflen = buflen - 32;
|
||||
}
|
||||
b2 = d;
|
||||
if (buflen > 0)
|
||||
{
|
||||
for (s = 0; s <= 31; ++s)
|
||||
{
|
||||
if (d + buflen == b2)
|
||||
{
|
||||
if (buflen > 0) {
|
||||
for (s = 0; s <= 31; ++s) {
|
||||
if (d + buflen == b2) {
|
||||
b2 = d;
|
||||
temp[s] = temp[s] ^ encryptkeys[s];
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
temp[s] = temp[s] ^ buf[b2];
|
||||
b2 = b2 + 1;
|
||||
}
|
||||
@@ -193,10 +180,9 @@ shuffle(const unsigned char *lon, const unsigned char *buf, int buflen,
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
nw_encrypt(const unsigned char *fra,
|
||||
const unsigned char *buf,
|
||||
unsigned char *til)
|
||||
static void nw_encrypt(const unsigned char *fra,
|
||||
const unsigned char *buf,
|
||||
unsigned char *til)
|
||||
{
|
||||
buf32 k;
|
||||
int s;
|
||||
@@ -302,8 +288,7 @@ static char
|
||||
* in ncplib.c.
|
||||
*/
|
||||
|
||||
static void
|
||||
newpassencrypt(char *old, char *new, char *out)
|
||||
static void newpassencrypt(char *old, char *new, char *out)
|
||||
{
|
||||
char *p, *bx;
|
||||
char copy[8];
|
||||
@@ -312,26 +297,22 @@ newpassencrypt(char *old, char *new, char *out)
|
||||
|
||||
memcpy(copy, new, 8);
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
for (di = 0, ax = 0, p = old; di < 8; di++, ax += 0x20, p++)
|
||||
{
|
||||
for (i = 0; i < 16; i++) {
|
||||
for (di = 0, ax = 0, p = old; di < 8; di++, ax += 0x20, p++) {
|
||||
cl = newshuffle[(((copy[di] ^ *p) >> 4) & 0x0f) + ax + 0x10] << 4;
|
||||
dl = newshuffle[((copy[di] ^ *p) & 0xf) + ax];
|
||||
copy[di] = cl | dl;
|
||||
}
|
||||
|
||||
ch = old[7];
|
||||
for (bx = old + 7; bx > old; bx--)
|
||||
{
|
||||
for (bx = old + 7; bx > old; bx--) {
|
||||
*bx = ((bx[-1] >> 4) & 0x0f) | ((*bx) << 4);
|
||||
}
|
||||
*old = ((ch >> 4) & 0x0f) | (*old) << 4;
|
||||
|
||||
memset(out, '\0', 8);
|
||||
|
||||
for (di = 0; di < 16; di++)
|
||||
{
|
||||
for (di = 0; di < 16; di++) {
|
||||
if (newshuffle[di + 0x100] & 1)
|
||||
ch = ((copy[newshuffle[di + 0x100] / 2] >> 4) & 0x0f);
|
||||
else
|
||||
|
||||
218
lib/platform.h
218
lib/platform.h
@@ -1,218 +0,0 @@
|
||||
/* platform.h - computer platform customization for PGP
|
||||
multiprecision math package. #Included in mpilib.h.
|
||||
*/
|
||||
#ifndef PLATFORM_H
|
||||
#define PLATFORM_H
|
||||
|
||||
/* Platform customization:
|
||||
* A version which runs on almost any computer can be implemented by
|
||||
* defining PORTABLE and MPORTABLE, preferably as a command line
|
||||
* parameter. Faster versions can be generated by specifying specific
|
||||
* parameters, such as size of unit and MULTUNIT, and by supplying some
|
||||
* of the critical in assembly.
|
||||
*
|
||||
* This file holds customizations for different environments.
|
||||
* This is done in one of two ways:
|
||||
* 1. A symbol is defined on the command line which designates a
|
||||
* particular environment, such as MSDOS. This file detects the
|
||||
* environment symbol and sets the appropriate low-level defines.
|
||||
*
|
||||
* 2. If no environment is named, the low-level defines are set in
|
||||
* the same manner as for PGP 2.0, thereby providing an easy upgrade.
|
||||
*
|
||||
* Following are a description of the low-level definition symbols:
|
||||
*
|
||||
* The following preprocessor symbols should be conditionally set to
|
||||
* optimize for a particular environment.
|
||||
*
|
||||
* Define one of the following:
|
||||
* UNIT8, UNIT16, or UNIT32 - specifies size of operands for
|
||||
* multiprecision add, subtract, shift, and initialization operations.
|
||||
* Define one of the following:
|
||||
* MUNIT8, MUNIT16, MUNIT32 - specified size of operands for
|
||||
* multiprecision multiply and mod_mult. This must be less than or
|
||||
* equal to unit size. It should be the word size for the native
|
||||
* atomic multiply instruction. For a 16x16 bit multiply yielding a
|
||||
* 32-bit product, MUNIT16 should be set.
|
||||
* Define one (or more) of the following:
|
||||
* PEASANT, MERRITT, UPTON, SMITH -algorithm used for modmult. All defined
|
||||
* algorithms are compiled, but the first defined name listed will be
|
||||
* assigned to the generic entry point symbols. Multiple algorithms are
|
||||
* used primarily for testing.
|
||||
* HIGHFIRST - specified if longs are stored with the most significant
|
||||
* bit at the lowest address (Motorola), undefined otherwise. This should
|
||||
* be defined on the command line, normally in the makefile.
|
||||
*
|
||||
* The following symbol, if initialized, is set to specific values:
|
||||
* ALIGN - variable declaration attribute which forces optimum alignment
|
||||
* of words, e.g. for VAX C: ALIGN=_align(quadword)
|
||||
*
|
||||
* The following symbols correspond to individual multiprecision routines
|
||||
* that may be implemented with assembly language. If they are implemented
|
||||
* in assembly, the symbols should be defined with the name of the
|
||||
* corresponding external entry points, e.g., mp_addc=P_ADDC
|
||||
* mp_setp - set precision for external routines
|
||||
* mp_addc - add with carry
|
||||
* mp_subb - subtract with borrow
|
||||
* mp_rotate_left - rotate left
|
||||
* mp_compare - compare
|
||||
* mp_move - move
|
||||
* unitfill0 - zero fill
|
||||
* mp_smul - multiply vector by single word *
|
||||
* mp_smula - multiply vector by single word and accumulate *
|
||||
* mp_dmul - full multiply
|
||||
* mp_set_recip - setup for mp_quo_digit
|
||||
* mp_quo_digit - quotient digit for modulus reduction
|
||||
*
|
||||
* Either mp_smul or mp_smula should be defined. mp_smula provides
|
||||
* for accumulation to an existing value, while mp_smul is for use of the
|
||||
* older definition of mp_smul, used in PGP 2.0, which assumed that the high
|
||||
* order accumulator word is zero. Use of mp_smula causes one less word of
|
||||
* precision to be used, thereby slightly increasing speed.
|
||||
*/
|
||||
|
||||
/********************************************************************
|
||||
* Environment customization. Please send any additions or corrections
|
||||
* to Philip Zimmermann.
|
||||
*/
|
||||
#ifndef PORTABLE
|
||||
|
||||
#ifdef MSDOS
|
||||
#ifndef i386 /* gcc */
|
||||
#define UNIT16
|
||||
#define MUNIT16
|
||||
#define mp_setp P_SETP
|
||||
#define mp_addc P_ADDC
|
||||
#define mp_subb P_SUBB
|
||||
#define mp_rotate_left P_ROTL
|
||||
#define mp_smula P_SMULA
|
||||
#define mp_quo_digit P_QUO_DIGIT
|
||||
#define mp_set_recip P_SETRECIP
|
||||
#define SMITH
|
||||
#define PLATFORM_SPECIFIED
|
||||
#endif /* i386 */
|
||||
#endif /* MSDOS */
|
||||
|
||||
#ifdef VMS
|
||||
#define UNIT32 /* use 32-bit units */
|
||||
#define MUNIT32 /* not used in C code, only in assembler */
|
||||
#define UPTON
|
||||
#define mp_setp p_setp
|
||||
#define mp_addc p_addc
|
||||
#define mp_subb p_subb
|
||||
#define mp_rotate_left p_rotl
|
||||
#define mp_smul p_smul
|
||||
#define mp_dmul p_dmul
|
||||
#define mp_compare p_cmp
|
||||
#define ALIGN _align(quadword)
|
||||
|
||||
#ifdef VAXC
|
||||
/*
|
||||
* A VAX is a CISC machine. Unfortunately C is at to low a level to use
|
||||
* many of the instruction set enhancements so we define some macros
|
||||
* here that implement fast moves and fast zero fills with single
|
||||
* instructions.
|
||||
*/
|
||||
#pragma builtins
|
||||
#define mp_move( dst, src) _MOVC3( global_precision*4, (char *) src, (char *) dst)
|
||||
#define unitfill0( r, unitcount) _MOVC5( 0, (char *) 0, 0, unitcount*4, (char *) r)
|
||||
#define mp_burn(r) _MOVC5(0, (char *) 0, 0, global_precision*4, (char *) r)
|
||||
#define mp_init0(r) mp_burn(r) /* Just for documentation purposes */
|
||||
#endif /* VAXC */
|
||||
|
||||
#define PLATFORM_SPECIFIED
|
||||
#endif /* VMS */
|
||||
|
||||
#ifdef mips
|
||||
/*
|
||||
* Needs r3kd.s and r3000.s (or r3000.c)
|
||||
*/
|
||||
#define UNIT32
|
||||
#define MUNIT32
|
||||
#define SMITH
|
||||
#define mp_dmul p_dmul
|
||||
#define mp_setp p_setp
|
||||
#define mp_addc p_addc
|
||||
#define mp_subb p_subb
|
||||
#define mp_rotate_left p_rotl
|
||||
#define mp_smula p_smula
|
||||
#define mp_quo_digit p_quo_digit
|
||||
#define mp_set_recip p_setrecip
|
||||
#define PLATFORM_SPECIFIED
|
||||
#endif /* mips */
|
||||
|
||||
#ifdef i386
|
||||
/*
|
||||
* Needs 80386.S
|
||||
*/
|
||||
#define UNIT32
|
||||
#define MUNIT32
|
||||
#define SMITH
|
||||
#define mp_setp P_SETP
|
||||
#define mp_addc P_ADDC
|
||||
#define mp_subb P_SUBB
|
||||
#define mp_rotate_left P_ROTL
|
||||
#define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit))
|
||||
#define mp_smula P_SMULA
|
||||
#define mp_quo_digit p_quo_digit
|
||||
#define mp_set_recip p_setrecip
|
||||
#define PLATFORM_SPECIFIED
|
||||
#endif /* i386 */
|
||||
|
||||
#ifdef sparc
|
||||
/*
|
||||
* Needs sparc.s
|
||||
*/
|
||||
#define UNIT32
|
||||
#define MERRITT
|
||||
#define mp_setp P_SETP
|
||||
#define mp_addc P_ADDC
|
||||
#define mp_subb P_SUBB
|
||||
#define mp_rotate_left P_ROTL
|
||||
#define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit))
|
||||
#define PLATFORM_SPECIFIED
|
||||
#endif /* sparc */
|
||||
|
||||
#if defined(mc68000) || defined(mc68020)
|
||||
/*
|
||||
* Needs mc68020.S
|
||||
*/
|
||||
#define UNIT32
|
||||
#define mp_setp P_SETP
|
||||
#define mp_addc P_ADDC
|
||||
#define mp_subb P_SUBB
|
||||
#define mp_rotate_left P_ROTL
|
||||
#define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit))
|
||||
#if defined(sun3) || defined(mc68020)
|
||||
# define UPTON
|
||||
# define MUNIT32
|
||||
# define mp_smul P_SMUL
|
||||
/* # define mp_dmul P_DMUL */ /* mc68020.s has a bug in P_DMUL */
|
||||
#else
|
||||
# define SMITH
|
||||
# define MUNIT16
|
||||
#endif
|
||||
#define PLATFORM_SPECIFIED
|
||||
#endif /* mc68000 */
|
||||
|
||||
/* Add additional platforms here ... */
|
||||
|
||||
/**************** End of system specification ************************/
|
||||
|
||||
#ifndef PLATFORM_SPECIFIED
|
||||
/* No platform explicitly selected. Customization is controlled by
|
||||
* PORTABLE and MPORTABLE.
|
||||
*/
|
||||
#define mp_setp P_SETP
|
||||
#define mp_addc P_ADDC
|
||||
#define mp_subb P_SUBB
|
||||
#define mp_rotate_left P_ROTL
|
||||
#define UPTON
|
||||
#define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit))
|
||||
#ifndef MPORTABLE
|
||||
#define mp_smul P_SMUL
|
||||
#endif /* MPORTABLE */
|
||||
#endif /* PLATFORM_SPECIFIED */
|
||||
#endif /* PORTABLE */
|
||||
#endif /* PLATFORM_H */
|
||||
|
||||
41
lib/usuals.h
41
lib/usuals.h
@@ -1,41 +0,0 @@
|
||||
/* usuals.h - The usual typedefs, etc.
|
||||
*/
|
||||
#ifndef USUALS /* Assures no redefinitions of usual types...*/
|
||||
#define USUALS
|
||||
|
||||
typedef unsigned char boolean; /* values are TRUE or FALSE */
|
||||
typedef unsigned char byte; /* values are 0-255 */
|
||||
typedef byte *byteptr; /* pointer to byte */
|
||||
typedef char *string; /* pointer to ASCII character string */
|
||||
typedef unsigned short word16; /* values are 0-65535 */
|
||||
#ifdef __alpha
|
||||
typedef unsigned int word32; /* values are 0-4294967295 */
|
||||
#else
|
||||
typedef unsigned long word32; /* values are 0-4294967295 */
|
||||
#endif
|
||||
|
||||
#ifndef TRUE
|
||||
#define FALSE 0
|
||||
#define TRUE (!FALSE)
|
||||
#endif /* if TRUE not already defined */
|
||||
|
||||
#ifndef min /* if min macro not already defined */
|
||||
#define min(a,b) (((a)<(b)) ? (a) : (b) )
|
||||
#define max(a,b) (((a)>(b)) ? (a) : (b) )
|
||||
#endif /* if min macro not already defined */
|
||||
|
||||
/* void for use in pointers */
|
||||
#ifndef NO_VOID_STAR
|
||||
#define VOID void
|
||||
#else
|
||||
#define VOID char
|
||||
#endif
|
||||
|
||||
/* Zero-fill the byte buffer. */
|
||||
#define fill0(buffer,count) memset( buffer, 0, count )
|
||||
|
||||
/* This macro is for burning sensitive data. Many of the
|
||||
file I/O routines use it for zapping buffers */
|
||||
#define burn(x) fill0((VOID *)&(x),sizeof(x))
|
||||
|
||||
#endif /* if USUALS not already defined */
|
||||
33
man/nwmsg.8
33
man/nwmsg.8
@@ -1,33 +0,0 @@
|
||||
.TH NWMSG 8 02/29/1996 nwmsg nwmsg
|
||||
.SH NAME
|
||||
nwmsg \- Deliver NetWare user broadcast messages
|
||||
.SH SYNOPSIS
|
||||
.B nwmsg
|
||||
.I mount-point
|
||||
.SH DESCRIPTION
|
||||
.B nwmsg
|
||||
is called by kerneld when a broadcast message arrives from a NetWare
|
||||
server.
|
||||
.B nwmsg
|
||||
fetches this message via the mount point and delivers it to
|
||||
the user using the same way write(1) uses.
|
||||
|
||||
Please note that
|
||||
.I kerneld
|
||||
must run when broadcast messages should be delivered to users.
|
||||
|
||||
NetWare servers can send asynchronous broadcast messages to users,
|
||||
either on explicit request by another user, or when the server is
|
||||
shutdown. The client workstation is informed about this event by an
|
||||
IPX packet on a special socket, the message socket.
|
||||
|
||||
This can happen at any time, so the user has to be informed about this
|
||||
event whenever it appears. I chose to use the kerneld feature of the
|
||||
Linux kernel to call the program nwmsg. For nwmsg, I used the relevant
|
||||
parts of the
|
||||
.I write
|
||||
program, so you can expect the NetWare broadcast
|
||||
messages to appear where user messages would appear.
|
||||
|
||||
.SH SEE ALSO
|
||||
ncpmount(8), kerneld(8), write(1)
|
||||
105
man/pqrm.1
105
man/pqrm.1
@@ -1,105 +0,0 @@
|
||||
.TH PQRM 1 03/03/1998 pqrm pqrm
|
||||
.SH NAME
|
||||
pqrm \- Remove job from NetWare print queue
|
||||
.SH SYNOPSIS
|
||||
.B pqrm
|
||||
[
|
||||
.B -h
|
||||
] [
|
||||
.B -S
|
||||
.I server
|
||||
] [
|
||||
.B -U
|
||||
.I user name
|
||||
] [
|
||||
.B -P
|
||||
.I password
|
||||
|
|
||||
.B -n
|
||||
] [
|
||||
.B -C
|
||||
]
|
||||
.I queue_name
|
||||
.I job_ID
|
||||
[
|
||||
.I another_job_ID
|
||||
... ]
|
||||
|
||||
.SH DESCRIPTION
|
||||
.B pqrm
|
||||
remove specified jobs from the NetWare print queue available
|
||||
to you on some server. If you are already connected to some server, this one
|
||||
is used.
|
||||
|
||||
.B pqrm
|
||||
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 .nwclient MUST be 600, for security reasons.
|
||||
|
||||
.SH OPTIONS
|
||||
|
||||
.B queue_name
|
||||
.RS 3
|
||||
.B queue_name
|
||||
is used to specify queue. You can not use wildcards in the name.
|
||||
.RE
|
||||
|
||||
.B job_ID
|
||||
,
|
||||
.B another_job_ID
|
||||
.RS 3
|
||||
.B job_ID
|
||||
is used to specify which job has to be deleted.
|
||||
.RE
|
||||
|
||||
.B -S
|
||||
.I server
|
||||
.RS 3
|
||||
.B server
|
||||
is the name of the server you want to use.
|
||||
.RE
|
||||
|
||||
.B -U
|
||||
.I user name
|
||||
.RS 3
|
||||
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 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 about using passwords in scripts.
|
||||
.RE
|
||||
|
||||
.B -n
|
||||
.RS 3
|
||||
.B -n
|
||||
should be given to mount shares which do not require a password to log in.
|
||||
|
||||
If neither
|
||||
.B -n
|
||||
nor
|
||||
.B -P
|
||||
are given, pqstat prompts for a password.
|
||||
.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 SEE ALSO
|
||||
.B nwclient(5), nprint(1), slist(1), ncpmount(8), ncpumount(8), pqlist(1), pqstat(1)
|
||||
|
||||
.SH CREDITS
|
||||
pqrm was written by Petr Vandrovec (vandrove@vc.cvut.cz)
|
||||
|
||||
107
man/pqstat.1
107
man/pqstat.1
@@ -1,107 +0,0 @@
|
||||
.TH PQSTAT 1 03/03/1998 pqstat pqstat
|
||||
.SH NAME
|
||||
pqstat \- List jobs in NetWare print queue
|
||||
.SH SYNOPSIS
|
||||
.B pqstat
|
||||
[
|
||||
.B -h
|
||||
] [
|
||||
.B -S
|
||||
.I server
|
||||
] [
|
||||
.B -U
|
||||
.I user name
|
||||
] [
|
||||
.B -P
|
||||
.I password
|
||||
|
|
||||
.B -n
|
||||
] [
|
||||
.B -C
|
||||
]
|
||||
.I queue name
|
||||
[
|
||||
.I job count
|
||||
]
|
||||
.SH DESCRIPTION
|
||||
.B pqstat
|
||||
lists specified number of jobs from the specified NetWare print queue available
|
||||
to you on some server. If you are already connected to some server, this one
|
||||
is used.
|
||||
|
||||
If pqstat does not print to a tty, the decorative header line is
|
||||
not printed, so that you can count the jobs in print queue by doing
|
||||
|
||||
pqstat -S server queue | wc -l
|
||||
|
||||
.B pqstat
|
||||
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 .nwclient MUST be 600, for security reasons.
|
||||
|
||||
.SH OPTIONS
|
||||
|
||||
.B queue name
|
||||
.RS 3
|
||||
.B queue name
|
||||
is used to specify queue. You can not use wildcards in the name.
|
||||
.RE
|
||||
|
||||
.B job count
|
||||
.RS 3
|
||||
.B job count
|
||||
is used to specify how much entries will be shown. Default is to show all
|
||||
entries.
|
||||
.RE
|
||||
|
||||
.B -S
|
||||
.I server
|
||||
.RS 3
|
||||
.B server
|
||||
is the name of the server you want to use.
|
||||
.RE
|
||||
|
||||
.B -U
|
||||
.I user name
|
||||
.RS 3
|
||||
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 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 about using passwords in scripts.
|
||||
.RE
|
||||
|
||||
.B -n
|
||||
.RS 3
|
||||
.B -n
|
||||
should be given to mount shares which do not require a password to log in.
|
||||
|
||||
If neither
|
||||
.B -n
|
||||
nor
|
||||
.B -P
|
||||
are given, pqstat prompts for a password.
|
||||
.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 SEE ALSO
|
||||
.B nwclient(5), nprint(1), slist(1), ncpmount(8), ncpumount(8), pqlist(1), pqrm(1)
|
||||
|
||||
.SH CREDITS
|
||||
pqstat was written by David Woodhouse (dave@imladris.demon.co.uk)
|
||||
|
||||
@@ -108,9 +108,6 @@ print job.
|
||||
|
||||
%u: This field will be replaced by the name of the user who posted
|
||||
this print job.
|
||||
|
||||
%d: This field will be replaced by the job description field of
|
||||
this print job.
|
||||
.RE
|
||||
|
||||
.B -j
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
Begin3
|
||||
Title: ncpfs
|
||||
Version: 2.0.12
|
||||
Entered-date: March 13, 1998
|
||||
Version: 2.1.1
|
||||
Entered-date: 23. March 1997
|
||||
Description: With ncpfs you can mount volumes of your netware
|
||||
server under Linux. You can also print to netware
|
||||
print queues and spool netware print queues to the
|
||||
Linux printing system.
|
||||
Linux printing system. You need kernel 1.2.x or
|
||||
1.3.71 and above. ncpfs does NOT work with any 1.3.x
|
||||
kernel below 1.3.71.
|
||||
Keywords: filesystem ncp novell netware printing
|
||||
Author: lendecke@Math.Uni-Goettingen.de (Volker Lendecke)
|
||||
Maintained-by: lendecke@Math.Uni-Goettingen.de (Volker Lendecke),
|
||||
vandrove@vc.cvut.cz (Petr Vandrovec)
|
||||
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
|
||||
~195k ncpfs-2.0.12.tgz
|
||||
~ 1k ncpfs-2.0.12.lsm
|
||||
~177k ncpfs-2.1.1.tgz
|
||||
~ 1k ncpfs-2.1.1.lsm
|
||||
Copying-policy: GPL
|
||||
End
|
||||
@@ -1,96 +0,0 @@
|
||||
Release 0.06, January 20, 1998
|
||||
* Signature support (re)included. Because of this the name has changed
|
||||
and the kernel patch is added.
|
||||
* Fixed segfault in nds_login_auth when trying server context.
|
||||
(with thanks to K J MacDonald, kenny@holyrood.ed.ac.uk)
|
||||
|
||||
|
||||
Release 0.05, November 7, 1997
|
||||
* Added include errno.h to ndslib.c (needed for glibc)
|
||||
* Modified nwsfind to accept -a parameter that causes nwsfind to
|
||||
interpret the server name as an address.
|
||||
* Fixed segfault in ncp_open_addr
|
||||
* Modified lib/ncplib.c:ncp_open_addr to call nwsfind with the address
|
||||
(creates a route to the address if necessary).
|
||||
|
||||
Release 0.04, November 5, 1997
|
||||
Changes since 0.03:
|
||||
* Added support for NDS login/authenticate to a read-only replica
|
||||
(untested)
|
||||
* ncpmount has new option -b to use bindery logins to NDS servers
|
||||
(actually since 0.01)
|
||||
(Again with thanks to Petr Vandrovec, vandrove@vc.cvut.cz)
|
||||
|
||||
|
||||
Release 0.03, November 2, 1997
|
||||
Changes since 0.02:
|
||||
* (Hopefully temporarily) removed signature support, it seems to be
|
||||
legally protected. Because of this the name has changed and the
|
||||
kernel patch is removed.
|
||||
|
||||
|
||||
Release 0.02, October 15, 1997
|
||||
Changes since 0.01:
|
||||
* Fixed bug with empty passwords
|
||||
* Fixed bug with beginlogin id != user id
|
||||
* Fixed bug with fragger handle != 0
|
||||
* Removed ncpsign.* from ./sutil, moved ncpsign.h to ./include
|
||||
* Reorganized packet signature initializing
|
||||
* Added support for NDS grace logins
|
||||
(With thanks to Petr Vandrovec, vandrove@vc.cvut.cz)
|
||||
|
||||
|
||||
Changes made by ncpfs-nds-sign-0.01.patch:
|
||||
|
||||
* Adds NDS_SUPPORT conditional variable to main Makefile
|
||||
* Puts set -e; ahead of the SUBDIRS loop in the main Makefile to abort
|
||||
the loop if compilation in a subdir fails
|
||||
* Adds README.NDS file
|
||||
* Adds fields for packet signatures to struct ncp_conn
|
||||
* Adds the following functions to the lib/ncplib.c
|
||||
ncp_negotiate_size_and_options Negotiate packet size and options
|
||||
ncp_get_bindery_access_level Get bindery access level
|
||||
ncp_init_pb_conn Initialize packet burst connection
|
||||
ncp_send_nds_frag Send message with NDS fragger protocol
|
||||
ncp_sign_start Initialize internal signing structures
|
||||
ncp_send_nds Send request for NDS function
|
||||
ncp_change_conn_state Change NW 4 connection state
|
||||
* Modifies ncp_open_temporary in lib/ncplib.c to use NDS login if
|
||||
compiled with -DNDS_SUPPORT and server has NDS.
|
||||
* Adds two error messages to ncplib_err.et
|
||||
* Modifies lib/ncplib.c to generate packet signatures when wanted.
|
||||
* Adds lib/ndslib.c with the following external used functions:
|
||||
strlen_u Get length of unicode string
|
||||
strcpy_uc Copy unicode string to normal string
|
||||
strcpy_cu Copy normal string to unicode string
|
||||
nds_get_server_name Get name and domain of current server
|
||||
nds_get_tree_name Get current NDS tree name
|
||||
nds_login_auth NDS login and authenticate to current server
|
||||
* Adds mpilib.c, mpilib.h, usuals.h and platform.h from the PGP 2.3
|
||||
source to lib/ for the RSA encryption, which is necessary for NDS
|
||||
login/authenticate.
|
||||
* Adds lib/ndscrypt.c with hash and encrypt functions for NDS login.
|
||||
* Adds lib/ncpsign.c with a MD4 hash function for packet signatures.
|
||||
* Modifies lib/Makefile to add ncpsign.o, ndslib.o, mpilib.o and
|
||||
ndscrypt.o to libncp.
|
||||
* Modifies sutil/Makefile to add ndslib.o,mpilib.o,ndscrypt.o to libncp.
|
||||
* Adds ncp_send_nds_frag, ncp_send_nds, ncp_change_conn_state to
|
||||
sutil/ncplib.c
|
||||
* Modifies sutil/ncpmount.c to:
|
||||
give more verbose error message if mount(2) fails;
|
||||
use NDS login if compiled with -DNDS_SUPPORT and server has NDS;
|
||||
start packet signature generation.
|
||||
(See below for changes to kernel-1.2/*)
|
||||
|
||||
|
||||
Changes made by ncpfs-nds-sign-0.01.kernel.patch:
|
||||
|
||||
* Modifies Makefile to add ncpsign_kernel.o to ncpfs.o
|
||||
* Modifies inode.c to query whether the server wants packet signatures.
|
||||
* Adds ioctls to start packet signature generation and to query
|
||||
whether the server wants packet signing.
|
||||
* Adds ncp_negotiate_size_and_options to ncplib_kernel.c.
|
||||
* Modifies sock.c to sign packets when enabled.
|
||||
* Adds ncpsign_kernel.c to generatie packet signatures.
|
||||
|
||||
Arne de Bruijn, October 4, 1997
|
||||
@@ -1,42 +0,0 @@
|
||||
|
||||
NDS support for ncpfs (linux)
|
||||
|
||||
ncpfs is a NetWare client for the Linux operating system, maintained
|
||||
by Volker Lendecke (lendecke@namu01.gwdg.de). I have written
|
||||
support for NDS logins to NetWare 4 servers.
|
||||
|
||||
Warning! NDS logins require the RSA public key algorithm, which is
|
||||
patented in the U.S.A. and Canada, and possibly in other countries.
|
||||
Because of this you may not be allowed to use this code. Check this
|
||||
before you use NDS logins!
|
||||
|
||||
Warning! The NDS support for ncpfs is in early beta stage, currently
|
||||
I have only tested it on my own test NW 4.10 server. The NDS support
|
||||
may not work for you, or even give problems like crashing your linux
|
||||
box, or the NetWare server! Please apply the patch only if you know
|
||||
what you are doing. Note that this version of the patch is not
|
||||
little-endian free, so it won't work on big-endian architectures.
|
||||
THIS PATCH IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS
|
||||
WITH YOU. SHOULD THE PATCH PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
|
||||
NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
This file contains a patch for the non-kernel part of ncpfs:
|
||||
ncpfs-nds-0.05.patch. This is against ncpfs 2.0.11, but works the same
|
||||
for ncpfs 2.0.10.
|
||||
|
||||
Apply the patches by cd'ing into the appropriate source directory (e.g
|
||||
/usr/local/src/ncpfs-2.0.11) and do:
|
||||
|
||||
patch < patch-file
|
||||
|
||||
You can disable NDS support after applying the patch by uncommenting
|
||||
the line NDS_SUPPORT = 1 in the main Makefile from ncpfs.
|
||||
|
||||
If you have comments or suggestinons about this patch please mail them
|
||||
to me.
|
||||
|
||||
Arne de Bruijn
|
||||
arne@knoware.nl
|
||||
@@ -4,11 +4,10 @@ and do:
|
||||
patch -p1 < patch-file
|
||||
|
||||
|
||||
lockup-2.0.30.diff:
|
||||
Please apply this patch to your 2.0.30 kernel to get rid of the ncpfs
|
||||
lockups. See ../BUGS for the symptoms.
|
||||
lockup-2.0.28.diff:
|
||||
An *extremely* dirty fix to the lockup bug mentioned in the BUGS
|
||||
file. Please only apply it if you experience the problem. Should apply
|
||||
to 2.0.28 and above in the 2.0.x series. NOT TESTED with 2.1.x.
|
||||
|
||||
Patches for other kernels to support new features must be downloaded
|
||||
separately because of kernel changes have no relations to ncpfs changes.
|
||||
Kernel patches should be available on same place as this package or
|
||||
at ftp://platan.vc.cvut.cz/pub/linux/ncpfs/latest.
|
||||
linux-2.1.26.diff:
|
||||
Development version of ncpfs
|
||||
|
||||
35
patches/linux-2.1.26.diff
Normal file
35
patches/linux-2.1.26.diff
Normal file
@@ -0,0 +1,35 @@
|
||||
--- 2.1.26/fs/ncpfs/sock.c Sun Jan 26 11:07:44 1997
|
||||
+++ 2.1.26-patched/fs/ncpfs/sock.c Sun Feb 16 17:05:13 1997
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <linux/ncp.h>
|
||||
#include <linux/ncp_fs.h>
|
||||
#include <linux/ncp_fs_sb.h>
|
||||
+#include <linux/poll.h>
|
||||
#include <net/sock.h>
|
||||
|
||||
|
||||
@@ -343,7 +344,6 @@
|
||||
char *start = server->packet;
|
||||
poll_table wait_table;
|
||||
struct poll_table_entry entry;
|
||||
- int (*select) (struct inode *, poll_table *);
|
||||
int init_timeout, max_timeout;
|
||||
int timeout;
|
||||
int retrans;
|
||||
@@ -362,7 +362,6 @@
|
||||
|
||||
file = server->ncp_filp;
|
||||
inode = file->f_inode;
|
||||
- select = file->f_op->poll;
|
||||
sock = &inode->u.socket_i;
|
||||
if (!sock)
|
||||
{
|
||||
@@ -418,7 +417,7 @@
|
||||
wait_table.nr = 0;
|
||||
wait_table.entry = &entry;
|
||||
current->state = TASK_INTERRUPTIBLE;
|
||||
- if (!select(inode, &wait_table))
|
||||
+ if (!(file->f_op->poll(file, &wait_table) & POLLIN))
|
||||
{
|
||||
if (timeout > max_timeout)
|
||||
{
|
||||
5281
patches/linux-2.1.29.diff
Normal file
5281
patches/linux-2.1.29.diff
Normal file
File diff suppressed because it is too large
Load Diff
44
patches/lockup-2.0.28.diff
Normal file
44
patches/lockup-2.0.28.diff
Normal file
@@ -0,0 +1,44 @@
|
||||
diff -urN 2.0.11/fs/ncpfs/sock.c linux/fs/ncpfs/sock.c
|
||||
--- 2.0.28/fs/ncpfs/sock.c Fri Jul 12 08:14:53 1996
|
||||
+++ linux/fs/ncpfs/sock.c Thu Aug 8 19:27:26 1996
|
||||
@@ -55,7 +55,8 @@
|
||||
{
|
||||
struct iovec iov;
|
||||
struct msghdr msg;
|
||||
-
|
||||
+ int result;
|
||||
+
|
||||
iov.iov_base = (void *)buff;
|
||||
iov.iov_len = len;
|
||||
|
||||
@@ -65,7 +66,29 @@
|
||||
msg.msg_iov = &iov;
|
||||
msg.msg_iovlen = 1;
|
||||
|
||||
- return sock->ops->sendmsg(sock, &msg, len, nonblock, flags);
|
||||
+ result = sock->ops->sendmsg(sock, &msg, len, 1, flags);
|
||||
+
|
||||
+ if ((result != -EAGAIN) || (nonblock != 0))
|
||||
+ {
|
||||
+ return result;
|
||||
+ }
|
||||
+
|
||||
+ /* The following is probably one of the worst sins you can do
|
||||
+ to a multitasking kernel: active polling. But when you call
|
||||
+ ipx_sendmsg with nonblock==0, then it will block forever
|
||||
+ from time to time. I really do not know why. To work around
|
||||
+ this, I try to send the packet with nonblock=1 and retry
|
||||
+ it. */
|
||||
+
|
||||
+ do {
|
||||
+ /* Before retrying, give others a chance */
|
||||
+ current->state = TASK_INTERRUPTIBLE;
|
||||
+ current->timeout = jiffies + HZ/10;
|
||||
+ schedule();
|
||||
+ result = sock->ops->sendmsg(sock, &msg, len, 1, flags);
|
||||
+ } while (result == -EAGAIN);
|
||||
+
|
||||
+ return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
diff -u -urN 2.0.30/net/ipx/af_ipx.c 2.0.30-patched/net/ipx/af_ipx.c
|
||||
--- 2.0.30/net/ipx/af_ipx.c Wed Nov 27 08:44:21 1996
|
||||
+++ 2.0.30-patched/net/ipx/af_ipx.c Mon Jul 14 17:25:12 1997
|
||||
@@ -1723,6 +1723,7 @@
|
||||
}
|
||||
sk->rcvbuf=SK_RMEM_MAX;
|
||||
sk->sndbuf=SK_WMEM_MAX;
|
||||
+ sk->allocation=GFP_KERNEL;
|
||||
sk->prot=NULL; /* So we use default free mechanisms */
|
||||
skb_queue_head_init(&sk->receive_queue);
|
||||
skb_queue_head_init(&sk->write_queue);
|
||||
|
||||
@@ -6,24 +6,6 @@ UTILS = ncpmount ncpumount nwsfind
|
||||
|
||||
CC = gcc
|
||||
|
||||
CFLAGS += -D__MAKE_NCPMOUNT__
|
||||
|
||||
ifdef NDS_SUPPORT
|
||||
CFLAGS += -DNDS_SUPPORT
|
||||
NDS_OBJ = ../lib/ndslib.o ../lib/mpilib.o ../lib/ndscrypt.o
|
||||
endif
|
||||
ifdef SIGNATURES
|
||||
CFLAGS += -DSIGNATURES
|
||||
SIGN_OBJ = ../lib/ncpsign.o
|
||||
endif
|
||||
ifdef MOUNT2
|
||||
CFLAGS += -DMOUNT2
|
||||
endif
|
||||
ifdef MOUNT3
|
||||
# _GNU_SOURCE for environ variable
|
||||
CFLAGS += -DMOUNT3 -D_GNU_SOURCE
|
||||
endif
|
||||
|
||||
default:
|
||||
make -C ..
|
||||
|
||||
@@ -39,8 +21,8 @@ $(UTILS): %: %.o libncp.a
|
||||
ncplib.o: ncplib.c ncplib.h
|
||||
$(CC) $(CFLAGS) -finline-functions -c ncplib.c
|
||||
|
||||
libncp.a: ncplib.o ../lib/ncplib_err.o $(SIGN_OBJ) $(NDS_OBJ)
|
||||
ar r libncp.a ncplib.o ../lib/ncplib_err.o $(SIGN_OBJ) $(NDS_OBJ)
|
||||
libncp.a: ncplib.o ../lib/ncplib_err.o
|
||||
ar r libncp.a ncplib.o ../lib/ncplib_err.o
|
||||
|
||||
dep:
|
||||
$(CPP) -M $(INCLUDES) *.c > .depend
|
||||
|
||||
93
sutil/ipxlib.h
Normal file
93
sutil/ipxlib.h
Normal file
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* ipxlib.h
|
||||
*
|
||||
* Copyright (C) 1995 by Volker Lendecke
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _IPXLIB_H
|
||||
#define _IPXLIB_H
|
||||
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/ncp.h>
|
||||
#include <linux/ncp_fs.h>
|
||||
#include <linux/ipx.h>
|
||||
#include <stdio.h>
|
||||
|
||||
typedef unsigned long IPXNet;
|
||||
typedef unsigned short IPXPort;
|
||||
typedef unsigned char IPXNode[IPX_NODE_LEN];
|
||||
|
||||
#define IPX_USER_PTYPE (0x00)
|
||||
#define IPX_RIP_PTYPE (0x01)
|
||||
#define IPX_SAP_PTYPE (0x04)
|
||||
#define IPX_AUTO_PORT (0x0000)
|
||||
#define IPX_SAP_PORT (0x0452)
|
||||
#define IPX_RIP_PORT (0x0453)
|
||||
|
||||
#define IPX_SAP_GENERAL_QUERY (0x0001)
|
||||
#define IPX_SAP_GENERAL_RESPONSE (0x0002)
|
||||
#define IPX_SAP_NEAREST_QUERY (0x0003)
|
||||
#define IPX_SAP_NEAREST_RESPONSE (0x0004)
|
||||
|
||||
#define IPX_SAP_FILE_SERVER (0x0004)
|
||||
|
||||
struct sap_query {
|
||||
unsigned short query_type; /* net order */
|
||||
unsigned short server_type; /* net order */
|
||||
};
|
||||
|
||||
struct sap_server_ident {
|
||||
unsigned short server_type __attribute__((packed));
|
||||
char server_name[48] __attribute__((packed));
|
||||
IPXNet server_network __attribute__((packed));
|
||||
IPXNode server_node __attribute__((packed));
|
||||
IPXPort server_port __attribute__((packed));
|
||||
unsigned short intermediate_network __attribute__((packed));
|
||||
};
|
||||
|
||||
#define IPX_RIP_REQUEST (0x1)
|
||||
#define IPX_RIP_RESPONSE (0x2)
|
||||
|
||||
struct ipx_rip_packet {
|
||||
__u16 operation __attribute__((packed));
|
||||
struct ipx_rt_def {
|
||||
__u32 network __attribute__((packed));
|
||||
__u16 hops __attribute__((packed));
|
||||
__u16 ticks __attribute__((packed));
|
||||
} rt[1] __attribute__((packed));
|
||||
};
|
||||
|
||||
#define IPX_BROADCAST_NODE ("\xff\xff\xff\xff\xff\xff")
|
||||
#define IPX_THIS_NODE ("\0\0\0\0\0\0")
|
||||
#define IPX_THIS_NET (0)
|
||||
|
||||
#ifndef IPX_NODE_LEN
|
||||
#define IPX_NODE_LEN (6)
|
||||
#endif
|
||||
|
||||
void
|
||||
ipx_print_node(IPXNode node);
|
||||
void
|
||||
ipx_print_network(IPXNet net);
|
||||
void
|
||||
ipx_print_port(IPXPort port);
|
||||
void
|
||||
ipx_print_saddr(struct sockaddr_ipx *sipx);
|
||||
void
|
||||
ipx_fprint_node(FILE * file, IPXNode node);
|
||||
void
|
||||
ipx_fprint_network(FILE * file, IPXNet net);
|
||||
void
|
||||
ipx_fprint_port(FILE * file, IPXPort port);
|
||||
void
|
||||
ipx_fprint_saddr(FILE * file, struct sockaddr_ipx *sipx);
|
||||
int
|
||||
ipx_sscanf_node(char *buf, unsigned char node[IPX_NODE_LEN]);
|
||||
void
|
||||
ipx_assign_node(IPXNode dest, IPXNode src);
|
||||
int
|
||||
ipx_node_equal(IPXNode n1, IPXNode n2);
|
||||
|
||||
#endif /* _IPXLIB_H */
|
||||
1203
sutil/ncplib.c
1203
sutil/ncplib.c
File diff suppressed because it is too large
Load Diff
105
sutil/ncplib.h
105
sutil/ncplib.h
@@ -1,3 +1,5 @@
|
||||
|
||||
|
||||
/*
|
||||
* ncplib.h
|
||||
*
|
||||
@@ -8,8 +10,9 @@
|
||||
#ifndef _NCPLIB_H
|
||||
#define _NCPLIB_H
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <linux/types.h>
|
||||
#include "ncp.h"
|
||||
#include <linux/ncp_fs.h>
|
||||
#include <sys/param.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
@@ -31,23 +34,21 @@ typedef __u32 dword;
|
||||
#define BSET(buf,pos,val) (BVAL(buf,pos) = (val))
|
||||
|
||||
static inline word
|
||||
WVAL_HL(__u8 * buf, int pos)
|
||||
WVAL_HL(__u8 * buf, int pos)
|
||||
{
|
||||
return PVAL(buf, pos) << 8 | PVAL(buf, pos + 1);
|
||||
}
|
||||
static inline dword
|
||||
DVAL_HL(__u8 * buf, int pos)
|
||||
DVAL_HL(__u8 * buf, int pos)
|
||||
{
|
||||
return WVAL_HL(buf, pos) << 16 | WVAL_HL(buf, pos + 2);
|
||||
}
|
||||
static inline void
|
||||
WSET_HL(__u8 * buf, int pos, word val)
|
||||
static inline void WSET_HL(__u8 * buf, int pos, word val)
|
||||
{
|
||||
BSET(buf, pos, val >> 8);
|
||||
BSET(buf, pos + 1, val & 0xff);
|
||||
}
|
||||
static inline void
|
||||
DSET_HL(__u8 * buf, int pos, dword val)
|
||||
static inline void DSET_HL(__u8 * buf, int pos, dword val)
|
||||
{
|
||||
WSET_HL(buf, pos, val >> 16);
|
||||
WSET_HL(buf, pos + 2, val & 0xffff);
|
||||
@@ -59,22 +60,20 @@ DSET_HL(__u8 * buf, int pos, dword val)
|
||||
#if defined(__i386__)
|
||||
|
||||
static inline word
|
||||
WVAL_LH(__u8 * buf, int pos)
|
||||
WVAL_LH(__u8 * buf, int pos)
|
||||
{
|
||||
return *((word *) (buf + pos));
|
||||
}
|
||||
static inline dword
|
||||
DVAL_LH(__u8 * buf, int pos)
|
||||
DVAL_LH(__u8 * buf, int pos)
|
||||
{
|
||||
return *((dword *) (buf + pos));
|
||||
}
|
||||
static inline void
|
||||
WSET_LH(__u8 * buf, int pos, word val)
|
||||
static inline void WSET_LH(__u8 * buf, int pos, word val)
|
||||
{
|
||||
*((word *) (buf + pos)) = val;
|
||||
}
|
||||
static inline void
|
||||
DSET_LH(__u8 * buf, int pos, dword val)
|
||||
static inline void DSET_LH(__u8 * buf, int pos, dword val)
|
||||
{
|
||||
*((dword *) (buf + pos)) = val;
|
||||
}
|
||||
@@ -82,23 +81,21 @@ DSET_LH(__u8 * buf, int pos, dword val)
|
||||
#else
|
||||
|
||||
static inline word
|
||||
WVAL_LH(__u8 * buf, int pos)
|
||||
WVAL_LH(__u8 * buf, int pos)
|
||||
{
|
||||
return PVAL(buf, pos) | PVAL(buf, pos + 1) << 8;
|
||||
}
|
||||
static inline dword
|
||||
DVAL_LH(__u8 * buf, int pos)
|
||||
DVAL_LH(__u8 * buf, int pos)
|
||||
{
|
||||
return WVAL_LH(buf, pos) | WVAL_LH(buf, pos + 2) << 16;
|
||||
}
|
||||
static inline void
|
||||
WSET_LH(__u8 * buf, int pos, word val)
|
||||
static inline void WSET_LH(__u8 * buf, int pos, word val)
|
||||
{
|
||||
BSET(buf, pos, val & 0xff);
|
||||
BSET(buf, pos + 1, val >> 8);
|
||||
}
|
||||
static inline void
|
||||
DSET_LH(__u8 * buf, int pos, dword val)
|
||||
static inline void DSET_LH(__u8 * buf, int pos, dword val)
|
||||
{
|
||||
WSET_LH(buf, pos, val & 0xffff);
|
||||
WSET_LH(buf, pos + 2, val >> 16);
|
||||
@@ -109,15 +106,13 @@ DSET_LH(__u8 * buf, int pos, dword val)
|
||||
void
|
||||
str_upper(char *name);
|
||||
|
||||
enum connect_state
|
||||
{
|
||||
enum connect_state {
|
||||
NOT_CONNECTED = 0,
|
||||
CONN_PERMANENT,
|
||||
CONN_TEMPORARY
|
||||
};
|
||||
|
||||
struct ncp_conn
|
||||
{
|
||||
struct ncp_conn {
|
||||
|
||||
enum connect_state is_connected;
|
||||
|
||||
@@ -148,17 +143,9 @@ struct ncp_conn
|
||||
int lock;
|
||||
|
||||
char packet[NCP_PACKET_SIZE];
|
||||
#ifdef SIGNATURES
|
||||
/* Field used to make packet signatures */
|
||||
int sign_wanted;
|
||||
int sign_active;
|
||||
char sign_root[8];
|
||||
char sign_last[16];
|
||||
#endif
|
||||
};
|
||||
|
||||
struct ncp_conn_spec
|
||||
{
|
||||
struct ncp_conn_spec {
|
||||
char server[NCP_BINDERY_NAME_LEN];
|
||||
char user[NCP_BINDERY_NAME_LEN];
|
||||
uid_t uid;
|
||||
@@ -166,8 +153,7 @@ struct ncp_conn_spec
|
||||
char password[NCP_BINDERY_NAME_LEN];
|
||||
};
|
||||
|
||||
struct ncp_property_info
|
||||
{
|
||||
struct ncp_property_info {
|
||||
__u8 property_name[16];
|
||||
__u8 property_flags;
|
||||
__u8 property_security;
|
||||
@@ -221,8 +207,7 @@ long
|
||||
/* like getmntent, get_ncp_conn_ent scans /etc/mtab for usable
|
||||
connections */
|
||||
|
||||
struct ncp_conn_ent
|
||||
{
|
||||
struct ncp_conn_ent {
|
||||
char server[NCP_BINDERY_NAME_LEN];
|
||||
char user[NCP_BINDERY_NAME_LEN];
|
||||
uid_t uid;
|
||||
@@ -241,24 +226,17 @@ struct ncp_conn_spec *
|
||||
ncp_find_conn_spec(const char *server, const char *user, const char *password,
|
||||
int login_necessary, uid_t uid, long *err);
|
||||
|
||||
struct ncp_conn_spec *
|
||||
ncp_find_conn_spec2(const char *server, const char *user, const char *password,
|
||||
int login_necessary, uid_t uid, int allow_multiple_conns,
|
||||
long *err);
|
||||
|
||||
long
|
||||
ncp_get_encryption_key(struct ncp_conn *conn,
|
||||
char *target);
|
||||
|
||||
struct ncp_station_addr
|
||||
{
|
||||
struct ncp_station_addr {
|
||||
__u32 NetWork __attribute__((packed));
|
||||
__u8 Node[6] __attribute__((packed));
|
||||
__u16 Socket __attribute__((packed));
|
||||
};
|
||||
|
||||
struct ncp_prop_login_control
|
||||
{
|
||||
struct ncp_prop_login_control {
|
||||
__u8 AccountExpireDate[3] __attribute__((packed));
|
||||
__u8 Disabled __attribute__((packed));
|
||||
__u8 PasswordExpireDate[3] __attribute__((packed));
|
||||
@@ -283,7 +261,6 @@ long
|
||||
int segment, const char *prop_name,
|
||||
struct nw_property *target);
|
||||
|
||||
#define NWE_SIGNATURE_LEVEL_CONFLICT (0x8861)
|
||||
#define NCP_GRACE_PERIOD (0xdf)
|
||||
|
||||
long
|
||||
@@ -299,41 +276,5 @@ long
|
||||
|
||||
long
|
||||
ncp_get_broadcast_message(struct ncp_conn *conn, char message[256]);
|
||||
#ifdef SIGNATURES
|
||||
long
|
||||
ncp_sign_start(struct ncp_conn *conn, const char *sign_root);
|
||||
#endif
|
||||
#ifdef NDS_SUPPORT
|
||||
long
|
||||
ncp_send_nds_frag(struct ncp_conn *conn,
|
||||
int ndsverb,
|
||||
char *inbuf, int inbuflen,
|
||||
char *outbuf, int outbufsize, int *outbuflen);
|
||||
|
||||
long
|
||||
ncp_send_nds(struct ncp_conn *conn, int fn,
|
||||
char *data_in, int data_in_len,
|
||||
char *data_out, int data_out_max, int *data_out_len);
|
||||
|
||||
long
|
||||
ncp_change_conn_state(struct ncp_conn *conn, int new_state);
|
||||
|
||||
struct ncp_conn *
|
||||
ncp_open_addr(struct sockaddr_ipx *target, long *err);
|
||||
#endif
|
||||
|
||||
int
|
||||
ncp_path_to_NW_format(const char* path, unsigned char* buff, int buffsize);
|
||||
|
||||
long
|
||||
ncp_obtain_file_or_subdir_info2(struct ncp_conn* conn, __u8 source_ns,
|
||||
__u8 target_ns, __u16 search_attribs, __u32 rim,
|
||||
int dir_style, __u8 vol, __u32 dirent,
|
||||
const unsigned char* path, int pathlen,
|
||||
struct nw_info_struct* target);
|
||||
|
||||
|
||||
int
|
||||
ncp_get_mount_uid(int fid, uid_t* uid);
|
||||
|
||||
#endif /* _NCPLIB_H */
|
||||
|
||||
773
sutil/ncpmount.c
773
sutil/ncpmount.c
File diff suppressed because it is too large
Load Diff
@@ -1,76 +0,0 @@
|
||||
/*
|
||||
* ncp_mount.h
|
||||
*
|
||||
* Copyright (C) 1995, 1996 by Volker Lendecke
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __NCPMOUNT_H__
|
||||
#define __NCPMOUNT_H__
|
||||
|
||||
#include "ncp.h"
|
||||
|
||||
#define NCP_MOUNT_VERSION_V2 2
|
||||
|
||||
/* Values for flags */
|
||||
#define NCP_MOUNT2_SOFT 0x0001
|
||||
#define NCP_MOUNT2_INTR 0x0002
|
||||
#define NCP_MOUNT2_STRONG 0x0004
|
||||
#define NCP_MOUNT2_NO_OS2 0x0008
|
||||
#define NCP_MOUNT2_NO_NFS 0x0010
|
||||
|
||||
#define PATH_MAX_V20 1024 /* PATH_MAX for 2.0 kernel */
|
||||
|
||||
struct ncp_mount_data_v2 {
|
||||
int version;
|
||||
unsigned int ncp_fd; /* The socket to the ncp port */
|
||||
unsigned int wdog_fd; /* Watchdog packets come here */
|
||||
unsigned int message_fd; /* Message notifications come here */
|
||||
__ker20_uid_t mounted_uid; /* Who may umount() this filesystem? */
|
||||
|
||||
struct sockaddr_ipx serv_addr;
|
||||
unsigned char server_name[NCP_BINDERY_NAME_LEN];
|
||||
|
||||
unsigned char mount_point[PATH_MAX_V20+1];
|
||||
unsigned char mounted_vol[NCP_VOLNAME_LEN+1];
|
||||
|
||||
unsigned int time_out; /* How long should I wait after
|
||||
sending a NCP request? */
|
||||
unsigned int retry_count; /* And how often should I retry? */
|
||||
unsigned int flags;
|
||||
|
||||
__ker20_uid_t uid;
|
||||
__ker20_gid_t gid;
|
||||
__ker20_mode_t file_mode;
|
||||
__ker20_mode_t dir_mode;
|
||||
};
|
||||
|
||||
#define NCP_MOUNT_VERSION_V3 3
|
||||
|
||||
/* Values for flags */
|
||||
#define NCP_MOUNT3_SOFT 0x0001
|
||||
#define NCP_MOUNT3_INTR 0x0002
|
||||
#define NCP_MOUNT3_STRONG 0x0004
|
||||
#define NCP_MOUNT3_NO_OS2 0x0008
|
||||
#define NCP_MOUNT3_NO_NFS 0x0010
|
||||
|
||||
struct ncp_mount_data_v3 {
|
||||
int version;
|
||||
unsigned int ncp_fd; /* The socket to the ncp port */
|
||||
__ker21_uid_t mounted_uid; /* Who may umount() this filesystem? */
|
||||
__ker21_pid_t wdog_pid; /* Who cares for our watchdog packets? */
|
||||
|
||||
unsigned char mounted_vol[NCP_VOLNAME_LEN + 1];
|
||||
unsigned int time_out; /* How long should I wait after
|
||||
sending a NCP request? */
|
||||
unsigned int retry_count; /* And how often should I retry? */
|
||||
unsigned int flags;
|
||||
|
||||
__ker21_uid_t uid;
|
||||
__ker21_gid_t gid;
|
||||
__ker21_mode_t file_mode;
|
||||
__ker21_mode_t dir_mode;
|
||||
};
|
||||
|
||||
#endif /* __NCPMOUNT_H__ */
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#include <netdb.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
/* #include <sys/wait.h> */ /* generates a warning here */
|
||||
/* #include <sys/wait.h> *//* generates a warning here */
|
||||
extern pid_t waitpid(pid_t, int *, int);
|
||||
#include <sys/errno.h>
|
||||
#include <unistd.h>
|
||||
@@ -27,37 +27,36 @@ extern pid_t waitpid(pid_t, int *, int);
|
||||
#include <sys/mount.h>
|
||||
#include <mntent.h>
|
||||
|
||||
#include "ncplib.h"
|
||||
#include <sys/ioctl.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/ncp.h>
|
||||
#include <linux/ncp_mount.h>
|
||||
#include <linux/ncp_fs.h>
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
printf("usage: %s mount-point\n", progname);
|
||||
}
|
||||
|
||||
static int
|
||||
umount_ok(const char *mount_point)
|
||||
static int umount_ok(const char *mount_point)
|
||||
{
|
||||
int fid = open(mount_point, O_RDONLY, 0);
|
||||
uid_t mount_uid;
|
||||
|
||||
if (fid == -1)
|
||||
{
|
||||
if (fid == -1) {
|
||||
fprintf(stderr, "Could not open %s: %s\n",
|
||||
mount_point, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
if (ncp_get_mount_uid(fid, &mount_uid) != 0)
|
||||
{
|
||||
if (ioctl(fid, NCP_IOC_GETMOUNTUID, &mount_uid) != 0) {
|
||||
fprintf(stderr, "%s probably not ncp-filesystem\n",
|
||||
mount_point);
|
||||
return -1;
|
||||
}
|
||||
if ((getuid() != 0)
|
||||
&& (mount_uid != getuid()))
|
||||
{
|
||||
&& (mount_uid != getuid())) {
|
||||
fprintf(stderr, "You are not allowed to umount %s\n",
|
||||
mount_point);
|
||||
return -1;
|
||||
@@ -72,7 +71,7 @@ umount_ok(const char *mount_point)
|
||||
is not a legal pathname for ``/dev/fd0.'' Anything we cannot parse
|
||||
we return unmodified. */
|
||||
char *
|
||||
canonicalize(const char *path)
|
||||
canonicalize(const char *path)
|
||||
{
|
||||
char *canonical = malloc(PATH_MAX + 1);
|
||||
|
||||
@@ -82,8 +81,7 @@ canonicalize(const char *path)
|
||||
if (realpath(path, canonical))
|
||||
return canonical;
|
||||
|
||||
if (strlen(path) > PATH_MAX)
|
||||
{
|
||||
if (strlen(path) > PATH_MAX) {
|
||||
return NULL;
|
||||
}
|
||||
strcpy(canonical, path);
|
||||
@@ -91,8 +89,7 @@ canonicalize(const char *path)
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int fd;
|
||||
|
||||
@@ -104,83 +101,70 @@ main(int argc, char *argv[])
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if (geteuid() != 0)
|
||||
{
|
||||
if (geteuid() != 0) {
|
||||
fprintf(stderr, "%s must be installed suid root\n", progname);
|
||||
exit(1);
|
||||
}
|
||||
if (argc != 2)
|
||||
{
|
||||
if (argc != 2) {
|
||||
usage();
|
||||
exit(1);
|
||||
}
|
||||
mount_point = canonicalize(argv[1]);
|
||||
|
||||
if (mount_point == NULL)
|
||||
{
|
||||
if (mount_point == NULL) {
|
||||
fprintf(stderr, "Invalid mount point: %s\n", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
if (umount_ok(mount_point) != 0)
|
||||
{
|
||||
if (umount_ok(mount_point) != 0) {
|
||||
fprintf(stderr, "You are not allowed to umount %s\n",
|
||||
mount_point);
|
||||
exit(1);
|
||||
}
|
||||
if (umount(mount_point) != 0)
|
||||
{
|
||||
if (umount(mount_point) != 0) {
|
||||
fprintf(stderr, "Could not umount %s: %s\n",
|
||||
mount_point, strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
if ((fd = open(MOUNTED "~", O_RDWR | O_CREAT | O_EXCL, 0600)) == -1)
|
||||
{
|
||||
if ((fd = open(MOUNTED "~", O_RDWR | O_CREAT | O_EXCL, 0600)) == -1) {
|
||||
fprintf(stderr, "Can't get " MOUNTED "~ lock file");
|
||||
return 1;
|
||||
}
|
||||
close(fd);
|
||||
|
||||
if ((mtab = setmntent(MOUNTED, "r")) == NULL)
|
||||
{
|
||||
if ((mtab = setmntent(MOUNTED, "r")) == NULL) {
|
||||
fprintf(stderr, "Can't open " MOUNTED ": %s\n",
|
||||
strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
#define MOUNTED_TMP MOUNTED".tmp"
|
||||
|
||||
if ((new_mtab = setmntent(MOUNTED_TMP, "w")) == NULL)
|
||||
{
|
||||
if ((new_mtab = setmntent(MOUNTED_TMP, "w")) == NULL) {
|
||||
fprintf(stderr, "Can't open " MOUNTED_TMP ": %s\n",
|
||||
strerror(errno));
|
||||
endmntent(mtab);
|
||||
return 1;
|
||||
}
|
||||
while ((mnt = getmntent(mtab)) != NULL)
|
||||
{
|
||||
if (strcmp(mnt->mnt_dir, mount_point) != 0)
|
||||
{
|
||||
while ((mnt = getmntent(mtab)) != NULL) {
|
||||
if (strcmp(mnt->mnt_dir, mount_point) != 0) {
|
||||
addmntent(new_mtab, mnt);
|
||||
}
|
||||
}
|
||||
|
||||
endmntent(mtab);
|
||||
|
||||
if (fchmod(fileno(new_mtab), S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) < 0)
|
||||
{
|
||||
if (fchmod(fileno(new_mtab), S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) < 0) {
|
||||
fprintf(stderr, "Error changing mode of %s: %s\n",
|
||||
MOUNTED_TMP, strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
endmntent(new_mtab);
|
||||
|
||||
if (rename(MOUNTED_TMP, MOUNTED) < 0)
|
||||
{
|
||||
if (rename(MOUNTED_TMP, MOUNTED) < 0) {
|
||||
fprintf(stderr, "Cannot rename %s to %s: %s\n",
|
||||
MOUNTED, MOUNTED_TMP, strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
if (unlink(MOUNTED "~") == -1)
|
||||
{
|
||||
if (unlink(MOUNTED "~") == -1) {
|
||||
fprintf(stderr, "Can't remove " MOUNTED "~");
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -92,20 +92,20 @@ typedef unsigned char buf4[4];
|
||||
|
||||
static unsigned char encrypttable[256] =
|
||||
{0x7, 0x8, 0x0, 0x8, 0x6, 0x4, 0xE, 0x4, 0x5, 0xC, 0x1, 0x7, 0xB, 0xF, 0xA, 0x8,
|
||||
0xF, 0x8, 0xC, 0xC, 0x9, 0x4, 0x1, 0xE, 0x4, 0x6, 0x2, 0x4, 0x0, 0xA, 0xB, 0x9,
|
||||
0x2, 0xF, 0xB, 0x1, 0xD, 0x2, 0x1, 0x9, 0x5, 0xE, 0x7, 0x0, 0x0, 0x2, 0x6, 0x6,
|
||||
0x0, 0x7, 0x3, 0x8, 0x2, 0x9, 0x3, 0xF, 0x7, 0xF, 0xC, 0xF, 0x6, 0x4, 0xA, 0x0,
|
||||
0x2, 0x3, 0xA, 0xB, 0xD, 0x8, 0x3, 0xA, 0x1, 0x7, 0xC, 0xF, 0x1, 0x8, 0x9, 0xD,
|
||||
0x9, 0x1, 0x9, 0x4, 0xE, 0x4, 0xC, 0x5, 0x5, 0xC, 0x8, 0xB, 0x2, 0x3, 0x9, 0xE,
|
||||
0x7, 0x7, 0x6, 0x9, 0xE, 0xF, 0xC, 0x8, 0xD, 0x1, 0xA, 0x6, 0xE, 0xD, 0x0, 0x7,
|
||||
0x7, 0xA, 0x0, 0x1, 0xF, 0x5, 0x4, 0xB, 0x7, 0xB, 0xE, 0xC, 0x9, 0x5, 0xD, 0x1,
|
||||
0xB, 0xD, 0x1, 0x3, 0x5, 0xD, 0xE, 0x6, 0x3, 0x0, 0xB, 0xB, 0xF, 0x3, 0x6, 0x4,
|
||||
0x9, 0xD, 0xA, 0x3, 0x1, 0x4, 0x9, 0x4, 0x8, 0x3, 0xB, 0xE, 0x5, 0x0, 0x5, 0x2,
|
||||
0xC, 0xB, 0xD, 0x5, 0xD, 0x5, 0xD, 0x2, 0xD, 0x9, 0xA, 0xC, 0xA, 0x0, 0xB, 0x3,
|
||||
0x5, 0x3, 0x6, 0x9, 0x5, 0x1, 0xE, 0xE, 0x0, 0xE, 0x8, 0x2, 0xD, 0x2, 0x2, 0x0,
|
||||
0x4, 0xF, 0x8, 0x5, 0x9, 0x6, 0x8, 0x6, 0xB, 0xA, 0xB, 0xF, 0x0, 0x7, 0x2, 0x8,
|
||||
0xC, 0x7, 0x3, 0xA, 0x1, 0x4, 0x2, 0x5, 0xF, 0x7, 0xA, 0xC, 0xE, 0x5, 0x9, 0x3,
|
||||
0xE, 0x7, 0x1, 0x2, 0xE, 0x1, 0xF, 0x4, 0xA, 0x6, 0xC, 0x6, 0xF, 0x4, 0x3, 0x0,
|
||||
0xF, 0x8, 0xC, 0xC, 0x9, 0x4, 0x1, 0xE, 0x4, 0x6, 0x2, 0x4, 0x0, 0xA, 0xB, 0x9,
|
||||
0x2, 0xF, 0xB, 0x1, 0xD, 0x2, 0x1, 0x9, 0x5, 0xE, 0x7, 0x0, 0x0, 0x2, 0x6, 0x6,
|
||||
0x0, 0x7, 0x3, 0x8, 0x2, 0x9, 0x3, 0xF, 0x7, 0xF, 0xC, 0xF, 0x6, 0x4, 0xA, 0x0,
|
||||
0x2, 0x3, 0xA, 0xB, 0xD, 0x8, 0x3, 0xA, 0x1, 0x7, 0xC, 0xF, 0x1, 0x8, 0x9, 0xD,
|
||||
0x9, 0x1, 0x9, 0x4, 0xE, 0x4, 0xC, 0x5, 0x5, 0xC, 0x8, 0xB, 0x2, 0x3, 0x9, 0xE,
|
||||
0x7, 0x7, 0x6, 0x9, 0xE, 0xF, 0xC, 0x8, 0xD, 0x1, 0xA, 0x6, 0xE, 0xD, 0x0, 0x7,
|
||||
0x7, 0xA, 0x0, 0x1, 0xF, 0x5, 0x4, 0xB, 0x7, 0xB, 0xE, 0xC, 0x9, 0x5, 0xD, 0x1,
|
||||
0xB, 0xD, 0x1, 0x3, 0x5, 0xD, 0xE, 0x6, 0x3, 0x0, 0xB, 0xB, 0xF, 0x3, 0x6, 0x4,
|
||||
0x9, 0xD, 0xA, 0x3, 0x1, 0x4, 0x9, 0x4, 0x8, 0x3, 0xB, 0xE, 0x5, 0x0, 0x5, 0x2,
|
||||
0xC, 0xB, 0xD, 0x5, 0xD, 0x5, 0xD, 0x2, 0xD, 0x9, 0xA, 0xC, 0xA, 0x0, 0xB, 0x3,
|
||||
0x5, 0x3, 0x6, 0x9, 0x5, 0x1, 0xE, 0xE, 0x0, 0xE, 0x8, 0x2, 0xD, 0x2, 0x2, 0x0,
|
||||
0x4, 0xF, 0x8, 0x5, 0x9, 0x6, 0x8, 0x6, 0xB, 0xA, 0xB, 0xF, 0x0, 0x7, 0x2, 0x8,
|
||||
0xC, 0x7, 0x3, 0xA, 0x1, 0x4, 0x2, 0x5, 0xF, 0x7, 0xA, 0xC, 0xE, 0x5, 0x9, 0x3,
|
||||
0xE, 0x7, 0x1, 0x2, 0xE, 0x1, 0xF, 0x4, 0xA, 0x6, 0xC, 0x6, 0xF, 0x4, 0x3, 0x0,
|
||||
0xC, 0x0, 0x3, 0x6, 0xF, 0x8, 0x7, 0xB, 0x2, 0xD, 0xC, 0x6, 0xA, 0xA, 0x8, 0xD};
|
||||
|
||||
static buf32 encryptkeys =
|
||||
@@ -115,8 +115,7 @@ static buf32 encryptkeys =
|
||||
0xF4, 0x47, 0xDC, 0xA7, 0xEC, 0xCF, 0x50, 0xC0};
|
||||
|
||||
|
||||
static void
|
||||
shuffle1(buf32 temp, unsigned char *target)
|
||||
static void shuffle1(buf32 temp, unsigned char *target)
|
||||
{
|
||||
short b4;
|
||||
unsigned char b3;
|
||||
@@ -124,63 +123,51 @@ shuffle1(buf32 temp, unsigned char *target)
|
||||
|
||||
b4 = 0;
|
||||
|
||||
for (b2 = 0; b2 <= 1; ++b2)
|
||||
{
|
||||
for (s = 0; s <= 31; ++s)
|
||||
{
|
||||
for (b2 = 0; b2 <= 1; ++b2) {
|
||||
for (s = 0; s <= 31; ++s) {
|
||||
b3 = (temp[s] + b4) ^ (temp[(s + b4) & 31] - encryptkeys[s]);
|
||||
b4 = b4 + b3;
|
||||
temp[s] = b3;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i <= 15; ++i)
|
||||
{
|
||||
for (i = 0; i <= 15; ++i) {
|
||||
target[i] = encrypttable[temp[2 * i]]
|
||||
| (encrypttable[temp[2 * i + 1]] << 4);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
shuffle(const unsigned char *lon, const unsigned char *buf, int buflen,
|
||||
unsigned char *target)
|
||||
static void shuffle(const unsigned char *lon, const unsigned char *buf, int buflen,
|
||||
unsigned char *target)
|
||||
{
|
||||
int b2, d, s;
|
||||
buf32 temp;
|
||||
|
||||
while ((buflen > 0)
|
||||
&& (buf[buflen - 1] == 0))
|
||||
{
|
||||
&& (buf[buflen - 1] == 0)) {
|
||||
buflen = buflen - 1;
|
||||
}
|
||||
|
||||
for (s = 0; s < 32; s++)
|
||||
{
|
||||
for (s = 0; s < 32; s++) {
|
||||
temp[s] = 0;
|
||||
}
|
||||
|
||||
d = 0;
|
||||
while (buflen >= 32)
|
||||
{
|
||||
for (s = 0; s <= 31; ++s)
|
||||
{
|
||||
while (buflen >= 32) {
|
||||
for (s = 0; s <= 31; ++s) {
|
||||
temp[s] = temp[s] ^ buf[d];
|
||||
d = d + 1;
|
||||
}
|
||||
buflen = buflen - 32;
|
||||
}
|
||||
b2 = d;
|
||||
if (buflen > 0)
|
||||
{
|
||||
for (s = 0; s <= 31; ++s)
|
||||
{
|
||||
if (d + buflen == b2)
|
||||
{
|
||||
if (buflen > 0) {
|
||||
for (s = 0; s <= 31; ++s) {
|
||||
if (d + buflen == b2) {
|
||||
b2 = d;
|
||||
temp[s] = temp[s] ^ encryptkeys[s];
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
temp[s] = temp[s] ^ buf[b2];
|
||||
b2 = b2 + 1;
|
||||
}
|
||||
@@ -193,10 +180,9 @@ shuffle(const unsigned char *lon, const unsigned char *buf, int buflen,
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
nw_encrypt(const unsigned char *fra,
|
||||
const unsigned char *buf,
|
||||
unsigned char *til)
|
||||
static void nw_encrypt(const unsigned char *fra,
|
||||
const unsigned char *buf,
|
||||
unsigned char *til)
|
||||
{
|
||||
buf32 k;
|
||||
int s;
|
||||
|
||||
@@ -13,30 +13,25 @@
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <errno.h>
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [server]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [server]\n", progname);
|
||||
printf("\n"
|
||||
"-t Server type, default: File server\n"
|
||||
"-a server is in form <net>:<node>:<socket>\n"
|
||||
"-h Print this help text\n"
|
||||
"\n");
|
||||
}
|
||||
|
||||
static void
|
||||
swallow_error(const char *name, long code, const char *format, va_list arg)
|
||||
static void swallow_error(const char *name, long code, const char *format, va_list arg)
|
||||
{
|
||||
printf("%s ", error_message(code));
|
||||
vfprintf(stdout, format, arg);
|
||||
@@ -44,16 +39,12 @@ swallow_error(const char *name, long code, const char *format, va_list arg)
|
||||
return;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
char *server = NULL;
|
||||
int object_type = NCP_BINDERY_FSERVER;
|
||||
struct sockaddr_ipx *result;
|
||||
struct sockaddr_ipx resultbuf;
|
||||
struct ncp_conn *conn;
|
||||
long err;
|
||||
int is_address = 0;
|
||||
|
||||
int opt;
|
||||
|
||||
@@ -61,16 +52,11 @@ main(int argc, char *argv[])
|
||||
|
||||
set_com_err_hook(swallow_error);
|
||||
|
||||
while ((opt = getopt(argc, argv, "at:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "t:")) != EOF) {
|
||||
switch (opt) {
|
||||
case 't':
|
||||
object_type = atoi(optarg);
|
||||
break;
|
||||
case 'a':
|
||||
is_address = 1;
|
||||
break;
|
||||
case 'h':
|
||||
case '?':
|
||||
help();
|
||||
@@ -81,44 +67,20 @@ main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (optind < argc - 1)
|
||||
{
|
||||
if (optind < argc - 1) {
|
||||
usage();
|
||||
exit(1);
|
||||
}
|
||||
if (is_address)
|
||||
{
|
||||
if ((optind > argc - 1) ||
|
||||
ipx_sscanf_saddr(argv[optind], &resultbuf))
|
||||
{
|
||||
usage();
|
||||
if (optind == argc - 1) {
|
||||
server = argv[optind];
|
||||
if (strlen(server) >= NCP_BINDERY_NAME_LEN) {
|
||||
com_err(argv[0], ENAMETOOLONG, "server name too long");
|
||||
exit(1);
|
||||
}
|
||||
if ((!(conn = ncp_open_addr(&resultbuf, &err))) ||
|
||||
(err = ncp_close(conn)))
|
||||
result = NULL;
|
||||
else
|
||||
{
|
||||
result = &resultbuf;
|
||||
server = argv[optind];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (optind == argc - 1)
|
||||
{
|
||||
server = argv[optind];
|
||||
if (strlen(server) >= NCP_BINDERY_NAME_LEN)
|
||||
{
|
||||
com_err(argv[0], ENAMETOOLONG, "server name too long");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
result = ncp_find_server(&server, object_type, &err);
|
||||
}
|
||||
result = ncp_find_server(&server, object_type, &err);
|
||||
|
||||
if (result == NULL)
|
||||
{
|
||||
if (result == NULL) {
|
||||
com_err(argv[0], err, "when trying to find server");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -3,13 +3,10 @@
|
||||
#
|
||||
|
||||
USERUTILS = slist pqlist nwfsinfo pserver nprint nsend ncopy nwpasswd
|
||||
USERUTILS += nwbols nwbocreate nwborm nwboprops pqstat pqrm
|
||||
USERUTILS += nwbols nwbocreate nwborm nwboprops
|
||||
USERUTILS += nwbpcreate nwbprm nwbpvalues nwbpadd nwbpset
|
||||
USERUTILS += nwgrant nwrevoke nwuserlist nwrights nwauth
|
||||
USERUTILS += nwfstime nwvolinfo nwtrustee
|
||||
ifdef MOUNT2
|
||||
SBINUTILS = nwmsg
|
||||
endif
|
||||
|
||||
UTILS = $(USERUTILS) $(SBINUTILS) ncptest
|
||||
|
||||
|
||||
BIN
util/ipx_probe
Executable file
BIN
util/ipx_probe
Executable file
Binary file not shown.
665
util/ipx_probe.c
665
util/ipx_probe.c
@@ -22,25 +22,23 @@
|
||||
static char *progname;
|
||||
int verbose = 0;
|
||||
|
||||
static void
|
||||
usage ()
|
||||
static void usage()
|
||||
{
|
||||
fprintf (stderr, "usage: %s [options]\n", progname);
|
||||
fprintf (stderr, "type '%s -h' for help\n", progname);
|
||||
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||
fprintf(stderr, "type '%s -h' for help\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help ()
|
||||
static void help()
|
||||
{
|
||||
printf ("\n"
|
||||
"Probe an interface for ipx networks\n"
|
||||
"\n");
|
||||
printf ("usage: %s [options]\n", progname);
|
||||
printf ("\n"
|
||||
"-v Verbose output\n"
|
||||
"-i interface Interface to probe, default: eth0\n"
|
||||
"-t timeout Seconds to wait for answer, default: 3\n"
|
||||
"-h Print this help text\n\n");
|
||||
printf("\n"
|
||||
"Probe an interface for ipx networks\n"
|
||||
"\n");
|
||||
printf("usage: %s [options]\n", progname);
|
||||
printf("\n"
|
||||
"-v Verbose output\n"
|
||||
"-i interface Interface to probe, default: eth0\n"
|
||||
"-t timeout Seconds to wait for answer, default: 3\n"
|
||||
"-h Print this help text\n\n");
|
||||
}
|
||||
|
||||
#define IPX_SAP_PTYPE (0x04)
|
||||
@@ -50,407 +48,360 @@ help ()
|
||||
|
||||
#define BVAL(buf,pos) (((__u8 *)(buf))[pos])
|
||||
#define BSET(buf,pos,val) (BVAL(buf,pos) = (val))
|
||||
static inline void
|
||||
WSET_HL (__u8 * buf, int pos, __u16 val)
|
||||
static inline void WSET_HL(__u8 * buf, int pos, __u16 val)
|
||||
{
|
||||
BSET (buf, pos, val >> 8);
|
||||
BSET (buf, pos + 1, val & 0xff);
|
||||
BSET(buf, pos, val >> 8);
|
||||
BSET(buf, pos + 1, val & 0xff);
|
||||
}
|
||||
|
||||
struct frame_type
|
||||
{
|
||||
char *ft_name;
|
||||
unsigned char ft_val;
|
||||
struct frame_type {
|
||||
char *ft_name;
|
||||
unsigned char ft_val;
|
||||
};
|
||||
|
||||
static struct frame_type frame_types[] =
|
||||
{
|
||||
{
|
||||
"802.2", IPX_FRAME_8022
|
||||
}
|
||||
,
|
||||
{
|
||||
"802.2", IPX_FRAME_8022
|
||||
}
|
||||
,
|
||||
#ifdef IPX_FRAME_TR_8022
|
||||
{
|
||||
"802.2TR", IPX_FRAME_TR_8022
|
||||
}
|
||||
,
|
||||
{
|
||||
"802.2TR", IPX_FRAME_TR_8022
|
||||
}
|
||||
,
|
||||
#endif
|
||||
{
|
||||
"802.3", IPX_FRAME_8023
|
||||
}
|
||||
,
|
||||
{
|
||||
"SNAP", IPX_FRAME_SNAP
|
||||
}
|
||||
,
|
||||
{
|
||||
"EtherII", IPX_FRAME_ETHERII
|
||||
}
|
||||
{
|
||||
"802.3", IPX_FRAME_8023
|
||||
}
|
||||
,
|
||||
{
|
||||
"SNAP", IPX_FRAME_SNAP
|
||||
}
|
||||
,
|
||||
{
|
||||
"EtherII", IPX_FRAME_ETHERII
|
||||
}
|
||||
};
|
||||
|
||||
#define NFTYPES (sizeof(frame_types)/sizeof(struct frame_type))
|
||||
|
||||
static char *
|
||||
frame_name (int frame_type)
|
||||
frame_name(int frame_type)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < NFTYPES; i++)
|
||||
{
|
||||
if (frame_types[i].ft_val == frame_type)
|
||||
{
|
||||
return frame_types[i].ft_name;
|
||||
int i;
|
||||
for (i = 0; i < NFTYPES; i++) {
|
||||
if (frame_types[i].ft_val == frame_type) {
|
||||
return frame_types[i].ft_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
ipx_recvfrom (int sock, void *buf, int len, unsigned int flags,
|
||||
struct sockaddr_ipx *sender, int *addrlen, int timeout,
|
||||
long *err)
|
||||
static int ipx_recvfrom(int sock, void *buf, int len, unsigned int flags,
|
||||
struct sockaddr_ipx *sender, int *addrlen, int timeout,
|
||||
long *err)
|
||||
{
|
||||
fd_set rd, wr, ex;
|
||||
struct timeval tv;
|
||||
int result;
|
||||
fd_set rd, wr, ex;
|
||||
struct timeval tv;
|
||||
int result;
|
||||
|
||||
FD_ZERO (&rd);
|
||||
FD_ZERO (&wr);
|
||||
FD_ZERO (&ex);
|
||||
FD_SET (sock, &rd);
|
||||
FD_ZERO(&rd);
|
||||
FD_ZERO(&wr);
|
||||
FD_ZERO(&ex);
|
||||
FD_SET(sock, &rd);
|
||||
|
||||
tv.tv_sec = timeout;
|
||||
tv.tv_usec = 0;
|
||||
tv.tv_sec = timeout;
|
||||
tv.tv_usec = 0;
|
||||
|
||||
if ((result = select (sock + 1, &rd, &wr, &ex, &tv)) == -1)
|
||||
{
|
||||
*err = errno;
|
||||
return -1;
|
||||
}
|
||||
if (FD_ISSET (sock, &rd))
|
||||
{
|
||||
result = recvfrom (sock, buf, len, flags,
|
||||
(struct sockaddr *) sender, addrlen);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = -1;
|
||||
errno = ETIMEDOUT;
|
||||
}
|
||||
if (result < 0)
|
||||
{
|
||||
*err = errno;
|
||||
}
|
||||
return result;
|
||||
if ((result = select(sock + 1, &rd, &wr, &ex, &tv)) == -1) {
|
||||
*err = errno;
|
||||
return -1;
|
||||
}
|
||||
if (FD_ISSET(sock, &rd)) {
|
||||
result = recvfrom(sock, buf, len, flags,
|
||||
(struct sockaddr *) sender, addrlen);
|
||||
} else {
|
||||
result = -1;
|
||||
errno = ETIMEDOUT;
|
||||
}
|
||||
if (result < 0) {
|
||||
*err = errno;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static int
|
||||
ipx_recv (int sock, void *buf, int len, unsigned int flags, int timeout,
|
||||
long *err)
|
||||
static int ipx_recv(int sock, void *buf, int len, unsigned int flags, int timeout,
|
||||
long *err)
|
||||
{
|
||||
struct sockaddr_ipx sender;
|
||||
int addrlen = sizeof (sender);
|
||||
struct sockaddr_ipx sender;
|
||||
int addrlen = sizeof(sender);
|
||||
|
||||
return ipx_recvfrom (sock, buf, len, flags, &sender, &addrlen,
|
||||
timeout, err);
|
||||
return ipx_recvfrom(sock, buf, len, flags, &sender, &addrlen,
|
||||
timeout, err);
|
||||
}
|
||||
|
||||
static int
|
||||
probe_frame (char *interface, int frame_type, int timeout, unsigned long *net)
|
||||
static int probe_frame(char *interface, int frame_type, int timeout, unsigned long *net)
|
||||
{
|
||||
int i, sock, opt;
|
||||
int result;
|
||||
long err;
|
||||
char errmsg[strlen (progname) + 20];
|
||||
char data[1024];
|
||||
int i, sock, opt;
|
||||
int result;
|
||||
long err;
|
||||
char errmsg[strlen(progname) + 20];
|
||||
char data[1024];
|
||||
|
||||
static struct ifreq id;
|
||||
struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &id.ifr_addr;
|
||||
static struct ifreq id;
|
||||
struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &id.ifr_addr;
|
||||
|
||||
if (verbose != 0)
|
||||
{
|
||||
printf ("probing %s on %s -- ", frame_name (frame_type),
|
||||
interface);
|
||||
fflush (stdout);
|
||||
}
|
||||
sock = socket (AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (sock < 0)
|
||||
{
|
||||
int old_errno = errno;
|
||||
|
||||
sprintf (errmsg, "%s: socket", progname);
|
||||
perror (errmsg);
|
||||
if (old_errno == -EINVAL)
|
||||
{
|
||||
fprintf (stderr, "Probably you have no IPX support in "
|
||||
"your kernel\n");
|
||||
if (verbose != 0) {
|
||||
printf("probing %s on %s -- ", frame_name(frame_type),
|
||||
interface);
|
||||
fflush(stdout);
|
||||
}
|
||||
close (sock);
|
||||
return -1;
|
||||
}
|
||||
memset (&id, 0, sizeof (id));
|
||||
strncpy (id.ifr_name, interface, sizeof (id.ifr_name) - 1);
|
||||
sipx->sipx_family = AF_IPX;
|
||||
sipx->sipx_action = IPX_CRTITF;
|
||||
sipx->sipx_special = IPX_PRIMARY;
|
||||
sipx->sipx_network = 0L;
|
||||
sipx->sipx_type = frame_type;
|
||||
sock = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (sock < 0) {
|
||||
int old_errno = errno;
|
||||
|
||||
i = 0;
|
||||
do
|
||||
{
|
||||
result = ioctl (sock, SIOCSIFADDR, &id);
|
||||
i++;
|
||||
}
|
||||
while ((i < 5) && (result < 0) && (errno == EAGAIN));
|
||||
|
||||
if (result < 0)
|
||||
{
|
||||
int old_errno = errno;
|
||||
close (sock);
|
||||
errno = old_errno;
|
||||
return result;
|
||||
}
|
||||
/* We do a GNS request on the new socket. If something comes
|
||||
back, we assume that the frame type is valid. */
|
||||
|
||||
opt = 1;
|
||||
if ((result = setsockopt (sock, SOL_SOCKET,
|
||||
SO_BROADCAST, &opt, sizeof (opt))) < 0)
|
||||
{
|
||||
int old_errno = errno;
|
||||
close (sock);
|
||||
errno = old_errno;
|
||||
return result;
|
||||
}
|
||||
memset (&id, 0, sizeof (id));
|
||||
sipx->sipx_family = AF_IPX;
|
||||
sipx->sipx_network = htonl (0x0);
|
||||
sipx->sipx_port = htons (0x0);
|
||||
sipx->sipx_type = IPX_SAP_PTYPE;
|
||||
|
||||
if ((result = bind (sock, (struct sockaddr *) sipx,
|
||||
sizeof (*sipx))) < 0 - 1)
|
||||
{
|
||||
int old_errno = errno;
|
||||
close (sock);
|
||||
errno = old_errno;
|
||||
return result;
|
||||
}
|
||||
WSET_HL (data, 0, IPX_SAP_NEAREST_QUERY);
|
||||
WSET_HL (data, 2, 4);
|
||||
|
||||
memset (&id, 0, sizeof (id));
|
||||
sipx->sipx_family = AF_IPX;
|
||||
sipx->sipx_port = htons (IPX_SAP_PORT);
|
||||
sipx->sipx_type = IPX_SAP_PTYPE;
|
||||
sipx->sipx_network = htonl (0x0);
|
||||
memcpy (sipx->sipx_node, IPX_BROADCAST_NODE, 6);
|
||||
|
||||
if ((result = sendto (sock, data, 4, 0, (struct sockaddr *) sipx,
|
||||
sizeof (*sipx))) < 0)
|
||||
{
|
||||
int old_errno = errno;
|
||||
close (sock);
|
||||
errno = old_errno;
|
||||
return result;
|
||||
}
|
||||
result = ipx_recv (sock, data, 1024, 0, timeout, &err);
|
||||
|
||||
if (result > 0)
|
||||
{
|
||||
struct sockaddr_ipx sipx;
|
||||
int namelen = sizeof (sipx);
|
||||
|
||||
if (getsockname (sock, (struct sockaddr *) &sipx,
|
||||
&namelen) < 0)
|
||||
{
|
||||
fprintf (stderr, "%s: Could not find socket address\n",
|
||||
progname);
|
||||
exit (1);
|
||||
sprintf(errmsg, "%s: socket", progname);
|
||||
perror(errmsg);
|
||||
if (old_errno == -EINVAL) {
|
||||
fprintf(stderr, "Probably you have no IPX support in "
|
||||
"your kernel\n");
|
||||
}
|
||||
close(sock);
|
||||
return -1;
|
||||
}
|
||||
*net = ntohl (sipx.sipx_network);
|
||||
}
|
||||
memset (&id, 0, sizeof (id));
|
||||
strncpy (id.ifr_name, interface, sizeof (id.ifr_name) - 1);
|
||||
sipx->sipx_family = AF_IPX;
|
||||
sipx->sipx_action = IPX_DLTITF;
|
||||
sipx->sipx_network = 0L;
|
||||
sipx->sipx_type = frame_type;
|
||||
result = ioctl (sock, SIOCSIFADDR, &id);
|
||||
close (sock);
|
||||
memset(&id, 0, sizeof(id));
|
||||
strncpy(id.ifr_name, interface, sizeof(id.ifr_name) - 1);
|
||||
sipx->sipx_family = AF_IPX;
|
||||
sipx->sipx_action = IPX_CRTITF;
|
||||
sipx->sipx_special = IPX_PRIMARY;
|
||||
sipx->sipx_network = 0L;
|
||||
sipx->sipx_type = frame_type;
|
||||
|
||||
if (result < 0)
|
||||
{
|
||||
fprintf (stderr, "%s: could not delete interface\n",
|
||||
progname);
|
||||
exit (1);
|
||||
}
|
||||
if (err == ETIMEDOUT)
|
||||
{
|
||||
if (verbose != 0)
|
||||
{
|
||||
printf ("no network found\n");
|
||||
i = 0;
|
||||
do {
|
||||
result = ioctl(sock, SIOCSIFADDR, &id);
|
||||
i++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
if (verbose != 0)
|
||||
{
|
||||
printf ("found IPX network %8.8lX\n", *net);
|
||||
}
|
||||
return 0;
|
||||
while ((i < 5) && (result < 0) && (errno == EAGAIN));
|
||||
|
||||
if (result < 0) {
|
||||
int old_errno = errno;
|
||||
close(sock);
|
||||
errno = old_errno;
|
||||
return result;
|
||||
}
|
||||
/* We do a GNS request on the new socket. If something comes
|
||||
back, we assume that the frame type is valid. */
|
||||
|
||||
opt = 1;
|
||||
if ((result = setsockopt(sock, SOL_SOCKET,
|
||||
SO_BROADCAST, &opt, sizeof(opt))) < 0) {
|
||||
int old_errno = errno;
|
||||
close(sock);
|
||||
errno = old_errno;
|
||||
return result;
|
||||
}
|
||||
memset(&id, 0, sizeof(id));
|
||||
sipx->sipx_family = AF_IPX;
|
||||
sipx->sipx_network = htonl(0x0);
|
||||
sipx->sipx_port = htons(0x0);
|
||||
sipx->sipx_type = IPX_SAP_PTYPE;
|
||||
|
||||
if ((result = bind(sock, (struct sockaddr *) sipx,
|
||||
sizeof(*sipx))) < 0 - 1) {
|
||||
int old_errno = errno;
|
||||
close(sock);
|
||||
errno = old_errno;
|
||||
return result;
|
||||
}
|
||||
WSET_HL(data, 0, IPX_SAP_NEAREST_QUERY);
|
||||
WSET_HL(data, 2, 4);
|
||||
|
||||
memset(&id, 0, sizeof(id));
|
||||
sipx->sipx_family = AF_IPX;
|
||||
sipx->sipx_port = htons(IPX_SAP_PORT);
|
||||
sipx->sipx_type = IPX_SAP_PTYPE;
|
||||
sipx->sipx_network = htonl(0x0);
|
||||
memcpy(sipx->sipx_node, IPX_BROADCAST_NODE, 6);
|
||||
|
||||
if ((result = sendto(sock, data, 4, 0, (struct sockaddr *) sipx,
|
||||
sizeof(*sipx))) < 0) {
|
||||
int old_errno = errno;
|
||||
close(sock);
|
||||
errno = old_errno;
|
||||
return result;
|
||||
}
|
||||
result = ipx_recv(sock, data, 1024, 0, timeout, &err);
|
||||
|
||||
if (result > 0) {
|
||||
struct sockaddr_ipx sipx;
|
||||
int namelen = sizeof(sipx);
|
||||
|
||||
if (getsockname(sock, (struct sockaddr *) &sipx,
|
||||
&namelen) < 0) {
|
||||
fprintf(stderr, "%s: Could not find socket address\n",
|
||||
progname);
|
||||
exit(1);
|
||||
}
|
||||
*net = ntohl(sipx.sipx_network);
|
||||
}
|
||||
memset(&id, 0, sizeof(id));
|
||||
strncpy(id.ifr_name, interface, sizeof(id.ifr_name) - 1);
|
||||
sipx->sipx_family = AF_IPX;
|
||||
sipx->sipx_action = IPX_DLTITF;
|
||||
sipx->sipx_network = 0L;
|
||||
sipx->sipx_type = frame_type;
|
||||
result = ioctl(sock, SIOCSIFADDR, &id);
|
||||
close(sock);
|
||||
|
||||
if (result < 0) {
|
||||
fprintf(stderr, "%s: could not delete interface\n",
|
||||
progname);
|
||||
exit(1);
|
||||
}
|
||||
if (err == ETIMEDOUT) {
|
||||
if (verbose != 0) {
|
||||
printf("no network found\n");
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
if (verbose != 0) {
|
||||
printf("found IPX network %8.8lX\n", *net);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
file_lines (char *name)
|
||||
static int file_lines(char *name)
|
||||
{
|
||||
FILE *f = fopen (name, "r");
|
||||
char buf[100];
|
||||
int lines = 0;
|
||||
FILE *f = fopen(name, "r");
|
||||
char buf[100];
|
||||
int lines = 0;
|
||||
|
||||
if (f == NULL)
|
||||
{
|
||||
return -errno;
|
||||
}
|
||||
while (fgets (buf, sizeof (buf), f) != NULL)
|
||||
{
|
||||
lines += 1;
|
||||
}
|
||||
fclose (f);
|
||||
return lines;
|
||||
if (f == NULL) {
|
||||
return -errno;
|
||||
}
|
||||
while (fgets(buf, sizeof(buf), f) != NULL) {
|
||||
lines += 1;
|
||||
}
|
||||
fclose(f);
|
||||
return lines;
|
||||
}
|
||||
|
||||
static int
|
||||
ipx_interfaces (void)
|
||||
static int ipx_interfaces(void)
|
||||
{
|
||||
int result = file_lines ("/proc/net/ipx_interface");
|
||||
if (result == 0)
|
||||
{
|
||||
result = -EIO;
|
||||
}
|
||||
return result - 1;
|
||||
int result = file_lines("/proc/net/ipx_interface");
|
||||
if (result == 0) {
|
||||
result = -EIO;
|
||||
}
|
||||
return result - 1;
|
||||
}
|
||||
|
||||
static int
|
||||
ipx_auto_off (void)
|
||||
static int ipx_auto_off(void)
|
||||
{
|
||||
int s;
|
||||
char errmsg[strlen (progname) + 20];
|
||||
int val = 0;
|
||||
int s;
|
||||
char errmsg[strlen(progname) + 20];
|
||||
int val = 0;
|
||||
|
||||
s = socket (AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (s < 0)
|
||||
{
|
||||
int old_errno = errno;
|
||||
s = socket(AF_IPX, SOCK_DGRAM, AF_IPX);
|
||||
if (s < 0) {
|
||||
int old_errno = errno;
|
||||
|
||||
sprintf (errmsg, "%s: socket", progname);
|
||||
perror (errmsg);
|
||||
if (old_errno == -EINVAL)
|
||||
{
|
||||
fprintf (stderr, "Probably you have no IPX support in "
|
||||
"your kernel\n");
|
||||
sprintf(errmsg, "%s: socket", progname);
|
||||
perror(errmsg);
|
||||
if (old_errno == -EINVAL) {
|
||||
fprintf(stderr, "Probably you have no IPX support in "
|
||||
"your kernel\n");
|
||||
}
|
||||
close(s);
|
||||
return -1;
|
||||
}
|
||||
close (s);
|
||||
return -1;
|
||||
}
|
||||
sprintf (errmsg, "%s: ioctl", progname);
|
||||
sprintf(errmsg, "%s: ioctl", progname);
|
||||
|
||||
if (ioctl (s, SIOCAIPXPRISLT, &val) < 0)
|
||||
{
|
||||
perror (errmsg);
|
||||
close (s);
|
||||
return -1;
|
||||
}
|
||||
if (ioctl (s, SIOCAIPXITFCRT, &val) < 0)
|
||||
{
|
||||
perror (errmsg);
|
||||
close (s);
|
||||
return -1;
|
||||
}
|
||||
close (s);
|
||||
return 0;
|
||||
if (ioctl(s, SIOCAIPXPRISLT, &val) < 0) {
|
||||
perror(errmsg);
|
||||
close(s);
|
||||
return -1;
|
||||
}
|
||||
if (ioctl(s, SIOCAIPXITFCRT, &val) < 0) {
|
||||
perror(errmsg);
|
||||
close(s);
|
||||
return -1;
|
||||
}
|
||||
close(s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int interfaces;
|
||||
char *interface = "eth0";
|
||||
int opt;
|
||||
int timeout = 3;
|
||||
int interfaces;
|
||||
char *interface = "eth0";
|
||||
int opt;
|
||||
int timeout = 3;
|
||||
|
||||
unsigned long network[5] =
|
||||
{0,};
|
||||
unsigned long network[5] =
|
||||
{0,};
|
||||
|
||||
progname = argv[0];
|
||||
progname = argv[0];
|
||||
|
||||
while ((opt = getopt (argc, argv, "vi:ht:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
case 'v':
|
||||
verbose = 1;
|
||||
break;
|
||||
case 'i':
|
||||
interface = optarg;
|
||||
break;
|
||||
case 't':
|
||||
timeout = atoi (optarg);
|
||||
break;
|
||||
case 'h':
|
||||
help ();
|
||||
exit (1);
|
||||
default:
|
||||
usage ();
|
||||
exit (1);
|
||||
while ((opt = getopt(argc, argv, "vi:ht:")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'v':
|
||||
verbose = 1;
|
||||
break;
|
||||
case 'i':
|
||||
interface = optarg;
|
||||
break;
|
||||
case 't':
|
||||
timeout = atoi(optarg);
|
||||
break;
|
||||
case 'h':
|
||||
help();
|
||||
exit(1);
|
||||
default:
|
||||
usage();
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ipx_auto_off () < 0)
|
||||
{
|
||||
exit (1);
|
||||
}
|
||||
interfaces = ipx_interfaces ();
|
||||
if (interfaces > 0)
|
||||
{
|
||||
fprintf (stderr, "%s must be run with no interfaces configured."
|
||||
" Found %d interface%s.\n",
|
||||
progname, interfaces,
|
||||
interfaces == 1 ? "" : "s");
|
||||
exit (1);
|
||||
}
|
||||
if (interfaces < 0)
|
||||
{
|
||||
fprintf (stderr, "%s: %s\n", progname, strerror (interfaces));
|
||||
exit (1);
|
||||
}
|
||||
probe_frame (interface, IPX_FRAME_8022, timeout, &(network[0]));
|
||||
probe_frame (interface, IPX_FRAME_8023, timeout, &(network[1]));
|
||||
probe_frame (interface, IPX_FRAME_SNAP, timeout, &(network[2]));
|
||||
probe_frame (interface, IPX_FRAME_ETHERII, timeout, &(network[3]));
|
||||
if (ipx_auto_off() < 0) {
|
||||
exit(1);
|
||||
}
|
||||
interfaces = ipx_interfaces();
|
||||
if (interfaces > 0) {
|
||||
fprintf(stderr, "%s must be run with no interfaces configured."
|
||||
" Found %d interface%s.\n",
|
||||
progname, interfaces,
|
||||
interfaces == 1 ? "" : "s");
|
||||
exit(1);
|
||||
}
|
||||
if (interfaces < 0) {
|
||||
fprintf(stderr, "%s: %s\n", progname, strerror(interfaces));
|
||||
exit(1);
|
||||
}
|
||||
probe_frame(interface, IPX_FRAME_8022, timeout, &(network[0]));
|
||||
probe_frame(interface, IPX_FRAME_8023, timeout, &(network[1]));
|
||||
probe_frame(interface, IPX_FRAME_SNAP, timeout, &(network[2]));
|
||||
probe_frame(interface, IPX_FRAME_ETHERII, timeout, &(network[3]));
|
||||
|
||||
if (verbose == 0)
|
||||
{
|
||||
if (network[0] != 0)
|
||||
{
|
||||
printf ("%s %8.8lX\n",
|
||||
frame_name (IPX_FRAME_8022), network[0]);
|
||||
if (verbose == 0) {
|
||||
if (network[0] != 0) {
|
||||
printf("%s %8.8lX\n",
|
||||
frame_name(IPX_FRAME_8022), network[0]);
|
||||
}
|
||||
if (network[1] != 0) {
|
||||
printf("%s %8.8lX\n",
|
||||
frame_name(IPX_FRAME_8023), network[1]);
|
||||
}
|
||||
if (network[2] != 0) {
|
||||
printf("%s %8.8lX\n",
|
||||
frame_name(IPX_FRAME_SNAP), network[2]);
|
||||
}
|
||||
if (network[3] != 0) {
|
||||
printf("%s %8.8lX\n",
|
||||
frame_name(IPX_FRAME_ETHERII), network[3]);
|
||||
}
|
||||
}
|
||||
if (network[1] != 0)
|
||||
{
|
||||
printf ("%s %8.8lX\n",
|
||||
frame_name (IPX_FRAME_8023), network[1]);
|
||||
}
|
||||
if (network[2] != 0)
|
||||
{
|
||||
printf ("%s %8.8lX\n",
|
||||
frame_name (IPX_FRAME_SNAP), network[2]);
|
||||
}
|
||||
if (network[3] != 0)
|
||||
{
|
||||
printf ("%s %8.8lX\n",
|
||||
frame_name (IPX_FRAME_ETHERII), network[3]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
304
util/ncopy.c
304
util/ncopy.c
@@ -23,10 +23,9 @@
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include "ncplib.h"
|
||||
#include <errno.h>
|
||||
|
||||
struct NCPMountRec
|
||||
{
|
||||
|
||||
struct NCPMountRec {
|
||||
char *mountDir;
|
||||
char *server;
|
||||
struct ncp_conn *conn;
|
||||
@@ -71,8 +70,7 @@ static struct sigaction sTermSig;
|
||||
/****************************************************************************
|
||||
*
|
||||
*/
|
||||
static void
|
||||
usage()
|
||||
static void usage()
|
||||
{
|
||||
fprintf(stderr, "usage: %s [-V]\n", ProgramName);
|
||||
fprintf(stderr, " %s [-vn] [-s amt] sourcefile destinationfile|directory\n", ProgramName);
|
||||
@@ -86,19 +84,17 @@ usage()
|
||||
* Return pointer to original string if no "/" in string. (except at end)
|
||||
*/
|
||||
static const char *
|
||||
myBaseName(const char *path)
|
||||
myBaseName(const char *path)
|
||||
{
|
||||
const char *p;
|
||||
|
||||
for (p = &path[strlen(path)]; p != path; p--)
|
||||
{ /* skip ENDING "/" chars */
|
||||
for (p = &path[strlen(path)]; p != path; p--) { /* skip ENDING "/" chars */
|
||||
if (*p && *p != '/')
|
||||
break;
|
||||
}
|
||||
if (p == path)
|
||||
return p;
|
||||
for (; p != path || *p == '/'; p--)
|
||||
{
|
||||
for (; p != path || *p == '/'; p--) {
|
||||
if (*p == '/')
|
||||
return ++p;
|
||||
}
|
||||
@@ -109,7 +105,7 @@ myBaseName(const char *path)
|
||||
*
|
||||
*/
|
||||
static const char *
|
||||
notDir(const char *path)
|
||||
notDir(const char *path)
|
||||
{
|
||||
struct stat buf;
|
||||
static const char *notDirectory = "not a directory";
|
||||
@@ -124,15 +120,12 @@ notDir(const char *path)
|
||||
/****************************************************************************
|
||||
*
|
||||
*/
|
||||
static int
|
||||
handleOptions(const int argc, char *const argv[])
|
||||
static int handleOptions(const int argc, char *const argv[])
|
||||
{
|
||||
int opt;
|
||||
|
||||
while ((opt = getopt(argc, argv, "vVns:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "vVns:")) != EOF) {
|
||||
switch (opt) {
|
||||
|
||||
case 'V': /* Version */
|
||||
optVersion = 1;
|
||||
@@ -149,8 +142,7 @@ handleOptions(const int argc, char *const argv[])
|
||||
case 's': /* Nice Factor */
|
||||
optNiceFactorSel = 1;
|
||||
optNiceFactor = atoi(optarg);
|
||||
if (optNiceFactor < 1)
|
||||
{
|
||||
if (optNiceFactor < 1) {
|
||||
fprintf(stderr, "%s: -s option requires positive numeric argument > 0\n",
|
||||
ProgramName);
|
||||
return 1;
|
||||
@@ -168,22 +160,18 @@ handleOptions(const int argc, char *const argv[])
|
||||
/****************************************************************************
|
||||
* TODO: if recursive flag last MUST be a directory, even if only 2 args.
|
||||
*/
|
||||
static int
|
||||
validateFileArgs(const int argc, char *const argv[])
|
||||
static int validateFileArgs(const int argc, char *const argv[])
|
||||
{
|
||||
const char *p;
|
||||
if (argc == 0)
|
||||
{
|
||||
if (argc == 0) {
|
||||
fprintf(stderr, "%s: No arguments specified.\n", ProgramName);
|
||||
return 1;
|
||||
}
|
||||
if (argc == 1)
|
||||
{
|
||||
if (argc == 1) {
|
||||
fprintf(stderr, "%s: No destination specified.\n", ProgramName);
|
||||
return 1;
|
||||
}
|
||||
if ((argc > 2) && (p = notDir(argv[argc - 1])))
|
||||
{ /* last arg MUST be dir */
|
||||
if ((argc > 2) && (p = notDir(argv[argc - 1]))) { /* last arg MUST be dir */
|
||||
fprintf(stderr, "%s: %s: %s\n", ProgramName, argv[argc - 1], p);
|
||||
return 1;
|
||||
}
|
||||
@@ -194,7 +182,7 @@ validateFileArgs(const int argc, char *const argv[])
|
||||
* Duplicate a string.
|
||||
*/
|
||||
char *
|
||||
duplicateStr(const char *InStr)
|
||||
duplicateStr(const char *InStr)
|
||||
{
|
||||
char *dup;
|
||||
if (!InStr)
|
||||
@@ -208,38 +196,31 @@ duplicateStr(const char *InStr)
|
||||
/****************************************************************************
|
||||
* load a table of ncpfs mount points.
|
||||
*/
|
||||
int
|
||||
loadMountTable()
|
||||
int loadMountTable()
|
||||
{
|
||||
FILE *mountedFile;
|
||||
struct mntent *mountEntry = NULL;
|
||||
ncpCount = 0;
|
||||
if ((mountedFile = fopen(MOUNTED, "r")) == NULL)
|
||||
{
|
||||
if ((mountedFile = fopen(MOUNTED, "r")) == NULL) {
|
||||
fprintf(stderr, "ncopy: cannot open %s, %s\n", MOUNTED, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
while ((mountEntry = getmntent(mountedFile)) != NULL)
|
||||
{
|
||||
while ((mountEntry = getmntent(mountedFile)) != NULL) {
|
||||
if (!strcmp(mountEntry->mnt_type, "ncpfs"))
|
||||
ncpCount++;
|
||||
}
|
||||
if (ncpCount)
|
||||
{
|
||||
if (ncpCount) {
|
||||
NcpMountTable = (struct NCPMountRec *)
|
||||
malloc(ncpCount * sizeof(struct NCPMountRec));
|
||||
if (!NcpMountTable)
|
||||
{
|
||||
if (!NcpMountTable) {
|
||||
fprintf(stderr, "Out of memory\n");
|
||||
fclose(mountedFile);
|
||||
return 1;
|
||||
}
|
||||
fseek(mountedFile, 0, SEEK_SET);
|
||||
ncpCount = 0;
|
||||
while ((mountEntry = getmntent(mountedFile)) != NULL)
|
||||
{
|
||||
if (!strcmp(mountEntry->mnt_type, "ncpfs"))
|
||||
{
|
||||
while ((mountEntry = getmntent(mountedFile)) != NULL) {
|
||||
if (!strcmp(mountEntry->mnt_type, "ncpfs")) {
|
||||
NcpMountTable[ncpCount].mountDir = duplicateStr(mountEntry->mnt_dir);
|
||||
NcpMountTable[ncpCount].server =
|
||||
duplicateStr(mountEntry->mnt_fsname);
|
||||
@@ -255,16 +236,13 @@ loadMountTable()
|
||||
/****************************************************************************
|
||||
* Releases the table of ncpfs mount points.
|
||||
*/
|
||||
void
|
||||
releaseMountTable()
|
||||
void releaseMountTable()
|
||||
{
|
||||
int loop;
|
||||
if (!ncpCount)
|
||||
return;
|
||||
for (loop = ncpCount; loop; loop--, ncpCount--)
|
||||
{
|
||||
if (NcpMountTable[loop - 1].conn)
|
||||
{
|
||||
for (loop = ncpCount; loop; loop--, ncpCount--) {
|
||||
if (NcpMountTable[loop - 1].conn) {
|
||||
ncp_close(NcpMountTable[loop - 1].conn);
|
||||
NcpMountTable[loop - 1].conn = NULL;
|
||||
}
|
||||
@@ -279,16 +257,14 @@ releaseMountTable()
|
||||
* the file.
|
||||
* Returns -1 if the files do not reference the same server.
|
||||
*/
|
||||
int
|
||||
ncpIndex(const char *InputFile, const char *OutputFile)
|
||||
int ncpIndex(const char *InputFile, const char *OutputFile)
|
||||
{
|
||||
int loop;
|
||||
char *mountDir;
|
||||
if (!ncpCount)
|
||||
return -1;
|
||||
|
||||
for (loop = 0; loop < ncpCount; loop++)
|
||||
{
|
||||
for (loop = 0; loop < ncpCount; loop++) {
|
||||
mountDir = NcpMountTable[loop].mountDir;
|
||||
if (!strncmp(mountDir, InputFile, strlen(mountDir)) &&
|
||||
!strncmp(mountDir, OutputFile, strlen(mountDir)))
|
||||
@@ -302,46 +278,40 @@ ncpIndex(const char *InputFile, const char *OutputFile)
|
||||
* Does a regular buffered file copy.
|
||||
* This is used if we cannot use the Netware file copy.
|
||||
*/
|
||||
int
|
||||
normalFileCopy(const char *InputFile, const char *OutputFile,
|
||||
char *Buffer, int BufferSize,
|
||||
const char *paramInputFile,
|
||||
const char *paramOutputFile)
|
||||
int normalFileCopy(const char *InputFile, const char *OutputFile,
|
||||
char *Buffer, int BufferSize,
|
||||
const char *paramInputFile,
|
||||
const char *paramOutputFile)
|
||||
{
|
||||
int fdIn, fdOut;
|
||||
long fileSize, totalSize;
|
||||
struct stat statBuf;
|
||||
fdIn = open(InputFile, O_RDONLY);
|
||||
if (fdIn == -1)
|
||||
{
|
||||
if (fdIn == -1) {
|
||||
fprintf(stderr, "%s: Cannot open %s, %s\n", ProgramName, paramInputFile,
|
||||
strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
if (fstat(fdIn, &statBuf))
|
||||
{
|
||||
if (fstat(fdIn, &statBuf)) {
|
||||
fprintf(stderr, "%s: Cannot stat %s, %s\n", ProgramName, paramInputFile,
|
||||
strerror(errno));
|
||||
close(fdIn);
|
||||
return 1;
|
||||
}
|
||||
if (S_ISDIR(statBuf.st_mode))
|
||||
{
|
||||
if (S_ISDIR(statBuf.st_mode)) {
|
||||
close(fdIn);
|
||||
fprintf(stderr, "%s: %s: omitting directory\n", ProgramName, paramInputFile);
|
||||
return 0; /* At this point, don't consider this a fatal error */
|
||||
}
|
||||
fdOut = open(OutputFile, O_CREAT | O_TRUNC | O_WRONLY, statBuf.st_mode);
|
||||
if (fdOut == -1)
|
||||
{
|
||||
if (fdOut == -1) {
|
||||
fprintf(stderr, "%s: Cannot create %s, %s\n", ProgramName, paramOutputFile,
|
||||
strerror(errno));
|
||||
close(fdIn);
|
||||
return 1;
|
||||
}
|
||||
fileSize = lseek(fdIn, 0, SEEK_END);
|
||||
if (fileSize < 0)
|
||||
{
|
||||
if (fileSize < 0) {
|
||||
fprintf(stderr, "%s: lseek error on %s, %s\n", ProgramName, paramInputFile,
|
||||
strerror(errno));
|
||||
close(fdOut);
|
||||
@@ -349,19 +319,16 @@ normalFileCopy(const char *InputFile, const char *OutputFile,
|
||||
return 1;
|
||||
}
|
||||
lseek(fdIn, 0, SEEK_SET);
|
||||
if (optVerbose)
|
||||
{
|
||||
if (optVerbose) {
|
||||
printf("Normal copy: %s -> %s 0%%", paramInputFile, paramOutputFile);
|
||||
fflush(stdout);
|
||||
}
|
||||
totalSize = fileSize;
|
||||
while (fileSize)
|
||||
{
|
||||
while (fileSize) {
|
||||
int currentMove;
|
||||
int writeAmt;
|
||||
currentMove = (fileSize > BufferSize) ? BufferSize : fileSize;
|
||||
if (read(fdIn, Buffer, currentMove) != currentMove)
|
||||
{
|
||||
if (read(fdIn, Buffer, currentMove) != currentMove) {
|
||||
fprintf(stderr, "%s: Error reading %s, %s\n", ProgramName, paramInputFile,
|
||||
strerror(errno));
|
||||
close(fdIn);
|
||||
@@ -369,15 +336,13 @@ normalFileCopy(const char *InputFile, const char *OutputFile,
|
||||
return 1;
|
||||
}
|
||||
writeAmt = write(fdOut, Buffer, currentMove);
|
||||
if (writeAmt < 0)
|
||||
{
|
||||
if (writeAmt < 0) {
|
||||
fprintf(stderr, "%s: Error writing %s, %s\n", ProgramName, paramOutputFile,
|
||||
strerror(errno));
|
||||
close(fdIn);
|
||||
close(fdOut);
|
||||
return 1;
|
||||
} else if (writeAmt == 0)
|
||||
{
|
||||
} else if (writeAmt == 0) {
|
||||
fprintf(stderr, "%s: Out of space on destination device writing %s\n",
|
||||
ProgramName, OutputFile);
|
||||
close(fdIn);
|
||||
@@ -385,8 +350,7 @@ normalFileCopy(const char *InputFile, const char *OutputFile,
|
||||
return 1;
|
||||
}
|
||||
fileSize -= currentMove;
|
||||
if (optVerbose)
|
||||
{
|
||||
if (optVerbose) {
|
||||
printf("\rNormal copy: %s -> %s %ld%%", paramInputFile, paramOutputFile, (100 - (fileSize * 100 / totalSize)));
|
||||
fflush(stdout);
|
||||
}
|
||||
@@ -403,11 +367,10 @@ normalFileCopy(const char *InputFile, const char *OutputFile,
|
||||
* Netware file names need to be all upper case.
|
||||
*/
|
||||
char *
|
||||
upString(char *str)
|
||||
upString(char *str)
|
||||
{
|
||||
char *alias = str;
|
||||
while (*alias)
|
||||
{
|
||||
while (*alias) {
|
||||
*alias = toupper(*alias);
|
||||
++alias;
|
||||
}
|
||||
@@ -418,12 +381,10 @@ upString(char *str)
|
||||
* Locates the first occurrance of a single character in the input string.
|
||||
* returns -1 if the character is not found.
|
||||
*/
|
||||
int
|
||||
stringPosition(const char *str, char token)
|
||||
int stringPosition(const char *str, char token)
|
||||
{
|
||||
const char *alias = str;
|
||||
while (*alias)
|
||||
{
|
||||
while (*alias) {
|
||||
if (*alias == token)
|
||||
return alias - str;
|
||||
alias++;
|
||||
@@ -437,8 +398,7 @@ stringPosition(const char *str, char token)
|
||||
* This will mangle the input "FileString", leaving just the file name
|
||||
* component in it when it is finished.
|
||||
*/
|
||||
int
|
||||
getDirHandle(struct ncp_conn *conn, char *FileString, __u8 * NewDirHandle)
|
||||
int getDirHandle(struct ncp_conn *conn, char *FileString, __u8 * NewDirHandle)
|
||||
{
|
||||
struct nw_info_struct info1, info2;
|
||||
int currentLevel = 0;
|
||||
@@ -446,25 +406,20 @@ getDirHandle(struct ncp_conn *conn, char *FileString, __u8 * NewDirHandle)
|
||||
struct nw_info_struct *parentInfo = NULL;
|
||||
struct nw_info_struct *currentInfo = NULL;
|
||||
|
||||
while ((k = stringPosition(FileString, '/')) >= 0)
|
||||
{
|
||||
while ((k = stringPosition(FileString, '/')) >= 0) {
|
||||
FileString[k] = 0;
|
||||
if (!currentLevel)
|
||||
{
|
||||
if (!currentLevel) {
|
||||
parentInfo = NULL;
|
||||
currentInfo = &info1;
|
||||
} else if (currentLevel % 2)
|
||||
{
|
||||
} else if (currentLevel % 2) {
|
||||
parentInfo = &info1;
|
||||
currentInfo = &info2;
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
parentInfo = &info2;
|
||||
currentInfo = &info1;
|
||||
}
|
||||
if (ncp_do_lookup(conn, parentInfo, FileString,
|
||||
currentInfo) != 0)
|
||||
{
|
||||
currentInfo) != 0) {
|
||||
fprintf(stderr, "%s: Ncp lookup failed on directory %s--%s\n",
|
||||
ProgramName, FileString, strerror(errno));
|
||||
return 1;
|
||||
@@ -474,8 +429,7 @@ getDirHandle(struct ncp_conn *conn, char *FileString, __u8 * NewDirHandle)
|
||||
}
|
||||
|
||||
if (ncp_alloc_short_dir_handle(conn, currentInfo, NCP_ALLOC_TEMPORARY,
|
||||
NewDirHandle) != 0)
|
||||
{
|
||||
NewDirHandle) != 0) {
|
||||
fprintf(stderr, "%s: Ncp alloc dir handle failed--%s\n",
|
||||
ProgramName, strerror(errno));
|
||||
return 1;
|
||||
@@ -487,11 +441,10 @@ getDirHandle(struct ncp_conn *conn, char *FileString, __u8 * NewDirHandle)
|
||||
/****************************************************************************
|
||||
* Interfaces with the ncplib to do the netware copy of the file.
|
||||
*/
|
||||
int
|
||||
netwareCopyFile(int ncpMountIndex, const char *sourcefile,
|
||||
const char *destfile,
|
||||
const char *paramInputFile,
|
||||
const char *paramOutputFile)
|
||||
int netwareCopyFile(int ncpMountIndex, const char *sourcefile,
|
||||
const char *destfile,
|
||||
const char *paramInputFile,
|
||||
const char *paramOutputFile)
|
||||
{
|
||||
__u8 source_dir_handle;
|
||||
__u8 dest_dir_handle;
|
||||
@@ -512,12 +465,10 @@ netwareCopyFile(int ncpMountIndex, const char *sourcefile,
|
||||
|
||||
/* Establish a connection to a Netware mount point if
|
||||
one is not already established. */
|
||||
if (!NcpMountTable[ncpMountIndex].conn)
|
||||
{
|
||||
if (!NcpMountTable[ncpMountIndex].conn) {
|
||||
NcpMountTable[ncpMountIndex].conn =
|
||||
ncp_open_mount(NcpMountTable[ncpMountIndex].mountDir, &err);
|
||||
if (err)
|
||||
{
|
||||
if (err) {
|
||||
com_err(ProgramName, err, "opening ncp connection on mount point %s",
|
||||
NcpMountTable[ncpMountIndex].mountDir);
|
||||
return 2;
|
||||
@@ -530,8 +481,7 @@ netwareCopyFile(int ncpMountIndex, const char *sourcefile,
|
||||
stroffset = strlen(NcpMountTable[ncpMountIndex].mountDir) + 1;
|
||||
sourceDup = duplicateStr(sourcefile + stroffset);
|
||||
destDup = duplicateStr(destfile + stroffset);
|
||||
if (!sourceDup || !destDup)
|
||||
{
|
||||
if (!sourceDup || !destDup) {
|
||||
fprintf(stderr, "%s: Malloc failed duplicating file names\n",
|
||||
ProgramName);
|
||||
return 2;
|
||||
@@ -541,16 +491,14 @@ netwareCopyFile(int ncpMountIndex, const char *sourcefile,
|
||||
|
||||
/* Get Handles to the input and output directories */
|
||||
if (getDirHandle(sourceconn, sourceDup, &source_dir_handle) ||
|
||||
getDirHandle(sourceconn, destDup, &dest_dir_handle))
|
||||
{
|
||||
getDirHandle(sourceconn, destDup, &dest_dir_handle)) {
|
||||
free(sourceDup);
|
||||
free(destDup);
|
||||
return 1;
|
||||
}
|
||||
/* Open the input and output files. */
|
||||
if (ncp_open_file(sourceconn, source_dir_handle, sourceDup, 0, AR_READ,
|
||||
&source_file) != 0)
|
||||
{
|
||||
&source_file) != 0) {
|
||||
fprintf(stderr, "%s: Cannot open %s--%s\n",
|
||||
ProgramName, paramInputFile, strerror(errno));
|
||||
free(sourceDup);
|
||||
@@ -558,8 +506,7 @@ netwareCopyFile(int ncpMountIndex, const char *sourcefile,
|
||||
return 1;
|
||||
}
|
||||
if (ncp_create_file(sourceconn, dest_dir_handle, destDup,
|
||||
source_file.file_attributes, &dest_file) != 0)
|
||||
{
|
||||
source_file.file_attributes, &dest_file) != 0) {
|
||||
fprintf(stderr, "%s: Cannot create %s--%s\n", ProgramName, paramOutputFile,
|
||||
strerror(errno));
|
||||
ncp_close_file(sourceconn, source_file.file_id);
|
||||
@@ -576,8 +523,7 @@ netwareCopyFile(int ncpMountIndex, const char *sourcefile,
|
||||
free(destDup);
|
||||
|
||||
retValue = 0;
|
||||
if (optVerbose)
|
||||
{
|
||||
if (optVerbose) {
|
||||
printf("NetWare copy: %s -> %s 0%%", paramInputFile, paramOutputFile);
|
||||
fflush(stdout);
|
||||
}
|
||||
@@ -587,28 +533,24 @@ netwareCopyFile(int ncpMountIndex, const char *sourcefile,
|
||||
sourceOff = 0;
|
||||
retryCount = 0;
|
||||
|
||||
while (amtLeft && retryCount < MaxNcopyRetries)
|
||||
{
|
||||
while (amtLeft && retryCount < MaxNcopyRetries) {
|
||||
int ncopyRetValue;
|
||||
if (amtLeft > CopyBlockSize)
|
||||
thisMove = CopyBlockSize;
|
||||
else
|
||||
thisMove = amtLeft;
|
||||
/* If we are being nice and we've copied enough blocks, go to sleep */
|
||||
if (optNice)
|
||||
{
|
||||
if (BlocksCopied == optNiceFactor)
|
||||
{
|
||||
if (optNice) {
|
||||
if (BlocksCopied == optNiceFactor) {
|
||||
sleep(NiceSleepTime);
|
||||
BlocksCopied = 0;
|
||||
} else
|
||||
++BlocksCopied;
|
||||
}
|
||||
ncopyRetValue = ncp_copy_file(sourceconn, source_file.file_id,
|
||||
dest_file.file_id, sourceOff, sourceOff,
|
||||
dest_file.file_id, sourceOff, sourceOff,
|
||||
thisMove, &amountCopied);
|
||||
if (ncopyRetValue != 0)
|
||||
{
|
||||
if (ncopyRetValue != 0) {
|
||||
/* In my testing this only happens when you run out of space
|
||||
on the server.
|
||||
Netware seems to wait a bit before reporting space recently
|
||||
@@ -617,8 +559,7 @@ netwareCopyFile(int ncpMountIndex, const char *sourcefile,
|
||||
retryCount++;
|
||||
amountCopied = thisMove = 0;
|
||||
}
|
||||
if (amountCopied != thisMove)
|
||||
{
|
||||
if (amountCopied != thisMove) {
|
||||
fprintf(stderr, "%s: Warning, amountCopied (%u) != thisMove (%u)\n",
|
||||
ProgramName, (unsigned int) amountCopied, (unsigned int) thisMove);
|
||||
}
|
||||
@@ -628,8 +569,7 @@ netwareCopyFile(int ncpMountIndex, const char *sourcefile,
|
||||
#endif
|
||||
amtLeft -= amountCopied;
|
||||
sourceOff += amountCopied;
|
||||
if (optVerbose)
|
||||
{
|
||||
if (optVerbose) {
|
||||
printf("\rNetWare copy: %s -> %s %ld%%", paramInputFile, paramOutputFile,
|
||||
(100 - (long) ((float) amtLeft / (float) totalSize * 100.0)));
|
||||
if (retryCount)
|
||||
@@ -641,8 +581,7 @@ netwareCopyFile(int ncpMountIndex, const char *sourcefile,
|
||||
retValue = 1;
|
||||
if (optVerbose)
|
||||
printf("\n");
|
||||
if (ncp_close_file(sourceconn, dest_file.file_id) != 0)
|
||||
{
|
||||
if (ncp_close_file(sourceconn, dest_file.file_id) != 0) {
|
||||
fprintf(stderr, "%s: Close failed for %s\n", ProgramName, paramOutputFile);
|
||||
retValue = 1;
|
||||
}
|
||||
@@ -651,19 +590,16 @@ netwareCopyFile(int ncpMountIndex, const char *sourcefile,
|
||||
CurrentConn = NULL;
|
||||
CurrentFile = NULL;
|
||||
|
||||
if (ncp_close_file(sourceconn, source_file.file_id) != 0)
|
||||
{
|
||||
if (ncp_close_file(sourceconn, source_file.file_id) != 0) {
|
||||
fprintf(stderr, "%s: Close failed for %s\n", ProgramName, paramInputFile);
|
||||
retValue = 1;
|
||||
}
|
||||
if (ncp_dealloc_dir_handle(sourceconn, dest_dir_handle) != 0)
|
||||
{
|
||||
if (ncp_dealloc_dir_handle(sourceconn, dest_dir_handle) != 0) {
|
||||
fprintf(stderr, "%s: Dealloc dir handle error for %s\n", ProgramName,
|
||||
paramOutputFile);
|
||||
retValue = 1;
|
||||
}
|
||||
if (ncp_dealloc_dir_handle(sourceconn, source_dir_handle) != 0)
|
||||
{
|
||||
if (ncp_dealloc_dir_handle(sourceconn, source_dir_handle) != 0) {
|
||||
fprintf(stderr, "%s: Dealloc dir handle error for %s\n", ProgramName,
|
||||
paramInputFile);
|
||||
retValue = 1;
|
||||
@@ -676,9 +612,8 @@ netwareCopyFile(int ncpMountIndex, const char *sourcefile,
|
||||
* Decides whether to use the traditional file copy or the netware remote
|
||||
* file copy.
|
||||
*/
|
||||
int
|
||||
copyFiles(const char *realsource, const char *realdestination,
|
||||
const char *paraminputfile, const char *paramoutputfile)
|
||||
int copyFiles(const char *realsource, const char *realdestination,
|
||||
const char *paraminputfile, const char *paramoutputfile)
|
||||
{
|
||||
int oldUMask;
|
||||
char fileBuffer[24000];
|
||||
@@ -688,7 +623,7 @@ copyFiles(const char *realsource, const char *realdestination,
|
||||
printf("Real Source '%s'\n"
|
||||
"Real Dest '%s'\n"
|
||||
"Param Src '%s'\n"
|
||||
"Param Dest '%s'\n", realsource, realdestination, paraminputfile,
|
||||
"Param Dest '%s'\n", realsource, realdestination, paraminputfile,
|
||||
paramoutputfile);
|
||||
#endif
|
||||
|
||||
@@ -722,8 +657,7 @@ copyFiles(const char *realsource, const char *realdestination,
|
||||
* Is it failure if destination fails?
|
||||
* Do we Stay in the loop?
|
||||
*/
|
||||
static int
|
||||
copyRealPaths(const char *source, const char *destination)
|
||||
static int copyRealPaths(const char *source, const char *destination)
|
||||
{
|
||||
char realsource[MAXPATHLEN * 2];
|
||||
char realdestination[MAXPATHLEN * 2];
|
||||
@@ -731,21 +665,18 @@ copyRealPaths(const char *source, const char *destination)
|
||||
char filePart[MAXPATHLEN + 1];
|
||||
const char *p;
|
||||
|
||||
if (realpath(source, realsource) == 0)
|
||||
{ /* the source must at least exist */
|
||||
if (realpath(source, realsource) == 0) { /* the source must at least exist */
|
||||
fprintf(stderr, "%s: %s: %s\n",
|
||||
ProgramName, source, strerror(errno));
|
||||
return 1; /* indicate a "source" problem */
|
||||
}
|
||||
if (realpath(destination, realdestination) == 0)
|
||||
{ /* dest file missing? OK */
|
||||
if (realpath(destination, realdestination) == 0) { /* dest file missing? OK */
|
||||
strncpy(dirPart, destination, MAXPATHLEN); /* but "dirpart" must work */
|
||||
dirPart[MAXPATHLEN] = 0;
|
||||
p = myBaseName(dirPart);
|
||||
strcpy(filePart, p);
|
||||
dirPart[p - dirPart] = 0; /* isolates "directory" part from "file part" */
|
||||
if (realpath(dirPart, realdestination) == 0)
|
||||
{
|
||||
if (realpath(dirPart, realdestination) == 0) {
|
||||
fprintf(stderr, "%s: %s: %s\n",
|
||||
ProgramName, dirPart, strerror(errno));
|
||||
return 2; /* indicate a "destination" problem */
|
||||
@@ -770,8 +701,7 @@ copyRealPaths(const char *source, const char *destination)
|
||||
* if argc > 2 last parameter is a directory
|
||||
* by validateFileArgs()
|
||||
*/
|
||||
static int
|
||||
handleFileArgs(int argc, char *const argv[])
|
||||
static int handleFileArgs(int argc, char *const argv[])
|
||||
{
|
||||
int loop;
|
||||
const char *destination;
|
||||
@@ -781,12 +711,10 @@ handleFileArgs(int argc, char *const argv[])
|
||||
char destinationfile[MAXPATHLEN * 2];
|
||||
|
||||
destination = argv[argc - 1]; /* get LAST argument */
|
||||
for (loop = 0; loop < (argc - 1); loop++)
|
||||
{ /* all file arguments, but last */
|
||||
for (loop = 0; loop < (argc - 1); loop++) { /* all file arguments, but last */
|
||||
strncpy(destinationfile, destination, MAXPATHLEN);
|
||||
destinationfile[MAXPATHLEN] = 0;
|
||||
if ((argc > 2) || (!notDir(argv[argc - 1])))
|
||||
{ /* destination is a dir */
|
||||
if ((argc > 2) || (!notDir(argv[argc - 1]))) { /* destination is a dir */
|
||||
if (*destinationfile != '/' || *(destinationfile + 1))
|
||||
strcat(destinationfile, "/");
|
||||
baseNamePtr = myBaseName(argv[loop]); /* get the file name */
|
||||
@@ -803,48 +731,41 @@ handleFileArgs(int argc, char *const argv[])
|
||||
/****************************************************************************
|
||||
*
|
||||
*/
|
||||
static void
|
||||
handleSignals(int sigNumber)
|
||||
static void handleSignals(int sigNumber)
|
||||
{
|
||||
/* Ignore Signal Handling while cleaning up */
|
||||
|
||||
/* SIGHUP */
|
||||
sHangupSig.sa_handler = SIG_IGN;
|
||||
if (sigaction(SIGHUP, &sHangupSig, NULL) == -1)
|
||||
{
|
||||
if (sigaction(SIGHUP, &sHangupSig, NULL) == -1) {
|
||||
fprintf(stderr, "%s: Reset to ignore SIGHUP signal failed: %s",
|
||||
ProgramName, strerror(errno));
|
||||
}
|
||||
/* SIGINT */
|
||||
sInterruptSig.sa_handler = SIG_IGN;
|
||||
if (sigaction(SIGINT, &sInterruptSig, NULL) == -1)
|
||||
{
|
||||
if (sigaction(SIGINT, &sInterruptSig, NULL) == -1) {
|
||||
fprintf(stderr, "%s: Reset to ignore SIGINT signal failed: %s",
|
||||
ProgramName, strerror(errno));
|
||||
}
|
||||
/* SIGQUIT */
|
||||
sQuitSig.sa_handler = SIG_IGN;
|
||||
if (sigaction(SIGQUIT, &sQuitSig, NULL) == -1)
|
||||
{
|
||||
if (sigaction(SIGQUIT, &sQuitSig, NULL) == -1) {
|
||||
fprintf(stderr, "%s: Reset to ignore SIGQUIT signal failed: %s",
|
||||
ProgramName, strerror(errno));
|
||||
}
|
||||
/* SIGTERM */
|
||||
sTermSig.sa_handler = SIG_IGN;
|
||||
if (sigaction(SIGTERM, &sTermSig, NULL) == -1)
|
||||
{
|
||||
if (sigaction(SIGTERM, &sTermSig, NULL) == -1) {
|
||||
fprintf(stderr, "%s: Reset to ignore SIGTERM signal failed: %s",
|
||||
ProgramName, strerror(errno));
|
||||
}
|
||||
/* If we don't close the ncp output file, we have to ncpumount and
|
||||
ncpmount before we can get rid of it. */
|
||||
if (OutputOpen)
|
||||
{
|
||||
if (OutputOpen) {
|
||||
/* Issue a warning if we cannot close the file */
|
||||
/* If an error occurs we probably have to umount/mount to
|
||||
remove the file */
|
||||
if (ncp_close_file(CurrentConn, CurrentFile->file_id) != 0)
|
||||
{
|
||||
if (ncp_close_file(CurrentConn, CurrentFile->file_id) != 0) {
|
||||
fprintf(stderr, "%s: unclean close of output file", ProgramName);
|
||||
}
|
||||
OutputOpen = 0;
|
||||
@@ -855,57 +776,48 @@ handleSignals(int sigNumber)
|
||||
/****************************************************************************
|
||||
* We'll trap Hangup, Interrupt, Quit or Terminate
|
||||
*/
|
||||
static int
|
||||
trapSignals()
|
||||
static int trapSignals()
|
||||
{
|
||||
if (sigaction(SIGHUP, NULL, &sHangupSig))
|
||||
{ /* init structure fields */
|
||||
if (sigaction(SIGHUP, NULL, &sHangupSig)) { /* init structure fields */
|
||||
fprintf(stderr, "%s: Get HANGUP signal action failed: %s",
|
||||
ProgramName, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
sHangupSig.sa_handler = handleSignals;
|
||||
if (sigaction(SIGHUP, &sHangupSig, NULL) == -1)
|
||||
{
|
||||
if (sigaction(SIGHUP, &sHangupSig, NULL) == -1) {
|
||||
fprintf(stderr, "%s: Reset HANGUP signal action failed: %s",
|
||||
ProgramName, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
if (sigaction(SIGINT, NULL, &sInterruptSig))
|
||||
{ /* init structure fields */
|
||||
if (sigaction(SIGINT, NULL, &sInterruptSig)) { /* init structure fields */
|
||||
fprintf(stderr, "%s: Get INTERRUPT signal action failed: %s",
|
||||
ProgramName, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
sInterruptSig.sa_handler = handleSignals;
|
||||
if (sigaction(SIGINT, &sInterruptSig, NULL) == -1)
|
||||
{
|
||||
if (sigaction(SIGINT, &sInterruptSig, NULL) == -1) {
|
||||
fprintf(stderr, "%s: Reset INTERRUPT signal action failed: %s",
|
||||
ProgramName, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
if (sigaction(SIGQUIT, NULL, &sQuitSig))
|
||||
{ /* init structure fields */
|
||||
if (sigaction(SIGQUIT, NULL, &sQuitSig)) { /* init structure fields */
|
||||
fprintf(stderr, "%s: Get QUIT signal action failed: %s",
|
||||
ProgramName, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
sQuitSig.sa_handler = handleSignals;
|
||||
if (sigaction(SIGQUIT, &sQuitSig, NULL) == -1)
|
||||
{
|
||||
if (sigaction(SIGQUIT, &sQuitSig, NULL) == -1) {
|
||||
fprintf(stderr, "%s: Reset QUIT signal action failed: %s",
|
||||
ProgramName, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
if (sigaction(SIGTERM, NULL, &sTermSig))
|
||||
{ /* init structure fields */
|
||||
if (sigaction(SIGTERM, NULL, &sTermSig)) { /* init structure fields */
|
||||
fprintf(stderr, "%s: Get TERMINATE signal action failed: %s",
|
||||
ProgramName, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
sTermSig.sa_handler = handleSignals;
|
||||
if (sigaction(SIGTERM, &sTermSig, NULL) == -1)
|
||||
{
|
||||
if (sigaction(SIGTERM, &sTermSig, NULL) == -1) {
|
||||
fprintf(stderr, "%s: Reset TERMINATE signal action failed: %s",
|
||||
ProgramName, strerror(errno));
|
||||
return 1;
|
||||
@@ -916,24 +828,20 @@ trapSignals()
|
||||
/****************************************************************************
|
||||
*
|
||||
*/
|
||||
int
|
||||
main(int argc, char *const argv[])
|
||||
int main(int argc, char *const argv[])
|
||||
{
|
||||
int returnCode;
|
||||
ProgramName = argv[0];
|
||||
|
||||
if (handleOptions(argc, argv))
|
||||
{ /* bad option, missing option parameter */
|
||||
if (handleOptions(argc, argv)) { /* bad option, missing option parameter */
|
||||
usage();
|
||||
return 1;
|
||||
}
|
||||
if (optVersion)
|
||||
{ /* only option not requiring any arguments */
|
||||
if (optVersion) { /* only option not requiring any arguments */
|
||||
printf("%s version %s\n", ProgramName, VersionStr);
|
||||
return 0;
|
||||
}
|
||||
if (validateFileArgs(argc - optind, argv + optind))
|
||||
{
|
||||
if (validateFileArgs(argc - optind, argv + optind)) {
|
||||
usage();
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
/*
|
||||
* ncptest.c
|
||||
*
|
||||
@@ -19,7 +20,7 @@
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
/* #include <sys/wait.h> *//* generates a warning here */
|
||||
/* #include <sys/wait.h> *//* generates a warning here */
|
||||
extern pid_t waitpid(pid_t, int *, int);
|
||||
#include <sys/errno.h>
|
||||
#include <unistd.h>
|
||||
@@ -29,16 +30,16 @@ extern pid_t waitpid(pid_t, int *, int);
|
||||
#include <stdlib.h>
|
||||
#include <sys/mount.h>
|
||||
#include <mntent.h>
|
||||
#include "kernel/ipx.h"
|
||||
#include <linux/ipx.h>
|
||||
|
||||
#include "kernel/fs.h"
|
||||
#include "kernel/ncp.h"
|
||||
#include "kernel/ncp_fs.h"
|
||||
#include <linux/fs.h>
|
||||
#include <linux/ncp.h>
|
||||
#include <linux/ncp_fs.h>
|
||||
#include <linux/ncp_mount.h>
|
||||
#include "ncplib.h"
|
||||
|
||||
|
||||
void
|
||||
test_connlist(struct ncp_conn *conn)
|
||||
void test_connlist(struct ncp_conn *conn)
|
||||
{
|
||||
__u8 conn_list[256] =
|
||||
{0,};
|
||||
@@ -49,110 +50,92 @@ test_connlist(struct ncp_conn *conn)
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
test_send(struct ncp_conn *conn)
|
||||
void test_send(struct ncp_conn *conn)
|
||||
{
|
||||
__u8 conn_list[256] =
|
||||
{0,};
|
||||
int no;
|
||||
|
||||
if (ncp_get_connlist(conn, NCP_BINDERY_USER, "ME", &no,
|
||||
conn_list) != 0)
|
||||
{
|
||||
conn_list) != 0) {
|
||||
no = 0;
|
||||
}
|
||||
if (no > 0)
|
||||
{
|
||||
if (no > 0) {
|
||||
ncp_send_broadcast(conn, no, conn_list, "Hallo");
|
||||
}
|
||||
return;
|
||||
}
|
||||
void
|
||||
test_create(struct ncp_conn *conn)
|
||||
void test_create(struct ncp_conn *conn)
|
||||
{
|
||||
struct nw_info_struct sys;
|
||||
struct nw_info_struct me;
|
||||
__u8 dir_handle;
|
||||
struct ncp_file_info new_file;
|
||||
|
||||
if (ncp_do_lookup(conn, NULL, "SYS", &sys) != 0)
|
||||
{
|
||||
if (ncp_do_lookup(conn, NULL, "SYS", &sys) != 0) {
|
||||
printf("lookup error\n");
|
||||
return;
|
||||
}
|
||||
if (ncp_do_lookup(conn, &sys, "ME", &me) != 0)
|
||||
{
|
||||
if (ncp_do_lookup(conn, &sys, "ME", &me) != 0) {
|
||||
printf("lookup public error\n");
|
||||
return;
|
||||
}
|
||||
if (ncp_alloc_short_dir_handle(conn, &me, NCP_ALLOC_TEMPORARY,
|
||||
&dir_handle) != 0)
|
||||
{
|
||||
&dir_handle) != 0) {
|
||||
printf("alloc_dir_handle error\n");
|
||||
return;
|
||||
}
|
||||
if (ncp_create_file(conn, dir_handle, "BLUB.TXT", 0,
|
||||
&new_file) != 0)
|
||||
{
|
||||
&new_file) != 0) {
|
||||
printf("create error\n");
|
||||
return;
|
||||
}
|
||||
if (ncp_dealloc_dir_handle(conn, dir_handle) != 0)
|
||||
{
|
||||
if (ncp_dealloc_dir_handle(conn, dir_handle) != 0) {
|
||||
printf("dealloc error\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
test_change(struct ncp_conn *conn)
|
||||
int test_change(struct ncp_conn *conn)
|
||||
{
|
||||
long result;
|
||||
unsigned char ncp_key[8];
|
||||
struct ncp_bindery_object user;
|
||||
|
||||
if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0)
|
||||
{
|
||||
if ((result = ncp_get_encryption_key(conn, ncp_key)) != 0) {
|
||||
return result;
|
||||
}
|
||||
if ((result = ncp_get_bindery_object_id(conn, 1,
|
||||
"ME", &user)) != 0)
|
||||
{
|
||||
"ME", &user)) != 0) {
|
||||
return result;
|
||||
}
|
||||
if ((result = ncp_change_login_passwd(conn, &user, ncp_key,
|
||||
"MEE", "ME")) != 0)
|
||||
{
|
||||
"MEE", "ME")) != 0) {
|
||||
return result;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
test_readdir(struct ncp_conn *conn)
|
||||
void test_readdir(struct ncp_conn *conn)
|
||||
{
|
||||
struct nw_info_struct sys;
|
||||
struct nw_info_struct blub;
|
||||
struct ncp_search_seq seq;
|
||||
struct nw_info_struct entry;
|
||||
|
||||
if (ncp_do_lookup(conn, NULL, "SYS", &sys) != 0)
|
||||
{
|
||||
if (ncp_do_lookup(conn, NULL, "SYS", &sys) != 0) {
|
||||
printf("lookup error\n");
|
||||
return;
|
||||
}
|
||||
if (ncp_do_lookup(conn, &sys, "BLUB", &blub) != 0)
|
||||
{
|
||||
if (ncp_do_lookup(conn, &sys, "BLUB", &blub) != 0) {
|
||||
printf("lookup blub error\n");
|
||||
return;
|
||||
}
|
||||
if (ncp_initialize_search(conn, &sys, 0, &seq) != 0)
|
||||
{
|
||||
if (ncp_initialize_search(conn, &sys, 0, &seq) != 0) {
|
||||
printf("init error\n");
|
||||
return;
|
||||
}
|
||||
while (ncp_search_for_file_or_subdir(conn, &seq, &entry) == 0)
|
||||
{
|
||||
while (ncp_search_for_file_or_subdir(conn, &seq, &entry) == 0) {
|
||||
struct nw_info_struct nfs;
|
||||
printf("found: %s\n", entry.entryName);
|
||||
if (ncp_obtain_file_or_subdir_info(conn, NW_NS_DOS, NW_NS_NFS,
|
||||
@@ -160,8 +143,7 @@ test_readdir(struct ncp_conn *conn)
|
||||
entry.volNumber,
|
||||
entry.DosDirNum,
|
||||
NULL,
|
||||
&nfs) == 0)
|
||||
{
|
||||
&nfs) == 0) {
|
||||
printf("nfs name: %s\n", nfs.entryName);
|
||||
}
|
||||
if (ncp_obtain_file_or_subdir_info(conn, NW_NS_DOS, NW_NS_OS2,
|
||||
@@ -169,35 +151,30 @@ test_readdir(struct ncp_conn *conn)
|
||||
entry.volNumber,
|
||||
entry.DosDirNum,
|
||||
NULL,
|
||||
&nfs) == 0)
|
||||
{
|
||||
&nfs) == 0) {
|
||||
printf("os2 name: %s\n", nfs.entryName);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
test_rights(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)
|
||||
{
|
||||
if (ncp_do_lookup(conn, NULL, "SYS", &sys) != 0) {
|
||||
printf("lookup error\n");
|
||||
return;
|
||||
}
|
||||
if (ncp_do_lookup(conn, &sys, "ME", &me) != 0)
|
||||
{
|
||||
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)
|
||||
{
|
||||
sys.volNumber, sys.DosDirNum, NULL,
|
||||
&rights) != 0) {
|
||||
printf("get sys rights error\n");
|
||||
return;
|
||||
}
|
||||
@@ -205,8 +182,7 @@ test_rights(struct ncp_conn *conn)
|
||||
|
||||
if (ncp_get_eff_directory_rights(conn, 0, 0, 0x8006,
|
||||
me.volNumber, me.DosDirNum, NULL,
|
||||
&rights) != 0)
|
||||
{
|
||||
&rights) != 0) {
|
||||
printf("get me rights error\n");
|
||||
return;
|
||||
}
|
||||
@@ -214,14 +190,12 @@ test_rights(struct ncp_conn *conn)
|
||||
return;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
long err;
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "in ncp_initialize");
|
||||
return 1;
|
||||
}
|
||||
|
||||
114
util/nprint.c
114
util/nprint.c
@@ -22,8 +22,7 @@ static void
|
||||
usage(void);
|
||||
static void help(void);
|
||||
|
||||
void
|
||||
main(int argc, char *argv[])
|
||||
void main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
|
||||
@@ -51,13 +50,11 @@ main(int argc, char *argv[])
|
||||
memzero(q);
|
||||
|
||||
if ((argc == 2)
|
||||
&& (strcmp(argv[1], "-h") == 0))
|
||||
{
|
||||
&& (strcmp(argv[1], "-h") == 0)) {
|
||||
help();
|
||||
exit(0);
|
||||
}
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing connection");
|
||||
exit(1);
|
||||
}
|
||||
@@ -78,10 +75,8 @@ main(int argc, char *argv[])
|
||||
pj.Rows = htons(80);
|
||||
strcpy(pj.FnameHeader, "stdin");
|
||||
|
||||
while ((opt = getopt(argc, argv, "h?q:d:p:b:f:l:r:c:t:F:TN")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?q:d:p:b:f:l:r:c:t:F:TN")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'h':
|
||||
case '?':
|
||||
help();
|
||||
@@ -90,45 +85,38 @@ main(int argc, char *argv[])
|
||||
case 'p':
|
||||
/* Path */
|
||||
pj.CtrlFlags |= PRINT_BANNER;
|
||||
if (strlen(optarg) >= sizeof(pj.Path))
|
||||
{
|
||||
if (strlen(optarg) >= sizeof(pj.Path)) {
|
||||
strncpy(pj.Path, optarg,
|
||||
sizeof(pj.Path));
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
strcpy(pj.Path, optarg);
|
||||
}
|
||||
break;
|
||||
case 'b':
|
||||
/* Banner Name */
|
||||
pj.CtrlFlags |= PRINT_BANNER;
|
||||
if (strlen(optarg) >= sizeof(pj.BannerName))
|
||||
{
|
||||
if (strlen(optarg) >= sizeof(pj.BannerName)) {
|
||||
strncpy(pj.BannerName, optarg,
|
||||
sizeof(pj.BannerName));
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
strcpy(pj.BannerName, optarg);
|
||||
}
|
||||
break;
|
||||
case 'f':
|
||||
/* File Name in Banner */
|
||||
pj.CtrlFlags |= PRINT_BANNER;
|
||||
if (strlen(optarg) >= sizeof(pj.FnameBanner))
|
||||
{
|
||||
if (strlen(optarg) >= sizeof(pj.FnameBanner)) {
|
||||
strncpy(pj.FnameBanner, optarg,
|
||||
sizeof(pj.FnameBanner));
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
strcpy(pj.FnameBanner, optarg);
|
||||
}
|
||||
break;
|
||||
case 'l':
|
||||
/* lines, default: 66 */
|
||||
if ((atoi(optarg) < 0) || (atoi(optarg) > 65535))
|
||||
{
|
||||
if ((atoi(optarg) < 0) || (atoi(optarg) > 65535)) {
|
||||
fprintf(stderr,
|
||||
"invalid line number: %s\n", optarg);
|
||||
"invalid line number: %s\n", optarg);
|
||||
break;
|
||||
}
|
||||
pj.Lines = htons(atoi(optarg));
|
||||
@@ -136,10 +124,9 @@ main(int argc, char *argv[])
|
||||
break;
|
||||
case 'r':
|
||||
/* rows, default: 80 */
|
||||
if ((atoi(optarg) < 0) || (atoi(optarg) > 65535))
|
||||
{
|
||||
if ((atoi(optarg) < 0) || (atoi(optarg) > 65535)) {
|
||||
fprintf(stderr,
|
||||
"invalid row number: %s\n", optarg);
|
||||
"invalid row number: %s\n", optarg);
|
||||
break;
|
||||
}
|
||||
pj.Rows = htons(atoi(optarg));
|
||||
@@ -147,8 +134,7 @@ main(int argc, char *argv[])
|
||||
break;
|
||||
case 'c':
|
||||
/* copies, default: 1 */
|
||||
if ((atoi(optarg) < 0) || (atoi(optarg) > 65000))
|
||||
{
|
||||
if ((atoi(optarg) < 0) || (atoi(optarg) > 65000)) {
|
||||
fprintf(stderr,
|
||||
"invalid copies: %s\n", optarg);
|
||||
break;
|
||||
@@ -158,8 +144,7 @@ main(int argc, char *argv[])
|
||||
break;
|
||||
case 't':
|
||||
/* tab size, default: 8 */
|
||||
if ((atoi(optarg) < 0) || (atoi(optarg) > 255))
|
||||
{
|
||||
if ((atoi(optarg) < 0) || (atoi(optarg) > 255)) {
|
||||
fprintf(stderr,
|
||||
"invalid tab size: %s\n", optarg);
|
||||
break;
|
||||
@@ -177,18 +162,16 @@ main(int argc, char *argv[])
|
||||
break;
|
||||
case 'F':
|
||||
/* Form number, default: 0 */
|
||||
if ((atoi(optarg) < 0) || (atoi(optarg) > 255))
|
||||
{
|
||||
if ((atoi(optarg) < 0) || (atoi(optarg) > 255)) {
|
||||
fprintf(stderr,
|
||||
"invalid form number: %s\n", optarg);
|
||||
"invalid form number: %s\n", optarg);
|
||||
break;
|
||||
}
|
||||
j.j.JobType = htons(atoi(optarg));
|
||||
break;
|
||||
case 'q':
|
||||
/* Queue name to print on, default: '*' */
|
||||
if (strlen(optarg) >= NCP_BINDERY_NAME_LEN)
|
||||
{
|
||||
if (strlen(optarg) >= NCP_BINDERY_NAME_LEN) {
|
||||
printf("queue name too long: %s\n",
|
||||
optarg);
|
||||
ncp_close(conn);
|
||||
@@ -199,12 +182,10 @@ main(int argc, char *argv[])
|
||||
case 'd':
|
||||
/* Job Description */
|
||||
pj.CtrlFlags |= PRINT_BANNER;
|
||||
if (strlen(optarg) >= sizeof(j.j.JobTextDescription))
|
||||
{
|
||||
if (strlen(optarg) >= sizeof(j.j.JobTextDescription)) {
|
||||
strncpy(j.j.JobTextDescription, optarg,
|
||||
sizeof(j.j.JobTextDescription));
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
strcpy(j.j.JobTextDescription, optarg);
|
||||
}
|
||||
break;
|
||||
@@ -216,43 +197,34 @@ main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (optind != argc - 1)
|
||||
{
|
||||
if (optind != argc - 1) {
|
||||
usage();
|
||||
ncp_close(conn);
|
||||
exit(1);
|
||||
}
|
||||
file_name = argv[optind];
|
||||
|
||||
if (strcmp(file_name, "-") == 0)
|
||||
{
|
||||
if (strcmp(file_name, "-") == 0) {
|
||||
file = 0; /* stdin */
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
file = open(file_name, O_RDONLY, 0);
|
||||
if (file < 0)
|
||||
{
|
||||
if (file < 0) {
|
||||
perror("could not open file");
|
||||
ncp_close(conn);
|
||||
exit(1);
|
||||
}
|
||||
if (strlen(file_name) >= sizeof(pj.FnameHeader))
|
||||
{
|
||||
if (strlen(file_name) >= sizeof(pj.FnameHeader)) {
|
||||
strncpy(pj.FnameHeader, file_name,
|
||||
sizeof(pj.FnameHeader));
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
strcpy(pj.FnameHeader, file_name);
|
||||
}
|
||||
|
||||
if (strlen(pj.FnameBanner) == 0)
|
||||
{
|
||||
if (strlen(file_name) >= sizeof(pj.FnameBanner))
|
||||
{
|
||||
if (strlen(pj.FnameBanner) == 0) {
|
||||
if (strlen(file_name) >= sizeof(pj.FnameBanner)) {
|
||||
strncpy(pj.FnameBanner, file_name,
|
||||
sizeof(pj.FnameBanner));
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
strcpy(pj.FnameBanner, file_name);
|
||||
}
|
||||
}
|
||||
@@ -263,29 +235,24 @@ main(int argc, char *argv[])
|
||||
str_upper(queue);
|
||||
|
||||
if (ncp_scan_bindery_object(conn, 0xffffffff, NCP_BINDERY_PQUEUE,
|
||||
queue, &q) != 0)
|
||||
{
|
||||
queue, &q) != 0) {
|
||||
printf("could not find queue %s\n", queue);
|
||||
ncp_close(conn);
|
||||
exit(1);
|
||||
}
|
||||
if (ncp_create_queue_job_and_file(conn, q.object_id, &j) != 0)
|
||||
{
|
||||
if (ncp_create_queue_job_and_file(conn, q.object_id, &j) != 0) {
|
||||
printf("create error\n");
|
||||
ncp_close(conn);
|
||||
exit(1);
|
||||
}
|
||||
written = 0;
|
||||
do
|
||||
{
|
||||
do {
|
||||
read_this_time = read(file, buf, sizeof(buf));
|
||||
if (read_this_time < 0)
|
||||
{
|
||||
if (read_this_time < 0) {
|
||||
break;
|
||||
}
|
||||
if (ncp_write(conn, j.file_handle,
|
||||
written, read_this_time, buf) < read_this_time)
|
||||
{
|
||||
written, read_this_time, buf) < read_this_time) {
|
||||
break;
|
||||
}
|
||||
written += read_this_time;
|
||||
@@ -294,22 +261,19 @@ main(int argc, char *argv[])
|
||||
|
||||
close(file);
|
||||
|
||||
if (ncp_close_file_and_start_job(conn, q.object_id, &j) != 0)
|
||||
{
|
||||
if (ncp_close_file_and_start_job(conn, q.object_id, &j) != 0) {
|
||||
printf("close error\n");
|
||||
}
|
||||
ncp_close(conn);
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options] file\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options] file\n", progname);
|
||||
|
||||
34
util/nsend.c
34
util/nsend.c
@@ -12,27 +12,22 @@
|
||||
#include <ctype.h>
|
||||
#include "ncplib.h"
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
__u8 conn_list[256] =
|
||||
{0,};
|
||||
int no_conn;
|
||||
int conn_list2[256];
|
||||
int i;
|
||||
|
||||
char *message = NULL;
|
||||
char *user = NULL;
|
||||
long err;
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
exit(1);
|
||||
}
|
||||
if (argc != 3)
|
||||
{
|
||||
if (argc != 3) {
|
||||
fprintf(stderr, "usage: %s [options] user message\n", argv[0]);
|
||||
ncp_close(conn);
|
||||
exit(1);
|
||||
@@ -41,31 +36,20 @@ main(int argc, char **argv)
|
||||
message = argv[2];
|
||||
|
||||
if ((err = ncp_get_connlist(conn, NCP_BINDERY_USER, user, &no_conn,
|
||||
conn_list)) != 0)
|
||||
{
|
||||
conn_list)) != 0) {
|
||||
com_err(argv[0], err, "in get_connlist");
|
||||
ncp_close(conn);
|
||||
exit(1);
|
||||
}
|
||||
if (no_conn == 0)
|
||||
{
|
||||
if (no_conn == 0) {
|
||||
fprintf(stderr, "No connection found for %s\n", user);
|
||||
ncp_close(conn);
|
||||
exit(1);
|
||||
}
|
||||
for (i=0; i<no_conn; i++)
|
||||
conn_list2[i] = conn_list[i];
|
||||
if ((err = ncp_send_broadcast2(conn, no_conn, conn_list2, message)) != 0)
|
||||
{
|
||||
/* NetWare 2.x returns error code 0x89FB - function not implemented */
|
||||
if (conn->completion == 0xFB)
|
||||
err = ncp_send_broadcast(conn, no_conn, conn_list, message);
|
||||
if (err)
|
||||
{
|
||||
com_err(argv[0], err, "in send_broadcast");
|
||||
ncp_close(conn);
|
||||
exit(1);
|
||||
}
|
||||
if ((err = ncp_send_broadcast(conn, no_conn, conn_list, message)) != 0) {
|
||||
com_err(argv[0], err, "in send_broadcast");
|
||||
ncp_close(conn);
|
||||
exit(1);
|
||||
}
|
||||
ncp_close(conn);
|
||||
return 0;
|
||||
|
||||
@@ -14,14 +14,12 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options]\n", progname);
|
||||
@@ -33,14 +31,12 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
static void
|
||||
swallow_error(const char *s, long x, const char *t, va_list arg)
|
||||
static void swallow_error(const char *s, long x, const char *t, va_list arg)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn_spec *spec;
|
||||
struct ncp_conn *conn;
|
||||
@@ -55,14 +51,11 @@ main(int argc, char *argv[])
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if (!isatty(0))
|
||||
{
|
||||
if (!isatty(0)) {
|
||||
set_com_err_hook(swallow_error);
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?S:U:t:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?S:U:t:")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'S':
|
||||
server = optarg;
|
||||
break;
|
||||
@@ -85,37 +78,31 @@ main(int argc, char *argv[])
|
||||
spec = ncp_find_conn_spec(server, object_name, "",
|
||||
1, getuid(), &err);
|
||||
|
||||
if (spec == NULL)
|
||||
{
|
||||
if (spec == NULL) {
|
||||
com_err(argv[0], err, "when trying to find server");
|
||||
exit(1);
|
||||
}
|
||||
if (ncp_find_fileserver(spec->server, &err) == NULL)
|
||||
{
|
||||
if (ncp_find_fileserver(spec->server, &err) == NULL) {
|
||||
com_err(argv[0], err, "when trying to find server");
|
||||
exit(1);
|
||||
}
|
||||
spec->login_type = object_type;
|
||||
memset(spec->password, 0, sizeof(spec->password));
|
||||
|
||||
if (isatty(0))
|
||||
{
|
||||
if (isatty(0)) {
|
||||
str = getpass("Enter password: ");
|
||||
if (strlen(str) >= sizeof(spec->password))
|
||||
{
|
||||
if (strlen(str) >= sizeof(spec->password)) {
|
||||
printf("Password too long\n");
|
||||
exit(1);
|
||||
}
|
||||
strcpy(spec->password, str);
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
fgets(spec->password, sizeof(spec->password), stdin);
|
||||
}
|
||||
|
||||
str_upper(spec->password);
|
||||
|
||||
if ((conn = ncp_open(spec, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_open(spec, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when trying to open connection");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -13,14 +13,12 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options]\n", progname);
|
||||
@@ -39,34 +37,27 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
static int
|
||||
parse_security(const char *security)
|
||||
static int parse_security(const char *security)
|
||||
{
|
||||
if (strcasecmp(security, "anyone") == 0)
|
||||
{
|
||||
if (strcasecmp(security, "anyone") == 0) {
|
||||
return 0;
|
||||
}
|
||||
if (strcasecmp(security, "logged") == 0)
|
||||
{
|
||||
if (strcasecmp(security, "logged") == 0) {
|
||||
return 1;
|
||||
}
|
||||
if (strcasecmp(security, "object") == 0)
|
||||
{
|
||||
if (strcasecmp(security, "object") == 0) {
|
||||
return 2;
|
||||
}
|
||||
if (strcasecmp(security, "supervisor") == 0)
|
||||
{
|
||||
if (strcasecmp(security, "supervisor") == 0) {
|
||||
return 3;
|
||||
}
|
||||
if (strcasecmp(security, "netware") == 0)
|
||||
{
|
||||
if (strcasecmp(security, "netware") == 0) {
|
||||
return 4;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
char *object_name = NULL;
|
||||
@@ -81,15 +72,12 @@ main(int argc, char *argv[])
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
goto finished;
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?o:t:r:w:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?o:t:r:w:")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'o':
|
||||
object_name = optarg;
|
||||
str_upper(object_name);
|
||||
@@ -99,8 +87,7 @@ main(int argc, char *argv[])
|
||||
break;
|
||||
case 'r':
|
||||
read_sec = parse_security(optarg);
|
||||
if (read_sec < 0)
|
||||
{
|
||||
if (read_sec < 0) {
|
||||
fprintf(stderr,
|
||||
"%s: Wrong read security\n"
|
||||
"Must be one of anyone, logged, "
|
||||
@@ -111,8 +98,7 @@ main(int argc, char *argv[])
|
||||
break;
|
||||
case 'w':
|
||||
write_sec = parse_security(optarg);
|
||||
if (write_sec < 0)
|
||||
{
|
||||
if (write_sec < 0) {
|
||||
fprintf(stderr,
|
||||
"%s: Wrong write security\n"
|
||||
"Must be one of anyone, logged, "
|
||||
@@ -131,24 +117,20 @@ main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (object_type < 0)
|
||||
{
|
||||
if (object_type < 0) {
|
||||
fprintf(stderr, "%s: You must specify an object type\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (object_name == NULL)
|
||||
{
|
||||
if (object_name == NULL) {
|
||||
fprintf(stderr, "%s: You must specify an object name\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (ncp_create_bindery_object(conn, object_type, object_name,
|
||||
(write_sec << 4) + read_sec, 0) != 0)
|
||||
{
|
||||
(write_sec << 4) + read_sec, 0) != 0) {
|
||||
fprintf(stderr, "%s: Could not create the object\n", argv[0]);
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
result = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -15,15 +15,13 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options] pattern\n", progname);
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options]\n", progname);
|
||||
@@ -41,8 +39,7 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
struct ncp_bindery_object o;
|
||||
@@ -58,15 +55,12 @@ main(int argc, char **argv)
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
return 1;
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?vt:o:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?vt:o:")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'h':
|
||||
case '?':
|
||||
help();
|
||||
@@ -86,31 +80,26 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
if (optind < argc)
|
||||
{
|
||||
if (optind < argc) {
|
||||
usage();
|
||||
exit(1);
|
||||
}
|
||||
for (p = pattern; *p != '\0'; p++)
|
||||
{
|
||||
for (p = pattern; *p != '\0'; p++) {
|
||||
*p = toupper(*p);
|
||||
}
|
||||
|
||||
o.object_id = 0xffffffff;
|
||||
|
||||
while (ncp_scan_bindery_object(conn, o.object_id,
|
||||
type, pattern, &o) == 0)
|
||||
{
|
||||
type, pattern, &o) == 0) {
|
||||
found = 1;
|
||||
if (verbose != 0)
|
||||
{
|
||||
if (verbose != 0) {
|
||||
printf("%s %08X %04X %d %02X %d\n",
|
||||
o.object_name, (unsigned int) o.object_id,
|
||||
(unsigned int) o.object_type,
|
||||
o.object_flags, o.object_security,
|
||||
o.object_has_prop);
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
printf("%s %08X %04X\n",
|
||||
o.object_name, (unsigned int) o.object_id,
|
||||
(unsigned int) o.object_type);
|
||||
|
||||
@@ -13,14 +13,12 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options]\n", progname);
|
||||
@@ -38,8 +36,7 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
char *object_name = NULL;
|
||||
@@ -54,15 +51,12 @@ main(int argc, char *argv[])
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
goto finished;
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?o:t:v")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?o:t:v")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'o':
|
||||
object_name = optarg;
|
||||
str_upper(object_name);
|
||||
@@ -83,14 +77,12 @@ main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (object_type < 0)
|
||||
{
|
||||
if (object_type < 0) {
|
||||
fprintf(stderr, "%s: You must specify an object type\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (object_name == NULL)
|
||||
{
|
||||
if (object_name == NULL) {
|
||||
fprintf(stderr, "%s: You must specify an object name\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
@@ -98,16 +90,13 @@ main(int argc, char *argv[])
|
||||
info.search_instance = 0xffffffff;
|
||||
|
||||
while (ncp_scan_property(conn, object_type, object_name,
|
||||
info.search_instance, "*", &info) == 0)
|
||||
{
|
||||
if (verbose != 0)
|
||||
{
|
||||
info.search_instance, "*", &info) == 0) {
|
||||
if (verbose != 0) {
|
||||
printf("%s %d %02x %d\n",
|
||||
info.property_name, info.property_flags,
|
||||
info.property_security,
|
||||
info.value_available_flag);
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
printf("%s\n", info.property_name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,14 +13,12 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options]\n", progname);
|
||||
@@ -37,8 +35,7 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
char *object_name = NULL;
|
||||
@@ -51,15 +48,12 @@ main(int argc, char *argv[])
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
goto finished;
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?o:t:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?o:t:")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'o':
|
||||
object_name = optarg;
|
||||
str_upper(object_name);
|
||||
@@ -77,23 +71,19 @@ main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (object_type < 0)
|
||||
{
|
||||
if (object_type < 0) {
|
||||
fprintf(stderr, "%s: You must specify an object type\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (object_name == NULL)
|
||||
{
|
||||
if (object_name == NULL) {
|
||||
fprintf(stderr, "%s: You must specify an object name\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (ncp_delete_bindery_object(conn, object_type, object_name) != 0)
|
||||
{
|
||||
if (ncp_delete_bindery_object(conn, object_type, object_name) != 0) {
|
||||
fprintf(stderr, "%s: Could not delete the object\n", argv[0]);
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
result = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,14 +13,12 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options] [values]\n", progname);
|
||||
@@ -38,16 +36,15 @@ help(void)
|
||||
"value value to be added\n"
|
||||
"\n"
|
||||
"If property is of type SET, value is an object id (hex)\n"
|
||||
"Otherwise, value is either a string value to be written, or\n"
|
||||
"a count of bytes to be written. The latter is assumed if\n"
|
||||
"more than one value argument is given. The count is decimal,\n"
|
||||
"Otherwise, value is either a string value to be written, or\n"
|
||||
"a count of bytes to be written. The latter is assumed if\n"
|
||||
"more than one value argument is given. The count is decimal,\n"
|
||||
"and the following arguments are interpreted as bytes in\n"
|
||||
"hexadecimal notation.\n"
|
||||
"\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
char *object_name = NULL;
|
||||
@@ -61,15 +58,12 @@ main(int argc, char *argv[])
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
goto finished;
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?o:t:p:v:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?o:t:p:v:")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'o':
|
||||
object_name = optarg;
|
||||
str_upper(object_name);
|
||||
@@ -79,8 +73,7 @@ main(int argc, char *argv[])
|
||||
break;
|
||||
case 'p':
|
||||
property_name = optarg;
|
||||
if (strlen(property_name) > 15)
|
||||
{
|
||||
if (strlen(property_name) > 15) {
|
||||
fprintf(stderr, "%s: Property Name too long\n",
|
||||
argv[0]);
|
||||
exit(1);
|
||||
@@ -100,26 +93,22 @@ main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (object_type < 0)
|
||||
{
|
||||
if (object_type < 0) {
|
||||
fprintf(stderr, "%s: You must specify an object type\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (object_name == NULL)
|
||||
{
|
||||
if (object_name == NULL) {
|
||||
fprintf(stderr, "%s: You must specify an object name\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (property_name == NULL)
|
||||
{
|
||||
if (property_name == NULL) {
|
||||
fprintf(stderr, "%s: You must specify a property name\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (optind > argc - 1)
|
||||
{
|
||||
if (optind > argc - 1) {
|
||||
fprintf(stderr, "%s: You must specify a property value\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
@@ -128,41 +117,35 @@ main(int argc, char *argv[])
|
||||
optind += 1;
|
||||
|
||||
if (ncp_scan_property(conn, object_type, object_name,
|
||||
0xffffffff, property_name, &info) != 0)
|
||||
{
|
||||
0xffffffff, property_name, &info) != 0) {
|
||||
fprintf(stderr, "%s: Could not find property\n", argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if ((info.property_flags & 2) != 0)
|
||||
{
|
||||
if ((info.property_flags & 2) != 0) {
|
||||
/* Property is of type SET */
|
||||
struct ncp_bindery_object o;
|
||||
|
||||
if (optind != argc)
|
||||
{
|
||||
if (optind != argc) {
|
||||
fprintf(stderr, "%s: For the SET property %s, you must"
|
||||
" specify an object id as value\n",
|
||||
progname, property_name);
|
||||
goto finished;
|
||||
}
|
||||
if (ncp_get_bindery_object_name(conn,
|
||||
ntohl(strtol(value, NULL, 16)),
|
||||
&o) != 0)
|
||||
{
|
||||
ntohl(strtol(value, NULL, 16)),
|
||||
&o) != 0) {
|
||||
fprintf(stderr, "%s: %s is not a valid object id\n",
|
||||
progname, value);
|
||||
goto finished;
|
||||
}
|
||||
if (ncp_add_object_to_set(conn, object_type, object_name,
|
||||
property_name,
|
||||
o.object_type, o.object_name) != 0)
|
||||
{
|
||||
o.object_type, o.object_name) != 0) {
|
||||
fprintf(stderr, "%s: could not add object %s\n",
|
||||
progname, o.object_name);
|
||||
goto finished;
|
||||
}
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
/* Property is of type ITEM */
|
||||
char contents[255 * 128];
|
||||
int segno = 1;
|
||||
@@ -170,50 +153,42 @@ main(int argc, char *argv[])
|
||||
|
||||
memset(contents, 0, sizeof(contents));
|
||||
|
||||
if (optind == argc)
|
||||
{
|
||||
if (optind == argc) {
|
||||
/* value is the string to add */
|
||||
length = strlen(value);
|
||||
if (length >= sizeof(contents))
|
||||
{
|
||||
if (length >= sizeof(contents)) {
|
||||
fprintf(stderr, "%s: Value too long\n",
|
||||
progname);
|
||||
goto finished;
|
||||
}
|
||||
strcpy(contents, value);
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
/* value is the byte count */
|
||||
int i;
|
||||
length = atoi(value);
|
||||
if (length >= sizeof(contents))
|
||||
{
|
||||
if (length >= sizeof(contents)) {
|
||||
fprintf(stderr, "%s: Value too long\n",
|
||||
progname);
|
||||
goto finished;
|
||||
}
|
||||
if (optind != argc - length)
|
||||
{
|
||||
if (optind != argc - length) {
|
||||
fprintf(stderr, "%s: Byte count does not match"
|
||||
" number of bytes\n", progname);
|
||||
goto finished;
|
||||
}
|
||||
i = 0;
|
||||
while (optind < argc)
|
||||
{
|
||||
while (optind < argc) {
|
||||
contents[i] = strtol(argv[optind], NULL, 16);
|
||||
i += 1;
|
||||
optind += 1;
|
||||
}
|
||||
}
|
||||
|
||||
for (segno = 1; segno <= 255; segno++)
|
||||
{
|
||||
for (segno = 1; segno <= 255; segno++) {
|
||||
struct nw_property segment;
|
||||
int offset = (segno - 1) * 128;
|
||||
|
||||
if (offset > length)
|
||||
{
|
||||
if (offset > length) {
|
||||
/* everything written */
|
||||
break;
|
||||
}
|
||||
@@ -222,8 +197,7 @@ main(int argc, char *argv[])
|
||||
if (ncp_write_property_value(conn, object_type,
|
||||
object_name,
|
||||
property_name,
|
||||
segno, &segment) != 0)
|
||||
{
|
||||
segno, &segment) != 0) {
|
||||
fprintf(stderr, "%s: Could not write "
|
||||
"property\n", progname);
|
||||
goto finished;
|
||||
|
||||
@@ -13,14 +13,12 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options]\n", progname);
|
||||
@@ -41,34 +39,27 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
static int
|
||||
parse_security(const char *security)
|
||||
static int parse_security(const char *security)
|
||||
{
|
||||
if (strcasecmp(security, "anyone") == 0)
|
||||
{
|
||||
if (strcasecmp(security, "anyone") == 0) {
|
||||
return 0;
|
||||
}
|
||||
if (strcasecmp(security, "logged") == 0)
|
||||
{
|
||||
if (strcasecmp(security, "logged") == 0) {
|
||||
return 1;
|
||||
}
|
||||
if (strcasecmp(security, "object") == 0)
|
||||
{
|
||||
if (strcasecmp(security, "object") == 0) {
|
||||
return 2;
|
||||
}
|
||||
if (strcasecmp(security, "supervisor") == 0)
|
||||
{
|
||||
if (strcasecmp(security, "supervisor") == 0) {
|
||||
return 3;
|
||||
}
|
||||
if (strcasecmp(security, "netware") == 0)
|
||||
{
|
||||
if (strcasecmp(security, "netware") == 0) {
|
||||
return 4;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
char *object_name = NULL;
|
||||
@@ -85,15 +76,12 @@ main(int argc, char *argv[])
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
goto finished;
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?o:t:p:sr:w:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?o:t:p:sr:w:")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'o':
|
||||
object_name = optarg;
|
||||
str_upper(object_name);
|
||||
@@ -103,8 +91,7 @@ main(int argc, char *argv[])
|
||||
break;
|
||||
case 'p':
|
||||
property_name = optarg;
|
||||
if (strlen(property_name) > 15)
|
||||
{
|
||||
if (strlen(property_name) > 15) {
|
||||
fprintf(stderr, "%s: Property Name too long\n",
|
||||
argv[0]);
|
||||
exit(1);
|
||||
@@ -116,8 +103,7 @@ main(int argc, char *argv[])
|
||||
break;
|
||||
case 'r':
|
||||
read_sec = parse_security(optarg);
|
||||
if (read_sec < 0)
|
||||
{
|
||||
if (read_sec < 0) {
|
||||
fprintf(stderr,
|
||||
"%s: Wrong read security\n"
|
||||
"Must be one of anyone, logged, "
|
||||
@@ -128,8 +114,7 @@ main(int argc, char *argv[])
|
||||
break;
|
||||
case 'w':
|
||||
write_sec = parse_security(optarg);
|
||||
if (write_sec < 0)
|
||||
{
|
||||
if (write_sec < 0) {
|
||||
fprintf(stderr,
|
||||
"%s: Wrong write security\n"
|
||||
"Must be one of anyone, logged, "
|
||||
@@ -148,20 +133,17 @@ main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (object_type < 0)
|
||||
{
|
||||
if (object_type < 0) {
|
||||
fprintf(stderr, "%s: You must specify an object type\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (object_name == NULL)
|
||||
{
|
||||
if (object_name == NULL) {
|
||||
fprintf(stderr, "%s: You must specify an object name\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (property_name == NULL)
|
||||
{
|
||||
if (property_name == NULL) {
|
||||
fprintf(stderr, "%s: You must specify a property name\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
@@ -169,11 +151,9 @@ main(int argc, char *argv[])
|
||||
if (ncp_create_property(conn, object_type, object_name,
|
||||
property_name,
|
||||
property_is_set ? 2 : 0,
|
||||
(write_sec << 4) + read_sec) != 0)
|
||||
{
|
||||
(write_sec << 4) + read_sec) != 0) {
|
||||
fprintf(stderr, "%s: Could not create the property\n", argv[0]);
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
result = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,14 +13,12 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options] [pattern]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options]\n", progname);
|
||||
@@ -38,8 +36,7 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
char *object_name = NULL;
|
||||
@@ -53,15 +50,12 @@ main(int argc, char *argv[])
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
goto finished;
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?o:t:p:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?o:t:p:")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'o':
|
||||
object_name = optarg;
|
||||
str_upper(object_name);
|
||||
@@ -71,8 +65,7 @@ main(int argc, char *argv[])
|
||||
break;
|
||||
case 'p':
|
||||
property_name = optarg;
|
||||
if (strlen(property_name) > 15)
|
||||
{
|
||||
if (strlen(property_name) > 15) {
|
||||
fprintf(stderr, "%s: Property Name too long\n",
|
||||
argv[0]);
|
||||
exit(1);
|
||||
@@ -89,30 +82,25 @@ main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (object_type < 0)
|
||||
{
|
||||
if (object_type < 0) {
|
||||
fprintf(stderr, "%s: You must specify an object type\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (object_name == NULL)
|
||||
{
|
||||
if (object_name == NULL) {
|
||||
fprintf(stderr, "%s: You must specify an object name\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (property_name == NULL)
|
||||
{
|
||||
if (property_name == NULL) {
|
||||
fprintf(stderr, "%s: You must specify a property name\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (ncp_delete_property(conn, object_type, object_name,
|
||||
property_name) != 0)
|
||||
{
|
||||
property_name) != 0) {
|
||||
fprintf(stderr, "%s: Could not delete the property\n", argv[0]);
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
result = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,14 +13,12 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options] [values]\n", progname);
|
||||
@@ -35,18 +33,16 @@ help(void)
|
||||
}
|
||||
|
||||
static char *
|
||||
get_line(char *buf, int len, FILE * stream)
|
||||
get_line(char *buf, int len, FILE * stream)
|
||||
{
|
||||
char *result = fgets(buf, len, stream);
|
||||
if (result != NULL)
|
||||
{
|
||||
if (result != NULL) {
|
||||
buf[strlen(buf) - 1] = '\0'; /* remove newline */
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
char object_name[49];
|
||||
@@ -61,15 +57,12 @@ main(int argc, char *argv[])
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
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)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'h':
|
||||
case '?':
|
||||
help();
|
||||
@@ -81,79 +74,67 @@ main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
if (get_line(buf, sizeof(buf), stdin) == NULL)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
0xffffffff, property_name, &info) == 0) {
|
||||
/* Property already exists */
|
||||
|
||||
if ((property_flag & 2) != (info.property_flags & 2))
|
||||
{
|
||||
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 (info.property_security != property_security) {
|
||||
if (ncp_change_property_security(conn, object_type,
|
||||
object_name,
|
||||
property_name,
|
||||
property_security) != 0)
|
||||
{
|
||||
property_security) != 0) {
|
||||
fprintf(stderr, "Could not change "
|
||||
"property security\n");
|
||||
goto finished;
|
||||
}
|
||||
}
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
if (ncp_create_property(conn, object_type, object_name,
|
||||
property_name, property_flag,
|
||||
property_security) != 0)
|
||||
{
|
||||
property_security) != 0) {
|
||||
fprintf(stderr, "Could not create property\n");
|
||||
goto finished;
|
||||
}
|
||||
}
|
||||
|
||||
if ((property_flag & 2) == 0)
|
||||
{
|
||||
if ((property_flag & 2) == 0) {
|
||||
/* ITEM property */
|
||||
int i;
|
||||
int length;
|
||||
@@ -162,23 +143,19 @@ main(int argc, char *argv[])
|
||||
|
||||
memset(property_value, 0, sizeof(property_value));
|
||||
|
||||
for (i = 0; i < sizeof(property_value); i++)
|
||||
{
|
||||
if (get_line(buf, sizeof(buf), stdin) == NULL)
|
||||
{
|
||||
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++)
|
||||
{
|
||||
for (segno = 1; segno <= 255; segno++) {
|
||||
struct nw_property segment;
|
||||
int offset = (segno - 1) * 128;
|
||||
|
||||
if (offset > length)
|
||||
{
|
||||
if (offset > length) {
|
||||
/* everything written */
|
||||
break;
|
||||
}
|
||||
@@ -187,36 +164,30 @@ main(int argc, char *argv[])
|
||||
if (ncp_write_property_value(conn, object_type,
|
||||
object_name,
|
||||
property_name,
|
||||
segno, &segment) != 0)
|
||||
{
|
||||
segno, &segment) != 0) {
|
||||
fprintf(stderr, "Could not write property\n");
|
||||
goto finished;
|
||||
}
|
||||
}
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
/* SET property */
|
||||
|
||||
while (get_line(buf, sizeof(buf), stdin) != NULL)
|
||||
{
|
||||
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)
|
||||
{
|
||||
stdin) == NULL) {
|
||||
fprintf(stderr, "Illegal format on stdin\n");
|
||||
goto finished;
|
||||
}
|
||||
if (ncp_add_object_to_set(conn, object_type,
|
||||
object_name, property_name,
|
||||
object_name, property_name,
|
||||
element_type,
|
||||
element_name) != 0)
|
||||
{
|
||||
if (conn->completion != 0xE9) /* object already
|
||||
in set */
|
||||
{
|
||||
element_name) != 0) {
|
||||
if (conn->completion != 0xE9) { /* object already
|
||||
in set */
|
||||
fprintf(stderr, "Could not add object "
|
||||
"to set\n");
|
||||
goto finished;
|
||||
|
||||
@@ -17,14 +17,12 @@ static char *progname;
|
||||
static void
|
||||
print_property(char *prop_name, __u8 * val, int segments);
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options]\n", progname);
|
||||
@@ -44,8 +42,7 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
char *object_name = NULL;
|
||||
@@ -65,15 +62,12 @@ main(int argc, char *argv[])
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
goto finished;
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?o:t:p:vc")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?o:t:p:vc")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'o':
|
||||
object_name = optarg;
|
||||
str_upper(object_name);
|
||||
@@ -83,8 +77,7 @@ main(int argc, char *argv[])
|
||||
break;
|
||||
case 'p':
|
||||
property_name = optarg;
|
||||
if (strlen(property_name) > 15)
|
||||
{
|
||||
if (strlen(property_name) > 15) {
|
||||
fprintf(stderr, "%s: Property Name too long\n",
|
||||
argv[0]);
|
||||
exit(1);
|
||||
@@ -107,95 +100,77 @@ main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (object_type < 0)
|
||||
{
|
||||
if (object_type < 0) {
|
||||
fprintf(stderr, "%s: You must specify an object type\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (object_name == NULL)
|
||||
{
|
||||
if (object_name == NULL) {
|
||||
fprintf(stderr, "%s: You must specify an object name\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (property_name == NULL)
|
||||
{
|
||||
if (property_name == NULL) {
|
||||
fprintf(stderr, "%s: You must specify a property name\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (ncp_scan_property(conn, object_type, object_name,
|
||||
0xffffffff, property_name, &info) != 0)
|
||||
{
|
||||
0xffffffff, property_name, &info) != 0) {
|
||||
fprintf(stderr, "%s: Could not find property\n", argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
segno = 1;
|
||||
while (ncp_read_property_value(conn, object_type, object_name,
|
||||
segno, property_name, &segment) == 0)
|
||||
{
|
||||
segno, property_name, &segment) == 0) {
|
||||
memcpy(&(property_value[(segno - 1) * 128]), segment.value, 128);
|
||||
if ((segment.more_flag == 0) || (segno == 255))
|
||||
{
|
||||
if ((segment.more_flag == 0) || (segno == 255)) {
|
||||
break;
|
||||
}
|
||||
segno += 1;
|
||||
}
|
||||
|
||||
if (canonical != 0)
|
||||
{
|
||||
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)
|
||||
{
|
||||
if ((info.property_flags & 2) == 0) {
|
||||
/* ITEM property */
|
||||
if (canonical != 0)
|
||||
{
|
||||
if (canonical != 0) {
|
||||
int i;
|
||||
for (i = 0; i < segno * 128; i++)
|
||||
{
|
||||
for (i = 0; i < segno * 128; i++) {
|
||||
printf("%-2.2x\n", property_value[i]);
|
||||
}
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
print_property(property_name, property_value, segno);
|
||||
}
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
int objects = 32 * segno;
|
||||
__u32 *value = (__u32 *) property_value;
|
||||
int i = 0;
|
||||
|
||||
while (i < objects)
|
||||
{
|
||||
while (i < objects) {
|
||||
struct ncp_bindery_object o;
|
||||
|
||||
if ((value[i] == 0) || (value[i] == 0xffffffff))
|
||||
{
|
||||
if ((value[i] == 0) || (value[i] == 0xffffffff)) {
|
||||
/* Continue with next segment */
|
||||
i = ((i / 32) + 1) * 32;
|
||||
continue;
|
||||
}
|
||||
if (ncp_get_bindery_object_name(conn, ntohl(value[i]),
|
||||
&o) == 0)
|
||||
{
|
||||
if (canonical != 0)
|
||||
{
|
||||
&o) == 0) {
|
||||
if (canonical != 0) {
|
||||
printf("%-4.4x\n%s\n",
|
||||
(unsigned int) o.object_type,
|
||||
(unsigned int) o.object_type,
|
||||
o.object_name);
|
||||
} else if (verbose != 0)
|
||||
{
|
||||
} else if (verbose != 0) {
|
||||
printf("%s %08X %04X\n",
|
||||
o.object_name,
|
||||
(unsigned int) o.object_id,
|
||||
(unsigned int) o.object_type);
|
||||
} else
|
||||
{
|
||||
(unsigned int) o.object_type);
|
||||
} else {
|
||||
printf("%s\n", o.object_name);
|
||||
}
|
||||
}
|
||||
@@ -209,25 +184,20 @@ main(int argc, char *argv[])
|
||||
return result;
|
||||
}
|
||||
|
||||
static void
|
||||
print_unknown(__u8 * val)
|
||||
static void print_unknown(__u8 * val)
|
||||
{
|
||||
int j = (128 / 16);
|
||||
while (1)
|
||||
{
|
||||
while (1) {
|
||||
int i;
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
for (i = 0; i < 16; i++) {
|
||||
printf("%02X ", val[i]);
|
||||
}
|
||||
printf(" [");
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
for (i = 0; i < 16; i++) {
|
||||
printf("%c", isprint(val[i]) ? val[i] : '.');
|
||||
}
|
||||
j -= 1;
|
||||
if (j == 0)
|
||||
{
|
||||
if (j == 0) {
|
||||
printf("]\n");
|
||||
return;
|
||||
}
|
||||
@@ -236,29 +206,24 @@ print_unknown(__u8 * val)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
print_string(__u8 * val)
|
||||
static void print_string(__u8 * val)
|
||||
{
|
||||
puts(val);
|
||||
}
|
||||
|
||||
static char *
|
||||
print_station_addr(char *fmt, struct ncp_station_addr *addr, char *buff)
|
||||
print_station_addr(char *fmt, struct ncp_station_addr *addr, char *buff)
|
||||
{
|
||||
char *ret = buff;
|
||||
|
||||
while (*fmt != 0)
|
||||
{
|
||||
switch (*fmt)
|
||||
{
|
||||
while (*fmt != 0) {
|
||||
switch (*fmt) {
|
||||
case '%':
|
||||
switch (*(++fmt))
|
||||
{
|
||||
switch (*(++fmt)) {
|
||||
case 'N': /* node */
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 6; buff += 2, i++)
|
||||
{
|
||||
for (i = 0; i < 6; buff += 2, i++) {
|
||||
sprintf(buff, "%02X", addr->Node[i]);
|
||||
}
|
||||
}
|
||||
@@ -268,7 +233,7 @@ print_station_addr(char *fmt, struct ncp_station_addr *addr, char *buff)
|
||||
buff += 4;
|
||||
break;
|
||||
case 'L': /* Lan */
|
||||
sprintf(buff, "%08X", (u_int32_t)htonl(addr->NetWork));
|
||||
sprintf(buff, "%08lX", htonl(addr->NetWork));
|
||||
buff += 8;
|
||||
break;
|
||||
case '%':
|
||||
@@ -276,8 +241,7 @@ print_station_addr(char *fmt, struct ncp_station_addr *addr, char *buff)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (*fmt)
|
||||
{
|
||||
if (*fmt) {
|
||||
fmt++;
|
||||
}
|
||||
break;
|
||||
@@ -289,8 +253,7 @@ print_station_addr(char *fmt, struct ncp_station_addr *addr, char *buff)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
print_login_control(__u8 * val)
|
||||
void print_login_control(__u8 * val)
|
||||
{
|
||||
int i, j, mask;
|
||||
char buff[32];
|
||||
@@ -300,30 +263,25 @@ print_login_control(__u8 * val)
|
||||
{"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])
|
||||
{
|
||||
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
|
||||
{
|
||||
} else {
|
||||
printf("Never logged in\n");
|
||||
}
|
||||
if (a->Disabled != 0)
|
||||
{
|
||||
if (a->Disabled != 0) {
|
||||
printf(" --- Account disabled ---\n");
|
||||
}
|
||||
if (a->AccountExpireDate[2] || a->AccountExpireDate[1] ||
|
||||
a->AccountExpireDate[0])
|
||||
{
|
||||
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])
|
||||
{
|
||||
a->PasswordExpireDate[0]) {
|
||||
printf("Password expires on: %d.%d.%d\n",
|
||||
a->PasswordExpireDate[2],
|
||||
a->PasswordExpireDate[1],
|
||||
@@ -333,64 +291,51 @@ print_login_control(__u8 * val)
|
||||
printf("PasswortChangeInterval : %d days\n",
|
||||
ntohs(a->PasswordExpireInterval));
|
||||
}
|
||||
if ((a->RestrictionMask & 2) != 0)
|
||||
{
|
||||
if ((a->RestrictionMask & 2) != 0) {
|
||||
printf("New password must be different when changing\n");
|
||||
}
|
||||
if ((a->RestrictionMask & 1) != 0)
|
||||
{
|
||||
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)
|
||||
{
|
||||
if (ntohs(a->MaxConnections) != 0) {
|
||||
printf("Maximum no of connections: %d\n",
|
||||
ntohs(a->MaxConnections));
|
||||
}
|
||||
if (a->MaxDiskUsage != 0xFFFFFF7FL)
|
||||
{
|
||||
printf("Maximum DiskQuota : %8d blocks\n",
|
||||
(u_int32_t)ntohl(a->MaxDiskUsage));
|
||||
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 %8d seconds\n",
|
||||
(u_int32_t)ntohl(a->BadLoginCountDown));
|
||||
if (a->BadLoginCountDown != 0L) {
|
||||
printf("Account disabled still %8ld seconds\n",
|
||||
ntohl(a->BadLoginCountDown));
|
||||
}
|
||||
if (a->LastIntruder.NetWork != 0L)
|
||||
{
|
||||
if (a->LastIntruder.NetWork != 0L) {
|
||||
printf("Last \'intruder\' address: %s\n",
|
||||
print_station_addr("(%L): %N[%S]",
|
||||
&(a->LastIntruder), buff));
|
||||
}
|
||||
if (a->RestrictionMask & 0xFC)
|
||||
{
|
||||
if (a->RestrictionMask & 0xFC) {
|
||||
printf("RestrictionMask : %02X\n", a->RestrictionMask);
|
||||
}
|
||||
for (i = 0; i < 42; i++)
|
||||
{
|
||||
if (a->ConnectionTimeMask[i] != 0xFF)
|
||||
{
|
||||
for (i = 0; i < 42; i++) {
|
||||
if (a->ConnectionTimeMask[i] != 0xFF) {
|
||||
i = 101;
|
||||
}
|
||||
}
|
||||
if (i < 100)
|
||||
{
|
||||
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++)
|
||||
{
|
||||
for (i = 0; i < 7; i++) {
|
||||
printf(" %s [", days[i]);
|
||||
for (j = 0; j < 6; j++)
|
||||
{
|
||||
for (mask = 1; mask < 0x100; mask <<= 1)
|
||||
{
|
||||
for (j = 0; j < 6; j++) {
|
||||
for (mask = 1; mask < 0x100; mask <<= 1) {
|
||||
putchar((*val & mask) ? '*' : ' ');
|
||||
}
|
||||
val++;
|
||||
@@ -399,8 +344,7 @@ print_login_control(__u8 * val)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
print_addr(__u8 * val)
|
||||
void print_addr(__u8 * val)
|
||||
{
|
||||
char buff[50];
|
||||
print_station_addr("(%L): %N[%S]",
|
||||
@@ -408,12 +352,11 @@ print_addr(__u8 * val)
|
||||
printf("%s\n", buff);
|
||||
}
|
||||
|
||||
static struct
|
||||
{
|
||||
static struct {
|
||||
char *pname;
|
||||
void (*func) (__u8 *);
|
||||
}
|
||||
formats[] =
|
||||
} formats[] =
|
||||
|
||||
{
|
||||
{
|
||||
"DESCRIPTION", print_string
|
||||
@@ -452,28 +395,23 @@ formats[] =
|
||||
}
|
||||
};
|
||||
|
||||
static void
|
||||
print_property(char *prop_name, __u8 * val, int segments)
|
||||
static void print_property(char *prop_name, __u8 * val, int segments)
|
||||
{
|
||||
int i;
|
||||
void (*f) (__u8 *);
|
||||
|
||||
for (i = 0; formats[i].pname != NULL; i++)
|
||||
{
|
||||
if (strcasecmp(prop_name, formats[i].pname) == 0)
|
||||
{
|
||||
for (i = 0; formats[i].pname != NULL; i++) {
|
||||
if (strcasecmp(prop_name, formats[i].pname) == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
f = formats[i].func;
|
||||
|
||||
if (f != NULL)
|
||||
{
|
||||
if (f != NULL) {
|
||||
f(val);
|
||||
return;
|
||||
}
|
||||
for (i = 0; i < segments; i++)
|
||||
{
|
||||
for (i = 0; i < segments; i++) {
|
||||
printf("Segment: %03d\n", i + 1);
|
||||
print_unknown(&(val[i * 128]));
|
||||
printf("\n");
|
||||
|
||||
@@ -14,14 +14,12 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [pattern]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options]\n", progname);
|
||||
@@ -35,8 +33,7 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
static void
|
||||
print_info(struct ncp_file_server_info *info)
|
||||
static void print_info(struct ncp_file_server_info *info)
|
||||
{
|
||||
printf("\n");
|
||||
printf("Fileservername %-48.48s\n", info->ServerName);
|
||||
@@ -70,8 +67,7 @@ print_info(struct ncp_file_server_info *info)
|
||||
return;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
int opt;
|
||||
@@ -79,15 +75,12 @@ main(int argc, char **argv)
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 0, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 0, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
return 1;
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?dti")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?dti")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'h':
|
||||
case '?':
|
||||
help();
|
||||
@@ -98,18 +91,15 @@ main(int argc, char **argv)
|
||||
char *s;
|
||||
|
||||
if (ncp_get_file_server_description_strings(conn,
|
||||
strings)
|
||||
!= 0)
|
||||
{
|
||||
strings)
|
||||
!= 0) {
|
||||
perror("could not get strings");
|
||||
ncp_close(conn);
|
||||
return 1;
|
||||
}
|
||||
s = strings;
|
||||
while (s < strings + 512)
|
||||
{
|
||||
if (strlen(s) == 0)
|
||||
{
|
||||
while (s < strings + 512) {
|
||||
if (strlen(s) == 0) {
|
||||
break;
|
||||
}
|
||||
puts(s);
|
||||
@@ -121,8 +111,7 @@ main(int argc, char **argv)
|
||||
{
|
||||
time_t t;
|
||||
|
||||
if (ncp_get_file_server_time(conn, &t) != 0)
|
||||
{
|
||||
if (ncp_get_file_server_time(conn, &t) != 0) {
|
||||
perror("could not get server time");
|
||||
ncp_close(conn);
|
||||
return 1;
|
||||
@@ -133,8 +122,7 @@ main(int argc, char **argv)
|
||||
case 'i':
|
||||
{
|
||||
struct ncp_file_server_info info;
|
||||
if (ncp_get_file_server_information(conn, &info) != 0)
|
||||
{
|
||||
if (ncp_get_file_server_information(conn, &info) != 0) {
|
||||
perror("Could not get server information");
|
||||
ncp_close(conn);
|
||||
return 1;
|
||||
|
||||
@@ -13,14 +13,12 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [pattern]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options]\n", progname);
|
||||
@@ -36,8 +34,7 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
int opt;
|
||||
@@ -47,15 +44,12 @@ main(int argc, char **argv)
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
return 1;
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?s")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?s")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'h':
|
||||
case '?':
|
||||
help();
|
||||
@@ -71,19 +65,15 @@ main(int argc, char **argv)
|
||||
|
||||
finished:
|
||||
|
||||
if (set != 0)
|
||||
{
|
||||
if (set != 0) {
|
||||
time(&t);
|
||||
if ((err = ncp_set_file_server_time(conn, &t)) != 0)
|
||||
{
|
||||
if ((err = ncp_set_file_server_time(conn, &t)) != 0) {
|
||||
com_err(argv[0], err, "when setting file server time");
|
||||
ncp_close(conn);
|
||||
return 1;
|
||||
}
|
||||
} else
|
||||
{
|
||||
if ((err = ncp_get_file_server_time(conn, &t)) != 0)
|
||||
{
|
||||
} else {
|
||||
if ((err = ncp_get_file_server_time(conn, &t)) != 0) {
|
||||
com_err(argv[0], err, "when getting file server time");
|
||||
ncp_close(conn);
|
||||
return 1;
|
||||
|
||||
@@ -13,14 +13,12 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options] file/directory\n", progname);
|
||||
@@ -40,8 +38,7 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
char *object_name = NULL;
|
||||
@@ -55,15 +52,12 @@ main(int argc, char *argv[])
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
goto finished;
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?o:t:r:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?o:t:r:")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'o':
|
||||
object_name = optarg;
|
||||
str_upper(object_name);
|
||||
@@ -84,40 +78,34 @@ main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (object_type < 0)
|
||||
{
|
||||
if (object_type < 0) {
|
||||
fprintf(stderr, "%s: You must specify an object type\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (object_name == NULL)
|
||||
{
|
||||
if (object_name == NULL) {
|
||||
fprintf(stderr, "%s: You must specify an object name\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (rights < 0)
|
||||
{
|
||||
if (rights < 0) {
|
||||
fprintf(stderr, "%s: You must specify a rights mask\n",
|
||||
progname);
|
||||
goto finished;
|
||||
}
|
||||
if (optind != argc - 1)
|
||||
{
|
||||
if (optind != argc - 1) {
|
||||
fprintf(stderr, "%s: You must specify a directory\n",
|
||||
progname);
|
||||
goto finished;
|
||||
}
|
||||
path = argv[optind];
|
||||
|
||||
if (ncp_get_bindery_object_id(conn, object_type, object_name, &o) != 0)
|
||||
{
|
||||
if (ncp_get_bindery_object_id(conn, object_type, object_name, &o) != 0) {
|
||||
fprintf(stderr, "%s: Could not find object %s\n",
|
||||
progname, object_name);
|
||||
goto finished;
|
||||
}
|
||||
if (ncp_add_trustee(conn, 0, path, o.object_id, rights) != 0)
|
||||
{
|
||||
if (ncp_add_trustee(conn, 0, path, o.object_id, rights) != 0) {
|
||||
fprintf(stderr, "%s: Could not add trustee rights\n", progname);
|
||||
goto finished;
|
||||
}
|
||||
|
||||
215
util/nwmsg.c
215
util/nwmsg.c
@@ -1,215 +0,0 @@
|
||||
/*
|
||||
* nwmsg.c
|
||||
*
|
||||
* Fetch NetWare broadcast messages and write to the user
|
||||
*
|
||||
* Copyright (C) 1996 by Volker Lendecke
|
||||
*
|
||||
*/
|
||||
|
||||
#include <pwd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
#include <syslog.h>
|
||||
#include <signal.h>
|
||||
#include <paths.h>
|
||||
#include <utmp.h>
|
||||
#include <mntent.h>
|
||||
#include "ncplib.h"
|
||||
#include <errno.h>
|
||||
|
||||
static int search_utmp(char *user, char *tty);
|
||||
|
||||
static char *progname;
|
||||
|
||||
void
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
char message[256];
|
||||
char *mount_point;
|
||||
struct ncp_fs_info info;
|
||||
struct passwd *pwd;
|
||||
char tty[256];
|
||||
char tty_path[256];
|
||||
FILE *tty_file;
|
||||
FILE *mtab;
|
||||
struct mntent *mnt;
|
||||
long err;
|
||||
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
openlog("nwmsg", LOG_PID, LOG_LPR);
|
||||
|
||||
if (argc != 2)
|
||||
{
|
||||
fprintf(stderr, "usage: %s mount-point\n",
|
||||
progname);
|
||||
exit(1);
|
||||
}
|
||||
mount_point = argv[1];
|
||||
if ((conn = ncp_open_mount(mount_point, &err)) == NULL)
|
||||
{
|
||||
com_err(progname, err, "in ncp_open_mount");
|
||||
exit(1);
|
||||
}
|
||||
if (ncp_get_broadcast_message(conn, message) != 0)
|
||||
{
|
||||
fprintf(stderr, "%s: could not get broadcast message\n",
|
||||
progname);
|
||||
ncp_close(conn);
|
||||
exit(1);
|
||||
}
|
||||
if (strlen(message) == 0)
|
||||
{
|
||||
syslog(LOG_DEBUG, "no message");
|
||||
exit(0);
|
||||
}
|
||||
#if 0
|
||||
syslog(LOG_DEBUG, "message: %s", message);
|
||||
#endif
|
||||
|
||||
info.version = NCP_GET_FS_INFO_VERSION;
|
||||
if (ioctl(conn->mount_fid, NCP_IOC_GET_FS_INFO, &info) < 0)
|
||||
{
|
||||
fprintf(stderr, "%s: could not ioctl on connection: %s\n",
|
||||
progname, strerror(errno));
|
||||
ncp_close(conn);
|
||||
exit(1);
|
||||
}
|
||||
ncp_close(conn);
|
||||
|
||||
if ((pwd = getpwuid(info.mounted_uid)) == NULL)
|
||||
{
|
||||
fprintf(stderr, "%s: user %d not known\n",
|
||||
progname, info.mounted_uid);
|
||||
exit(1);
|
||||
}
|
||||
if ((mtab = fopen(MOUNTED, "r")) == NULL)
|
||||
{
|
||||
fprintf(stderr, "%s: can't open %s\n",
|
||||
progname, MOUNTED);
|
||||
exit(1);
|
||||
}
|
||||
while ((mnt = getmntent(mtab)) != NULL)
|
||||
{
|
||||
if (strcmp(mnt->mnt_dir, mount_point) == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (mnt == NULL)
|
||||
{
|
||||
syslog(LOG_DEBUG, "cannot find mtab entry\n");
|
||||
}
|
||||
if (search_utmp(pwd->pw_name, tty) != 0)
|
||||
{
|
||||
exit(1);
|
||||
}
|
||||
sprintf(tty_path, "/dev/%s", tty);
|
||||
if ((tty_file = fopen(tty_path, "w")) == NULL)
|
||||
{
|
||||
fprintf(stderr, "%s: cannot open %s: %s\n",
|
||||
progname, tty_path, strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
fprintf(tty_file, "\r\n\007\007\007Message from NetWare Server: %s\r\n",
|
||||
mnt->mnt_fsname);
|
||||
fprintf(tty_file, "%s\r\n", message);
|
||||
fclose(tty_file);
|
||||
fclose(mtab);
|
||||
return;
|
||||
}
|
||||
|
||||
/* The following routines have been taken from util-linux-2.5's write.c */
|
||||
|
||||
/*
|
||||
* term_chk - check that a terminal exists, and get the message bit
|
||||
* and the access time
|
||||
*/
|
||||
static int
|
||||
term_chk(char *tty, int *msgsokP, time_t * atimeP, int *showerror)
|
||||
{
|
||||
struct stat s;
|
||||
char path[MAXPATHLEN];
|
||||
|
||||
(void) sprintf(path, "/dev/%s", tty);
|
||||
if (stat(path, &s) < 0)
|
||||
{
|
||||
if (showerror)
|
||||
(void) fprintf(stderr,
|
||||
"write: %s: %s\n", path, strerror(errno));
|
||||
return (1);
|
||||
}
|
||||
*msgsokP = (s.st_mode & (S_IWRITE >> 3)) != 0; /* group write bit */
|
||||
*atimeP = s.st_atime;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* search_utmp - search utmp for the "best" terminal to write to
|
||||
*
|
||||
* Ignores terminals with messages disabled, and of the rest, returns
|
||||
* the one with the most recent access time. Returns as value the number
|
||||
* of the user's terminals with messages enabled, or -1 if the user is
|
||||
* not logged in at all.
|
||||
*
|
||||
* Special case for writing to yourself - ignore the terminal you're
|
||||
* writing from, unless that's the only terminal with messages enabled.
|
||||
*/
|
||||
static int
|
||||
search_utmp(char *user, char *tty)
|
||||
{
|
||||
struct utmp u;
|
||||
time_t bestatime, atime;
|
||||
int ufd, nloggedttys, nttys, msgsok, user_is_me;
|
||||
|
||||
char atty[sizeof(u.ut_line) + 1];
|
||||
|
||||
if ((ufd = open(_PATH_UTMP, O_RDONLY)) < 0)
|
||||
{
|
||||
perror("utmp");
|
||||
return -1;
|
||||
}
|
||||
nloggedttys = nttys = 0;
|
||||
bestatime = 0;
|
||||
user_is_me = 0;
|
||||
while (read(ufd, (char *) &u, sizeof(u)) == sizeof(u))
|
||||
if (strncmp(user, u.ut_name, sizeof(u.ut_name)) == 0)
|
||||
{
|
||||
++nloggedttys;
|
||||
|
||||
(void) strncpy(atty, u.ut_line, sizeof(u.ut_line));
|
||||
atty[sizeof(u.ut_line)] = '\0';
|
||||
|
||||
if (term_chk(atty, &msgsok, &atime, 0))
|
||||
continue; /* bad term? skip */
|
||||
if (!msgsok)
|
||||
continue; /* skip ttys with msgs off */
|
||||
|
||||
if (u.ut_type != USER_PROCESS)
|
||||
continue; /* it's not a valid entry */
|
||||
|
||||
++nttys;
|
||||
if (atime > bestatime)
|
||||
{
|
||||
bestatime = atime;
|
||||
(void) strcpy(tty, atty);
|
||||
}
|
||||
}
|
||||
(void) close(ufd);
|
||||
if (nloggedttys == 0)
|
||||
{
|
||||
(void) fprintf(stderr, "write: %s is not logged in\n", user);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -13,14 +13,12 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options]\n", progname);
|
||||
@@ -34,8 +32,7 @@ help(void)
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn_spec *spec;
|
||||
struct ncp_conn *conn;
|
||||
@@ -56,10 +53,8 @@ main(int argc, char *argv[])
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
while ((opt = getopt(argc, argv, "h?S:U:O:t:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?S:U:O:t:")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'S':
|
||||
server = optarg;
|
||||
break;
|
||||
@@ -84,16 +79,13 @@ main(int argc, char *argv[])
|
||||
spec = ncp_find_conn_spec(server, user_name, "",
|
||||
1, getuid(), &err);
|
||||
|
||||
if (spec == NULL)
|
||||
{
|
||||
if (spec == NULL) {
|
||||
com_err(argv[0], err, "trying to find server");
|
||||
exit(1);
|
||||
}
|
||||
if (!object_name)
|
||||
{
|
||||
if (!object_name) {
|
||||
object_name = spec->user;
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
strcpy(buf_obj_name, object_name);
|
||||
object_name = buf_obj_name;
|
||||
str_upper(object_name);
|
||||
@@ -103,33 +95,28 @@ main(int argc, char *argv[])
|
||||
printf("Changing password for user %s on server %s\n",
|
||||
object_name, spec->server);
|
||||
|
||||
if (object_name == spec->user)
|
||||
{
|
||||
if (object_name == spec->user) {
|
||||
str = getpass("Enter old password: ");
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
char sx[80];
|
||||
sprintf(sx, "Enter password for %s: ", spec->user);
|
||||
str = getpass(sx);
|
||||
}
|
||||
if (strlen(str) >= sizeof(oldpass))
|
||||
{
|
||||
if (strlen(str) >= sizeof(oldpass)) {
|
||||
printf("Password too long\n");
|
||||
exit(1);
|
||||
}
|
||||
strcpy(oldpass, str);
|
||||
|
||||
str = getpass("Enter new password: ");
|
||||
if (strlen(str) >= sizeof(newpass1))
|
||||
{
|
||||
if (strlen(str) >= sizeof(newpass1)) {
|
||||
printf("Password too long\n");
|
||||
exit(1);
|
||||
}
|
||||
strcpy(newpass1, str);
|
||||
|
||||
str = getpass("Re-Enter new password: ");
|
||||
if (strlen(str) >= sizeof(newpass2))
|
||||
{
|
||||
if (strlen(str) >= sizeof(newpass2)) {
|
||||
printf("Password too long\n");
|
||||
exit(1);
|
||||
}
|
||||
@@ -139,27 +126,22 @@ main(int argc, char *argv[])
|
||||
str_upper(newpass1);
|
||||
str_upper(newpass2);
|
||||
|
||||
if (strcmp(newpass1, newpass2) != 0)
|
||||
{
|
||||
if (strcmp(newpass1, newpass2) != 0) {
|
||||
printf("You mistype the new password, try again\n");
|
||||
exit(1);
|
||||
}
|
||||
strcpy(spec->password, oldpass);
|
||||
|
||||
if ((conn = ncp_open(spec, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_open(spec, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when trying to open connection");
|
||||
exit(1);
|
||||
}
|
||||
if (object_name != spec->user)
|
||||
{
|
||||
if (object_name != spec->user) {
|
||||
if (!(err = ncp_get_bindery_object_id(conn, 1, spec->user,
|
||||
&user))
|
||||
&& !(err = ncp_login_user(conn, spec->user, oldpass)))
|
||||
{
|
||||
&& !(err = ncp_login_user(conn, spec->user, oldpass))) {
|
||||
*oldpass = '\0';
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
com_err(argv[0], err, "not own password");
|
||||
}
|
||||
}
|
||||
@@ -167,8 +149,7 @@ main(int argc, char *argv[])
|
||||
|| ((err = ncp_get_bindery_object_id(conn, 1, object_name,
|
||||
&user)) != 0)
|
||||
|| ((err = ncp_change_login_passwd(conn, &user, ncp_key,
|
||||
oldpass, newpass1)) != 0))
|
||||
{
|
||||
oldpass, newpass1)) != 0)) {
|
||||
com_err(argv[0], err, "trying to change password");
|
||||
}
|
||||
ncp_close(conn);
|
||||
|
||||
@@ -13,14 +13,12 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options] file/directory\n", progname);
|
||||
@@ -39,8 +37,7 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
char *object_name = NULL;
|
||||
@@ -53,15 +50,12 @@ main(int argc, char *argv[])
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
goto finished;
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?o:t:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?o:t:")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'o':
|
||||
object_name = optarg;
|
||||
str_upper(object_name);
|
||||
@@ -79,34 +73,29 @@ main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (object_type < 0)
|
||||
{
|
||||
if (object_type < 0) {
|
||||
fprintf(stderr, "%s: You must specify an object type\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (object_name == NULL)
|
||||
{
|
||||
if (object_name == NULL) {
|
||||
fprintf(stderr, "%s: You must specify an object name\n",
|
||||
argv[0]);
|
||||
goto finished;
|
||||
}
|
||||
if (optind != argc - 1)
|
||||
{
|
||||
if (optind != argc - 1) {
|
||||
fprintf(stderr, "%s: You must specify a directory\n",
|
||||
progname);
|
||||
goto finished;
|
||||
}
|
||||
path = argv[optind];
|
||||
|
||||
if (ncp_get_bindery_object_id(conn, object_type, object_name, &o) != 0)
|
||||
{
|
||||
if (ncp_get_bindery_object_id(conn, object_type, object_name, &o) != 0) {
|
||||
fprintf(stderr, "%s: Could not find object %s\n",
|
||||
progname, object_name);
|
||||
goto finished;
|
||||
}
|
||||
if (ncp_delete_trustee(conn, 0, path, o.object_id) != 0)
|
||||
{
|
||||
if (ncp_delete_trustee(conn, 0, path, o.object_id) != 0) {
|
||||
fprintf(stderr, "%s: Could not remove trustee rights\n",
|
||||
progname);
|
||||
goto finished;
|
||||
|
||||
@@ -13,14 +13,12 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options] file/directory\n", progname);
|
||||
@@ -31,8 +29,7 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct ncp_conn *conn = NULL;
|
||||
char *path = ".";
|
||||
@@ -43,10 +40,8 @@ main(int argc, char *argv[])
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
while ((opt = getopt(argc, argv, "h?")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'h':
|
||||
case '?':
|
||||
help();
|
||||
@@ -57,25 +52,21 @@ main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (optind > argc)
|
||||
{
|
||||
if (optind > argc) {
|
||||
usage();
|
||||
goto finished;
|
||||
}
|
||||
if (optind == argc - 1)
|
||||
{
|
||||
if (optind == argc - 1) {
|
||||
path = argv[optind];
|
||||
}
|
||||
if ((conn = ncp_open_mount(path, &err)) == NULL)
|
||||
{
|
||||
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)
|
||||
{
|
||||
conn->i.directory_id, NULL,
|
||||
&rights)) != 0) {
|
||||
com_err(argv[0], err, "when finding rights");
|
||||
goto finished;
|
||||
}
|
||||
@@ -90,36 +81,28 @@ main(int argc, char *argv[])
|
||||
((rights & NCP_PERM_SEARCH) != 0) ? 'F' : ' ',
|
||||
((rights & NCP_PERM_OWNER) != 0) ? 'A' : ' ');
|
||||
|
||||
if ((rights & NCP_PERM_SUPER) != 0)
|
||||
{
|
||||
if ((rights & NCP_PERM_SUPER) != 0) {
|
||||
printf("(S): You have SUPERVISOR rights\n");
|
||||
}
|
||||
if ((rights & NCP_PERM_READ) != 0)
|
||||
{
|
||||
if ((rights & NCP_PERM_READ) != 0) {
|
||||
printf("(R): You may READ from files\n");
|
||||
}
|
||||
if ((rights & NCP_PERM_WRITE) != 0)
|
||||
{
|
||||
if ((rights & NCP_PERM_WRITE) != 0) {
|
||||
printf("(W): You may WRITE to files\n");
|
||||
}
|
||||
if ((rights & NCP_PERM_CREATE) != 0)
|
||||
{
|
||||
if ((rights & NCP_PERM_CREATE) != 0) {
|
||||
printf("(C): You may CREATE files\n");
|
||||
}
|
||||
if ((rights & NCP_PERM_DELETE) != 0)
|
||||
{
|
||||
if ((rights & NCP_PERM_DELETE) != 0) {
|
||||
printf("(E): You may ERASE files\n");
|
||||
}
|
||||
if ((rights & NCP_PERM_MODIFY) != 0)
|
||||
{
|
||||
if ((rights & NCP_PERM_MODIFY) != 0) {
|
||||
printf("(M): You may MODIFY directory\n");
|
||||
}
|
||||
if ((rights & NCP_PERM_SEARCH) != 0)
|
||||
{
|
||||
if ((rights & NCP_PERM_SEARCH) != 0) {
|
||||
printf("(F): You may SCAN for files\n");
|
||||
}
|
||||
if ((rights & NCP_PERM_OWNER) != 0)
|
||||
{
|
||||
if ((rights & NCP_PERM_OWNER) != 0) {
|
||||
printf("(A): You may change ACCESS control\n");
|
||||
}
|
||||
result = 0;
|
||||
|
||||
@@ -15,15 +15,13 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options] pattern\n", progname);
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options]\n", progname);
|
||||
@@ -44,8 +42,7 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
int
|
||||
fromhex(char c)
|
||||
int fromhex(char c)
|
||||
{
|
||||
c -= '0';
|
||||
if (c > 9)
|
||||
@@ -53,8 +50,7 @@ fromhex(char c)
|
||||
return c & 15;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
struct ncp_bindery_object bobj;
|
||||
@@ -69,15 +65,12 @@ main(int argc, char **argv)
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
return 1;
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?vl:L:o:O:t:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?vl:L:o:O:t:")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'h':
|
||||
case '?':
|
||||
help();
|
||||
@@ -86,8 +79,7 @@ main(int argc, char **argv)
|
||||
vid = atoi(optarg);
|
||||
break;
|
||||
case 'L':
|
||||
if (ncp_get_volume_number(conn, optarg, &vid))
|
||||
{
|
||||
if (ncp_get_volume_number(conn, optarg, &vid)) {
|
||||
ncp_close(conn);
|
||||
return 1;
|
||||
}
|
||||
@@ -95,19 +87,16 @@ main(int argc, char **argv)
|
||||
|
||||
case 'o':
|
||||
oid = 0;
|
||||
while (*optarg)
|
||||
{
|
||||
while (*optarg) {
|
||||
oid = (oid << 4) | fromhex(*optarg);
|
||||
optarg++;
|
||||
}
|
||||
break;
|
||||
case 'O':
|
||||
for (p = optarg; *p != 0; p++)
|
||||
{
|
||||
for (p = optarg; *p != 0; p++) {
|
||||
*p = toupper(*p);
|
||||
}
|
||||
if (ncp_get_bindery_object_id(conn, type, optarg, &bobj))
|
||||
{
|
||||
if (ncp_get_bindery_object_id(conn, type, optarg, &bobj)) {
|
||||
ncp_close(conn);
|
||||
return 1;
|
||||
}
|
||||
@@ -125,30 +114,25 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
if (optind < argc)
|
||||
{
|
||||
if (optind < argc) {
|
||||
usage();
|
||||
exit(1);
|
||||
}
|
||||
nextp = 0;
|
||||
while (!ncp_get_trustee(conn, oid, vid, ppath, &trust, &nextp))
|
||||
{
|
||||
while (!ncp_get_trustee(conn, oid, vid, ppath, &trust, &nextp)) {
|
||||
if (!nextp)
|
||||
break;
|
||||
printf("%s ", ppath);
|
||||
if (verbose)
|
||||
{
|
||||
if (verbose) {
|
||||
strcpy(ppath, "[ R W O C E A F M ]");
|
||||
p = ppath + 2;
|
||||
for (type = 1; type < 256; type <<= 1)
|
||||
{
|
||||
for (type = 1; type < 256; type <<= 1) {
|
||||
if (!(trust & type))
|
||||
*p = ' ';
|
||||
p += 2;
|
||||
}
|
||||
printf("%s\n", ppath);
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
printf("%X\n", trust);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,26 +13,22 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [pattern]\n", progname);
|
||||
}
|
||||
|
||||
static void
|
||||
str_trim_right(char *s, char c)
|
||||
static void str_trim_right(char *s, char c)
|
||||
{
|
||||
int len = strlen(s) - 1;
|
||||
|
||||
while ((len > 0) && (s[len] == c))
|
||||
{
|
||||
while ((len > 0) && (s[len] == c)) {
|
||||
s[len] = '\0';
|
||||
len -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options]\n", progname);
|
||||
@@ -43,8 +39,7 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
int opt;
|
||||
@@ -57,15 +52,12 @@ main(int argc, char **argv)
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
goto finished;
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?a")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?a")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'h':
|
||||
case '?':
|
||||
help();
|
||||
@@ -79,26 +71,22 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
if (ncp_get_file_server_information(conn, &info) != 0)
|
||||
{
|
||||
if (ncp_get_file_server_information(conn, &info) != 0) {
|
||||
perror("Could not get server information");
|
||||
ncp_close(conn);
|
||||
return 1;
|
||||
}
|
||||
if (isatty(1))
|
||||
{
|
||||
if (print_addr == 0)
|
||||
{
|
||||
if (isatty(1)) {
|
||||
if (print_addr == 0) {
|
||||
printf("\n%-6s%-21s%-12s\n"
|
||||
"---------------------------------------------"
|
||||
"---------------------------------------------"
|
||||
"------\n",
|
||||
"Conn",
|
||||
"User name",
|
||||
"Login time");
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
printf("\n%-6s%-21s%-27s%-12s\n"
|
||||
"---------------------------------------------"
|
||||
"---------------------------------------------"
|
||||
"---------------------------------\n",
|
||||
"Conn",
|
||||
"User name",
|
||||
@@ -106,21 +94,18 @@ main(int argc, char **argv)
|
||||
"Login time");
|
||||
}
|
||||
}
|
||||
for (i = 1; i <= info.MaximumServiceConnections; i++)
|
||||
{
|
||||
for (i = 1; i <= info.MaximumServiceConnections; i++) {
|
||||
char name[49];
|
||||
name[48] = '\0';
|
||||
if (ncp_get_stations_logged_info(conn, i, &user,
|
||||
&login_time) != 0)
|
||||
{
|
||||
&login_time) != 0) {
|
||||
continue;
|
||||
}
|
||||
memcpy(name, user.object_name, 48);
|
||||
str_trim_right(name, ' ');
|
||||
printf("%4d: %-20s ", i, name);
|
||||
|
||||
if (print_addr != 0)
|
||||
{
|
||||
if (print_addr != 0) {
|
||||
struct sockaddr_ipx addr;
|
||||
__u8 conn_type;
|
||||
|
||||
|
||||
@@ -15,15 +15,13 @@
|
||||
|
||||
static char *progname;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options] pattern\n", progname);
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
help(void)
|
||||
static void help(void)
|
||||
{
|
||||
printf("\n");
|
||||
printf("usage: %s [options]\n", progname);
|
||||
@@ -40,8 +38,7 @@ help(void)
|
||||
"\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct ncp_conn *conn;
|
||||
struct ncp_volume_info o;
|
||||
@@ -54,15 +51,12 @@ main(int argc, char **argv)
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL)
|
||||
{
|
||||
if ((conn = ncp_initialize(&argc, argv, 1, &err)) == NULL) {
|
||||
com_err(argv[0], err, "when initializing");
|
||||
return 1;
|
||||
}
|
||||
while ((opt = getopt(argc, argv, "h?Nv:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
while ((opt = getopt(argc, argv, "h?Nv:")) != EOF) {
|
||||
switch (opt) {
|
||||
case 'h':
|
||||
case '?':
|
||||
help();
|
||||
@@ -79,23 +73,19 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
if (optind < argc)
|
||||
{
|
||||
if (optind < argc) {
|
||||
usage();
|
||||
exit(1);
|
||||
}
|
||||
if (ncp_get_volume_number(conn, volname, &opt))
|
||||
{
|
||||
if (ncp_get_volume_number(conn, volname, &opt)) {
|
||||
exit(1);
|
||||
}
|
||||
if (ncp_get_volume_info_with_number(conn, opt, &o))
|
||||
{
|
||||
if (ncp_get_volume_info_with_number(conn, opt, &o)) {
|
||||
exit(1);
|
||||
}
|
||||
numk = o.sectors_per_block / 2;
|
||||
o.free_blocks += o.purgeable_blocks;
|
||||
if (type)
|
||||
{
|
||||
if (type) {
|
||||
printf("%d %d %d %d %d %d\n",
|
||||
o.total_blocks * numk,
|
||||
o.free_blocks * numk,
|
||||
@@ -103,8 +93,7 @@ main(int argc, char **argv)
|
||||
o.not_yet_purgeable_blocks * numk,
|
||||
o.total_dir_entries,
|
||||
o.available_dir_entries);
|
||||
} else
|
||||
{
|
||||
} else {
|
||||
printf("Total : %dK\n", o.total_blocks * numk);
|
||||
printf("Free : %dK\n", o.free_blocks * numk);
|
||||
printf("Purgable : %dK\n", o.purgeable_blocks * numk);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user