home *** CD-ROM | disk | FTP | other *** search
- /* system.h
- Header file for system dependent stuff in the Taylor UUCP package.
- This file is not itself system dependent.
-
- Copyright (C) 1991, 1992, 1993, 1994, 1995 Ian Lance Taylor
-
- This file is part of the Taylor UUCP package.
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- The author of the program may be contacted at ian@airs.com or
- c/o Cygnus Support, 48 Grove Street, Somerville, MA 02144.
- */
-
- #ifndef SYSTEM_H
-
- #define SYSTEM_H
-
- #if ANSI_C
- /* These structures are used in prototypes but are not defined in this
- header file. */
- struct tm;
- struct uuconf_system;
- struct uuconf_port;
- struct sconnection;
- struct sstatus;
- struct scmd;
- #endif
-
- /* Any function which returns an error should also report an error
- message, unless otherwise indicated.
-
- Any function that returns a char *, rather than a const char *, is
- returning a pointer to a buffer allocated by zbufalc which must be
- freed using ubuffree, unless otherwise indicated. */
-
- /* The maximum length of a remote system name. */
- extern size_t cSysdep_max_name_len;
-
- /* Initialize. If something goes wrong, this routine should just
- exit. The flag argument is 0, or a combination of any of the
- following flags. */
-
- /* This program needs to know the current working directory. This is
- used because on Unix it can be expensive to determine the current
- working directory (some versions of getcwd fork a process), but in
- most cases we don't need to know it. However, we are going to
- chdir to the spool directory (unless INIT_CHDIR is set), so we have
- to get the cwd now if we are ever going to get it. Both uucp and
- uux use the function fsysdep_needs_cwd to determine whether they
- will need the current working directory, and pass the argument to
- usysdep_initialize appropriately. There's probably a cleaner way
- to handle this, but this will suffice for now. */
- #define INIT_GETCWD (01)
-
- /* This program should not chdir to the spool directory. This may
- only make sense on Unix. It is set by cu. */
- #define INIT_NOCHDIR (02)
-
- /* This program needs special access to the spool directories. That
- means, on Unix, this program is normally installed setuid. */
- #define INIT_SUID (04)
-
- /* Do not close all open descriptors. This is not used by the UUCP
- code, but it is used by other programs which share some of the
- system dependent libraries. */
- #define INIT_NOCLOSE (010)
-
- extern void usysdep_initialize P((pointer puuconf, int iflags));
-
- /* Exit the program. The fsuccess argument indicates whether to
- return an indication of success or failure to the outer
- environment. This routine should not return. */
- extern void usysdep_exit P((boolean fsuccess));
-
- /* Called when a non-standard configuration file is being used, to
- avoid handing out privileged access. If it returns FALSE, default
- configuration file will be used. This is called before the
- usysdep_initialize function is called. */
- extern boolean fsysdep_other_config P((const char *));
-
- /* Detach from the controlling terminal. This probably only makes
- sense on Unix. It is called by uucico to try to get the modem port
- as a controlling terminal. It is also called by uucico before it
- starts up uuxqt, so that uuxqt will be a complete daemon. */
- extern void usysdep_detach P((void));
-
- /* Get the local node name if it is not specified in the configuration
- files. Returns NULL on error; otherwise the return value should
- point to a static buffer. */
- extern const char *zsysdep_localname P((void));
-
- /* Get the login name. This is used when uucico is started up with no
- arguments in slave mode, which causes it to assume that somebody
- has logged in. It also used by uucp and uux for recording the user
- name. This may not return NULL. The return value should point to
- a static buffer. */
- extern const char *zsysdep_login_name P((void));
-
- /* Set a signal handler for a signal. If the signal occurs, the
- appropriate element of afSignal should be set to the signal number
- (see the declaration of afSignal in uucp.h). This routine might be
- able to just use signal, but Unix requires more complex handling.
- This is called before usysdep_initialize. */
- extern void usysdep_signal P((int isig));
-
- /* Catch a signal. This is actually defined as a macro in the system
- dependent header file, and the prototype here just indicates how it
- should be called. It is called before a routine which must exit if
- a signal occurs, and is expected to set do a setjmp (which is why
- it must be a macro). It is actually only called in one place in
- the system independent code, before the call to read stdin in uux.
- This is needed to handle 4.2 BSD restartable system calls, which
- require a longjmp. On systems which don't need to do
- setjmp/longjmp around system calls, this can be redefined in
- sysdep.h to TRUE. It should return TRUE if the routine should
- proceed, or FALSE if a signal occurred. After having this return
- TRUE, usysdep_start_catch should be used to start catching the
- signal; this basically tells the signal handler that it's OK to do
- the longjmp, if fsysdep_catch did not already do so. */
- #ifndef fsysdep_catch
- extern boolean fsysdep_catch P((void));
- #endif
-
- /* Start catching a signal. This is called after fsysdep_catch to
- tell the signal handler to go ahead and do the longjmp. This may
- be implemented as a macro in sysdep.h. */
- #ifndef usysdep_start_catch
- extern void usysdep_start_catch P((void));
- #endif
-
- /* Stop catching a signal. This is called when it is no longer
- necessary for fsysdep_catch to handle signals. This may be
- implemented as a macro in sysdep.h. */
- #ifndef usysdep_end_catch
- extern void usysdep_end_catch P((void));
- #endif
-
- /* Link two files. On Unix this should attempt the link. If it
- succeeds it should return TRUE with *pfworked set to TRUE. If the
- link fails because it must go across a device, it should return
- TRUE with *pfworked set to FALSE. If the link fails for some other
- reason, it should log an error message and return FALSE. On a
- system which does not support links to files, this should just
- return TRUE with *pfworked set to FALSE. */
- extern boolean fsysdep_link P((const char *zfrom, const char *zto,
- boolean *pfworked));
-
- /* Get the port name. This is used when uucico is started up in slave
- mode to figure out which port was used to call in so that it can
- determine any appropriate protocol parameters. This may return
- NULL if the port cannot be determined, which will just mean that no
- protocol parameters are applied. The name returned should be the
- sort of name that would appear in the port file. This should set
- *pftcp_port to TRUE if it can determine that the port is a TCP
- connection rather than a normal serial port. The return value (if
- not NULL) should point to a static buffer. */
- extern const char *zsysdep_port_name P((boolean *pftcp_port));
-
- /* Expand a file name on the local system. On Unix, if the zfile
- argument begins with ~user/ it goes in that users home directory,
- and if it begins with ~/ it goes in the public directory (the
- public directory is passed to this routine, since each system may
- have its own public directory). Similar conventions may be
- desirable on other systems. This should always return an absolute
- path name, probably in the public directory. It should return NULL
- on error; otherwise the return value should be allocated using
- zbufcpy or zbufalc. If pfbadname is not NULL, then if the function
- returns NULL *pfbadname should be set to TRUE if the error is just
- that the file name is badly specified; *pfbadname should be set to
- FALSE for some sort of internal error. */
- extern char *zsysdep_local_file P((const char *zname,
- const char *zpubdir,
- boolean *pfbadname));
-
- /* Return whether a file name is in a directory, and check for read or
- write access. This should check whether zfile is within zdir (or
- is zdir itself). If it is not, it should return FALSE. If zfile
- is in zdir, then fcheck indicates whether further checking should
- be done. If fcheck is FALSE, no further checking is done.
- Otherwise, if freadable is TRUE the user zuser should have search
- access to all directories from zdir down to zfile and should have
- read access on zfile itself (if zfile does not exist, or is not a
- regular file, this function may return FALSE but does not have to).
- If freadable is FALSE, the user zuser should have search access to
- all directories from zdir down to zfile and should have write
- access on zfile (which may be a directory, or may not actually
- exist, which is acceptable). The zuser argument may be NULL, in
- which case the check should be made for any user, not just zuser.
- There is no way for this function to return error. */
- extern boolean fsysdep_in_directory P((const char *zfile,
- const char *zdir,
- boolean fcheck,
- boolean freadable,
- const char *zuser));
-
- /* Return TRUE if a file exists, FALSE otherwise. There is no way to
- return error. */
- extern boolean fsysdep_file_exists P((const char *zfile));
-
- /* Start up a program. If the ffork argument is true, this should
- spawn a new process and return. If the ffork argument is false,
- this may either return or not. The three string arguments may be
- catenated together to form the program to execute; I did it this
- way to make it easy to call execl(2), and because I never needed
- more than two arguments. The program will always be "uucico" or
- "uuxqt". The return value should be TRUE on success, FALSE on
- error. */
- extern boolean fsysdep_run P((boolean ffork, const char *zprogram,
- const char *zarg1, const char *zarg2));
-
- /* Send a mail message. This function will be passed an array of
- strings. All necessary newlines are already included; the strings
- should simply be concatenated together to form the mail message.
- It should return FALSE on error, although the return value is often
- ignored. */
- extern boolean fsysdep_mail P((const char *zto, const char *zsubject,
- int cstrs, const char **paz));
-
- /* Get the time in seconds since some epoch. The actual epoch is
- unimportant, so long as the time values are consistent across
- program executions and the value is never negative. If the
- pimicros argument is not NULL, it should be set to the number of
- microseconds (if this is not available, *pimicros should be set to
- zero). */
- extern long ixsysdep_time P((long *pimicros));
-
- /* Get the time in seconds and microseconds (millionths of a second)
- since some epoch. The actual epoch is not important, and it may
- change in between program invocations; this is provided because on
- Unix the times function may be used. If microseconds can not be
- determined, *pimicros can just be set to zero. */
- extern long ixsysdep_process_time P((long *pimicros));
-
- /* Parse the value returned by ixsysdep_time into a struct tm. I
- assume that this structure is defined in <time.h>. This is
- basically just localtime, except that the ANSI function takes a
- time_t which may not be what is returned by ixsysdep_time. */
- extern void usysdep_localtime P((long itime, struct tm *q));
-
- /* Sleep for a number of seconds. */
- extern void usysdep_sleep P((int cseconds));
-
- /* Pause for half a second, or 1 second if subsecond sleeps are not
- possible. */
- extern void usysdep_pause P((void));
-
- /* Lock a remote system. This should return FALSE if the system is
- already locked (no error should be reported). */
- extern boolean fsysdep_lock_system P((const struct uuconf_system *qsys));
-
- /* Unlock a remote system. This should return FALSE on error
- (although the return value is generally ignored). */
- extern boolean fsysdep_unlock_system P((const struct uuconf_system *qsys));
-
- /* Get the conversation sequence number for a remote system, and
- increment it for next time. This should return -1 on error. */
- extern long ixsysdep_get_sequence P((const struct uuconf_system *qsys));
-
- /* Get the status of a remote system. This should return FALSE on
- error. Otherwise it should set *qret to the status. If no status
- information is available, this should set *qret to sensible values
- and return TRUE. If pfnone is not NULL, then it should be set to
- TRUE if no status information was available or FALSE otherwise. */
- extern boolean fsysdep_get_status P((const struct uuconf_system *qsys,
- struct sstatus *qret,
- boolean *pfnone));
-
- /* Set the status of a remote system. This should return FALSE on
- error. The system will be locked before this call is made. */
- extern boolean fsysdep_set_status P((const struct uuconf_system *qsys,
- const struct sstatus *qset));
-
- /* See whether a remote system is permitted to log in. This is just
- to support the remote.unknown shell script for HDB. The zscript
- argument is the script name, as return by uuconf_remote_unknown.
- The zsystem argument is the name given by the remote system. If
- the system is not permitted to log in, this function should log an
- error and return FALSE. */
- extern boolean fsysdep_unknown_caller P((const char *zscript,
- const char *zsystem));
-
- /* Check whether there is work for a remote system. It should return
- TRUE if there is work, FALSE otherwise; there is no way to indicate
- an error. */
- extern boolean fsysdep_has_work P((const struct uuconf_system *qsys));
-
- /* Initialize the work scan. This will be called before
- fsysdep_get_work. The bgrade argument is the minimum grade of
- execution files that should be considered (e.g. a bgrade of 'd'
- will allow all grades from 'A' to 'Z' and 'a' to 'd'). This
- function should return FALSE on error. */
- extern boolean fsysdep_get_work_init P((const struct uuconf_system *qsys,
- int bgrade));
-
- /* Get the next command to be executed for a remote system. The
- bgrade argument will be the same as for fsysdep_get_work_init;
- probably only one of these functions will use it, namely the
- function for which it is more convenient. This should return FALSE
- on error. The structure pointed to by qcmd should be filled in.
- The strings may point into a static buffer; they will be copied out
- if necessary. If there is no more work, this should set qcmd->bcmd
- to 'H' and return TRUE. This should set qcmd->pseq to something
- which can be passed to fsysdep_did_work to remove the job from the
- queue when it has been completed. This may set qcmd->bcmd to 'P'
- to represent a poll file; the main code will just pass the pseq
- element of such a structure to fsysdep_did_work if the system is
- called. */
- extern boolean fsysdep_get_work P((const struct uuconf_system *qsys,
- int bgrade, struct scmd *qcmd));
-
- /* Remove a job from the work queue. This must also remove the
- temporary file used for a send command, if there is one. It should
- return FALSE on error. */
- extern boolean fsysdep_did_work P((pointer pseq));
-
- /* Save the temporary file for a send command. This function should
- return a string that will be put into a mail message. On success
- this string should say something like ``The file has been saved as
- ...''. On failure it could say something like ``The file could not
- be saved because ...''. If there is no temporary file, or for some
- reason it's not appropriate to include a message, this function
- should just return NULL. This function is used when a file send
- fails for some reason, to make sure that we don't completely lost
- the file. */
- extern const char *zsysdep_save_temp_file P((pointer pseq));
-
- /* Save a file in a location used to hold corrupt files. This is
- called if a bad execution file is found by uuxqt. This should
- return the new name of the file (allocated by zbufalc), or NULL if
- the move failed (in which the original file should remain). */
- extern char *zsysdep_save_corrupt_file P((const char *zfile));
-
- /* Save a file in a location used to hold failed execution files.
- This is called if a uuxqt execution fails. This should return the
- new name of the file (allocated by zbufalc), or NULL if the move
- failed (in which case the original file should remain). */
- extern char *zsysdep_save_failed_file P((const char *zfile));
-
- /* Cleanup anything left over by fsysdep_get_work_init and
- fsysdep_get_work. This may be called even though
- fsysdep_get_work_init has not been. */
- extern void usysdep_get_work_free P((const struct uuconf_system *qsys));
-
- /* Add a base name to a file if it is a directory. If zfile names a
- directory, then return a string naming a file within the directory
- with the base file name of zname. This should return NULL on
- error. */
- extern char *zsysdep_add_base P((const char *zfile,
- const char *zname));
-
- /* Get a file name from the spool directory. This should return NULL
- on error. The pseq argument is TRUE if the file was found from
- searching the work directory; this is, unfortunately, needed to
- support SVR4 spool directories. */
- extern char *zsysdep_spool_file_name P((const struct uuconf_system *qsys,
- const char *zfile,
- pointer pseq));
-
- /* Make necessary directories. This should create all non-existent
- directories for a file. If the fpublic argument is TRUE, anybody
- should be permitted to create and remove files in the directory;
- otherwise anybody can list the directory, but only the UUCP system
- can create and remove files. It should return FALSE on error. */
- extern boolean fsysdep_make_dirs P((const char *zfile, boolean fpublic));
-
- /* Create a stdio file, setting appropriate protection. If the
- fpublic argument is TRUE, the file is made publically accessible;
- otherwise it is treated as a private data file. If the fappend
- argument is TRUE, the file is opened in append mode; otherwise any
- previously existing file of the same name is removed. If the
- fmkdirs argument is TRUE, then any necessary directories should
- also be created. On a system in which file protections are
- unimportant and the necessary directories exist, this may be
- implemented as
-
- fopen (zfile, fappend ? "a" : "w");
-
- */
- extern FILE *esysdep_fopen P((const char *zfile, boolean fpublic,
- boolean fappend, boolean fmkdirs));
-
- /* Open a file, using the access permission of the user who invoked
- the program. The frd argument is TRUE if the file should be opened
- for reading, and the fbinary argument is TRUE if the file should be
- opened as a binary file (this is ignored on Unix, since there all
- files are binary files). This returns an openfile_t, not a FILE *.
- This is supposed to be able to open a file even if it can not be
- read by the uucp user. This is not possible on some older Unix
- systems. */
- extern openfile_t esysdep_user_fopen P((const char *zfile,
- boolean frd, boolean fbinary));
-
- /* Open a file to send to another system; the qsys argument is the
- system the file is being sent to. If fcheck is TRUE, it should
- make sure that the file is readable by zuser (if zuser is NULL the
- file must be readable by anybody). This is to eliminate a window
- between fsysdep_in_directory and esysdep_open_send. If an error
- occurs, it should return EFILECLOSED. */
- extern openfile_t esysdep_open_send P((const struct uuconf_system *qsys,
- const char *zname,
- boolean fcheck,
- const char *zuser));
-
- /* Return a temporary file name to receive into. This file will be
- opened by esysdep_open_receive. The qsys argument is the system
- the file is coming from, the zto argument is the name the file will
- have after it has been fully received, the ztemp argument, if it is
- not NULL, is from the command sent by the remote system, and the
- frestart argument is TRUE if the protocol and remote system permit
- file transfers to be restarted. The return value must be freed
- using ubuffree. The function should return NULL on error. */
- extern char *zsysdep_receive_temp P((const struct uuconf_system *qsys,
- const char *zfile,
- const char *ztemp,
- boolean frestart));
-
- /* Open a file to receive from another system. The zreceive argument
- is the return value of zsysdep_receive_temp with the same qsys,
- zfile and ztemp arguments. If the function can determine that this
- file has already been partially received, it should set *pcrestart
- to the number of bytes that have been received. If the file has
- not been partially received, *pcrestart should be set to -1.
- pcrestart will be passed in as NULL if file restart is not
- supported by the protocol or the remote system. The function
- should return EFILECLOSED on error. After the file is written,
- fsysdep_move_file will be called to move the file to its final
- destination, and to set the correct file mode. */
- extern openfile_t esysdep_open_receive P((const struct uuconf_system *qsys,
- const char *zto,
- const char *ztemp,
- const char *zreceive,
- long *pcrestart));
-
- /* Move a file. This is used to move a received file to its final
- location. The zto argument is the file to create. The zorig
- argument is the name of the file to move. If fmkdirs is TRUE, then
- any necessary directories are created; fpublic indicates whether
- they should be publically writeable or not. If fcheck is TRUE,
- this should make sure the directory is writeable by the user zuser
- (if zuser is NULL, then it must be writeable by any user); this is
- to avoid a window of vulnerability between fsysdep_in_directory and
- fsysdep_move_file. This function should return FALSE on error, in
- which case the zorig file should still exist. */
- extern boolean fsysdep_move_file P((const char *zorig, const char *zto,
- boolean fmkdirs, boolean fpublic,
- boolean fcheck, const char *zuser));
-
- /* Change the mode of a file. The imode argument is a Unix mode.
- This should return FALSE on error. */
- extern boolean fsysdep_change_mode P((const char *zfile,
- unsigned int imode));
-
- /* Truncate a file which we are receiving into. This may be done by
- closing the original file, removing it and reopening it. This
- should return FALSE on error. */
- extern openfile_t esysdep_truncate P((openfile_t e, const char *zname));
-
- /* Sync a file to disk. If this fails it should log an error using
- the zmsg parameter, and return FALSE. This is controlled by the
- FSYNC_ON_CLOSE macro in policy.h. */
- extern boolean fsysdep_sync P((openfile_t e, const char *zmsg));
-
- /* It is possible for the acknowledgement of a received file to be
- lost. The sending system will then now know that the file was
- correctly received, and will send it again. This can be a problem
- particularly with protocols which support channels, since they may
- send several small files in a single window, all of which may be
- received correctly although the sending system never sees the
- acknowledgement. If these files involve an execution, the
- execution will happen twice, which will be bad.
-
- This function is called when a file is completely received. It is
- supposed to try and remember the reception, in case the connection
- is lost. It is passed the system, the file name to receive to, and
- the temporary file name from the sending system. It should return
- FALSE on error. */
- extern boolean fsysdep_remember_reception P((const struct uuconf_system *qsys,
- const char *zto,
- const char *ztemp));
-
- /* This function is called to see if a file has already been received
- successfully. It gets the same arguments as
- fsysdep_remember_reception. It should return TRUE if the file was
- already received, FALSE otherwise. There is no way to report
- error. */
- extern boolean fsysdep_already_received P((const struct uuconf_system *qsys,
- const char *zto,
- const char *ztemp));
-
- /* This function is called when it is no longer necessary to remember
- that a file has been received. This will be called when the
- protocol knows that the receive message has been acknowledged. It
- gets the same arguments as fsysdep_remember_reception. it should
- return FALSE on error. */
- extern boolean fsysdep_forget_reception P((const struct uuconf_system *qsys,
- const char *zto,
- const char *ztemp));
-
- /* Start expanding a wildcarded file name. This should return FALSE
- on error; otherwise subsequent calls to zsysdep_wildcard should
- return file names. */
- extern boolean fsysdep_wildcard_start P((const char *zfile));
-
- /* Get the next wildcard name. This should return NULL when there are
- no more names to return. The return value should be freed using
- ubuffree. The argument should be the same as that to
- fsysdep_wildcard_start. There is no way to return error. */
- extern char *zsysdep_wildcard P((const char *zfile));
-
- /* Finish getting wildcard names. This may be called before or after
- zsysdep_wildcard has returned NULL. It should return FALSE on
- error. */
- extern boolean fsysdep_wildcard_end P((void));
-
- /* Prepare to execute a bunch of file transfer requests. This should
- make an entry in the spool directory so that the next time uucico
- is started up it will transfer these files. The bgrade argument
- specifies the grade of the commands. The commands themselves are
- in the pascmds array, which has ccmds entries. The function should
- return NULL on error, or the jobid on success. The jobid is a
- string that may be printed or passed to fsysdep_kill_job and
- related functions, but is otherwise uninterpreted. */
- extern char *zsysdep_spool_commands P((const struct uuconf_system *qsys,
- int bgrade, int ccmds,
- const struct scmd *pascmds));
-
- /* Get a file name to use for a data file to be copied to another
- system. The ztname, zdname and zxname arguments will all either be
- NULL or point to an array of CFILE_NAME_LEN characters in length.
- The ztname array should be set to a temporary file name that could
- be passed to zsysdep_spool_file_name to retrieve the return value
- of this function; this will be appropriate for the temporary name
- in a send request. The zdname array should be set to a data file
- name that is appropriate for the spool directory of the other
- system; this will be appropriate for the name of the destination
- file in a send request of a data file for an execution of some
- sort. The zxname array should be set to an execute file name that
- is appropriate for the other system. The zlocalname argument is
- the name of the local system as seen by the remote system, the
- bgrade argument is the grade, and fxqt is TRUE if this file is
- going to become an execution file. This should return NULL on
- error. */
- #define CFILE_NAME_LEN (15)
-
- extern char *zsysdep_data_file_name P((const struct uuconf_system *qsys,
- const char *zlocalname,
- int bgrade, boolean fxqt,
- char *ztname, char *zdname,
- char *zxname));
-
- /* Get a name for a local execute file. This is used by uux for a
- local command with remote files. Returns NULL on error. */
- extern char *zsysdep_xqt_file_name P((void));
-
- /* Beginning getting execute files. To get a list of execute files,
- first fsysdep_get_xqt_init is called, then zsysdep_get_xqt is
- called several times until it returns NULL, then finally
- usysdep_get_xqt_free is called. If the zsystem argument is not
- NULL, it is the name of a system for which execution files are
- desired. */
- extern boolean fsysdep_get_xqt_init P((const char *zsystem));
-
- /* Get the next execute file. This should return NULL when finished
- (with *pferr set to FALSE). The zsystem argument should be the
- same string as that passed to fsysdep_get_xqt_init. On an error
- this should return NULL with *pferr set to TRUE. This should set
- *pzsystem to the name of the system for which the execute file was
- created; this is not guaranteed to match the zsystem argument--that
- must be double checked by the caller. Both the return value and
- *pzsystem should be freed using ubuffree. */
- extern char *zsysdep_get_xqt P((const char *zsystem, char **pzsystem,
- boolean *pferr));
-
- /* Clean up after getting execute files. The zsystem argument should
- be the same string as that passed to fsysdep_get_xqt_init. */
- extern void usysdep_get_xqt_free P((const char *zsystem));
-
- /* Get the absolute pathname of a command to execute. This is given
- the legal list of commands (which may be the special case "ALL")
- and the path. It must return an absolute pathname to the command.
- If it gets an error it should set *pferr to TRUE and return NULL;
- if the command is not found it should set *pferr to FALSE and
- return NULL. */
- extern char *zsysdep_find_command P((const char *zcmd, char **pzcmds,
- char **pzpath, boolean *pferr));
-
- /* Expand file names for uuxqt. This exists because uuxqt on Unix has
- to expand file names which begin with a ~. It does not want to
- expand any other type of file name, and it turns a double ~ into a
- single one without expanding. If this returns NULL, the file does
- not need to be changed; otherwise it returns a zbufalc'ed string.
- There is no way to report error. */
- extern char *zsysdep_xqt_local_file P((const struct uuconf_system *qsys,
- const char *zfile));
-
- #if ! ALLOW_FILENAME_ARGUMENTS
- /* Check an argument to an execution command to make sure that it
- doesn't refer to a file name that may not be accessed. This should
- check the argument to see if it is a filename. If it is, it should
- either reject it out of hand or it should call fin_directory_list
- on the file with both qsys->zremote_receive and qsys->zremote_send.
- If the file is rejected, it should log an error and return FALSE.
- Otherwise it should return TRUE. */
- extern boolean fsysdep_xqt_check_file P((const struct uuconf_system *qsys,
- const char *zfile));
- #endif /* ! ALLOW_FILENAME_ARGUMENTS */
-
- /* Run an execute file. The arguments are:
-
- qsys -- system for which execute file was created
- zuser -- user who requested execution
- pazargs -- list of arguments to command (element 0 is command)
- zfullcmd -- command and arguments stuck together in one string
- zinput -- file name for standard input (may be NULL)
- zoutput -- file name for standard output (may be NULL)
- fshell -- if TRUE, use /bin/sh to execute file
- ilock -- return value of ixsysdep_lock_uuxqt
- pzerror -- set to name of standard error file
- pftemp -- set to TRUE if error is temporary, FALSE otherwise
-
- If fshell is TRUE, the command should be executed with /bin/sh
- (obviously, this can only really be done on Unix systems). If an
- error occurs this should return FALSE and set *pftemp
- appropriately. *pzerror should be freed using ubuffree. */
- extern boolean fsysdep_execute P((const struct uuconf_system *qsys,
- const char *zuser,
- const char **pazargs,
- const char *zfullcmd,
- const char *zinput,
- const char *zoutput,
- boolean fshell,
- int ilock,
- char **pzerror,
- boolean *pftemp));
-
- /* Lock for uuxqt execution. If the cmaxuuxqts argument is not zero,
- this should make sure that no more than cmaxuuxqts uuxqt processes
- are running at once. Also, only one uuxqt may execute a particular
- command (specified by the -c option) at a time. If zcmd is not
- NULL, it is a command that must be locked. This should return a
- nonnegative number which will be passed to other routines,
- including fsysdep_unlock_uuxqt, or -1 on error. */
- extern int ixsysdep_lock_uuxqt P((const char *zcmd,
- int cmaxuuxqts));
-
- /* Unlock a uuxqt process. This is passed the return value of
- ixsysdep_lock_uuxqt, as well as the arguments passed to
- ixsysdep_lock_uuxqt. It may return FALSE on error, but at present
- the return value is ignored. */
- extern boolean fsysdep_unlock_uuxqt P((int iseq, const char *zcmd,
- int cmaxuuxqts));
-
- /* See whether a particular uuxqt command is locked. This should
- return TRUE if the command is locked (because ixsysdep_lock_uuxqt
- was called with it as an argument), FALSE otherwise. There is no
- way to return error. */
- extern boolean fsysdep_uuxqt_locked P((const char *zcmd));
-
- /* Lock an execute file in order to execute it. This should return
- FALSE if the execute file is already locked. There is no way to
- return error. */
- extern boolean fsysdep_lock_uuxqt_file P((const char *zfile));
-
- /* Unlock an execute file. This should return FALSE on error. */
- extern boolean fsysdep_unlock_uuxqt_file P((const char *zfile));
-
- /* Lock the execution directory. The ilock argument is the return
- value of ixsysdep_lock_uuxqt. This should return FALSE if the
- directory is already locked. There is no way to return error. */
- extern boolean fsysdep_lock_uuxqt_dir P((int ilock));
-
- /* Remove all files in the execution directory, and unlock it. This
- should return FALSE on error. */
- extern boolean fsysdep_unlock_uuxqt_dir P((int ilock));
-
- /* Move files into or out of the execution directory. The code will
- already have checked that all the files exist. The elements in the
- pzfrom array will be complete filenames, and the elements in the
- pzto array will be either NULL (in which case the file should not
- be moved) or simple base names. If fto is TRUE, the files in
- pzfrom should be moved to pzto; otherwise, the files in pzto should
- be moved to pzfrom (this is used if a temporary failure occurs, in
- which case the execution will be retried later). If pzinput and
- *pzinput are not NULL, then it is the name of the standard input
- file; if it is the same as any element of pzfrom, then *pzinput
- should be set to the zbufcpy of the corresponding pzto value, if
- any. */
- extern boolean fsysdep_move_uuxqt_files P((int cfiles,
- const char *const *pzfrom,
- const char *const *pzto,
- boolean fto, int ilock,
- char **pzinput));
-
- /* Expand a file name on the local system, defaulting to the current
- directory. This is just like zsysdep_local_file, except that
- relative files are placed in the working directory the program
- started in rather than in the public directory. This should return
- NULL on error. */
- extern char *zsysdep_local_file_cwd P((const char *zname,
- const char *zpubdir,
- boolean *pfbadname));
-
- /* Add the working directory to a file name. The named file is
- actually on a remote system. If the file already has a directory,
- it should not be changed. This should return NULL on error. */
- extern char *zsysdep_add_cwd P((const char *zfile));
-
- /* See whether a file name will need the current working directory
- when zsysdep_local_file_cwd or zsysdep_add_cwd is called on it.
- This will be called before usysdep_initialize. It should just
- check whether the argument is an absolute path. See the comment
- above usysdep_initialize in this file for an explanation of why
- things are done this way. */
- extern boolean fsysdep_needs_cwd P((const char *zfile));
-
- /* Get the base name of a file. The file will be a local file name,
- and this function should return the base file name, ideally in a
- form which will make sense on most systems; it will be used if the
- destination of a uucp is a directory. */
- extern char *zsysdep_base_name P((const char *zfile));
-
- /* Return a filename within a directory. */
- extern char *zsysdep_in_dir P((const char *zdir, const char *zfile));
-
- /* Get the mode of a file. This should return a Unix style file mode.
- It should return 0 on error. */
- extern unsigned int ixsysdep_file_mode P((const char *zfile));
-
- /* See whether the user has access to a file. This is called by uucp
- and uux to prevent copying of a file which uucp can read but the
- user cannot. If access is denied, this should log an error message
- and return FALSE. */
- extern boolean fsysdep_access P((const char *zfile));
-
- /* See whether the daemon has access to a file. This is called by
- uucp and uux when a file is queued up for transfer without being
- copied into the spool directory. It is merely an early error
- check, as the daemon would of course discover the error itself when
- it tried the transfer. If access would be denied, this should log
- an error message and return FALSE. */
- extern boolean fsysdep_daemon_access P((const char *zfile));
-
- /* Translate a destination from system!user to a place in the public
- directory where uupick will get the file. On Unix this produces
- system!~/receive/user/localname, and that's probably what it has to
- produce on any other system as well. Returns NULL on a usage
- error, or otherwise returns string allocated by zbufcpy. */
- extern char *zsysdep_uuto P((const char *zdest,
- const char *zlocalname));
-
- /* Return TRUE if a pathname exists and is a directory. */
- extern boolean fsysdep_directory P((const char *zpath));
-
- /* Walk a directory tree. The zdir argument is the directory to walk.
- The pufn argument is a function to call on each regular file in the
- tree. The first argument to pufn should be the full filename; the
- second argument to pufn should be the filename relative to zdir;
- the third argument to pufn should be the pinfo argument to
- usysdep_walk_tree. The usysdep_walk_tree function should return
- FALSE on error. */
- extern boolean usysdep_walk_tree P((const char *zdir,
- void (*pufn) P((const char *zfull,
- const char *zrelative,
- pointer pinfo)),
- pointer pinfo));
-
- /* Return the jobid of a work file, given the sequence value. On
- error this should log an error and return NULL. The jobid is a
- string which may be printed out and read in and passed to
- fsysdep_kill_job, etc., but is not otherwise interpreted. */
- extern char *zsysdep_jobid P((const struct uuconf_system *qsys,
- pointer pseq));
-
- /* See whether the current user is privileged. Privileged users are
- permitted to kill jobs submitted by another user, and they are
- permitted to use the -u argument to uucico; other uses of this call
- may be added later. This should return TRUE if permission is
- granted, FALSE otherwise. */
- extern boolean fsysdep_privileged P((void));
-
- /* Kill a job, given the jobid. This should remove all associated
- files and in general eliminate the job completely. On error it
- should log an error message and return FALSE. */
- extern boolean fsysdep_kill_job P((pointer puuconf,
- const char *zjobid));
-
- /* Rejuvenate a job, given the jobid. If possible, this should update
- the time associated with the job such that it will not be
- eliminated by uustat -K or similar programs that check the creation
- time. This should affect the return value of ixsysdep_work_time.
- On error it should log an error message and return FALSE. */
- extern boolean fsysdep_rejuvenate_job P((pointer puuconf,
- const char *zjobid));
-
- /* Get the time a job was queued, given the sequence number. There is
- no way to indicate error. The return value must use the same epoch
- as ixsysdep_time. */
- extern long ixsysdep_work_time P((const struct uuconf_system *qsys,
- pointer pseq));
-
- /* Get the time a file was created. This is called by uustat on
- execution files. There is no way to indicate error. The return
- value must use the same epoch as ixsysdep_time. */
- extern long ixsysdep_file_time P((const char *zfile));
-
- /* Touch a file to make it appear as though it was created at the
- current time. This is called by uustat on execution files. On
- error this should log an error message and return FALSE. */
- extern boolean fsysdep_touch_file P((const char *zfile));
-
- /* Get the size in bytes of a file. If this file does not exist, this
- should not give an error message, but should return -1. If some
- other error occurs, this should return -2. */
- extern long csysdep_size P((const char *zfile));
-
- /* Return the amount of free space on the containing the given file
- name (the file may or may not exist). If the amount of free space
- cannot be determined, the function should return -1. */
- extern long csysdep_bytes_free P((const char *zfile));
-
- /* Start getting status information for all systems with available
- status information. There may be status information for unknown
- systems, which is why this series of functions is used. The phold
- argument is used to pass information around, to possibly avoid the
- use of static variables. On error this should log an error and
- return FALSE. */
- extern boolean fsysdep_all_status_init P((pointer *phold));
-
- /* Get status information for the next system. This should return the
- system name and fill in the qstat argument. The phold argument
- will be that set by fsysdep_all_status_init. On error this should
- log an error, set *pferr to TRUE, and return NULL. */
- extern char *zsysdep_all_status P((pointer phold, boolean *pferr,
- struct sstatus *qstat));
-
- /* Free up anything allocated by fsysdep_all_status_init and
- zsysdep_all_status. The phold argument is that set by
- fsysdep_all_status_init. */
- extern void usysdep_all_status_free P((pointer phold));
-
- /* Display the process status of all processes holding lock files.
- This is uustat -p. The return value is passed to usysdep_exit. */
- extern boolean fsysdep_lock_status P((void));
-
- /* Return TRUE if the user has legitimate access to the port. This is
- used by cu to control whether the user can open a port directly,
- rather than merely being able to dial out on it. Opening a port
- directly allows the modem to be reprogrammed. */
- extern boolean fsysdep_port_access P((struct uuconf_port *qport));
-
- /* Return whether the given port could be named by the given line. On
- Unix, the line argument would be something like "ttyd0", and this
- function should return TRUE if the named port is "/dev/ttyd0". */
- extern boolean fsysdep_port_is_line P((struct uuconf_port *qport,
- const char *zline));
-
- /* Set the terminal into raw mode. In this mode no input characters
- should be treated specially, and characters should be made
- available as they are typed. The original terminal mode should be
- saved, so that it can be restored by fsysdep_terminal_restore. If
- flocalecho is TRUE, then local echoing should still be done;
- otherwise echoing should be disabled. This function returns FALSE
- on error. */
- extern boolean fsysdep_terminal_raw P((boolean flocalecho));
-
- /* Restore the terminal back to the original setting, before
- fsysdep_terminal_raw was called. Returns FALSE on error. */
- extern boolean fsysdep_terminal_restore P((void));
-
- /* Read a line from the terminal. The fsysdep_terminal_raw function
- will have been called. This should print the zprompt argument
- (unless it is NULL) and return the line, allocated by zbufcpy, or
- NULL on error. */
- extern char *zsysdep_terminal_line P((const char *zprompt));
-
- /* Write a line to the terminal, ending with a newline. This is
- basically just puts (zline, stdout), except that the terminal will
- be in raw mode, so on ASCII Unix systems the line needs to end with
- \r\n. */
- extern boolean fsysdep_terminal_puts P((const char *zline));
-
- /* If faccept is TRUE, permit the user to generate signals from the
- terminal. If faccept is FALSE, turn signals off again. After
- fsysdep_terminal_raw is called, signals should be off. Return
- FALSE on error. */
- extern boolean fsysdep_terminal_signals P((boolean faccept));
-
- /* The cu program expects the system dependent code to handle the
- details of copying data from the communications port to the
- terminal. This should be set up by fsysdep_cu_init, and done while
- fsysdep_cu is called. It is permissible to do it on a continual
- basis (on Unix a subprocess handles it) so long as the copying can
- be stopped by the fsysdep_cu_copy function.
-
- The fsysdep_cu_init function does any system dependent
- initialization needed for this. */
- extern boolean fsysdep_cu_init P((struct sconnection *qconn));
-
- /* Copy all data from the communications port to the terminal, and all
- data from the terminal to the communications port. Keep this up
- until the escape character *zCuvar_escape is seen. Set *pbcmd to
- the character following the escape character; after the escape
- character, zlocalname should be printed, possibly after a delay.
- If two escape characters are entered in sequence, this function
- should send a single escape character to the port, and not return.
- Returns FALSE on error. */
- extern boolean fsysdep_cu P((struct sconnection *qconn,
- char *pbcmd,
- const char *zlocalname));
-
- /* If fcopy is TRUE, start copying data from the communications port
- to the terminal. If fcopy is FALSE, stop copying data. This
- function may be called several times during a cu session. It
- should return FALSE on error. */
- extern boolean fsysdep_cu_copy P((boolean fcopy));
-
- /* Stop copying data from the communications port to the terminal, and
- generally clean up after fsysdep_cu_init and fsysdep_cu. Returns
- FALSE on error. */
- extern boolean fsysdep_cu_finish P((void));
-
- /* Run a shell command. If zcmd is NULL, or *zcmd == '\0', just
- start up a shell. The second argument is one of the following
- values. This should return FALSE on error. */
- enum tshell_cmd
- {
- /* Attach stdin and stdout to the terminal. */
- SHELL_NORMAL,
- /* Attach stdout to the communications port, stdin to the terminal. */
- SHELL_STDOUT_TO_PORT,
- /* Attach stdin to the communications port, stdout to the terminal. */
- SHELL_STDIN_FROM_PORT,
- /* Attach both stdin and stdout to the communications port. */
- SHELL_STDIO_ON_PORT
- };
-
- extern boolean fsysdep_shell P((struct sconnection *qconn,
- const char *zcmd,
- enum tshell_cmd tcmd));
-
- /* Change directory. If zdir is NULL, or *zdir == '\0', change to the
- user's home directory. Return FALSE on error. */
- extern boolean fsysdep_chdir P((const char *zdir));
-
- /* Suspend the current process. This is only expected to work on Unix
- versions that support SIGTSTP. In general, people can just shell
- out. */
- extern boolean fsysdep_suspend P((void));
-
- /* Start getting files for uupick. The zsystem argument may be NULL
- to get files from all systems, or it may specify a particular
- system. The zpubdir argument is the public directory to use. This
- returns FALSE on error. */
- extern boolean fsysdep_uupick_init P((const char *zsystem,
- const char *zpubdir));
-
- /* Get the next file for uupick. This returns the basic file name.
- It sets *pzfull to the full name, and *pzfrom to the name of the
- system which sent this file over; both should be freed using
- ubuffree. *pzfull should be passed to ubuffree after it is no
- longer needed. The zsystem and zpubdir arguments should be the
- same as the arguments to fsysdep_uupick_init. This returns NULL
- when all files been returned. */
- extern char *zsysdep_uupick P((const char *zsystem, const char *zpubdir,
- char **pzfrom, char **pzfull));
-
- /* Clean up after getting files for uupick. */
- extern boolean fsysdep_uupick_free P((const char *zsystem,
- const char *zpubdir));
-
- /* Translate a local file name for uupick. On Unix this is just like
- zsysdep_local_file_cwd except that a file beginning with ~/ is
- placed in the user's home directory rather than in the public
- directory. */
- extern char *zsysdep_uupick_local_file P((const char *zfile,
- boolean *pfbadname));
-
- /* Remove a directory and all the files in it. */
- extern boolean fsysdep_rmdir P((const char *zdir));
-
- #endif /* ! defined (SYSTEM_H) */
-