413 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			TeX
		
	
	
	
			
		
		
	
	
			413 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			TeX
		
	
	
	
| %&latex -*- latex -*-
 | |
| 
 | |
| \chapter{Miscellaneous routines}
 | |
| 
 | |
| \section{Integer bitwise ops}
 | |
| \label{sec:bitwise}
 | |
| \defun{arithmetic-shift} {i j} \integer
 | |
| \defunx {bitwise-and} {i j} \integer
 | |
| \defunx {bitwise-ior} {i j} \integer
 | |
| \defunx {bitwise-not} {i} \integer
 | |
| \defunx {bitwise-xor} {i j} \integer
 | |
| \begin{desc}
 | |
|     These operations operate on integers representing semi-infinite 
 | |
|     bit strings, using a 2's-complement encoding.
 | |
| 
 | |
|     \ex{arithmetic-shift} shifts \var{i} by \var{j} bits. 
 | |
|     A left shift is $j > 0$; a right shift is $j < 0$.
 | |
| \end{desc}
 | |
| 
 | |
| \section{List procedures}
 | |
| \dfn{nth}{list i}{object}{procedure \textbf{(obsolete)}}
 | |
| \begin{desc}
 | |
| Returns the $i^{\mathrm th}$ element of \var{list}.
 | |
| The first element (the car) is \ex{(nth \var{list} 0)},
 | |
| the second element is \ex{(nth \var{list} 1)}, and so on.
 | |
| 
 | |
| This procedure is provided as it is useful for accessing elements
 | |
| from the lists returned by the field-readers (chapter~\ref{chapt:fr-awk}).
 | |
| 
 | |
| The functionality of \ex{nth} is equivalent to that of \RnRS{}'s
 | |
| \ex{list-ref}.  Therefore, \ex{nth} will go away in a future release.
 | |
| \end{desc}
 | |
| 
 | |
| \section{Password encryption}
 | |
| 
 | |
| \defun {crypt} {key salt} {encrypted value}
 | |
| 
 | |
| Decrypts \var{key} by directly calling the \texttt{crypt} function
 | |
| using \var{salt} to perturb the hashing algorithm. \var{Salt} must be
 | |
| a two-character string consisting of digits, alphabetic characters,
 | |
| ``.'' or ``\verb+\+''. The length of \var{key} may be at most eight.
 | |
| 
 | |
| \section{Dot-Locking}
 | |
| Section \ref{sec:filelocking} already points out that {\Posix}'s file
 | |
| locks are almost useless in practice. To bypass this restriction other
 | |
| advisory locking mechanisms, based only on standard file operations,
 | |
| where invented. One of them is the so-called \emph{dot-locking} scheme
 | |
| where the lock of \textit{file-name} is represented by the file
 | |
| \textit{file-name}\texttt{.lock}. Care is taken that only one process
 | |
| may generate the lock for a given file.
 | |
| 
 | |
| Here is scsh's interface to dot-locking:
 | |
| 
 | |
| \defun {obtain-dot-lock} {file-name [interval retry-number stale-time]} {\boolean}
 | |
| 
 | |
| \begin{desc}
 | |
|   Tries to obtain the lock for \var{file-name}. If the file is already
 | |
|   locked, the thread sleeps for \var{interval} seconds (default is 1)
 | |
|   before it retries. If the lock cannot be obtained after
 | |
|   \var{retry-number} attempts, the procedure returns \sharpf,
 | |
|   otherwise \sharpt. The default value of \var{retry-number} is
 | |
|   \sharpf which corresponds to an infinite number of retires.
 | |
|   
 | |
|   If \var{stale-time} is non-\sharpf, it specifies the minimum age a
 | |
|   lock may have (in seconds) before it is considered \textit{stale}.
 | |
|   \ex{Obtain-dot-lock} attempts to delete stale locks.  If it was
 | |
|   succcessful obtaining a lock after breaking it, \ex{obtain-dot-lock}
 | |
|   returns \ex{broken}.  If \var{stale-time} is \sharpf,
 | |
|   \ex{obtain-dot-lock} never considers a lock stale.  The default for
 | |
