(Bitwise Operations): In logtest and logbit?, describe
[bpt/guile.git] / doc / ref / posix.texi
index 776f248..1897bef 100644 (file)
@@ -1,5 +1,12 @@
+@c -*-texinfo-*-
+@c This is part of the GNU Guile Reference Manual.
+@c Copyright (C)  1996, 1997, 2000, 2001, 2002, 2003, 2004
+@c   Free Software Foundation, Inc.
+@c See the file guile.texi for copying conditions.
+
 @node POSIX
-@chapter POSIX System Calls and Networking
+@section @acronym{POSIX} System Calls and Networking
+@cindex POSIX
 
 @menu
 * Conventions::                 Conventions employed by the POSIX interface.
 @end menu
 
 @node Conventions
-@section POSIX Interface Conventions
+@subsection @acronym{POSIX} Interface Conventions
 
 These interfaces provide access to operating system facilities.
 They provide a simple wrapping around the underlying C interfaces
 to make usage from Scheme more convenient.  They are also used
-to implement the Guile port of @ref{The Scheme shell (scsh)}.
+to implement the Guile port of scsh (@pxref{The Scheme shell (scsh)}).
 
 Generally there is a single procedure for each corresponding Unix
 facility.  There are some exceptions, such as procedures implemented for
 speed and convenience in Scheme with no primitive Unix equivalent,
-e.g., @code{copy-file}.
+e.g.@: @code{copy-file}.
 
 The interfaces are intended as far as possible to be portable across
 different versions of Unix.  In some cases procedures which can't be
@@ -66,14 +73,40 @@ succeed, e.g., @code{getenv} returns @code{#f} if it the requested
 string is not found in the environment.  These cases are noted in
 the documentation.
 
-For ways to deal with exceptions, @ref{Exceptions}.
+For ways to deal with exceptions, see @ref{Exceptions}.
 
-Errors which the C-library would report by returning a NULL pointer or
+@cindex @code{errno}
+Errors which the C library would report by returning a null pointer or
 through some other means are reported by raising a @code{system-error}
-exception.  The value of the Unix @code{errno} variable is available
-in the data passed by the exception.
+exception with @code{scm-error} (@pxref{Error Reporting}).  The
+@var{data} parameter is a list containing the Unix @code{errno} value
+(an integer).  For example,
+
+@example
+(define (my-handler key func fmt fmtargs data)
+  (display key) (newline)
+  (display func) (newline)
+  (apply format #t fmt fmtargs) (newline)
+  (display data) (newline))
+
+(catch 'system-error
+  (lambda () (dup2 -123 -456))
+  my-handler)
+
+@print{}
+system-error
+dup2
+Bad file descriptor
+(9)
+@end example
+
 
-It can be extracted with the function @code{system-error-errno}:
+@sp 1
+@defun system-error-errno arglist
+@cindex @code{errno}
+Return the @code{errno} value from a list which is the arguments to an
+exception handler.  If the exception is not a @code{system-error},
+then the return is @code{#f}.  For example,
 
 @example
 (catch
@@ -91,15 +124,18 @@ It can be extracted with the function @code{system-error-errno}:
        (display (strerror errno))))
      (newline))))
 @end example
+@end defun
+
 
 @node Ports and File Descriptors
-@section Ports and File Descriptors
+@subsection Ports and File Descriptors
+@cindex file descriptor
 
 Conventions generally follow those of scsh, @ref{The Scheme shell (scsh)}.
 
 File ports are implemented using low-level operating system I/O
-facilities, with optional buffering to improve efficiency
-@pxref{File Ports}
+facilities, with optional buffering to improve efficiency; see
+@ref{File Ports}.
 
 Note that some procedures (e.g., @code{recv!}) will accept ports as
 arguments, but will actually operate directly on the file descriptor
@@ -122,28 +158,28 @@ it's likely that the garbage collector would free the port, with the
 side-effect of closing the file descriptor prematurely.
 
 To assist the programmer in avoiding this problem, each port has an
-associated "revealed count" which can be used to keep track of how many
+associated @dfn{revealed count} which can be used to keep track of how many
 times the underlying file descriptor has been stored in other places.
 If a port's revealed count is greater than zero, the file descriptor
 will not be closed when the port is garbage collected.  A programmer
 can therefore ensure that the revealed count will be greater than
 zero if the file descriptor is needed elsewhere.
 
-For the simple case where a file descriptor is "imported" once to become
+For the simple case where a file descriptor is ``imported'' once to become
 a port, it does not matter if the file descriptor is closed when the
 port is garbage collected.  There is no need to maintain a revealed
-count.  Likewise when "exporting" a file descriptor to the external
+count.  Likewise when ``exporting'' a file descriptor to the external
 environment, setting the revealed count is not required provided the
 port is kept open (i.e., is pointed to by a live Scheme binding) while
 the file descriptor is in use.
 
-To correspond with traditional Unix behaviour, the three file
-descriptors (0, 1 and 2) are automatically imported when a program
-starts up and assigned to the initial values of the current input,
-output and error ports.  The revealed count for each is initially set to
-one, so that dropping references to one of these ports will not result
-in its garbage collection: it could be retrieved with fdopen or
-fdes->ports.
+To correspond with traditional Unix behaviour, three file descriptors
+(0, 1, and 2) are automatically imported when a program starts up and
+assigned to the initial values of the current/standard input, output,
+and error ports, respectively.  The revealed count for each is
+initially set to one, so that dropping references to one of these
+ports will not result in its garbage collection: it could be retrieved
+with @code{fdopen} or @code{fdes->ports}.
 
 @deffn {Scheme Procedure} port-revealed port
 @deffnx {C Function} scm_port_revealed (port)
@@ -152,7 +188,7 @@ Return the revealed count for @var{port}.
 
 @deffn {Scheme Procedure} set-port-revealed! port rcount
 @deffnx {C Function} scm_set_port_revealed_x (port, rcount)
-Sets the revealed count for a port to a given value.
+Sets the revealed count for a @var{port} to @var{rcount}.
 The return value is unspecified.
 @end deffn
 
@@ -169,10 +205,10 @@ side effect the revealed count of @var{port} is incremented.
 
 @deffn {Scheme Procedure} fdopen fdes modes
 @deffnx {C Function} scm_fdopen (fdes, modes)
-Return a new port based on the file descriptor @var{fdes}.
-Modes are given by the string @var{modes}.  The revealed count
-of the port is initialized to zero.  The modes string is the
-same as that accepted by @ref{File Ports, open-file}.
+Return a new port based on the file descriptor @var{fdes}.  Modes are
+given by the string @var{modes}.  The revealed count of the port is
+initialized to zero.  The @var{modes} string is the same as that
+accepted by @code{open-file} (@pxref{File Ports, open-file}).
 @end deffn
 
 @deffn {Scheme Procedure} fdes->ports fd
@@ -228,9 +264,9 @@ The return value is unspecified.
 @deffnx {C Function} scm_open (path, flags, mode)
 Open the file named by @var{path} for reading and/or writing.
 @var{flags} is an integer specifying how the file should be opened.
-@var{mode} is an integer specifying the permission bits of the file, if
-it needs to be created, before the umask is applied.  The default is 666
-(Unix itself has no default).
+@var{mode} is an integer specifying the permission bits of the file,
+if it needs to be created, before the umask (@pxref{Processes}) is
+applied.  The default is 666 (Unix itself has no default).
 
 @var{flags} can be constructed by combining variables using @code{logior}.
 Basic flags are:
@@ -251,7 +287,7 @@ Append to the file instead of truncating.
 Create the file if it does not already exist.
 @end defvar
 
-See the Unix documentation of the @code{open} system call
+@xref{File Status Flags,,,libc,The GNU C Library Reference Manual},
 for additional flags.
 @end deffn
 
@@ -263,7 +299,7 @@ a port.
 
 @deffn {Scheme Procedure} close fd_or_port
 @deffnx {C Function} scm_close (fd_or_port)
-Similar to close-port (@pxref{Closing, close-port}),
+Similar to @code{close-port} (@pxref{Closing, close-port}),
 but also works on file descriptors.  A side
 effect of closing a file descriptor is that any ports using that file
 descriptor are moved to a different file descriptor and have
@@ -272,19 +308,19 @@ their revealed counts set to zero.
 
 @deffn {Scheme Procedure} close-fdes fd
 @deffnx {C Function} scm_close_fdes (fd)
-A simple wrapper for the @code{close} system call.
-Close file descriptor @var{fd}, which must be an integer.
-Unlike close (@pxref{Ports and File Descriptors, close}),
-the file descriptor will be closed even if a port is using it.
-The return value is unspecified.
+A simple wrapper for the @code{close} system call.  Close file
+descriptor @var{fd}, which must be an integer.  Unlike @code{close},
+the file descriptor will be closed even if a port is using it.  The
+return value is unspecified.
 @end deffn
 
 @deffn {Scheme Procedure} unread-char char [port]
 @deffnx {C Function} scm_unread_char (char, port)
-Place @var{char} in @var{port} so that it will be read by the
-next read operation.  If called multiple times, the unread characters
-will be read again in last-in first-out order.  If @var{port} is
-not supplied, the current input port is used.
+Place @var{char} in @var{port} so that it will be read by the next
+read operation on that port.  If called multiple times, the unread
+characters will be read again in ``last-in, first-out'' order (i.e.@:
+a stack).  If @var{port} is not supplied, the current input port is
+used.
 @end deffn
 
 @deffn {Scheme Procedure} unread-string str port
@@ -296,19 +332,25 @@ unread characters will be read again in last-in first-out order.  If
 
 @deffn {Scheme Procedure} pipe
 @deffnx {C Function} scm_pipe ()
+@cindex pipe
 Return a newly created pipe: a pair of ports which are linked
