   Guile Reference Manual Copyright (C) 1996 Free Software Foundation
Copyright (C) 1997 Free Software Foundation
Copyright (C) 2000 Free Software Foundation
Copyright (C) 2001 Free Software Foundation
Copyright (C) 2002 Free Software Foundation

   Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.

   Permission is granted to copy and distribute modified versions of
this manual under the conditions for verbatim copying, provided that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.

   Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for modified
versions, except that this permission notice may be stated in a
translation approved by the Free Software Foundation.

Ports and File Descriptors
==========================

   Conventions generally follow those of scsh, see The Scheme shell (scsh).

   File ports are implemented using low-level operating system I/O
facilities, with optional buffering to improve efficiency File Ports

   Note that some procedures (e.g., `recv!') will accept ports as
arguments, but will actually operate directly on the file descriptor
underlying the port.  Any port buffering is ignored, including the
buffer which implements `peek-char' and `unread-char'.

   The `force-output' and `drain-input' procedures can be used to clear
the buffers.

   Each open file port has an associated operating system file
descriptor.  File descriptors are generally not useful in Scheme
programs; however they may be needed when interfacing with foreign code
and the Unix environment.

   A file descriptor can be extracted from a port and a new port can be
created from a file descriptor.  However a file descriptor is just an
integer and the garbage collector doesn't recognize it as a reference
to the port.  If all other references to the port were dropped, then
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
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 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
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.

 - Scheme Procedure: port-revealed port
 - C Function: scm_port_revealed (port)
     Return the revealed count for PORT.

 - Scheme Procedure: set-port-revealed! port rcount
 - C Function: scm_set_port_revealed_x (port, rcount)
     Sets the revealed count for a port to a given value.  The return
     value is unspecified.

 - Scheme Procedure: fileno port
 - C Function: scm_fileno (port)
     Return the integer file descriptor underlying PORT.  Does not
     change its revealed count.

 - Scheme Procedure: port->fdes port
     Returns the integer file descriptor underlying PORT.  As a side
     effect the revealed count of PORT is incremented.

 - Scheme Procedure: fdopen fdes modes
 - C Function: scm_fdopen (fdes, modes)
     Return a new port based on the file descriptor FDES.  Modes are
     given by the string MODES.  The revealed count of the port is
     initialized to zero.  The modes string is the same as that
     accepted by open-file.

 - Scheme Procedure: fdes->ports fd
 - C Function: scm_fdes_to_ports (fd)
     Return a list of existing ports which have FDES as an underlying
     file descriptor, without changing their revealed counts.

 - Scheme Procedure: fdes->inport fdes
     Returns an existing input port which has FDES as its underlying
     file descriptor, if one exists, and increments its revealed count.
     Otherwise, returns a new input port with a revealed count of 1.

 - Scheme Procedure: fdes->outport fdes
     Returns an existing output port which has FDES as its underlying
     file descriptor, if one exists, and increments its revealed count.
     Otherwise, returns a new output port with a revealed count of 1.

 - Scheme Procedure: primitive-move->fdes port fd
 - C Function: scm_primitive_move_to_fdes (port, fd)
     Moves the underlying file descriptor for PORT to the integer value
     FDES without changing the revealed count of PORT.  Any other ports
     already using this descriptor will be automatically shifted to new
     descriptors and their revealed counts reset to zero.  The return
     value is `#f' if the file descriptor already had the required
     value or `#t' if it was moved.

 - Scheme Procedure: move->fdes port fdes
     Moves the underlying file descriptor for PORT to the integer value
     FDES and sets its revealed count to one.  Any other ports already
     using this descriptor will be automatically shifted to new
     descriptors and their revealed counts reset to zero.  The return
     value is unspecified.

 - Scheme Procedure: release-port-handle port
     Decrements the revealed count for a port.

 - Scheme Procedure: fsync object
 - C Function: scm_fsync (object)
     Copies any unwritten data for the specified output file descriptor
     to disk.  If PORT/FD is a port, its buffer is flushed before the
     underlying file descriptor is fsync'd.  The return value is
     unspecified.

 - Scheme Procedure: open path flags [mode]
 - C Function: scm_open (path, flags, mode)
     Open the file named by PATH for reading and/or writing.  FLAGS is
     an integer specifying how the file should be opened.  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).

     FLAGS can be constructed by combining variables using `logior'.
     Basic flags are:

      - Variable: O_RDONLY
          Open the file read-only.

      - Variable: O_WRONLY
          Open the file write-only.

      - Variable: O_RDWR
          Open the file read/write.

      - Variable: O_APPEND
          Append to the file instead of truncating.

      - Variable: O_CREAT
          Create the file if it does not already exist.

     See the Unix documentation of the `open' system call for
     additional flags.

 - Scheme Procedure: open-fdes path flags [mode]
 - C Function: scm_open_fdes (path, flags, mode)
     Similar to `open' but return a file descriptor instead of a port.

 - Scheme Procedure: close fd_or_port
 - C Function: scm_close (fd_or_port)
     Similar to close-port (see 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 their revealed counts set to
     zero.

 - Scheme Procedure: close-fdes fd
 - C Function: scm_close_fdes (fd)
     A simple wrapper for the `close' system call.  Close file
     descriptor FD, which must be an integer.  Unlike close (see
     close), the file descriptor will be
     closed even if a port is using it.  The return value is
     unspecified.

 - Scheme Procedure: unread-char char [port]
 - C Function: scm_unread_char (char, port)
     Place CHAR in 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 PORT is not
     supplied, the current input port is used.

 - Scheme Procedure: unread-string str port
     Place the string STR in PORT so that its characters will be read
     in subsequent read operations.  If called multiple times, the
     unread characters will be read again in last-in first-out order.
     If PORT is not supplied, the current-input-port is used.

 - Scheme Procedure: pipe
 - C Function: scm_pipe ()
     Return a newly created pipe: a pair of ports which are linked
     together on the local machine.  The _car_ is the input port and
     the _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 `setvbuf'.

     Writes occur atomically provided the size of the data in bytes is
     not greater than the value of `PIPE_BUF'.  Note that the output
     port is likely to block if too much data (typically equal to
     `PIPE_BUF') has been written but not yet read from the input port.

   The next group of procedures perform a `dup2' system call, if NEWFD
(an integer) is supplied, otherwise a `dup'.  The file descriptor to be
duplicated can be supplied as an integer or contained in a port.  The
type of value returned varies depending on which procedure is used.

   All procedures also have the side effect when performing `dup2' that
any ports using NEWFD are moved to a different file descriptor and have
their revealed counts set to zero.

 - Scheme Procedure: dup->fdes fd_or_port [fd]
 - C Function: scm_dup_to_fdes (fd_or_port, fd)
     Return a new integer file descriptor referring to the open file
     designated by FD_OR_PORT, which must be either an open file port
     or a file descriptor.

 - Scheme Procedure: dup->inport port/fd [newfd]
     Returns a new input port using the new file descriptor.

 - Scheme Procedure: dup->outport port/fd [newfd]
     Returns a new output port using the new file descriptor.

 - Scheme Procedure: dup port/fd [newfd]
     Returns a new port if PORT/FD is a port, with the same mode as the
     supplied port, otherwise returns an integer file descriptor.

 - Scheme Procedure: dup->port port/fd mode [newfd]
     Returns a new port using the new file descriptor.  MODE supplies a
     mode string for the port (see open-file).

 - Scheme Procedure: duplicate-port port modes
     Returns a new port which is opened on a duplicate of the file
     descriptor underlying PORT, with mode string MODES as for
     open-file.  The two ports will share a file position
     and file status flags.

     Unexpected behaviour can result if both ports are subsequently used
     and the original and/or duplicate ports are buffered.  The mode
     string can include `0' to obtain an unbuffered duplicate port.

     This procedure is equivalent to `(dup->port PORT MODES)'.

 - Scheme Procedure: redirect-port old new
 - C Function: scm_redirect_port (old, new)
     This procedure takes two ports and duplicates the underlying file
     descriptor from OLD-PORT into NEW-PORT.  The current file
     descriptor in NEW-PORT will be closed.  After the redirection the
     two ports will share a file position and file status flags.

     The return value is unspecified.

     Unexpected behaviour can result if both ports are subsequently used
     and the original and/or duplicate ports are buffered.

     This procedure does not have any side effects on other ports or
     revealed counts.

 - Scheme Procedure: dup2 oldfd newfd
 - C Function: scm_dup2 (oldfd, newfd)
     A simple wrapper for the `dup2' system call.  Copies the file
     descriptor OLDFD to descriptor number NEWFD, replacing the
     previous meaning of NEWFD.  Both OLDFD and NEWFD must be integers.
     Unlike for dup->fdes or primitive-move->fdes, no attempt is made
     to move away ports which are using NEWFD.  The return value is
     unspecified.

 - Scheme Procedure: port-mode port
     Return the port modes associated with the open port PORT.  These
     will not necessarily be identical to the modes used when the port
     was opened, since modes such as "append" which are used only
     during port creation are not retained.

 - Scheme Procedure: port-for-each proc
 - C Function: scm_port_for_each (proc)
     Apply PROC to each port in the Guile port table in turn.  The
     return value is unspecified.  More specifically, PROC is applied
     exactly once to every port that exists in the system at the time
     PORT-FOR-EACH is invoked.  Changes to the port table while
     PORT-FOR-EACH is running have no effect as far as PORT-FOR-EACH is
     concerned.

 - Scheme Procedure: setvbuf port mode [size]
 - C Function: scm_setvbuf (port, mode, size)
     Set the buffering mode for PORT.  MODE can be:
    `_IONBF'
          non-buffered

    `_IOLBF'
          line buffered

    `_IOFBF'
          block buffered, using a newly allocated buffer of SIZE bytes.
          If SIZE is omitted, a default size will be used.

 - Scheme Procedure: fcntl object cmd [value]
 - C Function: scm_fcntl (object, cmd, value)
     Apply COMMAND to the specified file descriptor or the underlying
     file descriptor of the specified port.  VALUE is an optional
     integer argument.

     Values for COMMAND are:

    `F_DUPFD'
          Duplicate a file descriptor

    `F_GETFD'
          Get flags associated with the file descriptor.

    `F_SETFD'
          Set flags associated with the file descriptor to VALUE.

    `F_GETFL'
          Get flags associated with the open file.

    `F_SETFL'
          Set flags associated with the open file to VALUE

    `F_GETOWN'
          Get the process ID of a socket's owner, for `SIGIO' signals.

    `F_SETOWN'
          Set the process that owns a socket to VALUE, for `SIGIO'
          signals.

    `FD_CLOEXEC'
          The value used to indicate the "close on exec" flag with
          `F_GETFL' or `F_SETFL'.

 - Scheme Procedure: flock file operation
 - C Function: scm_flock (file, operation)
     Apply or remove an advisory lock on an open file.  OPERATION
     specifies the action to be done:
    `LOCK_SH'
          Shared lock.  More than one process may hold a shared lock
          for a given file at a given time.

    `LOCK_EX'
          Exclusive lock.  Only one process may hold an exclusive lock
          for a given file at a given time.

    `LOCK_UN'
          Unlock the file.

    `LOCK_NB'
          Don't block when locking.  May be specified by bitwise OR'ing
          it to one of the other operations.  The return value is not
     specified. FILE may be an open file descriptor or an open file
     descriptor port.

 - Scheme Procedure: select reads writes excepts [secs [usecs]]
 - C Function: scm_select (reads, writes, excepts, secs, usecs)
     This procedure has a variety of uses: waiting for the ability to
     provide input, accept output, or the existence of exceptional
     conditions on a collection of ports or file descriptors, or
     waiting for a timeout to occur.  It also returns if interrupted by
     a signal.

     READS, WRITES and EXCEPTS can be lists or vectors, with each
     member a port or a file descriptor.  The value returned is a list
     of three corresponding lists or vectors containing only the
     members which meet the specified requirement.  The ability of port
     buffers to provide input or accept output is taken into account.
     Ordering of the input lists or vectors is not preserved.

     The optional arguments SECS and USECS specify the timeout.  Either
     SECS can be specified alone, as either an integer or a real
     number, or both SECS and USECS can be specified as integers, in
     which case USECS is an additional timeout expressed in
     microseconds.  If SECS is omitted or is `#f' then select will wait
     for as long as it takes for one of the other conditions to be
     satisfied.

     The scsh version of `select' differs as follows: Only vectors are
     accepted for the first three arguments.  The USECS argument is not
     supported.  Multiple values are returned instead of a list.
     Duplicates in the input vectors appear only once in output.  An
     additional `select!' interface is provided.

File System
===========

   These procedures allow querying and setting file system attributes
(such as owner, permissions, sizes and types of files); deleting,
copying, renaming and linking files; creating and removing directories
and querying their contents; syncing the file system and creating
special files.

 - Scheme Procedure: access? path how
 - C Function: scm_access (path, how)
     Return `#t' if PATH corresponds to an existing file and the
     current process has the type of access specified by HOW, otherwise
     `#f'.  HOW should be specified using the values of the variables
     listed below.  Multiple values can be combined using a bitwise or,
     in which case `#t' will only be returned if all accesses are
     granted.

     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.

      - Variable: R_OK
          test for read permission.

      - Variable: W_OK
          test for write permission.

      - Variable: X_OK
          test for execute permission.

      - Variable: F_OK
          test for existence of the file.

 - Scheme Procedure: stat object
 - C Function: scm_stat (object)
     Return an object containing various information about the file
     determined by OBJ.  OBJ can be a string containing a file name or
     a port or integer file descriptor which is open on a file (in
     which case `fstat' is used as the underlying system call).

     The object returned by `stat' can be passed as a single parameter
     to the following procedures, all of which return integers:

    `stat:dev'
          The device containing the file.

    `stat:ino'
          The file serial number, which distinguishes this file from all
          other files on the same device.

    `stat:mode'
          The mode of the file.  This includes file type information and
          the file permission bits.  See `stat:type' and `stat:perms'
          below.

    `stat:nlink'
          The number of hard links to the file.

    `stat:uid'
          The user ID of the file's owner.

    `stat:gid'
          The group ID of the file.

    `stat:rdev'
          Device ID; this entry is defined only for character or block
          special files.

    `stat:size'
          The size of a regular file in bytes.

    `stat:atime'
          The last access time for the file.

    `stat:mtime'
          The last modification time for the file.

    `stat:ctime'
          The last modification time for the attributes of the file.

    `stat:blksize'
          The optimal block size for reading or writing the file, in
          bytes.

    `stat:blocks'
          The amount of disk space that the file occupies measured in
          units of 512 byte blocks.

     In addition, the following procedures return the information from
     stat:mode in a more convenient form:

    `stat:type'
          A symbol representing the type of file.  Possible values are
          regular, directory, symlink, block-special, char-special,
          fifo, socket and unknown

    `stat:perms'
          An integer representing the access permission bits.

 - Scheme Procedure: lstat str
 - C Function: scm_lstat (str)
     Similar to `stat', but does not follow symbolic links, i.e., it
     will return information about a symbolic link itself, not the file
     it points to.  PATH must be a string.

 - Scheme Procedure: readlink path
 - C Function: scm_readlink (path)
     Return the value of the symbolic link named by PATH (a string),
     i.e., the file that the link points to.

 - Scheme Procedure: chown object owner group
 - C Function: scm_chown (object, owner, group)
     Change the ownership and group of the file referred to by OBJECT to
     the integer values OWNER and GROUP.  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.

     If OBJECT is a symbolic link, either the ownership of the link or
     the ownership of the referenced file will be changed depending on
     the operating system (lchown is unsupported at present).  If OWNER
     or GROUP is specified as `-1', then that ID is not changed.

 - Scheme Procedure: chmod object mode
 - C Function: scm_chmod (object, mode)
     Changes the permissions of the file referred to by OBJ.  OBJ can
     be a string containing a file name or a port or integer file
     descriptor which is open on a file (in which case `fchmod' is used
     as the underlying system call).  MODE specifies the new
     permissions as a decimal number, e.g., `(chmod "foo" #o755)'.  The
     return value is unspecified.

 - Scheme Procedure: utime pathname [actime [modtime]]
 - C Function: scm_utime (pathname, actime, modtime)
     `utime' sets the access and modification times for the file named
     by PATH.  If ACTIME or MODTIME is not supplied, then the current
     time is used.  ACTIME and MODTIME must be integer time values as
     returned by the `current-time' procedure.
          (utime "foo" (- (current-time) 3600))
     will set the access time to one hour in the past and the
     modification time to the current time.

 - Scheme Procedure: delete-file str
 - C Function: scm_delete_file (str)
     Deletes (or "unlinks") the file specified by PATH.

 - Scheme Procedure: copy-file oldfile newfile
 - C Function: scm_copy_file (oldfile, newfile)
     Copy the file specified by PATH-FROM to PATH-TO.  The return value
     is unspecified.

 - Scheme Procedure: rename-file oldname newname
 - C Function: scm_rename (oldname, newname)
     Renames the file specified by OLDNAME to NEWNAME.  The return
     value is unspecified.

 - Scheme Procedure: link oldpath newpath
 - C Function: scm_link (oldpath, newpath)
     Creates a new name NEWPATH in the file system for the file named
     by OLDPATH.  If OLDPATH is a symbolic link, the link may or may
     not be followed depending on the system.

 - Scheme Procedure: symlink oldpath newpath
 - C Function: scm_symlink (oldpath, newpath)
     Create a symbolic link named PATH-TO with the value (i.e.,
     pointing to) PATH-FROM.  The return value is unspecified.

 - Scheme Procedure: mkdir path [mode]
 - C Function: scm_mkdir (path, mode)
     Create a new directory named by PATH.  If 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 MODE.
     The return value is unspecified.

 - Scheme Procedure: rmdir path
 - C Function: scm_rmdir (path)
     Remove the existing directory named by PATH.  The directory must
     be empty for this to succeed.  The return value is unspecified.

 - Scheme Procedure: opendir dirname
 - C Function: scm_opendir (dirname)
     Open the directory specified by PATH and return a directory stream.

 - Scheme Procedure: directory-stream? obj
 - C Function: scm_directory_stream_p (obj)
     Return a boolean indicating whether OBJECT is a directory stream
     as returned by `opendir'.

 - Scheme Procedure: readdir port
 - C Function: scm_readdir (port)
     Return (as a string) the next directory entry from the directory
     stream STREAM.  If there is no remaining entry to be read then the
     end of file object is returned.

 - Scheme Procedure: rewinddir port
 - C Function: scm_rewinddir (port)
     Reset the directory port STREAM so that the next call to `readdir'
     will return the first directory entry.

 - Scheme Procedure: closedir port
 - C Function: scm_closedir (port)
     Close the directory stream STREAM.  The return value is
     unspecified.

   Here is an example showing how to display all the entries in a
directory:

     (define dir (opendir "/usr/lib"))
     (do ((entry (readdir dir) (readdir dir)))
         ((eof-object? entry))
       (display entry)(newline))
     (closedir dir)

 - Scheme Procedure: sync
 - C Function: scm_sync ()
     Flush the operating system disk buffers.  The return value is
     unspecified.

 - Scheme Procedure: mknod path type perms dev
 - C Function: scm_mknod (path, type, perms, dev)
     Creates a new special file, such as a file corresponding to a
     device.  PATH specifies the name of the file.  TYPE should be one
     of the following symbols: regular, directory, symlink,
     block-special, char-special, fifo, or socket.  PERMS (an integer)
     specifies the file permissions.  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.,
          (mknod "/dev/fd0" 'block-special #o660 (+ (* 2 256) 2))

     The return value is unspecified.

 - Scheme Procedure: tmpnam
 - C Function: scm_tmpnam ()
     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 `tmpnam' is called.  Care should be taken if
     opening the file, e.g., use the `O_EXCL' open flag or use
     `mkstemp!' instead.

 - Scheme Procedure: mkstemp! tmpl
 - C Function: scm_mkstemp (tmpl)
     Create a new unique file in the file system and returns a new
     buffered port open for reading and writing to the file.  TMPL is a
     string specifying where the file should be created: it must end
     with `XXXXXX' and will be changed in place to return the name of
     the temporary file.

 - Scheme Procedure: dirname filename
 - C Function: scm_dirname (filename)
     Return the directory name component of the file name FILENAME. If
     FILENAME does not contain a directory component, `.' is returned.

 - Scheme Procedure: basename filename [suffix]
 - C Function: scm_basename (filename, suffix)
     Return the base name of the file name FILENAME. The base name is
     the file name without any directory components.  If SUFFIX is
     provided, and is equal to the end of BASENAME, it is removed also.

          (basename "/tmp/test.xml" ".xml")
          => "test"

User Information
================

   The facilities in this section provide an interface to the user and
group database.  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:

`passwd:name'
     The name of the userid.

`passwd:passwd'
     The encrypted passwd.

`passwd:uid'
     The user id number.

`passwd:gid'
     The group id number.

`passwd:gecos'
     The full name.

`passwd:dir'
     The home directory.

`passwd:shell'
     The login shell.

 - Scheme Procedure: getpwuid uid
     Look up an integer userid in the user database.

 - Scheme Procedure: getpwnam name
     Look up a user name string in the user database.

 - Scheme Procedure: setpwent
     Initializes a stream used by `getpwent' to read from the user
     database.  The next use of `getpwent' will return the first entry.
     The return value is unspecified.

 - Scheme Procedure: getpwent
     Return the next entry in the user database, using the stream set by
     `setpwent'.

 - Scheme Procedure: endpwent
     Closes the stream used by `getpwent'.  The return value is
     unspecified.

 - Scheme Procedure: setpw [arg]
 - C Function: scm_setpwent (arg)
     If called with a true argument, initialize or reset the password
     data stream.  Otherwise, close the stream.  The `setpwent' and
     `endpwent' procedures are implemented on top of this.

 - Scheme Procedure: getpw [user]
 - C Function: scm_getpwuid (user)
     Look up an entry in the user database.  OBJ can be an integer, a
     string, or omitted, giving the behaviour of getpwuid, getpwnam or
     getpwent respectively.

   The following functions accept an object representing group
information and return a selected component:

`group:name'
     The group name.

`group:passwd'
     The encrypted group password.

`group:gid'
     The group id number.

`group:mem'
     A list of userids which have this group as a supplementary group.

 - Scheme Procedure: getgrgid gid
     Look up an integer group id in the group database.

 - Scheme Procedure: getgrnam name
     Look up a group name in the group database.

 - Scheme Procedure: setgrent
     Initializes a stream used by `getgrent' to read from the group
     database.  The next use of `getgrent' will return the first entry.
     The return value is unspecified.

 - Scheme Procedure: getgrent
     Return the next entry in the group database, using the stream set
     by `setgrent'.

 - Scheme Procedure: endgrent
     Closes the stream used by `getgrent'.  The return value is
     unspecified.

 - Scheme Procedure: setgr [arg]
 - C Function: scm_setgrent (arg)
     If called with a true argument, initialize or reset the group data
     stream.  Otherwise, close the stream.  The `setgrent' and
     `endgrent' procedures are implemented on top of this.

 - Scheme Procedure: getgr [name]
 - C Function: scm_getgrgid (name)
     Look up an entry in the group database.  OBJ can be an integer, a
     string, or omitted, giving the behaviour of getgrgid, getgrnam or
     getgrent respectively.

   In addition to the accessor procedures for the user database, the
following shortcut procedures are also available.

 - Scheme Procedure: cuserid
 - C Function: scm_cuserid ()
     Return a string containing a user name associated with the
     effective user id of the process.  Return `#f' if this information
     cannot be obtained.

 - Scheme Procedure: getlogin
 - C Function: scm_getlogin ()
     Return a string containing the name of the user logged in on the
     controlling terminal of the process, or `#f' if this information
     cannot be obtained.

Time
====

 - Scheme Procedure: current-time
 - C Function: scm_current_time ()
     Return the number of seconds since 1970-01-01 00:00:00 UTC,
     excluding leap seconds.

 - Scheme Procedure: gettimeofday
 - 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:
     whether true microsecond resolution is available depends on the
     operating system.

   The following procedures either accept an object representing a
broken down 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.

`tm:sec, set-tm:sec'
     Seconds (0-59).

`tm:min, set-tm:min'
     Minutes (0-59).

`tm:hour, set-tm:hour'
     Hours (0-23).

`tm:mday, set-tm:mday'
     Day of the month (1-31).

`tm:mon, set-tm:mon'
     Month (0-11).

`tm:year, set-tm:year'
     Year (70-), the year minus 1900.

`tm:wday, set-tm:wday'
     Day of the week (0-6) with Sunday represented as 0.

`tm:yday, set-tm:yday'
     Day of the year (0-364, 365 in leap years).

`tm:isdst, set-tm:isdst'
     Daylight saving indicator (0 for "no", greater than 0 for "yes",
     less than 0 for "unknown").

`tm:gmtoff, set-tm:gmtoff'
     Time zone offset in seconds west of UTC (-46800 to 43200).

`tm:zone, set-tm:zone'
     Time zone label (a string), not necessarily unique.

 - Scheme Procedure: localtime time [zone]
 - C Function: scm_localtime (time, zone)
     Return an object representing the broken down components of TIME,
     an integer like the one returned by `current-time'.  The time zone
     for the calculation is optionally specified by ZONE (a string),
     otherwise the `TZ' environment variable or the system default is
     used.

 - Scheme Procedure: gmtime time
 - C Function: scm_gmtime (time)
     Return an object representing the broken down components of TIME,
     an integer like the one returned by `current-time'.  The values
     are calculated for UTC.

 - Scheme Procedure: mktime sbd_time [zone]
 - C Function: scm_mktime (sbd_time, zone)
     BD-TIME is an object representing broken down time and `zone' is
     an optional time zone specifier (otherwise the TZ environment
     variable or the system default is used).

     Returns a pair: the car is a corresponding integer time value like
     that returned by `current-time'; the cdr is a broken down time
     object, similar to as BD-TIME but with normalized values.

 - Scheme Procedure: tzset
 - C Function: scm_tzset ()
     Initialize the timezone from the 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.

 - Scheme Procedure: strftime format stime
 - C Function: scm_strftime (format, stime)
     Formats a time specification TIME using TEMPLATE.  TIME is an
     object with time components in the form returned by `localtime' or
     `gmtime'.  TEMPLATE is a string which can include formatting
     specifications introduced by a `%' character.  The formatting of
     month and day names is dependent on the current locale.  The value
     returned is the formatted string.  See Formatting Date and Time (libc).)

          (strftime "%c" (localtime (current-time)))
          => "Mon Mar 11 20:17:43 2002"

 - Scheme Procedure: strptime format string
 - C Function: scm_strptime (format, string)
     Performs the reverse action to `strftime', parsing STRING
     according to the specification supplied in 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 in the form returned by `localtime' or `gmtime',
     but the time zone components are not usefully set.  The cdr
     reports the number of characters from STRING which were used for
     the conversion.

 - Variable: internal-time-units-per-second
     The value of this variable is the number of time units per second
     reported by the following procedures.

 - Scheme Procedure: times
 - C Function: scm_times ()
     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:

    `tms:clock'
          The current real time, expressed as time units relative to an
          arbitrary base.

    `tms:utime'
          The CPU time units used by the calling process.

    `tms:stime'
          The CPU time units used by the system on behalf of the calling
          process.

    `tms:cutime'
          The CPU time units used by terminated child processes of the
          calling process, whose status has been collected (e.g., using
          `waitpid').

    `tms:cstime'
          Similarly, the CPU times units used by the system on behalf of
          terminated child processes.

 - Scheme Procedure: get-internal-real-time
 - C Function: scm_get_internal_real_time ()
     Return the number of time units since the interpreter was started.

 - Scheme Procedure: get-internal-run-time
 - C Function: scm_get_internal_run_time ()
     Return the number of time units of processor time used by the
     interpreter.  Both _system_ and _user_ time are included but
     subprocesses are not.

Runtime Environment
===================

 - Scheme Procedure: program-arguments
 - Scheme Procedure: command-line
 - C Function: scm_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 `"guile"', but excludes switches and parameters
     for command line options like `-e' and `-l'.

 - Scheme Procedure: getenv nam
 - C Function: scm_getenv (nam)
     Looks up the string NAME in the current environment.  The return
     value is `#f' unless a string of the form `NAME=VALUE' is found,
     in which case the string `VALUE' is returned.

 - Scheme Procedure: setenv name value
     Modifies the environment of the current process, which is also the
     default environment inherited by child processes.

     If VALUE is `#f', then NAME is removed from the environment.
     Otherwise, the string NAME=VALUE is added to the environment,
     replacing any existing string with name matching NAME.

     The return value is unspecified.

 - Scheme Procedure: environ [env]
 - C Function: scm_environ (env)
     If 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 ENV
     should be of the form `NAME=VALUE' and values of `NAME' should not
     be duplicated.  If ENV is supplied then the return value is
     unspecified.

 - Scheme Procedure: putenv str
 - C Function: scm_putenv (str)
     Modifies the environment of the current process, which is also the
     default environment inherited by child processes.

     If STRING is of the form `NAME=VALUE' then it will be written
     directly into the environment, replacing any existing environment
     string with name matching `NAME'.  If STRING does not contain an
     equal sign, then any existing string with name matching STRING will
     be removed.

     The return value is unspecified.

Processes
=========

 - Scheme Procedure: chdir str
 - C Function: scm_chdir (str)
     Change the current working directory to PATH.  The return value is
     unspecified.

 - Scheme Procedure: getcwd
 - C Function: scm_getcwd ()
     Return the name of the current working directory.

 - Scheme Procedure: umask [mode]
 - C Function: scm_umask (mode)
     If MODE is omitted, returns a decimal number representing the
     current file creation mask.  Otherwise the file creation mask is
     set to MODE and the previous value is returned.

     E.g., `(umask #o022)' sets the mask to octal 22, decimal 18.

 - Scheme Procedure: chroot path
 - C Function: scm_chroot (path)
     Change the root directory to that specified in PATH.  This
     directory will be used for path names beginning with `/'.  The
     root directory is inherited by all children of the current
     process.  Only the superuser may change the root directory.

 - Scheme Procedure: getpid
 - C Function: scm_getpid ()
     Return an integer representing the current process ID.

 - Scheme Procedure: getgroups
 - C Function: scm_getgroups ()
     Return a vector of integers representing the current supplementary
     group IDs.

 - Scheme Procedure: getppid
 - C Function: scm_getppid ()
     Return an integer representing the process ID of the parent
     process.

 - Scheme Procedure: getuid
 - C Function: scm_getuid ()
     Return an integer representing the current real user ID.

 - Scheme Procedure: getgid
 - C Function: scm_getgid ()
     Return an integer representing the current real group ID.

 - Scheme Procedure: geteuid
 - C Function: scm_geteuid ()
     Return an integer representing the current effective user ID.  If
     the system does not support effective IDs, then the real ID is
     returned.  `(feature? 'EIDs)' reports whether the system supports
     effective IDs.

 - Scheme Procedure: getegid
 - C Function: scm_getegid ()
     Return an integer representing the current effective group ID.  If
     the system does not support effective IDs, then the real ID is
     returned.  `(feature? 'EIDs)' reports whether the system supports
     effective IDs.

 - Scheme Procedure: setuid id
 - C Function: scm_setuid (id)
     Sets both the real and effective user IDs to the integer ID,
     provided the process has appropriate privileges.  The return value
     is unspecified.

 - Scheme Procedure: setgid id
 - C Function: scm_setgid (id)
     Sets both the real and effective group IDs to the integer ID,
     provided the process has appropriate privileges.  The return value
     is unspecified.

 - Scheme Procedure: seteuid id
 - C Function: scm_seteuid (id)
     Sets the effective user ID to the integer ID, provided the process
     has appropriate privileges.  If effective IDs are not supported,
     the real ID is set instead - `(feature? 'EIDs)' reports whether the
     system supports effective IDs.  The return value is unspecified.

 - Scheme Procedure: setegid id
 - C Function: scm_setegid (id)
     Sets the effective group ID to the integer ID, provided the process
     has appropriate privileges.  If effective IDs are not supported,
     the real ID is set instead - `(feature? 'EIDs)' reports whether the
     system supports effective IDs.  The return value is unspecified.

 - Scheme Procedure: getpgrp
 - C Function: scm_getpgrp ()
     Return an integer representing the current process group ID.  This
     is the POSIX definition, not BSD.

 - Scheme Procedure: setpgid pid pgid
 - C Function: scm_setpgid (pid, pgid)
     Move the process PID into the process group PGID.  PID or PGID
     must be integers: they can be zero to indicate the ID of the
     current process.  Fails on systems that do not support job control.
     The return value is unspecified.

 - Scheme Procedure: setsid
 - C Function: scm_setsid ()
     Creates a new session.  The current process becomes the session
     leader and is put in a new process group.  The process will be
     detached from its controlling terminal if it has one.  The return
     value is an integer representing the new process group ID.

 - Scheme Procedure: waitpid pid [options]
 - C Function: scm_waitpid (pid, options)
     This procedure collects status information from a child process
     which has terminated or (optionally) stopped.  Normally it will
     suspend the calling process until this can be done.  If more than
     one child process is eligible then one will be chosen by the
     operating system.

     The value of PID determines the behaviour:

    PID greater than 0
          Request status information from the specified child process.

    PID equal to -1 or WAIT_ANY
          Request status information for any child process.

    PID equal to 0 or WAIT_MYPGRP
          Request status information for any child process in the
          current process group.

    PID less than -1
          Request status information for any child process whose
          process group ID is -PID.

     The OPTIONS argument, if supplied, should be the bitwise OR of the
     values of zero or more of the following variables:

      - Variable: WNOHANG
          Return immediately even if there are no child processes to be
          collected.

      - Variable: WUNTRACED
          Report status information for stopped processes as well as
          terminated processes.

     The return value is a pair containing:

       1. The process ID of the child process, or 0 if `WNOHANG' was
          specified and no process was collected.

       2. The integer status value.

   The following three functions can be used to decode the process
status code returned by `waitpid'.

 - Scheme Procedure: status:exit-val status
 - C Function: scm_status_exit_val (status)
     Return the exit status value, as would be set if a process ended
     normally through a call to `exit' or `_exit', if any, otherwise
     `#f'.

 - Scheme Procedure: status:term-sig status
 - C Function: scm_status_term_sig (status)
     Return the signal number which terminated the process, if any,
     otherwise `#f'.

 - Scheme Procedure: status:stop-sig status
 - C Function: scm_status_stop_sig (status)
     Return the signal number which stopped the process, if any,
     otherwise `#f'.

 - Scheme Procedure: system [cmd]
 - C Function: scm_system (cmd)
     Execute CMD using the operating system's "command processor".
     Under Unix this is usually the default shell `sh'.  The value
     returned is CMD's exit status as returned by `waitpid', which can
     be interpreted using the functions above.

     If `system' is called without arguments, return a boolean
     indicating whether the command processor is available.

 - Scheme Procedure: primitive-exit [status]
 - C Function: scm_primitive_exit (status)
     Terminate the current process without unwinding the Scheme stack.
     This is would typically be useful after a fork.  The exit status
     is STATUS if supplied, otherwise zero.

 - Scheme Procedure: execl filename . args
 - C Function: scm_execl (filename, args)
     Executes the file named by PATH as a new process image.  The
     remaining arguments are supplied to the process; from a C program
     they are accessible as the `argv' argument to `main'.
     Conventionally the first ARG is the same as PATH.  All arguments
     must be strings.

     If ARG is missing, PATH is executed with a null argument list,
     which may have system-dependent side-effects.

     This procedure is currently implemented using the `execv' system
     call, but we call it `execl' because of its Scheme calling
     interface.

 - Scheme Procedure: execlp filename . args
 - C Function: scm_execlp (filename, args)
     Similar to `execl', however if FILENAME does not contain a slash
     then the file to execute will be located by searching the
     directories listed in the `PATH' environment variable.

     This procedure is currently implemented using the `execvp' system
     call, but we call it `execlp' because of its Scheme calling
     interface.

 - Scheme Procedure: execle filename env . args
 - C Function: scm_execle (filename, env, args)
     Similar to `execl', but the environment of the new process is
     specified by ENV, which must be a list of strings as returned by
     the `environ' procedure.

     This procedure is currently implemented using the `execve' system
     call, but we call it `execle' because of its Scheme calling
     interface.

 - Scheme Procedure: primitive-fork
 - C Function: scm_fork ()
     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.

     This procedure has been renamed from `fork' to avoid a naming
     conflict with the scsh fork.

 - Scheme Procedure: nice incr
 - C Function: scm_nice (incr)
     Increment the priority of the current process by INCR.  A higher
     priority value means that the process runs less often.  The return
     value is unspecified.

 - Scheme Procedure: setpriority which who prio
 - C Function: scm_setpriority (which, who, prio)
     Set the scheduling priority of the process, process group or user,
     as indicated by WHICH and WHO. WHICH is one of the variables
     `PRIO_PROCESS', `PRIO_PGRP' or `PRIO_USER', and WHO is interpreted
     relative to WHICH (a process identifier for `PRIO_PROCESS',
     process group identifier for `PRIO_PGRP', and a user identifier
     for `PRIO_USER'.  A zero value of WHO denotes the current process,
     process group, or user.  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.

 - Scheme Procedure: getpriority which who
 - C Function: scm_getpriority (which, who)
     Return the scheduling priority of the process, process group or
     user, as indicated by WHICH and WHO. WHICH is one of the variables
     `PRIO_PROCESS', `PRIO_PGRP' or `PRIO_USER', and WHO is interpreted
     relative to WHICH (a process identifier for `PRIO_PROCESS',
     process group identifier for `PRIO_PGRP', and a user identifier
     for `PRIO_USER'.  A zero value of WHO denotes the current process,
     process group, or user.  Return the highest priority (lowest
     numerical value) of any of the specified processes.