|     \var{stale-time} is 300.
 | |
|     
 | |
|     Note that it is possible that \ex{obtain-dot-lock} breaks a lock
 | |
|     but nevertheless fails to obtain it otherwise.  If it is necessary
 | |
|     to handle this case specially, use \ex{break-dot-lock} directly
 | |
|     (see below) rather than specifying a non-\sharpf \var{stale-time}
 | |
| \end{desc}
 | |
| 
 | |
| \defun {break-dot-lock} {file-name} {undefined}
 | |
| 
 | |
| \begin{desc}
 | |
|   Breaks the lock for \var{file-name} if one exists.  Note that
 | |
|   breaking a lock does \emph{not} imply a subsequent
 | |
|   \ex{obtain-dot-lock} will succeed, as another party may have
 | |
|   acquired the lock between \ex{break-dot-lock} and
 | |
|   \ex{obtain-dot-lock}.
 | |
| \end{desc}
 | |
| 
 | |
| \defun {release-dot-lock} {file-name} {\boolean}
 | |
| 
 | |
| \begin{desc}
 | |
|   Releases the lock for \var{file-name}. On success,
 | |
|   \ex{release-dot-lock} returns \sharpt, otherwise \sharpf. Note that
 | |
|   this procedure can also be used to break the lock for
 | |
|   \var{file-name}.
 | |
| \end{desc}
 | |
| 
 | |
| 
 | |
| \defun{with-dot-lock*} {file-name thunk} {value(s) of thunk}
 | |
| \dfnx{with-dot-lock} {file-name body \ldots} {value(s) of body}{syntax}
 | |
|   
 | |
| \begin{desc}
 | |
|   This procedure obtains the requested lock, and then calls
 | |
|   \ex{(\var{thunk})}. When \var{thunk} returns, the lock is released.
 | |
|   A non-local exit (\eg, throwing to a saved continuation or raising
 | |
|   an exception) also causes the lock to be released.
 | |
|   
 | |
|   After a normal return from \var{thunk}, its return values are
 | |
|   returned by \ex{with-dot-lock*}.  The \ex{with-dot-lock} special
 | |
|   form is equivalent syntactic sugar.
 | |
| \end{desc}
 | |
| 
 | |
| \section{Syslog facility}
 | |
| \label{syslog-facility}
 | |
| 
 | |
| (Note: the functionality presented in this section is still somewhat
 | |
| experimental and thus subject to interface changes.)
 | |
| 
 | |
| The procedures in this section provide access to the 4.2BSD syslog
 | |
| facility present in most POSIX systems.  The functionality is in a
 | |
| structure called \ex{syslog}.  There's an additional structure
 | |
| \ex{syslog-channels} documented below.  The scsh interface to
 | |
| the syslog facility differs significantly from that of the Unix
 | |
| library functionality in order to support multiple simultaneous
 | |
| connections to the syslog facility.
 | |
| 
 | |
| Log messages carry a variety of parameters beside the text of the
 | |
| message itself, namely a set of options controlling the output format
 | |
| and destination, the facility identifying the class of programs the
 | |
| message is coming from, an identifier specifying the conrete program,
 | |
| and the level identifying the importance of the message.  Moreover, a
 | |
| log mask can prevent messages at certain levels to be actually sent to
 | |
| the syslog daemon.
 | |
| 
 | |
| \subsection*{Log options}
 | |
| 
 | |
| A log option specifies details of the I/O behavior of the syslog
 | |
| facility.  A syslog option is an element of a finite type (see
 | |
| the \scm~manual) constructed by the
 | |
| \ex{syslog-option} macro.  The syslog facility works with sets of
 | |
| options which are represented as enum sets (see
 | |
| the \scm~manual).
 | |
| 
 | |
| \dfn{syslog-option}{option-name}{option}{syntax}
 | |
| 
 | |
| \defun{syslog-option?}{x}{boolean}
 | |
| 
 | |
| \defun{make-syslog-options}{list}{options}
 | |
| 
 | |
| \dfn{syslog-options}{option-name \ldots}{options}{syntax}
 | |
| 
 | |