-together on the local machine.  The @emph{car} is the input
-port and the @emph{cdr} is the output port.  Data written (and
+together on the local machine.  The @acronym{CAR} is the input
+port and the @acronym{CDR} is the output port.  Data written (and
 flushed) to the output port can be read from the input port.
 Pipes are commonly used for communication with a newly forked
 child process.  The need to flush the output port can be
 avoided by making it unbuffered using @code{setvbuf}.
 
-Writes occur atomically provided the size of the data in bytes
-is not greater than the value of @code{PIPE_BUF}.  Note that
-the output port is likely to block if too much data (typically
-equal to @code{PIPE_BUF}) has been written but not yet read
-from the input port.
+@defvar PIPE_BUF
+A write of up to @code{PIPE_BUF} many bytes to a pipe is atomic,
+meaning when done it goes into the pipe instantaneously and as a
+contiguous block (@pxref{Pipe Atomicity,, Atomicity of Pipe I/O, libc,
+The GNU C Library Reference Manual}).
+@end defvar
+
+Note that the output port is likely to block if too much data has been
+written but not yet read from the input port.  Typically the capacity
+is @code{PIPE_BUF} bytes.
 @end deffn
 
 The next group of procedures perform a @code{dup2}
@@ -384,7 +426,7 @@ Copies the file descriptor @var{oldfd} to descriptor
 number @var{newfd}, replacing the previous meaning
 of @var{newfd}.  Both @var{oldfd} and @var{newfd} must
 be integers.
-Unlike for dup->fdes or primitive-move->fdes, no attempt
+Unlike for @code{dup->fdes} or @code{primitive-move->fdes}, no attempt
 is made to move away ports which are using @var{newfd}.
 The return value is unspecified.
 @end deffn
@@ -392,32 +434,42 @@ The return value is unspecified.
 @deffn {Scheme Procedure} port-mode port
 Return the port modes associated with the open port @var{port}.
 These will not necessarily be identical to the modes used when
-the port was opened, since modes such as "append" which are
+the port was opened, since modes such as ``append'' which are
 used only during port creation are not retained.
 @end deffn
 
 @deffn {Scheme Procedure} port-for-each proc
-@deffnx {C Function} scm_port_for_each (proc)
+@deffnx {C Function} scm_port_for_each (SCM proc)
+@deffnx {C Function} scm_c_port_for_each (void (*proc)(void *, SCM), void *data)
 Apply @var{proc} to each port in the Guile port table
+(FIXME: what is the Guile port table?)
 in turn.  The return value is unspecified.  More specifically,
-@var{proc} is applied exactly once to every port that exists
-in the system at the time @var{port-for-each} is invoked.
-Changes to the port table while @var{port-for-each} is running
-have no effect as far as @var{port-for-each} is concerned.
+@var{proc} is applied exactly once to every port that exists in the
+system at the time @code{port-for-each} is invoked.  Changes to the
+port table while @code{port-for-each} is running have no effect as far
+as @code{port-for-each} is concerned.
+
+The C function @code{scm_port_for_each} takes a Scheme procedure
+encoded as a @code{SCM} value, while @code{scm_c_port_for_each} takes
+a pointer to a C function and passes along a arbitrary @var{data}
+cookie.
 @end deffn
 
 @deffn {Scheme Procedure} setvbuf port mode [size]
 @deffnx {C Function} scm_setvbuf (port, mode, size)
+@cindex port buffering
 Set the buffering mode for @var{port}.  @var{mode} can be:
-@table @code
-@item _IONBF
+
+@defvar _IONBF
 non-buffered
-@item _IOLBF
+@end defvar
+@defvar _IOLBF
 line buffered
-@item _IOFBF
+@end defvar
+@defvar _IOFBF
 block buffered, using a newly allocated buffer of @var{size} bytes.
 If @var{size} is omitted, a default size will be used.
-@end table
+@end defvar
 @end deffn
 
 @deffn {Scheme Procedure} fcntl object cmd [value]
@@ -428,44 +480,55 @@ integer argument.
 
 Values for @var{command} are:
 
-@table @code
-@item F_DUPFD
+@defvar F_DUPFD
 Duplicate a file descriptor
-@item F_GETFD
+@end defvar
+@defvar F_GETFD
 Get flags associated with the file descriptor.
-@item F_SETFD
+@end defvar
+@defvar F_SETFD
 Set flags associated with the file descriptor to @var{value}.
-@item F_GETFL
+@end defvar
+@defvar F_GETFL
 Get flags associated with the open file.
-@item F_SETFL
+@end defvar
+@defvar F_SETFL
 Set flags associated with the open file to @var{value}
-@item F_GETOWN
+@end defvar
+@defvar F_GETOWN
 Get the process ID of a socket's owner, for @code{SIGIO} signals.
-@item F_SETOWN
+@end defvar
+@defvar F_SETOWN
 Set the process that owns a socket to @var{value}, for @code{SIGIO} signals.
-@item FD_CLOEXEC
-The value used to indicate the "close on exec" flag with @code{F_GETFL} or
+@end defvar
+@defvar FD_CLOEXEC
+The value used to indicate the ``close on exec'' flag with @code{F_GETFL} or
 @code{F_SETFL}.
-@end table
+@end defvar
 @end deffn
 
 @deffn {Scheme Procedure} flock file operation
 @deffnx {C Function} scm_flock (file, operation)
+@cindex file locking
 Apply or remove an advisory lock on an open file.
 @var{operation} specifies the action to be done:
-@table @code
-@item LOCK_SH
+
+@defvar LOCK_SH
 Shared lock.  More than one process may hold a shared lock
 for a given file at a given time.
-@item LOCK_EX
+@end defvar
+@defvar LOCK_EX
 Exclusive lock.  Only one process may hold an exclusive lock
 for a given file at a given time.
-@item LOCK_UN
+@end defvar
+@defvar LOCK_UN
 Unlock the file.
-@item LOCK_NB
+@end defvar
+@defvar LOCK_NB
 Don't block when locking.  May be specified by bitwise OR'ing
 it to one of the other operations.
-@end table
+@end defvar
+
 The return value is not specified. @var{file} may be an open
 file descriptor or an open file descriptor port.
 @end deffn
@@ -504,7 +567,8 @@ An additional @code{select!} interface is provided.
 @end deffn
 
 @node File System
-@section File System
+@subsection File System
+@cindex file system
 
 These procedures allow querying and setting file system attributes
 (such as owner,
@@ -514,29 +578,45 @@ contents; syncing the file system and creating special files.
 
 @deffn {Scheme Procedure} access? path how
 @deffnx {C Function} scm_access (path, how)
-Return @code{#t} if @var{path} corresponds to an existing file
-and the current process has the type of access specified by
-@var{how}, otherwise @code{#f}.  @var{how} should be specified
-using the values of the variables listed below.  Multiple
-values can be combined using a bitwise or, in which case
-@code{#t} will only be returned if all accesses are granted.
+Test accessibility of a file under the real UID and GID of the calling
+process.  The return is @code{#t} if @var{path} exists and the
+permissions requested by @var{how} are all allowed, or @code{#f} if
+not.
 
-Permissions are checked using the real id of the current
-process, not the effective id, although it's the effective id
-which determines whether the access would actually be granted.
+@var{how} is an integer which is one of the following values, or a
+bitwise-OR (@code{logior}) of multiple values.
 
 @defvar R_OK
-test for read permission.
+Test for read permission.
 @end defvar
 @defvar W_OK
-test for write permission.
+Test for write permission.
 @end defvar
 @defvar X_OK
-test for execute permission.
+Test for execute permission.
 @end defvar
 @defvar F_OK
-test for existence of the file.
+Test for existence of the file.  This is implied by each of the other
+tests, so there's no need to combine it with them.
 @end defvar
+
+It's important to note that @code{access?} does not simply indicate
+what will happen on attempting to read or write a file.  In normal
+circumstances it does, but in a set-UID or set-GID program it doesn't
+because @code{access?} tests the real ID, whereas an open or execute
+attempt uses the effective ID.
+
+A program which will never run set-UID/GID can ignore the difference
+between real and effective IDs, but for maximum generality, especially
+in library functions, it's best not to use @code{access?} to predict
+the result of an open or execute, instead simply attempt that and
+catch any exception.
+
+The main use for @code{access?} is to let a set-UID/GID program
+determine what the invoking user would have been allowed to do,
+without the greater (or perhaps lesser) privileges afforded by the
+effective ID.  For more on this, see @ref{Testing File Access,,, libc,
+The GNU C Library Reference Manual}.
 @end deffn
 
 @findex fstat
@@ -552,52 +632,67 @@ The object returned by @code{stat} can be passed as a single
 parameter to the following procedures, all of which return
 integers:
 
-@table @code
-@item stat:dev
-The device containing the file.
-@item stat:ino
+@deffn {Scheme Procedure} stat:dev st
+The device number containing the file.
+@end deffn
+@deffn {Scheme Procedure} stat:ino st
 The file serial number, which distinguishes this file from all
 other files on the same device.
-@item stat:mode
-The mode of the file.  This includes file type information and
-the file permission bits.  See @code{stat:type} and
+@end deffn
+@deffn {Scheme Procedure} stat:mode st
+The mode of the file.  This is an integer which incorporates file type
+information and file permission bits.  See also @code{stat:type} and
 @code{stat:perms} below.
-@item stat:nlink
+@end deffn
+@deffn {Scheme Procedure} stat:nlink st
 The number of hard links to the file.
-@item stat:uid
+@end deffn
+@deffn {Scheme Procedure} stat:uid st
 The user ID of the file's owner.
-@item stat:gid
+@end deffn
+@deffn {Scheme Procedure} stat:gid st
 The group ID of the file.
-@item stat:rdev
-Device ID; this entry is defined only for character or block
-special files.
-@item stat:size
+@end deffn
+@deffn {Scheme Procedure} stat:rdev st
+Device ID; this entry is defined only for character or block special
+files.  On some systems this field is not available at all, in which
+case @code{stat:rdev} returns @code{#f}.
+@end deffn
+@deffn {Scheme Procedure} stat:size st
 The size of a regular file in bytes.
-@item stat:atime
+@end deffn
+@deffn {Scheme Procedure} stat:atime st
 The last access time for the file.
-@item stat:mtime
+@end deffn
+@deffn {Scheme Procedure} stat:mtime st
 The last modification time for the file.
-@item stat:ctime
+@end deffn
+@deffn {Scheme Procedure} stat:ctime st
 The last modification time for the attributes of the file.
-@item stat:blksize
-The optimal block size for reading or writing the file, in
-bytes.
-@item stat:blocks
-The amount of disk space that the file occupies measured in
-units of 512 byte blocks.
-@end table
+@end deffn
+@deffn {Scheme Procedure} stat:blksize st
+The optimal block size for reading or writing the file, in bytes.  On
+some systems this field is not available, in which case
+@code{stat:blksize} returns a sensible suggested block size.
+@end deffn
+@deffn {Scheme Procedure} stat:blocks st
+The amount of disk space that the file occupies measured in units of
+512 byte blocks.  On some systems this field is not available, in
+which case @code{stat:blocks} returns @code{#f}.
+@end deffn
 
 In addition, the following procedures return the information
-from stat:mode in a more convenient form:
+from @code{stat:mode} in a more convenient form:
 
-@table @code
-@item stat:type
+@deffn {Scheme Procedure} stat:type st
 A symbol representing the type of file.  Possible values are
-regular, directory, symlink, block-special, char-special, fifo,
-socket and unknown
-@item stat:perms
+@samp{regular}, @samp{directory}, @samp{symlink},
+@samp{block-special}, @samp{char-special}, @samp{fifo}, @samp{socket},
+and @samp{unknown}.
+@end deffn
+@deffn {Scheme Procedure} stat:perms st
 An integer representing the access permission bits.
-@end table
+@end deffn
 @end deffn
 
 @deffn {Scheme Procedure} lstat str
@@ -617,12 +712,12 @@ string), i.e., the file that the link points to.
 @findex lchown
 @deffn {Scheme Procedure} chown object owner group
 @deffnx {C Function} scm_chown (object, owner, group)
-Change the ownership and group of the file referred to by @var{object} to
-the integer values @var{owner} and @var{group}.  @var{object} can be
-a string containing a file name or, if the platform
-supports fchown, a port or integer file descriptor
-which is open on the file.  The return value
-is unspecified.
+Change the ownership and group of the file referred to by @var{object}
+to the integer values @var{owner} and @var{group}.  @var{object} can
+be a string containing a file name or, if the platform supports
+@code{fchown} (@pxref{File Owner,,,libc,The GNU C Library Reference
+Manual}), a port or integer file descriptor which is open on the file.
+The return value is unspecified.
 
 If @var{object} is a symbolic link, either the
 ownership of the link or the ownership of the referenced file will be
@@ -645,6 +740,7 @@ The return value is unspecified.
 
 @deffn {Scheme Procedure} utime pathname [actime [modtime]]
 @deffnx {C Function} scm_utime (pathname, actime, modtime)
+@cindex file times
 @code{utime} sets the access and modification times for the
 file named by @var{path}.  If @var{actime} or @var{modtime} is
 not supplied, then the current time is used.  @var{actime} and
@@ -660,12 +756,13 @@ modification time to the current time.
 @findex unlink
 @deffn {Scheme Procedure} delete-file str
 @deffnx {C Function} scm_delete_file (str)
-Deletes (or "unlinks") the file specified by @var{path}.
+Deletes (or ``unlinks'') the file whose path is specified by
+@var{str}.
 @end deffn
 
 @deffn {Scheme Procedure} copy-file oldfile newfile
 @deffnx {C Function} scm_copy_file (oldfile, newfile)
-Copy the file specified by @var{path-from} to @var{path-to}.
+Copy the file specified by @var{oldfile} to @var{newfile}.
 The return value is unspecified.
 @end deffn
 
@@ -686,16 +783,16 @@ system.
 
 @deffn {Scheme Procedure} symlink oldpath newpath
 @deffnx {C Function} scm_symlink (oldpath, newpath)
-Create a symbolic link named @var{path-to} with the value (i.e., pointing to)
-@var{path-from}.  The return value is unspecified.
+Create a symbolic link named @var{newpath} with the value (i.e., pointing to)
+@var{oldpath}.  The return value is unspecified.
 @end deffn
 
 @deffn {Scheme Procedure} mkdir path [mode]
 @deffnx {C Function} scm_mkdir (path, mode)
 Create a new directory named by @var{path}.  If @var{mode} is omitted
 then the permissions of the directory file are set using the current
-umask.  Otherwise they are set to the decimal value specified with
-@var{mode}.  The return value is unspecified.
+umask (@pxref{Processes}).  Otherwise they are set to the decimal
+value specified with @var{mode}.  The return value is unspecified.
 @end deffn
 
 @deffn {Scheme Procedure} rmdir path
@@ -706,31 +803,32 @@ be empty for this to succeed.  The return value is unspecified.
 
 @deffn {Scheme Procedure} opendir dirname
 @deffnx {C Function} scm_opendir (dirname)
-Open the directory specified by @var{path} and return a directory
+@cindex directory contents
+Open the directory specified by @var{dirname} and return a directory
 stream.
 @end deffn
 
-@deffn {Scheme Procedure} directory-stream? obj
-@deffnx {C Function} scm_directory_stream_p (obj)
+@deffn {Scheme Procedure} directory-stream? object
+@deffnx {C Function} scm_directory_stream_p (object)
 Return a boolean indicating whether @var{object} is a directory
 stream as returned by @code{opendir}.
 @end deffn
 
-@deffn {Scheme Procedure} readdir port
-@deffnx {C Function} scm_readdir (port)
+@deffn {Scheme Procedure} readdir stream
+@deffnx {C Function} scm_readdir (stream)
 Return (as a string) the next directory entry from the directory stream
 @var{stream}.  If there is no remaining entry to be read then the
 end of file object is returned.
 @end deffn
 
-@deffn {Scheme Procedure} rewinddir port
-@deffnx {C Function} scm_rewinddir (port)
+@deffn {Scheme Procedure} rewinddir stream
+@deffnx {C Function} scm_rewinddir (stream)
 Reset the directory port @var{stream} so that the next call to
 @code{readdir} will return the first directory entry.
 @end deffn
 
-@deffn {Scheme Procedure} closedir port
-@deffnx {C Function} scm_closedir (port)
+@deffn {Scheme Procedure} closedir stream
+@deffnx {C Function} scm_closedir (stream)
 Close the directory stream @var{stream}.
 The return value is unspecified.
 @end deffn
@@ -754,14 +852,15 @@ The return value is unspecified.
 
 @deffn {Scheme Procedure} mknod path type perms dev
 @deffnx {C Function} scm_mknod (path, type, perms, dev)
+@cindex device file
 Creates a new special file, such as a file corresponding to a device.
-@var{path} specifies the name of the file.  @var{type} should
-be one of the following symbols:
-regular, directory, symlink, block-special, char-special,
-fifo, or socket.  @var{perms} (an integer) specifies the file permissions.
-@var{dev} (an integer) specifies which device the special file refers
-to.  Its exact interpretation depends on the kind of special file
-being created.
+@var{path} specifies the name of the file.  @var{type} should be one
+of the following symbols: @samp{regular}, @samp{directory},
+@samp{symlink}, @samp{block-special}, @samp{char-special},
+@samp{fifo}, or @samp{socket}.  @var{perms} (an integer) specifies the
+file permissions.  @var{dev} (an integer) specifies which device the
+special file refers to.  Its exact interpretation depends on the kind
+of special file being created.
 
 E.g.,
 @lisp
@@ -773,6 +872,7 @@ The return value is unspecified.
 
 @deffn {Scheme Procedure} tmpnam
 @deffnx {C Function} scm_tmpnam ()
+@cindex temporary file
 Return a name in the file system that does not match any
 existing file.  However there is no guarantee that another
 process will not create the file after @code{tmpnam} is called.
@@ -782,11 +882,16 @@ Care should be taken if opening the file, e.g., use the
 
 @deffn {Scheme Procedure} mkstemp! tmpl
 @deffnx {C Function} scm_mkstemp (tmpl)
+@cindex temporary file
 Create a new unique file in the file system and returns a new
 buffered port open for reading and writing to the file.
+
 @var{tmpl} is a string specifying where the file should be
-created: it must end with @code{XXXXXX} and will be changed in
+created: it must end with @samp{XXXXXX} and will be changed in
 place to return the name of the temporary file.
+
+The file is created with mode @code{0600}, which means read and write
+for the owner only.  @code{chmod} can be used to change this.
 @end deffn
 
 @deffn {Scheme Procedure} dirname filename
@@ -811,7 +916,10 @@ If @var{suffix} is provided, and is equal to the end of
 
 
 @node User Information
-@section User Information
+@subsection User Information
+@cindex user information
+@cindex password file
+@cindex group file
 
 The facilities in this section provide an interface to the user and
 group database.
@@ -820,22 +928,28 @@ They should be used with care since they are not reentrant.
 The following functions accept an object representing user information
 and return a selected component:
 
-@table @code
-@item passwd:name
+@deffn {Scheme Procedure} passwd:name pw
 The name of the userid.
-@item passwd:passwd
+@end deffn
+@deffn {Scheme Procedure} passwd:passwd pw
 The encrypted passwd.
-@item passwd:uid
+@end deffn
+@deffn {Scheme Procedure} passwd:uid pw
 The user id number.
-@item passwd:gid
+@end deffn
+@deffn {Scheme Procedure} passwd:gid pw
 The group id number.
-@item passwd:gecos
+@end deffn
+@deffn {Scheme Procedure} passwd:gecos pw
 The full name.
-@item passwd:dir
+@end deffn
+@deffn {Scheme Procedure} passwd:dir pw
 The home directory.
-@item passwd:shell
+@end deffn
+@deffn {Scheme Procedure} passwd:shell pw
 The login shell.
-@end table
+@end deffn
+@sp 1
 
 @deffn {Scheme Procedure} getpwuid uid
 Look up an integer userid in the user database.
@@ -877,16 +991,19 @@ or getpwent respectively.
 The following functions accept an object representing group information
 and return a selected component:
 
-@table @code
-@item group:name
+@deffn {Scheme Procedure} group:name gr
 The group name.
-@item group:passwd
+@end deffn
+@deffn {Scheme Procedure} group:passwd gr
 The encrypted group password.
-@item group:gid
+@end deffn
+@deffn {Scheme Procedure} group:gid gr
 The group id number.
-@item group:mem
+@end deffn
+@deffn {Scheme Procedure} group:mem gr
 A list of userids which have this group as a supplementary group.
-@end table
+@end deffn
+@sp 1
 
 @deffn {Scheme Procedure} getgrgid gid
 Look up an integer group id in the group database.
@@ -934,6 +1051,10 @@ following shortcut procedures are also available.
 Return a string containing a user name associated with the
 effective user id of the process.  Return @code{#f} if this
 information cannot be obtained.
+
+This function has been removed from the latest POSIX specification,
+Guile provides it only if the system has it.  Using @code{(getpwuid
+(geteuid))} may be a better idea.
 @end deffn
 
 @deffn {Scheme Procedure} getlogin
@@ -945,18 +1066,19 @@ information cannot be obtained.
 
 
 @node Time
-@section Time
+@subsection Time
+@cindex time
 
 @deffn {Scheme Procedure} current-time
 @deffnx {C Function} scm_current_time ()
-Return the number of seconds since 1970-01-01 00:00:00 UTC,
+Return the number of seconds since 1970-01-01 00:00:00 @acronym{UTC},
 excluding leap seconds.
 @end deffn
 
 @deffn {Scheme Procedure} gettimeofday
 @deffnx {C Function} scm_gettimeofday ()
 Return a pair containing the number of seconds and microseconds
-since 1970-01-01 00:00:00 UTC, excluding leap seconds.  Note:
+since 1970-01-01 00:00:00 @acronym{UTC}, excluding leap seconds.  Note:
 whether true microsecond resolution is available depends on the
 operating system.
 @end deffn
@@ -966,63 +1088,86 @@ time and return a selected component, or accept an object representing
 a broken down time and a value and set the component to the value.
 The numbers in parentheses give the usual range.
 
-@table @code
-@item tm:sec, set-tm:sec
+@deffn {Scheme Procedure} tm:sec tm
+@deffnx {Scheme Procedure} set-tm:sec tm val
 Seconds (0-59).
-@item tm:min, set-tm:min
+@end deffn
+@deffn {Scheme Procedure} tm:min tm
+@deffnx {Scheme Procedure} set-tm:min tm val
 Minutes (0-59).
-@item tm:hour, set-tm:hour
+@end deffn
+@deffn {Scheme Procedure} tm:hour tm
+@deffnx {Scheme Procedure} set-tm:hour tm val
 Hours (0-23).
-@item tm:mday, set-tm:mday
+@end deffn
+@deffn {Scheme Procedure} tm:mday tm
+@deffnx {Scheme Procedure} set-tm:mday tm val
 Day of the month (1-31).
-@item tm:mon, set-tm:mon
+@end deffn
+@deffn {Scheme Procedure} tm:mon tm
+@deffnx {Scheme Procedure} set-tm:mon tm val
 Month (0-11).
-@item tm:year, set-tm:year
+@end deffn
+@deffn {Scheme Procedure} tm:year tm
+@deffnx {Scheme Procedure} set-tm:year tm val
 Year (70-), the year minus 1900.
-@item tm:wday, set-tm:wday
+@end deffn
+@deffn {Scheme Procedure} tm:wday tm
+@deffnx {Scheme Procedure} set-tm:wday tm val
 Day of the week (0-6) with Sunday represented as 0.
-@item tm:yday, set-tm:yday
+@end deffn
+@deffn {Scheme Procedure} tm:yday tm
+@deffnx {Scheme Procedure} set-tm:yday tm val
 Day of the year (0-364, 365 in leap years).
-@item tm:isdst, set-tm:isdst
-Daylight saving indicator (0 for "no", greater than 0 for "yes", less than
-0 for "unknown").
-@item tm:gmtoff, set-tm:gmtoff
-Time zone offset in seconds west of UTC (-46800 to 43200).
-@item tm:zone, set-tm:zone
+@end deffn
+@deffn {Scheme Procedure} tm:isdst tm
+@deffnx {Scheme Procedure} set-tm:isdst tm val
+Daylight saving indicator (0 for ``no'', greater than 0 for ``yes'', less than
+0 for ``unknown'').
+@end deffn
+@deffn {Scheme Procedure} tm:gmtoff tm
+@deffnx {Scheme Procedure} set-tm:gmtoff tm val
+Time zone offset in seconds west of @acronym{UTC} (-46800 to 43200).
+@end deffn
+@deffn {Scheme Procedure} tm:zone tm
+@deffnx {Scheme Procedure} set-tm:zone tm val
 Time zone label (a string), not necessarily unique.
-@end table
+@end deffn
+@sp 1
 
 @deffn {Scheme Procedure} localtime time [zone]
 @deffnx {C Function} scm_localtime (time, zone)
+@cindex local time
 Return an object representing the broken down components of
 @var{time}, an integer like the one returned by
 @code{current-time}.  The time zone for the calculation is
 optionally specified by @var{zone} (a string), otherwise the
-@code{TZ} environment variable or the system default is used.
+@env{TZ} environment variable or the system default is used.
 @end deffn
 
 @deffn {Scheme Procedure} gmtime time
 @deffnx {C Function} scm_gmtime (time)
 Return an object representing the broken down components of
 @var{time}, an integer like the one returned by
-@code{current-time}.  The values are calculated for UTC.
+@code{current-time}.  The values are calculated for @acronym{UTC}.
 @end deffn
 
-@deffn {Scheme Procedure} mktime sbd_time [zone]
+@deffn {Scheme Procedure} mktime sbd-time [zone]
 @deffnx {C Function} scm_mktime (sbd_time, zone)
-@var{bd-time} is an object representing broken down time and @code{zone}
-is an optional time zone specifier (otherwise the TZ environment variable
-or the system default is used).
+@var{sbd-time} is an object representing broken down time and
+@code{zone} is an optional time zone specifier (otherwise the @env{TZ}
+environment variable or the system default is used).
 
-Returns a pair: the car is a corresponding
-integer time value like that returned
-by @code{current-time}; the cdr is a broken down time object, similar to
-as @var{bd-time} but with normalized values.
+Returns a pair: the @acronym{CAR} is a corresponding integer time
+value like that returned by @code{current-time}; the @acronym{CDR} is
+a broken down time object, similar to @var{sbd-time} but with
+normalized values; i.e.@: with corrected @code{tm:wday} and
+@code{tm:yday} fields.
 @end deffn
 
 @deffn {Scheme Procedure} tzset
 @deffnx {C Function} scm_tzset ()
-Initialize the timezone from the TZ environment variable
+Initialize the timezone from the @env{TZ} environment variable
 or the system default.  It's not usually necessary to call this procedure
 since it's done automatically by other procedures that depend on the
 timezone.
@@ -1030,13 +1175,14 @@ timezone.
 
 @deffn {Scheme Procedure} strftime format stime
 @deffnx {C Function} scm_strftime (format, stime)
+@cindex time formatting
 Formats a time specification @var{time} using @var{template}.  @var{time}
 is an object with time components in the form returned by @code{localtime}
 or @code{gmtime}.  @var{template} is a string which can include formatting
-specifications introduced by a @code{%} character.  The formatting of
+specifications introduced by a @samp{%} character.  The formatting of
 month and day names is dependent on the current locale.  The value returned
 is the formatted string.
-@xref{Formatting Date and Time, , , libc, The GNU C Library Reference Manual}.)
+@xref{Formatting Calendar Time, , , libc, The GNU C Library Reference Manual}.
 
 @lisp
 (strftime "%c" (localtime (current-time)))
@@ -1046,15 +1192,16 @@ is the formatted string.
 
 @deffn {Scheme Procedure} strptime format string
 @deffnx {C Function} scm_strptime (format, string)
+@cindex time parsing
 Performs the reverse action to @code{strftime}, parsing
 @var{string} according to the specification supplied in
 @var{template}.  The interpretation of month and day names is
 dependent on the current locale.  The value returned is a pair.
-The car has an object with time components
+The @acronym{CAR} has an object with time components
 in the form returned by @code{localtime} or @code{gmtime},
 but the time zone components
 are not usefully set.
-The cdr reports the number of characters from @var{string}
+The @acronym{CDR} reports the number of characters from @var{string}
 which were used for the conversion.
 @end deffn
 
@@ -1069,23 +1216,26 @@ Return an object with information about real and processor
 time.  The following procedures accept such an object as an
 argument and return a selected component:
 
-@table @code
-@item tms:clock
+@deffn {Scheme Procedure} tms:clock tms
 The current real time, expressed as time units relative to an
 arbitrary base.
-@item tms:utime
+@end deffn
+@deffn {Scheme Procedure} tms:utime tms
 The CPU time units used by the calling process.
-@item tms:stime
+@end deffn
+@deffn {Scheme Procedure} tms:stime tms
 The CPU time units used by the system on behalf of the calling
 process.
-@item tms:cutime
+@end deffn
+@deffn {Scheme Procedure} tms:cutime tms
 The CPU time units used by terminated child processes of the
 calling process, whose status has been collected (e.g., using
 @code{waitpid}).
-@item tms:cstime
+@end deffn
+@deffn {Scheme Procedure} tms:cstime tms
 Similarly, the CPU times units used by the system on behalf of
 terminated child processes.
-@end table
+@end deffn
 @end deffn
 
 @deffn {Scheme Procedure} get-internal-real-time
@@ -1102,11 +1252,13 @@ included but subprocesses are not.
 @end deffn
 
 @node Runtime Environment
-@section Runtime Environment
+@subsection Runtime Environment
 
 @deffn {Scheme Procedure} program-arguments
 @deffnx {Scheme Procedure} command-line
 @deffnx {C Function} scm_program_arguments ()
+@cindex command line
+@cindex program arguments
 Return the list of command line arguments passed to Guile, as a list of
 strings.  The list includes the invoked program name, which is usually
 @code{"guile"}, but excludes switches and parameters for command line
@@ -1115,6 +1267,7 @@ options like @code{-e} and @code{-l}.
 
 @deffn {Scheme Procedure} getenv nam
 @deffnx {C Function} scm_getenv (nam)
+@cindex environment
 Looks up the string @var{name} in the current environment.  The return
 value is @code{#f} unless a string of the form @code{NAME=VALUE} is
 found, in which case the string @code{VALUE} is returned.
@@ -1143,8 +1296,8 @@ If @var{env} is omitted, return the current environment (in the
 Unix sense) as a list of strings.  Otherwise set the current
 environment, which is also the default environment for child
 processes, to the supplied list of strings.  Each member of
-@var{env} should be of the form @code{NAME=VALUE} and values of
-@code{NAME} should not be duplicated.  If @var{env} is supplied
+@var{env} should be of the form @var{NAME}=@var{VALUE} and values of
+@var{NAME} should not be duplicated.  If @var{env} is supplied
 then the return value is unspecified.
 @end deffn
 
@@ -1165,11 +1318,14 @@ The return value is unspecified.
 
 
 @node Processes
-@section Processes
+@subsection Processes
+@cindex processes
+@cindex child processes
 
 @findex cd
 @deffn {Scheme Procedure} chdir str
 @deffnx {C Function} scm_chdir (str)
+@cindex current directory
 Change the current working directory to @var{path}.
 The return value is unspecified.
 @end deffn
@@ -1182,11 +1338,13 @@ Return the name of the current working directory.
 
 @deffn {Scheme Procedure} umask [mode]
 @deffnx {C Function} scm_umask (mode)
-If @var{mode} is omitted, returns a decimal number representing the current
-file creation mask.  Otherwise the file creation mask is set to
-@var{mode} and the previous value is returned.
+If @var{mode} is omitted, returns a decimal number representing the
+current file creation mask.  Otherwise the file creation mask is set
+to @var{mode} and the previous value is returned. @xref{Setting
+Permissions,,Assigning File Permissions,libc,The GNU C Library
+Reference Manual}, for more on how to use umasks.
 
-E.g., @code{(umask #o022)} sets the mask to octal 22decimal 18.
+E.g., @code{(umask #o022)} sets the mask to octal 22/decimal 18.
 @end deffn
 
 @deffn {Scheme Procedure} chroot path
@@ -1241,6 +1399,16 @@ is returned.  @code{(provided? 'EIDs)} reports whether the
 system supports effective IDs.
 @end deffn
 
+@deffn {Scheme Procedure} setgroups vec
+@deffnx {C Function} scm_setgroups (vec)
+Set the current set of supplementary group IDs to the integers in the
+given vector @var{vec}.  The return value is unspecified.
+
+Generally only the superuser can set the process group IDs
+(@pxref{Setting Groups, Setting the Group IDs,, libc, The GNU C
+Library Reference Manual}).
+@end deffn
+
 @deffn {Scheme Procedure} setuid id
 @deffnx {C Function} scm_setuid (id)
 Sets both the real and effective user IDs to the integer @var{id}, provided
@@ -1259,7 +1427,7 @@ The return value is unspecified.
 @deffnx {C Function} scm_seteuid (id)
 Sets the effective user ID to the integer @var{id}, provided the process
 has appropriate privileges.  If effective IDs are not supported, the
-real ID is set instead -- @code{(provided? 'EIDs)} reports whether the
+real ID is set instead---@code{(provided? 'EIDs)} reports whether the
 system supports effective IDs.
 The return value is unspecified.
 @end deffn
@@ -1268,7 +1436,7 @@ The return value is unspecified.
 @deffnx {C Function} scm_setegid (id)
 Sets the effective group ID to the integer @var{id}, provided the process
 has appropriate privileges.  If effective IDs are not supported, the
-real ID is set instead -- @code{(provided? 'EIDs)} reports whether the
+real ID is set instead---@code{(provided? 'EIDs)} reports whether the
 system supports effective IDs.
 The return value is unspecified.
 @end deffn
@@ -1276,7 +1444,7 @@ The return value is unspecified.
 @deffn {Scheme Procedure} getpgrp
 @deffnx {C Function} scm_getpgrp ()
 Return an integer representing the current process group ID.
-This is the POSIX definition, not BSD.
+This is the @acronym{POSIX} definition, not @acronym{BSD}.
 @end deffn
 
 @deffn {Scheme Procedure} setpgid pid pgid
@@ -1305,17 +1473,19 @@ child process is eligible then one will be chosen by the operating system.
 
 The value of @var{pid} determines the behaviour:
 
-@table @r
+@table @asis
 @item @var{pid} greater than 0
 Request status information from the specified child process.
-@item @var{pid} equal to -1 or WAIT_ANY
+@item @var{pid} equal to -1 or @code{WAIT_ANY}
+@vindex WAIT_ANY
 Request status information for any child process.
-@item @var{pid} equal to 0 or WAIT_MYPGRP
+@item @var{pid} equal to 0 or @code{WAIT_MYPGRP}
+@vindex WAIT_MYPGRP
 Request status information for any child process in the current process
 group.
 @item @var{pid} less than -1
 Request status information for any child process whose process group ID
-is -@var{PID}.
+is @minus{}@var{pid}.
 @end table
 
 The @var{options} argument, if supplied, should be the bitwise OR of the
@@ -1366,8 +1536,8 @@ otherwise @code{#f}.
 
 @deffn {Scheme Procedure} system [cmd]
 @deffnx {C Function} scm_system (cmd)
-Execute @var{cmd} using the operating system's "command
-processor".  Under Unix this is usually the default shell
+Execute @var{cmd} using the operating system's ``command
+processor''.  Under Unix this is usually the default shell
 @code{sh}.  The value returned is @var{cmd}'s exit status as
 returned by @code{waitpid}, which can be interpreted using the
 functions above.
@@ -1376,6 +1546,26 @@ If @code{system} is called without arguments, return a boolean
 indicating whether the command processor is available.
 @end deffn
 
+@deffn {Scheme Procedure} system* . args
+@deffnx {C Function} scm_system_star (args)
+Execute the command indicated by @var{args}.  The first element must
+be a string indicating the command to be executed, and the remaining
+items must be strings representing each of the arguments to that
+command.
+
+This function returns the exit status of the command as provided by
+@code{waitpid}.  This value can be handled with @code{status:exit-val}
+and the related functions.
+
+@code{system*} is similar to @code{system}, but accepts only one
+string per-argument, and performs no shell interpretation.  The
+command is executed using fork and execlp.  Accordingly this function
+may be safer than @code{system} in situations where shell
+interpretation is not required.
+
+Example: (system* "echo" "foo" "bar")
+@end deffn
+
 @deffn {Scheme Procedure} primitive-exit [status]
 @deffnx {C Function} scm_primitive_exit (status)
 Terminate the current process without unwinding the Scheme stack.
@@ -1421,7 +1611,7 @@ call, but we call it @code{execle} because of its Scheme calling interface.
 
 @deffn {Scheme Procedure} primitive-fork
 @deffnx {C Function} scm_fork ()
-Creates a new "child" process by duplicating the current "parent" process.
+Creates a new ``child'' process by duplicating the current ``parent'' process.
 In the child the return value is 0.  In the parent the return value is
 the integer process ID of the child.
 
@@ -1431,6 +1621,7 @@ with the scsh fork.
 
 @deffn {Scheme Procedure} nice incr
 @deffnx {C Function} scm_nice (incr)
+@cindex process priority
 Increment the priority of the current process by @var{incr}.  A higher
 priority value means that the process runs less often.
 The return value is unspecified.
@@ -1438,6 +1629,9 @@ The return value is unspecified.
 
 @deffn {Scheme Procedure} setpriority which who prio
 @deffnx {C Function} scm_setpriority (which, who, prio)
+@vindex PRIO_PROCESS
+@vindex PRIO_PGRP
+@vindex PRIO_USER
 Set the scheduling priority of the process, process group
 or user, as indicated by @var{which} and @var{who}. @var{which}
 is one of the variables @code{PRIO_PROCESS}, @code{PRIO_PGRP}
@@ -1446,22 +1640,25 @@ or @code{PRIO_USER}, and @var{who} is interpreted relative to
 process group identifier for @code{PRIO_PGRP}, and a user
 identifier for @code{PRIO_USER}.  A zero value of @var{who}
 denotes the current process, process group, or user.
-@var{prio} is a value in the range -20 and 20, the default
-priority is 0; lower priorities cause more favorable
-scheduling.  Sets the priority of all of the specified
-processes.  Only the super-user may lower priorities.
-The return value is not specified.
+@var{prio} is a value in the range [@minus{}20,20].  The default
+priority is 0; lower priorities (in numerical terms) cause more
+favorable scheduling.  Sets the priority of all of the specified
+processes.  Only the super-user may lower priorities.  The return
+value is not specified.
 @end deffn
 
 @deffn {Scheme Procedure} getpriority which who
 @deffnx {C Function} scm_getpriority (which, who)
+@vindex PRIO_PROCESS
+@vindex PRIO_PGRP
+@vindex PRIO_USER
 Return the scheduling priority of the process, process group
 or user, as indicated by @var{which} and @var{who}. @var{which}
 is one of the variables @code{PRIO_PROCESS}, @code{PRIO_PGRP}
-or @code{PRIO_USER}, and @var{who} is interpreted relative to
+or @code{PRIO_USER}, and @var{who} should be interpreted depending on
 @var{which} (a process identifier for @code{PRIO_PROCESS},
 process group identifier for @code{PRIO_PGRP}, and a user
-identifier for @code{PRIO_USER}.  A zero value of @var{who}
+identifier for @code{PRIO_USER}).  A zero value of @var{who}
 denotes the current process, process group, or user.  Return
 the highest priority (lowest numerical value) of any of the
 specified processes.
@@ -1469,7 +1666,8 @@ specified processes.
 
 
 @node Signals
-@section Signals
+@subsection Signals
+@cindex signal
 
 Procedures to raise, handle and wait for signals.
 
@@ -1479,7 +1677,7 @@ Sends a signal to the specified process or group of processes.
 
 @var{pid} specifies the processes to which the signal is sent:
 
-@table @r
+@table @asis
 @item @var{pid} greater than 0
 The process whose identifier is @var{pid}.
 @item @var{pid} equal to 0
@@ -1502,39 +1700,48 @@ Hang-up signal.
 @defvar SIGINT
 Interrupt signal.
 @end defvar
+
+A full list of signals on the GNU system may be found in @ref{Standard
+Signals,,,libc,The GNU C Library Reference Manual}.
 @end deffn
 
 @deffn {Scheme Procedure} raise sig
 @deffnx {C Function} scm_raise (sig)
 Sends a specified signal @var{sig} to the current process, where
-@var{sig} is as described for the kill procedure.
+@var{sig} is as described for the @code{kill} procedure.
 @end deffn
 
-@deffn {Scheme Procedure} sigaction signum [handler [flags]]
+@deffn {Scheme Procedure} sigaction signum [handler [flags [thread]]]
 @deffnx {C Function} scm_sigaction (signum, handler, flags)
+@deffnx {C Function} scm_sigaction_for_thread (signum, handler, flags, thread)
 Install or report the signal handler for a specified signal.
 
 @var{signum} is the signal number, which can be specified using the value
 of variables such as @code{SIGINT}.
 
-If @var{action} is omitted, @code{sigaction} returns a pair: the
-CAR is the current
-signal hander, which will be either an integer with the value @code{SIG_DFL}
-(default action) or @code{SIG_IGN} (ignore), or the Scheme procedure which
-handles the signal, or @code{#f} if a non-Scheme procedure handles the
-signal.  The CDR contains the current @code{sigaction} flags for the handler.
+If @var{handler} is omitted, @code{sigaction} returns a pair: the
+@acronym{CAR} is the current signal hander, which will be either an
+integer with the value @code{SIG_DFL} (default action) or
+@code{SIG_IGN} (ignore), or the Scheme procedure which handles the
+signal, or @code{#f} if a non-Scheme procedure handles the signal.
+The @acronym{CDR} contains the current @code{sigaction} flags for the
+handler.
 
-If @var{action} is provided, it is installed as the new handler for
-@var{signum}.  @var{action} can be a Scheme procedure taking one
+If @var{handler} is provided, it is installed as the new handler for
+@var{signum}.  @var{handler} can be a Scheme procedure taking one
 argument, or the value of @code{SIG_DFL} (default action) or
 @code{SIG_IGN} (ignore), or @code{#f} to restore whatever signal handler
-was installed before @code{sigaction} was first used.  Flags can
-optionally be specified for the new handler (@code{SA_RESTART} will
-always be added if it's available and the system is using restartable
-system calls.)  The return value is a pair with information about the
-old handler as described above.
+was installed before @code{sigaction} was first used.  When a scheme
+procedure has been specified, that procedure will run in the given
+@var{thread}.  When no thread has been given, the thread that made this
+call to @code{sigaction} is used.
 
-This interface does not provide access to the "signal blocking"
+Flags can optionally be specified for the new handler (@code{SA_RESTART}
+will always be added if it's available and the system is using
+restartable system calls.)  The return value is a pair with information
+about the old handler as described above.
+
+This interface does not provide access to the ``signal blocking''
 facility.  Maybe this is not needed, since the thread support may
 provide solutions to the problem of consistent access to data
 structures.
@@ -1575,8 +1782,8 @@ of seconds remaining otherwise.
 
 @deffn {Scheme Procedure} usleep i
 @deffnx {C Function} scm_usleep (i)
-Sleep for I microseconds.  @code{usleep} is not available on
-all platforms.
+Sleep for @var{i} microseconds.  @code{usleep} is not available on
+all platforms. [FIXME: so what happens when it isn't?]
 @end deffn
 
 @deffn {Scheme Procedure} setitimer which_timer interval_seconds interval_microseconds value_seconds value_microseconds
@@ -1586,8 +1793,6 @@ Set the timer specified by @var{which_timer} according to the given
 @var{value_seconds}, and @var{value_microseconds} values.
 
 Return information about the timer's previous setting.
-Errors are handled as described in the guile info pages under ``POSIX
-Interface Conventions''.
 
 The timers available are: @code{ITIMER_REAL}, @code{ITIMER_VIRTUAL},
 and @code{ITIMER_PROF}.
@@ -1600,9 +1805,7 @@ the seconds and microseconds of the timer @code{it_value}.
 
 @deffn {Scheme Procedure} getitimer which_timer
 @deffnx {C Function} scm_getitimer (which_timer)
-Return information about the timer specified by @var{which_timer}
-Errors are handled as described in the guile info pages under ``POSIX
-Interface Conventions''.
+Return information about the timer specified by @var{which_timer}.
 
 The timers available are: @code{ITIMER_REAL}, @code{ITIMER_VIRTUAL},
 and @code{ITIMER_PROF}.
@@ -1615,28 +1818,32 @@ the seconds and microseconds of the timer @code{it_value}.
 
 
 @node Terminals and Ptys
-@section Terminals and Ptys
+@subsection Terminals and Ptys
 
 @deffn {Scheme Procedure} isatty? port
 @deffnx {C Function} scm_isatty_p (port)
+@cindex terminal
 Return @code{#t} if @var{port} is using a serial non--file
 device, otherwise @code{#f}.
 @end deffn
 
 @deffn {Scheme Procedure} ttyname port
 @deffnx {C Function} scm_ttyname (port)
+@cindex terminal
 Return a string with the name of the serial terminal device
 underlying @var{port}.
 @end deffn
 
 @deffn {Scheme Procedure} ctermid
 @deffnx {C Function} scm_ctermid ()
+@cindex terminal
 Return a string containing the file name of the controlling
 terminal for the current process.
 @end deffn
 
 @deffn {Scheme Procedure} tcgetpgrp port
 @deffnx {C Function} scm_tcgetpgrp (port)
+@cindex process group
 Return the process group ID of the foreground process group
 associated with the terminal open on the file descriptor
 underlying @var{port}.
@@ -1651,6 +1858,7 @@ foreground.
 
 @deffn {Scheme Procedure} tcsetpgrp port pgid
 @deffnx {C Function} scm_tcsetpgrp (port, pgid)
+@cindex process group
 Set the foreground process group ID for the terminal used by the file
 descriptor underlying @var{port} to the integer @var{pgid}.
 The calling process
@@ -1659,10 +1867,11 @@ controlling terminal.  The return value is unspecified.
 @end deffn
 
 @node Pipes
-@section Pipes
+@subsection Pipes
+@cindex pipe
 
-The following procedures provide an interface to the @code{popen} and
-@code{pclose} system routines.  The code is in a separate "popen"
+The following procedures are similar to the @code{popen} and
+@code{pclose} system routines.  The code is in a separate ``popen''
 module:
 
 @smalllisp
@@ -1670,41 +1879,100 @@ module:
 @end smalllisp
 
 @findex popen
-@deffn {Scheme Procedure} open-pipe command modes
-Executes the shell command @var{command} (a string) in a subprocess.
-A pipe to the process is created and returned.  @var{modes} specifies
-whether an input or output pipe to the process is created: it should
-be the value of @code{OPEN_READ} or @code{OPEN_WRITE}.
+@deffn {Scheme Procedure} open-pipe command mode
+@deffnx {Scheme Procedure} open-pipe* mode prog [args...]
+Execute a command in a subprocess, with a pipe to it or from it, or
+with pipes in both directions.
+
+@code{open-pipe} runs the shell @var{command} using @samp{/bin/sh -c}.
+@code{open-pipe*} executes @var{prog} directly, with the optional
+@var{args} arguments (all strings).
+
+@var{mode} should be one of the following values.  @code{OPEN_READ} is
+an input pipe, ie.@: to read from the subprocess.  @code{OPEN_WRITE}
+is an output pipe, ie.@: to write to it.
+
+@defvar OPEN_READ
+@defvarx OPEN_WRITE
+@defvarx OPEN_BOTH
+@end defvar
+
+For an input pipe, the child's standard output is the pipe and
+standard input is inherited from @code{current-input-port}.  For an
+output pipe, the child's standard input is the pipe and standard
+output is inherited from @code{current-output-port}.  In all cases
+cases the child's standard error is inherited from
+@code{current-error-port} (@pxref{Default Ports}).
+
+If those @code{current-X-ports} are not files of some kind, and hence
+don't have file descriptors for the child, then @file{/dev/null} is
+used instead.
+
+Care should be taken with @code{OPEN_BOTH}, a deadlock will occur if
+both parent and child are writing, and waiting until the write
+completes before doing any reading.  Each direction has
+@code{PIPE_BUF} bytes of buffering (@pxref{Ports and File
+Descriptors}), which will be enough for small writes, but not for say
+putting a big file through a filter.
 @end deffn
 
 @deffn {Scheme Procedure} open-input-pipe command
 Equivalent to @code{open-pipe} with mode @code{OPEN_READ}.
 
 @lisp
-(read-line (open-input-pipe "date"))
-@result{} "Mon Mar 11 20:10:44 GMT 2002"
-
-(waitpid WAIT_ANY)
-@result{} (24160 . 0)
+(let* ((port (open-input-pipe "date --utc"))
+       (str  (read-line port)))
+  (close-pipe port)
+  str)
+@result{} "Mon Mar 11 20:10:44 UTC 2002"
 @end lisp
 @end deffn
 
 @deffn {Scheme Procedure} open-output-pipe command
 Equivalent to @code{open-pipe} with mode @code{OPEN_WRITE}.
+
+@lisp
+(let ((port (open-output-pipe "lpr")))
+  (display "Something for the line printer.\n" port)
+  (if (not (eqv? 0 (status:exit-val (close-pipe port))))
+      (error "Cannot print")))
+@end lisp
+@end deffn
+
+@deffn {Scheme Procedure} open-input-output-pipe command
+Equivalent to @code{open-pipe} with mode @code{OPEN_BOTH}.
 @end deffn
 
 @findex pclose
 @deffn {Scheme Procedure} close-pipe port
-Closes the pipe created by @code{open-pipe}, then waits for the process
-to terminate and returns its status value, @xref{Processes, waitpid}, for
-information on how to interpret this value.
-
-@code{close-port} (@pxref{Closing, close-port}) can also be used to
-close a pipe, but doesn't return the status.
+Close a pipe created by @code{open-pipe}, wait for the process to
+terminate, and return the wait status code.  The status is as per
+@code{waitpid} and can be decoded with @code{status:exit-val} etc
+(@pxref{Processes})
 @end deffn
 
+@sp 1
+@code{waitpid WAIT_ANY} should not be used when pipes are open, since
+it can reap a pipe's child process, causing an error from a subsequent
+@code{close-pipe}.
+
+@code{close-port} (@pxref{Closing}) can close a pipe, but it doesn't
+reap the child process.
+
+The garbage collector will close a pipe no longer in use, and reap the
+child process with @code{waitpid}.  If the child hasn't yet terminated
+the garbage collector doesn't block, but instead checks again in the
+next GC.
+
+Many systems have per-user and system-wide limits on the number of
+processes, and a system-wide limit on the number of pipes, so pipes
+should be closed explicitly when no longer needed, rather than letting
+the garbage collector pick them up at some later time.
+
+
 @node Networking
-@section Networking
+@subsection Networking
+@cindex network
 
 @menu
 * Network Address Conversion::
@@ -1714,12 +1982,37 @@ close a pipe, but doesn't return the status.
 @end menu
 
 @node Network Address Conversion
-@subsection Network Address Conversion
+@subsubsection Network Address Conversion
+@cindex network address
 
 This section describes procedures which convert internet addresses
 between numeric and string formats.
 
-@subsubsection IPv4 Address Conversion
+@subsubheading IPv4 Address Conversion
+@cindex IPv4
+
+An IPv4 Internet address is a 4-byte value, represented in Guile as an
+integer in network byte order (meaning the first byte is the most
+significant in the number).
+
+@defvar INADDR_LOOPBACK
+The address of the local host using the loopback device, ie.@:
+@samp{127.0.0.1}.
+@end defvar
+
+@defvar INADDR_BROADCAST
+The broadcast address on the local network.
+@end defvar
+
+@c  INADDR_NONE is defined in the code, but serves no purpose.
+@c  inet_addr() returns it as an error indication, but that function
+@c  isn't provided, for the good reason that inet_aton() does the same
+@c  job and gives an unambiguous error indication.  (INADDR_NONE is a
+@c  valid 4-byte value, in glibc it's the same as INADDR_BROADCAST.)
+@c
+@c  @defvar INADDR_NONE
+@c  No address.
+@c  @end defvar
 
 @deffn {Scheme Procedure} inet-aton address
 @deffnx {C Function} scm_inet_aton (address)
@@ -1773,7 +2066,8 @@ Make an IPv4 Internet address by combining the network number
 @end lisp
 @end deffn
 
-@subsubsection IPv6 Address Conversion
+@subsubheading IPv6 Address Conversion
+@cindex IPv6
 
 @deffn {Scheme Procedure} inet-ntop family address
 @deffnx {C Function} scm_inet_ntop (family, address)
@@ -1805,13 +2099,16 @@ the result is an integer with normal host byte ordering.
 
 
 @node Network Databases
-@subsection Network Databases
+@subsubsection Network Databases
+@cindex network database
 
 This section describes procedures which query various network databases.
 Care should be taken when using the database routines since they are not
 reentrant.
 
-@subsubsection The Host Database
+@subsubheading The Host Database
+@cindex @file{/etc/hosts}
+@cindex network database
 
 A @dfn{host object} is a structure that represents what is known about a
 network host, and is the usual way of representing a system's network
@@ -1821,7 +2118,7 @@ The following functions accept a host object and return a selected
 component:
 
 @deffn {Scheme Procedure} hostent:name host
-The "official" hostname for @var{host}.
+The ``official'' hostname for @var{host}.
 @end deffn
 @deffn {Scheme Procedure} hostent:aliases host
 A list of aliases for @var{host}.
@@ -1889,13 +2186,15 @@ Close the stream used by @code{gethostent}.  The return value is unspecified.
 If @var{stayopen} is omitted, this is equivalent to @code{endhostent}.
 Otherwise it is equivalent to @code{sethostent stayopen}.
 @end deffn
-@subsubsection The Network Database
+
+@subsubheading The Network Database
+@cindex network database
 
 The following functions accept an object representing a network
 and return a selected component:
 
 @deffn {Scheme Procedure} netent:name net
-The "official" network name.
+The ``official'' network name.
 @end deffn
 @deffn {Scheme Procedure} netent:aliases net
 A list of aliases for the network.
@@ -1947,13 +2246,16 @@ If @var{stayopen} is omitted, this is equivalent to @code{endnetent}.
 Otherwise it is equivalent to @code{setnetent stayopen}.
 @end deffn
 
-@subsubsection The Protocol Database
+@subsubheading The Protocol Database
+@cindex @file{/etc/protocols}
+@cindex protocols
+@cindex network protocols
 
 The following functions accept an object representing a protocol
 and return a selected component:
 
 @deffn {Scheme Procedure} protoent:name protocol
-The "official" protocol name.
+The ``official'' protocol name.
 @end deffn
 @deffn {Scheme Procedure} protoent:aliases protocol
 A list of aliases for the protocol.
@@ -2000,13 +2302,16 @@ If @var{stayopen} is omitted, this is equivalent to @code{endprotoent}.
 Otherwise it is equivalent to @code{setprotoent stayopen}.
 @end deffn
 
-@subsubsection The Service Database
+@subsubheading The Service Database
+@cindex @file{/etc/services}
+@cindex services
+@cindex network services
 
 The following functions accept an object representing a service
 and return a selected component:
 
 @deffn {Scheme Procedure} servent:name serv
-The "official" name of the network service.
+The ``official'' name of the network service.
 @end deffn
 @deffn {Scheme Procedure} servent:aliases serv
 A list of aliases for the network service.
@@ -2070,42 +2375,65 @@ Otherwise it is equivalent to @code{setservent stayopen}.
 @end deffn
 
 @node Network Sockets and Communication
-@subsection Network Sockets and Communication
+@subsubsection Network Sockets and Communication
+@cindex socket
+@cindex network socket
 
 Socket ports can be created using @code{socket} and @code{socketpair}.
 The ports are initially unbuffered, to make reading and writing to the
 same port more reliable.  A buffer can be added to the port using
-@code{setvbuf}, @xref{Ports and File Descriptors}.
+@code{setvbuf}; see @ref{Ports and File Descriptors}.
+
+Most systems have limits on how many files and sockets can be open, so
+it's strongly recommended that socket ports be closed explicitly when
+no longer required (@pxref{Ports}).
 
-The convention used for "host" vs "network" addresses is that addresses
-are always held in host order at the Scheme level.  The procedures in
-this section automatically convert between host and network order when
-required.  The arguments and return values are thus in host order.
+The convention used for ``host'' vs.@: ``network'' addresses is that
+addresses are always held in host order at the Scheme level.  The
+procedures in this section automatically convert between host and
+network order when required.  The arguments and return values are thus
+in host order.
 
 @deffn {Scheme Procedure} socket family style proto
 @deffnx {C Function} scm_socket (family, style, proto)
 Return a new socket port of the type specified by @var{family},
-@var{style} and @var{proto}.  All three parameters are
-integers.  Supported values for @var{family} are
-@code{AF_UNIX}, @code{AF_INET} and @code{AF_INET6}.
-Typical values for @var{style} are @code{SOCK_STREAM},
-@code{SOCK_DGRAM} and @code{SOCK_RAW}.
+@var{style} and @var{proto}.  All three parameters are integers.  The
+possible values for @var{family} are as follows, where supported by
+the system,
+
+@defvar PF_UNIX
+@defvarx PF_INET
+@defvarx PF_INET6
+@end defvar
+
+The possible values for @var{style} are as follows, again where
+supported by the system,
+
+@defvar SOCK_STREAM
+@defvarx SOCK_DGRAM
+@defvarx SOCK_RAW
+@defvarx SOCK_RDM
+@defvarx SOCK_SEQPACKET
+@end defvar
 
 @var{proto} can be obtained from a protocol name using
-@code{getprotobyname}.  A value of zero specifies the default
-protocol, which is usually right.
+@code{getprotobyname} (@pxref{Network Databases}).  A value of zero
+means the default protocol, which is usually right.
 
-A single socket port cannot by used for communication until it
-has been connected to another socket.
+A socket cannot by used for communication until it has been connected
+somewhere, usually with either @code{connect} or @code{accept} below.
 @end deffn
 
 @deffn {Scheme Procedure} socketpair family style proto
 @deffnx {C Function} scm_socketpair (family, style, proto)
-Return a pair of connected (but unnamed) socket ports of the
-type specified by @var{family}, @var{style} and @var{proto}.
-Many systems support only socket pairs of the @code{AF_UNIX}
-family.  Zero is likely to be the only meaningful value for
-@var{proto}.
+Return a pair, the @code{car} and @code{cdr} of which are two unnamed
+socket ports connected to each other.  The connection is full-duplex,
+so data can be transferred in either direction between the two.
+
+@var{family}, @var{style} and @var{proto} are as per @code{socket}
+above.  But many systems only support socket pairs in the
+@code{PF_UNIX} family.  Zero is likely to be the only meaningful value
+for @var{proto}.
 @end deffn
 
 @deffn {Scheme Procedure} getsockopt sock level optname
@@ -2250,9 +2578,9 @@ one is available unless the non-blocking option has been
 set on the socket.
 
 The return value is a
-pair in which the @emph{car} is a new socket port for the
+pair in which the @acronym{CAR} is a new socket port for the
 connection and
-the @emph{cdr} is an object with address information about the
+the @acronym{CDR} is an object with address information about the
 client which initiated the connection.
 
 @var{sock} does not become part of the
@@ -2262,20 +2590,22 @@ connection and will continue to accept new requests.
 The following functions take a socket address object, as returned
 by @code{accept} and other procedures, and return a selected component.
 
-@table @code
-@item sockaddr:fam
+@deffn {Scheme Procedure} sockaddr:fam sa
 The socket family, typically equal to the value of @code{AF_UNIX} or
 @code{AF_INET}.
-@item sockaddr:path
+@end deffn
+@deffn {Scheme Procedure} sockaddr:path sa
 If the socket family is @code{AF_UNIX}, returns the path of the
 filename the socket is based on.
-@item sockaddr:addr
+@end deffn
+@deffn {Scheme Procedure} sockaddr:addr sa
 If the socket family is @code{AF_INET}, returns the Internet host
 address.
-@item sockaddr:port
+@end deffn
+@deffn {Scheme Procedure} sockaddr:port sa
 If the socket family is @code{AF_INET}, returns the Internet port
 number.
-@end table
+@end deffn
 
 @deffn {Scheme Procedure} getsockname sock
 @deffnx {C Function} scm_getsockname (sock)
@@ -2305,8 +2635,11 @@ protocols, if a packet larger than this limit is encountered
 then some data
 will be irrevocably lost.
 
-The optional @var{flags} argument is a value or
-bitwise OR of MSG_OOB, MSG_PEEK, MSG_DONTROUTE etc.
+@vindex MSG_OOB
+@vindex MSG_PEEK
+@vindex MSG_DONTROUTE
+The optional @var{flags} argument is a value or bitwise OR of
+@code{MSG_OOB}, @code{MSG_PEEK}, @code{MSG_DONTROUTE} etc.
 
 The value returned is the number of bytes read from the
 socket.
@@ -2318,15 +2651,15 @@ any unread buffered port data is ignored.
 
 @deffn {Scheme Procedure} send sock message [flags]
 @deffnx {C Function} scm_send (sock, message, flags)
+@vindex MSG_OOB
+@vindex MSG_PEEK
+@vindex MSG_DONTROUTE
 Transmit the string @var{message} on a socket port @var{sock}.
-@var{sock} must already be bound to a destination address.  The
-value returned is the number of bytes transmitted --
-it's possible for
-this to be less than the length of @var{message}
-if the socket is
-set to be non-blocking.  The optional @var{flags} argument
-is a value or
-bitwise OR of MSG_OOB, MSG_PEEK, MSG_DONTROUTE etc.
+@var{sock} must already be bound to a destination address.  The value
+returned is the number of bytes transmitted---it's possible for this
+to be less than the length of @var{message} if the socket is set to be
+non-blocking.  The optional @var{flags} argument is a value or bitwise
+OR of @code{MSG_OOB}, @code{MSG_PEEK}, @code{MSG_DONTROUTE} etc.
 
 Note that the data is written directly to the socket
 file descriptor:
@@ -2344,11 +2677,14 @@ of data which can be received: in the case of packet protocols,
 if a packet larger than this limit is encountered then some
 data will be irrevocably lost.
 
+@vindex MSG_OOB
+@vindex MSG_PEEK
+@vindex MSG_DONTROUTE
 The optional @var{flags} argument is a value or bitwise OR of
 @code{MSG_OOB}, @code{MSG_PEEK}, @code{MSG_DONTROUTE} etc.
 
-The value returned is a pair: the @emph{car} is the number of
-bytes read from the socket and the @emph{cdr} an address object
+The value returned is a pair: the @acronym{CAR} is the number of
+bytes read from the socket and the @acronym{CDR} an address object
 in the same form as returned by @code{accept}.  The address
 will given as @code{#f} if not available, as is usually the
 case for stream sockets.
@@ -2370,7 +2706,7 @@ destination address is specified using the @var{fam},
 @code{connect} procedure.  @var{args_and_flags} contains
 the usual connection arguments optionally followed by
 a flags argument, which is a value or
-bitwise OR of MSG_OOB, MSG_PEEK, MSG_DONTROUTE etc.
+bitwise OR of @code{MSG_OOB}, @code{MSG_PEEK}, @code{MSG_DONTROUTE} etc.
 
 The value returned is the number of bytes transmitted --
 it's possible for
@@ -2383,7 +2719,7 @@ any unflushed buffered port data is ignored.
 @end deffn
 
 The following functions can be used to convert short and long integers
-between "host" and "network" order.  Although the procedures above do
+between ``host'' and ``network'' order.  Although the procedures above do
 this automatically for addresses, the conversion will still need to
 be done when sending or receiving encoded integer data from the network.
 
@@ -2433,18 +2769,13 @@ These procedures are inconvenient to use at present, but consider:
 
 
 @node Internet Socket Examples
-@subsection Network Socket Examples
-
-The following sections give examples of how to use network sockets.
-
-@menu
-* Internet Socket Client::
-* Internet Socket Server::
-@end menu
+@subsubsection Network Socket Examples
+@cindex network examples
+@cindex socket examples
 
+The following give examples of how to use network sockets.
 
-@node Internet Socket Client
-@subsubsection Internet Socket Client Example
+@subsubheading Internet Socket Client Example
 
 @cindex socket client example
 The following example demonstrates an Internet socket client.
@@ -2452,7 +2783,7 @@ It connects to the HTTP daemon running on the local machine and
 returns the contents of the root index URL.
 
 @example
-(let ((s (socket AF_INET SOCK_STREAM 0)))
+(let ((s (socket PF_INET SOCK_STREAM 0)))
   (connect s AF_INET (inet-aton "127.0.0.1") 80)
   (display "GET / HTTP/1.0\r\n\r\n" s)
 
@@ -2463,8 +2794,7 @@ returns the contents of the root index URL.
 @end example
 
 
-@node Internet Socket Server
-@subsubsection Internet Socket Server Example
+@subsubheading Internet Socket Server Example
 
 @cindex socket server example
 The following example shows a simple Internet server which listens on
@@ -2472,10 +2802,10 @@ port 2904 for incoming connections and sends a greeting back to the
 client.
 
 @example
-(let ((s (socket AF_INET SOCK_STREAM 0)))
+(let ((s (socket PF_INET SOCK_STREAM 0)))
   (setsockopt s SOL_SOCKET SO_REUSEADDR 1)
-  ;; Specific address?
-  ;; (bind s AF_INET (inet-aton "127.0.0.1") 2904)
+  ;; @r{Specific address?}
+  ;; @r{(bind s AF_INET (inet-aton "127.0.0.1") 2904)}
   (bind s AF_INET INADDR_ANY 2904)
   (listen s 5)
 
@@ -2493,14 +2823,15 @@ client.
                           (gethostbyaddr
                            (sockaddr:addr client-details)))
            (newline)
-           ;; Send back the greeting to the client port
+           ;; @r{Send back the greeting to the client port}
            (display "Hello client\r\n" client)
            (close client))))
 @end example
 
 
 @node System Identification
-@section System Identification
+@subsection System Identification
+@cindex system name
 
 This section lists the various procedures Guile provides for accessing
 information about the system it runs on.
@@ -2509,26 +2840,30 @@ information about the system it runs on.
 @deffnx {C Function} scm_uname ()
 Return an object with some information about the computer
 system the program is running on.
-@end deffn
 
 The following procedures accept an object as returned by @code{uname}
 and return a selected component.
 
-@table @code
-@item utsname:sysname
+@deffn {Scheme Procedure} utsname:sysname un
 The name of the operating system.
-@item utsname:nodename
+@end deffn
+@deffn {Scheme Procedure} utsname:nodename un
 The network name of the computer.
-@item utsname:release
+@end deffn
+@deffn {Scheme Procedure} utsname:release un
 The current release level of the operating system implementation.
-@item utsname:version
+@end deffn
+@deffn {Scheme Procedure} utsname:version un
 The current version level within the release of the operating system.
-@item utsname:machine
+@end deffn
+@deffn {Scheme Procedure} utsname:machine un
 A description of the hardware.
-@end table
+@end deffn
+@end deffn
 
 @deffn {Scheme Procedure} gethostname
 @deffnx {C Function} scm_gethostname ()
+@cindex host name
 Return the host name of the current processor.
 @end deffn
 
@@ -2539,38 +2874,40 @@ only be used by the superuser.  The return value is not
 specified.
 @end deffn
 
-@c FIXME::martin: Not in libguile!
-@deffn {Scheme Procedure} software-type
-Return a symbol describing the current platform's operating system.
-This may be one of AIX, VMS, UNIX, COHERENT, WINDOWS, MS-DOS, OS/2,
-THINKC, AMIGA, ATARIST, MACH, or ACORN.
-
-Note that most varieties of Unix are considered to be simply "UNIX".
-That is because when a program depends on features that are not present
-on every operating system, it is usually better to test for the presence
-or absence of that specific feature.  The return value of
-@code{software-type} should only be used for this purpose when there is
-no other easy or unambiguous way of detecting such features.
-@end deffn
-
 @node Locales
-@section Locales
+@subsection Locales
+@cindex locale
 
 @deffn {Scheme Procedure} setlocale category [locale]
 @deffnx {C Function} scm_setlocale (category, locale)
-If @var{locale} is omitted, return the current value of the
-specified locale category as a system-dependent string.
-@var{category} should be specified using the values
-@code{LC_COLLATE}, @code{LC_ALL} etc.
+Get or set the current locale, used for various internationalizations.
+Locales are strings, such as @samp{sv_SE}.
+
+If @var{locale} is given then the locale for the given @var{category} is set
+and the new value returned.  If @var{locale} is not given then the
+current value is returned.  @var{category} should be one of the
+following values
+
+@defvar LC_ALL
+@defvarx LC_COLLATE
+@defvarx LC_CTYPE
+@defvarx LC_MESSAGES
+@defvarx LC_MONETARY
+@defvarx LC_NUMERIC
+@defvarx LC_TIME
+@end defvar
 
-Otherwise the specified locale category is set to the string
-@var{locale} and the new value is returned as a
-system-dependent string.  If @var{locale} is an empty string,
-the locale will be set using environment variables.
+@cindex @code{LANG}
+A common usage is @samp{(setlocale LC_ALL "")}, which initializes all
+categories based on standard environment variables (@code{LANG} etc).
+For full details on categories and locale names @pxref{Locales,,
+Locales and Internationalization, libc, The GNU C Library Reference
+Manual}.
 @end deffn
 
 @node Encryption
-@section Encryption
+@subsection Encryption
+@cindex encryption
 
 Please note that the procedures in this section are not suited for
 strong encryption, they are only interfaces to the well-known and
@@ -2589,6 +2926,7 @@ appears here because it is often used in combination with @code{crypt}:
 
 @deffn {Scheme Procedure} getpass prompt
 @deffnx {C Function} scm_getpass (prompt)
+@cindex password
 Display @var{prompt} to the standard error output and read
 a password from @file{/dev/tty}.  If this file is not
 accessible, it reads from standard input.  The password may be
@@ -2597,3 +2935,8 @@ terminating newline character are discarded.  While reading
 the password, echoing and the generation of signals by special
 characters is disabled.
 @end deffn
+
+
+@c Local Variables:
+@c TeX-master: "guile.texi"
+@c End: