From 6cb56005ea24132f5d1b8917c444c09059c3225d Mon Sep 17 00:00:00 2001 From: ncpfs archive import Date: Tue, 28 Apr 2026 20:39:58 +0200 Subject: [PATCH] Import ncpfs 0.20 --- .downloads/ncpfs-0.20.tgz | Bin 0 -> 111917 bytes Changes | 16 +- Makefile | 2 +- ipxdump/ipxparse.c | 198 ++++--- man/Makefile | 2 +- man/ncopy.1 | 96 ++++ ncpfs-0.19.lsm => ncpfs-0.20.lsm | 10 +- util/Makefile | 2 +- util/ncopy.c | 849 +++++++++++++++++++++++++++++++ util/ncplib.c | 62 ++- util/ncplib.h | 23 + util/ncpmount.c | 40 +- 12 files changed, 1192 insertions(+), 108 deletions(-) create mode 100644 .downloads/ncpfs-0.20.tgz create mode 100644 man/ncopy.1 rename ncpfs-0.19.lsm => ncpfs-0.20.lsm (77%) create mode 100644 util/ncopy.c diff --git a/.downloads/ncpfs-0.20.tgz b/.downloads/ncpfs-0.20.tgz new file mode 100644 index 0000000000000000000000000000000000000000..03532ed930508374b33de07550361ca0bd9474af GIT binary patch literal 111917 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∈?#=}%HcBTTp<$xh;BL%v*F~x(Fdo0 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∈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 B(ANL} literal 0 HcmV?d00001 diff --git a/Changes b/Changes index 9af8080..ab46edc 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,19 @@ I only began this file with ncpfs-0.12. If you're interested in older -versions, you can find them on linux01.gwdg.de:/pub/ncpfs/old. +versions, you can find them on ftp.gwdg.de:/pub/linux/misc/ncpfs/old. + +ncpfs-0.19 -> ncpfs-0.20 +- Changed the home site for ncpfs from linux01.gwdg.de:/pub/ncpfs + to ftp.gwdg.de:/pub/linux/misc/ncpfs. linux01 will remain available, + but we would like to reduce the load on that machine. Sites + mirroring linux01 please redirect your mirror software to + ftp.gwdg.de. Thanks. +- Removed a bug in ncplib.c that made slist require a full + login. Thanks to ndt1001@chu.cam.ac.uk (Neil Turton) for the hint. +- The first real user contribution: ncopy by Brian G. Reid + (breid@tim.com) and Tom C. Henderson (thenderson@tim.com). Many + thanks to you! If you find bugs in ncopy, tell them, not me ;-) +- Handle expired passwords. Thanks to "Mathew Lim" + for the hint. ncpfs-0.18 -> ncpfs-0.19 diff --git a/Makefile b/Makefile index bfc215e..2200c63 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ # Makefile for the linux ncp-filesystem routines. # -VERSION = 0.19 +VERSION = 0.20 TOPDIR = $(shell pwd) BINDIR = /usr/local/bin diff --git a/ipxdump/ipxparse.c b/ipxdump/ipxparse.c index 837a2a2..7d3dd5c 100644 --- a/ipxdump/ipxparse.c +++ b/ipxdump/ipxparse.c @@ -275,6 +275,124 @@ void handle_ncp (struct sockaddr_ipx *source, switch(rq->function) { + case 20: + printf("fn: %-3d\n", rq->function); + printf("Get File Server Date and Time\n"); + break; + case 21: + printf("fn: %-3d, subfn: %-3d\n", + rq->function, data[2]); + switch(data[2]) + { + case 0: + printf("Send Broadcast Message\n"); + break; + case 1: + printf("Get Broadcast Message\n"); + break; + } + data += 3; + data_length -= 3; + break; + case 22: + printf("fn: %-3d, subfn: %-3d\n", + rq->function, data[2]); + switch(data[2]) + { + case 00: + printf("Set Directory Handle\n"); + break; + case 01: + printf("Get Directory Path\n"); + break; + case 18: + printf("Allocate Permanent Dir Handle\n"); + break; + case 20: + printf("Deallocate Directory Handle\n"); + break; + case 21: + printf("Get Volume Info with handle\n"); + break; + } + data += 3; + data_length -= 3; + break; + case 23: + printf("fn: %-3d, subfn: %-3d\n", rq->function, + data[2]); + switch(data[2]) + { + case 17: + printf("Get Fileserver Information\n"); + break; + case 23: + printf("Get Crypt Key\n"); + break; + case 24: + printf("Encrypted Login\n"); + break; + case 28: + printf("Get Connection Information\n"); + break; + case 53: + printf("Get Bindery Object ID\n"); + break; + case 55: + printf("Scan Bindery Object\n"); + break; + case 61: + printf("Read Property Value\n"); + break; + case 62: + printf("Write Property Value\n"); + break; + case 70: + printf("Get Bindery Access Level\n"); + break; + } + + data += 3; + data_length -= 3; + break; + case 24: + printf("fn: %-3d\n", rq->function); + printf("End of Job\n"); + break; + case 34: + printf("fn: %-3d, subfn: %-3d\n", rq->function, + data[2]); + data += 3; + data_length -= 3; + break; + case 62: + printf("fn: %-3d\n", rq->function); + printf("File Search Initialize\n"); + break; + case 63: + printf("fn: %-3d\n", rq->function); + printf("File Search Continue\n"); + break; + case 64: + printf("fn: %-3d\n", rq->function); + printf("Search for a file\n"); + break; + case 66: + printf("fn: %-3d\n", rq->function); + printf("Close File\n"); + break; + case 72: + printf("fn: %-3d\n", rq->function); + printf("Read from File\n"); + break; + case 73: + printf("fn: %-3d\n", rq->function); + printf("Write to File\n"); + break; + case 75: + printf("fn: %-3d\n", rq->function); + printf("Set File Time Date Stamp\n"); + break; case 87: printf("fn: %-3d, subfn: %-3d\n", rq->function, data[0]); @@ -311,86 +429,6 @@ void handle_ncp (struct sockaddr_ipx *source, data += 1; data_length -= 1; break; - case 21: - printf("fn: %-3d, subfn: %-3d\n", - rq->function, data[2]); - switch(data[2]) - { - case 0: - printf("Send Broadcast Message\n"); - break; - case 1: - printf("Get Broadcast Message\n"); - break; - } - data += 3; - data_length -= 3; - break; - case 22: - printf("fn: %-3d, subfn: %-3d\n", - rq->function, data[2]); - switch(data[2]) - { - case 21: - printf("Get Volume Info with handle\n"); - break; - } - data += 3; - data_length -= 3; - break; - case 23: - printf("fn: %-3d, subfn: %-3d\n", rq->function, - data[2]); - switch(data[2]) - { - case 17: - printf("Get Fileserver Information\n"); - break; - case 28: - printf("Get Connection Information\n"); - break; - case 55: - printf("Scan Bindery Object\n"); - break; - } - - data += 3; - data_length -= 3; - break; - case 24: - printf("fn: %-3d\n", rq->function); - printf("End of Job\n"); - break; - case 34: - printf("fn: %-3d, subfn: %-3d\n", rq->function, - data[2]); - data += 3; - data_length -= 3; - break; - case 62: - printf("fn: %-3d\n", rq->function); - printf("File Search Initialize\n"); - break; - case 63: - printf("fn: %-3d\n", rq->function); - printf("File Search Continue\n"); - break; - case 64: - printf("fn: %-3d\n", rq->function); - printf("Search for a file\n"); - break; - case 66: - printf("fn: %-3d\n", rq->function); - printf("Close File\n"); - break; - case 73: - printf("fn: %-3d\n", rq->function); - printf("Write to File\n"); - break; - case 75: - printf("fn: %-3d\n", rq->function); - printf("Set File Time Date Stamp\n"); - break; default: printf("fn: %-3d\n", rq->function); } diff --git a/man/Makefile b/man/Makefile index 10ecff5..474ad75 100644 --- a/man/Makefile +++ b/man/Makefile @@ -1,4 +1,4 @@ -MAN1= slist nprint pqlist nsend pserver +MAN1= slist nprint pqlist nsend pserver ncopy MAN5= nwclient MAN8= ncpmount ncpumount ipx_configure ipx_interface ipx_internal_net \ ipx_route nwmsg diff --git a/man/ncopy.1 b/man/ncopy.1 new file mode 100644 index 0000000..b1b99c6 --- /dev/null +++ b/man/ncopy.1 @@ -0,0 +1,96 @@ +.\" +.\" Man page for the ncopy program +.\" +.TH NCOPY 1 17/03/1996 ncopy ncopy +.SH NAME +ncopy \- NetWare file copy + +.SH SYNOPSIS +.B ncopy -V + +.B ncopy +[ +.B -vn +] +[ +.B -s +.I amount +] +.B file destinationfile|directory + +.B ncopy +[ +.B -vn +] +[ +.B -s +.I amount +] +.B file1 +[ +.B file2 ... +] +.B directory + +.SH DESCRIPTION +With +.B ncopy +you can copy files to different locations on a single NetWare file +server without generating excess network traffic. The program uses +a NetWare function to do the copy rather than transferring the file +across the network for both the read and write. + +If the last argument is a directory, +.B ncopy +will copy the source file(s) into the directory. If only two files +are given and the last argument is not a directory, it will copy the +source file to the destination file. + +If the source and destination files are not on the same NetWare server +(or are not on NetWare servers at all), +.B ncopy +will do a normal file copy. +.SH OPTIONS +.B -V +.RS 3 +Show version number and exit +.RE + +.B -v +.RS 3 +Verbose copy. Will show current file and percentage completion. +.RE + +.B -n +.RS 3 +Nice NetWare copy. Will sleep for a second between copying blocks on +the NetWare server. Gives other people a chance to do some work on +the NetWare server when you are copying large files. This has no +effect if you are not copying on a NetWare server. +.RE + +.B -s +.I amount +.RS 3 +Nice time slice factor. Used in conjunction with the +.B -n +option, this specifies the number of 100K blocks to copy before sleeping. +Default is 10. (1 Megabyte) +.RE + +.SH BUGS +.B ncopy +cannot recurse into directories. +Does not work on NetWare volumes mounted with the +.I -V +option to +.B ncpmount. + +.SH "SEE ALSO" +.B ncpmount(8), ncpumount(8) + +.SH CREDITS +ncopy was written by Brian G. Reid (breid@tim.com) and +Tom C. Henderson (thenderson@tim.com). +Many thanks to Volker Lendecke (lendecke@namu01.gwdg.de) for the ncpfs +and ncplib which made ncopy possible. diff --git a/ncpfs-0.19.lsm b/ncpfs-0.20.lsm similarity index 77% rename from ncpfs-0.19.lsm rename to ncpfs-0.20.lsm index 7917950..f99ed77 100644 --- a/ncpfs-0.19.lsm +++ b/ncpfs-0.20.lsm @@ -1,7 +1,7 @@ Begin3 Title: ncpfs -Version: 0.19 -Entered-date: 22. March 1996 +Version: 0.20 +Entered-date: 25. March 1996 Description: With ncpfs you can mount volumes of your netware server under Linux. You can also print to netware print queues and spool netware print queues to the @@ -11,9 +11,9 @@ Description: With ncpfs you can mount volumes of your netware Keywords: filesystem ncp novell netware printing Author: lendecke@namu01.gwdg.de (Volker Lendecke) Maintained-by: lendecke@namu01.gwdg.de (Volker Lendecke) -Primary-site: linux01.gwdg.de:/pub/ncpfs +Primary-site: ftp.gwdg.de:/pub/linux/misc/ncpfs Alternate-site: sunsite.unc.edu:/pub/system/Filesystems/ - ~103k ncpfs-0.19.tgz - ~ 1k ncpfs-0.19.lsm + ~111k ncpfs-0.20.tgz + ~ 1k ncpfs-0.20.lsm Copying-policy: GPL End diff --git a/util/Makefile b/util/Makefile index 1a5af00..4c856b7 100644 --- a/util/Makefile +++ b/util/Makefile @@ -2,7 +2,7 @@ # Makefile for the linux ncp-filesystem routines. # -USERUTILS = slist pqlist nwfsinfo pserver nprint nsend +USERUTILS = slist pqlist nwfsinfo pserver nprint nsend ncopy UIDUTILS = ncpmount ncpumount SBINUTILS = nwmsg diff --git a/util/ncopy.c b/util/ncopy.c new file mode 100644 index 0000000..918c36d --- /dev/null +++ b/util/ncopy.c @@ -0,0 +1,849 @@ +/**************************************************************************** + * ncopy.c + * + * Copy file on a Netware server without Network Traffic + * + * Copyright (C) 1996 by Brian Reid and Tom Henderson. + * + * Send bug reports for ncopy to "breid@tim.com" + * + * Still to do: support recursive copy with two arguments + * Both must be directories. (similar to rcp -r) + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ncplib.h" + + +struct NCPMountRec +{ + char *mountDir; + char *server; + struct ncp_conn *conn; +}; + +/**************************************************************************** + * Globals: + * + */ +const char *VersionStr = "0.1"; +char * ProgramName; + +struct NCPMountRec *NcpMountTable = NULL; +int ncpCount = 0; + +/* (initialized) command options */ + +int optVersion=0; /* -V TRUE if just want version */ +int optVerbose=0; /* -v TRUE if want verbose output */ +int optNice=0; /* -n TRUE if we are cooperative (nice) */ +int optNiceFactorSel=0; /* -s TRUE if we selected a nice factor */ +int optNiceFactor=10; /* -s arg, number of 100K blocks to copy + before sleeping for a second */ +__u32 CopyBlockSize = 100000; /* Size of the default block copy size */ +unsigned int NiceSleepTime=1; /* Number of seconds to sleep in Nice Mode */ + +int BlocksCopied=0; /* Number of blocks copied */ +int MaxNcopyRetries=25; /* Maximum number of times to retry a failed + copy before giving up */ + +/* Globals needed for signal handlers */ +int OutputOpen=0; /* True if the ncp output file is open */ +struct ncp_conn *CurrentConn = NULL; /* Connection of output file */ +struct ncp_file_info *CurrentFile = NULL; /* File info of output file */ + +/* Signal control structures */ +static struct sigaction sHangupSig; +static struct sigaction sInterruptSig; +static struct sigaction sQuitSig; +static struct sigaction sTermSig; + +/**************************************************************************** + * + */ +static void usage() +{ + fprintf(stderr,"usage: %s [-V]\n", ProgramName); + fprintf(stderr," %s [-vn] [-s amt] sourcefile destinationfile|directory\n", ProgramName); + fprintf(stderr," %s [-vn] [-s amt] sourcefile [...] directory\n", ProgramName); +} + +/**************************************************************************** + * Return pointer to last component of the path. + * Returned string may have one or more "/" left on the end. + * ("/" returns pointer to "/", null returns pointer to null) + * Return pointer to original string if no "/" in string. (except at end) + */ +static const char *myBaseName(const char *path) +{ + const char *p; + + for(p = &path[strlen(path)]; p != path; p--) { /* skip ENDING "/" chars */ + if(*p && *p != '/') break; + } + if(p==path) return p; + for( ; p != path || *p == '/'; p--) { + if(*p == '/') return ++p; + } + return p; +} + +/**************************************************************************** + * + */ +static const char *notDir(const char *path) +{ + struct stat buf; + static const char *notDirectory="not a directory"; + + if(stat(path, &buf)) return strerror(errno); /* no permission? not exist? */ + if(!S_ISDIR(buf.st_mode)) return notDirectory; /* not a directory */ + return (char *) 0; /* OK */ +} + +/**************************************************************************** + * + */ +static int handleOptions(const int argc, char * const argv[]) +{ + int opt; + + while ((opt = getopt(argc, argv, "vVns:")) != EOF) + { + switch (opt) { + + case 'V': /* Version */ + optVersion=1; + break; + + case 'v': /* Verbose output */ + optVerbose=1; + break; + + case 'n': /* Nice, cooperative copy */ + optNice=1; + break; + + case 's': /* Nice Factor */ + optNiceFactorSel=1; + optNiceFactor=atoi(optarg); + if (optNiceFactor < 1) { + fprintf(stderr,"%s: -s option requires positive numeric argument > 0\n", + ProgramName); + return 1; + } + break; + + default: /* invalid options or options without required arguments */ + return 1; + } + continue; + } + return 0; +} + +/**************************************************************************** + * TODO: if recursive flag last MUST be a directory, even if only 2 args. + */ +static int validateFileArgs(const int argc, char * const argv[]) +{ + const char *p; + if (argc == 0) { + fprintf(stderr,"%s: No arguments specified.\n", ProgramName); + return 1; + } + if(argc == 1) { + fprintf(stderr,"%s: No destination specified.\n", ProgramName); + return 1; + } + if((argc > 2) && (p=notDir(argv[argc-1]))) { /* last arg MUST be dir */ + fprintf(stderr,"%s: %s: %s\n", ProgramName, argv[argc-1], p); + return 1; + } + return 0; +} + +/**************************************************************************** + * Duplicate a string. + */ +char *duplicateStr(const char *InStr) +{ + char *dup; + if (!InStr) return NULL; + dup = (char*)malloc(strlen(InStr)+1); + if (dup) + strcpy(dup,InStr); + return dup; +} + +/**************************************************************************** + * load a table of ncpfs mount points. + */ +int loadMountTable() +{ + FILE *mountedFile; + struct mntent *mountEntry = NULL; + ncpCount = 0; + if ( (mountedFile = fopen(MOUNTED,"r")) == NULL) { + fprintf(stderr,"ncopy: cannot open %s, %s\n",MOUNTED,strerror(errno)); + return 1; + } + + while ( (mountEntry = getmntent(mountedFile)) != NULL) { + if (!strcmp(mountEntry->mnt_type,"ncpfs")) + ncpCount++; + } + if (ncpCount) { + NcpMountTable = (struct NCPMountRec*) + malloc(ncpCount * sizeof(struct NCPMountRec)); + if (!NcpMountTable) { + fprintf(stderr,"Out of memory\n"); + fclose(mountedFile); + return 1; + } + fseek(mountedFile,0,SEEK_SET); + ncpCount = 0; + while ( (mountEntry = getmntent(mountedFile)) != NULL) { + if (!strcmp(mountEntry->mnt_type,"ncpfs")) { + NcpMountTable[ncpCount].mountDir = duplicateStr(mountEntry->mnt_dir); + NcpMountTable[ncpCount].server = + duplicateStr(mountEntry->mnt_fsname); + NcpMountTable[ncpCount].conn = NULL; + ncpCount++; + } + } + } + fclose(mountedFile); + return 0; +} + +/**************************************************************************** + * Releases the table of ncpfs mount points. + */ +void releaseMountTable() +{ + int loop; + if (!ncpCount) return; + for (loop = ncpCount; loop; loop--,ncpCount--) { + if (NcpMountTable[loop-1].conn) { + ncp_close(NcpMountTable[loop-1].conn); + NcpMountTable[loop-1].conn = NULL; + } + free(NcpMountTable[loop-1].server); + free(NcpMountTable[loop-1].mountDir); + } + free(NcpMountTable); +} + +/**************************************************************************** + * Finds the index into the mount point table that enables ncp copy for + * the file. + * Returns -1 if the files do not reference the same server. + */ +int ncpIndex(const char *InputFile, const char *OutputFile) +{ + int loop; + char *mountDir; + if (!ncpCount) return -1; + + for (loop = 0; loop < ncpCount; loop++) { + mountDir = NcpMountTable[loop].mountDir; + if (!strncmp(mountDir,InputFile,strlen(mountDir)) && + !strncmp(mountDir,OutputFile,strlen(mountDir))) return loop; + } + return -1; +} + + +/**************************************************************************** + * Does a regular buffered file copy. + * This is used if we cannot use the Netware file copy. + */ +int normalFileCopy(const char *InputFile, const char *OutputFile, + char *Buffer,int BufferSize, + const char *paramInputFile, + const char *paramOutputFile) +{ + int fdIn, fdOut; + long fileSize,totalSize; + struct stat statBuf; + fdIn = open(InputFile,O_RDONLY); + if (fdIn == -1) { + fprintf(stderr,"%s: Cannot open %s, %s\n",ProgramName,paramInputFile, + strerror(errno)); + return 1; + } + if (fstat(fdIn,&statBuf)) { + fprintf(stderr,"%s: Cannot stat %s, %s\n",ProgramName,paramInputFile, + strerror(errno)); + close(fdIn); + return 1; + } + if(S_ISDIR(statBuf.st_mode)) { + close(fdIn); + fprintf(stderr,"%s: %s: omitting directory\n",ProgramName,paramInputFile); + return 0; /* At this point, don't consider this a fatal error */ + } + + fdOut = open(OutputFile,O_CREAT | O_TRUNC | O_WRONLY,statBuf.st_mode); + if (fdOut == -1) { + fprintf(stderr,"%s: Cannot create %s, %s\n",ProgramName,paramOutputFile, + strerror(errno)); + close(fdIn); + return 1; + } + fileSize = lseek(fdIn,0,SEEK_END); + if (fileSize < 0) { + fprintf(stderr,"%s: lseek error on %s, %s\n",ProgramName,paramInputFile, + strerror(errno)); + close(fdOut); + close(fdIn); + return 1; + } + lseek(fdIn,0,SEEK_SET); + if (optVerbose) { + printf("Normal copy: %s -> %s 0%%",paramInputFile,paramOutputFile); + fflush(stdout); + } + totalSize = fileSize; + while (fileSize) { + int currentMove; + int writeAmt; + currentMove = (fileSize > BufferSize) ? BufferSize : fileSize; + if (read(fdIn,Buffer,currentMove) != currentMove) { + fprintf(stderr,"%s: Error reading %s, %s\n",ProgramName,paramInputFile, + strerror(errno)); + close(fdIn); + close(fdOut); + return 1; + } + writeAmt = write(fdOut,Buffer,currentMove); + if (writeAmt < 0) { + fprintf(stderr,"%s: Error writing %s, %s\n",ProgramName,paramOutputFile, + strerror(errno)); + close(fdIn); + close(fdOut); + return 1; + } else if (writeAmt == 0) { + fprintf(stderr,"%s: Out of space on destination device writing %s\n", + ProgramName,OutputFile); + close(fdIn); + close(fdOut); + return 1; + } + fileSize -= currentMove; + if (optVerbose) { + printf("\rNormal copy: %s -> %s %ld%%",paramInputFile,paramOutputFile,(100 - (fileSize * 100/totalSize))); + fflush(stdout); + } + } + close(fdOut); + close(fdIn); + if (optVerbose) + printf("\n"); + return 0; +} + +/**************************************************************************** + * Converts a string to upper case. + * Netware file names need to be all upper case. + */ +char *upString(char *str) +{ + char *alias = str; + while (*alias) { + *alias = toupper(*alias); + ++alias; + } + return str; +} + +/**************************************************************************** + * Locates the first occurrance of a single character in the input string. + * returns -1 if the character is not found. + */ +int stringPosition(const char *str,char token) +{ + const char *alias = str; + while (*alias) { + if (*alias == token) return alias - str; + alias++; + } + return -1; +} + +/**************************************************************************** + * Walks up the directory path building info structures along the way + * in order to get a dir_handle. + * This will mangle the input "FileString", leaving just the file name + * component in it when it is finished. + */ +int getDirHandle(struct ncp_conn *conn, char *FileString, __u8 *NewDirHandle) +{ + struct nw_info_struct info1,info2; + int currentLevel = 0; + int k; + struct nw_info_struct *parentInfo = NULL; + struct nw_info_struct *currentInfo = NULL; + + while ( (k = stringPosition(FileString,'/')) >= 0) { + FileString[k] = 0; + if (!currentLevel) { + parentInfo = NULL; + currentInfo = &info1; + } else if (currentLevel % 2) { + parentInfo = &info1; + currentInfo = &info2; + } else { + parentInfo = &info2; + currentInfo = &info1; + } + if (ncp_do_lookup(conn, parentInfo, FileString, + currentInfo) != 0) { + fprintf(stderr,"%s: Ncp lookup failed on directory %s--%s\n", + ProgramName,FileString,strerror(errno)); + return 1; + } + ++currentLevel; + memmove(FileString,FileString+k+1,strlen(FileString+k+1)+1); + } + + if (ncp_alloc_short_dir_handle(conn, currentInfo, NCP_ALLOC_TEMPORARY, + NewDirHandle) != 0) { + fprintf(stderr,"%s: Ncp alloc dir handle failed--%s\n", + ProgramName,strerror(errno)); + return 1; + } + return 0; +} + + +/**************************************************************************** + * Interfaces with the ncplib to do the netware copy of the file. + */ +int netwareCopyFile(int ncpMountIndex, const char *sourcefile, + const char *destfile, + const char *paramInputFile, + const char *paramOutputFile) +{ + __u8 source_dir_handle; + __u8 dest_dir_handle; + struct ncp_file_info source_file; + struct ncp_file_info dest_file; + __u32 amountCopied; + __u32 amtLeft; + __u32 totalSize; + __u32 sourceOff; + __u32 thisMove; + int stroffset; + int retValue; + char *sourceDup; + char *destDup; + struct ncp_conn *sourceconn; + int retryCount; + long err = 0; + + /* Establish a connection to a Netware mount point if + one is not already established. */ + if (!NcpMountTable[ncpMountIndex].conn) { + NcpMountTable[ncpMountIndex].conn = + ncp_open_mount(NcpMountTable[ncpMountIndex].mountDir,&err); + if (err) { + com_err(ProgramName,err,"opening ncp connection on mount point %s", + NcpMountTable[ncpMountIndex].mountDir); + return 2; + } + } + sourceconn = NcpMountTable[ncpMountIndex].conn; + + /* Duplicate and upper case the file names so we do not trample + on the input strings */ + stroffset = strlen(NcpMountTable[ncpMountIndex].mountDir) + 1; + sourceDup = duplicateStr(sourcefile+stroffset); + destDup = duplicateStr(destfile+stroffset); + if (!sourceDup || !destDup) { + fprintf(stderr,"%s: Malloc failed duplicating file names\n", + ProgramName); + return 2; + } + + upString(sourceDup); + upString(destDup); + + /* Get Handles to the input and output directories */ + if (getDirHandle(sourceconn,sourceDup,&source_dir_handle) || + getDirHandle(sourceconn,destDup,&dest_dir_handle)) { + free(sourceDup); + free(destDup); + return 1; + } + + /* Open the input and output files. */ + if (ncp_open_file(sourceconn, source_dir_handle, sourceDup,0,AR_READ, + &source_file) != 0) { + fprintf(stderr,"%s: Cannot open %s--%s\n", + ProgramName,paramInputFile,strerror(errno)); + free(sourceDup); + free(destDup); + return 1; + } + + if (ncp_create_file(sourceconn, dest_dir_handle, destDup, + source_file.file_attributes, &dest_file) != 0) { + fprintf(stderr,"%s: Cannot create %s--%s\n",ProgramName, paramOutputFile, + strerror(errno)); + ncp_close_file(sourceconn,source_file.file_id); + free(sourceDup); + free(destDup); + return 1; + } + /* Set globals in case a signal happens while copying */ + CurrentConn = sourceconn; + CurrentFile = &dest_file; + OutputOpen = 1; + + free(sourceDup); + free(destDup); + + retValue = 0; + if (optVerbose) { + printf("NetWare copy: %s -> %s 0%%",paramInputFile,paramOutputFile); + fflush(stdout); + } + + /* The main copy loop. */ + + amtLeft = totalSize = source_file.file_length; + sourceOff = 0; + retryCount = 0; + + while (amtLeft && retryCount < MaxNcopyRetries) { + int ncopyRetValue; + if (amtLeft > CopyBlockSize) + thisMove = CopyBlockSize; + else + thisMove = amtLeft; + /* If we are being nice and we've copied enough blocks, go to sleep */ + if (optNice) { + if (BlocksCopied == optNiceFactor) { + sleep(NiceSleepTime); + BlocksCopied=0; + } else + ++BlocksCopied; + } + ncopyRetValue = ncp_copy_file(sourceconn, source_file.file_id, + dest_file.file_id, sourceOff,sourceOff, + thisMove,&amountCopied); + if (ncopyRetValue != 0) { + /* In my testing this only happens when you run out of space + on the server. + Netware seems to wait a bit before reporting space recently + free'd. I will just wait a bit before bombin */ + sleep(1); /* Sleep for a second and try again */ + retryCount++; + amountCopied = thisMove = 0; + } + if (amountCopied != thisMove) { + fprintf(stderr,"%s: Warning, amountCopied (%u) != thisMove (%u)\n", + ProgramName,(unsigned int)amountCopied,(unsigned int)thisMove); + } +#ifdef NCOPY_DEBUG + fprintf(stderr,"Copied %u (actual %u)\n",(unsigned int)thisMove, + (unsigned int)amountCopied); +#endif + amtLeft -= amountCopied; + sourceOff += amountCopied; + if (optVerbose) { + printf("\rNetWare copy: %s -> %s %ld%%",paramInputFile,paramOutputFile, + (100 - (long)((float)amtLeft /(float)totalSize * 100.0))); + if (retryCount) + printf(" %d retries",retryCount); + fflush(stdout); + } + } + if (retryCount >= MaxNcopyRetries) + retValue = 1; + if (optVerbose) + printf("\n"); + if (ncp_close_file(sourceconn,dest_file.file_id) != 0) { + fprintf(stderr,"%s: Close failed for %s\n",ProgramName,paramOutputFile); + retValue = 1; + } + + /* Clear signal handling globals */ + OutputOpen = 0; + CurrentConn = NULL; + CurrentFile = NULL; + + if (ncp_close_file(sourceconn,source_file.file_id) != 0) { + fprintf(stderr,"%s: Close failed for %s\n",ProgramName,paramInputFile); + retValue = 1; + } + + if (ncp_dealloc_dir_handle(sourceconn, dest_dir_handle) != 0) + { + fprintf(stderr,"%s: Dealloc dir handle error for %s\n",ProgramName, + paramOutputFile); + retValue = 1; + } + if (ncp_dealloc_dir_handle(sourceconn, source_dir_handle) != 0) + { + fprintf(stderr,"%s: Dealloc dir handle error for %s\n",ProgramName, + paramInputFile); + retValue = 1; + } + return retValue; +} + + +/**************************************************************************** + * Decides whether to use the traditional file copy or the netware remote + * file copy. + */ +int copyFiles(const char *realsource, const char *realdestination, + const char *paraminputfile, const char *paramoutputfile) +{ + int oldUMask; + char fileBuffer[24000]; + int retVal = 0; + int ncpMountIndex = ncpIndex(realsource,realdestination); +#ifdef NCOPY_DEBUG + printf("Real Source '%s'\n" + "Real Dest '%s'\n" + "Param Src '%s'\n" + "Param Dest '%s'\n",realsource,realdestination,paraminputfile, + paramoutputfile); +#endif + + oldUMask = umask(0); + if (ncpMountIndex < 0) + retVal = normalFileCopy(realsource,realdestination,fileBuffer, + sizeof(fileBuffer), + paraminputfile,paramoutputfile); + else + retVal = netwareCopyFile(ncpMountIndex,realsource,realdestination, + paraminputfile,paramoutputfile); + umask(oldUMask); + return retVal; +} + + +/**************************************************************************** + * + * HERE + * + * Brian may NEED "fake" path if he prints error messages? + * or I may need a way to get his error messages so I can + * print them with the "fake" path. + * My current error messages are on the REAL path, which would be confusing... + * + * (1-source problem, 2-destination problem, 3-other fatal) + * We need to decide when to exit or continue the loop, + * and what to return when we do exit the loop. + * Is it failure if 3 files are to be copied, and 1 fails? + * If one copy fails, we stay in the loop, right? + * Is it failure if destination fails? + * Do we Stay in the loop? + */ +static int copyRealPaths(const char *source, const char *destination) +{ + char realsource[MAXPATHLEN*2]; + char realdestination[MAXPATHLEN*2]; + char dirPart[MAXPATHLEN+1]; + char filePart[MAXPATHLEN+1]; + const char *p; + + if(realpath(source, realsource) == 0) { /* the source must at least exist */ + fprintf(stderr,"%s: %s: %s\n", + ProgramName, source, strerror(errno)); + return 1; /* indicate a "source" problem */ + } + if(realpath(destination, realdestination) == 0) {/* dest file missing? OK */ + strncpy(dirPart, destination, MAXPATHLEN); /* but "dirpart" must work */ + dirPart[MAXPATHLEN] = 0; + p=myBaseName(dirPart); + strcpy(filePart, p); + dirPart[p - dirPart] = 0; /* isolates "directory" part from "file part" */ + if(realpath(dirPart, realdestination) == 0) { + fprintf(stderr,"%s: %s: %s\n", + ProgramName, dirPart, strerror(errno)); + return 2; /* indicate a "destination" problem */ + } + if(*realdestination != '/' || *(realdestination+1)) strcat(realdestination, "/"); + strcat(realdestination, filePart); + } + /* becomes prog exit code */ + + /* Test Cases: (Where file/dir may or may not exist) + * "", file, file/, dir, dir/ + * /, //, /dir, /dir/, /file, /file/, + * /tmp/file, /tmp/file/, tmp/file, tmp/file/, + * /tmp/dir, /tmp/dir/, tmp/dir, tmp/dir/ + */ + return copyFiles(realsource, realdestination,source,destination); +} + +/**************************************************************************** + * guaranteed argc is at least 2 and + * if argc > 2 last parameter is a directory + * by validateFileArgs() + */ +static int handleFileArgs(int argc, char * const argv[]) +{ + int loop; + const char *destination; + int copyStatus; + int returnCode=0; /* default program exit code */ + const char *baseNamePtr; + char destinationfile[MAXPATHLEN*2]; + + destination=argv[argc-1]; /* get LAST argument */ + for (loop = 0; loop < (argc-1); loop++) { /* all file arguments, but last */ + strncpy(destinationfile, destination, MAXPATHLEN); + destinationfile[MAXPATHLEN]=0; + if((argc > 2) || (!notDir(argv[argc-1]))) { /* destination is a dir */ + if(*destinationfile != '/' || *(destinationfile+1)) strcat(destinationfile,"/"); + baseNamePtr=myBaseName(argv[loop]); /* get the file name */ + strcat(destinationfile,baseNamePtr); /* add it on end of directory */ + } + copyStatus=copyRealPaths(argv[loop], destinationfile); /* do the copy */ + if(copyStatus > 1) return copyStatus; /* fatal failure? bye */ + if(copyStatus == 1) returnCode=1; /* a partial failure? we can continue */ + } + return returnCode; /* return what will be the program exit code */ +} +/**************************************************************************** + * + */ +static void handleSignals(int sigNumber) +{ + /* Ignore Signal Handling while cleaning up */ + + /* SIGHUP */ + sHangupSig.sa_handler=SIG_IGN; + if(sigaction(SIGHUP, &sHangupSig, NULL) == -1) { + fprintf(stderr,"%s: Reset to ignore SIGHUP signal failed: %s", + ProgramName, strerror(errno)); + } + /* SIGINT */ + sInterruptSig.sa_handler=SIG_IGN; + if(sigaction(SIGINT, &sInterruptSig, NULL) == -1) { + fprintf(stderr,"%s: Reset to ignore SIGINT signal failed: %s", + ProgramName, strerror(errno)); + } + /* SIGQUIT */ + sQuitSig.sa_handler=SIG_IGN; + if(sigaction(SIGQUIT, &sQuitSig, NULL) == -1) { + fprintf(stderr,"%s: Reset to ignore SIGQUIT signal failed: %s", + ProgramName, strerror(errno)); + } + /* SIGTERM */ + sTermSig.sa_handler=SIG_IGN; + if(sigaction(SIGTERM, &sTermSig, NULL) == -1) { + fprintf(stderr,"%s: Reset to ignore SIGTERM signal failed: %s", + ProgramName, strerror(errno)); + } + + /* If we don't close the ncp output file, we have to ncpumount and + ncpmount before we can get rid of it. */ + if (OutputOpen) { + /* Issue a warning if we cannot close the file */ + /* If an error occurs we probably have to umount/mount to + remove the file */ + if (ncp_close_file(CurrentConn,CurrentFile->file_id) != 0) { + fprintf(stderr,"%s: unclean close of output file",ProgramName); + } + OutputOpen = 0; + } + + exit(128 + sigNumber); +} + +/**************************************************************************** + * We'll trap Hangup, Interrupt, Quit or Terminate + */ +static int trapSignals() +{ + if(sigaction(SIGHUP, NULL, &sHangupSig)) { /* init structure fields */ + fprintf(stderr,"%s: Get HANGUP signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + sHangupSig.sa_handler = handleSignals; + if(sigaction(SIGHUP, &sHangupSig, NULL) == -1) { + fprintf(stderr,"%s: Reset HANGUP signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + if(sigaction(SIGINT, NULL, &sInterruptSig)) { /* init structure fields */ + fprintf(stderr,"%s: Get INTERRUPT signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + sInterruptSig.sa_handler = handleSignals; + if(sigaction(SIGINT, &sInterruptSig, NULL) == -1) { + fprintf(stderr,"%s: Reset INTERRUPT signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + if(sigaction(SIGQUIT, NULL, &sQuitSig)) { /* init structure fields */ + fprintf(stderr,"%s: Get QUIT signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + sQuitSig.sa_handler = handleSignals; + if(sigaction(SIGQUIT, &sQuitSig, NULL) == -1) { + fprintf(stderr,"%s: Reset QUIT signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + if(sigaction(SIGTERM, NULL, &sTermSig)) { /* init structure fields */ + fprintf(stderr,"%s: Get TERMINATE signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + sTermSig.sa_handler = handleSignals; + if(sigaction(SIGTERM, &sTermSig, NULL) == -1) { + fprintf(stderr,"%s: Reset TERMINATE signal action failed: %s", + ProgramName, strerror(errno)); + return 1; + } + return 0; +} + +/**************************************************************************** + * + */ +int main(int argc, char * const argv[]) +{ + int returnCode; + ProgramName=argv[0]; + + if(handleOptions(argc, argv)) { /* bad option, missing option parameter */ + usage(); + return 1; + } + if(optVersion) { /* only option not requiring any arguments */ + printf("%s version %s\n", ProgramName, VersionStr); + return 0; + } + if(validateFileArgs(argc - optind, argv + optind)) { + usage(); + return 1; + } + if(trapSignals()) return 1; + loadMountTable(); + returnCode = handleFileArgs(argc - optind, argv + optind); + releaseMountTable(); + return returnCode; +} diff --git a/util/ncplib.c b/util/ncplib.c index 596eb30..11c02cc 100644 --- a/util/ncplib.c +++ b/util/ncplib.c @@ -591,6 +591,8 @@ ncp_mount_request(struct ncp_conn *conn, int function) return result; } + conn->completion = reply->completion_code; + conn->conn_status = reply->connection_state; conn->ncp_reply_size = result - sizeof(struct ncp_reply_header); if ((reply->completion_code != 0) && (conn->verbose != 0)) @@ -837,9 +839,6 @@ ncp_find_fileserver(const char *server_name, long *err) return &result; } - - - static long ncp_open_temporary(struct ncp_conn *conn, const struct ncp_conn_spec *spec) @@ -887,6 +886,8 @@ ncp_find_permanent(const struct ncp_conn_spec *spec) int mount_fid; struct ncp_fs_info i; + initialize_NCPL_error_table(); + if ((mtab = fopen(MOUNTED, "r")) == NULL) { return NULL; @@ -972,6 +973,8 @@ ncp_open(const struct ncp_conn_spec *spec, long *err) { struct ncp_conn *result; + initialize_NCPL_error_table(); + result = malloc(sizeof(struct ncp_conn)); if (result == NULL) @@ -1001,6 +1004,8 @@ ncp_open_mount(const char *mount_point, long *err) { struct ncp_conn *result; + initialize_NCPL_error_table(); + if (strlen(mount_point) >= sizeof(result->mount_point)) { *err = ENAMETOOLONG; @@ -1297,6 +1302,8 @@ ncp_find_conn_spec(const char *server, const char *user, const char *password, FILE *nwc; struct ncp_conn_spec *nwc_ent; + initialize_NCPL_error_table(); + *err = 0; memzero(spec); spec.uid = getuid(); @@ -1500,12 +1507,20 @@ ncp_initialize_as(int *argc, char **argv, i += 1; } - if ((spec = ncp_find_conn_spec(server, user, password, - getuid(), err)) == NULL) - { - return NULL; - } + spec = ncp_find_conn_spec(server, user, password, getuid(), err); + if (spec == NULL) + { + if (login_necessary != 0) + { + return NULL; + } + else + { + return ncp_open(NULL, err); + } + } + spec->login_type = login_type; if (login_necessary == 0) @@ -1952,8 +1967,27 @@ ncp_login_object(struct ncp_conn *conn, } if ((result = ncp_login_encrypted(conn, &user, - ncp_key, password)) != 0) { - return result; + ncp_key, password)) != 0) + { + struct nw_property p; + struct ncp_prop_login_control *l + = (struct ncp_prop_login_control *)&p; + + if (conn->completion != NCP_GRACE_PERIOD) + { + return result; + } + + fprintf(stderr, "Your password has expired\n"); + + if ((result = ncp_read_property_value(conn, NCP_BINDERY_USER, + username, 1, + "LOGIN_CONTROL", + &p)) == 0) + { + fprintf(stderr, "You have %d login attempts left\n", + l->GraceLogins); + } } return 0; } @@ -2858,9 +2892,9 @@ ncp_copy_file(struct ncp_conn *conn, ncp_add_byte(conn, 0); /* reserved */ ncp_add_mem(conn, source_file, 6); ncp_add_mem(conn, target_file, 6); - ncp_add_dword(conn, source_offset); - ncp_add_dword(conn, target_offset); - ncp_add_dword(conn, count); + ncp_add_dword(conn, htonl(source_offset)); + ncp_add_dword(conn, htonl(target_offset)); + ncp_add_dword(conn, htonl(count)); if ((result = ncp_request(conn, 74)) != 0) { @@ -2868,7 +2902,7 @@ ncp_copy_file(struct ncp_conn *conn, return result; } - *copied_count = ncp_reply_dword(conn, 0); + *copied_count = ntohl(ncp_reply_dword(conn, 0)); ncp_unlock_conn(conn); return 0; } diff --git a/util/ncplib.h b/util/ncplib.h index 1115237..7a3633d 100644 --- a/util/ncplib.h +++ b/util/ncplib.h @@ -168,6 +168,26 @@ long ncp_scan_bindery_object(struct ncp_conn *conn, __u32 last_id, __u16 object_type, char *search_string, struct ncp_bindery_object *target); + +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)); + __u8 LastIntruder[8] __attribute__ ((packed)); +}; + long ncp_read_property_value(struct ncp_conn *conn, int object_type, const char *object_name, @@ -178,6 +198,9 @@ ncp_login_encrypted(struct ncp_conn *conn, const struct ncp_bindery_object *object, const unsigned char *key, const unsigned char *passwd); + +#define NCP_GRACE_PERIOD (0xdf) + long ncp_login_user(struct ncp_conn *conn, const unsigned char *username, diff --git a/util/ncpmount.c b/util/ncpmount.c index 16c60c3..89a5586 100644 --- a/util/ncpmount.c +++ b/util/ncpmount.c @@ -484,12 +484,42 @@ main(int argc, char *argv[]) exit(1); } - if ( ((conn = ncp_open_mount(mount_point, &err)) == NULL) - || ((err = ncp_login_user(conn, spec->user, spec->password)) != 0) - || ((err = ioctl(conn->mount_fid, NCP_IOC_CONN_LOGGED_IN, - NULL)) != 0)) + if ((conn = ncp_open_mount(mount_point, &err)) == NULL) { - com_err("ncpmount", err, "in login"); + com_err("ncpmount", err, "attempt to open mount point"); + umount(mount_point); + exit(1); + } + + if ((err = ncp_login_user(conn, spec->user, spec->password)) != 0) + { + struct nw_property p; + struct ncp_prop_login_control *l + = (struct ncp_prop_login_control *)&p; + + if (conn->completion != NCP_GRACE_PERIOD) + { + com_err("ncpmount", err, "in login"); + fprintf(stderr, "Login denied\n"); + ncp_close(conn); + umount(mount_point); + exit(1); + } + + fprintf(stderr, "Your password has expired\n"); + + if ((err = ncp_read_property_value(conn, NCP_BINDERY_USER, + spec->user, 1, + "LOGIN_CONTROL", &p)) == 0) + { + fprintf(stderr, "You have %d login attempts left\n", + l->GraceLogins); + } + } + + if ((err = ioctl(conn->mount_fid, NCP_IOC_CONN_LOGGED_IN, NULL)) != 0) + { + com_err("ncpmount", err, "in logged_indication"); ncp_close(conn); umount(mount_point); exit(1);