| \defun{syslog-options?}{x}{boolean}
 | |
| 
 | |
| \begin{desc}
 | |
| \ex{Syslog-option} constructs a log option from the name of an
 | |
| option.  (The possible names are listed below.)  \ex{Syslog-option?}
 | |
| is a predicate for log options.  Options are comparable using
 | |
| \ex{eq?}.  \ex{Make-syslog-options} constructs a set of options
 | |
| from a list of options.  \ex{Syslog-options} is a macro which
 | |
| expands into an expression returning a set of options from names.
 | |
| \ex{Syslog-options?} is a predicate for sets of options.
 | |
| \end{desc}
 | |
| %                               
 | |
| Here is a list of possible names of syslog options:
 | |
| 
 | |
| \begin{description}
 | |
| \item[\ex{console}]
 | |
|   If syslog cannot pass the message to syslogd it will attempt to
 | |
|   write the message to the console.
 | |
| 
 | |
| \item[\ex{delay}]
 | |
|   Delay opening the connection to syslogd immediately until the first
 | |
|   message is logged.
 | |
| 
 | |
| \item[\ex{no-delay}]
 | |
|   Open the connection to syslogd immediately.  Normally
 | |
|   the open is delayed until the first message is logged.
 | |
|   Useful for programs that need to manage the order in which
 | |
|   file descriptors are allocated.
 | |
| 
 | |
|   \noindent\textbf{NOTA BENE:}
 | |
|   The \ex{delay} and \ex{no-delay} options are included for
 | |
|   completeness, but do not have the expected effect in the present
 | |
|   Scheme interface: Because the Scheme interface has to multiplex
 | |
|   multiple simultaneous connections to the syslog facility over a
 | |
|   single one, open and close operations on that facility happen at
 | |
|   unpredictable times.
 | |
|   
 | |
| \item[\ex{log-pid}]
 | |
|   Log the process id with each message: useful for identifying
 | |
|   instantiations of daemons.
 | |
| \end{description}
 | |
| 
 | |
| \subsection*{Log facilities}
 | |
| 
 | |
| A log facility identifies the originator of a log message from a
 | |
| finite set known to the system.  Each originator is identified by a
 | |
| name:
 | |
| 
 | |
| \dfn{syslog-facility}{facility-name}{facility}{syntax}
 | |
| \defun{syslog-facility?}{x}{boolean}
 | |
| 
 | |
| \begin{desc}
 | |
|   \ex{Syslog-facility} is macro that expands into an expression
 | |
|   returning a facility for a given name.  \ex{Syslog-facility?} is a
 | |
|   predicate for facilities.  Facilities are comparable via \ex{eq?}.
 | |
| \end{desc}
 | |
| %
 | |
| Here is a list of possible names of syslog facilities:
 | |
| 
 | |
| \begin{description}
 | |
| \item[\ex{authorization}]
 | |
|   The authorization system: login, su, getty, etc.
 | |
| 
 | |
| \item[\ex{cron}]
 | |
|   The cron daemon.
 | |
| 
 | |
| \item[\ex{daemon}]
 | |
|   System daemons, such as routed, that are not provided for explicitly
 | |
|   by other facilities.
 | |
| 
 | |
| \item[\ex{kernel}]
 | |
|   Messages generated by the kernel.
 | |
| 
 | |
| \item[\ex{lpr}]
 | |
|   The line printer spooling system: lpr, lpc, lpd, etc.
 | |
| 
 | |
| \item[\ex{mail}]
 | |
|   The mail system.
 | |
| 
 | |
| \item[\ex{news}]
 | |
|   The network news system.
 | |
| 
 | |
| \item[\ex{user}]
 | |
|   Messages generated by random user processes.
 | |
| 
 | |
| \item[\ex{uucp}]
 | |
|   The uucp system.
 | |
| 
 | |
| \item[\ex{local0} \ex{local1} \ex{local2} \ex{local3} \ex{local4} \ex{local5} \ex{local6} \ex{local7}]
 | |
|   Reserved for local use.
 | |
| \end{description}
 | |
|                                 
 | |
| \subsection*{Log levels}
 | |
| 
 | |
