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

1.1       root        1: /* status.c
                      2:    Routines to get and set the status for a system.
                      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 SPOOLDIR_HDB || SPOOLDIR_SVR4
                     36: 
                     37: /* If we are using HDB spool layout, store status using HDB status
                     38:    values.  SVR4 is a variant of HDB.  */
                     39: 
                     40: #define MAP_STATUS 1
                     41: 
                     42: static const int aiMapstatus[] =
                     43: {
                     44:   0, 13, 7, 6, 4, 20, 3, 2
                     45: };
                     46: #define CMAPENTRIES (sizeof (aiMapstatus) / sizeof (aiMapstatus[0]))
                     47: 
                     48: #else /* ! SPOOLDIR_HDB && ! SPOOLDIR_SVR4 */
                     49: 
                     50: #define MAP_STATUS 0
                     51: 
                     52: #endif /* ! SPOOLDIR_HDB && ! SPOOLDIR_SVR4 */
                     53: 
                     54: /* Get the status of a system.  This assumes that we are in the spool
                     55:    directory.  */
                     56: 
                     57: boolean
                     58: fsysdep_get_status (qsys, qret, pfnone)
                     59:      const struct uuconf_system *qsys;
                     60:      struct sstatus *qret;
                     61:      boolean *pfnone;
                     62: {
                     63:   char *zname;
                     64:   FILE *e;
                     65:   char *zline;
                     66:   char *zend, *znext;
                     67:   boolean fbad;
                     68:   int istat;
                     69: 
                     70:   if (pfnone != NULL)
                     71:     *pfnone = FALSE;
                     72: 
                     73:   zname = zsysdep_in_dir (".Status", qsys->uuconf_zname);
                     74:   e = fopen (zname, "r");
                     75:   if (e == NULL)
                     76:     {
                     77:       if (errno != ENOENT)
                     78:        {
                     79:          ulog (LOG_ERROR, "fopen (%s): %s", zname, strerror (errno));
                     80:          ubuffree (zname);
                     81:          return FALSE;
                     82:        }
                     83:       zline = NULL;
                     84:     }
                     85:   else
                     86:     {
                     87:       size_t cline;
                     88: 
                     89:       zline = NULL;
                     90:       cline = 0;
                     91:       if (getline (&zline, &cline, e) <= 0)
                     92:        {
                     93:          xfree ((pointer) zline);
                     94:          zline = NULL;
                     95:        }
                     96:       (void) fclose (e);
                     97:     }
                     98: 
                     99:   if (zline == NULL)
                    100:     {
                    101:       /* There is either no status file for this system, or it's been
                    102:         truncated, so fake a good status.  */
                    103:       qret->ttype = STATUS_COMPLETE;
                    104:       qret->cretries = 0;
                    105:       qret->ilast = 0;
                    106:       qret->cwait = 0;
                    107:       if (pfnone != NULL)
                    108:        *pfnone = TRUE;
                    109:       ubuffree (zname);
                    110:       return TRUE;
                    111:     }
                    112: 
                    113:   /* It turns out that scanf is not used much in this program, so for
                    114:      the benefit of small computers we avoid linking it in.  This is
                    115:      basically
                    116: 
                    117:      sscanf (zline, "%d %d %ld %d", &qret->ttype, &qret->cretries,
                    118:              &qret->ilast, &qret->cwait);
                    119: 
                    120:      except that it's done with strtol.  */
                    121: 
                    122:   fbad = FALSE;
                    123:   istat = (int) strtol (zline, &zend, 10);
                    124:   if (zend == zline)
                    125:     fbad = TRUE;
                    126: 
                    127: #if MAP_STATUS
                    128:   /* On some systems it may be appropriate to map system dependent status
                    129:      values on to our status values.  */
                    130:   {
                    131:     int i;
                    132: 
                    133:     for (i = 0; i < CMAPENTRIES; ++i)
                    134:       {
                    135:        if (aiMapstatus[i] == istat)
                    136:          {
                    137:            istat = i;
                    138:            break;
                    139:          }
                    140:       }
                    141:   }
                    142: #endif /* MAP_STATUS */
                    143: 
                    144:   if (istat < 0 || istat >= (int) STATUS_VALUES)
                    145:     istat = (int) STATUS_COMPLETE;
                    146:   qret->ttype = (enum tstatus_type) istat;
                    147:   znext = zend;
                    148:   qret->cretries = (int) strtol (znext, &zend, 10);
                    149:   if (zend == znext)
                    150:     fbad = TRUE;
                    151:   znext = zend;
                    152:   qret->ilast = strtol (znext, &zend, 10);
                    153:   if (zend == znext)
                    154:     fbad = TRUE;
                    155:   znext = zend;
                    156:   qret->cwait = (int) strtol (znext, &zend, 10);
                    157:   if (zend == znext)
                    158:     fbad = TRUE;
                    159: 
                    160:   xfree ((pointer) zline);
                    161: 
                    162:   if (fbad)
                    163:     {
                    164:       ulog (LOG_ERROR, "%s: Bad status file format", zname);
                    165:       ubuffree (zname);
                    166:       return FALSE;
                    167:     }
                    168: 
                    169:   ubuffree (zname);
                    170: 
                    171:   return TRUE;
                    172: }
                    173: 
                    174: /* Set the status of a remote system.  This assumes the system is
                    175:    locked when this is called, and that the program is in the spool
                    176:    directory.  */
                    177: 
                    178: boolean
                    179: fsysdep_set_status (qsys, qset)
                    180:      const struct uuconf_system *qsys;
                    181:      const struct sstatus *qset;
                    182: {
                    183:   char *zname;
                    184:   FILE *e;
                    185:   int istat;
                    186: 
                    187:   zname = zsysdep_in_dir (".Status", qsys->uuconf_zname);
                    188: 
                    189:   e = esysdep_fopen (zname, TRUE, FALSE, TRUE);
                    190:   ubuffree (zname);
                    191:   if (e == NULL)
                    192:     return FALSE;
                    193:   istat = (int) qset->ttype;
                    194: 
                    195: #if MAP_STATUS
                    196:   /* On some systems it may be appropriate to map istat onto a system
                    197:      dependent number.  */
                    198:   if (istat >= 0 && istat < CMAPENTRIES)
                    199:     istat = aiMapstatus[istat];
                    200: #endif /* MAP_STATUS */
                    201: 
                    202:   fprintf (e, "%d %d %ld %d %s %s\n", istat, qset->cretries,
                    203:           qset->ilast, qset->cwait, azStatus[(int) qset->ttype],
                    204:           qsys->uuconf_zname);
                    205:   if (fclose (e) != 0)
                    206:     {
                    207:       ulog (LOG_ERROR, "fclose: %s", strerror (errno));
                    208:       return FALSE;
                    209:     }
                    210: 
                    211:   return TRUE;
                    212: }

unix.superglobalmegacorp.com

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