This is a log of patches made to SOS by Rich Braun Jan-Apr 1991: - NFSLOOKUP went into an infinite loop whenever it encountered a subdirectory file (fixed in files.c). Client command: ls - Attempts to create a file with a long name caused SOS to crash (fixed in files.c). Client command: cat >longfile.name - STATFS returned incorrect block counts. (fixed in files.c) Client command: df -v - Didn't support blocks larger than 500 bytes. (fixed in nfs.h) Client command: mount -f NFS,rsize=512,wsize=512 - SETATTR did not have support for setting the size of a file; symptom was that rewriting a file to a shorted length left old junk at the end. (fixed in nfs.c, files.c) Client command: cp shortfile longfile - intopn() did a malloc for the path name, wasting processor time. Moved it to the caller's stack frame. Also optimized out calls to strcat (fixed in nfs.c, inodes.c, inodes.h) - LINK didn't return an error code readable by the client. (fixed in nfs.c) Client command: ln old new - RENAME didn't return the correct error code. (fixed in nfs.c) Client command: mv old new - MKDIR didn't return a name-too-long error if a long filename was used. (fixed in nfs.c, files.h, files.c) Client command: mkdir longfilename - showexps() didn't close the exports file, and in fact doesn't need to open it anyway. (fixed in exports.c) - nfs.c used malloc instead of local stack variables in a number of places. (fixed in nfs.c) - READDIR on large directories blew up due to the use of a 'short' variable where a 'long' was needed. (fixed in nfs.c, files.h, files.c) Client command: ls bigdir - READDIR sometimes returned 0 files for a directory containing files; problem was that 'maxbytes' was set from an unitialized stack variable. (fixed in nfs.c) Client command: ls - SETATTR always set the file protection even if specified as -1. This clobbered the read-only status. (fixed in nfs.c) - SETATTR did not set the modification time properly. (fixed in files.c) Client command: copy -m - UNLINK wouldn't delete a file if it was set RDONLY. (fixed in files.c) - READ didn't warn of a too-large request. (added fprintf in nfs.c) - Mounting of a root directory didn't work. (fixed in mountd.c, exports.c, inodes.c, files.c) - Moved InodeTable into far memory and increased its size. (fixed in inodes.c) - Corrected fsid logic. (fixed in inodes.c, files.c, mountd.c) - Allow writes to read-only files; authentication is done at the client side rather than the server. (fixed in files.c) Client command: cp rdonlyfile newfile - Rewrote intopn routine to use internal stack; freed up space in inode table--now 34 bytes per entry; originally 42. (fixed in inodes.c) - Eliminated lower-case requirement for the drive letter in EXPORT.US (fixed in inodes.c, exports.c) - Changed make files in PC/IP to squeeze the _TEXT code segment. This must be done in order to fit SOS into small-model. - READDIR now returns "." and "..". (fixed in inodes.c, files.c) Client command: ls - Contents of file handles now have correct parent pointer and are validated for certain calls. This eliminates "can't read .." error from pwd command. Client commands: pwd, ls - If a file or directory was created with any uppercase letters, two separate inode entries would be created erroneously. (fixed in nfs.c) - The CREATE function didn't examine the caller's UID and GID, so file_create() didn't have them. This caused incorrect file ownership on the Novell server. (fixed in nfs.c) 3/15/90 additions: - The READDIR function sent incorrect data if the number of files in a directory filled close to 1 block. Some NFS clients saw empty directories if they contained about 20 files. (fixed in nfs.c) - READDIR didn't return '.' and '..' if a directory was empty. (fixed in files.c) - RENAME didn't update the inode cache, creating "phantom" files. (fixed in files.c, nfs.c, files.h) - REMOVE failed if a file had been read recently; the "unlink" was attempted before closing the file. (fixed in files.c) - RMDIR returned incorrect error code if a directory was not empty, etc. (fixed in nfs.c) - Set the UID/GID identifiers to those of the caller, to get around some protection problems. 4/8/90 additions: - The timezone parameter was reversed from the Unix standard. TZ=EST5EDT now works, rather than EST-5EDT. Also added check for TZ variable, forcing it to be set. (fixed in dtime.c) - The server could be crashed easily by specifying a long filename in a NFSLOOKUP call. The routine pntoin should never be called prior to calling validate_path. (fixed in nfs.c, files.c) Client command: cat abcdefghijklmnopqrstuvwxyz - Improved command line parser, using getopt calls. (fixed in netd.c) - Improved main documentation file soss.1. -------------------- The following features have been added: - Advanced debugging macro support. (files debug.c, debug.h) - Improved inode caching (routines ingetentry, inattrset, inattrget, inremnode; files inodes.c, inodes.h, nfs.c, files.c) - Improved performance from general code cleanup. - Root directories may now be exported. - The EXPORTS function of mountd was not supported. (files exports.c, mountd.c, exports.h) Client command: showmount -e - Added partial support for Novell file access authentication. (Excepting directory trustees.) - Added -t command line option to allow silent truncation of long filenames. (files netd.c, netd.h, files.c) -------------------- The following outstanding issues are known: - There is no support for large packets (> 512 bytes). - The server crashes as soon as about 7,500 nodes are created. - The mv command does not work on directories; this would require direct I/O to disk a la the Norton Utilities. - Inodes are not recycled as files are deleted. - Code is compiled small-model and is very close to the 64K limit. - A filename beginning with dot is unsupported, and the 'rm' command under AIX creates such files. - Daylight savings time handling requires more support than that provided in the Microsoft library's "tzset" function. -------------------- Suggestions for improvements: - The code could be made to run as a TSR. - The code could be made to use extended memory. - Cache file data blocks. - Prevent remote user "root" from being unconditionally trusted. - Improve the client list parser (allow numeric IP addresses). - Let administrator set protections for three classes of files: directories, read-only files, and writable files. - Implement a full-blown authentication scheme (i.e. store UID/GID/mode of all files).