| A log level identifies the importance of a message from a fixed set
 | |
| of possible levels.
 | |
| 
 | |
| \dfn{syslog-level}{level-name}{level}{syntax}
 | |
| \defun{syslog-level?}{x}{boolean}
 | |
| %
 | |
| \begin{desc}
 | |
|   \ex{Syslog-level} is macro that expands into an expression returning
 | |
|   a facility for a given name.  \ex{Syslog-level?} is a predicate for
 | |
|   facilities.  Levels are comparable via \ex{eq?}.
 | |
| \end{desc}
 | |
| %
 | |
| Here is a list of possible names of syslog levels:
 | |
| 
 | |
| \begin{description}
 | |
| \item[\ex{emergency}]
 | |
|   A panic condition.  This is normally broadcast to all users.
 | |
| 
 | |
| \item[\ex{alert}]
 | |
|   A condition that should be corrected immediately, such as a
 | |
|   corrupted system database.
 | |
| 
 | |
| \item[\ex{critical}]
 | |
|   Critical conditions, e.g., hard device errors.
 | |
| 
 | |
| \item[\ex{error}]
 | |
|   Errors.
 | |
| 
 | |
| \item[\ex{warning}]
 | |
|   Warning messages.
 | |
| 
 | |
| \item[\ex{notice}]
 | |
|   Conditions that are not error conditions, but should possibly be
 | |
|   handled specially.
 | |
| 
 | |
| \item[\ex{info}]
 | |
|   Informational messages.
 | |
| 
 | |
| \item[\ex{debug}]
 | |
|   Messages that contain information normally of use only when
 | |
|   debugging a program.
 | |
| \end{description}
 | |
| 
 | |
| \subsection*{Log masks}
 | |
| 
 | |
| A log masks can mask out log messages at a set of levels.  A log
 | |
| mask is an enum set of log levels.
 | |
| 
 | |
| \defun{make-syslog-mask}{list}{mask}
 | |
| \dfn{syslog-mask}{level-name \ldots}{mask}{syntax}
 | |
| \defvar{syslog-mask-all}{mask}
 | |
| \defun{syslog-mask-upto}{level}{mask}
 | |
| \defun{syslog-mask?}{x}{boolean}
 | |
| 
 | |
| \begin{desc}
 | |
|   \ex{Make-syslog-mask} constructs a mask from a list of levels.
 | |
|   \ex{Syslog-mask} is a macro which constructs a mask from names of
 | |
|   levels.  \ex{Syslog-mask-all} is a predefined log mask containing
 | |
|   all levels.  \ex{Syslog-mask-upto} returns a mask consisting of all
 | |
|   levels up to and including a certain level, starting with
 | |
|   \ex{emergency}.
 | |
| \end{desc}
 | |
| 
 | |
| \subsection*{Logging}
 | |
| 
 | |
| Scheme~48 dynamically maintains implicit connections to the syslog
 | |
| facility specifying a current identifier, current options, a current
 | |
| facility and a current log mask.  This implicit connection is held in
 | |
| a thread fluid (see
 | |
| Section~\ref{sec:ps_interac}).  Hence, every thread
 | |
| maintains it own implicit connection to syslog.  Note that the
 | |
| connection is not implicitly preserved across a \ex{spawn}, but it
 | |
| is preserved across a \ex{fork-thread}:
 | |
| 
 | |
| 
 | |
| \defun{with-syslog-destination}{string options facility mask thunk}{value}
 | |
| \defun{set-syslog-destination!}{string options facility mask}{undefined}
 | |
| %
 | |
| \begin{desc}
 | |
|   \ex{With-syslog-destination} dynamically binds parameters of the
 | |
|   implicit connection to the syslog facility and runs \var{thunk}
 | |
|   within those parameter bindings, returning what \var{thunk}
 | |
