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

1.1       root        1: /* filnam.c
                      2:    Get names to use for UUCP files.
                      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: #include "uudefs.h"
                     29: #include "uuconf.h"
                     30: #include "sysdep.h"
                     31: #include "system.h"
                     32: 
                     33: #include <errno.h>
                     34: 
                     35: #if HAVE_FCNTL_H
                     36: #include <fcntl.h>
                     37: #else
                     38: #if HAVE_SYS_FILE_H
                     39: #include <sys/file.h>
                     40: #endif
                     41: #endif
                     42: 
                     43: #ifndef O_RDONLY
                     44: #define O_RDONLY 0
                     45: #define O_WRONLY 1
                     46: #define O_RDWR 2
                     47: #endif
                     48: 
                     49: #ifndef O_NOCTTY
                     50: #define O_NOCTTY 0
                     51: #endif
                     52: 
                     53: /* We need a definition for SEEK_SET.  */
                     54: 
                     55: #ifndef SEEK_SET
                     56: #define SEEK_SET 0
                     57: #endif
                     58: 
                     59: /* External functions.  */
                     60: #ifndef lseek
                     61: extern off_t lseek ();
                     62: #endif
                     63: 
                     64: #define ZCHARS \
                     65:   "0123456789ABCDEFGHIJKLMNOPQRTSUVWXYZabcdefghijklmnopqrstuvwxyz"
                     66: 
                     67: /* Local functions.  */
                     68: 
                     69: static boolean fscmd_seq P((const char *zsystem, char *zseq));
                     70: static char *zsfile_name P((int btype, const char *zsystem,
                     71:                            const char *zlocalname, int bgrade,
                     72:                            boolean fxqt, char *ztname, char *zdname,
                     73:                            char *zxname));
                     74: 
                     75: /* Get a new command sequence number (this is not a sequence number to
                     76:    be used for communicating with another system, but a sequence
                     77:    number to be used when generating the name of a command file).
                     78:    The sequence number is placed into zseq, which should be five
                     79:    characters long.  */
                     80: 
                     81: static boolean
                     82: fscmd_seq (zsystem, zseq)
                     83:      const char *zsystem;
                     84:      char *zseq;
                     85: {
                     86:   boolean ferr;
                     87:   char *zfree;
                     88:   const char *zfile;
                     89:   int o;
                     90:   int i;
                     91: 
                     92:   /* Lock the sequence file.  This may not be correct for all systems,
                     93:      but it only matters if the system UUCP and this UUCP are running
                     94:      at the same time.  */
                     95:   while (! fsdo_lock ("LCK..SEQ", TRUE, &ferr))
                     96:     {
                     97:       if (ferr || FGOT_SIGNAL ())
                     98:        return FALSE;
                     99:       sleep (5);
                    100:     }
                    101: 
                    102:   zfree = NULL;
                    103: 
                    104: #if SPOOLDIR_V2 || SPOOLDIR_BSD42 || SPOOLDIR_BSD43
                    105:   zfile = "SEQF";
                    106: #endif
                    107: #if SPOOLDIR_HDB || SPOOLDIR_SVR4
                    108:   zfree = zsysdep_in_dir (".Sequence", zsystem);
                    109:   zfile = zfree;
                    110: #endif
                    111: #if SPOOLDIR_ULTRIX
                    112:   if (! fsultrix_has_spool (zsystem))
                    113:     zfile = "sys/DEFAULT/.SEQF";
                    114:   else
                    115:     {
                    116:       zfree = zsappend3 ("sys", zsystem, ".SEQF");
                    117:       zfile = zfree;
                    118:     }
                    119: #endif /* SPOOLDIR_ULTRIX */
                    120: #if SPOOLDIR_TAYLOR
                    121:   zfree = zsysdep_in_dir (zsystem, "SEQF");
                    122:   zfile = zfree;
                    123: #endif /* SPOOLDIR_TAYLOR */
                    124: 
                    125: #ifdef O_CREAT
                    126:   o = open ((char *) zfile, O_RDWR | O_CREAT | O_NOCTTY, IPUBLIC_FILE_MODE);
                    127: #else
                    128:   o = open ((char *) zfile, O_RDWR | O_NOCTTY);
                    129:   if (o < 0 && errno == ENOENT)
                    130:     {
                    131:       o = creat ((char *) zfile, IPUBLIC_FILE_MODE);
                    132:       if (o >= 0)
                    133:        {
                    134:          (void) close (o);
                    135:          o = open ((char *) zfile, O_RDWR | O_NOCTTY);
                    136:        }
                    137:     }
                    138: #endif
                    139: 
                    140:   if (o < 0)
                    141:     {
                    142:       if (errno == ENOENT)
                    143:        {
                    144:          if (! fsysdep_make_dirs (zfile, FALSE))
                    145:            {
                    146:              (void) fsdo_unlock ("LCK..SEQ", TRUE);
                    147:              return FALSE;
                    148:            }
                    149: #ifdef O_CREAT
                    150:          o = open ((char *) zfile,
                    151:                    O_RDWR | O_CREAT | O_NOCTTY,
                    152:                    IPUBLIC_FILE_MODE);
                    153: #else
                    154:          o = creat ((char *) zfile, IPUBLIC_FILE_MODE);
                    155:          if (o >= 0)
                    156:            {
                    157:              (void) close (o);
                    158:              o = open ((char *) zfile, O_RDWR | O_NOCTTY);
                    159:            }
                    160: #endif
                    161:        }
                    162:       if (o < 0)
                    163:        {
                    164:          ulog (LOG_ERROR, "open (%s): %s", zfile, strerror (errno));
                    165:          (void) fsdo_unlock ("LCK..SEQ", TRUE);
                    166:          return FALSE;
                    167:        }
                    168:     }
                    169: 
                    170:   if (read (o, zseq, CSEQLEN) != CSEQLEN)
                    171:     strcpy (zseq, "0000");
                    172:   zseq[CSEQLEN] = '\0';
                    173: 
                    174:   /* We must add one to the sequence number and return the new value.
                    175:      On Ultrix, arbitrary characters are allowed in the sequence
                    176:      number.  On other systems, the sequence number apparently must be
                    177:      in hex.  */
                    178: #if SPOOLDIR_V2 || SPOOLDIR_BSD42 || SPOOLDIR_BSD43 || SPOOLDIR_HDB || SPOOLDIR_SVR4
                    179:   i = (int) strtol (zseq, (char **) NULL, 16);
                    180:   ++i;
                    181:   if (i > 0xffff)
                    182:     i = 0;
                    183:   /* The sprintf argument has CSEQLEN built into it.  */
                    184:   sprintf (zseq, "%04x", (unsigned int) i);
                    185: #endif
                    186: #if SPOOLDIR_ULTRIX || SPOOLDIR_TAYLOR
                    187:   for (i = CSEQLEN - 1; i >= 0; i--)
                    188:     {
                    189:       const char *zdig;
                    190: 
                    191:       zdig = strchr (ZCHARS, zseq[i]);
                    192:       if (zdig == NULL || zdig[0] == '\0' || zdig[1] == '\0')
                    193:        zseq[i] = '0';
                    194:       else
                    195:        {
                    196:          zseq[i] = zdig[1];
                    197:          break;
                    198:        }
                    199:     }
                    200: #endif /* SPOOLDIR_ULTRIX || SPOOLDIR_TAYLOR */
                    201: 
                    202:   if (lseek (o, (off_t) 0, SEEK_SET) < 0
                    203:       || write (o, zseq, CSEQLEN) != CSEQLEN
                    204:       || close (o) < 0)
                    205:     {
                    206:       ulog (LOG_ERROR, "lseek or write or close: %s", strerror (errno));
                    207:       (void) close (o);
                    208:       (void) fsdo_unlock ("LCK..SEQ", TRUE);
                    209:       return FALSE;
                    210:     }
                    211: 
                    212:   (void) fsdo_unlock ("LCK..SEQ", TRUE);
                    213: 
                    214:   return TRUE;
                    215: }
                    216: 
                    217: /* Get the name of a command or data file for a remote system.  The
                    218:    btype argument should be C for a command file or D for a data file.
                    219:    If the grade of a data file is X, it is assumed that this is going
                    220:    to become an execute file on some other system.  The zsystem
                    221:    argument is the system that the file will be transferred to.  The
                    222:    ztname argument will be set to a file name that could be passed to
                    223:    zsysdep_spool_file_name.  The zdname argument, if not NULL, will be
                    224:    set to a data file name appropriate for the remote system.  The
                    225:    zxname argument, if not NULL, will be set to the name of an execute
                    226:    file on the remote system.  None of the names will be more than 14
                    227:    characters long.  */
                    228: 
                    229: /*ARGSUSED*/
                    230: static char *
                    231: zsfile_name (btype, zsystem, zlocalname, bgrade, fxqt, ztname, zdname, zxname)
                    232:      int btype;
                    233:      const char *zsystem;
                    234:      const char *zlocalname;
                    235:      int bgrade;
                    236:      boolean fxqt;
                    237:      char *ztname;
                    238:      char *zdname;
                    239:      char *zxname;
                    240: {
                    241:   char abseq[CSEQLEN + 1];
                    242:   char absimple[11 + CSEQLEN];
                    243:   char *zname;
                    244: 
                    245:   if (zlocalname == NULL)
                    246:     zlocalname = zSlocalname;
                    247: 
                    248:   while (TRUE)
                    249:     {
                    250:       if (! fscmd_seq (zsystem, abseq))
                    251:        return NULL;
                    252: 
                    253:       if (btype == 'C')
                    254:        {
                    255: #if ! SPOOLDIR_TAYLOR
                    256:          sprintf (absimple, "C.%.7s%c%s", zsystem, bgrade, abseq);
                    257: #else
                    258:          sprintf (absimple, "C.%c%s", bgrade, abseq);
                    259: #endif
                    260:        }
                    261:       else if (btype == 'D')
                    262:        {
                    263:          /* This name doesn't really matter that much; it's just the
                    264:             name we use on the local system.  The name we use on the
                    265:             remote system, which we return in zdname, should contain
                    266:             our system name so that remote UUCP's running SPOOLDIR_V2
                    267:             and the like can distinguish while files come from which
                    268:             systems.  */
                    269: #if SPOOLDIR_HDB || SPOOLDIR_SVR4
                    270:          sprintf (absimple, "D.%.7s%c%s", zsystem, bgrade, abseq);
                    271: #else /* ! SPOOLDIR_HDB && ! SPOOLDIR_SVR4 */
                    272: #if ! SPOOLDIR_TAYLOR
                    273:          sprintf (absimple, "D.%.7s%c%s", zlocalname, bgrade, abseq);
                    274: #else /* SPOOLDIR_TAYLOR */
                    275:          if (fxqt)
                    276:            sprintf (absimple, "D.X%s", abseq);
                    277:          else
                    278:            sprintf (absimple, "D.%s", abseq);
                    279: #endif /* SPOOLDIR_TAYLOR */
                    280: #endif /* ! SPOOLDIR_HDB && ! SPOOLDIR_SVR4 */
                    281:        }
                    282: #if DEBUG > 0
                    283:       else
                    284:        ulog (LOG_FATAL, "zsfile_name: Can't happen");
                    285: #endif
                    286: 
                    287:       zname = zsfind_file (absimple, zsystem, bgrade);
                    288:       if (zname == NULL)
                    289:        return NULL;
                    290: 
                    291:       if (! fsysdep_file_exists (zname))
                    292:        break;
                    293: 
                    294:       ubuffree (zname);
                    295:     }
                    296: 
                    297:   if (ztname != NULL)
                    298:     strcpy (ztname, absimple);
                    299: 
                    300:   if (zdname != NULL)
                    301:     sprintf (zdname, "D.%.7s%c%s", zlocalname, bgrade, abseq);
                    302: 
                    303:   if (zxname != NULL)
                    304:     sprintf (zxname, "X.%.7s%c%s", zlocalname, bgrade, abseq);
                    305: 
                    306:   return zname;
                    307: }
                    308: 
                    309: /* Return a name to use for a data file to be copied to another
                    310:    system.  The name returned will be for a real file.  The zlocalname
                    311:    argument is the local name as seen by the remote system, the bgrade
                    312:    argument is the file grade, and the fxqt argument is TRUE if this
                    313:    file will become an execution file.  The ztname argument, if not
                    314:    NULL, will be set to a name that could be passed to
                    315:    zsysdep_spool_file_name to get back the return value of this
                    316:    function.  The zdname argument, if not NULL, will be set to a name
                    317:    that the file could be given on another system.  The zxname
                    318:    argument, if not NULL, will be set to a name for an execute file on
                    319:    another system.  */
                    320: 
                    321: char *
                    322: zsysdep_data_file_name (qsys, zlocalname, bgrade, fxqt, ztname, zdname,
                    323:                        zxname)
                    324:      const struct uuconf_system *qsys;
                    325:      const char *zlocalname;
                    326:      int bgrade;
                    327:      boolean fxqt;
                    328:      char *ztname;
                    329:      char *zdname;
                    330:      char *zxname;
                    331: {
                    332:   return zsfile_name ('D', qsys->uuconf_zname, zlocalname, bgrade, fxqt, 
                    333:                      ztname, zdname, zxname);
                    334: }
                    335: 
                    336: /* Get a command file name.  */
                    337: 
                    338: char *
                    339: zscmd_file (qsys, bgrade)
                    340:      const struct uuconf_system *qsys;
                    341:      int bgrade;
                    342: {
                    343:   return zsfile_name ('C', qsys->uuconf_zname, (const char *) NULL,
                    344:                      bgrade, FALSE, (char *) NULL, (char *) NULL,
                    345:                      (char *) NULL);
                    346: }
                    347: 
                    348: /* Return a name for an execute file to be created locally.  This is
                    349:    used by uux to execute a command locally with remote files.  */
                    350: 
                    351: char *
                    352: zsysdep_xqt_file_name ()
                    353: {
                    354:   char abseq[CSEQLEN + 1];
                    355:   char absx[11 + CSEQLEN];
                    356:   char *zname;
                    357: 
                    358:   while (TRUE)
                    359:     {
                    360:       if (! fscmd_seq (zSlocalname, abseq))
                    361:        return NULL;
                    362: 
                    363:       sprintf (absx, "X.%.7sX%s", zSlocalname, abseq);
                    364: 
                    365:       zname = zsfind_file (absx, zSlocalname, -1);
                    366:       if (zname == NULL)
                    367:        return NULL;
                    368: 
                    369:       if (! fsysdep_file_exists (zname))
                    370:        break;
                    371: 
                    372:       ubuffree (zname);
                    373:     }
                    374: 
                    375:   return zname;
                    376: }

unix.superglobalmegacorp.com

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