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.


5/10/90 additions:

- The NFS_WRITE call stored the wrong modification date.  (fixed in files.c)

- A full filesystem couldn't be mounted. (fixed in nfs.c, files.c)

- Increased buffer capacity from 512 bytes to 1024 bytes.  Added -b
  command line option to allow setting the blocksize.  (fixed in rpc/clnt.h,
  sock.c, netd.h, netd.c, nfs.c, nfs.h)

--------------------

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:

- 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).
- Add PC-NFS version 1 and/or version 2 user authentication.
- Upgrade to NFS protocol version 3.