|   returns.  Each of the parameters may be \ex{\#f} in which case the
 | |
|   previous values will be used.  \ex{Set-syslog-destination!} sets the
 | |
|   parameters of the implicit connection of the current thread.
 | |
| \end{desc}
 | |
| 
 | |
| \defun{syslog}{level message}{undefined}
 | |
| \defun{syslog}{level message [string options syslog-facility]}{undefined}
 | |
| %
 | |
| \begin{desc}
 | |
|   \ex{Syslog} actually logs a message.  Each of the parameters of the
 | |
|   implicit connection (except for the log mask) can be explicitly
 | |
|   specified as well for the current call to \ex{syslog}, overriding
 | |
|   the parameters of the channel.  The parameters revert to their
 | |
|   original values after the call.
 | |
| \end{desc}
 | |
| 
 | |
| \subsection*{Syslog channels}
 | |
| %
 | |
| The \ex{syslog-channels} structure allows direct manipulation of
 | |
| syslog channels, the objects that represent connections to the syslog
 | |
| facility.  Note that it is
 | |
| not necessary to explicitly open a syslog channel to do logging.
 | |
| 
 | |
| \defun{open-syslog-channel}{string options facility mask}{channel}
 | |
| \defun{close-syslog-channel}{channel}{undefined}
 | |
| \defun{syslog}{level message channel}{undefined}
 | |
| %
 | |
| \begin{desc}
 | |
|   \ex{Open-syslog-channel} and \ex{close-syslog-channel} create and
 | |
|   destroy a connection to the syslog facility, respectively.  The
 | |
|   specified form of calling \ex{syslog} logs to the specified channel.
 | |
| \end{desc}
 | |
| 
 | |
| 
 | |
| \section{MD5 interface}
 | |
| \label{sec:md5}
 | |
| 
 | |
| Scsh provides a direct interface to the MD5 functions to compute the
 | |
| ``fingerprint'' or ``message digest'' of a file or string. It uses the
 | |
| C library written by Colin Plum.
 | |
| 
 | |
| \defun{md5-digest-for-string}{string}{md5-digest}
 | |
| \begin{desc}
 | |
|   Calculates the MD5 digest for the given string.
 | |
| \end{desc}
 | |
| \defun{md5-digest-for-port}{port [buffer-size]}{md5-digest}
 | |
| \begin{desc}
 | |
|   Reads the contents of the port and calculates the MD5 digest for it.
 | |
|   The optional argument \var{buffer-size} determines the size of the
 | |
|   port's input buffer in bytes. It defaults to 1024 bytes.
 | |
| \end{desc}
 | |
| 
 | |
| \defun{md5-digest?}{thing}{boolean}
 | |
| \begin{desc}
 | |
|   The type predicate for MD5 digests: \ex{md5-digest?} returns true if
 | |
|   and only if \var{thing} is a MD5 digest.
 | |
| \end{desc}
 | |
| \defun{md5-digest->number}{md5-digest}{number}
 | |
| \begin{desc}
 | |
|   Returns the number corresponding to the MD5 digest.
 | |
| \end{desc}
 | |
| \defun{number->md5-digest}{number}{md5-digest}
 | |
| \begin{desc}
 | |
|   Creates a MD5 digest from a number.
 | |
| \end{desc}
 | |
| 
 | |
| \defun{make-md5-context}{}{md5-context}
 | |
| \defunx{md5-context?}{thing}{boolean}
 | |
| \defunx{update-md5-context!}{md5-context string}\undefined
 | |
| \defunx{md5-context->md5-digest}{md5-context}{md5-digest}
 | |
| \begin{desc}
 | |
|   These procedures provide a low-level interface to the library. A
 | |
|   \var{md5-context} stores the state of a MD5 computation, it is
 | |
|   created by \ex{make-md5-context}, its type predicate is
 | |
|   \ex{md5-context?}. The procedure \ex{update-md5-context!} extends
 | |
|   the \var{md5-context} by the given string. Finally,
 | |
|   \ex{md5-context->md5-digest} returns the \var{md5-digest} for the
 | |
|   \var{md5-context}. With these procedures it is possible to
 | |
|   incrementally add strings to a \var{md5-context} before computing
 | |
|   the digest.
 | |
| \end{desc}
 | |
| 
 | |
| %%% Local Variables: 
 | |
| %%% mode: latex
 | |
| %%% TeX-master: "man"
 | |
| %%% End: 
 |