Annotation of coherent/g/usr/lib/uucp/tay104/system.h, revision 1.1

1.1     ! root        1: /* system.h
        !             2:    Header file for system dependent stuff in the Taylor UUCP package.
        !             3:    This file is not itself system dependent.
        !             4: 
        !             5:    Copyright (C) 1991, 1992 Ian Lance Taylor
        !             6: 
        !             7:    This file is part of the Taylor UUCP package.
        !             8: 
        !             9:    This program is free software; you can redistribute it and/or
        !            10:    modify it under the terms of the GNU General Public License as
        !            11:    published by the Free Software Foundation; either version 2 of the
        !            12:    License, or (at your option) any later version.
        !            13: 
        !            14:    This program is distributed in the hope that it will be useful, but
        !            15:    WITHOUT ANY WARRANTY; without even the implied warranty of
        !            16:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            17:    General Public License for more details.
        !            18: 
        !            19:    You should have received a copy of the GNU General Public License
        !            20:    along with this program; if not, write to the Free Software
        !            21:    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
        !            22: 
        !            23:    The author of the program may be contacted at [email protected] or
        !            24:    c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
        !            25:    */
        !            26: 
        !            27: #ifndef SYSTEM_H
        !            28: 
        !            29: #define SYSTEM_H
        !            30: 
        !            31: #if ANSI_C
        !            32: /* These structures are used in prototypes but are not defined in this
        !            33:    header file.  */
        !            34: struct tm;
        !            35: struct uuconf_system;
        !            36: struct uuconf_port;
        !            37: struct sconnection;
        !            38: struct sstatus;
        !            39: struct scmd;
        !            40: #endif
        !            41: 
        !            42: /* Any function which returns an error should also report an error
        !            43:    message, unless otherwise indicated.
        !            44: 
        !            45:    Any function that returns a char *, rather than a const char *, is
        !            46:    returning a pointer to a buffer allocated by zbufalc which must be
        !            47:    freed using ubuffree, unless otherwise indicated.  */
        !            48: 
        !            49: /* The maximum length of a remote system name.  */
        !            50: extern size_t cSysdep_max_name_len;
        !            51: 
        !            52: /* Initialize.  If something goes wrong, this routine should just
        !            53:    exit.  The flag argument is 0, or a combination of any of the
        !            54:    following flags.  */
        !            55: 
        !            56: /* This program needs to know the current working directory.  This is
        !            57:    used because on Unix it can be expensive to determine the current
        !            58:    working directory (some versions of getcwd fork a process), but in
        !            59:    most cases we don't need to know it.  However, we are going to
        !            60:    chdir to the spool directory (unless INIT_CHDIR is set), so we have
        !            61:    to get the cwd now if we are ever going to get it.  Both uucp and
        !            62:    uux use the function fsysdep_needs_cwd to determine whether they
        !            63:    will need the current working directory, and pass the argument to
        !            64:    usysdep_initialize appropriately.  There's probably a cleaner way
        !            65:    to handle this, but this will suffice for now.  */
        !            66: #define INIT_GETCWD (01)
        !            67: 
        !            68: /* This program should not chdir to the spool directory.  This may
        !            69:    only make sense on Unix.  It is set by cu.  */
        !            70: #define INIT_NOCHDIR (02)
        !            71: 
        !            72: /* This program needs special access to the spool directories.  That
        !            73:    means, on Unix, this program is normally installed setuid.  */
        !            74: #define INIT_SUID (04)
        !            75: 
        !            76: extern void usysdep_initialize P((pointer puuconf, int iflags));
        !            77: 
        !            78: /* Exit the program.  The fsuccess argument indicates whether to
        !            79:    return an indication of success or failure to the outer
        !            80:    environment.  This routine should not return.  */
        !            81: extern void usysdep_exit P((boolean fsuccess));
        !            82: 
        !            83: /* Called when a non-standard configuration file is being used, to
        !            84:    avoid handing out privileged access.  If it returns FALSE, default
        !            85:    configuration file will be used.  This is called before the
        !            86:    usysdep_initialize function is called.  */
        !            87: extern boolean fsysdep_other_config P((const char *));
        !            88: 
        !            89: /* Detach from the controlling terminal.  This probably only makes
        !            90:    sense on Unix.  It is called by uucico to try to get the modem port
        !            91:    as a controlling terminal.  It is also called by uucico before it
        !            92:    starts up uuxqt, so that uuxqt will be a complete daemon.  */
        !            93: extern void usysdep_detach P((void));
        !            94: 
        !            95: /* Get the local node name if it is not specified in the configuration
        !            96:    files.  Returns NULL on error; otherwise the return value should
        !            97:    point to a static buffer.  */
        !            98: extern const char *zsysdep_localname P((void));
        !            99: 
        !           100: /* Get the login name.  This is used when uucico is started up with no
        !           101:    arguments in slave mode, which causes it to assume that somebody
        !           102:    has logged in.  It also used by uucp and uux for recording the user
        !           103:    name.  This may not return NULL.  The return value should point to
        !           104:    a static buffer.  */
        !           105: extern const char *zsysdep_login_name P((void));
        !           106: 
        !           107: /* Set a signal handler for a signal.  If the signal occurs, the
        !           108:    appropriate element of afSignal should be set to the signal number
        !           109:    (see the declaration of afSignal in uucp.h).  This routine might be
        !           110:    able to just use signal, but Unix requires more complex handling.
        !           111:    This is called before usysdep_initialize.  */
        !           112: extern void usysdep_signal P((int isig));
        !           113: 
        !           114: /* Catch a signal.  This is actually defined as a macro in the system
        !           115:    dependent header file, and the prototype here just indicates how it
        !           116:    should be called.  It is called before a routine which must exit if
        !           117:    a signal occurs, and is expected to set do a setjmp (which is why
        !           118:    it must be a macro).  It is actually only called in one place in
        !           119:    the system independent code, before the call to read stdin in uux.
        !           120:    This is needed to handle 4.2 BSD restartable system calls, which
        !           121:    require a longjmp.  On systems which don't need to do
        !           122:    setjmp/longjmp around system calls, this can be redefined in
        !           123:    sysdep.h to TRUE.  It should return TRUE if the routine should
        !           124:    proceed, or FALSE if a signal occurred.  After having this return
        !           125:    TRUE, usysdep_start_catch should be used to start catching the
        !           126:    signal; this basically tells the signal handler that it's OK to do
        !           127:    the longjmp, if fsysdep_catch did not already do so.  */
        !           128: #ifndef fsysdep_catch
        !           129: extern boolean fsysdep_catch P((void));
        !           130: #endif
        !           131: 
        !           132: /* Start catching a signal.  This is called after fsysdep_catch to
        !           133:    tell the signal handler to go ahead and do the longjmp.  This may
        !           134:    be implemented as a macro in sysdep.h.  */
        !           135: #ifndef usysdep_start_catch
        !           136: extern void usysdep_start_catch P((void));
        !           137: #endif
        !           138: 
        !           139: /* Stop catching a signal.  This is called when it is no longer
        !           140:    necessary for fsysdep_catch to handle signals.  This may be
        !           141:    implemented as a macro in sysdep.h.  */
        !           142: #ifndef usysdep_end_catch
        !           143: extern void usysdep_end_catch P((void));
        !           144: #endif
        !           145: 
        !           146: /* Link two files.  On Unix this should attempt the link.  If it
        !           147:    succeeds it should return TRUE with *pfworked set to TRUE.  If the
        !           148:    link fails because it must go across a device, it should return
        !           149:    TRUE with *pfworked set to FALSE.  If the link fails for some other
        !           150:    reason, it should log an error message and return FALSE.  On a
        !           151:    system which does not support links to files, this should just
        !           152:    return TRUE with *pfworked set to FALSE.  */
        !           153: extern boolean fsysdep_link P((const char *zfrom, const char *zto,
        !           154:                               boolean *pfworked));
        !           155: 
        !           156: /* Get the port name.  This is used when uucico is started up in slave
        !           157:    mode to figure out which port was used to call in so that it can
        !           158:    determine any appropriate protocol parameters.  This may return
        !           159:    NULL if the port cannot be determined, which will just mean that no
        !           160:    protocol parameters are applied.  The name returned should be the
        !           161:    sort of name that would appear in the port file.  This should set
        !           162:    *pftcp_port to TRUE if it can determine that the port is a TCP
        !           163:    connection rather than a normal serial port.  The return value (if
        !           164:    not NULL) should point to a static buffer.  */
        !           165: extern const char *zsysdep_port_name P((boolean *pftcp_port));
        !           166: 
        !           167: /* Expand a file name on the local system.  On Unix, if the zfile
        !           168:    argument begins with ~user/ it goes in that users home directory,
        !           169:    and if it begins with ~/ it goes in the public directory (the
        !           170:    public directory is passed to this routine, since each system may
        !           171:    have its own public directory).  Similar conventions may be
        !           172:    desirable on other systems.  This should always return an absolute
        !           173:    path name, probably in the public directory.  It should return NULL
        !           174:    on error; otherwise the return value should be allocated using
        !           175:    zbufcpy or zbufalc.  */
        !           176: extern char *zsysdep_local_file P((const char *zname,
        !           177:                                   const char *zpubdir));
        !           178: 
        !           179: /* Return whether a file name is in a directory, and check for read or
        !           180:    write access.  This should check whether zfile is within zdir (or
        !           181:    is zdir itself).  If it is not, it should return FALSE.  If zfile
        !           182:    is in zdir, then fcheck indicates whether further checking should
        !           183:    be done.  If fcheck is FALSE, no further checking is done.
        !           184:    Otherwise, if freadable is TRUE the user zuser should have search
        !           185:    access to all directories from zdir down to zfile and should have
        !           186:    read access on zfile itself (if zfile does not exist, or is not a
        !           187:    regular file, this function may return FALSE but does not have to).
        !           188:    If freadable is FALSE, the user zuser should have search access to
        !           189:    all directories from zdir down to zfile and should have write
        !           190:    access on zfile (which may be a directory, or may not actually
        !           191:    exist, which is acceptable).  The zuser argument may be NULL, in
        !           192:    which case the check should be made for any user, not just zuser.
        !           193:    There is no way for this function to return error.  */
        !           194: extern boolean fsysdep_in_directory P((const char *zfile,
        !           195:                                       const char *zdir,
        !           196:                                       boolean fcheck,
        !           197:                                       boolean freadable,
        !           198:                                       const char *zuser));
        !           199: 
        !           200: /* Return TRUE if a file exists, FALSE otherwise.  There is no way to
        !           201:    return error.  */
        !           202: extern boolean fsysdep_file_exists P((const char *zfile));
        !           203: 
        !           204: /* Start up a program.  The code expects fsysdep_run to return after
        !           205:    doing a fork, but at least for now everything will work fine if it
        !           206:    does not (on a system which does not support forking).  The three
        !           207:    string arguments may be catenated together to form the program to
        !           208:    execute; I did it this way to make it easy to call execl(2), and
        !           209:    because I never needed more than two arguments.  The program will
        !           210:    always be "uucico" or "uuxqt".  The return value will be passed
        !           211:    directly to usysdep_exit, and should be TRUE on success, FALSE on
        !           212:    error.  */
        !           213: extern boolean fsysdep_run P((const char *zprogram, const char *zarg1,
        !           214:                              const char *zarg2));
        !           215: 
        !           216: /* Send a mail message.  This function will be passed an array of
        !           217:    strings.  All necessary newlines are already included; the strings
        !           218:    should simply be concatenated together to form the mail message.
        !           219:    It should return FALSE on error, although the return value is often
        !           220:    ignored.  */
        !           221: extern boolean fsysdep_mail P((const char *zto, const char *zsubject,
        !           222:                               int cstrs, const char **paz));
        !           223: 
        !           224: /* Get the time in seconds since some epoch.  The actual epoch is
        !           225:    unimportant, so long as the time values are consistent across
        !           226:    program executions and the value is never negative.  If the
        !           227:    pimicros argument is not NULL, it should be set to the number of
        !           228:    microseconds (if this is not available, *pimicros should be set to
        !           229:    zero).  */
        !           230: extern long ixsysdep_time P((long *pimicros));
        !           231: 
        !           232: /* Get the time in seconds and microseconds (millionths of a second)
        !           233:    since some epoch.  The actual epoch is not important, and it may
        !           234:    change in between program invocations; this is provided because on
        !           235:    Unix the times function may be used.  If microseconds can not be
        !           236:    determined, *pimicros can just be set to zero.  */
        !           237: extern long ixsysdep_process_time P((long *pimicros));
        !           238: 
        !           239: /* Parse the value returned by ixsysdep_time into a struct tm.  I
        !           240:    assume that this structure is defined in <time.h>.  This is
        !           241:    basically just localtime, except that the ANSI function takes a
        !           242:    time_t which may not be what is returned by ixsysdep_time.  */
        !           243: extern void usysdep_localtime P((long itime, struct tm *q));
        !           244: 
        !           245: /* Sleep for a number of seconds.  */
        !           246: extern void usysdep_sleep P((int cseconds));
        !           247: 
        !           248: /* Pause for half a second, or 1 second if subsecond sleeps are not
        !           249:    possible.  */
        !           250: extern void usysdep_pause P((void));
        !           251: 
        !           252: /* Lock a remote system.  This should return FALSE if the system is
        !           253:    already locked (no error should be reported).  */
        !           254: extern boolean fsysdep_lock_system P((const struct uuconf_system *qsys));
        !           255: 
        !           256: /* Unlock a remote system.  This should return FALSE on error
        !           257:    (although the return value is generally ignored).  */
        !           258: extern boolean fsysdep_unlock_system P((const struct uuconf_system *qsys));
        !           259: 
        !           260: /* Get the conversation sequence number for a remote system, and
        !           261:    increment it for next time.  This should return -1 on error.  */
        !           262: extern long ixsysdep_get_sequence P((const struct uuconf_system *qsys));
        !           263: 
        !           264: /* Get the status of a remote system.  This should return FALSE on
        !           265:    error.  Otherwise it should set *qret to the status.  If no status
        !           266:    information is available, this should set *qret to sensible values
        !           267:    and return TRUE.  If pfnone is not NULL, then it should be set to
        !           268:    TRUE if no status information was available or FALSE otherwise.  */
        !           269: extern boolean fsysdep_get_status P((const struct uuconf_system *qsys,
        !           270:                                     struct sstatus *qret,
        !           271:                                     boolean *pfnone));
        !           272: 
        !           273: /* Set the status of a remote system.  This should return FALSE on
        !           274:    error.  The system will be locked before this call is made.  */
        !           275: extern boolean fsysdep_set_status P((const struct uuconf_system *qsys,
        !           276:                                     const struct sstatus *qset));
        !           277: 
        !           278: /* See whether a remote system is permitted to log in.  This is just
        !           279:    to support the remote.unknown shell script for HDB.  The zscript
        !           280:    argument is the script name, as return by uuconf_remote_unknown.
        !           281:    The zsystem argument is the name given by the remote system.  If
        !           282:    the system is not permitted to log in, this function should log an
        !           283:    error and return FALSE.  */
        !           284: extern boolean fsysdep_unknown_caller P((const char *zscript,
        !           285:                                         const char *zsystem));
        !           286: 
        !           287: /* Check whether there is work for a remote system.  It should return
        !           288:    TRUE if there is work, FALSE otherwise; there is no way to indicate
        !           289:    an error.  */
        !           290: extern boolean fsysdep_has_work P((const struct uuconf_system *qsys));
        !           291: 
        !           292: /* Initialize the work scan.  This will be called before
        !           293:    fsysdep_get_work.  The bgrade argument is the minimum grade of
        !           294:    execution files that should be considered (e.g. a bgrade of 'd'
        !           295:    will allow all grades from 'A' to 'Z' and 'a' to 'd').  This
        !           296:    function should return FALSE on error.  */
        !           297: extern boolean fsysdep_get_work_init P((const struct uuconf_system *qsys,
        !           298:                                        int bgrade));
        !           299: 
        !           300: /* Get the next command to be executed for a remote system.  The
        !           301:    bgrade argument will be the same as for fsysdep_get_work_init;
        !           302:    probably only one of these functions will use it, namely the
        !           303:    function for which it is more convenient.  This should return FALSE
        !           304:    on error.  The structure pointed to by qcmd should be filled in.
        !           305:    The strings may point into a static buffer; they will be copied out
        !           306:    if necessary.  If there is no more work, this should set qcmd->bcmd
        !           307:    to 'H' and return TRUE.  This should set qcmd->pseq to something
        !           308:    which can be passed to fsysdep_did_work to remove the job from the
        !           309:    queue when it has been completed.  This may set qcmd->bcmd to 'P'
        !           310:    to represent a poll file; the main code will just pass the pseq
        !           311:    element of such a structure to fsysdep_did_work if the system is
        !           312:    called.  */
        !           313: extern boolean fsysdep_get_work P((const struct uuconf_system *qsys,
        !           314:                                   int bgrade, struct scmd *qcmd));
        !           315: 
        !           316: /* Remove a job from the work queue.  This must also remove the
        !           317:    temporary file used for a send command, if there is one.  It should
        !           318:    return FALSE on error.  */
        !           319: extern boolean fsysdep_did_work P((pointer pseq));
        !           320: 
        !           321: /* Save the temporary file for a send command.  This function should
        !           322:    return a string that will be put into a mail message.  On success
        !           323:    this string should say something like ``The file has been saved as
        !           324:    ...''.  On failure it could say something like ``The file could not
        !           325:    be saved because ...''.  If there is no temporary file, or for some
        !           326:    reason it's not appropriate to include a message, this function
        !           327:    should just return NULL.  This function is used when a file send
        !           328:    fails for some reason, to make sure that we don't completely lost
        !           329:    the file.  */
        !           330: extern const char *zsysdep_save_temp_file P((pointer pseq));
        !           331: 
        !           332: /* Cleanup anything left over by fsysdep_get_work_init and
        !           333:    fsysdep_get_work.  This may be called even though
        !           334:    fsysdep_get_work_init has not been.  */
        !           335: extern void usysdep_get_work_free P((const struct uuconf_system *qsys));
        !           336: 
        !           337: /* Add a base name to a file if it is a directory.  If zfile names a
        !           338:    directory, then return a string naming a file within the directory
        !           339:    with the base file name of zname.  This should return NULL on
        !           340:    error.  */
        !           341: extern char *zsysdep_add_base P((const char *zfile,
        !           342:                                 const char *zname));
        !           343: 
        !           344: /* Get a file name from the spool directory.  This should return NULL
        !           345:    on error.  The pseq argument is TRUE if the file was found from
        !           346:    searching the work directory; this is, unfortunately, needed to
        !           347:    support SVR4 spool directories.  */
        !           348: extern char *zsysdep_spool_file_name P((const struct uuconf_system *qsys,
        !           349:                                        const char *zfile,
        !           350:                                        pointer pseq));
        !           351: 
        !           352: /* Make necessary directories.  This should create all non-existent
        !           353:    directories for a file.  If the fpublic argument is TRUE, anybody
        !           354:    should be permitted to create and remove files in the directory;
        !           355:    otherwise anybody can list the directory, but only the UUCP system
        !           356:    can create and remove files.  It should return FALSE on error.  */
        !           357: extern boolean fsysdep_make_dirs P((const char *zfile, boolean fpublic));
        !           358: 
        !           359: /* Create a stdio file, setting appropriate protection.  If the
        !           360:    fpublic argument is TRUE, the file is made publically accessible;
        !           361:    otherwise it is treated as a private data file.  If the fappend
        !           362:    argument is TRUE, the file is opened in append mode; otherwise any
        !           363:    previously existing file of the same name is removed.  If the
        !           364:    fmkdirs argument is TRUE, then any necessary directories should
        !           365:    also be created.  On a system in which file protections are
        !           366:    unimportant and the necessary directories exist, this may be
        !           367:    implemented as
        !           368: 
        !           369:    fopen (zfile, fappend ? "a" : "w");
        !           370: 
        !           371:    */
        !           372: extern FILE *esysdep_fopen P((const char *zfile, boolean fpublic,
        !           373:                              boolean fappend, boolean fmkdirs));
        !           374: 
        !           375: /* Open a file, using the access permission of the user who invoked
        !           376:    the program.  The frd argument is TRUE if the file should be opened
        !           377:    for reading, and the fbinary argument is TRUE if the file should be
        !           378:    opened as a binary file (this is ignored on Unix, since there all
        !           379:    files are binary files).  This returns an openfile_t, not a FILE *.
        !           380:    This is supposed to be able to open a file even if it can not be
        !           381:    read by the uucp user.  This is not possible on some older Unix
        !           382:    systems.  */
        !           383: extern openfile_t esysdep_user_fopen P((const char *zfile,
        !           384:                                        boolean frd, boolean fbinary));
        !           385: 
        !           386: /* Open a file to send to another system; the qsys argument is the
        !           387:    system the file is being sent to.  If fcheck is TRUE, it should
        !           388:    make sure that the file is readable by zuser (if zuser is NULL the
        !           389:    file must be readable by anybody).  This is to eliminate a window
        !           390:    between fsysdep_in_directory and esysdep_open_send.  If an error
        !           391:    occurs, it should return EFILECLOSED.  */
        !           392: extern openfile_t esysdep_open_send P((const struct uuconf_system *qsys,
        !           393:                                       const char *zname,
        !           394:                                       boolean fcheck,
        !           395:                                       const char *zuser));
        !           396: 
        !           397: /* Return a temporary file name to receive into.  This file will be
        !           398:    opened by esysdep_open_receive.  The qsys argument is the system
        !           399:    the file is coming from, the zto argument is the name the file will
        !           400:    have after it has been fully received, and the ztemp argument, if
        !           401:    it is not NULL, is from the command sent by the remote system.  The
        !           402:    return value must be freed using ubuffree.  The function should
        !           403:    return NULL on error.  */
        !           404: extern char *zsysdep_receive_temp P((const struct uuconf_system *qsys,
        !           405:                                     const char *zfile,
        !           406:                                     const char *ztemp));
        !           407: 
        !           408: /* Open a file to receive from another system.  The zreceive argument
        !           409:    is the return value of zsysdep_receive_temp with the same qsys,
        !           410:    zfile and ztemp arguments.  If the function can determine that this
        !           411:    file has already been partially received, it should set *pcrestart
        !           412:    to the number of bytes that have been received.  If the file has
        !           413:    not been partially received, *pcrestart should be set to -1.  The
        !           414:    function should return EFILECLOSED on error.  After the file is
        !           415:    written, fsysdep_move_file will be called to move the file to its
        !           416:    final destination, and to set the correct file mode.  */
        !           417: extern openfile_t esysdep_open_receive P((const struct uuconf_system *qsys,
        !           418:                                          const char *zto,
        !           419:                                          const char *ztemp,
        !           420:                                          const char *zreceive,
        !           421:                                          long *pcrestart));
        !           422: 
        !           423: /* Move a file.  This is used to move a received file to its final
        !           424:    location.  The zto argument is the file to create.  The zorig
        !           425:    argument is the name of the file to move.  If fmkdirs is TRUE, then
        !           426:    any necessary directories are created; fpublic indicates whether
        !           427:    they should be publically writeable or not.  If fcheck is TRUE,
        !           428:    this should make sure the directory is writeable by the user zuser
        !           429:    (if zuser is NULL, then it must be writeable by any user); this is
        !           430:    to avoid a window of vulnerability between fsysdep_in_directory and
        !           431:    fsysdep_move_file.  This function should return FALSE on error; the
        !           432:    zorig file should be removed even if an error occurs.  */
        !           433: extern boolean fsysdep_move_file P((const char *zorig, const char *zto,
        !           434:                                    boolean fmkdirs, boolean fpublic,
        !           435:                                    boolean fcheck, const char *zuser));
        !           436: 
        !           437: /* Change the mode of a file.  The imode argument is a Unix mode.
        !           438:    This should return FALSE on error.  */
        !           439: extern boolean fsysdep_change_mode P((const char *zfile,
        !           440:                                      unsigned int imode));
        !           441: 
        !           442: /* Truncate a file which we are receiving into.  This may be done by
        !           443:    closing the original file, removing it and reopening it.  This
        !           444:    should return FALSE on error.  */
        !           445: extern openfile_t esysdep_truncate P((openfile_t e, const char *zname));
        !           446: 
        !           447: /* It is possible for the acknowledgement of a received file to be
        !           448:    lost.  The sending system will then now know that the file was
        !           449:    correctly received, and will send it again.  This can be a problem
        !           450:    particularly with protocols which support channels, since they may
        !           451:    send several small files in a single window, all of which may be
        !           452:    received correctly although the sending system never sees the
        !           453:    acknowledgement.  If these files involve an execution, the
        !           454:    execution will happen twice, which will be bad.
        !           455: 
        !           456:    This function is called when a file is completely received.  It is
        !           457:    supposed to try and remember the reception, in case the connection
        !           458:    is lost.  It is passed the system, the file name to receive to, and
        !           459:    the temporary file name from the sending system.  It should return
        !           460:    FALSE on error.  */
        !           461: extern boolean fsysdep_remember_reception P((const struct uuconf_system *qsys,
        !           462:                                             const char *zto,
        !           463:                                             const char *ztemp));
        !           464: 
        !           465: /* This function is called to see if a file has already been received
        !           466:    successfully.  It gets the same arguments as
        !           467:    fsysdep_remember_reception.  It should return TRUE if the file was
        !           468:    already received, FALSE otherwise.  There is no way to report
        !           469:    error.  */
        !           470: extern boolean fsysdep_already_received P((const struct uuconf_system *qsys,
        !           471:                                           const char *zto,
        !           472:                                           const char *ztemp));
        !           473: 
        !           474: /* This function is called when it is no longer necessary to remember
        !           475:    that a file has been received.  This will be called when the
        !           476:    protocol knows that the receive message has been acknowledged.  It
        !           477:    gets the same arguments as fsysdep_remember_reception.  it should
        !           478:    return FALSE on error.  */
        !           479: extern boolean fsysdep_forget_reception P((const struct uuconf_system *qsys,
        !           480:                                           const char *zto,
        !           481:                                           const char *ztemp));
        !           482: 
        !           483: /* Start expanding a wildcarded file name.  This should return FALSE
        !           484:    on error; otherwise subsequent calls to zsysdep_wildcard should
        !           485:    return file names.  */
        !           486: extern boolean fsysdep_wildcard_start P((const char *zfile));
        !           487: 
        !           488: /* Get the next wildcard name.  This should return NULL when there are
        !           489:    no more names to return.  The return value should be freed using
        !           490:    ubuffree.  The argument should be the same as that to
        !           491:    fsysdep_wildcard_start.  There is no way to return error.  */
        !           492: extern char *zsysdep_wildcard P((const char *zfile));
        !           493: 
        !           494: /* Finish getting wildcard names.  This may be called before or after
        !           495:    zsysdep_wildcard has returned NULL.  It should return FALSE on
        !           496:    error.  */
        !           497: extern boolean fsysdep_wildcard_end P((void));
        !           498: 
        !           499: /* Prepare to execute a bunch of file transfer requests.  This should
        !           500:    make an entry in the spool directory so that the next time uucico
        !           501:    is started up it will transfer these files.  The bgrade argument
        !           502:    specifies the grade of the commands.  The commands themselves are
        !           503:    in the pascmds array, which has ccmds entries.  The function should
        !           504:    return NULL on error, or the jobid on success.  The jobid is a
        !           505:    string that may be printed or passed to fsysdep_kill_job and
        !           506:    related functions, but is otherwise uninterpreted.  */
        !           507: extern char *zsysdep_spool_commands P((const struct uuconf_system *qsys,
        !           508:                                       int bgrade, int ccmds,
        !           509:                                       const struct scmd *pascmds));
        !           510: 
        !           511: /* Get a file name to use for a data file to be copied to another
        !           512:    system.  The ztname, zdname and zxname arguments will all either be
        !           513:    NULL or point to an array of CFILE_NAME_LEN characters in length.
        !           514:    The ztname array should be set to a temporary file name that could
        !           515:    be passed to zsysdep_spool_file_name to retrieve the return value
        !           516:    of this function; this will be appropriate for the temporary name
        !           517:    in a send request.  The zdname array should be set to a data file
        !           518:    name that is appropriate for the spool directory of the other
        !           519:    system; this will be appropriate for the name of the destination
        !           520:    file in a send request of a data file for an execution of some
        !           521:    sort.  The zxname array should be set to an execute file name that
        !           522:    is appropriate for the other system.  The zlocalname argument is
        !           523:    the name of the local system as seen by the remote system, the
        !           524:    bgrade argument is the grade, and fxqt is TRUE if this file is
        !           525:    going to become an execution file.  This should return NULL on
        !           526:    error.  */
        !           527: #define CFILE_NAME_LEN (15)
        !           528: 
        !           529: extern char *zsysdep_data_file_name P((const struct uuconf_system *qsys,
        !           530:                                       const char *zlocalname,
        !           531:                                       int bgrade, boolean fxqt,
        !           532:                                       char *ztname, char *zdname,
        !           533:                                       char *zxname));
        !           534: 
        !           535: /* Get a name for a local execute file.  This is used by uux for a
        !           536:    local command with remote files.  Returns NULL on error.  */
        !           537: extern char *zsysdep_xqt_file_name P((void));
        !           538: 
        !           539: /* Beginning getting execute files.  To get a list of execute files,
        !           540:    first fsysdep_get_xqt_init is called, then zsysdep_get_xqt is
        !           541:    called several times until it returns NULL, then finally
        !           542:    usysdep_get_xqt_free is called.  */
        !           543: extern boolean fsysdep_get_xqt_init P((void));
        !           544: 
        !           545: /* Get the next execute file.  This should return NULL when finished
        !           546:    (with *pferr set to FALSE).  On an error this should return NULL
        !           547:    with *pferr set to TRUE.  This should set *pzsystem to the name of
        !           548:    the system for which the execute file was created.  Both the return
        !           549:    value and *pzsystem should be freed using ubuffree.  */
        !           550: extern char *zsysdep_get_xqt P((char **pzsystem,
        !           551:                                boolean *pferr));
        !           552: 
        !           553: /* Clean up after getting execute files.  */
        !           554: extern void usysdep_get_xqt_free P((void));
        !           555: 
        !           556: /* Get the absolute pathname of a command to execute.  This is given
        !           557:    the legal list of commands (which may be the special case "ALL")
        !           558:    and the path.  It must return an absolute pathname to the command.
        !           559:    If it gets an error it should set *pferr to TRUE and return NULL;
        !           560:    if the command is not found it should set *pferr to FALSE and
        !           561:    return NULL.  */
        !           562: extern char *zsysdep_find_command P((const char *zcmd, char **pzcmds,
        !           563:                                     char **pzpath, boolean *pferr));
        !           564: 
        !           565: /* Expand file names for uuxqt.  This exists because uuxqt on Unix has
        !           566:    to expand file names which begin with a ~.  It does not want to
        !           567:    expand any other type of file name, and it turns a double ~ into a
        !           568:    single one without expanding.  If this returns NULL, the file does
        !           569:    not need to be changed; otherwise it returns a zbufalc'ed string.
        !           570:    There is no way to report error.  */
        !           571: extern char *zsysdep_xqt_local_file P((const struct uuconf_system *qsys,
        !           572:                                       const char *zfile));
        !           573: 
        !           574: #if ! ALLOW_FILENAME_ARGUMENTS
        !           575: /* Check an argument to an execution command to make sure that it
        !           576:    doesn't refer to a file name that may not be accessed.  This should
        !           577:    check the argument to see if it is a filename.  If it is, it should
        !           578:    either reject it out of hand or it should call fin_directory_list
        !           579:    on the file with both qsys->zremote_receive and qsys->zremote_send.
        !           580:    If the file is rejected, it should log an error and return FALSE.
        !           581:    Otherwise it should return TRUE.  */
        !           582: extern boolean fsysdep_xqt_check_file P((const struct uuconf_system *qsys,
        !           583:                                         const char *zfile));
        !           584: #endif /* ! ALLOW_FILENAME_ARGUMENTS */
        !           585: 
        !           586: /* Run an execute file.  The arguments are:
        !           587: 
        !           588:    qsys -- system for which execute file was created
        !           589:    zuser -- user who requested execution
        !           590:    pazargs -- list of arguments to command (element 0 is command)
        !           591:    zfullcmd -- command and arguments stuck together in one string
        !           592:    zinput -- file name for standard input (may be NULL)
        !           593:    zoutput -- file name for standard output (may be NULL)
        !           594:    fshell -- if TRUE, use /bin/sh to execute file
        !           595:    ilock -- return value of ixsysdep_lock_uuxqt
        !           596:    pzerror -- set to name of standard error file
        !           597:    pftemp -- set to TRUE if error is temporary, FALSE otherwise
        !           598: 
        !           599:    If fshell is TRUE, the command should be executed with /bin/sh
        !           600:    (obviously, this can only really be done on Unix systems).  If an
        !           601:    error occurs this should return FALSE and set *pftemp
        !           602:    appropriately.  *pzerror should be freed using ubuffree.  */
        !           603: extern boolean fsysdep_execute P((const struct uuconf_system *qsys,
        !           604:                                  const char *zuser,
        !           605:                                  const char **pazargs,
        !           606:                                  const char *zfullcmd,
        !           607:                                  const char *zinput,
        !           608:                                  const char *zoutput,
        !           609:                                  boolean fshell,
        !           610:                                  int ilock,
        !           611:                                  char **pzerror,
        !           612:                                  boolean *pftemp));
        !           613: 
        !           614: /* Lock for uuxqt execution.  If the cmaxuuxqts argument is not zero,
        !           615:    this should make sure that no more than cmaxuuxqts uuxqt processes
        !           616:    are running at once.  Also, only one uuxqt may execute a particular
        !           617:    command (specified by the -c option) at a time.  If zcmd is not
        !           618:    NULL, it is a command that must be locked.  This should return a
        !           619:    nonnegative number which will be passed to other routines,
        !           620:    including fsysdep_unlock_uuxqt, or -1 on error.  */
        !           621: extern int ixsysdep_lock_uuxqt P((const char *zcmd,
        !           622:                                  int cmaxuuxqts));
        !           623: 
        !           624: /* Unlock a uuxqt process.  This is passed the return value of
        !           625:    ixsysdep_lock_uuxqt, as well as the arguments passed to
        !           626:    ixsysdep_lock_uuxqt.  It may return FALSE on error, but at present
        !           627:    the return value is ignored.  */
        !           628: extern boolean fsysdep_unlock_uuxqt P((int iseq, const char *zcmd,
        !           629:                                       int cmaxuuxqts));
        !           630: 
        !           631: /* See whether a particular uuxqt command is locked.  This should
        !           632:    return TRUE if the command is locked (because ixsysdep_lock_uuxqt
        !           633:    was called with it as an argument), FALSE otherwise.  There is no
        !           634:    way to return error.  */
        !           635: extern boolean fsysdep_uuxqt_locked P((const char *zcmd));
        !           636: 
        !           637: /* Lock an execute file in order to execute it.  This should return
        !           638:    FALSE if the execute file is already locked.  There is no way to
        !           639:    return error.  */
        !           640: extern boolean fsysdep_lock_uuxqt_file P((const char *zfile));
        !           641: 
        !           642: /* Unlock an execute file.  This should return FALSE on error.  */
        !           643: extern boolean fsysdep_unlock_uuxqt_file P((const char *zfile));
        !           644: 
        !           645: /* Lock the execution directory.  The ilock argument is the return
        !           646:    value of ixsysdep_lock_uuxqt.  This should return FALSE if the
        !           647:    directory is already locked.  There is no way to return error.  */
        !           648: extern boolean fsysdep_lock_uuxqt_dir P((int ilock));
        !           649: 
        !           650: /* Remove all files in the execution directory, and unlock it.  This
        !           651:    should return FALSE on error.  */
        !           652: extern boolean fsysdep_unlock_uuxqt_dir P((int ilock));
        !           653: 
        !           654: /* Move files into or out of the execution directory.  The code will
        !           655:    already have checked that all the files exist.  The elements in the
        !           656:    pzfrom array will be complete filenames, and the elements in the
        !           657:    pzto array will be either NULL (in which case the file should not
        !           658:    be moved) or simple base names.  If fto is TRUE, the files in
        !           659:    pzfrom should be moved to pzto; otherwise, the files in pzto should
        !           660:    be moved to pzfrom (this is used if a temporary failure occurs, in
        !           661:    which case the execution will be retried later).  If pzinput and
        !           662:    *pzinput are not NULL, then it is the name of the standard input
        !           663:    file; if it is the same as any element of pzfrom, then *pzinput
        !           664:    should be set to the zbufcpy of the corresponding pzto value, if
        !           665:    any.  */
        !           666: extern boolean fsysdep_move_uuxqt_files P((int cfiles,
        !           667:                                           const char *const *pzfrom,
        !           668:                                           const char *const *pzto,
        !           669:                                           boolean fto, int ilock,
        !           670:                                           char **pzinput));
        !           671: 
        !           672: /* Expand a file name on the local system, defaulting to the current
        !           673:    directory.  This is just like zsysdep_local_file, except that
        !           674:    relative files are placed in the working directory the program
        !           675:    started in rather than in the public directory.  This should return
        !           676:    NULL on error.  */
        !           677: extern char *zsysdep_local_file_cwd P((const char *zname,
        !           678:                                       const char *zpubdir));
        !           679: 
        !           680: /* Add the working directory to a file name.  The named file is
        !           681:    actually on a remote system.  If the file already has a directory,
        !           682:    it should not be changed.  This should return NULL on error.  */
        !           683: extern char *zsysdep_add_cwd P((const char *zfile));
        !           684: 
        !           685: /* See whether a file name will need the current working directory
        !           686:    when zsysdep_local_file_cwd or zsysdep_add_cwd is called on it.
        !           687:    This will be called before usysdep_initialize.  It should just
        !           688:    check whether the argument is an absolute path.  See the comment
        !           689:    above usysdep_initialize in this file for an explanation of why
        !           690:    things are done this way.  */
        !           691: extern boolean fsysdep_needs_cwd P((const char *zfile));
        !           692: 
        !           693: /* Get the base name of a file.  The file will be a local file name,
        !           694:    and this function should return the base file name, ideally in a
        !           695:    form which will make sense on most systems; it will be used if the
        !           696:    destination of a uucp is a directory.  */
        !           697: extern char *zsysdep_base_name P((const char *zfile));
        !           698: 
        !           699: /* Return a filename within a directory.  */
        !           700: extern char *zsysdep_in_dir P((const char *zdir, const char *zfile));
        !           701: 
        !           702: /* Get the mode of a file.  This should return a Unix style file mode.
        !           703:    It should return 0 on error.  */
        !           704: extern unsigned int ixsysdep_file_mode P((const char *zfile));
        !           705: 
        !           706: /* See whether the user has access to a file.  This is called by uucp
        !           707:    and uux to prevent copying of a file which uucp can read but the
        !           708:    user cannot.  If access is denied, this should log an error message
        !           709:    and return FALSE.  */
        !           710: extern boolean fsysdep_access P((const char *zfile));
        !           711: 
        !           712: /* See whether the daemon has access to a file.  This is called by
        !           713:    uucp and uux when a file is queued up for transfer without being
        !           714:    copied into the spool directory.  It is merely an early error
        !           715:    check, as the daemon would of course discover the error itself when
        !           716:    it tried the transfer.  If access would be denied, this should log
        !           717:    an error message and return FALSE.  */
        !           718: extern boolean fsysdep_daemon_access P((const char *zfile));
        !           719: 
        !           720: /* Translate a destination from system!user to a place in the public
        !           721:    directory where uupick will get the file.  On Unix this produces
        !           722:    system!~/receive/user/localname, and that's probably what it has to
        !           723:    produce on any other system as well.  Returns NULL on a usage
        !           724:    error, or otherwise returns string allocated by zbufcpy.  */
        !           725: extern char *zsysdep_uuto P((const char *zdest,
        !           726:                             const char *zlocalname));
        !           727: 
        !           728: /* Return TRUE if a pathname exists and is a directory.  */
        !           729: extern boolean fsysdep_directory P((const char *zpath));
        !           730: 
        !           731: /* Walk a directory tree.  The zdir argument is the directory to walk.
        !           732:    The pufn argument is a function to call on each regular file in the
        !           733:    tree.  The first argument to pufn should be the full filename; the
        !           734:    second argument to pufn should be the filename relative to zdir;
        !           735:    the third argument to pufn should be the pinfo argument to
        !           736:    usysdep_walk_tree.  The usysdep_walk_tree function should return
        !           737:    FALSE on error.  */
        !           738: extern boolean usysdep_walk_tree P((const char *zdir,
        !           739:                                    void (*pufn) P((const char *zfull,
        !           740:                                                    const char *zrelative,
        !           741:                                                    pointer pinfo)),
        !           742:                                    pointer pinfo));
        !           743: 
        !           744: /* Return the jobid of a work file, given the sequence value.  On
        !           745:    error this should log an error and return NULL.  The jobid is a
        !           746:    string which may be printed out and read in and passed to
        !           747:    fsysdep_kill_job, etc., but is not otherwise interpreted.  */
        !           748: extern char *zsysdep_jobid P((const struct uuconf_system *qsys,
        !           749:                              pointer pseq));
        !           750: 
        !           751: /* See whether the current user is permitted to kill jobs submitted by
        !           752:    another user.  This should return TRUE if permission is granted,
        !           753:    FALSE otherwise.  */
        !           754: extern boolean fsysdep_privileged P((void));
        !           755: 
        !           756: /* Kill a job, given the jobid.  This should remove all associated
        !           757:    files and in general eliminate the job completely.  On error it
        !           758:    should log an error message and return FALSE.  */
        !           759: extern boolean fsysdep_kill_job P((pointer puuconf,
        !           760:                                   const char *zjobid));
        !           761: 
        !           762: /* Rejuvenate a job, given the jobid.  If possible, this should update
        !           763:    the time associated with the job such that it will not be
        !           764:    eliminated by uustat -K or similar programs that check the creation
        !           765:    time.  This should affect the return value of ixsysdep_work_time.
        !           766:    On error it should log an error message and return FALSE.  */
        !           767: extern boolean fsysdep_rejuvenate_job P((pointer puuconf,
        !           768:                                         const char *zjobid));
        !           769: 
        !           770: /* Get the time a job was queued, given the sequence number.  There is
        !           771:    no way to indicate error.  The return value must use the same epoch
        !           772:    as ixsysdep_time.  */
        !           773: extern long ixsysdep_work_time P((const struct uuconf_system *qsys,
        !           774:                                  pointer pseq));
        !           775: 
        !           776: /* Get the time a file was created.  This is called by uustat on
        !           777:    execution files.  There is no way to indicate error.  The return
        !           778:    value must use the same epoch as ixsysdep_time.  */
        !           779: extern long ixsysdep_file_time P((const char *zfile));
        !           780: 
        !           781: /* Get the size in bytes of a file.  If this file does not exist, this
        !           782:    should not give an error message, but should return -1.  If some
        !           783:    other error occurs, this should return -2.  */
        !           784: extern long csysdep_size P((const char *zfile));
        !           785: 
        !           786: /* Return the amount of free space on the containing the given file
        !           787:    name (the file may or may not exist).  If the amount of free space
        !           788:    cannot be determined, the function should return -1.  */
        !           789: extern long csysdep_bytes_free P((const char *zfile));
        !           790: 
        !           791: /* Start getting status information for all systems with available
        !           792:    status information.  There may be status information for unknown
        !           793:    systems, which is why this series of functions is used.  The phold
        !           794:    argument is used to pass information around, to possibly avoid the
        !           795:    use of static variables.  On error this should log an error and
        !           796:    return FALSE.  */
        !           797: extern boolean fsysdep_all_status_init P((pointer *phold));
        !           798: 
        !           799: /* Get status information for the next system.  This should return the
        !           800:    system name and fill in the qstat argument.  The phold argument
        !           801:    will be that set by fsysdep_all_status_init.  On error this should
        !           802:    log an error, set *pferr to TRUE, and return NULL.  */
        !           803: extern char *zsysdep_all_status P((pointer phold, boolean *pferr,
        !           804:                                   struct sstatus *qstat));
        !           805: 
        !           806: /* Free up anything allocated by fsysdep_all_status_init and
        !           807:    zsysdep_all_status.  The phold argument is that set by
        !           808:    fsysdep_all_status_init.  */
        !           809: extern void usysdep_all_status_free P((pointer phold));
        !           810: 
        !           811: /* Display the process status of all processes holding lock files.
        !           812:    This is uustat -p.  The return value is passed to usysdep_exit.  */
        !           813: extern boolean fsysdep_lock_status P((void));
        !           814: 
        !           815: /* Return TRUE if the user has legitimate access to the port.  This is
        !           816:    used by cu to control whether the user can open a port directly,
        !           817:    rather than merely being able to dial out on it.  Opening a port
        !           818:    directly allows the modem to be reprogrammed.  */
        !           819: extern boolean fsysdep_port_access P((struct uuconf_port *qport));
        !           820: 
        !           821: /* Return whether the given port could be named by the given line.  On
        !           822:    Unix, the line argument would be something like "ttyd0", and this
        !           823:    function should return TRUE if the named port is "/dev/ttyd0".  */
        !           824: extern boolean fsysdep_port_is_line P((struct uuconf_port *qport,
        !           825:                                       const char *zline));
        !           826: 
        !           827: /* Set the terminal into raw mode.  In this mode no input characters
        !           828:    should be treated specially, and characters should be made
        !           829:    available as they are typed.  The original terminal mode should be
        !           830:    saved, so that it can be restored by fsysdep_terminal_restore.  If
        !           831:    flocalecho is TRUE, then local echoing should still be done;
        !           832:    otherwise echoing should be disabled.  This function returns FALSE
        !           833:    on error.  */
        !           834: extern boolean fsysdep_terminal_raw P((boolean flocalecho));
        !           835: 
        !           836: /* Restore the terminal back to the original setting, before
        !           837:    fsysdep_terminal_raw was called.  Returns FALSE on error.  */
        !           838: extern boolean fsysdep_terminal_restore P((void));
        !           839: 
        !           840: /* Read a line from the terminal.  The fsysdep_terminal_raw function
        !           841:    will have been called.  This should print the zprompt argument
        !           842:    (unless it is NULL) and return the line, allocated by zbufcpy, or
        !           843:    NULL on error.  */
        !           844: extern char *zsysdep_terminal_line P((const char *zprompt));
        !           845: 
        !           846: /* Write a line to the terminal, ending with a newline.  This is
        !           847:    basically just puts (zline, stdout), except that the terminal will
        !           848:    be in raw mode, so on ASCII Unix systems the line needs to end with
        !           849:    \r\n.  */
        !           850: extern boolean fsysdep_terminal_puts P((const char *zline));
        !           851: 
        !           852: /* If faccept is TRUE, permit the user to generate signals from the
        !           853:    terminal.  If faccept is FALSE, turn signals off again.  After
        !           854:    fsysdep_terminal_raw is called, signals should be off.  Return
        !           855:    FALSE on error.  */
        !           856: extern boolean fsysdep_terminal_signals P((boolean faccept));
        !           857: 
        !           858: /* The cu program expects the system dependent code to handle the
        !           859:    details of copying data from the communications port to the
        !           860:    terminal.  This should be set up by fsysdep_cu_init, and done while
        !           861:    fsysdep_cu is called.  It is permissible to do it on a continual
        !           862:    basis (on Unix a subprocess handles it) so long as the copying can
        !           863:    be stopped by the fsysdep_cu_copy function.
        !           864: 
        !           865:    The fsysdep_cu_init function does any system dependent
        !           866:    initialization needed for this.  */
        !           867: extern boolean fsysdep_cu_init P((struct sconnection *qconn));
        !           868: 
        !           869: /* Copy all data from the communications port to the terminal, and all
        !           870:    data from the terminal to the communications port.  Keep this up
        !           871:    until the escape character *zCuvar_escape is seen.  Set *pbcmd to
        !           872:    the character following the escape character; after the escape
        !           873:    character, zlocalname should be printed, possibly after a delay.
        !           874:    If two escape characters are entered in sequence, this function
        !           875:    should send a single escape character to the port, and not return.
        !           876:    Returns FALSE on error.  */
        !           877: extern boolean fsysdep_cu P((struct sconnection *qconn,
        !           878:                             char *pbcmd,
        !           879:                             const char *zlocalname));
        !           880: 
        !           881: /* If fcopy is TRUE, start copying data from the communications port
        !           882:    to the terminal.  If fcopy is FALSE, stop copying data.  This
        !           883:    function may be called several times during a cu session.  It
        !           884:    should return FALSE on error.  */
        !           885: extern boolean fsysdep_cu_copy P((boolean fcopy));
        !           886: 
        !           887: /* Stop copying data from the communications port to the terminal, and
        !           888:    generally clean up after fsysdep_cu_init and fsysdep_cu.  Returns
        !           889:    FALSE on error.  */
        !           890: extern boolean fsysdep_cu_finish P((void));
        !           891: 
        !           892: /* Run a shell command.  If zcmd is NULL, or *zcmd == '\0', just
        !           893:    start up a shell.  The second argument is one of the following
        !           894:    values.  This should return FALSE on error.  */
        !           895: enum tshell_cmd
        !           896: {
        !           897:   /* Attach stdin and stdout to the terminal.  */
        !           898:   SHELL_NORMAL,
        !           899:   /* Attach stdout to the communications port, stdin to the terminal.  */
        !           900:   SHELL_STDOUT_TO_PORT,
        !           901:   /* Attach stdin to the communications port, stdout to the terminal.  */
        !           902:   SHELL_STDIN_FROM_PORT,
        !           903:   /* Attach both stdin and stdout to the communications port.  */
        !           904:   SHELL_STDIO_ON_PORT
        !           905: };
        !           906: 
        !           907: extern boolean fsysdep_shell P((struct sconnection *qconn,
        !           908:                                const char *zcmd,
        !           909:                                enum tshell_cmd tcmd));
        !           910: 
        !           911: /* Change directory.  If zdir is NULL, or *zdir == '\0', change to the
        !           912:    user's home directory.  Return FALSE on error.  */
        !           913: extern boolean fsysdep_chdir P((const char *zdir));
        !           914: 
        !           915: /* Suspend the current process.  This is only expected to work on Unix
        !           916:    versions that support SIGTSTP.  In general, people can just shell
        !           917:    out.  */
        !           918: extern boolean fsysdep_suspend P((void));
        !           919: 
        !           920: /* Start getting files for uupick.  The zsystem argument may be NULL
        !           921:    to get files from all systems, or it may specify a particular
        !           922:    system.  The zpubdir argument is the public directory to use.  This
        !           923:    returns FALSE on error.  */
        !           924: extern boolean fsysdep_uupick_init P((const char *zsystem,
        !           925:                                      const char *zpubdir));
        !           926: 
        !           927: /* Get the next file for uupick.  This returns the basic file name.
        !           928:    It sets *pzfull to the full name, and *pzfrom to the name of the
        !           929:    system which sent this file over; both should be freed using
        !           930:    ubuffree.  *pzfull should be passed to ubuffree after it is no
        !           931:    longer needed.  The zsystem and zpubdir arguments should be the
        !           932:    same as the arguments to fsysdep_uupick_init.  This returns NULL
        !           933:    when all files been returned.  */
        !           934: extern char *zsysdep_uupick P((const char *zsystem, const char *zpubdir,
        !           935:                               char **pzfrom, char **pzfull));
        !           936: 
        !           937: /* Clean up after getting files for uupick.  */
        !           938: extern boolean fsysdep_uupick_free P((const char *zsystem,
        !           939:                                      const char *zpubdir));
        !           940: 
        !           941: /* Translate a local file name for uupick.  On Unix this is just like
        !           942:    zsysdep_local_file_cwd except that a file beginning with ~/ is
        !           943:    placed in the user's home directory rather than in the public
        !           944:    directory.  */
        !           945: extern char *zsysdep_uupick_local_file P((const char *zfile));
        !           946: 
        !           947: /* Remove a directory and all the files in it.  */
        !           948: extern boolean fsysdep_rmdir P((const char *zdir));
        !           949: 
        !           950: #endif /* ! defined (SYSTEM_H) */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.