From 1a5653d40330a57ccfb18d1b64189aacaef6ec30 Mon Sep 17 00:00:00 2001 From: ncpfs archive import Date: Tue, 28 Apr 2026 20:39:58 +0200 Subject: [PATCH] Import ncpfs 2.0.10 --- .downloads/ncpfs-2.0.10.tgz | Bin 0 -> 158226 bytes Changes | 4 + Makefile | 12 +- contrib/tknwmsg/nwmsg.c | 83 +-- include/ncplib.h | 5 + ipx-1.0/Samples/ipxrcv.c | 43 +- ipx-1.0/Samples/ipxsend.c | 34 +- ipx-1.0/Samples/rip.c | 65 +- ipx-1.0/Samples/sap.c | 92 +-- ipx-1.0/ipx_configure.c | 95 +-- ipx-1.0/ipx_interface.c | 283 +++++--- ipx-1.0/ipx_internal_net.c | 142 ++-- ipx-1.0/ipx_route.c | 161 +++-- ipxdump/ipxdump.c | 109 ++- ipxdump/ipxparse.c | 1039 ++++++++++++++------------- ipxdump/ipxutil.c | 97 +-- ipxdump/ipxutil.h | 48 +- kernel-1.2/linux/ncp.h | 299 ++++---- kernel-1.2/linux/ncp_fs.h | 60 +- kernel-1.2/linux/ncp_fs_i.h | 24 +- kernel-1.2/linux/ncp_fs_sb.h | 39 +- kernel-1.2/linux/ncp_mount.h | 21 +- kernel-1.2/src/dir.c | 690 ++++++++---------- kernel-1.2/src/file.c | 138 ++-- kernel-1.2/src/inode.c | 270 ++++--- kernel-1.2/src/ioctl.c | 89 ++- kernel-1.2/src/mmap.c | 54 +- kernel-1.2/src/ncplib_kernel.c | 167 ++--- kernel-1.2/src/ncplib_kernel.h | 195 ++--- kernel-1.2/src/sock.c | 353 +++++---- lib/com_err/com_err.c | 132 ++-- lib/com_err/com_err.h | 28 +- lib/com_err/error_message.c | 106 +-- lib/com_err/error_table.h | 18 +- lib/com_err/et_name.c | 40 +- lib/com_err/init_et.c | 51 +- lib/com_err/internal.h | 4 +- lib/com_err/mit-sipb-copyright.h | 29 +- lib/ncplib.c | 25 + man/nprint.1 | 2 +- man/nwbocreate.8 | 2 +- man/nwbols.1 | 2 +- man/nwboprops.1 | 2 +- man/nwborm.8 | 2 +- man/nwbpadd.8 | 2 +- man/nwbpset.1 | 2 +- man/nwfstime.1 | 2 +- man/nwgrant.8 | 2 +- man/nwrevoke.8 | 2 +- man/nwtrustee.1 | 127 ++++ man/nwuserlist.1 | 2 +- man/pserver.1 | 2 +- ncpfs-2.0.9.lsm => ncpfs-2.0.10.lsm | 8 +- sutil/ipxlib.h | 69 +- sutil/ncplib.c | 2 +- sutil/ncplib.h | 173 ++--- sutil/ncpmount.c | 2 +- sutil/ncpumount.c | 2 +- util/Makefile | 2 +- util/ncptest.c | 2 +- util/nwtrustee.c | 8 +- 61 files changed, 2859 insertions(+), 2704 deletions(-) create mode 100644 .downloads/ncpfs-2.0.10.tgz create mode 100644 man/nwtrustee.1 rename ncpfs-2.0.9.lsm => ncpfs-2.0.10.lsm (83%) diff --git a/.downloads/ncpfs-2.0.10.tgz b/.downloads/ncpfs-2.0.10.tgz new file mode 100644 index 0000000000000000000000000000000000000000..30784d8f1e6e41985f31dcc4257dd2d5c42e5064 GIT binary patch literal 158226 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%0AxU$zt-@x^jpWz(r*JlOTVl5S^8bW&(iNYewKbW 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 literal 0 HcmV?d00001 diff --git a/Changes b/Changes index 3cd8536..9eedd3f 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,10 @@ I only began this file with ncpfs-0.12. If you're interested in older versions, you can find them on ftp.gwdg.de:/pub/linux/misc/ncpfs/old. +ncpfs-2.0.9 -> ncpfs-2.0.10 +- Made nwtrustee hopefully work ;-) +- Made the manpages a little bit prettier + ncpfs-2.0.8 -> ncpfs-2.0.9 - Added patches directory - Added nwvolinfo and nwtrustee. Thanks to Jacek Stepniewski diff --git a/Makefile b/Makefile index 8cf8201..27a3a88 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ # Makefile for the linux ncp-filesystem routines. # -VERSION = 2.0.9 +VERSION = 2.0.10 # If you are using kerneld to autoload ncp support, # uncomment this (kerneld is in linux since about 1.3.57): @@ -71,15 +71,13 @@ SRCPATH=$(shell pwd) SRCDIR=$(shell basename $(SRCPATH)) DISTFILE=$(SRCDIR).tgz -dist: mrproper - (cd ..; \ - tar cvf - $(SRCDIR) | \ - gzip -9 > $(DISTFILE); \ - mv $(DISTFILE) $(SRCDIR)) +dist: tgz make dep make all -tgz: mrproper +tgz: + indent -kr -i8 `find . -name '*.[ch]'` + make mrproper (cd ..; \ tar cvf - $(SRCDIR) | \ gzip -9 > $(DISTFILE); \ diff --git a/contrib/tknwmsg/nwmsg.c b/contrib/tknwmsg/nwmsg.c index 640b4b4..6f0c200 100644 --- a/contrib/tknwmsg/nwmsg.c +++ b/contrib/tknwmsg/nwmsg.c @@ -32,7 +32,7 @@ main(int argc, char *argv[]) { struct ncp_conn *conn; char message[256]; - + char *mount_point; struct ncp_fs_info info; struct passwd *pwd; @@ -43,9 +43,9 @@ main(int argc, char *argv[]) struct mntent *mnt; long err; - char tknwmsg_command[256]; - int error_level; - + char tknwmsg_command[256]; + int error_level; + progname = argv[0]; @@ -57,14 +57,12 @@ main(int argc, char *argv[]) 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", @@ -72,13 +70,11 @@ main(int argc, char *argv[]) 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 @@ -91,7 +87,6 @@ main(int argc, char *argv[]) ncp_close(conn); exit(1); } - ncp_close(conn); if ((pwd = getpwuid(info.mounted_uid)) == NULL) @@ -100,14 +95,12 @@ main(int argc, char *argv[]) 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) @@ -120,12 +113,10 @@ main(int argc, char *argv[]) { 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) { @@ -133,25 +124,24 @@ main(int argc, char *argv[]) progname, tty_path, strerror(errno)); exit(1); } - - fprintf(tty_file,"\r\n\007\007\007Message from NetWare Server: %s\r\n", + fprintf(tty_file, "\r\n\007\007\007Message from NetWare Server: %s\r\n", mnt->mnt_fsname); fprintf(tty_file, "%s\r\n", message); - + //formulate the full system command for the X notice... - strcat(tknwmsg_command,"/usr/bin/tknwmsg -display :0 "); - strcat(tknwmsg_command,"Message from NetWare Server: "); - strcat(tknwmsg_command,mnt->mnt_fsname); - strcat(tknwmsg_command," "); - strcat(tknwmsg_command,message); - strcat(tknwmsg_command," &"); - - //execute this system command... - error_level = system(tknwmsg_command); + strcat(tknwmsg_command, "/usr/bin/tknwmsg -display :0 "); + strcat(tknwmsg_command, "Message from NetWare Server: "); + strcat(tknwmsg_command, mnt->mnt_fsname); + strcat(tknwmsg_command, " "); + strcat(tknwmsg_command, message); + strcat(tknwmsg_command, " &"); + + //execute this system command... + error_level = system(tknwmsg_command); - fclose(tty_file); + fclose(tty_file); fclose(mtab); return; } @@ -163,21 +153,22 @@ main(int argc, char *argv[]) * and the access time */ static int -term_chk(char *tty, int *msgsokP, time_t *atimeP, int *showerror) +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) { + (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); + (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); + return (0); } /* @@ -200,19 +191,20 @@ 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; } - 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) { + if (strncmp(user, u.ut_name, sizeof(u.ut_name)) == 0) + { ++nloggedttys; - (void)strncpy(atty, u.ut_line, sizeof(u.ut_line)); + (void) strncpy(atty, u.ut_line, sizeof(u.ut_line)); atty[sizeof(u.ut_line)] = '\0'; if (term_chk(atty, &msgsok, &atime, 0)) @@ -220,19 +212,20 @@ search_utmp(char *user, char *tty) if (!msgsok) continue; /* skip ttys with msgs off */ - if (u.ut_type != USER_PROCESS) - continue; /* it's not a valid entry */ + if (u.ut_type != USER_PROCESS) + continue; /* it's not a valid entry */ ++nttys; - if (atime > bestatime) { + if (atime > bestatime) + { bestatime = atime; - (void)strcpy(tty, atty); + (void) strcpy(tty, atty); } } - - (void)close(ufd); - if (nloggedttys == 0) { - (void)fprintf(stderr, "write: %s is not logged in\n", user); + (void) close(ufd); + if (nloggedttys == 0) + { + (void) fprintf(stderr, "write: %s is not logged in\n", user); return -1; } return 0; diff --git a/include/ncplib.h b/include/ncplib.h index a73c038..e0f2af7 100644 --- a/include/ncplib.h +++ b/include/ncplib.h @@ -513,6 +513,11 @@ long int dir_handle, const char *old_path, const char *new_path); +long + ncp_get_trustee(struct ncp_conn *conn, __u32 object_id, + __u8 vol, char *path, + __u16 * trustee, __u16 * contin); + long ncp_add_trustee(struct ncp_conn *conn, int dir_handle, const char *path, diff --git a/ipx-1.0/Samples/ipxrcv.c b/ipx-1.0/Samples/ipxrcv.c index 2a71e64..d076506 100644 --- a/ipx-1.0/Samples/ipxrcv.c +++ b/ipx-1.0/Samples/ipxrcv.c @@ -8,14 +8,15 @@ int main(int argc, char **argv) { - struct sockaddr_ipx sipx; - int s; - int result; - char msg[100]; - int len; + struct sockaddr_ipx sipx; + int s; + int result; + char msg[100]; + int len; s = socket(AF_IPX, SOCK_DGRAM, AF_IPX); - if (s < 0) { + if (s < 0) + { perror("IPX: socket: "); exit(-1); } @@ -24,29 +25,25 @@ main(int argc, char **argv) sipx.sipx_port = htons(0x5000); sipx.sipx_type = 17; len = sizeof(sipx); - result = bind(s, (struct sockaddr *)&sipx, sizeof(sipx)); - if (result < 0) { + result = bind(s, (struct sockaddr *) &sipx, sizeof(sipx)); + 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) { + result = recvfrom(s, msg, sizeof(msg), 0, (struct sockaddr *) &sipx, + &len); + if (result < 0) + { perror("IPX: recvfrom: "); } - - printf("From %08lX:%02X%02X%02X%02X%02X%02X:%04X\n", - 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], - htons(sipx.sipx_port)); + printf("From %08lX:%02X%02X%02X%02X%02X%02X:%04X\n", + 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], + htons(sipx.sipx_port)); printf("\tGot \"%s\"\n", msg); return 0; } - - - - diff --git a/ipx-1.0/Samples/ipxsend.c b/ipx-1.0/Samples/ipxsend.c index f999fee..e8b519d 100644 --- a/ipx-1.0/Samples/ipxsend.c +++ b/ipx-1.0/Samples/ipxsend.c @@ -1,3 +1,7 @@ + + + + #include #include #include @@ -8,14 +12,15 @@ int main(int argc, char **argv) { - struct sockaddr_ipx sipx; - int s; - int result; - char msg[100] = "Hi Mom"; - int len = sizeof(sipx); + struct sockaddr_ipx sipx; + int s; + int result; + char msg[100] = "Hi Mom"; + int len = sizeof(sipx); s = socket(AF_IPX, SOCK_DGRAM, AF_IPX); - if (s < 0) { + if (s < 0) + { perror("IPX: socket: "); exit(-1); } @@ -24,23 +29,20 @@ main(int argc, char **argv) sipx.sipx_port = 0; sipx.sipx_type = 17; - result = bind(s, (struct sockaddr *)&sipx, sizeof(sipx)); - if (result < 0) { + result = bind(s, (struct sockaddr *) &sipx, sizeof(sipx)); + if (result < 0) + { perror("IPX: bind: "); exit(-1); } - - result = getsockname(s, (struct sockaddr *)&sipx, &len); + result = getsockname(s, (struct sockaddr *) &sipx, &len); sipx.sipx_port = htons(0x5000); - result = sendto(s, msg, sizeof(msg), 0, (struct sockaddr *)&sipx, + result = sendto(s, msg, sizeof(msg), 0, (struct sockaddr *) &sipx, sizeof(sipx)); - if (result < 0) { + if (result < 0) + { perror("IPX: send: "); exit(-1); } return 0; } - - - - diff --git a/ipx-1.0/Samples/rip.c b/ipx-1.0/Samples/rip.c index 12d6e85..67f660e 100644 --- a/ipx-1.0/Samples/rip.c +++ b/ipx-1.0/Samples/rip.c @@ -1,3 +1,7 @@ + + + + #include #include #include @@ -5,25 +9,27 @@ #include #include -struct rip_data { - unsigned long rip_net; - unsigned short rip_hops __attribute__ ((packed)); - unsigned short rip_ticks __attribute__ ((packed)); +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) { - struct sockaddr_ipx sipx; - int result; - int s; - char msg[1024]; - int len; - char *bptr; - struct rip_data *rp; + struct sockaddr_ipx sipx; + int result; + int s; + char msg[1024]; + int len; + char *bptr; + struct rip_data *rp; s = socket(AF_IPX, SOCK_DGRAM, AF_IPX); - if (s < 0) { + if (s < 0) + { perror("IPX: socket: "); exit(-1); } @@ -31,38 +37,37 @@ main(int argc, char **argv) sipx.sipx_network = 0; sipx.sipx_port = htons(0x453); sipx.sipx_type = 17; - result = bind(s, (struct sockaddr *)&sipx, sizeof(sipx)); - if (result < 0) { + result = bind(s, (struct sockaddr *) &sipx, sizeof(sipx)); + 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) { + result = recvfrom(s, msg, sizeof(msg), 0, + (struct sockaddr *) &sipx, &len); + if (result < 0) + { perror("IPX: recvfrom"); exit(-1); } bptr = msg; result -= 2; printf("RIP packet from: %08lX:%02X%02X%02X%02X%02X%02X\n", - htonl(sipx.sipx_network), - sipx.sipx_node[0], sipx.sipx_node[1], - sipx.sipx_node[2], sipx.sipx_node[3], - sipx.sipx_node[6], sipx.sipx_node[5]); + htonl(sipx.sipx_network), + sipx.sipx_node[0], sipx.sipx_node[1], + sipx.sipx_node[2], sipx.sipx_node[3], + 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)); + ntohs(rp->rip_hops)); result -= sizeof(struct rip_data); rp++; } } } - - - - diff --git a/ipx-1.0/Samples/sap.c b/ipx-1.0/Samples/sap.c index 594e52d..cfb3a6b 100644 --- a/ipx-1.0/Samples/sap.c +++ b/ipx-1.0/Samples/sap.c @@ -1,3 +1,7 @@ + + + + #include #include #include @@ -6,55 +10,58 @@ #include -struct sap_data { - unsigned short sap_type __attribute__ ((packed)); - char sap_name[48] __attribute__ ((packed)); - unsigned long sap_net __attribute__ ((packed)); - unsigned char sap_node[6] __attribute__ ((packed)); - unsigned short sap_sock __attribute__ ((packed)); - unsigned short sap_hops __attribute__ ((packed)); +struct sap_data +{ + unsigned short sap_type __attribute__((packed)); + char sap_name[48] __attribute__((packed)); + unsigned long sap_net __attribute__((packed)); + unsigned char sap_node[6] __attribute__((packed)); + unsigned short sap_sock __attribute__((packed)); + unsigned short sap_hops __attribute__((packed)); }; - + int main(int argc, char **argv) { - int s; - int result; - struct sockaddr_ipx sipx; - char msg[1024]; - long val = 0; - int len; - char *bptr; - struct sap_data *sp; + int s; + int result; + struct sockaddr_ipx sipx; + char msg[1024]; + long val = 0; + int len; + char *bptr; + 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); } - sipx.sipx_family = PF_IPX; sipx.sipx_network = 0L; sipx.sipx_port = htons(0x452); sipx.sipx_type = 17; - result = bind(s, (struct sockaddr *)&sipx, sizeof(sipx)); - if (result < 0) { + result = bind(s, (struct sockaddr *) &sipx, sizeof(sipx)); + 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) { + result = recvfrom(s, msg, sizeof(msg), 0, + (struct sockaddr *) &sipx, &len); + if (result < 0) + { perror("IPX: recvfrom: "); exit(-1); } @@ -67,30 +74,27 @@ main(int argc, char **argv) bptr += 2; sp = (struct sap_data *) bptr; - while (result >= sizeof(struct sap_data)) { - int i; - + while (result >= sizeof(struct sap_data)) + { + int i; + sp->sap_name[32] = '\0'; for (i = 31; (i > 0) && (sp->sap_name[i] == '_'); i--); i++; sp->sap_name[i] = '\0'; printf("NAME: %s TYPE: %x HOPS: %x\n", sp->sap_name, - ntohs(sp->sap_type), ntohs(sp->sap_hops)); - printf("%lx:%x %x %x %x %x %x: %x\n", - ntohl(sp->sap_net), - sp->sap_node[0], - sp->sap_node[1], - sp->sap_node[2], - sp->sap_node[3], - sp->sap_node[4], - sp->sap_node[5], - ntohs(sp->sap_sock)); + ntohs(sp->sap_type), ntohs(sp->sap_hops)); + printf("%lx:%x %x %x %x %x %x: %x\n", + ntohl(sp->sap_net), + sp->sap_node[0], + sp->sap_node[1], + sp->sap_node[2], + sp->sap_node[3], + sp->sap_node[4], + sp->sap_node[5], + ntohs(sp->sap_sock)); result -= sizeof(struct sap_data); sp++; } } } - - - - diff --git a/ipx-1.0/ipx_configure.c b/ipx-1.0/ipx_configure.c index da72787..1f4d754 100644 --- a/ipx-1.0/ipx_configure.c +++ b/ipx-1.0/ipx_configure.c @@ -1,5 +1,5 @@ /* Copyright (c) 1995-1996 Caldera, Inc. All Rights Reserved. - * + * See file COPYING for details. */ @@ -14,20 +14,21 @@ #include #include -struct option options[] = { - { "auto_primary", required_argument, NULL, 1 }, - { "auto_interface", required_argument, NULL, 2 }, - { "help", no_argument, NULL, 3}, - { NULL, 0, NULL, 0 } +struct option options[] = +{ + {"auto_primary", required_argument, NULL, 1}, + {"auto_interface", required_argument, NULL, 2}, + {"help", no_argument, NULL, 3}, + {NULL, 0, NULL, 0} }; -char *progname; +char *progname; void usage(void) { - fprintf(stderr, - "Usage: %s --auto_primary=[on|off]\n\ + fprintf(stderr, + "Usage: %s --auto_primary=[on|off]\n\ Usage: %s --auto_interface=[on|off]\n\ Usage: %s --help\n\ Usage: %s\n", progname, progname, progname, progname); @@ -37,36 +38,38 @@ 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, "TRUE") == 0) || + (strcasecmp(optarg, "SET") == 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, "FALSE") == 0) || + (strcasecmp(optarg, "CLEAR") == 0) || + (strcasecmp(optarg, "NO") == 0)) + { return 0; - } - + } return -1; } int main(int argc, char **argv) { - int s; - int result; - char errmsg[80]; - char val; - int option_index = 0; - int got_auto_pri = 0; - int got_auto_itf = 0; - ipx_config_data data; + int s; + int result; + char errmsg[80]; + char val; + int option_index = 0; + int got_auto_pri = 0; + int got_auto_itf = 0; + ipx_config_data data; 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); @@ -77,41 +80,44 @@ main(int argc, char **argv) } exit(-1); } - sprintf(errmsg, "%s: ioctl", progname); - while ((result = getopt_long(argc, argv, "", options, - &option_index)) != -1) { - switch (result) { - case 1: + while ((result = getopt_long(argc, argv, "", options, + &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); } break; case 2: - if (got_auto_itf) + if (got_auto_itf) break; 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); } @@ -122,16 +128,17 @@ 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", +Auto Interface Create is %s\n", (data.ipxcfg_auto_select_primary) ? "ON" : "OFF", (data.ipxcfg_auto_create_interfaces) ? "ON" : "OFF"); } exit(0); } - diff --git a/ipx-1.0/ipx_interface.c b/ipx-1.0/ipx_interface.c index e1ef8fe..105c529 100644 --- a/ipx-1.0/ipx_interface.c +++ b/ipx-1.0/ipx_interface.c @@ -1,5 +1,6 @@ + /* Copyright (c) 1995-1996 Caldera, Inc. All Rights Reserved. - * + * See file COPYING for details. */ @@ -17,8 +18,8 @@ #include #include -static struct ifreq id; -static char *progname; +static struct ifreq id; +static char *progname; void usage(void) @@ -30,17 +31,34 @@ Usage: %s check device frame_type\n", progname, progname, progname, progname); exit(-1); } -struct frame_type { - char *ft_name; - unsigned char ft_val; -} frame_types[] = { - {"802.2", IPX_FRAME_8022}, +struct frame_type +{ + char *ft_name; + unsigned char ft_val; +} +frame_types[] = +{ + { + "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)) @@ -48,20 +66,21 @@ struct frame_type { int lookup_frame_type(char *frame) { - int j; + int j; - for (j = 0; (j < NFTYPES) && - (strcasecmp(frame_types[j].ft_name, frame)); - j++) + for (j = 0; (j < NFTYPES) && + (strcasecmp(frame_types[j].ft_name, frame)); + j++) ; if (j != NFTYPES) return j; fprintf(stderr, "%s: Frame type must be", progname); - for (j = 0; j < NFTYPES; j++) { - fprintf(stderr, "%s%s", - (j == NFTYPES-1) ? " or " : " ", + for (j = 0; j < NFTYPES; j++) + { + fprintf(stderr, "%s%s", + (j == NFTYPES - 1) ? " or " : " ", frame_types[j].ft_name); } fprintf(stderr, ".\n"); @@ -71,44 +90,51 @@ lookup_frame_type(char *frame) int ipx_add_interface(int argc, char **argv) { - struct sockaddr_ipx *sipx = (struct sockaddr_ipx *)&id.ifr_addr; - int s; - int result; - unsigned long netnum; - char errmsg[80]; - int i, fti = 0; - char c; + struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &id.ifr_addr; + int s; + int result; + unsigned long netnum; + char errmsg[80]; + int i, fti = 0; + char c; 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) { - case 'p': sipx->sipx_special = IPX_PRIMARY; break; + 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; - case 1: /* Frame Type - Required */ + case 1: /* Frame Type - Required */ fti = lookup_frame_type(argv[i]); if (fti < 0) exit(-1); sipx->sipx_type = frame_types[fti].ft_val; break; - case 2: /* Network Number - Optional */ - netnum = strtoul(argv[i], (char **)NULL, 16); - if (netnum == 0xffffffffL) { - fprintf(stderr, - "%s: Inappropriate network number %08lX\n", + case 2: /* Network Number - Optional */ + netnum = strtoul(argv[i], (char **) NULL, 16); + if (netnum == 0xffffffffL) + { + fprintf(stderr, + "%s: Inappropriate network number %08lX\n", progname, netnum); exit(-1); } @@ -116,9 +142,10 @@ ipx_add_interface(int argc, char **argv) break; } } - + 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); @@ -129,18 +156,21 @@ ipx_add_interface(int argc, char **argv) } exit(-1); } - i = 0; sipx->sipx_family = AF_IPX; sipx->sipx_action = IPX_CRTITF; - do { + do + { result = ioctl(s, SIOCSIFADDR, &id); i++; - } while ((i < 5) && (result < 0) && (errno == EAGAIN)); + } + while ((i < 5) && (result < 0) && (errno == EAGAIN)); - if (result == 0) exit(0); - - switch (errno) { + if (result == 0) + exit(0); + + switch (errno) + { case EEXIST: fprintf(stderr, "%s: Primary network already selected.\n", progname); @@ -166,7 +196,7 @@ ipx_add_interface(int argc, char **argv) id.ifr_name); break; case EAGAIN: - fprintf(stderr, + fprintf(stderr, "%s: Insufficient memory to create interface.\n", progname); break; @@ -181,61 +211,67 @@ ipx_add_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; - int result; - char errmsg[80]; - char buffer[80]; - char device[20]; - char frame_type[20]; - int fti; - FILE *fp; + struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &id.ifr_addr; + int s; + int result; + char errmsg[80]; + char buffer[80]; + char device[20]; + char frame_type[20]; + int fti; + 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) { - fprintf(stderr, + if (fp == NULL) + { + fprintf(stderr, "%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); - if (fti < 0) continue; + if (fti < 0) + continue; sipx->sipx_type = frame_types[fti].ft_val; } sipx->sipx_action = IPX_DLTITF; sipx->sipx_family = AF_IPX; result = ioctl(s, SIOCSIFADDR, &id); - if (result == 0) continue; - switch (errno) { + if (result == 0) + continue; + switch (errno) + { case EPROTONOSUPPORT: fprintf(stderr, "%s: Invalid frame type (%s).\n", progname, frame_type); break; case ENODEV: - fprintf(stderr, "%s: No such device (%s).\n", + fprintf(stderr, "%s: No such device (%s).\n", progname, device); break; case EINVAL: - fprintf(stderr, "%s: No such IPX interface %s %s.\n", + fprintf(stderr, "%s: No such IPX interface %s %s.\n", progname, device, frame_type); break; default: @@ -251,16 +287,16 @@ ipx_delall_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; - int result; - char errmsg[80]; - int fti; - - if (argc != 3) { + struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &id.ifr_addr; + int s; + int result; + char errmsg[80]; + int fti; + + if (argc != 3) + { usage(); } - sipx->sipx_network = 0L; sipx->sipx_special = IPX_SPECIAL_NONE; strcpy(id.ifr_name, argv[1]); @@ -270,7 +306,8 @@ 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); @@ -278,9 +315,11 @@ ipx_del_interface(int argc, char **argv) sipx->sipx_action = IPX_DLTITF; sipx->sipx_family = AF_IPX; result = ioctl(s, SIOCSIFADDR, &id); - if (result == 0) exit(0); + 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); @@ -304,16 +343,16 @@ ipx_del_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; - int result; - char errmsg[80]; - int fti; - - if (argc != 3) { + struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &id.ifr_addr; + int s; + int result; + char errmsg[80]; + int fti; + + if (argc != 3) + { usage(); } - sipx->sipx_network = 0L; strcpy(id.ifr_name, argv[1]); fti = lookup_frame_type(argv[2]); @@ -322,25 +361,27 @@ 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 %08lX:%02X%02X%02X%02X%02X%02X.\n", - argv[1], frame_types[fti].ft_name, - 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]); + "IPX Address for (%s, %s) is %08lX:%02X%02X%02X%02X%02X%02X.\n", + argv[1], frame_types[fti].ft_name, + 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); @@ -364,31 +405,35 @@ ipx_check_interface(int argc, char **argv) int main(int argc, char **argv) { - int i; + int i; progname = argv[0]; - if (argc < 2) { + if (argc < 2) + { usage(); exit(-1); } - - 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) { - 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) { - 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) { - for (i = 1; i < (argc-1); i++) - argv[i] = argv[i+1]; - ipx_check_interface(argc-1, argv); - } + 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) + { + 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) + { + 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) + { + for (i = 1; i < (argc - 1); i++) + argv[i] = argv[i + 1]; + ipx_check_interface(argc - 1, argv); + } usage(); return 0; } diff --git a/ipx-1.0/ipx_internal_net.c b/ipx-1.0/ipx_internal_net.c index 2cad875..52e37ab 100644 --- a/ipx-1.0/ipx_internal_net.c +++ b/ipx-1.0/ipx_internal_net.c @@ -1,5 +1,5 @@ /* Copyright (c) 1995-1996 Caldera, Inc. All Rights Reserved. - * + * See file COPYING for details. */ @@ -15,8 +15,8 @@ #include #include -static struct ifreq id; -static char *progname; +static struct ifreq id; +static char *progname; void usage(void) @@ -29,12 +29,15 @@ Usage: %s del\n", progname, progname); int map_char_to_val(char dig) { - char digit = tolower(dig); - if ((digit >= '0') && (digit <= '9')) { + char digit = tolower(dig); + 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; } } @@ -42,80 +45,85 @@ map_char_to_val(char dig) int ipx_add_internal_net(int argc, char **argv) { - struct sockaddr_ipx *sipx = (struct sockaddr_ipx *)&id.ifr_addr; - int s; - int result; - unsigned long netnum; - char errmsg[80]; - int nodelen; - char *node; - char tmpnode[13]; - unsigned char *tout; - char *tin; - int i; - - if (argc != 3) { + struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &id.ifr_addr; + int s; + int result; + unsigned long netnum; + char errmsg[80]; + int nodelen; + char *node; + char tmpnode[13]; + unsigned char *tout; + char *tin; + int i; + + if (argc != 3) + { usage(); } - - netnum = strtoul(argv[1], (char **)NULL, 16); - if ((netnum == 0L) || (netnum == 0xffffffffL)) { - fprintf(stderr, "%s: Inappropriate network number %08lX\n", + netnum = strtoul(argv[1], (char **) NULL, 16); + 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++) { + memcpy(&(tmpnode[12 - nodelen]), node, nodelen); + 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)); + *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); } - sipx->sipx_network = htonl(netnum); 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); } - sipx->sipx_family = AF_IPX; sipx->sipx_action = IPX_CRTITF; i = 0; - do { + do + { result = ioctl(s, SIOCSIFADDR, &id); i++; - } while ((i < 5) && (result < 0) && (errno == EAGAIN)); + } + while ((i < 5) && (result < 0) && (errno == EAGAIN)); - if (result == 0) exit(0); - - switch (errno) { + if (result == 0) + exit(0); + + switch (errno) + { case EEXIST: fprintf(stderr, "%s: Primary network already selected.\n", progname); @@ -125,7 +133,7 @@ ipx_add_internal_net(int argc, char **argv) progname, htonl(sipx->sipx_network)); break; case EAGAIN: - fprintf(stderr, + fprintf(stderr, "%s: Insufficient memory to create internal net.\n", progname); break; @@ -140,19 +148,20 @@ ipx_add_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) { + struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &id.ifr_addr; + int s; + int result; + char errmsg[80]; + + 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); @@ -160,9 +169,11 @@ ipx_del_internal_net(int argc, char **argv) sipx->sipx_family = AF_IPX; sipx->sipx_action = IPX_DLTITF; result = ioctl(s, SIOCSIFADDR, &id); - if (result == 0) exit(0); + if (result == 0) + exit(0); - switch (errno) { + switch (errno) + { case ENOENT: fprintf(stderr, "%s: No internal network configured.\n", progname); break; @@ -177,24 +188,25 @@ ipx_del_internal_net(int argc, char **argv) int main(int argc, char **argv) { - int i; + int i; progname = argv[0]; - if (argc < 2) { + if (argc < 2) + { usage(); exit(-1); } - - 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) { - for (i = 1; i < (argc-1); i++) - argv[i] = argv[i+1]; - ipx_del_internal_net(argc-1, argv); + 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) + { + for (i = 1; i < (argc - 1); i++) + argv[i] = argv[i + 1]; + ipx_del_internal_net(argc - 1, argv); } usage(); return 0; } - diff --git a/ipx-1.0/ipx_route.c b/ipx-1.0/ipx_route.c index e280ac2..8f0489d 100644 --- a/ipx-1.0/ipx_route.c +++ b/ipx-1.0/ipx_route.c @@ -1,5 +1,6 @@ + /* Copyright (c) 1995-1996 Caldera, Inc. All Rights Reserved. - * + * See file COPYING for details. */ @@ -16,18 +17,21 @@ #include #include -static struct rtentry rd; -static char *progname; +static struct rtentry rd; +static char *progname; int map_char_to_val(char dig) { - char digit = tolower(dig); - if ((digit >= '0') && (digit <= '9')) { + char digit = tolower(dig); + 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; } } @@ -35,8 +39,8 @@ map_char_to_val(char dig) void usage(void) { - fprintf(stderr, - "Usage: %s add network(hex) router_network(hex) router_node(hex)\n\ + fprintf(stderr, + "Usage: %s add network(hex) router_network(hex) router_node(hex)\n\ Usage: %s del network(hex)\n", progname, progname); exit(-1); } @@ -45,27 +49,28 @@ int ipx_add_route(int argc, char **argv) { /* Router */ - struct sockaddr_ipx *sr = (struct sockaddr_ipx *)&rd.rt_gateway; + struct sockaddr_ipx *sr = (struct sockaddr_ipx *) &rd.rt_gateway; /* Target */ - struct sockaddr_ipx *st = (struct sockaddr_ipx *)&rd.rt_dst; - int s; - int result; - int nodelen; - int i; - unsigned long netnum; - char errmsg[80]; - char *node; - char *tin; - char tmpnode[13]; - unsigned char *tout; - + struct sockaddr_ipx *st = (struct sockaddr_ipx *) &rd.rt_dst; + int s; + int result; + int nodelen; + int i; + unsigned long netnum; + char errmsg[80]; + char *node; + char *tin; + char tmpnode[13]; + unsigned char *tout; + if (argc != 4) usage(); /* Network Number */ - netnum = strtoul(argv[1], (char **)NULL, 16); - if ((netnum == 0xffffffffL) || (netnum == 0L)) { - fprintf(stderr, "%s: Inappropriate network number %08lX\n", + netnum = strtoul(argv[1], (char **) NULL, 16); + if ((netnum == 0xffffffffL) || (netnum == 0L)) + { + fprintf(stderr, "%s: Inappropriate network number %08lX\n", progname, netnum); exit(-1); } @@ -73,63 +78,69 @@ ipx_add_route(int argc, char **argv) st->sipx_network = htonl(netnum); /* Router Network Number */ - netnum = strtoul(argv[2], (char **)NULL, 16); - if ((netnum == 0xffffffffL) || (netnum == 0L)) { - fprintf(stderr, "%s: Inappropriate network number %08lX\n", + netnum = strtoul(argv[2], (char **) NULL, 16); + if ((netnum == 0xffffffffL) || (netnum == 0L)) + { + fprintf(stderr, "%s: Inappropriate network number %08lX\n", progname, netnum); exit(-1); } sr->sipx_network = htonl(netnum); - + /* Router Node */ node = argv[3]; nodelen = strlen(node); - if (nodelen > 12) { - fprintf(stderr, "%s: Node length is too long (> 12).\n", + 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++) { + memcpy(&(tmpnode[12 - nodelen]), node, nodelen); + 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)); + *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++; - } while ((i < 5) && (result < 0) && (errno == EAGAIN)); + } + while ((i < 5) && (result < 0) && (errno == EAGAIN)); - if (result == 0) exit(0); + if (result == 0) + exit(0); - switch (errno) { + switch (errno) + { case ENETUNREACH: fprintf(stderr, "%s: Router network (%08lX) not reachable.\n", progname, htonl(sr->sipx_network)); @@ -146,23 +157,24 @@ int ipx_del_route(int argc, char **argv) { /* Router */ - struct sockaddr_ipx *sr = (struct sockaddr_ipx *)&rd.rt_gateway; + struct sockaddr_ipx *sr = (struct sockaddr_ipx *) &rd.rt_gateway; /* Target */ - struct sockaddr_ipx *st = (struct sockaddr_ipx *)&rd.rt_dst; - int s; - int result; - unsigned long netnum; - char errmsg[80]; - - if (argc != 2) { + struct sockaddr_ipx *st = (struct sockaddr_ipx *) &rd.rt_dst; + int s; + int result; + unsigned long netnum; + char errmsg[80]; + + if (argc != 2) + { usage(); } - rd.rt_flags = RTF_GATEWAY; /* Network Number */ - netnum = strtoul(argv[1], (char **)NULL, 16); - if ((netnum == 0xffffffffL) || (netnum == 0L)) { - fprintf(stderr, "%s: Inappropriate network number %08lX.\n", + netnum = strtoul(argv[1], (char **) NULL, 16); + if ((netnum == 0xffffffffL) || (netnum == 0L)) + { + fprintf(stderr, "%s: Inappropriate network number %08lX.\n", progname, netnum); exit(-1); } @@ -170,15 +182,18 @@ 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); } result = ioctl(s, SIOCDELRT, &rd); - if (result == 0) exit(0); + if (result == 0) + exit(0); - switch (errno) { + switch (errno) + { case ENOENT: fprintf(stderr, "%s: Route not found for network %08lX.\n", progname, netnum); @@ -198,22 +213,24 @@ ipx_del_route(int argc, char **argv) int main(int argc, char **argv) { - int i; + int i; progname = argv[0]; - if (argc < 2) { + if (argc < 2) + { usage(); exit(-1); } - - 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) { - for (i = 1; i < (argc-1); i++) - argv[i] = argv[i+1]; - ipx_del_route(argc-1, argv); + 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) + { + for (i = 1; i < (argc - 1); i++) + argv[i] = argv[i + 1]; + ipx_del_route(argc - 1, argv); } usage(); return 0; diff --git a/ipxdump/ipxdump.c b/ipxdump/ipxdump.c index 105c5ae..c85b024 100644 --- a/ipxdump/ipxdump.c +++ b/ipxdump/ipxdump.c @@ -1,7 +1,7 @@ -/* ipxdump.c */ +/* ipxdump.c */ /* Copyright 1996 Volker Lendecke, Goettingen, Germany - * + * 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 @@ -37,29 +37,29 @@ struct ipx_address { unsigned long net; - unsigned char node[IPX_NODE_LEN]; + unsigned char node[IPX_NODE_LEN]; unsigned short sock; }; struct ipx_packet { - unsigned short ipx_checksum; + unsigned short ipx_checksum; #define IPX_NO_CHECKSUM 0xFFFF - unsigned short ipx_pktsize; - unsigned char ipx_tctrl; - unsigned char ipx_type; + unsigned short ipx_pktsize; + unsigned char ipx_tctrl; + unsigned char ipx_type; #define IPX_TYPE_UNKNOWN 0x00 #define IPX_TYPE_RIP 0x01 /* may also be 0 */ #define IPX_TYPE_SAP 0x04 /* may also be 0 */ #define IPX_TYPE_SPX 0x05 /* Not yet implemented */ #define IPX_TYPE_NCP 0x11 /* $lots for docs on this (SPIT) */ #define IPX_TYPE_PPROP 0x14 /* complicated flood fill brdcast [Not supported] */ - struct ipx_address ipx_dest __attribute__ ((packed)); - struct ipx_address ipx_source __attribute__ ((packed)); + struct ipx_address ipx_dest __attribute__((packed)); + struct ipx_address ipx_source __attribute__((packed)); }; -void handle_frame (unsigned char *buf, int length, struct sockaddr *saddr); +void handle_frame(unsigned char *buf, int length, struct sockaddr *saddr); void handle_ipx(char *frame, unsigned char *buf); static int filter = 0; @@ -73,7 +73,7 @@ int_handler() } void -main (int argc, char *argv[]) +main(int argc, char *argv[]) { int sd; struct ifreq ifr, oldifr; @@ -94,63 +94,59 @@ main (int argc, char *argv[]) } 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"); + perror("Can't get socket"); fprintf(stderr, "You must run %s as root\n", argv[0]); - exit (1); + exit(1); } - /* SET PROMISC */ - strcpy (oldifr.ifr_name, device); - if (ioctl (sd, SIOCGIFFLAGS, &oldifr) < 0) + strcpy(oldifr.ifr_name, device); + if (ioctl(sd, SIOCGIFFLAGS, &oldifr) < 0) { - close (sd); - perror ("Can't get flags"); - exit (2); + close(sd); + perror("Can't get flags"); + exit(2); } - /* This should be rewritten to cooperate with other net tools */ 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); + 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); - length = recvfrom (sd, buf, sizeof(buf), 0, - &saddr, &sizeaddr); - if (length < 0 ) continue; - handle_frame (buf, length, &saddr); + length = recvfrom(sd, buf, sizeof(buf), 0, + &saddr, &sizeaddr); + if (length < 0) + continue; + handle_frame(buf, length, &saddr); } /* 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); + close(sd); + perror("Can't set flags"); + exit(4); } - - close (sd); - exit (0); + close(sd); + exit(0); } void -handle_ipx (char *frame, unsigned char *buf) +handle_ipx(char *frame, unsigned char *buf) { int i; - struct ipx_packet *h = (struct ipx_packet *)buf; + struct ipx_packet *h = (struct ipx_packet *) buf; struct sockaddr_ipx s_addr; struct sockaddr_ipx d_addr; int length = ntohs(h->ipx_pktsize); @@ -161,16 +157,16 @@ handle_ipx (char *frame, unsigned char *buf) memcpy(s_addr.sipx_node, h->ipx_source.node, sizeof(s_addr.sipx_node)); s_addr.sipx_port = h->ipx_source.sock; - s_addr.sipx_network = h->ipx_source.net; + s_addr.sipx_network = h->ipx_source.net; memcpy(d_addr.sipx_node, h->ipx_dest.node, sizeof(d_addr.sipx_node)); d_addr.sipx_port = h->ipx_dest.sock; - d_addr.sipx_network = h->ipx_dest.net; + d_addr.sipx_network = h->ipx_dest.net; if (filter != 0) { - if ( (memcmp(filter_node, s_addr.sipx_node, - sizeof(filter_node)) != 0) + if ((memcmp(filter_node, s_addr.sipx_node, + sizeof(filter_node)) != 0) && (memcmp(filter_node, d_addr.sipx_node, sizeof(filter_node)) != 0)) { @@ -178,7 +174,6 @@ handle_ipx (char *frame, unsigned char *buf) return; } } - printf("%s ", frame); for (i = 0; i < length; i++) @@ -193,9 +188,9 @@ handle_ipx (char *frame, unsigned char *buf) } void -handle_other (unsigned char *buf, int length, struct sockaddr *saddr) +handle_other(unsigned char *buf, int length, struct sockaddr *saddr) { - struct ethhdr *eth = (struct ethhdr *)buf; + struct ethhdr *eth = (struct ethhdr *) buf; unsigned char *p = &(buf[sizeof(struct ethhdr)]); if (ntohs(eth->h_proto) < 1536) @@ -206,34 +201,32 @@ handle_other (unsigned char *buf, int length, struct sockaddr *saddr) * which isnt a used 802.2 SSAP/DSAP. This won't work * 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)) + if ((*(unsigned short *) p == htons(0xe0e0)) && (p[2] == 0x03)) { - handle_ipx("802.2", p+3); + handle_ipx("802.2", p + 3); return; } - if (memcmp(p, "\252\252\003\000\000\000\201\067", 8) == 0) { - handle_ipx("snap", p+8); + handle_ipx("snap", p + 8); return; } } } void -handle_frame (unsigned char *buf, int length, struct sockaddr *saddr) +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( packet_type ) + unsigned short packet_type = ((struct ethhdr *) buf)->h_proto; + switch (packet_type) { case __constant_ntohs(ETH_P_IPX): handle_ipx("EtherII", &(buf[sizeof(struct ethhdr)])); diff --git a/ipxdump/ipxparse.c b/ipxdump/ipxparse.c index 2fb8d1c..b612e26 100644 --- a/ipxdump/ipxparse.c +++ b/ipxdump/ipxparse.c @@ -1,7 +1,7 @@ -/* ipxparse.c */ +/* ipxparse.c */ /* Copyright 1996 Volker Lendecke, Goettingen, Germany - * + * 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 @@ -35,117 +35,127 @@ #include #include "ipxutil.h" -#define DUMPALLSAPS /* #define if you want to dump all SAP's */ +#define DUMPALLSAPS /* #define if you want to dump all SAP's */ struct ipx_address { unsigned long net; - unsigned char node[IPX_NODE_LEN]; + unsigned char node[IPX_NODE_LEN]; unsigned short sock; }; struct ipx_packet { - unsigned short ipx_checksum; + unsigned short ipx_checksum; #define IPX_NO_CHECKSUM 0xFFFF - unsigned short ipx_pktsize; - unsigned char ipx_tctrl; - unsigned char ipx_type; + unsigned short ipx_pktsize; + unsigned char ipx_tctrl; + unsigned char ipx_type; #define IPX_TYPE_UNKNOWN 0x00 #define IPX_TYPE_RIP 0x01 /* may also be 0 */ #define IPX_TYPE_SAP 0x04 /* may also be 0 */ #define IPX_TYPE_SPX 0x05 /* Not yet implemented */ #define IPX_TYPE_NCP 0x11 /* $lots for docs on this (SPIT) */ #define IPX_TYPE_PPROP 0x14 /* complicated flood fill brdcast [Not supported] */ - struct ipx_address ipx_dest __attribute__ ((packed)); - struct ipx_address ipx_source __attribute__ ((packed)); + struct ipx_address ipx_dest __attribute__((packed)); + struct ipx_address ipx_source __attribute__((packed)); }; #define NCP_ALLOC_SLOT_REQUEST (0x1111) #define NCP_REQUEST (0x2222) #define NCP_DEALLOC_SLOT_REQUEST (0x5555) -struct ncp_request_header { - __u16 type __attribute__ ((packed)); - __u8 sequence __attribute__ ((packed)); - __u8 conn_low __attribute__ ((packed)); - __u8 task __attribute__ ((packed)); - __u8 conn_high __attribute__ ((packed)); - __u8 function __attribute__ ((packed)); - __u8 data[0] __attribute__ ((packed)); +struct ncp_request_header +{ + __u16 type __attribute__((packed)); + __u8 sequence __attribute__((packed)); + __u8 conn_low __attribute__((packed)); + __u8 task __attribute__((packed)); + __u8 conn_high __attribute__((packed)); + __u8 function __attribute__((packed)); + __u8 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)); +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_BURST_PACKET (0x7777) -struct ncp_burst_header { - __u16 type __attribute__ ((packed)); - __u8 system_flags __attribute__ ((packed)); - __u8 stream_type __attribute__ ((packed)); - __u32 source_conn __attribute__ ((packed)); - __u32 dest_conn __attribute__ ((packed)); - __u32 packet_sequence __attribute__ ((packed)); - __u32 send_delay __attribute__ ((packed)); - __u16 burst_sequence __attribute__ ((packed)); - __u16 ack_sequence __attribute__ ((packed)); - __u32 burst_length __attribute__ ((packed)); - __u32 data_offset __attribute__ ((packed)); - __u16 data_bytes __attribute__ ((packed)); - __u16 missing_frags __attribute__ ((packed)); +struct ncp_burst_header +{ + __u16 type __attribute__((packed)); + __u8 system_flags __attribute__((packed)); + __u8 stream_type __attribute__((packed)); + __u32 source_conn __attribute__((packed)); + __u32 dest_conn __attribute__((packed)); + __u32 packet_sequence __attribute__((packed)); + __u32 send_delay __attribute__((packed)); + __u16 burst_sequence __attribute__((packed)); + __u16 ack_sequence __attribute__((packed)); + __u32 burst_length __attribute__((packed)); + __u32 data_offset __attribute__((packed)); + __u16 data_bytes __attribute__((packed)); + __u16 missing_frags __attribute__((packed)); }; -void handle_ipx (unsigned char *buf, int length, char *frame, int no); -void handle_ncp (struct sockaddr_ipx *source, - struct sockaddr_ipx *target, - unsigned char *buf, int length, int no); +void handle_ipx(unsigned char *buf, int length, char *frame, int no); +void handle_ncp(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); #define SAP_MAX_SERVER_NAME_LENGTH 48 /* in network packets */ #define SAP_MAX_SAPS_PER_PACKET 7 -#define SAP_SHUTDOWN 16 /* Magic "hops" value to stop SAP advertising */ +#define SAP_SHUTDOWN 16 /* Magic "hops" value to stop SAP advertising */ /* SAP Query structure (returned in sap_packet as an array) * NBO == Network Byte Order) */ -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; +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; /* General Service/Nearest Server Response SAP packet */ -union sap_packet { - unsigned short sapOperation; - struct sap_query { - __u16 sapOperation __attribute__ ((packed)); - __u16 serverType __attribute__ ((packed)); - } query; - struct sap_response { - __u16 sapOperation __attribute__ ((packed)); +union sap_packet +{ + unsigned short sapOperation; + struct sap_query + { + __u16 sapOperation __attribute__((packed)); + __u16 serverType __attribute__((packed)); + } + 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; + SAPS sap[SAP_MAX_SAPS_PER_PACKET] __attribute__((packed)); + } + response; }; /* print out one SAP record */ static void -print_sap(FILE *file, SAPS *sapp) +print_sap(FILE * file, SAPS * sapp) { fprintf(file, " Name:%s, serverType 0x%x, ", sapp->serverName, @@ -159,25 +169,25 @@ print_sap(FILE *file, SAPS *sapp) } void -handle_ipx (unsigned char *buf, int length, char *frame, int no) +handle_ipx(unsigned char *buf, int length, char *frame, int no) { - struct ipx_packet *h = (struct ipx_packet *)buf; + struct ipx_packet *h = (struct ipx_packet *) buf; struct sockaddr_ipx s_addr; struct sockaddr_ipx d_addr; - union sap_packet *sappacket; - int hbo_dsock; /* Host Byte Order of Destination SOCKet */ - int hbo_sapop; /* Host Byte Order of SAP OPeration */ + union sap_packet *sappacket; + int hbo_dsock; /* Host Byte Order of Destination SOCKet */ + int hbo_sapop; /* Host Byte Order of SAP OPeration */ memset(&s_addr, 0, sizeof(s_addr)); memset(&d_addr, 0, sizeof(d_addr)); memcpy(s_addr.sipx_node, h->ipx_source.node, sizeof(s_addr.sipx_node)); s_addr.sipx_port = h->ipx_source.sock; - s_addr.sipx_network = h->ipx_source.net; + s_addr.sipx_network = h->ipx_source.net; memcpy(d_addr.sipx_node, h->ipx_dest.node, sizeof(d_addr.sipx_node)); d_addr.sipx_port = h->ipx_dest.sock; - d_addr.sipx_network = h->ipx_dest.net; + d_addr.sipx_network = h->ipx_dest.net; printf("%6.6d %s from ", no, frame); @@ -191,42 +201,37 @@ handle_ipx (unsigned char *buf, int length, char *frame, int no) { return; } - - if ( (ntohs(s_addr.sipx_port) == 0x451) + if ((ntohs(s_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 /* next 3 handle IPX by type vs by socket (one or other) */ - /* Note: most things use either ipx_type OR socket, not both */ - if (h->ipx_type == 0x01) + } else + /* next 3 handle IPX by type vs by socket (one or other) */ + /* Note: most things use either ipx_type OR socket, not both */ if (h->ipx_type == 0x01) printf(" type 0x01 (RIP packet (router))\n"); - else - if (h->ipx_type == 0x05) + else if (h->ipx_type == 0x05) printf(" type 0x05 (SPX sequenced packet)\n"); - else - if (h->ipx_type == 0x14) + else if (h->ipx_type == 0x14) printf(" type 0x14 (propogated Client-NetBios)\n"); 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)); + (buf + sizeof(struct ipx_packet)); hbo_sapop = ntohs(sappacket->sapOperation); 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 + } else { int hops; @@ -238,12 +243,12 @@ handle_ipx (unsigned char *buf, int length, char *frame, int no) ? "General Service Response" : (hbo_sapop == 0x04) ? "Nearest Server Response" : - "Unknown", + "Unknown", (hops >= SAP_SHUTDOWN) ? "[Shutdown]" : ""); /* Service ending */ - if (hops >= SAP_SHUTDOWN) + if (hops >= SAP_SHUTDOWN) { print_sap(stdout, sappacket->response.sap); @@ -251,80 +256,80 @@ handle_ipx (unsigned char *buf, int length, char *frame, int no) #ifdef DUMPALLSAPS /* If you want to dump all SAP's */ else - { int num_saps; - SAPS *sapp; + { + int num_saps; + SAPS *sapp; num_saps = (length - sizeof(struct ipx_packet) - 2) / sizeof(SAPS); sapp = sappacket->response.sap; - for(; num_saps > 0; sapp++, num_saps--) + for (; num_saps > 0; sapp++, num_saps--) print_sap(stdout, sapp); } -#endif /* DUMPALLSAPS */ +#endif /* DUMPALLSAPS */ } - } - else /* Other IPX types */ - printf(" type 0x%x, Socket 0x%x (%s)\n", h->ipx_type, - hbo_dsock, - (hbo_dsock == 0x451) ? "NCP" : -/* (hbo_dsock == 0x452) ? "SAP" :*/ - (hbo_dsock == 0x453) ? "RIP" : - (hbo_dsock == 0x455) ? "Client-NetBios" : - (hbo_dsock == 0x456) ? "Diags" : - (hbo_dsock == 0x002) ? "Xecho" : - (hbo_dsock == 0x8063) ? "NVT2" : "Other"); + } else /* Other IPX types */ + printf(" type 0x%x, Socket 0x%x (%s)\n", h->ipx_type, + hbo_dsock, + (hbo_dsock == 0x451) ? "NCP" : +/* (hbo_dsock == 0x452) ? "SAP" : */ + (hbo_dsock == 0x453) ? "RIP" : + (hbo_dsock == 0x455) ? "Client-NetBios" : + (hbo_dsock == 0x456) ? "Diags" : + (hbo_dsock == 0x002) ? "Xecho" : + (hbo_dsock == 0x8063) ? "NVT2" : "Other"); } - + } -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; + struct ncp_burst_header *rq = (struct ncp_burst_header *) buf; if (rq->type != NCP_BURST_PACKET) { return 0; } - printf("Burst Packet\n"); printf("Stream Type: %02X, System Flags: %02X\n", rq->stream_type, rq->system_flags); printf("Source Conn: %08X, Dest Conn: %08X, Packet Seq: %08X\n", rq->source_conn, rq->dest_conn, - (unsigned int)ntohl(rq->packet_sequence)); + (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("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 { - 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; + 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; printf("Assuming Burst Request:\n"); printf("%s: Handle %08X, Offset %08X, Bytes %08X\n", brq->function == 1 ? "Read " : "Write", brq->file_handle, - (unsigned int)ntohl(brq->file_offset), - (unsigned int)ntohl(brq->number_of_bytes)); + (unsigned int) ntohl(brq->file_offset), + (unsigned int) ntohl(brq->number_of_bytes)); } - printf("\n"); return 1; } @@ -334,8 +339,8 @@ 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; + struct ncp_request_header *rq = (struct ncp_request_header *) buf; + struct ncp_reply_header *rs = (struct ncp_reply_header *) buf; unsigned char *data = NULL; int data_length = 0; int i; @@ -353,12 +358,12 @@ handle_ncp(struct sockaddr_ipx *source, memcpy(&request_source, source, sizeof(request_source)); memcpy(&request_header, rq, sizeof(request_header)); - memcpy(request_data, rq+1, sizeof(request_data)); + memcpy(request_data, rq + 1, sizeof(request_data)); 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); @@ -371,7 +376,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"); @@ -386,7 +391,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"); @@ -431,7 +436,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"); @@ -497,7 +502,7 @@ handle_ncp(struct sockaddr_ipx *source, printf("Service Queue Job \n"); break; } - + data += 3; data_length -= 3; break; @@ -551,26 +556,26 @@ handle_ncp(struct sockaddr_ipx *source, printf("fn: %-3d\n", rq->function); printf("Open File (old)\n"); break; - + 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]); - printf("Open Create File or Subdirectory\n"); - printf("Name Space: %d\n", p[1]); - printf("Open Create Mode: %x\n", p[2]); - printf("Search Attributes: %x\n", - *(__u16 *)&(p[3])); - printf("Return Information Mask: %x\n", - (unsigned int)(*(__u32 *)&(p[5]))); - printf("Desired Access Rights: %x\n", - *(__u16 *)&(p[9])); - break; - } + { + unsigned char *p = &(data[0]); + printf("Open Create File or Subdirectory\n"); + printf("Name Space: %d\n", p[1]); + printf("Open Create Mode: %x\n", p[2]); + printf("Search Attributes: %x\n", + *(__u16 *) & (p[3])); + printf("Return Information Mask: %x\n", + (unsigned int) (*(__u32 *) & (p[5]))); + printf("Desired Access Rights: %x\n", + *(__u16 *) & (p[9])); + break; + } case 2: printf("Initialize Search\n"); break; @@ -592,348 +597,350 @@ handle_ncp(struct sockaddr_ipx *source, data_length -= 1; break; case 97: - { - struct INPUT - { - __u16 proposed_max_size; - __u8 security_flag; - } *i = (struct INPUT *)data; - - printf("fn: %-3d\n", rq->function); - printf("Get Big Packet NCP Max Packet Size\n"); - printf("proposed_max_size: %x\n", - ntohs(i->proposed_max_size)); - printf("security_flag: %x\n", - i->security_flag); - break; - } - case 101: - { - struct INPUT - { - __u32 local_conn_id; - __u32 local_max_packet_size; - __u16 local_target_socket; - __u32 local_max_send_size; - __u32 local_max_recv_size; - } *i = (struct INPUT *)data; - - printf("fn: %-3d\n", rq->function); - printf("Packet Burst Connection Request\n"); - printf("local_conn_id: %lx\n", - ntohl(i->local_conn_id)); - printf("local_max_packet_size: %lx\n", - ntohl(i->local_max_packet_size)); - printf("local_target_socket: %lx\n", - ntohl(i->local_target_socket)); - printf("local_max_send_size: %lx\n", - ntohl(i->local_max_send_size)); - printf("local_max_recv_size: %lx\n", - ntohl(i->local_max_recv_size)); - } - break; - case 104: - { - printf("fn: %-3d, subfn: %-3d, NDS call\n", - rq->function, data[0]); - - /* I took this information from the (german!!) - book 'Einf"uhrung in die NetWare LAN - Analyse', Laura A. Chappell, Dan E. Hakes, - Novell Press, Markt & Technik, ISBN - 3-8272-5084-6, and from the book mentioned - in the ncpfs README. I'm not sure it is - correct, because I do not have NW 4.x. If - you have the time, could you watch a NW4 - workstation, and tell me whether anything - of this makes sense at all. */ - - switch(data[0]) - { - case 1: - printf("Ping for NDS\n"); - break; - case 2: { struct INPUT { - __u8 subfunction_code; - __u32 fragger_handle; - __u32 max_fragment_size; - __u32 message_size; - __u32 fragment_flag; - __u32 verb; - } *i = (struct INPUT *)data; - printf("Send NDS Fragment Request/Reply\n"); - printf("fragger_handle: %lx\n", - (unsigned long)i->fragger_handle); - printf("max_fragment_size: %lx\n", - (unsigned long)i->max_fragment_size); - printf("message_size: %lx\n", - (unsigned long)i->message_size); - printf("fragment_flag: %lx\n", - (unsigned long)i->fragment_flag); - printf("verb: %d\n", i->verb); + __u16 proposed_max_size; + __u8 security_flag; + } + *i = (struct INPUT *) data; - switch (i->verb) + printf("fn: %-3d\n", rq->function); + printf("Get Big Packet NCP Max Packet Size\n"); + printf("proposed_max_size: %x\n", + ntohs(i->proposed_max_size)); + printf("security_flag: %x\n", + i->security_flag); + break; + } + case 101: + { + struct INPUT + { + __u32 local_conn_id; + __u32 local_max_packet_size; + __u16 local_target_socket; + __u32 local_max_send_size; + __u32 local_max_recv_size; + } + *i = (struct INPUT *) data; + + printf("fn: %-3d\n", rq->function); + printf("Packet Burst Connection Request\n"); + printf("local_conn_id: %lx\n", + ntohl(i->local_conn_id)); + printf("local_max_packet_size: %lx\n", + ntohl(i->local_max_packet_size)); + printf("local_target_socket: %lx\n", + ntohl(i->local_target_socket)); + printf("local_max_send_size: %lx\n", + ntohl(i->local_max_send_size)); + printf("local_max_recv_size: %lx\n", + ntohl(i->local_max_recv_size)); + } + break; + case 104: + { + printf("fn: %-3d, subfn: %-3d, NDS call\n", + rq->function, data[0]); + + /* I took this information from the (german!!) + book 'Einf"uhrung in die NetWare LAN + Analyse', Laura A. Chappell, Dan E. Hakes, + Novell Press, Markt & Technik, ISBN + 3-8272-5084-6, and from the book mentioned + in the ncpfs README. I'm not sure it is + correct, because I do not have NW 4.x. If + you have the time, could you watch a NW4 + workstation, and tell me whether anything + of this makes sense at all. */ + + switch (data[0]) { case 1: - printf("Resolve Name\n"); + printf("Ping for NDS\n"); break; case 2: - printf("Read Entry Information\n"); - break; + { + struct INPUT + { + __u8 subfunction_code; + __u32 fragger_handle; + __u32 max_fragment_size; + __u32 message_size; + __u32 fragment_flag; + __u32 verb; + } + *i = (struct INPUT *) data; + printf("Send NDS Fragment Request/Reply\n"); + printf("fragger_handle: %lx\n", + (unsigned long) i->fragger_handle); + printf("max_fragment_size: %lx\n", + (unsigned long) i->max_fragment_size); + printf("message_size: %lx\n", + (unsigned long) i->message_size); + printf("fragment_flag: %lx\n", + (unsigned long) i->fragment_flag); + printf("verb: %d\n", i->verb); + + switch (i->verb) + { + case 1: + printf("Resolve Name\n"); + break; + case 2: + printf("Read Entry Information\n"); + break; + case 3: + printf("Read\n"); + break; + case 4: + printf("Compare\n"); + break; + case 5: + printf("List\n"); + break; + case 6: + printf("Search Entries\n"); + break; + case 7: + printf("Add Entry\n"); + break; + case 8: + printf("Remove Entry\n"); + break; + case 9: + printf("Modify Entry\n"); + break; + case 10: + printf("Modify RDN\n"); + break; + case 11: + printf("Create Attribute\n"); + break; + case 12: + printf("Read Attribute Definition\n"); + break; + case 13: + printf("Remove Attribute Definition\n"); + break; + case 14: + printf("Define Class\n"); + break; + case 15: + printf("Read Class Definition\n"); + break; + case 16: + printf("Modify Class Definition\n"); + break; + case 17: + printf("Remove Class Definition\n"); + break; + case 18: + printf("List Containable Classes\n"); + break; + case 19: + printf("Get Effective Rights\n"); + break; + case 20: + printf("Add Partition\n"); + break; + case 21: + printf("Remove Partition\n"); + break; + case 22: + printf("List Partitions\n"); + break; + case 23: + printf("Split Partition\n"); + break; + case 24: + printf("Join Partitions\n"); + break; + case 25: + printf("Add Replica\n"); + break; + case 26: + printf("Remove Replica\n"); + break; + case 27: + printf("Open Stream\n"); + break; + case 28: + printf("Search Filter\n"); + break; + case 29: + printf("Create Subordinate Reference\n"); + break; + case 30: + printf("Link Replica\n"); + break; + case 31: + printf("Change Replica Type\n"); + break; + case 32: + printf("Start Update Schema\n"); + break; + case 33: + printf("End Update Schema\n"); + break; + case 34: + printf("Update Schema\n"); + break; + case 35: + printf("Start Update Replica\n"); + break; + case 36: + printf("End Update Replica\n"); + break; + case 37: + printf("Update Replica\n"); + break; + case 38: + printf("Synchronize Partition\n"); + break; + case 39: + printf("Synchronize Schema\n"); + break; + case 40: + printf("Read Syntaxes\n"); + break; + case 41: + printf("Get Replica Root ID\n"); + break; + case 42: + printf("Begin Move Entry\n"); + break; + case 43: + printf("Finish Move Entry\n"); + break; + case 44: + printf("Release Moved Entry\n"); + break; + case 45: + printf("Backup Entry\n"); + break; + case 46: + printf("Restore Entry\n"); + break; + case 47: + printf("Save DIB\n"); + break; + case 48: + case 49: + printf("Unused\n"); + break; + case 50: + printf("Close Iteration\n"); + break; + case 51: + printf("Unused\n"); + break; + case 52: + printf("Audit Skulking\n"); + break; + case 53: + printf("Get Server Address\n"); + break; + case 54: + printf("Set Keys\n"); + break; + case 55: + printf("Change Password\n"); + break; + case 56: + printf("Verify Password\n"); + break; + case 57: + printf("Begin Login\n"); + break; + case 58: + printf("Finish Login\n"); + break; + case 59: + printf("Begin Authentication\n"); + break; + case 60: + printf("Finish Authentication\n"); + break; + case 61: + printf("Logout\n"); + break; + case 62: + printf("Repair Ring\n"); + break; + case 63: + printf("Repair Timestamps\n"); + break; + case 64: + printf("Create Back Link\n"); + break; + case 65: + printf("Delete External Reference\n"); + break; + case 66: + printf("Rename External Reference\n"); + break; + case 67: + printf("Create Directory Entry\n"); + break; + case 68: + printf("Remove Directory Entry\n"); + break; + case 69: + printf("Designate New Master\n"); + break; + case 70: + printf("Change Tree Name\n"); + break; + case 71: + printf("Partition Entry Count\n"); + break; + case 72: + printf("Check Login Restrictions\n"); + break; + case 73: + printf("Start Join\n"); + break; + case 74: + printf("Low Level Split\n"); + break; + case 75: + printf("Low Level Join\n"); + break; + case 76: + printf("Abort Low Level Join\n"); + break; + case 77: + printf("Get All Servers\n"); + break; + default: + printf("Unknown Verb: %d\n", + data[0]); + break; + } + break; + } case 3: - printf("Read\n"); + printf("Close NDS Fragment\n"); break; case 4: - printf("Compare\n"); + printf("Return Bindery Context\n"); break; case 5: - printf("List\n"); + printf("Monitor NDS connection\n"); break; - case 6: - printf("Search Entries\n"); - break; - case 7: - printf("Add Entry\n"); - break; - case 8: - printf("Remove Entry\n"); - break; - case 9: - printf("Modify Entry\n"); - break; - case 10: - printf("Modify RDN\n"); - break; - case 11: - printf("Create Attribute\n"); - break; - case 12: - printf("Read Attribute Definition\n"); - break; - case 13: - printf("Remove Attribute Definition\n"); - break; - case 14: - printf("Define Class\n"); - break; - case 15: - printf("Read Class Definition\n"); - break; - case 16: - printf("Modify Class Definition\n"); - break; - case 17: - printf("Remove Class Definition\n"); - break; - case 18: - printf("List Containable Classes\n"); - break; - case 19: - printf("Get Effective Rights\n"); - break; - case 20: - printf("Add Partition\n"); - break; - case 21: - printf("Remove Partition\n"); - break; - case 22: - printf("List Partitions\n"); - break; - case 23: - printf("Split Partition\n"); - break; - case 24: - printf("Join Partitions\n"); - break; - case 25: - printf("Add Replica\n"); - break; - case 26: - printf("Remove Replica\n"); - break; - case 27: - printf("Open Stream\n"); - break; - case 28: - printf("Search Filter\n"); - break; - case 29: - printf("Create Subordinate Reference\n"); - break; - case 30: - printf("Link Replica\n"); - break; - case 31: - printf("Change Replica Type\n"); - break; - case 32: - printf("Start Update Schema\n"); - break; - case 33: - printf("End Update Schema\n"); - break; - case 34: - printf("Update Schema\n"); - break; - case 35: - printf("Start Update Replica\n"); - break; - case 36: - printf("End Update Replica\n"); - break; - case 37: - printf("Update Replica\n"); - break; - case 38: - printf("Synchronize Partition\n"); - break; - case 39: - printf("Synchronize Schema\n"); - break; - case 40: - printf("Read Syntaxes\n"); - break; - case 41: - printf("Get Replica Root ID\n"); - break; - case 42: - printf("Begin Move Entry\n"); - break; - case 43: - printf("Finish Move Entry\n"); - break; - case 44: - printf("Release Moved Entry\n"); - break; - case 45: - printf("Backup Entry\n"); - break; - case 46: - printf("Restore Entry\n"); - break; - case 47: - printf("Save DIB\n"); - break; - case 48: - case 49: - printf("Unused\n"); - break; - case 50: - printf("Close Iteration\n"); - break; - case 51: - printf("Unused\n"); - break; - case 52: - printf("Audit Skulking\n"); - break; - case 53: - printf("Get Server Address\n"); - break; - case 54: - printf("Set Keys\n"); - break; - case 55: - printf("Change Password\n"); - break; - case 56: - printf("Verify Password\n"); - break; - case 57: - printf("Begin Login\n"); - break; - case 58: - printf("Finish Login\n"); - break; - case 59: - printf("Begin Authentication\n"); - break; - case 60: - printf("Finish Authentication\n"); - break; - case 61: - printf("Logout\n"); - break; - case 62: - printf("Repair Ring\n"); - break; - case 63: - printf("Repair Timestamps\n"); - break; - case 64: - printf("Create Back Link\n"); - break; - case 65: - printf("Delete External Reference\n"); - break; - case 66: - printf("Rename External Reference\n"); - break; - case 67: - printf("Create Directory Entry\n"); - break; - case 68: - printf("Remove Directory Entry\n"); - break; - case 69: - printf("Designate New Master\n"); - break; - case 70: - printf("Change Tree Name\n"); - break; - case 71: - printf("Partition Entry Count\n"); - break; - case 72: - printf("Check Login Restrictions\n"); - break; - case 73: - printf("Start Join\n"); - break; - case 74: - printf("Low Level Split\n"); - break; - case 75: - printf("Low Level Join\n"); - break; - case 76: - printf("Abort Low Level Join\n"); - break; - case 77: - printf("Get All Servers\n"); + case 200: + printf("NDS Auditing\n"); break; default: - printf("Unknown Verb: %d\n", - data[0]); break; } - break; } - case 3: - printf("Close NDS Fragment\n"); - break; - case 4: - printf("Return Bindery Context\n"); - break; - case 5: - printf("Monitor NDS connection\n"); - break; - case 200: - printf("NDS Auditing\n"); - break; - default: - break; - } - } default: printf("fn: %-3d\n", rq->function); } } - if (ntohs(rs->type) == NCP_REPLY) { printf("NCP respons: conn: %-5d, seq: %-3d, task: %-3d, ", @@ -945,8 +952,8 @@ handle_ncp(struct sockaddr_ipx *source, data = buf + sizeof(struct ncp_reply_header); data_length = length - sizeof(struct ncp_reply_header); - if ( (memcmp(&request_source, target, - sizeof(request_source)) == 0) + if ((memcmp(&request_source, target, + sizeof(request_source)) == 0) && (request_header.sequence == rs->sequence)) { switch (request_header.function) @@ -955,17 +962,18 @@ handle_ncp(struct sockaddr_ipx *source, switch (request_data[2]) { case 18: - { - struct XDATA { - __u8 new_directory_handle; - __u8 access_rights_mask; - } *x = (struct XDATA *)data; - printf("new_directory_handle: %x\n", - x->new_directory_handle); - printf("access_rights_mask: %x\n", - x->access_rights_mask); - } + struct XDATA + { + __u8 new_directory_handle; + __u8 access_rights_mask; + } + *x = (struct XDATA *) data; + printf("new_directory_handle: %x\n", + x->new_directory_handle); + printf("access_rights_mask: %x\n", + x->access_rights_mask); + } break; } break; @@ -974,65 +982,63 @@ handle_ncp(struct sockaddr_ipx *source, data_length = 0; break; case 97: - { - struct XDATA { - __u16 accepted_max_size; - __u16 echo_socket; - __u8 security_flag; - } *x = (struct XDATA *)data; - printf("accepted_max_size: %x\n", - ntohs(x->accepted_max_size)); - printf("echo_socket: %x\n", - ntohs(x->echo_socket)); - printf("security_flag: %x\n", - (x->security_flag)); - } + struct XDATA + { + __u16 accepted_max_size; + __u16 echo_socket; + __u8 security_flag; + } + *x = (struct XDATA *) data; + printf("accepted_max_size: %x\n", + ntohs(x->accepted_max_size)); + printf("echo_socket: %x\n", + ntohs(x->echo_socket)); + printf("security_flag: %x\n", + (x->security_flag)); + } break; case 101: - { - struct XDATA { - __u8 completion_code; - __u32 remote_target_id; - __u32 remote_max_packet_size; - } *x = (struct XDATA *)data; - printf("completion_code: %x\n", - x->completion_code); - printf("remote_target_id: %lx\n", - ntohl(x->remote_target_id)); - printf("remote_max_packet_size: %lx\n", - ntohl(x->remote_max_packet_size)); - } + struct XDATA + { + __u8 completion_code; + __u32 remote_target_id; + __u32 remote_max_packet_size; + } + *x = (struct XDATA *) data; + printf("completion_code: %x\n", + x->completion_code); + printf("remote_target_id: %lx\n", + ntohl(x->remote_target_id)); + printf("remote_max_packet_size: %lx\n", + ntohl(x->remote_max_packet_size)); + } break; } } - } - if (data == NULL) { data = buf; data_length = length; } - i = 0; while (i < data_length) { int j; - for (j = i; j < i+16; j++) + 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++) + for (j = i; j < i + 16; j++) { if (j >= data_length) { @@ -1041,8 +1047,7 @@ handle_ncp(struct sockaddr_ipx *source, if (isprint(data[j])) { printf("%c", data[j]); - } - else + } else { printf("."); } @@ -1055,7 +1060,7 @@ handle_ncp(struct sockaddr_ipx *source, void -main (int argc, char *argv[]) +main(int argc, char *argv[]) { unsigned char buf[16384]; unsigned char packet[8192]; @@ -1065,19 +1070,17 @@ main (int argc, char *argv[]) while (fgets(buf, sizeof(buf), stdin) != NULL) { - if (strlen(buf) == sizeof(buf)-1) + if (strlen(buf) == sizeof(buf) - 1) { fprintf(stderr, "line too long\n"); exit(1); } - b = strchr(buf, ' '); if (b == NULL) { fprintf(stderr, "illegal line format\n"); exit(1); } - *b = '\0'; b += 1; len = 0; @@ -1097,6 +1100,6 @@ main (int argc, char *argv[]) handle_ipx(packet, len, buf, i); i += 1; } - - exit (0); + + exit(0); } diff --git a/ipxdump/ipxutil.c b/ipxdump/ipxutil.c index 215e0d5..7fe5c4c 100644 --- a/ipxdump/ipxutil.c +++ b/ipxdump/ipxutil.c @@ -1,97 +1,101 @@ + + + + /* - IPX support library - general functions + IPX support library - general functions - Copyright (C) 1994, 1995 Ales Dryak - Copyright (C) 1996, Volker Lendecke + Copyright (C) 1994, 1995 Ales Dryak + Copyright (C) 1996, Volker Lendecke - 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 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. + 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. + 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 #include #include "ipxutil.h" void -ipx_fprint_node(FILE *file, IPXNode node) +ipx_fprint_node(FILE * file, IPXNode node) { - fprintf(file,"%02X%02X%02X%02X%02X%02X", - (unsigned char)node[0], - (unsigned char)node[1], - (unsigned char)node[2], - (unsigned char)node[3], - (unsigned char)node[4], - (unsigned char)node[5] - ); + fprintf(file, "%02X%02X%02X%02X%02X%02X", + (unsigned char) node[0], + (unsigned char) node[1], + (unsigned char) node[2], + (unsigned char) node[3], + (unsigned char) node[4], + (unsigned char) node[5] + ); } void -ipx_fprint_network(FILE *file, IPXNet net) +ipx_fprint_network(FILE * file, IPXNet net) { - fprintf(file,"%08lX",net); + fprintf(file, "%08lX", net); } void -ipx_fprint_port(FILE *file, IPXPort port) +ipx_fprint_port(FILE * file, IPXPort port) { - fprintf(file,"%04X",port); + fprintf(file, "%04X", port); } void -ipx_fprint_saddr(FILE *file, struct sockaddr_ipx *sipx) +ipx_fprint_saddr(FILE * file, struct sockaddr_ipx *sipx) { - ipx_fprint_network(file,ntohl(sipx->sipx_network)); - fprintf(file,":"); - ipx_fprint_node(file,sipx->sipx_node); - fprintf(file,":"); - ipx_fprint_port(file,ntohs(sipx->sipx_port)); + ipx_fprint_network(file, ntohl(sipx->sipx_network)); + fprintf(file, ":"); + ipx_fprint_node(file, sipx->sipx_node); + fprintf(file, ":"); + ipx_fprint_port(file, ntohs(sipx->sipx_port)); } void ipx_print_node(IPXNode node) { - ipx_fprint_node(stdout,node); + ipx_fprint_node(stdout, node); } void ipx_print_network(IPXNet net) { - ipx_fprint_network(stdout,net); + ipx_fprint_network(stdout, net); } void ipx_print_port(IPXPort port) { - ipx_fprint_port(stdout,port); + ipx_fprint_port(stdout, port); } void ipx_print_saddr(struct sockaddr_ipx *sipx) { - ipx_fprint_saddr(stdout,sipx); + ipx_fprint_saddr(stdout, sipx); } void ipx_assign_node(IPXNode dest, IPXNode src) { - memcpy(dest,src,sizeof(IPXNode)); + memcpy(dest, src, sizeof(IPXNode)); } int ipx_node_equal(IPXNode n1, IPXNode n2) { - return memcmp(n1,n2,sizeof(IPXNode))==0; + return memcmp(n1, n2, sizeof(IPXNode)) == 0; } int @@ -106,8 +110,7 @@ ipx_sscanf_node(char *buf, IPXNode node) { return -1; } - - for (i=0; i<6; i++) + for (i = 0; i < 6; i++) { node[i] = n[i]; } @@ -115,7 +118,7 @@ ipx_sscanf_node(char *buf, IPXNode node) } int -ipx_sscanf_net(char *buf, IPXNet *target) +ipx_sscanf_net(char *buf, IPXNet * target) { if (sscanf(buf, "%8lX", target) == 1) { @@ -124,6 +127,8 @@ ipx_sscanf_net(char *buf, IPXNet *target) return -1; } -IPXNode ipx_this_node={0,0,0,0,0,0}; -IPXNode ipx_broadcast_node={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; -char ipx_err_string[IPX_MAX_ERROR+1]="no error detected"; +IPXNode ipx_this_node = +{0, 0, 0, 0, 0, 0}; +IPXNode ipx_broadcast_node = +{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; +char ipx_err_string[IPX_MAX_ERROR + 1] = "no error detected"; diff --git a/ipxdump/ipxutil.h b/ipxdump/ipxutil.h index b5588ff..e259a58 100644 --- a/ipxdump/ipxutil.h +++ b/ipxdump/ipxutil.h @@ -1,25 +1,25 @@ /* - IPX support library + IPX support library - Copyright (C) 1994, 1995 Ales Dryak - Copyright (C) 1996, Volker Lendecke + Copyright (C) 1994, 1995 Ales Dryak + Copyright (C) 1996, Volker Lendecke - 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 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. + 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. + 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 __IPXUTIL_H__ #define __IPXUTIL_H__ @@ -44,22 +44,22 @@ typedef unsigned short int tick_t; 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_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); +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, IPXNode node); -int ipx_sscanf_net(char *buf, IPXNet *target); +int ipx_sscanf_net(char *buf, IPXNet * target); -void ipx_assign_node(IPXNode dest,IPXNode src); -int ipx_node_equal(IPXNode n1,IPXNode n2); +void ipx_assign_node(IPXNode dest, IPXNode src); +int ipx_node_equal(IPXNode n1, IPXNode n2); extern IPXNode ipx_this_node; extern IPXNode ipx_broadcast_node; -extern char ipx_err_string[IPX_MAX_ERROR+1]; +extern char ipx_err_string[IPX_MAX_ERROR + 1]; #endif diff --git a/kernel-1.2/linux/ncp.h b/kernel-1.2/linux/ncp.h index 3d5286e..88d9261 100644 --- a/kernel-1.2/linux/ncp.h +++ b/kernel-1.2/linux/ncp.h @@ -18,28 +18,30 @@ #define NCP_REQUEST (0x2222) #define NCP_DEALLOC_SLOT_REQUEST (0x5555) -struct ncp_request_header { - __u16 type __attribute__ ((packed)); - __u8 sequence __attribute__ ((packed)); - __u8 conn_low __attribute__ ((packed)); - __u8 task __attribute__ ((packed)); - __u8 conn_high __attribute__ ((packed)); - __u8 function __attribute__ ((packed)); - __u8 data[0] __attribute__ ((packed)); +struct ncp_request_header +{ + __u16 type __attribute__((packed)); + __u8 sequence __attribute__((packed)); + __u8 conn_low __attribute__((packed)); + __u8 task __attribute__((packed)); + __u8 conn_high __attribute__((packed)); + __u8 function __attribute__((packed)); + __u8 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)); +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)); }; @@ -48,45 +50,50 @@ struct ncp_reply_header { #define NCP_BINDERY_PQUEUE (0x0003) #define NCP_BINDERY_FSERVER (0x0004) #define NCP_BINDERY_NAME_LEN (48) -struct ncp_bindery_object { - __u32 object_id; - __u16 object_type; - __u8 object_name[NCP_BINDERY_NAME_LEN]; - __u8 object_flags; - __u8 object_security; - __u8 object_has_prop; +struct ncp_bindery_object +{ + __u32 object_id; + __u16 object_type; + __u8 object_name[NCP_BINDERY_NAME_LEN]; + __u8 object_flags; + __u8 object_security; + __u8 object_has_prop; }; -struct nw_property { - __u8 value[128]; - __u8 more_flag; - __u8 property_flag; +struct nw_property +{ + __u8 value[128]; + __u8 more_flag; + __u8 property_flag; }; -struct prop_net_address { - __u32 network __attribute__ ((packed)); - __u8 node[IPX_NODE_LEN] __attribute__ ((packed)); - __u16 port __attribute__ ((packed)); +struct prop_net_address +{ + __u32 network __attribute__((packed)); + __u8 node[IPX_NODE_LEN] __attribute__((packed)); + __u16 port __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]; +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]; }; -struct ncp_filesearch_info { - __u8 volume_number; - __u16 directory_id; - __u16 sequence_no; - __u8 access_rights; +struct ncp_filesearch_info +{ + __u8 volume_number; + __u16 directory_id; + __u16 sequence_no; + __u8 access_rights; }; #define NCP_MAX_FILENAME 14 @@ -104,16 +111,17 @@ struct ncp_filesearch_info { #define AR_EXCLUSIVE (0x20) #define NCP_FILE_ID_LEN 6 -struct ncp_file_info { - __u8 file_id[NCP_FILE_ID_LEN]; - char file_name[NCP_MAX_FILENAME+1]; - __u8 file_attributes; - __u8 file_mode; - __u32 file_length; - __u16 creation_date; - __u16 access_date; - __u16 update_date; - __u16 update_time; +struct ncp_file_info +{ + __u8 file_id[NCP_FILE_ID_LEN]; + char file_name[NCP_MAX_FILENAME + 1]; + __u8 file_attributes; + __u8 file_mode; + __u32 file_length; + __u16 creation_date; + __u16 access_date; + __u16 update_date; + __u16 update_time; }; /* Defines for Name Spaces */ @@ -165,32 +173,32 @@ struct ncp_file_info { 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)); + __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 */ @@ -210,62 +218,66 @@ struct nw_info_struct 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)); + __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_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)); + 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)); +struct nw_search_sequence +{ + __u8 volNumber __attribute__((packed)); + __u32 dirBase __attribute__((packed)); + __u32 sequence __attribute__((packed)); }; -struct nw_queue_job_entry { - __u16 InUse __attribute__ ((packed)); - __u32 prev __attribute__ ((packed)); - __u32 next __attribute__ ((packed)); - __u32 ClientStation __attribute__ ((packed)); - __u32 ClientTask __attribute__ ((packed)); - __u32 ClientObjectID __attribute__ ((packed)); - __u32 TargetServerID __attribute__ ((packed)); - __u8 TargetExecTime[6] __attribute__ ((packed)); - __u8 JobEntryTime[6] __attribute__ ((packed)); - __u32 JobNumber __attribute__ ((packed)); - __u16 JobType __attribute__ ((packed)); - __u16 JobPosition __attribute__ ((packed)); - __u16 JobControlFlags __attribute__ ((packed)); - __u8 FileNameLen __attribute__ ((packed)); - char JobFileName[13] __attribute__ ((packed)); - __u32 JobFileHandle __attribute__ ((packed)); - __u32 ServerStation __attribute__ ((packed)); - __u32 ServerTaskNumber __attribute__ ((packed)); - __u32 ServerObjectID __attribute__ ((packed)); - char JobTextDescription[50] __attribute__ ((packed)); - char ClientRecordArea[152] __attribute__ ((packed)); +struct nw_queue_job_entry +{ + __u16 InUse __attribute__((packed)); + __u32 prev __attribute__((packed)); + __u32 next __attribute__((packed)); + __u32 ClientStation __attribute__((packed)); + __u32 ClientTask __attribute__((packed)); + __u32 ClientObjectID __attribute__((packed)); + __u32 TargetServerID __attribute__((packed)); + __u8 TargetExecTime[6] __attribute__((packed)); + __u8 JobEntryTime[6] __attribute__((packed)); + __u32 JobNumber __attribute__((packed)); + __u16 JobType __attribute__((packed)); + __u16 JobPosition __attribute__((packed)); + __u16 JobControlFlags __attribute__((packed)); + __u8 FileNameLen __attribute__((packed)); + char JobFileName[13] __attribute__((packed)); + __u32 JobFileHandle __attribute__((packed)); + __u32 ServerStation __attribute__((packed)); + __u32 ServerTaskNumber __attribute__((packed)); + __u32 ServerObjectID __attribute__((packed)); + char JobTextDescription[50] __attribute__((packed)); + char ClientRecordArea[152] __attribute__((packed)); }; -struct queue_job { +struct queue_job +{ struct nw_queue_job_entry j; __u8 file_handle[6]; }; @@ -285,20 +297,21 @@ struct queue_job { #define EXPAND_TABS 0x4000 #define PRINT_BANNER 0x8000 -struct print_job_record { - __u8 Version __attribute__ ((packed)); - __u8 TabSize __attribute__ ((packed)); - __u16 Copies __attribute__ ((packed)); - __u16 CtrlFlags __attribute__ ((packed)); - __u16 Lines __attribute__ ((packed)); - __u16 Rows __attribute__ ((packed)); - char FormName[16] __attribute__ ((packed)); - __u8 Reserved[6] __attribute__ ((packed)); - char BannerName[13] __attribute__ ((packed)); - char FnameBanner[13] __attribute__ ((packed)); - char FnameHeader[14] __attribute__ ((packed)); - char Path[80] __attribute__ ((packed)); +struct print_job_record +{ + __u8 Version __attribute__((packed)); + __u8 TabSize __attribute__((packed)); + __u16 Copies __attribute__((packed)); + __u16 CtrlFlags __attribute__((packed)); + __u16 Lines __attribute__((packed)); + __u16 Rows __attribute__((packed)); + char FormName[16] __attribute__((packed)); + __u8 Reserved[6] __attribute__((packed)); + char BannerName[13] __attribute__((packed)); + char FnameBanner[13] __attribute__((packed)); + char FnameHeader[14] __attribute__((packed)); + char Path[80] __attribute__((packed)); }; -#endif /* _LINUX_NCP_H */ +#endif /* _LINUX_NCP_H */ diff --git a/kernel-1.2/linux/ncp_fs.h b/kernel-1.2/linux/ncp_fs.h index 309ec11..116b289 100644 --- a/kernel-1.2/linux/ncp_fs.h +++ b/kernel-1.2/linux/ncp_fs.h @@ -20,23 +20,25 @@ * ioctl commands */ -struct ncp_ioctl_request { - unsigned int function; - unsigned int size; - char *data; +struct ncp_ioctl_request +{ + unsigned int function; + unsigned int size; + char *data; }; -struct ncp_fs_info { - int version; +struct ncp_fs_info +{ + int version; struct sockaddr_ipx addr; - uid_t mounted_uid; - int connection; /* Connection number the server assigned us */ - int buffer_size; /* The negotiated buffer size, to be + 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; -}; + int volume_number; + __u32 directory_id; +}; #define NCP_IOC_NCPREQUEST _IOR('n', 1, struct ncp_ioctl_request) #define NCP_IOC_GETMOUNTUID _IOW('n', 2, uid_t) @@ -84,24 +86,24 @@ extern int ncp_current_malloced; static inline void * ncp_kmalloc(unsigned int size, int priority) { - ncp_malloced += 1; - ncp_current_malloced += 1; - return kmalloc(size, priority); + ncp_malloced += 1; + ncp_current_malloced += 1; + return kmalloc(size, priority); } static inline void ncp_kfree_s(void *obj, int size) { - ncp_current_malloced -= 1; - kfree_s(obj, size); + ncp_current_malloced -= 1; + kfree_s(obj, size); } -#else /* DEBUG_NCP_MALLOC */ +#else /* DEBUG_NCP_MALLOC */ #define ncp_kmalloc(s,p) kmalloc(s,p) #define ncp_kfree_s(o,s) kfree_s(o,s) -#endif /* DEBUG_NCP_MALLOC */ +#endif /* DEBUG_NCP_MALLOC */ #if DEBUG_NCP > 0 #define DPRINTK(format, args...) printk(format , ## args) @@ -125,25 +127,25 @@ extern struct inode_operations ncp_dir_inode_operations; void ncp_free_inode_info(struct ncp_inode_info *i); void ncp_free_all_inodes(struct ncp_server *server); void ncp_init_root(struct ncp_server *server); -int ncp_conn_logged_in(struct ncp_server *server); -int ncp_stat_root(struct ncp_server *server); +int ncp_conn_logged_in(struct ncp_server *server); +int ncp_stat_root(struct ncp_server *server); void ncp_init_dir_cache(void); void ncp_invalid_dir_cache(struct inode *ino); struct ncp_inode_info *ncp_find_inode(struct inode *inode); ino_t ncp_info_ino(struct ncp_server *server, struct ncp_inode_info *info); void ncp_invalidate_all_inodes(struct ncp_server *server); void ncp_free_dir_cache(void); -int ncp_date_dos2unix(__u16 time, __u16 date); -void ncp_date_unix2dos(int unix_date, __u16 *time, __u16 *date); +int ncp_date_dos2unix(__u16 time, __u16 date); +void ncp_date_unix2dos(int unix_date, __u16 * time, __u16 * date); /* linux/fs/ncpfs/ioctl.c */ -int ncp_ioctl (struct inode * inode, struct file * filp, - unsigned int cmd, unsigned long arg); +int ncp_ioctl(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg); /* linux/fs/ncpfs/inode.c */ struct super_block *ncp_read_super(struct super_block *sb, - void *raw_data, int silent); + void *raw_data, int silent); void ncp_invalidate_connection(struct ncp_server *server); int ncp_conn_is_valid(struct ncp_server *server); @@ -157,8 +159,8 @@ void ncp_lock_server(struct ncp_server *server); void ncp_unlock_server(struct ncp_server *server); /* linux/fs/ncpfs/mmap.c */ -int ncp_mmap(struct inode * inode, struct file * file, struct vm_area_struct * vma); +int ncp_mmap(struct inode *inode, struct file *file, struct vm_area_struct *vma); -#endif /* __KERNEL__ */ +#endif /* __KERNEL__ */ -#endif /* _LINUX_NCP_FS_H */ +#endif /* _LINUX_NCP_FS_H */ diff --git a/kernel-1.2/linux/ncp_fs_i.h b/kernel-1.2/linux/ncp_fs_i.h index c0ab3da..b36821f 100644 --- a/kernel-1.2/linux/ncp_fs_i.h +++ b/kernel-1.2/linux/ncp_fs_i.h @@ -12,22 +12,24 @@ #ifdef __KERNEL__ -enum ncp_inode_state { - NCP_INODE_VALID = 19, /* Inode currently in use */ - NCP_INODE_LOOKED_UP, /* directly before iget */ - NCP_INODE_CACHED, /* in a path to an inode which is in use */ - NCP_INODE_INVALID +enum ncp_inode_state +{ + NCP_INODE_VALID = 19, /* Inode currently in use */ + NCP_INODE_LOOKED_UP, /* directly before iget */ + NCP_INODE_CACHED, /* in a path to an inode which is in use */ + NCP_INODE_INVALID }; /* * ncp fs inode data (in memory only) */ -struct ncp_inode_info { - enum ncp_inode_state state; - int nused; /* for directories: - number of references in memory */ - struct ncp_inode_info *dir; - struct ncp_inode_info *next, *prev; +struct ncp_inode_info +{ + enum ncp_inode_state state; + int nused; /* for directories: + number of references in memory */ + struct ncp_inode_info *dir; + struct ncp_inode_info *next, *prev; struct inode *inode; struct nw_file_info finfo; }; diff --git a/kernel-1.2/linux/ncp_fs_sb.h b/kernel-1.2/linux/ncp_fs_sb.h index 36fd36b..ccdff2a 100644 --- a/kernel-1.2/linux/ncp_fs_sb.h +++ b/kernel-1.2/linux/ncp_fs_sb.h @@ -15,11 +15,12 @@ #define NCP_DEFAULT_BUFSIZE 1024 -struct ncp_server { +struct ncp_server +{ - struct ncp_mount_data m; /* Nearly all of the mount data is of - interest for us later, so we store - it completely. */ + struct ncp_mount_data m; /* Nearly all of the mount data is of + interest for us later, so we store + it completely. */ __u8 name_space[NCP_NUMBER_OF_VOLUMES]; @@ -30,32 +31,32 @@ struct ncp_server { old one for checking purposes and to reset it on unmounting. */ - u8 sequence; - u8 task; - u16 connection; /* Remote connection number */ + u8 sequence; + u8 task; + u16 connection; /* Remote connection number */ - u8 completion; /* Status message from server */ - u8 conn_status; /* Bit 4 = 1 ==> Server going down, no + u8 completion; /* Status message from server */ + u8 conn_status; /* Bit 4 = 1 ==> Server going down, no requests allowed anymore. Bit 0 = 1 ==> Server is down. */ - int buffer_size; /* Negotiated bufsize */ + int buffer_size; /* Negotiated bufsize */ - int reply_size; /* Size of last reply */ + int reply_size; /* Size of last reply */ - int packet_size; + int packet_size; unsigned char *packet; /* Here we prepare requests and receive replies */ - int lock; /* To prevent mismatch in protocols. */ + int lock; /* To prevent mismatch in protocols. */ struct wait_queue *wait; - int current_size; /* for packet preparation */ - int has_subfunction; - int ncp_reply_size; + int current_size; /* for packet preparation */ + int has_subfunction; + int ncp_reply_size; - struct ncp_inode_info root; - char root_path; /* '\0' */ + struct ncp_inode_info root; + char root_path; /* '\0' */ }; static inline int @@ -70,6 +71,6 @@ ncp_invalidate_conn(struct ncp_server *server) server->conn_status |= 0x01; } -#endif /* __KERNEL__ */ +#endif /* __KERNEL__ */ #endif diff --git a/kernel-1.2/linux/ncp_mount.h b/kernel-1.2/linux/ncp_mount.h index cbc58aa..9399a41 100644 --- a/kernel-1.2/linux/ncp_mount.h +++ b/kernel-1.2/linux/ncp_mount.h @@ -22,28 +22,29 @@ #define NCP_MOUNT_SOFT 0x0001 #define NCP_MOUNT_INTR 0x0002 -struct ncp_mount_data { +struct ncp_mount_data +{ 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 */ - uid_t mounted_uid; /* Who may umount() this filesystem? */ + unsigned int message_fd; /* Message notifications come here */ + 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+1]; - unsigned char mounted_vol[NCP_VOLNAME_LEN+1]; + unsigned char mount_point[PATH_MAX + 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 retry_count; /* And how often should I retry? */ unsigned int flags; - uid_t uid; - gid_t gid; - mode_t file_mode; - mode_t dir_mode; + uid_t uid; + gid_t gid; + mode_t file_mode; + mode_t dir_mode; }; #endif diff --git a/kernel-1.2/src/dir.c b/kernel-1.2/src/dir.c index 56f86e0..781af52 100644 --- a/kernel-1.2/src/dir.c +++ b/kernel-1.2/src/dir.c @@ -23,53 +23,54 @@ #include #include "ncplib_kernel.h" -struct ncp_dirent { +struct ncp_dirent +{ struct nw_info_struct i; - struct nw_search_sequence s; /* given back for i */ + struct nw_search_sequence s; /* given back for i */ unsigned long f_pos; }; -static int -ncp_dir_read(struct inode *inode, struct file *filp, char *buf, int count); - -static int -ncp_readdir(struct inode *inode, struct file *filp, - struct dirent *dirent, int count); +static int + ncp_dir_read(struct inode *inode, struct file *filp, char *buf, int count); static int -ncp_read_volume_list(struct ncp_server *server, int start_with, - int cache_size); + ncp_readdir(struct inode *inode, struct file *filp, + struct dirent *dirent, int count); static int -ncp_do_readdir(struct ncp_server *server, struct inode *dir, int fpos, - int cache_size, struct ncp_dirent *entry); + ncp_read_volume_list(struct ncp_server *server, int start_with, + int cache_size); + +static int + ncp_do_readdir(struct ncp_server *server, struct inode *dir, int fpos, + int cache_size, struct ncp_dirent *entry); static struct inode * -ncp_iget(struct inode *dir, struct nw_file_info *finfo); + ncp_iget(struct inode *dir, struct nw_file_info *finfo); static struct ncp_inode_info * -ncp_find_dir_inode(struct inode *dir, const char *name); + ncp_find_dir_inode(struct inode *dir, const char *name); static int -ncp_lookup(struct inode *dir, const char *__name, - int len, struct inode **result); - -static int -ncp_create(struct inode *dir, const char *name, int len, int mode, - struct inode **result); - -static int -ncp_mkdir(struct inode *dir, const char *name, int len, int mode); - -static int -ncp_rmdir(struct inode *dir, const char *name, int len); + ncp_lookup(struct inode *dir, const char *__name, + int len, struct inode **result); static int -ncp_unlink(struct inode *dir, const char *name, int len); + ncp_create(struct inode *dir, const char *name, int len, int mode, + struct inode **result); static int -ncp_rename(struct inode *old_dir, const char *old_name, int old_len, - struct inode *new_dir, const char *new_name, int new_len); + ncp_mkdir(struct inode *dir, const char *name, int len, int mode); + +static int + ncp_rmdir(struct inode *dir, const char *name, int len); + +static int + ncp_unlink(struct inode *dir, const char *name, int len); + +static int + ncp_rename(struct inode *old_dir, const char *old_name, int old_len, + struct inode *new_dir, const char *new_name, int new_len); static inline void str_upper(char *name) @@ -93,14 +94,14 @@ str_lower(char *name) { *name += ('a' - 'A'); } - name ++; + name++; } } static inline int ncp_namespace(struct inode *i) { - struct ncp_server *server = NCP_SERVER(i); + struct ncp_server *server = NCP_SERVER(i); struct nw_info_struct *info = NCP_ISTRUCT(i); return server->name_space[info->volNumber]; } @@ -111,8 +112,9 @@ ncp_preserve_case(struct inode *i) return (ncp_namespace(i) == NW_NS_OS2); } -static struct file_operations ncp_dir_operations = { - NULL, /* lseek - default */ +static struct file_operations ncp_dir_operations = +{ + NULL, /* lseek - default */ ncp_dir_read, /* read - bad */ NULL, /* write - bad */ ncp_readdir, /* readdir */ @@ -124,23 +126,24 @@ static struct file_operations ncp_dir_operations = { NULL /* fsync */ }; -struct inode_operations ncp_dir_inode_operations = { +struct inode_operations ncp_dir_inode_operations = +{ &ncp_dir_operations, /* default directory file ops */ ncp_create, /* create */ - ncp_lookup, /* lookup */ + ncp_lookup, /* lookup */ NULL, /* link */ - ncp_unlink, /* unlink */ + ncp_unlink, /* unlink */ NULL, /* symlink */ - ncp_mkdir, /* mkdir */ - ncp_rmdir, /* rmdir */ + ncp_mkdir, /* mkdir */ + ncp_rmdir, /* rmdir */ NULL, /* mknod */ - ncp_rename, /* rename */ + ncp_rename, /* rename */ NULL, /* readlink */ NULL, /* follow_link */ NULL, /* bmap */ NULL, /* truncate */ NULL, /* permission */ - NULL /* smap */ + NULL /* smap */ }; @@ -159,10 +162,10 @@ ncp_single_volume(struct ncp_server *server) } inline ino_t -ncp_info_ino(struct ncp_server *server, struct ncp_inode_info *info) +ncp_info_ino(struct ncp_server * server, struct ncp_inode_info * info) { return ncp_single_volume(server) - ? info->finfo.i.dirEntNum : (ino_t)info; + ? info->finfo.i.dirEntNum : (ino_t) info; } static inline int @@ -170,7 +173,7 @@ ncp_is_server_root(struct inode *inode) { struct ncp_server *s = NCP_SERVER(inode); - return ( (!ncp_single_volume(s)) + return ((!ncp_single_volume(s)) && (inode->i_ino == ncp_info_ino(s, &(s->root)))); } @@ -178,25 +181,25 @@ struct ncp_inode_info * ncp_find_inode(struct inode *inode) { struct ncp_server *server = NCP_SERVER(inode); - struct ncp_inode_info *root = &(server->root); - struct ncp_inode_info *this = root; + struct ncp_inode_info *root = &(server->root); + struct ncp_inode_info *this = root; ino_t ino = inode->i_ino; - do + do { - if (ino == ncp_info_ino(server, this)) + if (ino == ncp_info_ino(server, this)) { return this; } this = this->next; - } + } while (this != root); return NULL; } -static int +static int ncp_dir_read(struct inode *inode, struct file *filp, char *buf, int count) { return -EISDIR; @@ -209,13 +212,13 @@ ncp_dir_read(struct inode *inode, struct file *filp, char *buf, int count) all inodes that are in memory. That's why it's enough to index the directory cache by the inode number. */ -static int c_dev = 0; -static unsigned long c_ino = 0; -static int c_size; -static int c_seen_eof; -static int c_last_returned_index; -static struct ncp_dirent* c_entry = NULL; -static int c_lock = 0; +static int c_dev = 0; +static unsigned long c_ino = 0; +static int c_size; +static int c_seen_eof; +static int c_last_returned_index; +static struct ncp_dirent *c_entry = NULL; +static int c_lock = 0; static struct wait_queue *c_wait = NULL; static inline void @@ -239,9 +242,9 @@ ncp_readdir(struct inode *inode, struct file *filp, { int result = 0; int i = 0; - int index = 0; + int index = 0; struct ncp_dirent *entry = NULL; - struct ncp_server *server = NCP_SERVER(inode); + struct ncp_server *server = NCP_SERVER(inode); struct ncp_inode_info *dir = NCP_INOP(inode); int filldir(struct dirent *dirent, @@ -256,7 +259,7 @@ ncp_readdir(struct inode *inode, struct file *filp, return 1; } - DPRINTK("ncp_readdir: filp->f_pos = %d\n", (int)filp->f_pos); + DPRINTK("ncp_readdir: filp->f_pos = %d\n", (int) filp->f_pos); DPRINTK("ncp_readdir: inode->i_ino = %ld, c_ino = %ld\n", inode->i_ino, c_ino); @@ -265,16 +268,14 @@ ncp_readdir(struct inode *inode, struct file *filp, printk("ncp_readdir: inode is NULL or not a directory\n"); return -EBADF; } - if (!ncp_conn_valid(server)) { return -EIO; } - ncp_lock_dircache(); - if (c_entry == NULL) + if (c_entry == NULL) { - i = sizeof (struct ncp_dirent) * NCP_READDIR_CACHE_SIZE; + i = sizeof(struct ncp_dirent) * NCP_READDIR_CACHE_SIZE; c_entry = (struct ncp_dirent *) ncp_kmalloc(i, GFP_KERNEL); if (c_entry == NULL) { @@ -283,50 +284,46 @@ ncp_readdir(struct inode *inode, struct file *filp, goto finished; } } - - if (filp->f_pos == 0) + if (filp->f_pos == 0) { - ncp_invalid_dir_cache(inode); - if (filldir(dirent,".",1, filp->f_pos, + ncp_invalid_dir_cache(inode); + if (filldir(dirent, ".", 1, filp->f_pos, ncp_info_ino(server, dir)) < 0) { goto finished; } filp->f_pos += 1; - result = ROUND_UP(NAME_OFFSET(dirent)+i+1); + result = ROUND_UP(NAME_OFFSET(dirent) + i + 1); goto finished; - } - + } if (filp->f_pos == 1) { - if (filldir(dirent,"..",2, filp->f_pos, + if (filldir(dirent, "..", 2, filp->f_pos, ncp_info_ino(server, dir->dir)) < 0) { goto finished; } filp->f_pos += 1; - result = ROUND_UP(NAME_OFFSET(dirent)+i+1); + result = ROUND_UP(NAME_OFFSET(dirent) + i + 1); goto finished; } - if ((inode->i_dev == c_dev) && (inode->i_ino == c_ino)) { for (i = 0; i < c_size; i++) { if (filp->f_pos == c_entry[i].f_pos) { - entry = &c_entry[i]; - c_last_returned_index = i; - index = i; - break; + entry = &c_entry[i]; + c_last_returned_index = i; + index = i; + break; } } - if ((entry == NULL) && c_seen_eof) + if ((entry == NULL) && c_seen_eof) { goto finished; } } - if (entry == NULL) { int entries; @@ -338,8 +335,7 @@ ncp_readdir(struct inode *inode, struct file *filp, NCP_READDIR_CACHE_SIZE); DPRINTK("ncp_read_volume_list returned %d\n", entries); - } - else + } else { entries = ncp_do_readdir(server, inode, filp->f_pos, NCP_READDIR_CACHE_SIZE, @@ -354,16 +350,15 @@ ncp_readdir(struct inode *inode, struct file *filp, result = entries; goto finished; } - if (entries > 0) { - c_seen_eof = (entries < NCP_READDIR_CACHE_SIZE); - c_dev = inode->i_dev; - c_ino = inode->i_ino; + c_seen_eof = (entries < NCP_READDIR_CACHE_SIZE); + c_dev = inode->i_dev; + c_ino = inode->i_ino; c_size = entries; entry = c_entry; - c_last_returned_index = 0; - index = 0; + c_last_returned_index = 0; + index = 0; if (!ncp_preserve_case(inode)) { @@ -374,27 +369,24 @@ ncp_readdir(struct inode *inode, struct file *filp, } } } - - if (entry == NULL) + if (entry == NULL) { - /* Nothing found, even from a ncp call */ + /* Nothing found, even from a ncp call */ goto finished; - } - - if (index < c_size) + } + if (index < c_size) { - /* We found it. For getwd(), we have to return the - correct inode in d_ino if the inode is currently in - use. Otherwise the inode number does not - matter. (You can argue a lot about this..) */ + /* We found it. For getwd(), we have to return the + correct inode in d_ino if the inode is currently in + use. Otherwise the inode number does not + matter. (You can argue a lot about this..) */ ino_t ino; if (ncp_single_volume(server)) { - ino = (ino_t)(entry->i.dirEntNum); - } - else + ino = (ino_t) (entry->i.dirEntNum); + } else { struct ncp_inode_info *ino_info; ino_info = ncp_find_dir_inode(inode, @@ -407,25 +399,24 @@ ncp_readdir(struct inode *inode, struct file *filp, { ino_info = (struct ncp_inode_info *) 1; } - ino = (ino_t)(ino_info); + ino = (ino_t) (ino_info); } DPRINTK("ncp_readdir: entry->path= %s\n", entry->i.entryName); DPRINTK("ncp_readdir: entry->f_pos = %ld\n", entry->f_pos); - if (filldir(dirent, entry->i.entryName, entry->i.nameLen, - entry->f_pos, ino) < 0) + if (filldir(dirent, entry->i.entryName, entry->i.nameLen, + entry->f_pos, ino) < 0) { goto finished; - } - - filp->f_pos += 1; - index += 1; - entry += 1; - result = ROUND_UP(NAME_OFFSET(dirent)+i+1); + } + filp->f_pos += 1; + index += 1; + entry += 1; + result = ROUND_UP(NAME_OFFSET(dirent) + i + 1); goto finished; } - finished: + finished: ncp_unlock_dircache(); return result; } @@ -446,7 +437,7 @@ ncp_read_volume_list(struct ncp_server *server, int fpos, int cache_size) } #endif - for (i=0; i 0) { if (total_count < fpos) { DPRINTK("ncp_read_volumes: skipped vol: %s\n", info.volume_name); - } - else if (total_count >= fpos + cache_size) + } else if (total_count >= fpos + cache_size) { return (total_count - fpos); - } - else + } else { DPRINTK("ncp_read_volumes: found vol: %s\n", info.volume_name); @@ -479,7 +467,6 @@ ncp_read_volume_list(struct ncp_server *server, int fpos, int cache_size) "%s\n", info.volume_name); continue; } - entry->f_pos = total_count; entry += 1; } @@ -511,7 +498,6 @@ ncp_do_readdir(struct ncp_server *server, struct inode *dir, int fpos, last_dir = NULL; total_count = 2; } - if ((fpos != total_count) || (dir != last_dir)) { total_count = 2; @@ -520,13 +506,12 @@ ncp_do_readdir(struct ncp_server *server, struct inode *dir, int fpos, DPRINTK("ncp_do_readdir: re-used seq for %s\n", NCP_ISTRUCT(dir)->entryName); - if (ncp_initialize_search(server, NCP_ISTRUCT(dir), &seq)!=0) + if (ncp_initialize_search(server, NCP_ISTRUCT(dir), &seq) != 0) { DPRINTK("ncp_init_search failed\n"); return total_count - fpos; } } - while (total_count < fpos + cache_size) { if (ncp_search_for_file_or_subdir(server, &seq, @@ -534,13 +519,11 @@ ncp_do_readdir(struct ncp_server *server, struct inode *dir, int fpos, { return total_count - fpos; } - if (total_count < fpos) { DPRINTK("ncp_do_readdir: skipped file: %s\n", entry->i.entryName); - } - else + } else { DDPRINTK("ncp_do_r: file: %s, f_pos=%d,total_count=%d", entry->i.entryName, fpos, total_count); @@ -556,9 +539,9 @@ ncp_do_readdir(struct ncp_server *server, struct inode *dir, int fpos, void ncp_init_dir_cache(void) { - c_dev = 0; - c_ino = 0; - c_entry = NULL; + c_dev = 0; + c_ino = 0; + c_entry = NULL; } void @@ -567,26 +550,25 @@ ncp_invalid_dir_cache(struct inode *inode) if ((inode->i_dev == c_dev) && (inode->i_ino == c_ino)) { c_dev = 0; - c_ino = 0; - c_seen_eof = 0; - } + c_ino = 0; + c_seen_eof = 0; + } } void ncp_free_dir_cache(void) { - DPRINTK("ncp_free_dir_cache: enter\n"); - - if (c_entry == NULL) + DPRINTK("ncp_free_dir_cache: enter\n"); + + if (c_entry == NULL) { - return; + return; } + ncp_kfree_s(c_entry, + sizeof(struct ncp_dirent) * NCP_READDIR_CACHE_SIZE); + c_entry = NULL; - ncp_kfree_s(c_entry, - sizeof(struct ncp_dirent) * NCP_READDIR_CACHE_SIZE); - c_entry = NULL; - - DPRINTK("ncp_free_dir_cache: exit\n"); + DPRINTK("ncp_free_dir_cache: exit\n"); } @@ -594,113 +576,109 @@ static struct inode * ncp_iget(struct inode *dir, struct nw_file_info *finfo) { struct inode *inode; - struct ncp_inode_info *new_inode_info; - struct ncp_inode_info *root; + struct ncp_inode_info *new_inode_info; + struct ncp_inode_info *root; if (dir == NULL) { printk("ncp_iget: dir is NULL\n"); return NULL; } - if (finfo == NULL) { printk("ncp_iget: finfo is NULL\n"); return NULL; } + new_inode_info = ncp_kmalloc(sizeof(struct ncp_inode_info), + GFP_KERNEL); - new_inode_info = ncp_kmalloc(sizeof(struct ncp_inode_info), - GFP_KERNEL); - - if (new_inode_info == NULL) + if (new_inode_info == NULL) { - printk("ncp_iget: could not alloc mem for %s\n", + printk("ncp_iget: could not alloc mem for %s\n", finfo->i.entryName); - return NULL; - } + return NULL; + } + new_inode_info->state = NCP_INODE_LOOKED_UP; + new_inode_info->nused = 0; + new_inode_info->dir = NCP_INOP(dir); + new_inode_info->finfo = *finfo; - new_inode_info->state = NCP_INODE_LOOKED_UP; - new_inode_info->nused = 0; - new_inode_info->dir = NCP_INOP(dir); - new_inode_info->finfo = *finfo; + NCP_INOP(dir)->nused += 1; - NCP_INOP(dir)->nused += 1; + /* We have to link the new inode_info into the doubly linked + list of inode_infos to make a complete linear search + possible. */ - /* We have to link the new inode_info into the doubly linked - list of inode_infos to make a complete linear search - possible. */ + root = &(NCP_SERVER(dir)->root); - root = &(NCP_SERVER(dir)->root); + new_inode_info->prev = root; + new_inode_info->next = root->next; + root->next->prev = new_inode_info; + root->next = new_inode_info; - new_inode_info->prev = root; - new_inode_info->next = root->next; - root->next->prev = new_inode_info; - root->next = new_inode_info; - if (!(inode = iget(dir->i_sb, ncp_info_ino(NCP_SERVER(dir), new_inode_info)))) { printk("ncp_iget: iget failed!"); return NULL; } - return inode; } void ncp_free_inode_info(struct ncp_inode_info *i) { - if (i == NULL) + if (i == NULL) { - printk("ncp_free_inode: i == NULL\n"); - return; - } - - i->state = NCP_INODE_CACHED; - while ((i->nused == 0) && (i->state == NCP_INODE_CACHED)) + printk("ncp_free_inode: i == NULL\n"); + return; + } + i->state = NCP_INODE_CACHED; + while ((i->nused == 0) && (i->state == NCP_INODE_CACHED)) { - struct ncp_inode_info *dir = i->dir; + struct ncp_inode_info *dir = i->dir; - i->next->prev = i->prev; - i->prev->next = i->next; + i->next->prev = i->prev; + i->prev->next = i->next; DDPRINTK("ncp_free_inode_info: freeing %s\n", i->finfo.i.entryName); - ncp_kfree_s(i, sizeof(struct ncp_inode_info)); + ncp_kfree_s(i, sizeof(struct ncp_inode_info)); - if (dir == i) return; + if (dir == i) + return; - (dir->nused)--; - i = dir; - } + (dir->nused)--; + i = dir; + } } - + void ncp_init_root(struct ncp_server *server) { - struct ncp_inode_info *root = &(server->root); + struct ncp_inode_info *root = &(server->root); struct nw_info_struct *i = &(root->finfo.i); unsigned short dummy; - DPRINTK("ncp_init_root: i = %x\n", (int)i); + DPRINTK("ncp_init_root: i = %x\n", (int) i); - root->finfo.opened = 0; - i->attributes = aDIR; + root->finfo.opened = 0; + i->attributes = aDIR; i->dataStreamSize = 1024; i->dirEntNum = i->DosDirNum = 0; - i->volNumber = NCP_NUMBER_OF_VOLUMES+1; /* illegal volnum */ + i->volNumber = NCP_NUMBER_OF_VOLUMES + 1; /* illegal volnum */ ncp_date_unix2dos(0, &(i->creationTime), &(i->creationDate)); ncp_date_unix2dos(0, &(i->modifyTime), &(i->modifyDate)); ncp_date_unix2dos(0, &dummy, &(i->lastAccessDate)); i->nameLen = 0; - i->entryName[0] = '\0'; + i->entryName[0] = '\0'; - root->state = NCP_INODE_LOOKED_UP; - root->nused = 1; - root->dir = root; - root->next = root->prev = root; - return; + root->state = NCP_INODE_LOOKED_UP; + root->nused = 1; + root->dir = root; + root->next = root->prev = root; + return; } int @@ -710,7 +688,6 @@ ncp_conn_logged_in(struct ncp_server *server) { return 0; } - str_upper(server->m.mounted_vol); if (ncp_lookup_volume(server, server->m.mounted_vol, &(server->root.finfo.i)) != 0) @@ -725,27 +702,26 @@ ncp_conn_logged_in(struct ncp_server *server) void ncp_free_all_inodes(struct ncp_server *server) { - /* Here nothing should be to do. I do not know whether it's - better to leave some memory allocated or be stuck in an - endless loop */ + /* Here nothing should be to do. I do not know whether it's + better to leave some memory allocated or be stuck in an + endless loop */ #if 1 - struct ncp_inode_info *root = &(server->root); + struct ncp_inode_info *root = &(server->root); - if (root->next != root) + if (root->next != root) { - printk("ncp_free_all_inodes: INODES LEFT!!!\n"); - } + printk("ncp_free_all_inodes: INODES LEFT!!!\n"); + } + while (root->next != root) + { + printk("ncp_free_all_inodes: freeing inode\n"); + ncp_free_inode_info(root->next); + /* In case we have an endless loop.. */ + schedule(); + } +#endif - while (root->next != root) - { - printk("ncp_free_all_inodes: freeing inode\n"); - ncp_free_inode_info(root->next); - /* In case we have an endless loop.. */ - schedule(); - } -#endif - - return; + return; } /* We will search the inode that belongs to this name, currently by a @@ -756,45 +732,44 @@ ncp_find_dir_inode(struct inode *dir, const char *name) { struct ncp_server *server = NCP_SERVER(dir); struct nw_info_struct *dir_info = NCP_ISTRUCT(dir); - struct ncp_inode_info *result = &(server->root); + struct ncp_inode_info *result = &(server->root); - if (name == NULL) + if (name == NULL) { - return NULL; + return NULL; } - - do + do { - if ( (result->dir->finfo.i.dirEntNum == dir_info->dirEntNum) + if ((result->dir->finfo.i.dirEntNum == dir_info->dirEntNum) && (result->dir->finfo.i.volNumber == dir_info->volNumber) && (strcmp(result->finfo.i.entryName, name) == 0) - /* The root dir is never looked up using this - * routine. Without the following test a root - * directory 'sys' in a volume named 'sys' could - * never be looked up, because - * server->root->dir==server->root. */ + /* The root dir is never looked up using this + * routine. Without the following test a root + * directory 'sys' in a volume named 'sys' could + * never be looked up, because + * server->root->dir==server->root. */ && (result != &(server->root))) { - return result; + return result; } - result = result->next; + result = result->next; - } + } while (result != &(server->root)); - return NULL; + return NULL; } -static int +static int ncp_lookup(struct inode *dir, const char *__name, int len, - struct inode **result) + struct inode **result) { struct nw_file_info finfo; struct ncp_server *server; - struct ncp_inode_info *result_info; - int found_in_cache; + struct ncp_inode_info *result_info; + int found_in_cache; int down_case = 0; - char name[len+1]; + char name[len + 1]; *result = NULL; @@ -804,15 +779,13 @@ ncp_lookup(struct inode *dir, const char *__name, int len, iput(dir); return -ENOENT; } - server = NCP_SERVER(dir); if (!ncp_conn_valid(server)) { iput(dir); return -EIO; } - - DDPRINTK("ncp_lookup: %s, len %d\n", __name, len); + DDPRINTK("ncp_lookup: %s, len %d\n", __name, len); /* Fast cheat for . */ if (len == 0 || (len == 1 && __name[0] == '.')) @@ -820,7 +793,6 @@ ncp_lookup(struct inode *dir, const char *__name, int len, *result = dir; return 0; } - /* ..and for .. */ if (len == 2 && __name[0] == '.' && __name[1] == '.') { @@ -830,78 +802,72 @@ ncp_lookup(struct inode *dir, const char *__name, int len, { parent->state = NCP_INODE_LOOKED_UP; } - *result = iget(dir->i_sb, ncp_info_ino(server, parent)); iput(dir); if (*result == 0) { return -EACCES; - } - else + } else { return 0; } } - memcpy(name, __name, len); name[len] = 0; lock_super(dir->i_sb); - result_info = ncp_find_dir_inode(dir, name); + result_info = ncp_find_dir_inode(dir, name); - if (result_info != 0) + if (result_info != 0) { - if (result_info->state == NCP_INODE_CACHED) + if (result_info->state == NCP_INODE_CACHED) { - result_info->state = NCP_INODE_LOOKED_UP; + result_info->state = NCP_INODE_LOOKED_UP; } + /* Here we convert the inode_info address into an + inode number */ - /* Here we convert the inode_info address into an - inode number */ - - *result = iget(dir->i_sb, ncp_info_ino(server, result_info)); + *result = iget(dir->i_sb, ncp_info_ino(server, result_info)); unlock_super(dir->i_sb); - iput(dir); + iput(dir); - if (*result == NULL) + if (*result == NULL) { - return -EACCES; - } - + return -EACCES; + } return 0; - } + } + /* If the file is in the dir cache, we do not have to ask the + server. */ - /* If the file is in the dir cache, we do not have to ask the - server. */ + found_in_cache = 0; - found_in_cache = 0; + ncp_lock_dircache(); - ncp_lock_dircache(); - - if ((dir->i_dev == c_dev) && (dir->i_ino == c_ino)) + if ((dir->i_dev == c_dev) && (dir->i_ino == c_ino)) { - int first = c_last_returned_index; - int i; + int first = c_last_returned_index; + int i; - i = first; - do + i = first; + do { - DDPRINTK("ncp_lookup: trying index: %d, name: %s\n", - i, c_entry[i].i.entryName); + DDPRINTK("ncp_lookup: trying index: %d, name: %s\n", + i, c_entry[i].i.entryName); - if (strcmp(c_entry[i].i.entryName, name) == 0) + if (strcmp(c_entry[i].i.entryName, name) == 0) { - DPRINTK("ncp_lookup: found in cache!\n"); + DPRINTK("ncp_lookup: found in cache!\n"); finfo.i = c_entry[i].i; found_in_cache = 1; break; - } - i = (i + 1) % c_size; - } + } + i = (i + 1) % c_size; + } while (i != first); - } + } ncp_unlock_dircache(); - if (found_in_cache == 0) + if (found_in_cache == 0) { int res; @@ -913,8 +879,7 @@ ncp_lookup(struct inode *dir, const char *__name, int len, str_upper(name); down_case = 1; res = ncp_lookup_volume(server, name, &(finfo.i)); - } - else + } else { if (!ncp_preserve_case(dir)) { @@ -929,36 +894,33 @@ ncp_lookup(struct inode *dir, const char *__name, int len, if (res != 0) { unlock_super(dir->i_sb); - iput(dir); - return -ENOENT; - } - } - + iput(dir); + return -ENOENT; + } + } finfo.opened = 0; if (down_case != 0) { str_lower(finfo.i.entryName); } - if (!(*result = ncp_iget(dir, &finfo))) { unlock_super(dir->i_sb); iput(dir); return -EACCES; } - unlock_super(dir->i_sb); iput(dir); return 0; } -static int +static int ncp_create(struct inode *dir, const char *name, int len, int mode, - struct inode **result) + struct inode **result) { struct nw_file_info finfo; - __u8 _name[len+1]; + __u8 _name[len + 1]; *result = NULL; @@ -973,7 +935,6 @@ ncp_create(struct inode *dir, const char *name, int len, int mode, iput(dir); return -EIO; } - strncpy(_name, name, len); _name[len] = '\0'; @@ -981,27 +942,24 @@ ncp_create(struct inode *dir, const char *name, int len, int mode, { str_upper(_name); } - lock_super(dir->i_sb); if (ncp_open_create_file_or_subdir(NCP_SERVER(dir), NCP_ISTRUCT(dir), _name, - OC_MODE_CREATE|OC_MODE_OPEN| + OC_MODE_CREATE | OC_MODE_OPEN | OC_MODE_REPLACE, - 0, AR_READ|AR_WRITE, + 0, AR_READ | AR_WRITE, &finfo) != 0) { unlock_super(dir->i_sb); iput(dir); return -EACCES; } - - ncp_invalid_dir_cache(dir); + ncp_invalid_dir_cache(dir); if (!ncp_preserve_case(dir)) { str_lower(finfo.i.entryName); } - finfo.access = O_RDWR; if (!(*result = ncp_iget(dir, &finfo)) < 0) @@ -1011,10 +969,9 @@ ncp_create(struct inode *dir, const char *name, int len, int mode, iput(dir); return -EINVAL; } - unlock_super(dir->i_sb); iput(dir); - return 0; + return 0; } static int @@ -1022,17 +979,16 @@ ncp_mkdir(struct inode *dir, const char *name, int len, int mode) { int error; struct nw_file_info new_dir; - __u8 _name[len+1]; + __u8 _name[len + 1]; - if ( (name[0] == '.') - && ( (len == 1) - || ( (len == 2) + if ((name[0] == '.') + && ((len == 1) + || ((len == 2) && (name[1] == '.')))) { iput(dir); return -EEXIST; } - strncpy(_name, name, len); _name[len] = '\0'; @@ -1040,7 +996,6 @@ ncp_mkdir(struct inode *dir, const char *name, int len, int mode) { str_upper(_name); } - if (!dir || !S_ISDIR(dir->i_mode)) { printk("ncp_mkdir: inode is NULL or not a directory\n"); @@ -1052,19 +1007,17 @@ ncp_mkdir(struct inode *dir, const char *name, int len, int mode) iput(dir); return -EIO; } - if (ncp_open_create_file_or_subdir(NCP_SERVER(dir), NCP_ISTRUCT(dir), _name, OC_MODE_CREATE, aDIR, 0xffff, &new_dir) != 0) { error = -EACCES; - } - else + } else { error = 0; - ncp_invalid_dir_cache(dir); - } + ncp_invalid_dir_cache(dir); + } iput(dir); return error; @@ -1074,7 +1027,7 @@ static int ncp_rmdir(struct inode *dir, const char *name, int len) { int error; - __u8 _name[len+1]; + __u8 _name[len + 1]; if (!dir || !S_ISDIR(dir->i_mode)) { @@ -1087,12 +1040,11 @@ ncp_rmdir(struct inode *dir, const char *name, int len) iput(dir); return -EIO; } - if (ncp_find_dir_inode(dir, name) != NULL) + if (ncp_find_dir_inode(dir, name) != NULL) { iput(dir); - error = -EBUSY; - } - else + error = -EBUSY; + } else { strncpy(_name, name, len); @@ -1102,18 +1054,16 @@ ncp_rmdir(struct inode *dir, const char *name, int len) { str_upper(_name); } - - if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir), + if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir), NCP_ISTRUCT(dir), _name)) == 0) { - ncp_invalid_dir_cache(dir); - } - else + ncp_invalid_dir_cache(dir); + } else { error = -EACCES; } - } + } iput(dir); return error; } @@ -1122,7 +1072,7 @@ static int ncp_unlink(struct inode *dir, const char *name, int len) { int error; - __u8 _name[len+1]; + __u8 _name[len + 1]; if (!dir || !S_ISDIR(dir->i_mode)) { @@ -1135,12 +1085,11 @@ ncp_unlink(struct inode *dir, const char *name, int len) iput(dir); return -EIO; } - if (ncp_find_dir_inode(dir, name) != NULL) + if (ncp_find_dir_inode(dir, name) != NULL) { iput(dir); - error = -EBUSY; - } - else + error = -EBUSY; + } else { strncpy(_name, name, len); _name[len] = '\0'; @@ -1149,57 +1098,51 @@ ncp_unlink(struct inode *dir, const char *name, int len) { str_upper(_name); } - - if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir), + if ((error = ncp_del_file_or_subdir(NCP_SERVER(dir), NCP_ISTRUCT(dir), _name)) == 0) { - ncp_invalid_dir_cache(dir); - } - else + ncp_invalid_dir_cache(dir); + } else { error = -EACCES; } - } + } iput(dir); return error; } static int ncp_rename(struct inode *old_dir, const char *old_name, int old_len, - struct inode *new_dir, const char *new_name, int new_len) + struct inode *new_dir, const char *new_name, int new_len) { int res; - char _old_name[old_len+1]; - char _new_name[new_len+1]; + char _old_name[old_len + 1]; + char _new_name[new_len + 1]; if (!old_dir || !S_ISDIR(old_dir->i_mode)) { printk("ncp_rename: old inode is NULL or not a directory\n"); - res = -ENOENT; - goto finished; + res = -ENOENT; + goto finished; } - if (!ncp_conn_valid(NCP_SERVER(old_dir))) { res = -EIO; goto finished; } - if (!new_dir || !S_ISDIR(new_dir->i_mode)) { printk("ncp_rename: new inode is NULL or not a directory\n"); - res = -ENOENT; - goto finished; + res = -ENOENT; + goto finished; } - - if ( (ncp_find_dir_inode(old_dir, old_name) != NULL) - || (ncp_find_dir_inode(new_dir, new_name) != NULL)) + if ((ncp_find_dir_inode(old_dir, old_name) != NULL) + || (ncp_find_dir_inode(new_dir, new_name) != NULL)) { - res = -EBUSY; - goto finished; - } - + res = -EBUSY; + goto finished; + } strncpy(_old_name, old_name, old_len); _old_name[old_len] = '\0'; @@ -1207,7 +1150,6 @@ ncp_rename(struct inode *old_dir, const char *old_name, int old_len, { str_upper(_old_name); } - strncpy(_new_name, new_name, new_len); _new_name[new_len] = '\0'; @@ -1215,23 +1157,21 @@ ncp_rename(struct inode *old_dir, const char *old_name, int old_len, { str_upper(_new_name); } - res = ncp_ren_or_mov_file_or_subdir(NCP_SERVER(old_dir), NCP_ISTRUCT(old_dir), _old_name, NCP_ISTRUCT(new_dir), _new_name); - if (res == 0) + if (res == 0) { - ncp_invalid_dir_cache(old_dir); - ncp_invalid_dir_cache(new_dir); - } - else + ncp_invalid_dir_cache(old_dir); + ncp_invalid_dir_cache(new_dir); + } else { res = -EACCES; } - - finished: - iput(old_dir); + + finished: + iput(old_dir); iput(new_dir); return res; } @@ -1240,7 +1180,8 @@ ncp_rename(struct inode *old_dir, const char *old_name, int old_len, /* Linear day numbers of the respective 1sts in non-leap years. */ -static int day_n[] = { 0,31,59,90,120,151,181,212,243,273,304,334,0,0,0,0 }; +static int day_n[] = +{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 0, 0, 0, 0}; /* JanFebMarApr May Jun Jul Aug Sep Oct Nov Dec */ @@ -1249,53 +1190,56 @@ extern struct timezone sys_tz; static int utc2local(int time) { - return time - sys_tz.tz_minuteswest*60; + return time - sys_tz.tz_minuteswest * 60; } static int local2utc(int time) { - return time + sys_tz.tz_minuteswest*60; + return time + sys_tz.tz_minuteswest * 60; } /* Convert a MS-DOS time/date pair to a UNIX date (seconds since 1 1 70). */ int -ncp_date_dos2unix(unsigned short time,unsigned short date) +ncp_date_dos2unix(unsigned short time, unsigned short date) { - int month,year,secs; + int month, year, secs; - month = ((date >> 5) & 15)-1; + month = ((date >> 5) & 15) - 1; year = date >> 9; - secs = (time & 31)*2+60*((time >> 5) & 63)+(time >> 11)*3600+86400* - ((date & 31)-1+day_n[month]+(year/4)+year*365-((year & 3) == 0 && - month < 2 ? 1 : 0)+3653); - /* days since 1.1.70 plus 80's leap day */ + secs = (time & 31) * 2 + 60 * ((time >> 5) & 63) + (time >> 11) * 3600 + 86400 * + ((date & 31) - 1 + day_n[month] + (year / 4) + year * 365 - ((year & 3) == 0 && + month < 2 ? 1 : 0) + 3653); + /* days since 1.1.70 plus 80's leap day */ return local2utc(secs); } /* Convert linear UNIX date to a MS-DOS time/date pair. */ void -ncp_date_unix2dos(int unix_date,unsigned short *time, unsigned short *date) +ncp_date_unix2dos(int unix_date, unsigned short *time, unsigned short *date) { - int day,year,nl_day,month; + int day, year, nl_day, month; unix_date = utc2local(unix_date); - *time = (unix_date % 60)/2+(((unix_date/60) % 60) << 5)+ - (((unix_date/3600) % 24) << 11); - day = unix_date/86400-3652; - year = day/365; - if ((year+3)/4+365*year > day) year--; - day -= (year+3)/4+365*year; - if (day == 59 && !(year & 3)) { + *time = (unix_date % 60) / 2 + (((unix_date / 60) % 60) << 5) + + (((unix_date / 3600) % 24) << 11); + day = unix_date / 86400 - 3652; + year = day / 365; + if ((year + 3) / 4 + 365 * year > day) + year--; + day -= (year + 3) / 4 + 365 * year; + if (day == 59 && !(year & 3)) + { nl_day = day; month = 2; - } - else { - nl_day = (year & 3) || day <= 59 ? day : day-1; + } else + { + nl_day = (year & 3) || day <= 59 ? day : day - 1; for (month = 0; month < 12; month++) - if (day_n[month] > nl_day) break; + if (day_n[month] > nl_day) + break; } - *date = nl_day-day_n[month-1]+1+(month << 5)+(year << 9); + *date = nl_day - day_n[month - 1] + 1 + (month << 5) + (year << 9); } diff --git a/kernel-1.2/src/file.c b/kernel-1.2/src/file.c index 2ba0d07..ab40d3c 100644 --- a/kernel-1.2/src/file.c +++ b/kernel-1.2/src/file.c @@ -25,12 +25,13 @@ #include "ncplib_kernel.h" #include -static inline int min(int a, int b) +static inline int +min(int a, int b) { - return aopened = %d\n", finfo->opened); + DPRINTK("ncp_make_open: dirent->opened = %d\n", finfo->opened); lock_super(i->i_sb); - if (finfo->opened == 0) + if (finfo->opened == 0) { finfo->access = -1; - /* tries max. rights */ + /* tries max. rights */ if (ncp_open_create_file_or_subdir(NCP_SERVER(i), NULL, NULL, OC_MODE_OPEN, 0, @@ -63,38 +63,36 @@ ncp_make_open(struct inode *i, int right) finfo) == 0) { finfo->access = O_RDWR; - } - else if (ncp_open_create_file_or_subdir(NCP_SERVER(i), - NULL, NULL, - OC_MODE_OPEN, 0, - AR_READ, - finfo) == 0) + } else if (ncp_open_create_file_or_subdir(NCP_SERVER(i), + NULL, NULL, + OC_MODE_OPEN, 0, + AR_READ, + finfo) == 0) { finfo->access = O_RDONLY; } - } - + } unlock_super(i->i_sb); - if ( ((right == O_RDONLY) && ( (finfo->access == O_RDONLY) - || (finfo->access == O_RDWR))) - || ((right == O_WRONLY) && ( (finfo->access == O_WRONLY) - || (finfo->access == O_RDWR))) - || ((right == O_RDWR) && (finfo->access == O_RDWR))) - return 0; + if (((right == O_RDONLY) && ((finfo->access == O_RDONLY) + || (finfo->access == O_RDWR))) + || ((right == O_WRONLY) && ((finfo->access == O_WRONLY) + || (finfo->access == O_RDWR))) + || ((right == O_RDWR) && (finfo->access == O_RDWR))) + return 0; - return -EACCES; + return -EACCES; } -static int +static int ncp_file_read(struct inode *inode, struct file *file, char *buf, int count) { int bufsize, already_read; off_t pos; - int errno; + int errno; + + DPRINTK("ncp_file_read: enter %s\n", NCP_ISTRUCT(inode)->entryName); - DPRINTK("ncp_file_read: enter %s\n", NCP_ISTRUCT(inode)->entryName); - if (inode == NULL) { DPRINTK("ncp_file_read: inode = NULL\n"); @@ -104,37 +102,32 @@ ncp_file_read(struct inode *inode, struct file *file, char *buf, int count) { return -EIO; } - if (!S_ISREG(inode->i_mode)) { DPRINTK("ncp_file_read: read from non-file, mode %07o\n", - inode->i_mode); + inode->i_mode); return -EINVAL; } - pos = file->f_pos; if (pos + count > inode->i_size) { count = inode->i_size - pos; } - if (count <= 0) { return 0; } - - if ((errno = ncp_make_open(inode, O_RDONLY)) != 0) + if ((errno = ncp_make_open(inode, O_RDONLY)) != 0) { - return errno; + return errno; } - bufsize = NCP_SERVER(inode)->buffer_size; - already_read = 0; + already_read = 0; /* First read in as much as possible for each bufsize. */ - while (already_read < count) + while (already_read < count) { int read_this_time; int to_read = min(bufsize - (pos % bufsize), @@ -143,41 +136,39 @@ ncp_file_read(struct inode *inode, struct file *file, char *buf, int count) if (ncp_read(NCP_SERVER(inode), NCP_FINFO(inode)->file_handle, pos, to_read, buf, &read_this_time) != 0) { - return -EIO; /* This is not exact, i know.. */ + return -EIO; /* This is not exact, i know.. */ } - pos += read_this_time; buf += read_this_time; - already_read += read_this_time; + already_read += read_this_time; if (read_this_time < to_read) { - break; + break; } } - file->f_pos = pos; + file->f_pos = pos; if (!IS_RDONLY(inode)) { inode->i_atime = CURRENT_TIME; } - inode->i_dirt = 1; - DPRINTK("ncp_file_read: exit %s\n", NCP_ISTRUCT(inode)->entryName); + DPRINTK("ncp_file_read: exit %s\n", NCP_ISTRUCT(inode)->entryName); - return already_read; + return already_read; } -static int +static int ncp_file_write(struct inode *inode, struct file *file, char *buf, int count) { int bufsize, already_written; - off_t pos; - int errno; - + off_t pos; + int errno; + if (inode == NULL) { DPRINTK("ncp_file_write: inode = NULL\n"); @@ -187,38 +178,33 @@ ncp_file_write(struct inode *inode, struct file *file, char *buf, { return -EIO; } - if (!S_ISREG(inode->i_mode)) { DPRINTK("ncp_file_write: write to non-file, mode %07o\n", - inode->i_mode); + inode->i_mode); return -EINVAL; } - - DPRINTK("ncp_file_write: enter %s\n", NCP_ISTRUCT(inode)->entryName); + DPRINTK("ncp_file_write: enter %s\n", NCP_ISTRUCT(inode)->entryName); if (count <= 0) { return 0; } - - if ((errno = ncp_make_open(inode, O_RDWR)) != 0) + if ((errno = ncp_make_open(inode, O_RDWR)) != 0) { - return errno; + return errno; } - pos = file->f_pos; if (file->f_flags & O_APPEND) { pos = inode->i_size; } - bufsize = NCP_SERVER(inode)->buffer_size; - already_written = 0; + already_written = 0; - while (already_written < count) + while (already_written < count) { int written_this_time; int to_write = min(bufsize - (pos % bufsize), @@ -228,8 +214,7 @@ ncp_file_write(struct inode *inode, struct file *file, char *buf, pos, to_write, buf, &written_this_time) != 0) { return -EIO; - } - + } pos += written_this_time; buf += written_this_time; already_written += written_this_time; @@ -245,18 +230,18 @@ ncp_file_write(struct inode *inode, struct file *file, char *buf, file->f_pos = pos; - if (pos > inode->i_size) + if (pos > inode->i_size) { - inode->i_size = pos; + inode->i_size = pos; ncp_invalid_dir_cache(NCP_INOP(inode)->dir->inode); - } - - DPRINTK("ncp_file_write: exit %s\n", NCP_ISTRUCT(inode)->entryName); + } + DPRINTK("ncp_file_write: exit %s\n", NCP_ISTRUCT(inode)->entryName); return already_written; } -static struct file_operations ncp_file_operations = { +static struct file_operations ncp_file_operations = +{ NULL, /* lseek - default */ ncp_file_read, /* read */ ncp_file_write, /* write */ @@ -264,12 +249,13 @@ static struct file_operations ncp_file_operations = { NULL, /* select - default */ ncp_ioctl, /* ioctl */ ncp_mmap, /* mmap */ - NULL, /* open */ - NULL, /* release */ + NULL, /* open */ + NULL, /* release */ ncp_fsync, /* fsync */ }; -struct inode_operations ncp_file_inode_operations = { +struct inode_operations ncp_file_inode_operations = +{ &ncp_file_operations, /* default file operations */ NULL, /* create */ NULL, /* lookup */ diff --git a/kernel-1.2/src/inode.c b/kernel-1.2/src/inode.c index d576ae4..8b575db 100644 --- a/kernel-1.2/src/inode.c +++ b/kernel-1.2/src/inode.c @@ -37,8 +37,9 @@ static void ncp_put_super(struct super_block *); static void ncp_statfs(struct super_block *sb, struct statfs *stat); static int ncp_notify_change(struct inode *inode, struct iattr *attr); -static struct super_operations ncp_sops = { - ncp_read_inode, /* read inode */ +static struct super_operations ncp_sops = +{ + ncp_read_inode, /* read inode */ ncp_notify_change, /* notify change */ NULL, /* write inode */ ncp_put_inode, /* put inode */ @@ -55,13 +56,13 @@ static struct super_operations ncp_sops = { static void ncp_read_inode(struct inode *inode) { - /* Our task should be extremely simple here. We only have to - look up the infomation somebody else (ncp_iget) put into - the inode tree. The address of this information is the - inode->i_ino. Just to make sure everything went well, we - check it's there. */ + /* Our task should be extremely simple here. We only have to + look up the infomation somebody else (ncp_iget) put into + the inode tree. The address of this information is the + inode->i_ino. Just to make sure everything went well, we + check it's there. */ - struct ncp_inode_info *inode_info = ncp_find_inode(inode); + struct ncp_inode_info *inode_info = ncp_find_inode(inode); if (inode_info == NULL) { @@ -70,41 +71,38 @@ ncp_read_inode(struct inode *inode) printk("ncp_read_inode: inode info not found\n"); return; } + inode_info->state = NCP_INODE_VALID; - inode_info->state = NCP_INODE_VALID; - - NCP_INOP(inode) = inode_info; + NCP_INOP(inode) = inode_info; inode_info->inode = inode; - if (NCP_ISTRUCT(inode)->attributes & aDIR) + if (NCP_ISTRUCT(inode)->attributes & aDIR) { - inode->i_mode = NCP_SERVER(inode)->m.dir_mode; + inode->i_mode = NCP_SERVER(inode)->m.dir_mode; /* for directories dataStreamSize seems to be some Object ID ??? */ inode->i_size = 512; - } - else + } else { - inode->i_mode = NCP_SERVER(inode)->m.file_mode; + inode->i_mode = NCP_SERVER(inode)->m.file_mode; inode->i_size = NCP_ISTRUCT(inode)->dataStreamSize; } - DDPRINTK("ncp_read_inode: inode->i_mode = %u\n", inode->i_mode); + DDPRINTK("ncp_read_inode: inode->i_mode = %u\n", inode->i_mode); - inode->i_nlink = 1; - inode->i_uid = NCP_SERVER(inode)->m.uid; - inode->i_gid = NCP_SERVER(inode)->m.gid; - inode->i_blksize = 512; - inode->i_rdev = 0; + inode->i_nlink = 1; + inode->i_uid = NCP_SERVER(inode)->m.uid; + inode->i_gid = NCP_SERVER(inode)->m.gid; + inode->i_blksize = 512; + inode->i_rdev = 0; - if ((inode->i_blksize != 0) && (inode->i_size != 0)) + if ((inode->i_blksize != 0) && (inode->i_size != 0)) { - inode->i_blocks = - (inode->i_size - 1) / inode->i_blksize + 1; - } - else + inode->i_blocks = + (inode->i_size - 1) / inode->i_blksize + 1; + } else { - inode->i_blocks = 0; + inode->i_blocks = 0; } inode->i_mtime = ncp_date_dos2unix(NCP_ISTRUCT(inode)->modifyTime, @@ -114,48 +112,44 @@ ncp_read_inode(struct inode *inode) inode->i_atime = ncp_date_dos2unix(0, NCP_ISTRUCT(inode)->lastAccessDate); - if (S_ISREG(inode->i_mode)) + if (S_ISREG(inode->i_mode)) { - inode->i_op = &ncp_file_inode_operations; - } - else if (S_ISDIR(inode->i_mode)) + inode->i_op = &ncp_file_inode_operations; + } else if (S_ISDIR(inode->i_mode)) { - inode->i_op = &ncp_dir_inode_operations; - } - else + inode->i_op = &ncp_dir_inode_operations; + } else { - inode->i_op = NULL; + inode->i_op = NULL; } } static void ncp_put_inode(struct inode *inode) { - struct nw_file_info *finfo = NCP_FINFO(inode); + struct nw_file_info *finfo = NCP_FINFO(inode); struct super_block *sb = inode->i_sb; lock_super(sb); - if (finfo->opened != 0) + if (finfo->opened != 0) { - if (ncp_close_file(NCP_SERVER(inode), finfo->file_handle)!=0) + if (ncp_close_file(NCP_SERVER(inode), finfo->file_handle) != 0) { - /* We can't do anything but complain. */ - printk("ncp_put_inode: could not close\n"); - } - } - + /* We can't do anything but complain. */ + printk("ncp_put_inode: could not close\n"); + } + } DDPRINTK("ncp_put_inode: put %s\n", - finfo->i.entryName); + finfo->i.entryName); - ncp_free_inode_info(NCP_INOP(inode)); + ncp_free_inode_info(NCP_INOP(inode)); - if (S_ISDIR(inode->i_mode)) + if (S_ISDIR(inode->i_mode)) { - DDPRINTK("ncp_put_inode: put directory %ld\n", + DDPRINTK("ncp_put_inode: put directory %ld\n", inode->i_ino); - ncp_invalid_dir_cache(inode); - } - + ncp_invalid_dir_cache(inode); + } clear_inode(inode); unlock_super(sb); } @@ -164,7 +158,7 @@ struct super_block * ncp_read_super(struct super_block *sb, void *raw_data, int silent) { struct ncp_mount_data *data = (struct ncp_mount_data *) raw_data; - struct ncp_server *server; + struct ncp_server *server; struct file *ncp_filp; struct file *wdog_filp; dev_t dev = sb->s_dev; @@ -176,17 +170,15 @@ ncp_read_super(struct super_block *sb, void *raw_data, int silent) sb->s_dev = 0; return NULL; } - if (data->version != NCP_MOUNT_VERSION) { printk("ncp warning: mount version %s than kernel\n", (data->version < NCP_MOUNT_VERSION) ? - "older" : "newer"); + "older" : "newer"); sb->s_dev = 0; return NULL; } - - if ( (data->ncp_fd >= NR_OPEN) + if ((data->ncp_fd >= NR_OPEN) || ((ncp_filp = current->files->fd[data->ncp_fd]) == NULL) || (!S_ISSOCK(ncp_filp->f_inode->i_mode))) { @@ -194,8 +186,7 @@ ncp_read_super(struct super_block *sb, void *raw_data, int silent) sb->s_dev = 0; return NULL; } - - if ( (data->wdog_fd >= NR_OPEN) + if ((data->wdog_fd >= NR_OPEN) || ((wdog_filp = current->files->fd[data->wdog_fd]) == NULL) || (!S_ISSOCK(wdog_filp->f_inode->i_mode))) { @@ -203,46 +194,44 @@ ncp_read_super(struct super_block *sb, void *raw_data, int silent) sb->s_dev = 0; return NULL; } + /* We must malloc our own super-block info */ + server = (struct ncp_server *) ncp_kmalloc(sizeof(struct ncp_server), + GFP_KERNEL); - /* We must malloc our own super-block info */ - server = (struct ncp_server *)ncp_kmalloc(sizeof(struct ncp_server), - GFP_KERNEL); - - if (server == NULL) + if (server == NULL) { - printk("ncp_read_super: could not alloc ncp_server\n"); - return NULL; - } - + printk("ncp_read_super: could not alloc ncp_server\n"); + return NULL; + } ncp_filp->f_count += 1; wdog_filp->f_count += 1; lock_super(sb); - NCP_SBP(sb) = server; - - sb->s_blocksize = 1024; /* Eh... Is this correct? */ + NCP_SBP(sb) = server; + + sb->s_blocksize = 1024; /* Eh... Is this correct? */ sb->s_blocksize_bits = 10; sb->s_magic = NCP_SUPER_MAGIC; sb->s_dev = dev; sb->s_op = &ncp_sops; - server->ncp_filp = ncp_filp; - server->wdog_filp = wdog_filp; - server->lock = 0; - server->wait = NULL; - server->packet = NULL; + server->ncp_filp = ncp_filp; + server->wdog_filp = wdog_filp; + server->lock = 0; + server->wait = NULL; + server->packet = NULL; server->buffer_size = 0; server->conn_status = 0; - server->m = *data; + server->m = *data; server->m.file_mode = (server->m.file_mode & - (S_IRWXU|S_IRWXG|S_IRWXO)) | S_IFREG; - server->m.dir_mode = (server->m.dir_mode & - (S_IRWXU|S_IRWXG|S_IRWXO)) | S_IFDIR; + (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG; + server->m.dir_mode = (server->m.dir_mode & + (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFDIR; server->packet_size = NCP_PACKET_SIZE; - server->packet = ncp_kmalloc(NCP_PACKET_SIZE, GFP_KERNEL); + server->packet = ncp_kmalloc(NCP_PACKET_SIZE, GFP_KERNEL); if (server->packet == NULL) { @@ -251,12 +240,11 @@ ncp_read_super(struct super_block *sb, void *raw_data, int silent) unlock_super(sb); goto fail; } - - ncp_init_root(server); + ncp_init_root(server); - /* - * Make the connection to the server - */ + /* + * Make the connection to the server + */ if (ncp_catch_watchdog(server) != 0) { @@ -265,7 +253,6 @@ ncp_read_super(struct super_block *sb, void *raw_data, int silent) unlock_super(sb); goto fail; } - ncp_lock_server(server); error = ncp_connect(server); ncp_unlock_server(server); @@ -275,21 +262,19 @@ ncp_read_super(struct super_block *sb, void *raw_data, int silent) { sb->s_dev = 0; printk("ncp_read_super: Failed connection, bailing out " - "(error = %d).\n", -error); - ncp_kfree_s(server->packet, server->packet_size); + "(error = %d).\n", -error); + ncp_kfree_s(server->packet, server->packet_size); ncp_dont_catch_watchdog(server); - goto fail; + goto fail; } - - DPRINTK("ncp_read_super: NCP_SBP(sb) = %x\n", (int)NCP_SBP(sb)); + DPRINTK("ncp_read_super: NCP_SBP(sb) = %x\n", (int) NCP_SBP(sb)); if (!(sb->s_mounted = iget(sb, ncp_info_ino(server, &(server->root))))) { sb->s_dev = 0; printk("ncp_read_super: get root inode failed\n"); - goto disconnect; + goto disconnect; } - if (ncp_negotiate_buffersize(server, NCP_DEFAULT_BUFSIZE, &(server->buffer_size)) != 0) { @@ -297,34 +282,33 @@ ncp_read_super(struct super_block *sb, void *raw_data, int silent) printk("ncp_read_super: could not get bufsize\n"); goto disconnect; } - DPRINTK("ncpfs: bufsize = %d\n", server->buffer_size); - MOD_INC_USE_COUNT; + MOD_INC_USE_COUNT; return sb; - disconnect: + disconnect: ncp_lock_server(server); ncp_disconnect(server); ncp_unlock_server(server); ncp_kfree_s(server->packet, server->packet_size); ncp_dont_catch_watchdog(server); - fail: + fail: ncp_filp->f_count -= 1; wdog_filp->f_count -= 1; - ncp_kfree_s(NCP_SBP(sb), sizeof(struct ncp_server)); - return NULL; + ncp_kfree_s(NCP_SBP(sb), sizeof(struct ncp_server)); + return NULL; } static void ncp_put_super(struct super_block *sb) { - struct ncp_server *server = NCP_SBP(sb); + struct ncp_server *server = NCP_SBP(sb); lock_super(sb); ncp_lock_server(server); - ncp_disconnect(server); + ncp_disconnect(server); ncp_unlock_server(server); close_fp(server->ncp_filp); @@ -332,29 +316,29 @@ ncp_put_super(struct super_block *sb) ncp_dont_catch_watchdog(server); close_fp(server->wdog_filp); - ncp_free_all_inodes(server); + ncp_free_all_inodes(server); - ncp_kfree_s(server->packet, server->packet_size); + ncp_kfree_s(server->packet, server->packet_size); sb->s_dev = 0; - ncp_kfree_s(NCP_SBP(sb), sizeof(struct ncp_server)); + ncp_kfree_s(NCP_SBP(sb), sizeof(struct ncp_server)); NCP_SBP(sb) = NULL; unlock_super(sb); - MOD_DEC_USE_COUNT; + MOD_DEC_USE_COUNT; } -static void +static void ncp_statfs(struct super_block *sb, struct statfs *stat) { struct statfs tmp; - + /* We cannot say how much disk space is left on a mounted - NetWare Server, because free space is distributed over - volumes, and the current user might have disk quotas. So - free space is not that simple to determine. Our decision - here is to err conservatively. */ + NetWare Server, because free space is distributed over + volumes, and the current user might have disk quotas. So + free space is not that simple to determine. Our decision + here is to err conservatively. */ tmp.f_type = NCP_SUPER_MAGIC; tmp.f_bsize = 512; @@ -378,17 +362,16 @@ ncp_notify_change(struct inode *inode, struct iattr *attr) { return -EIO; } - if ((result = inode_change_ok(inode, attr)) < 0) return result; - if (((attr->ia_valid & ATTR_UID) && + if (((attr->ia_valid & ATTR_UID) && (attr->ia_uid != NCP_SERVER(inode)->m.uid))) return -EPERM; - if (((attr->ia_valid & ATTR_GID) && + if (((attr->ia_valid & ATTR_GID) && (attr->ia_uid != NCP_SERVER(inode)->m.gid))) - return -EPERM; + return -EPERM; if (((attr->ia_valid & ATTR_MODE) && (attr->ia_mode & @@ -400,18 +383,16 @@ ncp_notify_change(struct inode *inode, struct iattr *attr) if ((attr->ia_valid & ATTR_CTIME) != 0) { - info_mask |= (DM_CREATE_TIME|DM_CREATE_DATE); + info_mask |= (DM_CREATE_TIME | DM_CREATE_DATE); ncp_date_unix2dos(attr->ia_ctime, &(info.creationTime), &(info.creationDate)); } - if ((attr->ia_valid & ATTR_MTIME) != 0) { - info_mask |= (DM_MODIFY_TIME|DM_MODIFY_DATE); + info_mask |= (DM_MODIFY_TIME | DM_MODIFY_DATE); ncp_date_unix2dos(attr->ia_mtime, &(info.modifyTime), &(info.modifyDate)); } - if ((attr->ia_valid & ATTR_ATIME) != 0) { __u16 dummy; @@ -419,7 +400,6 @@ ncp_notify_change(struct inode *inode, struct iattr *attr) ncp_date_unix2dos(attr->ia_ctime, &(dummy), &(info.lastAccessDate)); } - if (info_mask != 0) { if ((result = @@ -430,19 +410,18 @@ ncp_notify_change(struct inode *inode, struct iattr *attr) { result = -EACCES; - if (info_mask == (DM_CREATE_TIME|DM_CREATE_DATE)) + if (info_mask == (DM_CREATE_TIME | DM_CREATE_DATE)) { /* NetWare seems not to allow this. I - do not know why. So, just tell the - user everything went fine. This is - a terrible hack, but I do not know - how to do this correctly. */ + do not know why. So, just tell the + user everything went fine. This is + a terrible hack, but I do not know + how to do this correctly. */ result = 0; } } } - - if ((attr->ia_valid & ATTR_SIZE) != 0) + if ((attr->ia_valid & ATTR_SIZE) != 0) { int written; @@ -453,7 +432,6 @@ ncp_notify_change(struct inode *inode, struct iattr *attr) { return -EACCES; } - ncp_write(NCP_SERVER(inode), NCP_FINFO(inode)->file_handle, attr->ia_size, 0, "", &written); @@ -465,12 +443,11 @@ ncp_notify_change(struct inode *inode, struct iattr *attr) result = 0; } - - ncp_invalid_dir_cache(NCP_INOP(inode)->dir->inode); + ncp_invalid_dir_cache(NCP_INOP(inode)->dir->inode); return result; } - + #ifdef DEBUG_NCP_MALLOC int ncp_malloced; int ncp_current_malloced; @@ -480,35 +457,36 @@ int ncp_current_malloced; char kernel_version[] = UTS_RELEASE; -static struct file_system_type ncp_fs_type = { - ncp_read_super, "ncpfs", 0, NULL - }; +static struct file_system_type ncp_fs_type = +{ + ncp_read_super, "ncpfs", 0, NULL +}; int -init_module( void) +init_module(void) { - DPRINTK("ncpfs: init_module called\n"); + DPRINTK("ncpfs: init_module called\n"); #ifdef DEBUG_NCP_MALLOC - ncp_malloced = 0; - ncp_current_malloced = 0; + ncp_malloced = 0; + ncp_current_malloced = 0; #endif - ncp_init_dir_cache(); - register_filesystem(&ncp_fs_type); + ncp_init_dir_cache(); + register_filesystem(&ncp_fs_type); printk("ncpfs version %s loaded\n", NCPFS_VERSION); - return 0; + return 0; } void cleanup_module(void) { - DPRINTK("ncpfs: cleanup_module called\n"); - ncp_free_dir_cache(); - unregister_filesystem(&ncp_fs_type); + DPRINTK("ncpfs: cleanup_module called\n"); + ncp_free_dir_cache(); + unregister_filesystem(&ncp_fs_type); #ifdef DEBUG_NCP_MALLOC - printk("ncp_malloced: %d\n", ncp_malloced); - printk("ncp_current_malloced: %d\n", ncp_current_malloced); + printk("ncp_malloced: %d\n", ncp_malloced); + printk("ncp_current_malloced: %d\n", ncp_current_malloced); #endif } diff --git a/kernel-1.2/src/ioctl.c b/kernel-1.2/src/ioctl.c index f0a9d9a..0791445 100644 --- a/kernel-1.2/src/ioctl.c +++ b/kernel-1.2/src/ioctl.c @@ -21,8 +21,8 @@ #include int -ncp_ioctl (struct inode * inode, struct file * filp, - unsigned int cmd, unsigned long arg) +ncp_ioctl(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg) { int result; struct ncp_ioctl_request request; @@ -34,56 +34,54 @@ ncp_ioctl (struct inode * inode, struct file * filp, * Take this out in 2.1.0 development series. * 12 Mar 1996 */ - switch(cmd) { - case _IOR('n', 1, unsigned char *): - cmd = NCP_IOC_NCPREQUEST; - break; + switch (cmd) + { + case _IOR('n', 1, unsigned char *): + cmd = NCP_IOC_NCPREQUEST; + break; case _IOR('u', 1, uid_t): - cmd = NCP_IOC_GETMOUNTUID; - break; + cmd = NCP_IOC_GETMOUNTUID; + break; case _IO('l', 1): - cmd = NCP_IOC_CONN_LOGGED_IN; - break; - case _IOWR('i', 1, unsigned char *): - cmd = NCP_IOC_GET_FS_INFO; - break; + cmd = NCP_IOC_CONN_LOGGED_IN; + break; + case _IOWR('i', 1, unsigned char *): + cmd = NCP_IOC_GET_FS_INFO; + break; } - switch(cmd) { + switch (cmd) + { case NCP_IOC_NCPREQUEST: - if ( (permission(inode, MAY_WRITE) != 0) + if ((permission(inode, MAY_WRITE) != 0) && (current->uid != server->m.mounted_uid)) { return -EACCES; } - - if ((result = verify_area(VERIFY_READ, (char *)arg, + if ((result = verify_area(VERIFY_READ, (char *) arg, sizeof(request))) != 0) { return result; } - - memcpy_fromfs(&request, (struct ncp_ioctl_request *)arg, + memcpy_fromfs(&request, (struct ncp_ioctl_request *) arg, sizeof(request)); - if ( (request.function > 255) + if ((request.function > 255) || (request.size > NCP_PACKET_SIZE - sizeof(struct ncp_request_header))) { return -EINVAL; } - - if ((result = verify_area(VERIFY_WRITE, (char *)request.data, + if ((result = verify_area(VERIFY_WRITE, (char *) request.data, NCP_PACKET_SIZE)) != 0) { return result; } - ncp_lock_server(server); /* FIXME: We hack around in the server's structures - here to be able to use ncp_request */ + here to be able to use ncp_request */ server->has_subfunction = 0; server->current_size = request.size; @@ -101,29 +99,26 @@ ncp_ioctl (struct inode * inode, struct file * filp, case NCP_IOC_CONN_LOGGED_IN: - if ( (permission(inode, MAY_WRITE) != 0) + if ((permission(inode, MAY_WRITE) != 0) && (current->uid != server->m.mounted_uid)) { return -EACCES; } - return ncp_conn_logged_in(server); - + case NCP_IOC_GET_FS_INFO: - if ( (permission(inode, MAY_WRITE) != 0) + if ((permission(inode, MAY_WRITE) != 0) && (current->uid != server->m.mounted_uid)) { return -EACCES; } - - if ((result = verify_area(VERIFY_WRITE, (char *)arg, + if ((result = verify_area(VERIFY_WRITE, (char *) arg, sizeof(info))) != 0) { return result; } - - memcpy_fromfs(&info, (struct ncp_fs_info *)arg, + memcpy_fromfs(&info, (struct ncp_fs_info *) arg, sizeof(info)); if (info.version != NCP_GET_FS_INFO_VERSION) @@ -131,36 +126,34 @@ ncp_ioctl (struct inode * inode, struct file * filp, DPRINTK("info.version invalid: %d\n", info.version); return -EINVAL; } - - info.addr = server->m.serv_addr; + info.addr = server->m.serv_addr; info.mounted_uid = server->m.mounted_uid; - info.connection = server->connection; + info.connection = server->connection; info.buffer_size = server->buffer_size; info.volume_number = NCP_ISTRUCT(inode)->volNumber; - info.directory_id = NCP_ISTRUCT(inode)->DosDirNum; + info.directory_id = NCP_ISTRUCT(inode)->DosDirNum; - memcpy_tofs((struct ncp_fs_info *)arg, &info, sizeof(info)); - return 0; + memcpy_tofs((struct ncp_fs_info *) arg, &info, sizeof(info)); + return 0; - case NCP_IOC_GETMOUNTUID: + case NCP_IOC_GETMOUNTUID: - if ( (permission(inode, MAY_READ) != 0) + if ((permission(inode, MAY_READ) != 0) && (current->uid != server->m.mounted_uid)) { return -EACCES; } - - if ((result = verify_area(VERIFY_WRITE, (uid_t*) arg, - sizeof(uid_t))) != 0) + if ((result = verify_area(VERIFY_WRITE, (uid_t *) arg, + sizeof(uid_t))) != 0) { - return result; - } - put_fs_word(server->m.mounted_uid, (uid_t*) arg); - return 0; + return result; + } + put_fs_word(server->m.mounted_uid, (uid_t *) arg); + return 0; default: return -EINVAL; } - + return -EINVAL; } diff --git a/kernel-1.2/src/mmap.c b/kernel-1.2/src/mmap.c index 344f6eb..ec7f794 100644 --- a/kernel-1.2/src/mmap.c +++ b/kernel-1.2/src/mmap.c @@ -27,19 +27,20 @@ #include #include -static inline int min(int a, int b) +static inline int +min(int a, int b) { - return avm_inode; + struct inode *inode = area->vm_inode; unsigned int clear; unsigned long tmp; int bufsize; @@ -54,19 +55,17 @@ ncp_file_mmap_nopage(struct vm_area_struct * area, { clear = address + PAGE_SIZE - area->vm_end; } - - /* what we can read in one go */ + /* what we can read in one go */ bufsize = NCP_SERVER(inode)->buffer_size; fs = get_fs(); set_fs(get_ds()); - if (ncp_make_open(inode, O_RDONLY) < 0) + if (ncp_make_open(inode, O_RDONLY) < 0) + { + clear = PAGE_SIZE; + } else { - clear = PAGE_SIZE; - } - else - { int already_read = 0; int count = PAGE_SIZE - clear; int to_read; @@ -78,8 +77,7 @@ ncp_file_mmap_nopage(struct vm_area_struct * area, if ((pos % bufsize) != 0) { to_read = bufsize - (pos % bufsize); - } - else + } else { to_read = bufsize; } @@ -89,12 +87,11 @@ ncp_file_mmap_nopage(struct vm_area_struct * area, if (ncp_read(NCP_SERVER(inode), NCP_FINFO(inode)->file_handle, pos, to_read, - (char *)(page + already_read), + (char *) (page + already_read), &read_this_time) != 0) { - read_this_time = 0; + read_this_time = 0; } - pos += read_this_time; already_read += read_this_time; @@ -104,18 +101,20 @@ ncp_file_mmap_nopage(struct vm_area_struct * area, } } - } + } set_fs(fs); tmp = page + PAGE_SIZE; - while (clear--) { - *(char *)--tmp = 0; + while (clear--) + { + *(char *) --tmp = 0; } return page; } -struct vm_operations_struct ncp_file_mmap = { +struct vm_operations_struct ncp_file_mmap = +{ NULL, /* open */ NULL, /* close */ NULL, /* unmap */ @@ -131,25 +130,24 @@ struct vm_operations_struct ncp_file_mmap = { /* This is used for a general mmap of a ncp file */ int -ncp_mmap(struct inode * inode, struct file * file, struct vm_area_struct * vma) +ncp_mmap(struct inode *inode, struct file *file, struct vm_area_struct *vma) { - DPRINTK("ncp_mmap: called\n"); + DPRINTK("ncp_mmap: called\n"); if (!ncp_conn_valid(NCP_SERVER(inode))) { return -EIO; } - - /* only PAGE_COW or read-only supported now */ - if (vma->vm_flags & VM_SHARED) + /* only PAGE_COW or read-only supported now */ + if (vma->vm_flags & VM_SHARED) return -EINVAL; if (!inode->i_sb || !S_ISREG(inode->i_mode)) return -EACCES; - if (!IS_RDONLY(inode)) { + if (!IS_RDONLY(inode)) + { inode->i_atime = CURRENT_TIME; inode->i_dirt = 1; } - vma->vm_inode = inode; inode->i_count++; vma->vm_ops = &ncp_file_mmap; diff --git a/kernel-1.2/src/ncplib_kernel.c b/kernel-1.2/src/ncplib_kernel.c index d987b6e..dd741ce 100644 --- a/kernel-1.2/src/ncplib_kernel.c +++ b/kernel-1.2/src/ncplib_kernel.c @@ -1,3 +1,4 @@ + #include #ifdef MODULE #include @@ -6,13 +7,14 @@ #include "ncplib_kernel.h" -typedef __u8 byte; +typedef __u8 byte; typedef __u16 word; typedef __u32 dword; -static inline int min(int a, int b) +static inline int +min(int a, int b) { - return apacket[server->current_size])) = x; + *(byte *) (&(server->packet[server->current_size])) = x; server->current_size += 1; return; } @@ -37,7 +39,7 @@ static void ncp_add_word(struct ncp_server *server, word x) { assert_server_locked(server); - *(word *)(&(server->packet[server->current_size])) = x; + *(word *) (&(server->packet[server->current_size])) = x; server->current_size += 2; return; } @@ -46,7 +48,7 @@ static void ncp_add_dword(struct ncp_server *server, dword x) { assert_server_locked(server); - *(dword *)(&(server->packet[server->current_size])) = x; + *(dword *) (&(server->packet[server->current_size])) = x; server->current_size += 4; return; } @@ -97,7 +99,7 @@ static void ncp_init_request_s(struct ncp_server *server, int subfunction) { ncp_init_request(server); - ncp_add_word(server, 0); /* preliminary size */ + ncp_add_word(server, 0); /* preliminary size */ ncp_add_byte(server, subfunction); @@ -113,19 +115,19 @@ ncp_reply_data(struct ncp_server *server, int offset) static byte ncp_reply_byte(struct ncp_server *server, int offset) { - return *(byte *)(ncp_reply_data(server, offset)); + return *(byte *) (ncp_reply_data(server, offset)); } static word ncp_reply_word(struct ncp_server *server, int offset) { - return *(word *)(ncp_reply_data(server, offset)); + return *(word *) (ncp_reply_data(server, offset)); } static dword ncp_reply_dword(struct ncp_server *server, int offset) { - return *(dword *)(ncp_reply_data(server, offset)); + return *(dword *) (ncp_reply_data(server, offset)); } int @@ -136,14 +138,13 @@ ncp_negotiate_buffersize(struct ncp_server *server, ncp_init_request(server); ncp_add_word(server, htons(size)); - + if ((result = ncp_request(server, 33)) != 0) { ncp_unlock_server(server); return result; } - - *target =min(ntohs(ncp_reply_word(server, 0)), size); + *target = min(ntohs(ncp_reply_word(server, 0)), size); ncp_unlock_server(server); return 0; @@ -164,9 +165,8 @@ ncp_get_volume_info_with_number(struct ncp_server *server, int n, ncp_unlock_server(server); return result; } - target->total_blocks = ncp_reply_dword(server, 0); - target->free_blocks = ncp_reply_dword(server, 4); + target->free_blocks = ncp_reply_dword(server, 4); target->purgeable_blocks = ncp_reply_dword(server, 8); target->not_yet_purgeable_blocks = ncp_reply_dword(server, 12); target->total_dir_entries = ncp_reply_dword(server, 16); @@ -182,7 +182,6 @@ ncp_get_volume_info_with_number(struct ncp_server *server, int n, ncp_unlock_server(server); return -EIO; } - memcpy(&(target->volume_name), ncp_reply_data(server, 30), len); ncp_unlock_server(server); return 0; @@ -202,7 +201,6 @@ ncp_close_file(struct ncp_server *server, const char *file_id) ncp_unlock_server(server); return result; } - ncp_unlock_server(server); return 0; } @@ -217,18 +215,16 @@ ncp_add_handle_path(struct ncp_server *server, ncp_add_dword(server, dir_base); if (have_dir_base != 0) { - ncp_add_byte(server, 1); /* dir_base */ - } - else + ncp_add_byte(server, 1); /* dir_base */ + } else { - ncp_add_byte(server, 0xff); /* no handle */ + ncp_add_byte(server, 0xff); /* no handle */ } if (path != NULL) { - ncp_add_byte(server, 1); /* 1 component */ + ncp_add_byte(server, 1); /* 1 component */ ncp_add_pstring(server, path); - } - else + } else { ncp_add_byte(server, 0); } @@ -243,7 +239,7 @@ ncp_extract_file_info(void *structure, struct nw_info_struct *target) memcpy(target, structure, info_struct_size); name_len = structure + info_struct_size; target->nameLen = *name_len; - strncpy(target->entryName, name_len+1, *name_len); + strncpy(target->entryName, name_len + 1, *name_len); target->entryName[*name_len] = '\0'; return; } @@ -251,7 +247,7 @@ ncp_extract_file_info(void *structure, struct nw_info_struct *target) int ncp_obtain_info(struct ncp_server *server, __u8 vol_num, __u32 dir_base, - char *path, /* At most 1 component */ + char *path, /* At most 1 component */ struct nw_info_struct *target) { int result; @@ -260,12 +256,11 @@ ncp_obtain_info(struct ncp_server *server, { return -EINVAL; } - ncp_init_request(server); - ncp_add_byte(server, 6); /* subfunction */ + ncp_add_byte(server, 6); /* subfunction */ ncp_add_byte(server, server->name_space[vol_num]); ncp_add_byte(server, server->name_space[vol_num]); - ncp_add_word(server, 0xff); /* get all */ + ncp_add_word(server, 0xff); /* get all */ ncp_add_dword(server, RIM_ALL); ncp_add_handle_path(server, vol_num, dir_base, 1, path); @@ -274,7 +269,6 @@ ncp_obtain_info(struct ncp_server *server, ncp_unlock_server(server); return result; } - ncp_extract_file_info(ncp_reply_data(server, 0), target); ncp_unlock_server(server); return 0; @@ -288,7 +282,7 @@ ncp_has_os2_namespace(struct ncp_server *server, __u8 volume) __u16 no_namespaces; ncp_init_request(server); - ncp_add_byte(server, 24); /* Subfunction: Get Name Spaces Loaded */ + ncp_add_byte(server, 24); /* Subfunction: Get Name Spaces Loaded */ ncp_add_word(server, 0); ncp_add_byte(server, volume); @@ -297,13 +291,12 @@ ncp_has_os2_namespace(struct ncp_server *server, __u8 volume) ncp_unlock_server(server); return 0; } - no_namespaces = ncp_reply_word(server, 0); namespace = ncp_reply_data(server, 2); while (no_namespaces > 0) { - DPRINTK("get_namespaces: found %d on %d\n", *namespace,volume); + DPRINTK("get_namespaces: found %d on %d\n", *namespace, volume); if (*namespace == 4) { @@ -329,16 +322,16 @@ ncp_lookup_volume(struct ncp_server *server, DPRINTK("ncp_lookup_volume: looking up vol %s\n", volname); ncp_init_request(server); - ncp_add_byte(server, 22); /* Subfunction: Generate dir handle */ - ncp_add_byte(server, 0); /* DOS namespace */ - ncp_add_byte(server, 0); /* reserved */ - ncp_add_byte(server, 0); /* reserved */ - ncp_add_byte(server, 0); /* reserved */ + ncp_add_byte(server, 22); /* Subfunction: Generate dir handle */ + ncp_add_byte(server, 0); /* DOS namespace */ + ncp_add_byte(server, 0); /* reserved */ + ncp_add_byte(server, 0); /* reserved */ + ncp_add_byte(server, 0); /* reserved */ - ncp_add_byte(server, 0); /* faked volume number */ - ncp_add_dword(server, 0); /* faked dir_base */ - ncp_add_byte(server, 0xff); /* Don't have a dir_base */ - ncp_add_byte(server, 1); /* 1 path component */ + ncp_add_byte(server, 0); /* faked volume number */ + ncp_add_dword(server, 0); /* faked dir_base */ + ncp_add_byte(server, 0xff); /* Don't have a dir_base */ + ncp_add_byte(server, 1); /* 1 path component */ ncp_add_pstring(server, volname); if ((result = ncp_request(server, 87)) != 0) @@ -346,13 +339,12 @@ ncp_lookup_volume(struct ncp_server *server, ncp_unlock_server(server); return result; } - memset(target, 0, sizeof(*target)); target->DosDirNum = target->dirEntNum = ncp_reply_dword(server, 4); target->volNumber = volnum = ncp_reply_byte(server, 8); ncp_unlock_server(server); - server->name_space[volnum] = ncp_has_os2_namespace(server,volnum)?4:0; + server->name_space[volnum] = ncp_has_os2_namespace(server, volnum) ? 4 : 0; DPRINTK("lookup_vol: namespace[%d] = %d\n", volnum, server->name_space[volnum]); @@ -372,10 +364,10 @@ ncp_modify_file_or_subdir_dos_info(struct ncp_server *server, int result; ncp_init_request(server); - ncp_add_byte(server, 7); /* subfunction */ + ncp_add_byte(server, 7); /* subfunction */ ncp_add_byte(server, server->name_space[file->volNumber]); - ncp_add_byte(server, 0); /* reserved */ - ncp_add_word(server, 0x8006); /* search attribs: all */ + ncp_add_byte(server, 0); /* reserved */ + ncp_add_word(server, 0x8006); /* search attribs: all */ ncp_add_dword(server, info_mask); ncp_add_mem(server, info, sizeof(*info)); @@ -387,7 +379,6 @@ ncp_modify_file_or_subdir_dos_info(struct ncp_server *server, ncp_unlock_server(server); return result; } - ncp_unlock_server(server); return 0; } @@ -399,30 +390,29 @@ ncp_del_file_or_subdir(struct ncp_server *server, int result; ncp_init_request(server); - ncp_add_byte(server, 8); /* subfunction */ + ncp_add_byte(server, 8); /* subfunction */ ncp_add_byte(server, server->name_space[dir->volNumber]); - ncp_add_byte(server, 0); /* reserved */ - ncp_add_word(server, 0x8006); /* search attribs: all */ + ncp_add_byte(server, 0); /* reserved */ + ncp_add_word(server, 0x8006); /* search attribs: all */ ncp_add_handle_path(server, dir->volNumber, dir->dirEntNum, 1, name); - + if ((result = ncp_request(server, 87)) != 0) { ncp_unlock_server(server); return result; } - ncp_unlock_server(server); return 0; } static inline void -ConvertToNWfromDWORD ( __u32 sfd , __u8 ret[6] ) +ConvertToNWfromDWORD(__u32 sfd, __u8 ret[6]) { - __u16 *dest = (__u16 *) ret; - memcpy(&(dest[1]), &sfd, 4); - dest[0] = dest[1] + 1; - return; + __u16 *dest = (__u16 *) ret; + memcpy(&(dest[1]), &sfd, 4); + dest[0] = dest[1] + 1; + return; } /* If both dir and name are NULL, then in target there's already a @@ -441,11 +431,10 @@ ncp_open_create_file_or_subdir(struct ncp_server *server, if ((create_attributes & aDIR) != 0) { - search_attribs |= 0x8000; -} - + search_attribs |= 0x8000; + } ncp_init_request(server); - ncp_add_byte(server, 1); /* subfunction */ + ncp_add_byte(server, 1); /* subfunction */ ncp_add_byte(server, server->name_space[volume]); ncp_add_byte(server, open_create_mode); ncp_add_word(server, search_attribs); @@ -458,19 +447,17 @@ ncp_open_create_file_or_subdir(struct ncp_server *server, if (dir != NULL) { ncp_add_handle_path(server, volume, dir->dirEntNum, 1, name); - } - else + } else { ncp_add_handle_path(server, volume, target->i.dirEntNum, 1, NULL); - } + } if ((result = ncp_request(server, 87)) != 0) { ncp_unlock_server(server); return result; } - target->opened = 1; target->server_file_handle = ncp_reply_dword(server, 0); target->open_create_action = ncp_reply_byte(server, 4); @@ -480,13 +467,12 @@ ncp_open_create_file_or_subdir(struct ncp_server *server, /* in target there's a new finfo to fill */ ncp_extract_file_info(ncp_reply_data(server, 5), &(target->i)); } - ConvertToNWfromDWORD(target->server_file_handle, target->file_handle); ncp_unlock_server(server); return 0; } - + int ncp_initialize_search(struct ncp_server *server, @@ -496,23 +482,22 @@ ncp_initialize_search(struct ncp_server *server, int result; ncp_init_request(server); - ncp_add_byte(server, 2); /* subfunction */ + ncp_add_byte(server, 2); /* subfunction */ ncp_add_byte(server, server->name_space[dir->volNumber]); - ncp_add_byte(server, 0); /* reserved */ + ncp_add_byte(server, 0); /* reserved */ ncp_add_handle_path(server, dir->volNumber, dir->dirEntNum, 1, NULL); - + if ((result = ncp_request(server, 87)) != 0) { ncp_unlock_server(server); return result; } - memcpy(target, ncp_reply_data(server, 0), sizeof(*target)); ncp_unlock_server(server); return 0; } - + /* Search for everything */ int ncp_search_for_file_or_subdir(struct ncp_server *server, @@ -522,22 +507,21 @@ ncp_search_for_file_or_subdir(struct ncp_server *server, int result; ncp_init_request(server); - ncp_add_byte(server, 3); /* subfunction */ + ncp_add_byte(server, 3); /* subfunction */ ncp_add_byte(server, server->name_space[seq->volNumber]); - ncp_add_byte(server, 0); /* data stream (???) */ - ncp_add_word(server, 0xffff); /* Search attribs */ - ncp_add_dword(server, RIM_ALL); /* return info mask */ + ncp_add_byte(server, 0); /* data stream (???) */ + ncp_add_word(server, 0xffff); /* Search attribs */ + ncp_add_dword(server, RIM_ALL); /* return info mask */ ncp_add_mem(server, seq, 9); - ncp_add_byte(server, 2); /* 2 byte pattern */ - ncp_add_byte(server, 0xff); /* following is a wildcard */ + ncp_add_byte(server, 2); /* 2 byte pattern */ + ncp_add_byte(server, 0xff); /* following is a wildcard */ ncp_add_byte(server, '*'); - + if ((result = ncp_request(server, 87)) != 0) { ncp_unlock_server(server); return result; } - memcpy(seq, ncp_reply_data(server, 0), sizeof(*seq)); ncp_extract_file_info(ncp_reply_data(server, 10), target); @@ -552,27 +536,27 @@ ncp_ren_or_mov_file_or_subdir(struct ncp_server *server, { int result; - if ( (old_dir == NULL) || (old_name == NULL) + if ((old_dir == NULL) || (old_name == NULL) || (new_dir == NULL) || (new_name == NULL)) return -EINVAL; - + ncp_init_request(server); - ncp_add_byte(server, 4); /* subfunction */ + ncp_add_byte(server, 4); /* subfunction */ ncp_add_byte(server, server->name_space[old_dir->volNumber]); - ncp_add_byte(server, 1); /* rename flag */ - ncp_add_word(server, 0x8006); /* search attributes */ + ncp_add_byte(server, 1); /* rename flag */ + ncp_add_word(server, 0x8006); /* search attributes */ /* source Handle Path */ ncp_add_byte(server, old_dir->volNumber); ncp_add_dword(server, old_dir->dirEntNum); ncp_add_byte(server, 1); - ncp_add_byte(server, 1); /* 1 source component */ + ncp_add_byte(server, 1); /* 1 source component */ /* dest Handle Path */ ncp_add_byte(server, new_dir->volNumber); ncp_add_dword(server, new_dir->dirEntNum); ncp_add_byte(server, 1); - ncp_add_byte(server, 1); /* 1 destination component */ + ncp_add_byte(server, 1); /* 1 destination component */ /* source path string */ ncp_add_pstring(server, old_name); @@ -583,7 +567,7 @@ ncp_ren_or_mov_file_or_subdir(struct ncp_server *server, ncp_unlock_server(server); return result; } - + /* We have to transfer to/from user space */ int @@ -604,10 +588,9 @@ ncp_read(struct ncp_server *server, const char *file_id, ncp_unlock_server(server); return result; } - *bytes_read = ntohs(ncp_reply_word(server, 0)); - memcpy_tofs(target, ncp_reply_data(server, 2+(offset&1)), *bytes_read); + memcpy_tofs(target, ncp_reply_data(server, 2 + (offset & 1)), *bytes_read); ncp_unlock_server(server); return 0; @@ -632,10 +615,8 @@ ncp_write(struct ncp_server *server, const char *file_id, ncp_unlock_server(server); return result; } - *bytes_written = to_write; ncp_unlock_server(server); return 0; } - diff --git a/kernel-1.2/src/ncplib_kernel.h b/kernel-1.2/src/ncplib_kernel.h index 8d46aa6..2abcc4c 100644 --- a/kernel-1.2/src/ncplib_kernel.h +++ b/kernel-1.2/src/ncplib_kernel.h @@ -1,3 +1,4 @@ + #ifndef _NCPLIB_H #define _NCPLIB_H @@ -16,147 +17,147 @@ #include int -ncp_negotiate_buffersize(struct ncp_server *server, int size, - int *target); + ncp_negotiate_buffersize(struct ncp_server *server, int size, + int *target); int -ncp_get_encryption_key(struct ncp_server *server, - char *target); + ncp_get_encryption_key(struct ncp_server *server, + char *target); int -ncp_get_bindery_object_id(struct ncp_server *server, - int object_type, char *object_name, - struct ncp_bindery_object *target); + ncp_get_bindery_object_id(struct ncp_server *server, + int object_type, char *object_name, + struct ncp_bindery_object *target); int -ncp_login_encrypted(struct ncp_server *server, - struct ncp_bindery_object *object, - unsigned char *key, - unsigned char *passwd); + ncp_login_encrypted(struct ncp_server *server, + struct ncp_bindery_object *object, + unsigned char *key, + unsigned char *passwd); int -ncp_login_user(struct ncp_server *server, - unsigned char *username, - unsigned char *password); + ncp_login_user(struct ncp_server *server, + unsigned char *username, + unsigned char *password); int -ncp_get_volume_info_with_number(struct ncp_server *server, int n, - struct ncp_volume_info *target); + ncp_get_volume_info_with_number(struct ncp_server *server, int n, + struct ncp_volume_info *target); int -ncp_get_volume_number(struct ncp_server *server, const char *name, - int *target); + ncp_get_volume_number(struct ncp_server *server, const char *name, + int *target); int -ncp_file_search_init(struct ncp_server *server, - int dir_handle, const char *path, - struct ncp_filesearch_info *target); + ncp_file_search_init(struct ncp_server *server, + int dir_handle, const char *path, + struct ncp_filesearch_info *target); int -ncp_file_search_continue(struct ncp_server *server, - struct ncp_filesearch_info *fsinfo, - int attributes, const char *path, - struct ncp_file_info *target); + ncp_file_search_continue(struct ncp_server *server, + struct ncp_filesearch_info *fsinfo, + int attributes, const char *path, + struct ncp_file_info *target); int -ncp_get_finfo(struct ncp_server *server, - int dir_handle, const char *path, const char *name, - struct ncp_file_info *target); + ncp_get_finfo(struct ncp_server *server, + int dir_handle, const char *path, const char *name, + struct ncp_file_info *target); int -ncp_open_file(struct ncp_server *server, - int dir_handle, const char *path, - int attr, int access, - struct ncp_file_info *target); -int -ncp_close_file(struct ncp_server *server, const char *file_id); - -int -ncp_create_newfile(struct ncp_server *server, - int dir_handle, const char *path, - int attr, - struct ncp_file_info *target); - -int -ncp_create_file(struct ncp_server *server, - int dir_handle, const char *path, - int attr, - struct ncp_file_info *target); - -int -ncp_erase_file(struct ncp_server *server, + ncp_open_file(struct ncp_server *server, int dir_handle, const char *path, - int attr); + int attr, int access, + struct ncp_file_info *target); +int + ncp_close_file(struct ncp_server *server, const char *file_id); int -ncp_rename_file(struct ncp_server *server, - int old_handle, const char *old_path, - int attr, - int new_handle, const char *new_path); + ncp_create_newfile(struct ncp_server *server, + int dir_handle, const char *path, + int attr, + struct ncp_file_info *target); int -ncp_create_directory(struct ncp_server *server, - int dir_handle, const char *path, - int inherit_mask); + ncp_create_file(struct ncp_server *server, + int dir_handle, const char *path, + int attr, + struct ncp_file_info *target); int -ncp_delete_directory(struct ncp_server *server, - int dir_handle, const char *path); + ncp_erase_file(struct ncp_server *server, + int dir_handle, const char *path, + int attr); int -ncp_rename_directory(struct ncp_server *server, - int dir_handle, - const char *old_path, const char *new_path); + ncp_rename_file(struct ncp_server *server, + int old_handle, const char *old_path, + int attr, + int new_handle, const char *new_path); int -ncp_read(struct ncp_server *server, const char *file_id, - __u32 offset, __u16 to_read, - char *target, int *bytes_read); + ncp_create_directory(struct ncp_server *server, + int dir_handle, const char *path, + int inherit_mask); int -ncp_write(struct ncp_server *server, const char *file_id, - __u32 offset, __u16 to_write, - const char *source, int *bytes_written); + ncp_delete_directory(struct ncp_server *server, + int dir_handle, const char *path); int -ncp_obtain_info(struct ncp_server *server, - __u8 vol_num, __u32 dir_base, - char *path, /* At most 1 component */ - struct nw_info_struct *target); + ncp_rename_directory(struct ncp_server *server, + int dir_handle, + const char *old_path, const char *new_path); int -ncp_lookup_volume(struct ncp_server *server, - char *volname, - struct nw_info_struct *target); + ncp_read(struct ncp_server *server, const char *file_id, + __u32 offset, __u16 to_read, + char *target, int *bytes_read); + +int + ncp_write(struct ncp_server *server, const char *file_id, + __u32 offset, __u16 to_write, + const char *source, int *bytes_written); + +int + ncp_obtain_info(struct ncp_server *server, + __u8 vol_num, __u32 dir_base, + char *path, /* At most 1 component */ + struct nw_info_struct *target); + +int + ncp_lookup_volume(struct ncp_server *server, + char *volname, + struct nw_info_struct *target); int -ncp_modify_file_or_subdir_dos_info(struct ncp_server *server, - struct nw_info_struct *file, - __u32 info_mask, - struct nw_modify_dos_info *info); + ncp_modify_file_or_subdir_dos_info(struct ncp_server *server, + struct nw_info_struct *file, + __u32 info_mask, + struct nw_modify_dos_info *info); int -ncp_del_file_or_subdir(struct ncp_server *server, - struct nw_info_struct *dir, char *name); + ncp_del_file_or_subdir(struct ncp_server *server, + struct nw_info_struct *dir, char *name); int -ncp_open_create_file_or_subdir(struct ncp_server *server, - struct nw_info_struct *dir, char *name, - int open_create_mode, - __u32 create_attributes, - int desired_acc_rights, - struct nw_file_info *target); + ncp_open_create_file_or_subdir(struct ncp_server *server, + struct nw_info_struct *dir, char *name, + int open_create_mode, + __u32 create_attributes, + int desired_acc_rights, + struct nw_file_info *target); int -ncp_initialize_search(struct ncp_server *server, - struct nw_info_struct *dir, - struct nw_search_sequence *target); + ncp_initialize_search(struct ncp_server *server, + struct nw_info_struct *dir, + struct nw_search_sequence *target); int -ncp_search_for_file_or_subdir(struct ncp_server *server, - struct nw_search_sequence *seq, - struct nw_info_struct *target); + ncp_search_for_file_or_subdir(struct ncp_server *server, + struct nw_search_sequence *seq, + struct nw_info_struct *target); int -ncp_ren_or_mov_file_or_subdir(struct ncp_server *server, - struct nw_info_struct *old_dir, char *old_name, - struct nw_info_struct *new_dir, char *new_name); + ncp_ren_or_mov_file_or_subdir(struct ncp_server *server, + struct nw_info_struct *old_dir, char *old_name, + struct nw_info_struct *new_dir, char *new_name); -#endif /* _NCPLIB_H */ +#endif /* _NCPLIB_H */ diff --git a/kernel-1.2/src/sock.c b/kernel-1.2/src/sock.c index 12e2a51..af82549 100644 --- a/kernel-1.2/src/sock.c +++ b/kernel-1.2/src/sock.c @@ -49,41 +49,40 @@ ncp_wdog_data_ready(struct sock *sk, int len) fs = get_fs(); set_fs(get_ds()); - result = sock->ops->recvfrom(sock, (void *)packet_buf, 2, 1, 0, - (struct sockaddr *)&sender, + result = sock->ops->recvfrom(sock, (void *) packet_buf, 2, 1, 0, + (struct sockaddr *) &sender, &addr_len); - if ( (result != 2) + if ((result != 2) || (packet_buf[1] != '?') - /* How to check connection number here? */ + /* How to check connection number here? */ ) { /* Error, throw away the complete packet */ - sock->ops->recvfrom(sock, (void *)packet_buf, 2, 1, 0, - (struct sockaddr *)&sender, + sock->ops->recvfrom(sock, (void *) packet_buf, 2, 1, 0, + (struct sockaddr *) &sender, &addr_len); printk("ncpfs: got strange packet on watchdog " "socket\n"); - - } - else + + } else { int result; DDPRINTK("ncpfs: got watchdog from:\n"); DDPRINTK("ncpfs: %08lX:%02X%02X%02X%02X%02X%02X:%04X," - " conn:%02X,type:%c\n", - htonl(sender.sipx_network), - sender.sipx_node[0], sender.sipx_node[1], - sender.sipx_node[2], sender.sipx_node[3], - sender.sipx_node[4], sender.sipx_node[5], - ntohs(sender.sipx_port), - packet_buf[0], packet_buf[1]); + " conn:%02X,type:%c\n", + htonl(sender.sipx_network), + sender.sipx_node[0], sender.sipx_node[1], + sender.sipx_node[2], sender.sipx_node[3], + sender.sipx_node[4], sender.sipx_node[5], + ntohs(sender.sipx_port), + packet_buf[0], packet_buf[1]); packet_buf[1] = 'Y'; - result = sock->ops->sendto(sock, (void *)packet_buf, + result = sock->ops->sendto(sock, (void *) packet_buf, 2, 1, 0, - (struct sockaddr *)&sender, + (struct sockaddr *) &sender, sizeof(sender)); DDPRINTK("send result: %d\n", result); } @@ -95,109 +94,100 @@ ncp_wdog_data_ready(struct sock *sk, int len) int ncp_catch_watchdog(struct ncp_server *server) { - struct file *file; - struct inode *inode; - struct socket *sock; - struct sock *sk; + struct file *file; + struct inode *inode; + struct socket *sock; + struct sock *sk; - if ( (server == NULL) - || ((file = server->wdog_filp) == NULL) - || ((inode = file->f_inode) == NULL) - || (!S_ISSOCK(inode->i_mode))) + if ((server == NULL) + || ((file = server->wdog_filp) == NULL) + || ((inode = file->f_inode) == NULL) + || (!S_ISSOCK(inode->i_mode))) { - printk("ncp_catch_watchdog: did not get valid server!\n"); - server->data_ready = NULL; - return -EINVAL; - } + printk("ncp_catch_watchdog: did not get valid server!\n"); + server->data_ready = NULL; + return -EINVAL; + } + sock = &(inode->u.socket_i); - sock = &(inode->u.socket_i); - - if (sock->type != SOCK_DGRAM) + if (sock->type != SOCK_DGRAM) { - printk("ncp_catch_watchdog: did not get SOCK_STREAM\n"); - server->data_ready = NULL; - return -EINVAL; - } + printk("ncp_catch_watchdog: did not get SOCK_STREAM\n"); + server->data_ready = NULL; + return -EINVAL; + } + sk = (struct sock *) (sock->data); - sk = (struct sock *)(sock->data); - - if (sk == NULL) + if (sk == NULL) { - printk("ncp_catch_watchdog: sk == NULL"); - server->data_ready = NULL; - return -EINVAL; - } + printk("ncp_catch_watchdog: sk == NULL"); + server->data_ready = NULL; + return -EINVAL; + } + DDPRINTK("ncp_catch_watchdog.: sk->d_r = %x, server->d_r = %x\n", + (unsigned int) (sk->data_ready), + (unsigned int) (server->data_ready)); - DDPRINTK("ncp_catch_watchdog.: sk->d_r = %x, server->d_r = %x\n", - (unsigned int)(sk->data_ready), - (unsigned int)(server->data_ready)); - - if (sk->data_ready == ncp_wdog_data_ready) + if (sk->data_ready == ncp_wdog_data_ready) { - printk("ncp_catch_watchdog: already done\n"); - return -EINVAL; - } - - server->data_ready = sk->data_ready; - sk->data_ready = ncp_wdog_data_ready; - return 0; + printk("ncp_catch_watchdog: already done\n"); + return -EINVAL; + } + server->data_ready = sk->data_ready; + sk->data_ready = ncp_wdog_data_ready; + return 0; } - + int ncp_dont_catch_watchdog(struct ncp_server *server) { - struct file *file; - struct inode *inode; - struct socket *sock; - struct sock *sk; + struct file *file; + struct inode *inode; + struct socket *sock; + struct sock *sk; - if ( (server == NULL) - || ((file = server->wdog_filp) == NULL) - || ((inode = file->f_inode) == NULL) - || (!S_ISSOCK(inode->i_mode))) + if ((server == NULL) + || ((file = server->wdog_filp) == NULL) + || ((inode = file->f_inode) == NULL) + || (!S_ISSOCK(inode->i_mode))) { - printk("ncp_dont_catch_watchdog: " - "did not get valid server!\n"); - return -EINVAL; - } + printk("ncp_dont_catch_watchdog: " + "did not get valid server!\n"); + return -EINVAL; + } + sock = &(inode->u.socket_i); - sock = &(inode->u.socket_i); - - if (sock->type != SOCK_DGRAM) + if (sock->type != SOCK_DGRAM) { - printk("ncp_dont_catch_watchdog: did not get SOCK_STREAM\n"); - return -EINVAL; - } + printk("ncp_dont_catch_watchdog: did not get SOCK_STREAM\n"); + return -EINVAL; + } + sk = (struct sock *) (sock->data); - sk = (struct sock *)(sock->data); - - if (sk == NULL) + if (sk == NULL) { - printk("ncp_dont_catch_watchdog: sk == NULL"); - return -EINVAL; - } - - if (server->data_ready == NULL) + printk("ncp_dont_catch_watchdog: sk == NULL"); + return -EINVAL; + } + if (server->data_ready == NULL) { - printk("ncp_dont_catch_watchdog: " - "server->data_ready == NULL\n"); - return -EINVAL; - } - - if (sk->data_ready != ncp_wdog_data_ready) + printk("ncp_dont_catch_watchdog: " + "server->data_ready == NULL\n"); + return -EINVAL; + } + if (sk->data_ready != ncp_wdog_data_ready) { - printk("ncp_dont_catch_watchdog: " - "sk->data_callback != ncp_data_callback\n"); - return -EINVAL; - } + printk("ncp_dont_catch_watchdog: " + "sk->data_callback != ncp_data_callback\n"); + return -EINVAL; + } + DDPRINTK("ncp_dont_catch_watchdog: sk->d_r = %x, server->d_r = %x\n", + (unsigned int) (sk->data_ready), + (unsigned int) (server->data_ready)); - DDPRINTK("ncp_dont_catch_watchdog: sk->d_r = %x, server->d_r = %x\n", - (unsigned int)(sk->data_ready), - (unsigned int)(server->data_ready)); - - sk->data_ready = server->data_ready; - server->data_ready = NULL; - return 0; + sk->data_ready = server->data_ready; + server->data_ready = NULL; + return 0; } @@ -229,9 +219,9 @@ do_ncp_rpc_call(struct ncp_server *server, int size) /* We have to check the result, so store the complete header */ struct ncp_request_header request = - *((struct ncp_request_header *)(server->packet)); + *((struct ncp_request_header *) (server->packet)); - struct ncp_reply_header reply; + struct ncp_reply_header reply; file = server->ncp_filp; @@ -251,32 +241,32 @@ do_ncp_rpc_call(struct ncp_server *server, int size) old_mask = current->blocked; current->blocked |= ~(_S(SIGKILL) #if 0 - | _S(SIGSTOP) + | _S(SIGSTOP) #endif - | ((server->m.flags & NCP_MOUNT_INTR) - ? ((current->sigaction[SIGINT - 1].sa_handler == SIG_DFL - ? _S(SIGINT) : 0) - | (current->sigaction[SIGQUIT - 1].sa_handler == SIG_DFL - ? _S(SIGQUIT) : 0)) - : 0)); + | ((server->m.flags & NCP_MOUNT_INTR) + ? ((current->sigaction[SIGINT - 1].sa_handler == SIG_DFL + ? _S(SIGINT) : 0) + | (current->sigaction[SIGQUIT - 1].sa_handler == SIG_DFL + ? _S(SIGQUIT) : 0)) + : 0)); fs = get_fs(); set_fs(get_ds()); - for (n = 0, timeout = init_timeout; ; n++, timeout <<= 1) + for (n = 0, timeout = init_timeout;; n++, timeout <<= 1) { DDPRINTK("ncpfs: %08lX:%02X%02X%02X%02X%02X%02X:%04X\n", - htonl(server->m.serv_addr.sipx_network), - server->m.serv_addr.sipx_node[0], - server->m.serv_addr.sipx_node[1], - server->m.serv_addr.sipx_node[2], - server->m.serv_addr.sipx_node[3], - server->m.serv_addr.sipx_node[4], - server->m.serv_addr.sipx_node[5], - ntohs(server->m.serv_addr.sipx_port)); + htonl(server->m.serv_addr.sipx_network), + server->m.serv_addr.sipx_node[0], + server->m.serv_addr.sipx_node[1], + server->m.serv_addr.sipx_node[2], + server->m.serv_addr.sipx_node[3], + server->m.serv_addr.sipx_node[4], + server->m.serv_addr.sipx_node[5], + ntohs(server->m.serv_addr.sipx_port)); DDPRINTK("ncpfs: req.typ: %04X, con: %d, " - "seq: %d", - request.type, - (request.conn_high << 8) + request.conn_low, - request.sequence); + "seq: %d", + request.type, + (request.conn_high << 8) + request.conn_low, + request.sequence); DDPRINTK(" func: %d\n", request.function); @@ -289,11 +279,11 @@ do_ncp_rpc_call(struct ncp_server *server, int size) printk("ncp_rpc_call: send error = %d\n", result); break; } - re_select: + re_select: wait_table.nr = 0; wait_table.entry = &entry; current->state = TASK_INTERRUPTIBLE; - if ( !select(inode, file, SEL_IN, &wait_table) + if (!select(inode, file, SEL_IN, &wait_table) && !select(inode, file, SEL_IN, NULL)) { if (timeout > max_timeout) @@ -336,11 +326,9 @@ do_ncp_rpc_call(struct ncp_server *server, int size) } major_timeout_seen = 1; continue; - } - else + } else current->timeout = 0; - } - else if (wait_table.nr) + } else if (wait_table.nr) remove_wait_queue(entry.wait_address, &entry.wait); current->state = TASK_RUNNING; addrlen = 0; @@ -348,7 +336,7 @@ do_ncp_rpc_call(struct ncp_server *server, int size) /* Get the header from the next packet using a peek, so keep it * on the recv queue. If it is wrong, it will be some reply * we don't now need, so discard it */ - result = sock->ops->recvfrom(sock, (void *)&reply, + result = sock->ops->recvfrom(sock, (void *) &reply, sizeof(reply), 1, MSG_PEEK, NULL, &addrlen); if (result < 0) @@ -366,16 +354,16 @@ do_ncp_rpc_call(struct ncp_server *server, int size) if (result != -ERESTARTSYS) { printk("ncp_rpc_call: recv error = %d\n", - -result); + -result); } break; } - if ( (result == sizeof(reply)) + if ((result == sizeof(reply)) && (reply.type == NCP_POSITIVE_ACK)) { /* Throw away the packet */ DPRINTK("ncp_rpc_call: got positive acknowledge\n"); - sock->ops->recvfrom(sock, (void *)&reply, + sock->ops->recvfrom(sock, (void *) &reply, sizeof(reply), 1, 0, NULL, &addrlen); n = 0; @@ -383,20 +371,19 @@ do_ncp_rpc_call(struct ncp_server *server, int size) acknowledge_seen = 1; goto re_select; } - DDPRINTK("ncpfs: rep.typ: %04X, con: %d, tsk: %d," - "seq: %d\n", - reply.type, - (reply.conn_high << 8) + reply.conn_low, - reply.task, - reply.sequence); - - if ( (result >= sizeof(reply)) - && (reply.type == NCP_REPLY) - && ( (request.type == NCP_ALLOC_SLOT_REQUEST) - || ( (reply.sequence == request.sequence) - && (reply.conn_low == request.conn_low) -/* seem to get wrong task from NW311 && (reply.task == request.task)*/ + "seq: %d\n", + reply.type, + (reply.conn_high << 8) + reply.conn_low, + reply.task, + reply.sequence); + + if ((result >= sizeof(reply)) + && (reply.type == NCP_REPLY) + && ((request.type == NCP_ALLOC_SLOT_REQUEST) + || ((reply.sequence == request.sequence) + && (reply.conn_low == request.conn_low) +/* seem to get wrong task from NW311 && (reply.task == request.task) */ && (reply.conn_high == request.conn_high)))) { if (major_timeout_seen) @@ -407,7 +394,7 @@ do_ncp_rpc_call(struct ncp_server *server, int size) * we have xid mismatch, so discard the packet and start * again. What a hack! but I can't call recvfrom with * a null buffer yet. */ - sock->ops->recvfrom(sock, (void *)&reply, sizeof(reply), 1, 0, + sock->ops->recvfrom(sock, (void *) &reply, sizeof(reply), 1, 0, NULL, &addrlen); DPRINTK("ncp_rpc_call: reply mismatch\n"); @@ -417,20 +404,18 @@ do_ncp_rpc_call(struct ncp_server *server, int size) * we have the correct reply, so read into the correct place and * return it */ - result = sock->ops->recvfrom(sock, (void *)start, server->packet_size, + result = sock->ops->recvfrom(sock, (void *) start, server->packet_size, 1, 0, NULL, &addrlen); if (result < 0) { printk("NCP: notice message: result=%d\n", result); - } - else if (result < sizeof(struct ncp_reply_header)) + } else if (result < sizeof(struct ncp_reply_header)) { printk("NCP: just caught a too small read memory size..., " "email to NET channel\n"); printk("NCP: result=%d,addrlen=%d\n", result, addrlen); result = -EIO; } - current->blocked = old_mask; set_fs(fs); return result; @@ -449,7 +434,6 @@ ncp_do_request(struct ncp_server *server, int size) printk("ncpfs: Server not locked!\n"); return -EIO; } - return do_ncp_rpc_call(server, size); } @@ -460,38 +444,36 @@ int ncp_request(struct ncp_server *server, int function) { struct ncp_request_header *h - = (struct ncp_request_header *)(server->packet); + = (struct ncp_request_header *) (server->packet); struct ncp_reply_header *reply - = (struct ncp_reply_header *)(server->packet); + = (struct ncp_reply_header *) (server->packet); int request_size = server->current_size - - sizeof(struct ncp_request_header); + - sizeof(struct ncp_request_header); int result; if (server->has_subfunction != 0) { - *(__u16 *)&(h->data[0]) = request_size - 2; + *(__u16 *) & (h->data[0]) = request_size - 2; } - h->type = NCP_REQUEST; - + server->sequence += 1; - h->sequence = server->sequence; - h->conn_low = (server->connection) & 0xff; + h->sequence = server->sequence; + h->conn_low = (server->connection) & 0xff; h->conn_high = ((server->connection) & 0xff00) >> 8; - h->task = (current->pid) & 0xff; - h->function = function; + h->task = (current->pid) & 0xff; + h->function = function; if ((result = ncp_do_request(server, request_size + sizeof(*h))) < 0) { DPRINTK("ncp_request_error: %d\n", result); return result; } - - server->completion = reply->completion_code; + server->completion = reply->completion_code; server->conn_status = reply->connection_state; - server->reply_size = result; + server->reply_size = result; server->ncp_reply_size = result - sizeof(struct ncp_reply_header); result = reply->completion_code; @@ -500,49 +482,48 @@ ncp_request(struct ncp_server *server, int function) { DPRINTK("ncp_completion_code: %x\n", result); } - return result; + return result; } int ncp_connect(struct ncp_server *server) { struct ncp_request_header *h - = (struct ncp_request_header *)(server->packet); + = (struct ncp_request_header *) (server->packet); int result; h->type = NCP_ALLOC_SLOT_REQUEST; - + server->sequence = 0; - h->sequence = server->sequence; - h->conn_low = 0xff; + h->sequence = server->sequence; + h->conn_low = 0xff; h->conn_high = 0xff; - h->task = (current->pid) & 0xff; - h->function = 0; + h->task = (current->pid) & 0xff; + h->function = 0; if ((result = ncp_do_request(server, sizeof(*h))) < 0) { return result; } - server->sequence = 0; server->connection = h->conn_low + (h->conn_high * 256); return 0; } - + int ncp_disconnect(struct ncp_server *server) { struct ncp_request_header *h - = (struct ncp_request_header *)(server->packet); + = (struct ncp_request_header *) (server->packet); h->type = NCP_DEALLOC_SLOT_REQUEST; - + server->sequence += 1; - h->sequence = server->sequence; - h->conn_low = (server->connection) & 0xff; + h->sequence = server->sequence; + h->conn_low = (server->connection) & 0xff; h->conn_high = ((server->connection) & 0xff00) >> 8; - h->task = (current->pid) & 0xff; - h->function = 0; + h->task = (current->pid) & 0xff; + h->function = 0; return ncp_do_request(server, sizeof(*h)); } @@ -557,7 +538,7 @@ ncp_lock_server(struct ncp_server *server) DPRINTK("ncpfs: server locked!!!\n"); } #endif - while (server->lock) + while (server->lock) sleep_on(&server->wait); server->lock = 1; } @@ -565,12 +546,10 @@ ncp_lock_server(struct ncp_server *server) void ncp_unlock_server(struct ncp_server *server) { - if (server->lock != 1) + if (server->lock != 1) { - printk("ncp_unlock_server: was not locked!\n"); - } - - server->lock = 0; - wake_up(&server->wait); + printk("ncp_unlock_server: was not locked!\n"); + } + server->lock = 0; + wake_up(&server->wait); } - diff --git a/lib/com_err/com_err.c b/lib/com_err/com_err.c index 8ee332a..e1a0158 100644 --- a/lib/com_err/com_err.c +++ b/lib/com_err/com_err.c @@ -17,31 +17,34 @@ 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) - const char *whoami; - errcode_t code; - const char *fmt; - va_list args; +default_com_err_proc(whoami, code, fmt, args) +const char *whoami; +errcode_t code; +const char *fmt; +va_list args; #endif { - if (whoami) { - fputs(whoami, stderr); - fputs(": ", stderr); - } - if (code) { - fputs(error_message(code), stderr); - fputs(" ", stderr); - } - if (fmt) { - vfprintf (stderr, fmt, args); - } - /* should do this only on a tty in raw mode */ - putc('\r', stderr); - putc('\n', stderr); - fflush(stderr); + if (whoami) + { + fputs(whoami, stderr); + fputs(": ", stderr); + } + if (code) + { + fputs(error_message(code), stderr); + fputs(" ", stderr); + } + if (fmt) + { + vfprintf(stderr, fmt, args); + } + /* should do this only on a tty in raw mode */ + putc('\r', stderr); + putc('\n', stderr); + fflush(stderr); } #ifdef __STDC__ @@ -53,62 +56,69 @@ 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) - const char *whoami; - errcode_t code; - const char *fmt; - va_list args; +void +com_err_va(whoami, code, fmt, args) +const char *whoami; +errcode_t code; +const char *fmt; +va_list args; #endif { - (*com_err_hook) (whoami, code, fmt, args); + (*com_err_hook) (whoami, code, fmt, 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) - va_dcl +void +com_err(va_alist) +va_dcl { - const char *whoami, *fmt; - errcode_t code; + const char *whoami, *fmt; + errcode_t code; #endif - va_list pvar; + va_list pvar; - if (!com_err_hook) - com_err_hook = default_com_err_proc; + if (!com_err_hook) + com_err_hook = default_com_err_proc; #ifdef VARARGS - va_start (pvar); - whoami = va_arg (pvar, const char *); - code = va_arg (pvar, errcode_t); - fmt = va_arg (pvar, const char *); + va_start(pvar); + whoami = va_arg(pvar, const char *); + code = va_arg(pvar, errcode_t); + fmt = va_arg(pvar, const char *); #else - va_start(pvar, fmt); + va_start(pvar, fmt); #endif - com_err_va (whoami, code, fmt, pvar); - va_end(pvar); + com_err_va(whoami, code, fmt, pvar); + va_end(pvar); } -errf set_com_err_hook (new_proc) - errf new_proc; +errf +set_com_err_hook(new_proc) +errf new_proc; { - errf x = com_err_hook; + errf x = com_err_hook; - if (new_proc) - com_err_hook = new_proc; - else + if (new_proc) + com_err_hook = new_proc; + else + com_err_hook = default_com_err_proc; + + return x; +} + +errf +reset_com_err_hook() +{ + errf x = com_err_hook; com_err_hook = default_com_err_proc; - - return x; -} - -errf reset_com_err_hook () { - errf x = com_err_hook; - com_err_hook = default_com_err_proc; - return x; + return x; } diff --git a/lib/com_err/com_err.h b/lib/com_err/com_err.h index f28dce8..8e8ad11 100644 --- a/lib/com_err/com_err.h +++ b/lib/com_err/com_err.h @@ -16,25 +16,25 @@ typedef long errcode_t; #include /* ANSI C -- use prototypes etc */ -void com_err (const char *, long, const char *, ...); -void com_err_va (const char *whoami, errcode_t code, const char *fmt, - va_list args); -char const *error_message (long); +void com_err(const char *, long, const char *,...); +void com_err_va(const char *whoami, errcode_t code, const char *fmt, + va_list args); +char const *error_message(long); extern void (*com_err_hook) (const char *, long, const char *, va_list); -void (*set_com_err_hook (void (*) (const char *, long, const char *, va_list))) - (const char *, long, const char *, va_list); -void (*reset_com_err_hook (void)) (const char *, long, const char *, va_list); -int init_error_table(const char * const *msgs, int base, int count); +void (*set_com_err_hook(void (*)(const char *, long, const char *, va_list))) + (const char *, long, const char *, va_list); +void (*reset_com_err_hook(void)) (const char *, long, const char *, va_list); +int init_error_table(const char *const *msgs, int base, int count); #else /* no prototypes */ -void com_err (); -void com_err_va (); -char *error_message (); +void com_err(); +void com_err_va(); +char *error_message(); extern void (*com_err_hook) (); -void (*set_com_err_hook ()) (); -void (*reset_com_err_hook ()) (); +void (*set_com_err_hook()) (); +void (*reset_com_err_hook()) (); int init_error_table(); #endif #define __COM_ERR_H -#endif /* ! defined(__COM_ERR_H) */ +#endif /* ! defined(__COM_ERR_H) */ diff --git a/lib/com_err/error_message.c b/lib/com_err/error_message.c index e1c1c3a..ee2f049 100644 --- a/lib/com_err/error_message.c +++ b/lib/com_err/error_message.c @@ -19,64 +19,72 @@ static char buffer[25]; -struct et_list * _et_list = (struct et_list *) NULL; +struct et_list *_et_list = (struct et_list *) NULL; #ifdef __STDC__ -const char * error_message (errcode_t code) +const char * +error_message(errcode_t code) #else -const char * error_message (code) - errcode_t code; +const char * +error_message(code) +errcode_t code; #endif { - int offset; - struct et_list *et; - int table_num; - int started = 0; - char *cp; + int offset; + struct et_list *et; + int table_num; + int started = 0; + char *cp; - offset = code & ((1<next) { - if (et->table->base == table_num) { - /* This is the right table */ - if (et->table->n_msgs <= offset) - goto oops; - return(et->table->msgs[offset]); } - } -oops: - strcpy (buffer, "Unknown code "); - if (table_num) { - strcat (buffer, error_table_name (table_num)); - strcat (buffer, " "); - } - for (cp = buffer; *cp; cp++) - ; - if (offset >= 100) { - *cp++ = '0' + offset / 100; - offset %= 100; - started++; - } - if (started || offset >= 10) { - *cp++ = '0' + offset / 10; - offset %= 10; - } - *cp++ = '0' + offset; - *cp = '\0'; - return(buffer); + 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; + return (et->table->msgs[offset]); + } + } + oops: + strcpy(buffer, "Unknown code "); + if (table_num) + { + strcat(buffer, error_table_name(table_num)); + strcat(buffer, " "); + } + for (cp = buffer; *cp; cp++) + ; + if (offset >= 100) + { + *cp++ = '0' + offset / 100; + offset %= 100; + started++; + } + if (started || offset >= 10) + { + *cp++ = '0' + offset / 10; + offset %= 10; + } + *cp++ = '0' + offset; + *cp = '\0'; + return (buffer); } diff --git a/lib/com_err/error_table.h b/lib/com_err/error_table.h index 31971f0..ab498fa 100644 --- a/lib/com_err/error_table.h +++ b/lib/com_err/error_table.h @@ -11,16 +11,18 @@ #define const #endif -struct error_table { - char const * const * msgs; - long base; - int n_msgs; +struct error_table +{ + char const *const *msgs; + long base; + int n_msgs; }; -struct et_list { - struct et_list *next; - const struct error_table *table; +struct et_list +{ + struct et_list *next; + const struct error_table *table; }; -extern struct et_list * _et_list; +extern struct et_list *_et_list; #define ERRCODE_RANGE 8 /* # of bits to shift table number */ #define BITS_PER_CHAR 6 /* # bits to shift per character in name */ diff --git a/lib/com_err/et_name.c b/lib/com_err/et_name.c index db4099f..75617d7 100644 --- a/lib/com_err/et_name.c +++ b/lib/com_err/et_name.c @@ -9,28 +9,30 @@ #include "internal.h" static const char char_set[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"; +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"; static char buf[6]; -const char * error_table_name(num) - int num; +const char * +error_table_name(num) +int num; { - int ch; - int i; - char *p; + int ch; + int i; + char *p; - /* num = aa aaa abb bbb bcc ccc cdd ddd d?? ??? ??? */ - p = buf; - num >>= ERRCODE_RANGE; - /* 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--) { - ch = (num >> BITS_PER_CHAR * i) & ((1 << BITS_PER_CHAR) - 1); - if (ch != 0) - *p++ = char_set[ch-1]; - } - *p = '\0'; - return(buf); + /* num = aa aaa abb bbb bcc ccc cdd ddd d?? ??? ??? */ + p = buf; + num >>= ERRCODE_RANGE; + /* 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--) + { + ch = (num >> BITS_PER_CHAR * i) & ((1 << BITS_PER_CHAR) - 1); + if (ch != 0) + *p++ = char_set[ch - 1]; + } + *p = '\0'; + return (buf); } diff --git a/lib/com_err/init_et.c b/lib/com_err/init_et.c index 4b3b673..8978434 100644 --- a/lib/com_err/init_et.c +++ b/lib/com_err/init_et.c @@ -4,7 +4,7 @@ * $Locker: $ * * Copyright 1986, 1987, 1988 by MIT Information Systems and - * the MIT Student Information Processing Board. + * the MIT Student Information Processing Board. * * For copyright info, see mit-sipb-copyright.h. */ @@ -23,36 +23,39 @@ #define const #endif -struct foobar { - struct et_list etl; - struct error_table et; +struct foobar +{ + struct et_list etl; + struct error_table et; }; -extern struct et_list * _et_list; +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) - const char * const * msgs; - int base; - int count; +int +init_error_table(msgs, base, count) +const char *const *msgs; +int base; +int count; #endif { - struct foobar * new_et; + struct foobar *new_et; - if (!base || !count || !msgs) + if (!base || !count || !msgs) + return 0; + + new_et = (struct foobar *) malloc(sizeof(struct foobar)); + if (!new_et) + return ENOMEM; /* oops */ + new_et->etl.table = &new_et->et; + new_et->et.msgs = msgs; + new_et->et.base = base; + new_et->et.n_msgs = count; + + new_et->etl.next = _et_list; + _et_list = &new_et->etl; return 0; - - new_et = (struct foobar *) malloc(sizeof(struct foobar)); - if (!new_et) - return ENOMEM; /* oops */ - new_et->etl.table = &new_et->et; - new_et->et.msgs = msgs; - new_et->et.base = base; - new_et->et.n_msgs= count; - - new_et->etl.next = _et_list; - _et_list = &new_et->etl; - return 0; } diff --git a/lib/com_err/internal.h b/lib/com_err/internal.h index 112c016..e185623 100644 --- a/lib/com_err/internal.h +++ b/lib/com_err/internal.h @@ -10,13 +10,13 @@ #include #ifdef NEED_SYS_ERRLIST -extern char const * const sys_errlist[]; +extern char const *const sys_errlist[]; extern const int sys_nerr; #endif /* AIX and Ultrix have standard conforming header files. */ #if !defined(ultrix) && !defined(_AIX) #ifdef __STDC__ -void perror (const char *); +void perror(const char *); #endif #endif diff --git a/lib/com_err/mit-sipb-copyright.h b/lib/com_err/mit-sipb-copyright.h index 2f7eb29..6438203 100644 --- a/lib/com_err/mit-sipb-copyright.h +++ b/lib/com_err/mit-sipb-copyright.h @@ -1,19 +1,18 @@ /* -Copyright 1987, 1988 by the Student Information Processing Board - of the Massachusetts Institute of Technology + Copyright 1987, 1988 by the Student Information Processing Board + of the Massachusetts Institute of Technology -Permission to use, copy, modify, and distribute this software -and its documentation for any purpose and without fee is -hereby granted, provided that the above copyright notice -appear in all copies and that both that copyright notice and -this permission notice appear in supporting documentation, -and that the names of M.I.T. and the M.I.T. S.I.P.B. not be -used in advertising or publicity pertaining to distribution -of the software without specific, written prior permission. -M.I.T. and the M.I.T. S.I.P.B. make no representations about -the suitability of this software for any purpose. It is -provided "as is" without express or implied warranty. - -*/ + Permission to use, copy, modify, and distribute this software + and its documentation for any purpose and without fee is + hereby granted, provided that the above copyright notice + appear in all copies and that both that copyright notice and + this permission notice appear in supporting documentation, + and that the names of M.I.T. and the M.I.T. S.I.P.B. not be + used in advertising or publicity pertaining to distribution + of the software without specific, written prior permission. + M.I.T. and the M.I.T. S.I.P.B. make no representations about + the suitability of this software for any purpose. It is + provided "as is" without express or implied warranty. + */ diff --git a/lib/ncplib.c b/lib/ncplib.c index 5ccad92..d14d877 100644 --- a/lib/ncplib.c +++ b/lib/ncplib.c @@ -2575,6 +2575,31 @@ ncp_delete_trustee(struct ncp_conn *conn, return result; } +long +ncp_get_trustee(struct ncp_conn *conn, __u32 object_id, + __u8 vol, char *path, + __u16 * trustee, __u16 * contin) +{ + long result; + + ncp_init_request_s(conn, 71); + ncp_add_byte(conn, vol); + ncp_add_word_hl(conn, *contin); + ncp_add_dword_hl(conn, object_id); + + if ((result = ncp_request(conn, 23)) != 0) + { + ncp_unlock_conn(conn); + return result; + } + *contin = ncp_reply_word_hl(conn, 0); + *trustee = ncp_reply_byte(conn, 6); + strncpy(path, ncp_reply_data(conn, 8), ncp_reply_byte(conn, 7)); + path[ncp_reply_byte(conn, 7)] = 0; + ncp_unlock_conn(conn); + return 0; +} + long ncp_rename_directory(struct ncp_conn *conn, int dir_handle, diff --git a/man/nprint.1 b/man/nprint.1 index c583cf8..fcb4264 100644 --- a/man/nprint.1 +++ b/man/nprint.1 @@ -14,7 +14,7 @@ nprint \- NetWare print client ] [ .B -P .I password - | +| .B -n ] [ .B -C diff --git a/man/nwbocreate.8 b/man/nwbocreate.8 index 7188d98..ee6b544 100644 --- a/man/nwbocreate.8 +++ b/man/nwbocreate.8 @@ -14,7 +14,7 @@ nwbocreate \- Create a NetWare Bindery Object ] [ .B -P .I password - | +| .B -n ] [ .B -C diff --git a/man/nwbols.1 b/man/nwbols.1 index 53d6c66..e60fa97 100644 --- a/man/nwbols.1 +++ b/man/nwbols.1 @@ -14,7 +14,7 @@ nwbols \- List NetWare Bindery Objects ] [ .B -P .I password - | +| .B -n ] [ .B -C diff --git a/man/nwboprops.1 b/man/nwboprops.1 index df4cc21..2d74d6c 100644 --- a/man/nwboprops.1 +++ b/man/nwboprops.1 @@ -14,7 +14,7 @@ nwboprops \- List properies of a NetWare Bindery Object ] [ .B -P .I password - | +| .B -n ] [ .B -C diff --git a/man/nwborm.8 b/man/nwborm.8 index f096efc..f955c58 100644 --- a/man/nwborm.8 +++ b/man/nwborm.8 @@ -14,7 +14,7 @@ nwborm \- Remove a NetWare Bindery Object ] [ .B -P .I password - | +| .B -n ] [ .B -C diff --git a/man/nwbpadd.8 b/man/nwbpadd.8 index f4a21c8..62687cb 100644 --- a/man/nwbpadd.8 +++ b/man/nwbpadd.8 @@ -14,7 +14,7 @@ nwbpadd \- Set the value of a NetWare Bindery Property ] [ .B -P .I password - | +| .B -n ] [ .B -C diff --git a/man/nwbpset.1 b/man/nwbpset.1 index 257abc3..f6147b2 100644 --- a/man/nwbpset.1 +++ b/man/nwbpset.1 @@ -14,7 +14,7 @@ nwbpset \- Create a bindery property or set its value ] [ .B -P .I password - | +| .B -n ] [ .B -C diff --git a/man/nwfstime.1 b/man/nwfstime.1 index c8d8f94..cfc33eb 100644 --- a/man/nwfstime.1 +++ b/man/nwfstime.1 @@ -14,7 +14,7 @@ nwfstime \- Display / Set a NetWare server's date and time ] [ .B -P .I password - | +| .B -n ] [ .B -C diff --git a/man/nwgrant.8 b/man/nwgrant.8 index f4dff43..6a90ae5 100644 --- a/man/nwgrant.8 +++ b/man/nwgrant.8 @@ -14,7 +14,7 @@ nwgrant \- Add Trustee Rights to a directory ] [ .B -P .I password - | +| .B -n ] [ .B -C diff --git a/man/nwrevoke.8 b/man/nwrevoke.8 index 20d3523..afd81ae 100644 --- a/man/nwrevoke.8 +++ b/man/nwrevoke.8 @@ -14,7 +14,7 @@ nwrevoke \- Revoke a Trustee Right from a directory ] [ .B -P .I password - | +| .B -n ] [ .B -C diff --git a/man/nwtrustee.1 b/man/nwtrustee.1 new file mode 100644 index 0000000..f4ffdf0 --- /dev/null +++ b/man/nwtrustee.1 @@ -0,0 +1,127 @@ +.TH NWTRUSTEE 8 7/9/1996 nwtrustee nwtrustee +.SH NAME +nwtrustee \- List an object's trustee directory assignments +.SH SYNOPSIS +.B nwtrustee +[ +.B -h +] [ +.B -S +.I server +] [ +.B -U +.I user name +] [ +.B -P +.I password +| +.B -n +] [ +.B -C +] [ +.B -l +.I volume number +] [ +.B -L +.I volume name +] [ +.B -o +.I object id +] [ +.B -O +.I object name +] [ +.B -t +.I object type +] [ +.B -v +] + +.SH DESCRIPTION +.B nwtrustee +lists the trustee directory assignments a user has on a specific volume. + +.B nwtrustee +looks up the file +.I $HOME/.nwclient +to find a file server, a user name and possibly a password. See +nwclient(5) for more information. Please note that the access +permissions of $HOME/.nwclient MUST be 600 for security reasons. + +.SH OPTIONS + +.B -h +.RS 3 +.B -h +is used to print out a short help text. +.RE + +.B -S +.I server +.RS 3 +.B server +is the name of the server you want to use. +.RE + +.B -U +.I user +.RS 3 +.B user +is the user name to use for login. +.RE + +.B -P +.I password +.RS 3 +.B password +is the password to use for login. If neither +.B -n +nor +.B -P +are given, and the user has no open connection to the server, nwtrustee +prompts for a password. +.RE + +.B -n +.RS 3 +.B -n +should be given if no password is required for the login. +.RE + +.B -C +.RS 3 +By default, passwords are converted to uppercase before they are sent +to the server, because most servers require this. You can turn off +this conversion by +.B -C. +.RE + +.B -o +.I object id +.RS 3 +The bindery object id of the user whose assignments should be listed. +Alternatively, use -O object name. +.RE + +.B -O +.I object name +.RS 3 +The name of the user whose assignments should be listed. +.RE + +.B -t +.I object type +.RS 3 +The type of object whose assignments should be listed. This defaults to 1, +which means user. Another sensible value is 2, which means group. +.RE + +.B -v +.RS 3 +Verbose listing. Also list the specific rights that are assigned to the +user. +.RE + +.SH AUTHORS +nwtrustee was written by Jacek Stepniewski . +This manual page was written by Volker Lendecke. diff --git a/man/nwuserlist.1 b/man/nwuserlist.1 index 0991e6e..0f425be 100644 --- a/man/nwuserlist.1 +++ b/man/nwuserlist.1 @@ -14,7 +14,7 @@ nwuserlist \- List Users logged in at a NetWare server ] [ .B -P .I password - | +| .B -n ] [ .B -C diff --git a/man/pserver.1 b/man/pserver.1 index 0cb3dd2..b8358a0 100644 --- a/man/pserver.1 +++ b/man/pserver.1 @@ -14,7 +14,7 @@ pserver \- NetWare print server ] [ .B -P .I password - | +| .B -n ] [ .B -C diff --git a/ncpfs-2.0.9.lsm b/ncpfs-2.0.10.lsm similarity index 83% rename from ncpfs-2.0.9.lsm rename to ncpfs-2.0.10.lsm index 29cb724..eb8ead1 100644 --- a/ncpfs-2.0.9.lsm +++ b/ncpfs-2.0.10.lsm @@ -1,7 +1,7 @@ Begin3 Title: ncpfs -Version: 2.0.9 -Entered-date: 16. February 1997 +Version: 2.0.10 +Entered-date: 23. February 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 @@ -13,7 +13,7 @@ Author: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke) Maintained-by: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke) Primary-site: ftp.gwdg.de:/pub/linux/misc/ncpfs Alternate-site: sunsite.unc.edu:/pub/Linux/system/Filesystems/ncpfs - ~156k ncpfs-2.0.9.tgz - ~ 1k ncpfs-2.0.9.lsm + ~158k ncpfs-2.0.10.tgz + ~ 1k ncpfs-2.0.10.lsm Copying-policy: GPL End diff --git a/sutil/ipxlib.h b/sutil/ipxlib.h index ac243b0..bf16bf4 100644 --- a/sutil/ipxlib.h +++ b/sutil/ipxlib.h @@ -15,9 +15,9 @@ #include #include -typedef unsigned long IPXNet; +typedef unsigned long IPXNet; typedef unsigned short IPXPort; -typedef unsigned char IPXNode[IPX_NODE_LEN]; +typedef unsigned char IPXNode[IPX_NODE_LEN]; #define IPX_USER_PTYPE (0x00) #define IPX_RIP_PTYPE (0x01) @@ -33,30 +33,35 @@ typedef unsigned char IPXNode[IPX_NODE_LEN]; #define IPX_SAP_FILE_SERVER (0x0004) -struct sap_query { - unsigned short query_type; /* net order */ - unsigned short server_type; /* net order */ +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)); +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)); +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") @@ -68,26 +73,26 @@ struct ipx_rip_packet { #endif void -ipx_print_node(IPXNode node); + ipx_print_node(IPXNode node); void -ipx_print_network(IPXNet net); + ipx_print_network(IPXNet net); void -ipx_print_port(IPXPort port); + ipx_print_port(IPXPort port); void -ipx_print_saddr(struct sockaddr_ipx* sipx); + ipx_print_saddr(struct sockaddr_ipx *sipx); void -ipx_fprint_node(FILE *file, IPXNode node); + ipx_fprint_node(FILE * file, IPXNode node); void -ipx_fprint_network(FILE *file, IPXNet net); + ipx_fprint_network(FILE * file, IPXNet net); void -ipx_fprint_port(FILE *file, IPXPort port); + ipx_fprint_port(FILE * file, IPXPort port); void -ipx_fprint_saddr(FILE *file, struct sockaddr_ipx* sipx); + ipx_fprint_saddr(FILE * file, struct sockaddr_ipx *sipx); int -ipx_sscanf_node(char *buf, unsigned char node[IPX_NODE_LEN]); + ipx_sscanf_node(char *buf, unsigned char node[IPX_NODE_LEN]); void -ipx_assign_node(IPXNode dest, IPXNode src); + ipx_assign_node(IPXNode dest, IPXNode src); int -ipx_node_equal(IPXNode n1,IPXNode n2); + ipx_node_equal(IPXNode n1, IPXNode n2); -#endif /* _IPXLIB_H */ +#endif /* _IPXLIB_H */ diff --git a/sutil/ncplib.c b/sutil/ncplib.c index a1e8ba3..6421b22 100644 --- a/sutil/ncplib.c +++ b/sutil/ncplib.c @@ -9,7 +9,7 @@ #include "ncplib_err.h" #include - /* #include *//* generates a warning here */ + /* #include *//* generates a warning here */ extern pid_t wait(int *); #include #include diff --git a/sutil/ncplib.h b/sutil/ncplib.h index 095eed7..a5f893b 100644 --- a/sutil/ncplib.h +++ b/sutil/ncplib.h @@ -33,26 +33,26 @@ 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); + 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); + return WVAL_HL(buf, pos) << 16 | WVAL_HL(buf, pos + 2); } static inline void -WSET_HL(__u8 *buf, int pos, word val) +WSET_HL(__u8 * buf, int pos, word val) { - BSET(buf,pos,val>>8); - BSET(buf,pos+1, val & 0xff); + BSET(buf, pos, val >> 8); + BSET(buf, pos + 1, val & 0xff); } static inline void -DSET_HL(__u8 *buf, int pos, dword val) +DSET_HL(__u8 * buf, int pos, dword val) { - WSET_HL(buf, pos, val >>16); - WSET_HL(buf, pos+2, val & 0xffff); + WSET_HL(buf, pos, val >> 16); + WSET_HL(buf, pos + 2, val & 0xffff); } @@ -61,68 +61,70 @@ 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)); + return *((word *) (buf + pos)); } static inline dword -DVAL_LH(__u8 *buf, int pos) +DVAL_LH(__u8 * buf, int pos) { - return *((dword *)(buf+pos)); + return *((dword *) (buf + pos)); } static inline void -WSET_LH(__u8 *buf, int pos, word val) +WSET_LH(__u8 * buf, int pos, word val) { - *((word *)(buf+pos)) = val; + *((word *) (buf + pos)) = val; } static inline void -DSET_LH(__u8 *buf, int pos, dword val) +DSET_LH(__u8 * buf, int pos, dword val) { - *((dword *)(buf+pos)) = val; + *((dword *) (buf + pos)) = 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; + 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; + return WVAL_LH(buf, pos) | WVAL_LH(buf, pos + 2) << 16; } static inline void -WSET_LH(__u8 *buf, int pos, word val) +WSET_LH(__u8 * buf, int pos, word val) { - BSET(buf,pos,val & 0xff); - BSET(buf,pos+1, val >> 8); + BSET(buf, pos, val & 0xff); + BSET(buf, pos + 1, val >> 8); } static inline void -DSET_LH(__u8 *buf, int pos, dword val) +DSET_LH(__u8 * buf, int pos, dword val) { WSET_LH(buf, pos, val & 0xffff); - WSET_LH(buf, pos+2, val >> 16); + WSET_LH(buf, pos + 2, val >> 16); } #endif void -str_upper(char *name); + 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; char server[NCP_BINDERY_NAME_LEN]; - char user [NCP_BINDERY_NAME_LEN]; + char user[NCP_BINDERY_NAME_LEN]; struct ncp_fs_info i; @@ -150,7 +152,8 @@ struct ncp_conn { char packet[NCP_PACKET_SIZE]; }; -struct ncp_conn_spec { +struct ncp_conn_spec +{ char server[NCP_BINDERY_NAME_LEN]; char user[NCP_BINDERY_NAME_LEN]; uid_t uid; @@ -158,7 +161,8 @@ 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; @@ -173,46 +177,47 @@ struct ncp_property_info { from the list. It was designed after the X Windows init functions. */ struct ncp_conn * -ncp_initialize(int *argc, char **argv, - int login_necessary, long *err); + ncp_initialize(int *argc, char **argv, + int login_necessary, long *err); /* You can login as another object by this procedure. As a first use pserver comes to mind. */ struct ncp_conn * -ncp_initialize_as(int *argc, char **argv, - int login_necessary, int login_type, long *err); + ncp_initialize_as(int *argc, char **argv, + int login_necessary, int login_type, long *err); /* Open a connection */ struct ncp_conn * -ncp_open(struct ncp_conn_spec *spec, long *err); + ncp_open(struct ncp_conn_spec *spec, long *err); /* Open a connection on an existing mount point */ struct ncp_conn * -ncp_open_mount(const char *mount_point, long *err); + ncp_open_mount(const char *mount_point, long *err); /* Find a permanent connection that fits the spec, return NULL if * there is none. */ char * -ncp_find_permanent(const struct ncp_conn_spec *spec); + ncp_find_permanent(const struct ncp_conn_spec *spec); /* Find the address of a file server */ struct sockaddr_ipx * -ncp_find_fileserver(char *server_name, long *err); + ncp_find_fileserver(char *server_name, long *err); /* Find the address of a server */ struct sockaddr_ipx * -ncp_find_server(char **server_name, int type, long *err); + ncp_find_server(char **server_name, int type, long *err); /* Detach from a permanent connection or destroy a temporary connection */ long -ncp_close(struct ncp_conn *conn); + ncp_close(struct ncp_conn *conn); /* 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; @@ -220,7 +225,7 @@ struct ncp_conn_ent { }; struct ncp_conn_ent * -ncp_get_conn_ent(FILE *filep); + ncp_get_conn_ent(FILE * filep); #define NWCLIENT (".nwclient") #define NWC_NOPASSWORD ("-") @@ -228,55 +233,57 @@ ncp_get_conn_ent(FILE *filep); /* find an appropriate connection */ 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); + ncp_find_conn_spec(const char *server, const char *user, const char *password, + int login_necessary, uid_t uid, long *err); long -ncp_get_encryption_key(struct ncp_conn *conn, - char *target); + ncp_get_encryption_key(struct ncp_conn *conn, + char *target); -struct ncp_station_addr { - __u32 NetWork __attribute__ ((packed)); - __u8 Node[6] __attribute__ ((packed)); - __u16 Socket __attribute__ ((packed)); +struct ncp_station_addr +{ + __u32 NetWork __attribute__((packed)); + __u8 Node[6] __attribute__((packed)); + __u16 Socket __attribute__((packed)); }; -struct ncp_prop_login_control { - __u8 AccountExpireDate[3] __attribute__ ((packed)); - __u8 Disabled __attribute__ ((packed)); - __u8 PasswordExpireDate[3] __attribute__ ((packed)); - __u8 GraceLogins __attribute__ ((packed)); - __u16 PasswordExpireInterval __attribute__ ((packed)); - __u8 MaxGraceLogins __attribute__ ((packed)); - __u8 MinPasswordLength __attribute__ ((packed)); - __u16 MaxConnections __attribute__ ((packed)); - __u8 ConnectionTimeMask[42] __attribute__ ((packed)); - __u8 LastLogin[6] __attribute__ ((packed)); - __u8 RestrictionMask __attribute__ ((packed)); - __u8 reserved __attribute__ ((packed)); - __u32 MaxDiskUsage __attribute__ ((packed)); - __u16 BadLoginCount __attribute__ ((packed)); - __u32 BadLoginCountDown __attribute__ ((packed)); - struct ncp_station_addr LastIntruder __attribute__ ((packed)); -}; +struct ncp_prop_login_control +{ + __u8 AccountExpireDate[3] __attribute__((packed)); + __u8 Disabled __attribute__((packed)); + __u8 PasswordExpireDate[3] __attribute__((packed)); + __u8 GraceLogins __attribute__((packed)); + __u16 PasswordExpireInterval __attribute__((packed)); + __u8 MaxGraceLogins __attribute__((packed)); + __u8 MinPasswordLength __attribute__((packed)); + __u16 MaxConnections __attribute__((packed)); + __u8 ConnectionTimeMask[42] __attribute__((packed)); + __u8 LastLogin[6] __attribute__((packed)); + __u8 RestrictionMask __attribute__((packed)); + __u8 reserved __attribute__((packed)); + __u32 MaxDiskUsage __attribute__((packed)); + __u16 BadLoginCount __attribute__((packed)); + __u32 BadLoginCountDown __attribute__((packed)); + struct ncp_station_addr LastIntruder __attribute__((packed)); +}; long -ncp_read_property_value(struct ncp_conn *conn, - int object_type, const char *object_name, - int segment, const char *prop_name, - struct nw_property *target); + ncp_read_property_value(struct ncp_conn *conn, + int object_type, const char *object_name, + int segment, const char *prop_name, + struct nw_property *target); #define NCP_GRACE_PERIOD (0xdf) long -ncp_get_bindery_object_id(struct ncp_conn *conn, - __u16 object_type, - const char *object_name, - struct ncp_bindery_object *target); + ncp_get_bindery_object_id(struct ncp_conn *conn, + __u16 object_type, + const char *object_name, + struct ncp_bindery_object *target); long -ncp_login_user(struct ncp_conn *conn, - const unsigned char *username, - const unsigned char *password); + ncp_login_user(struct ncp_conn *conn, + const unsigned char *username, + const unsigned char *password); -#endif /* _NCPLIB_H */ +#endif /* _NCPLIB_H */ diff --git a/sutil/ncpmount.c b/sutil/ncpmount.c index e61ad84..b00f383 100644 --- a/sutil/ncpmount.c +++ b/sutil/ncpmount.c @@ -26,7 +26,7 @@ #include #include #include - /* #include *//* generates a warning here */ + /* #include *//* generates a warning here */ extern pid_t waitpid(pid_t, int *, int); #include #include diff --git a/sutil/ncpumount.c b/sutil/ncpumount.c index 15a7e96..589eacc 100644 --- a/sutil/ncpumount.c +++ b/sutil/ncpumount.c @@ -16,7 +16,7 @@ #include #include #include - /* #include *//* generates a warning here */ + /* #include *//* generates a warning here */ extern pid_t waitpid(pid_t, int *, int); #include #include diff --git a/util/Makefile b/util/Makefile index c73f6b7..6fed304 100644 --- a/util/Makefile +++ b/util/Makefile @@ -6,7 +6,7 @@ USERUTILS = slist pqlist nwfsinfo pserver nprint nsend ncopy nwpasswd USERUTILS += nwbols nwbocreate nwborm nwboprops USERUTILS += nwbpcreate nwbprm nwbpvalues nwbpadd nwbpset USERUTILS += nwgrant nwrevoke nwuserlist nwrights nwauth -USERUTILS += nwfstime nwvolinfo +USERUTILS += nwfstime nwvolinfo nwtrustee SBINUTILS = nwmsg UTILS = $(USERUTILS) $(SBINUTILS) ncptest diff --git a/util/ncptest.c b/util/ncptest.c index 4160303..15147d6 100644 --- a/util/ncptest.c +++ b/util/ncptest.c @@ -19,7 +19,7 @@ #include #include #include - /* #include *//* generates a warning here */ + /* #include *//* generates a warning here */ extern pid_t waitpid(pid_t, int *, int); #include #include diff --git a/util/nwtrustee.c b/util/nwtrustee.c index 08ecab7..c253d43 100644 --- a/util/nwtrustee.c +++ b/util/nwtrustee.c @@ -1,7 +1,7 @@ /* * nwtrustee.c * - * List Trustees + * List Trustees Directory Assignments of an object * * Copyright (C) 1996 by Volker Lendecke * @@ -36,7 +36,7 @@ help(void) "-C Don't convert password to uppercase\n" "\n" "-l volumeid Volume id to be searched\n" - "-L volname Volume name insteed of id\n" + "-L volname Volume name instead of id\n" "-o objectid Object id\n" "-O objname Object name ( type must be specified )\n" "-t type Object type\n" @@ -44,7 +44,7 @@ help(void) "\n"); } -int +int fromhex(char c) { c -= '0'; @@ -152,8 +152,6 @@ main(int argc, char **argv) printf("%X\n", trust); } } - - ncp_close(conn); return 0; }