Annotation of coherent/g/usr/lib/uucp/tay104/unix/spool.c, revision 1.1.1.1

1.1       root        1: /* spool.c
                      2:    Find a file in the spool directory.
                      3: 
                      4:    Copyright (C) 1991, 1992 Ian Lance Taylor
                      5: 
                      6:    This file is part of the Taylor UUCP package.
                      7: 
                      8:    This program is free software; you can redistribute it and/or
                      9:    modify it under the terms of the GNU General Public License as
                     10:    published by the Free Software Foundation; either version 2 of the
                     11:    License, or (at your option) any later version.
                     12: 
                     13:    This program is distributed in the hope that it will be useful, but
                     14:    WITHOUT ANY WARRANTY; without even the implied warranty of
                     15:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     16:    General Public License for more details.
                     17: 
                     18:    You should have received a copy of the GNU General Public License
                     19:    along with this program; if not, write to the Free Software
                     20:    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     21: 
                     22:    The author of the program may be contacted at [email protected] or
                     23:    c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
                     24:    */
                     25: 
                     26: #include "uucp.h"
                     27: 
                     28: #if USE_RCS_ID
                     29: const char spool_rcsid[] = "$Id: spool.c,v 1.1 93/07/30 08:03:28 bin Exp Locker: bin $";
                     30: #endif
                     31: 
                     32: #include "uudefs.h"
                     33: #include "sysdep.h"
                     34: #include "system.h"
                     35: 
                     36: /* There are several types of files that go in the spool directory,
                     37:    and they go into various different subdirectories.  Whenever the
                     38:    system name LOCAL appears below, it means whatever the local system
                     39:    name is.
                     40: 
                     41:    Command files
                     42:    These contain instructions for uucico indicating what files to transfer
                     43:    to and from what systems.  Each line of a work file is a command
                     44:    beginning with S, R or X.
                     45:    #if ! SPOOLDIR_TAYLOR
                     46:    They are named C.ssssssgqqqq, where ssssss is the system name to
                     47:    transfer to or from, g is the grade and qqqq is the sequence number.
                     48:    #if SPOOLDIR_V2
                     49:    They are put in the spool directory.
                     50:    #elif SPOOLDIR_BSD42 || SPOOLDIR_BSD43
                     51:    They are put in the directory "C.".
                     52:    #elif SPOOLDIR_HDB
                     53:    They are put in a directory named for the system for which they were
                     54:    created.
                     55:    #elif SPOOLDIR_ULTRIX
                     56:    If the directory sys/ssssss exists, they are put in the directory
                     57:    sys/ssssss/C; otherwise, they are put in the directory sys/DEFAULT/C.
                     58:    #endif
                     59:    #elif SPOOLDIR_SVR4
                     60:    They are put in the directory sys/g, where sys is the system name
                     61:    and g is the grade.
                     62:    #endif
                     63:    #else SPOOLDIR_TAYLOR
                     64:    They are named C.gqqqq, where g is the grade and qqqq is the sequence
                     65:    number, and are placed in the directory ssssss/C. where ssssss is
                     66:    the system name to transfer to or from.
                     67:    #endif
                     68: 
                     69:    Data files
                     70:    There are files to be transferred to other systems.  Some files to
                     71:    be transferred may not be in the spool directory, depending on how
                     72:    uucp was invoked.  Data files are named in work files, so it is
                     73:    never necessary to look at them directly (except to remove old ones);
                     74:    it is only necessary to create them.  These means that the many
                     75:    variations in naming are inconsequential.
                     76:    #if ! SPOOLDIR_TAYLOR
                     77:    They are named D.ssssssgqqqq where ssssss is a system name (which
                     78:    may be LOCAL for locally initiated transfers or a remote system for
                     79:    remotely initiated transfers, except that HDB appears to use the
                     80:    system the file is being transferred to), g is the grade and qqqq
                     81:    is the sequence number.  Some systems use a trailing subjob ID
                     82:    number, but we currently do not.  The grade is not important, and
                     83:    some systems do not use it.  If the data file is to become an
                     84:    execution file on another system the grade (if present) will be
                     85:    'X'.  Otherwise Ultrix appears to use 'b'; the uux included with
                     86:    gnuucp 1.0 appears to use 'S'; SCO does not appear to use a grade,
                     87:    although it does use a subjob ID number.
                     88:    #if SPOOLDIR_V2
                     89:    They are put in the spool directory.
                     90:    #elif SPOOLDIR_BSD42
                     91:    If the name begins with D.LOCAL, the file is put in the directory
                     92:    D.LOCAL.  Otherwise the file is put in the directory D..
                     93:    #elif SPOOLDIR_BSD43
                     94:    If the name begins with D.LOCALX, the file is put in the directory
                     95:    D.LOCALX.  Otherwise if the name begins with D.LOCAL, the file is
                     96:    put in the directory D.LOCAL Otherwise the file is put in the
                     97:    directory "D.".
                     98:    #elif SPOOLDIR_HDB
                     99:    They are put in a directory named for the system for which they
                    100:    were created.
                    101:    #elif SPOOLDIR_ULTRIX
                    102:    Say the file is being transferred to system REMOTE.  If the
                    103:    directory sys/REMOTE exists, then if the file begins with D.LOCALX
                    104:    it is put in sys/REMOTE/D.LOCALX, if the file begins with D.LOCAL
                    105:    it is put in sys/REMOTE/D.LOCAL, and otherwise it is put in
                    106:    "sys/REMOTE/D.".  If the directory sys/REMOTE does not exist, the
                    107:    same applies except that DEFAULT is used instead of REMOTE.
                    108:    #elif SPOOLDIR_SVR4
                    109:    They are put in the directory sys/g, where sys is the system name
                    110:    and g is the grade.
                    111:    #endif
                    112:    #else SPOOLDIR_TAYLOR
                    113:    If the file is to become an executable file on another system it is
                    114:    named D.Xqqqq, otherwise it is named D.qqqq where in both cases
                    115:    qqqq is a sequence number.  If the corresponding C. file is in
                    116:    directory ssssss/C., a D.X file is placed in ssssss/D.X and a D.
                    117:    file is placed in "ssssss/D.".
                    118:    #endif
                    119: 
                    120:    Execute files
                    121:    These are files that specify programs to be executed.  They are
                    122:    created by uux, perhaps as run on another system.  These names are
                    123:    important, because a file transfer done to an execute file name
                    124:    causes an execution to occur.  The name is X.ssssssgqqqq, where
                    125:    ssssss is the requesting system, g is the grade, and qqqq is a
                    126:    sequence number.
                    127:    #if SPOOLDIR_V2 || SPOOLDIR_BSD42
                    128:    These files are placed in the spool directory.
                    129:    #elif SPOOLDIR_BSD43
                    130:    These files are placed in the directory X..
                    131:    #elif SPOOLDIR_HDB || SPOOLDIR_SVR4
                    132:    These files are put in a directory named for the system for which
                    133:    the files were created.
                    134:    #elif SPOOLDIR_ULTRIX
                    135:    If there is a spool directory (sys/ssssss) for the requesting
                    136:    system, the files are placed in sys/ssssss/X.; otherwise, the files
                    137:    are placed in "sys/DEFAULT/X.".
                    138:    #elif SPOOLDIR_TAYLOR
                    139:    The system name is automatically truncated to seven characters when
                    140:    a file is created.  The files are placed in the subdirectory X. of
                    141:    a directory named for the system for which the files were created.
                    142:    #endif
                    143: 
                    144:    Temporary receive files
                    145:    These are used when receiving files from another system.  They are
                    146:    later renamed to the final name.  The actual name is unimportant,
                    147:    although it generally begins with TM..
                    148:    #if SPOOLDIR_V2 || SPOOLDIR_BSD42
                    149:    These files are placed in the spool directory.
                    150:    #elif SPOOLDIR_BSD43 || SPOOLDIR_ULTRIX || SPOOLDIR_TAYLOR
                    151:    These files are placed in the directory .Temp.
                    152:    #elif SPOOLDIR_HDB || SPOOLDIR_SVR4
                    153:    These files are placed in a directory named for the system for
                    154:    which they were created.
                    155:    #endif
                    156: 
                    157:    System status files
                    158:    These are used to record when the last call was made to the system
                    159:    and what the status is.  They are used to prevent frequent recalls
                    160:    to a system which is not responding.  I will not attempt to
                    161:    recreate the format of these exactly, since they are not all that
                    162:    important.  They will be put in the directory .Status, as in HDB,
                    163:    and they use the system name as the name of the file.
                    164: 
                    165:    Sequence file
                    166:    This is used to generate a unique sequence number.  It contains an
                    167:    ASCII number.
                    168:    #if SPOOLDIR_V2 || SPOOLDIR_BSD42 || SPOOLDIR_BSD43
                    169:    The file is named SEQF and is kept in the spool directory.
                    170:    #elif SPOOLDIR_HDB || SPOOLDIR_SVR4
                    171:    A separate sequence file is kept for each system in the directory
                    172:    .Sequence with the name of the system.
                    173:    #elif SPOOLDIR_ULTRIX
                    174:    Each system with a file sys/ssssss has a sequence file in
                    175:    sys/ssssss/.SEQF.  Other systems use sys/DEFAULT/.SEQF.
                    176:    #else SPOOLDIR_TAYLOR
                    177:    A sequence file named SEQF is kept in the directory ssssss for each
                    178:    system.
                    179:    #endif
                    180:    */
                    181: 
                    182: /* Given the name of a file as specified in a UUCP command, and the
                    183:    system for which this file has been created, return where to find
                    184:    it in the spool directory.  The file will begin with C. (a command
                    185:    file), D. (a data file) or X. (an execution file).  Under
                    186:    SPOOLDIR_SVR4 we need to know the grade of the file created by the
                    187:    local system; this is the bgrade argument, which is -1 for a file
                    188:    from a remote system.  */
                    189: 
                    190: /*ARGSUSED*/
                    191: char *
                    192: zsfind_file (zsimple, zsystem, bgrade)
                    193:      const char *zsimple;
                    194:      const char *zsystem;
                    195:      int bgrade;
                    196: {
                    197:   if (! fspool_file (zsimple))
                    198:     {
                    199:       ulog (LOG_ERROR, "Unrecognized file name %s", zsimple);
                    200:       return NULL;
                    201:     }
                    202: 
                    203: #if ! SPOOLDIR_HDB && ! SPOOLDIR_SVR4 && ! SPOOLDIR_TAYLOR
                    204:   if (*zsimple == 'X')
                    205:     {
                    206:       size_t clen;
                    207: 
                    208:       /* Files beginning with X. are execute files.  It is important
                    209:         for security reasons that we know the system which created
                    210:         the X. file.  This is easy under SPOOLDIR_HDB or
                    211:         SPOOLDIR_SVR4 SPOOLDIR_TAYLOR, because the file will be in a
                    212:         directory named for the system.  Under other schemes, we must
                    213:         get the system name from the X. file name.  To prevent
                    214:         security violations, we set the system name directly here;
                    215:         this will cause problems if the maximum file name length is
                    216:         too short, but hopefully no problem will occur since any
                    217:         System V systems will be using HDB or SVR4 or TAYLOR.  */
                    218:       clen = strlen (zsimple);
                    219:       if (clen <= 7 || strncmp (zsimple + 2, zsystem, clen - 7) != 0)
                    220:        {
                    221:          static char *zbuf;
                    222:          static size_t cbuf;
                    223:          size_t cwant;
                    224: 
                    225:          cwant = strlen (zsystem) + 8;
                    226:          if (cwant > cbuf)
                    227:            {
                    228:              zbuf = (char *) xrealloc ((pointer) zbuf, cwant);
                    229:              cbuf = cwant;
                    230:            }
                    231:          sprintf (zbuf, "X.%s%s", zsystem,
                    232:                   clen < 5 ? zsimple : zsimple + clen - 5);
                    233:          zsimple = zbuf;
                    234:        }
                    235:     }
                    236: #endif /* ! SPOOLDIR_HDB && ! SPOOLDIR_SVR4 && ! SPOOLDIR_TAYLOR */
                    237: 
                    238: #if SPOOLDIR_V2
                    239:   /* V2 never uses subdirectories.  */
                    240:   return zbufcpy (zsimple);
                    241: #endif /* SPOOLDIR_V2 */
                    242: 
                    243: #if SPOOLDIR_HDB
                    244:   /* HDB always uses the system name as a directory.  */
                    245:   return zsysdep_in_dir (zsystem, zsimple);
                    246: #endif /* SPOOLDIR_HDB */
                    247: 
                    248: #if SPOOLDIR_SVR4
                    249:   /* SVR4 uses grade directories within the system directory for local
                    250:      command and data files.  */
                    251:   if (bgrade < 0 || *zsimple == 'X')
                    252:     return zsysdep_in_dir (zsystem, zsimple);
                    253:   else
                    254:     {
                    255:       char abgrade[2];
                    256: 
                    257:       abgrade[0] = bgrade;
                    258:       abgrade[1] = '\0';
                    259:       return zsappend3 (zsystem, abgrade, zsimple);
                    260:     }
                    261: #endif /* SPOOLDIR_SVR4 */
                    262: 
                    263: #if ! SPOOLDIR_V2 && ! SPOOLDIR_HDB && ! SPOOLDIR_SVR4
                    264:   switch (*zsimple)
                    265:     {
                    266:     case 'C':
                    267: #if SPOOLDIR_BSD42 || SPOOLDIR_BSD43
                    268:       return zsysdep_in_dir ("C.", zsimple);
                    269: #endif /* SPOOLDIR_BSD42 || SPOOLDIR_BSD43 */
                    270: #if SPOOLDIR_ULTRIX
                    271:       if (fsultrix_has_spool (zsystem))
                    272:        return zsappend4 ("sys", zsystem, "C.", zsimple);
                    273:       else
                    274:        return zsappend4 ("sys", "DEFAULT", "C.", zsimple);
                    275: #endif /* SPOOLDIR_ULTRIX */
                    276: #if SPOOLDIR_TAYLOR
                    277:       return zsappend3 (zsystem, "C.", zsimple);
                    278: #endif /* SPOOLDIR_TAYLOR */
                    279: 
                    280:     case 'D':
                    281: #if SPOOLDIR_BSD42 || SPOOLDIR_BSD43
                    282:       {
                    283:        size_t c;
                    284:        boolean ftruncated;
                    285:       
                    286:        /* D.LOCAL in D.LOCAL/, others in D./.  If BSD43, D.LOCALX in
                    287:           D.LOCALX/.  */
                    288:        ftruncated = TRUE;
                    289:        if (strncmp (zsimple + 2, zSlocalname, strlen (zSlocalname)) == 0)
                    290:          {
                    291:            c = strlen (zSlocalname);
                    292:            ftruncated = FALSE;
                    293:          }
                    294:        else if (strncmp (zsimple + 2, zSlocalname, 7) == 0)
                    295:          c = 7;
                    296:        else if (strncmp (zsimple + 2, zSlocalname, 6) == 0)
                    297:          c = 6;
                    298:        else
                    299:          c = 0;
                    300: #if SPOOLDIR_BSD43
                    301:        if (c > 0 && zsimple[c + 2] == 'X')
                    302:          c++;
                    303: #endif /* SPOOLDIR_BSD43 */
                    304:        if (c > 0)
                    305:          {
                    306:            char *zalloc;
                    307: 
                    308:            zalloc = zbufalc (c + 3);
                    309:            memcpy (zalloc, zsimple, c + 2);
                    310:            zalloc[c + 2] = '\0';
                    311: 
                    312:            /* If we truncated the system name, and there is no existing
                    313:               directory with the truncated name, then just use D..  */
                    314:            if (! ftruncated || fsysdep_directory (zalloc))
                    315:              {
                    316:                char *zret;
                    317: 
                    318:                zret = zsysdep_in_dir (zalloc, zsimple);
                    319:                ubuffree (zalloc);
                    320:                return zret;
                    321:              }
                    322:            ubuffree (zalloc);
                    323:          }
                    324:        return zsysdep_in_dir ("D.", zsimple);
                    325:       }
                    326: #endif /* SPOOLDIR_BSD42 || SPOOLDIR_BSD43 */
                    327: #if SPOOLDIR_ULTRIX
                    328:       {
                    329:        size_t c;
                    330:        boolean ftruncated;
                    331:        char *zfree;
                    332:        const char *zdir;
                    333:        char *zret;
                    334:       
                    335:        /* D.LOCALX in D.LOCALX/, D.LOCAL in D.LOCAL/, others in D./.  */
                    336:        ftruncated = TRUE;
                    337:        if (strncmp (zsimple + 2, zSlocalname, strlen (zSlocalname)) == 0)
                    338:          {
                    339:            c = strlen (zSlocalname);
                    340:            ftruncated = FALSE;
                    341:          }
                    342:        else if (strncmp (zsimple + 2, zSlocalname, 7) == 0)
                    343:          c = 7;
                    344:        else if (strncmp (zsimple + 2, zSlocalname, 6) == 0)
                    345:          c = 6;
                    346:        else
                    347:          c = 0;
                    348:        if (c > 0 && zsimple[c + 2] == 'X')
                    349:          ++c;
                    350:        if (c > 0)
                    351:          {
                    352:            zfree = zbufalc (c + 3);
                    353:            memcpy (zfree, zsimple, c + 2);
                    354:            zfree[c + 2] = '\0';
                    355:            zdir = zfree;
                    356: 
                    357:            /* If we truncated the name, and there is no directory for
                    358:               the truncated name, then don't use it.  */
                    359:            if (ftruncated)
                    360:              {
                    361:                char *zlook;
                    362: 
                    363:                zlook = zsappend3 ("sys",
                    364:                                   (fsultrix_has_spool (zsystem)
                    365:                                    ? zsystem
                    366:                                    : "DEFAULT"),
                    367:                                   zdir);
                    368:                if (! fsysdep_directory (zlook))
                    369:                  zdir = "D.";
                    370:                ubuffree (zlook);
                    371:              }
                    372:          }
                    373:        else
                    374:          {
                    375:            zfree = NULL;
                    376:            zdir = "D.";
                    377:          }
                    378:       
                    379:        zret = zsappend4 ("sys",
                    380:                          (fsultrix_has_spool (zsystem)
                    381:                           ? zsystem
                    382:                           : "DEFAULT"),
                    383:                          zdir,
                    384:                          zsimple);
                    385:        ubuffree (zfree);
                    386:        return zret;
                    387:       }
                    388: #endif /* SPOOLDIR_ULTRIX */
                    389: #if SPOOLDIR_TAYLOR
                    390:       if (zsimple[2] == 'X')
                    391:        return zsappend3 (zsystem, "D.X", zsimple);
                    392:       else
                    393:        return zsappend3 (zsystem, "D.", zsimple);
                    394: #endif /* SPOOLDIR_TAYLOR */
                    395: 
                    396: 
                    397:     case 'X':
                    398: #if SPOOLDIR_BSD42
                    399:       return zbufcpy (zsimple);
                    400: #endif
                    401: #if SPOOLDIR_BSD43
                    402:       return zsysdep_in_dir ("X.", zsimple);
                    403: #endif
                    404: #if SPOOLDIR_ULTRIX
                    405:       return zsappend4 ("sys",
                    406:                        (fsultrix_has_spool (zsystem)
                    407:                         ? zsystem
                    408:                         : "DEFAULT"),
                    409:                        "X.",
                    410:                        zsimple);
                    411: #endif
                    412: #if SPOOLDIR_TAYLOR
                    413:       return zsappend3 (zsystem, "X.", zsimple);
                    414: #endif
                    415:     }
                    416: 
                    417:   /* This is just to avoid warnings; it will never be executed.  */
                    418:   return NULL;
                    419: #endif /* ! SPOOLDIR_V2 && ! SPOOLDIR_HDB && ! SPOOLDIR_SVR4 */
                    420: }

unix.superglobalmegacorp.com

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