Annotation of coherent/g/usr/lib/uucp/tay104/system.h, revision 1.1.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.