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

1.1       root        1: /* statsb.c
                      2:    System dependent routines for uustat.
                      3: 
                      4:    Copyright (C) 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 statsb_rcsid[] = "$Id: statsb.c,v 1.1 93/07/30 08:03:31 bin Exp Locker: bin $";
                     30: #endif
                     31: 
                     32: #include "uudefs.h"
                     33: #include "uuconf.h"
                     34: #include "sysdep.h"
                     35: #include "system.h"
                     36: 
                     37: #include <errno.h>
                     38: 
                     39: #if HAVE_FCNTL_H
                     40: #include <fcntl.h>
                     41: #else
                     42: #if HAVE_SYS_FILE_H
                     43: #include <sys/file.h>
                     44: #endif
                     45: #endif
                     46: 
                     47: #ifndef O_RDONLY
                     48: #define O_RDONLY 0
                     49: #define O_WRONLY 1
                     50: #define O_RDWR 2
                     51: #endif
                     52: 
                     53: #ifndef O_NOCTTY
                     54: #define O_NOCTTY 0
                     55: #endif
                     56: 
                     57: #if HAVE_OPENDIR
                     58: #if HAVE_DIRENT_H
                     59: #include <dirent.h>
                     60: #else /* ! HAVE_DIRENT_H */
                     61: #include <sys/dir.h>
                     62: #define dirent direct
                     63: #endif /* ! HAVE_DIRENT_H */
                     64: #endif /* HAVE_OPENDIR */
                     65: 
                     66: #if HAVE_TIME_H
                     67: #include <time.h>
                     68: #endif
                     69: 
                     70: #if HAVE_UTIME_H
                     71: #include <utime.h>
                     72: #endif
                     73: 
                     74: /* Local functions.  */
                     75: 
                     76: static int ussettime P((const char *z, time_t inow));
                     77: static boolean fskill_or_rejuv P((pointer puuconf, const char *zid,
                     78:                                  boolean fkill));
                     79: 
                     80: /* See whether the user is permitted to kill arbitrary jobs.  This is
                     81:    true only for root and uucp.  We check for uucp by seeing if the
                     82:    real user ID and the effective user ID are the same; this works
                     83:    because we should be suid to uucp, so our effective user ID will
                     84:    always be uucp while our real user ID will be whoever ran the
                     85:    program.  */
                     86: 
                     87: boolean
                     88: fsysdep_privileged ()
                     89: {
                     90:   uid_t iuid;
                     91: 
                     92:   iuid = getuid ();
                     93:   return iuid == 0 || iuid == geteuid ();
                     94: }
                     95: 
                     96: /* Set file access time to the present.  On many systems this could be
                     97:    done by passing NULL to utime, but on some that doesn't work.  This
                     98:    routine is not time critical, so we never rely on NULL.  */
                     99: 
                    100: static int
                    101: ussettime(z, inow)
                    102:      const char *z;
                    103:      time_t inow;
                    104: {
                    105: #if HAVE_UTIME_H
                    106:   struct utimbuf s;
                    107: 
                    108:   s.actime = inow;
                    109:   s.modtime = inow;
                    110:   return utime ((char *) z, &s);
                    111: #else
                    112:   time_t ai[2];
                    113: 
                    114:   ai[0] = inow;
                    115:   ai[1] = inow;
                    116:   return utime ((char *) z, ai);
                    117: #endif
                    118: }
                    119: 
                    120: /* Kill a job, given the jobid.  */
                    121: 
                    122: boolean
                    123: fsysdep_kill_job (puuconf, zid)
                    124:      pointer puuconf;
                    125:      const char *zid;
                    126: {
                    127:   return fskill_or_rejuv (puuconf, zid, TRUE);
                    128: }
                    129: 
                    130: /* Rejuvenate a job, given the jobid.  */
                    131: 
                    132: boolean
                    133: fsysdep_rejuvenate_job (puuconf, zid)
                    134:      pointer puuconf;
                    135:      const char *zid;
                    136: {
                    137:   return fskill_or_rejuv (puuconf, zid, FALSE);
                    138: }
                    139: 
                    140: /* Kill or rejuvenate a job, given the jobid.  */
                    141: 
                    142: static boolean
                    143: fskill_or_rejuv (puuconf, zid, fkill)
                    144:      pointer puuconf;
                    145:      const char *zid;
                    146:      boolean fkill;
                    147: {
                    148:   char *zfile;
                    149:   char *zsys;
                    150:   char bgrade;
                    151:   time_t inow = 0;
                    152:   int iuuconf;
                    153:   struct uuconf_system ssys;
                    154:   FILE *e;
                    155:   boolean fret;
                    156:   char *zline;
                    157:   size_t cline;
                    158:   int isys;
                    159: 
                    160:   zfile = zsjobid_to_file (zid, &zsys, &bgrade);
                    161:   if (zfile == NULL)
                    162:     return FALSE;
                    163: 
                    164:   if (! fkill)
                    165:     inow = time ((time_t *) NULL);
                    166: 
                    167:   iuuconf = uuconf_system_info (puuconf, zsys, &ssys);
                    168:   if (iuuconf == UUCONF_NOT_FOUND)
                    169:     {
                    170:       if (! funknown_system (puuconf, zsys, &ssys))
                    171:        {
                    172:          ulog (LOG_ERROR, "%s: Bad job id", zid);
                    173:          ubuffree (zfile);
                    174:          ubuffree (zsys);
                    175:          return FALSE;
                    176:        }
                    177:     }
                    178:   else if (iuuconf != UUCONF_SUCCESS)
                    179:     {
                    180:       ulog_uuconf (LOG_ERROR, puuconf, iuuconf);
                    181:       ubuffree (zfile);
                    182:       ubuffree (zsys);
                    183:       return FALSE;
                    184:     }
                    185: 
                    186:   e = fopen (zfile, "r");
                    187:   if (e == NULL)
                    188:     {
                    189:       if (errno == ENOENT)
                    190:        ulog (LOG_ERROR, "%s: Job not found", zid);
                    191:       else
                    192:        ulog (LOG_ERROR, "fopen (%s): %s", zfile, strerror (errno));
                    193:       (void) uuconf_system_free (puuconf, &ssys);
                    194:       ubuffree (zfile);
                    195:       ubuffree (zsys);
                    196:       return FALSE;
                    197:     }
                    198: 
                    199:   /* Now we have to read through the file to identify any temporary
                    200:      files.  */
                    201:   fret = TRUE;
                    202:   zline = NULL;
                    203:   cline = 0;
                    204:   while (getline (&zline, &cline, e) > 0)
                    205:     {
                    206:       struct scmd s;
                    207: 
                    208:       if (! fparse_cmd (zline, &s))
                    209:        {
                    210:          ulog (LOG_ERROR, "Bad line in command file %s", zfile);
                    211:          fret = FALSE;
                    212:          continue;
                    213:        }
                    214: 
                    215:       /* You are only permitted to delete a job if you submitted it or
                    216:         if you are root or uucp.  */
                    217:       if (strcmp (s.zuser, zsysdep_login_name ()) != 0
                    218:          && ! fsysdep_privileged ())
                    219:        {
                    220:          ulog (LOG_ERROR, "%s: Not submitted by you", zid);
                    221:          xfree ((pointer) zline);
                    222:          (void) fclose (e);
                    223:          (void) uuconf_system_free (puuconf, &ssys);
                    224:          ubuffree (zfile);
                    225:          ubuffree (zsys);
                    226:          return FALSE;
                    227:        }
                    228: 
                    229:       if (s.bcmd == 'S' || s.bcmd == 'E')
                    230:        {
                    231:          char *ztemp;
                    232: 
                    233:          ztemp = zsfind_file (s.ztemp, ssys.uuconf_zname, bgrade);
                    234:          if (ztemp == NULL)
                    235:            fret = FALSE;
                    236:          else
                    237:            {
                    238:              if (fkill)
                    239:                isys = remove (ztemp);
                    240:              else
                    241:                isys = ussettime (ztemp, inow);
                    242: 
                    243:              if (isys != 0 && errno != ENOENT)
                    244:                {
                    245:                  ulog (LOG_ERROR, "%s (%s): %s",
                    246:                        fkill ? "remove" : "utime", ztemp,
                    247:                        strerror (errno));
                    248:                  fret = FALSE;
                    249:                }
                    250: 
                    251:              ubuffree (ztemp);
                    252:            }
                    253:        }
                    254:     }
                    255: 
                    256:   xfree ((pointer) zline);
                    257:   (void) fclose (e);
                    258:   (void) uuconf_system_free (puuconf, &ssys);
                    259:   ubuffree (zsys);
                    260: 
                    261:   if (fkill)
                    262:     isys = remove (zfile);
                    263:   else
                    264:     isys = ussettime (zfile, inow);
                    265: 
                    266:   if (isys != 0 && errno != ENOENT)
                    267:     {
                    268:       ulog (LOG_ERROR, "%s (%s): %s", fkill ? "remove" : "utime",
                    269:            zfile, strerror (errno));
                    270:       fret = FALSE;
                    271:     }
                    272: 
                    273:   ubuffree (zfile);
                    274: 
                    275:   return fret;
                    276: }
                    277: 
                    278: /* Get the time a work job was queued.  */
                    279: 
                    280: long
                    281: ixsysdep_work_time (qsys, pseq)
                    282:      const struct uuconf_system *qsys;
                    283:      pointer pseq;
                    284: {
                    285:   char *zjobid, *zfile;
                    286:   long iret;
                    287: 
                    288:   zjobid = zsysdep_jobid (qsys, pseq);
                    289:   zfile = zsjobid_to_file (zjobid, (char **) NULL, (char *) NULL);
                    290:   if (zfile == NULL)
                    291:     return 0;
                    292:   ubuffree (zjobid);
                    293:   iret = ixsysdep_file_time (zfile);
                    294:   ubuffree (zfile);
                    295:   return iret;
                    296: }
                    297: 
                    298: /* Get the time a file was created (actually, the time it was last
                    299:    modified).  */
                    300: 
                    301: long
                    302: ixsysdep_file_time (zfile)
                    303:      const char *zfile;
                    304: {
                    305:   struct stat s;
                    306: 
                    307:   if (stat ((char *) zfile, &s) < 0)
                    308:     {
                    309:       if (errno != ENOENT)
                    310:        ulog (LOG_ERROR, "stat (%s): %s", zfile, strerror (errno));
                    311:       return ixsysdep_time ((long *) NULL);
                    312:     }
                    313: 
                    314:   return (long) s.st_mtime;
                    315: }
                    316: 
                    317: /* Start getting the status files.  */
                    318: 
                    319: boolean
                    320: fsysdep_all_status_init (phold)
                    321:      pointer *phold;
                    322: {
                    323:   DIR *qdir;
                    324: 
                    325:   qdir = opendir ((char *) ".Status");
                    326:   if (qdir == NULL)
                    327:     {
                    328:       ulog (LOG_ERROR, "opendir (.Status): %s", strerror (errno));
                    329:       return FALSE;
                    330:     }
                    331: 
                    332:   *phold = (pointer) qdir;
                    333:   return TRUE;
                    334: }
                    335: 
                    336: /* Get the next status file.  */
                    337: 
                    338: char *
                    339: zsysdep_all_status (phold, pferr, qstat)
                    340:      pointer phold;
                    341:      boolean *pferr;
                    342:      struct sstatus *qstat;
                    343: {
                    344:   DIR *qdir = (DIR *) phold;
                    345:   struct dirent *qentry;
                    346: 
                    347:   while (TRUE)
                    348:     {
                    349:       errno = 0;
                    350:       qentry = readdir (qdir);
                    351:       if (qentry == NULL)
                    352:        {
                    353:          if (errno == 0)
                    354:            *pferr = FALSE;
                    355:          else
                    356:            {
                    357:              ulog (LOG_ERROR, "readdir: %s", strerror (errno));
                    358:              *pferr = TRUE;
                    359:            }
                    360:          return NULL;
                    361:        }
                    362: 
                    363:       if (qentry->d_name[0] != '.')
                    364:        {
                    365:          struct uuconf_system ssys;
                    366: 
                    367:          /* Hack seriously; fsysdep_get_status only looks at the
                    368:             zname element of the qsys argument, so if we fake that we
                    369:             can read the status file.  This should really be done
                    370:             differently.  */
                    371:          ssys.uuconf_zname = qentry->d_name;
                    372:          if (fsysdep_get_status (&ssys, qstat, (boolean *) NULL))
                    373:            return zbufcpy (qentry->d_name);
                    374: 
                    375:          /* If fsysdep_get_status fails, it will output an error
                    376:             message.  We just continue with the next entry, so that
                    377:             most of the status files will be displayed.  */
                    378:        }
                    379:     }
                    380: }
                    381: 
                    382: /* Finish getting the status file.  */
                    383: 
                    384: void
                    385: usysdep_all_status_free (phold)
                    386:      pointer phold;
                    387: {
                    388:   DIR *qdir = (DIR *) phold;
                    389: 
                    390:   (void) closedir (qdir);
                    391: }
                    392: 
                    393: /* Get the status of all processes holding lock files.  We do this by
                    394:    invoking ps after we've figured out the process entries to use.  */
                    395: 
                    396: boolean
                    397: fsysdep_lock_status ()
                    398: {
                    399:   DIR *qdir;
                    400:   struct dirent *qentry;
                    401:   int calc;
                    402:   int *pai;
                    403:   int cgot;
                    404:   int aidescs[3];
                    405:   char *zcopy, *ztok;
                    406:   int cargs, iarg;
                    407:   char **pazargs;
                    408: 
                    409:   qdir = opendir ((char *) zSlockdir);
                    410:   if (qdir == NULL)
                    411:     {
                    412:       ulog (LOG_ERROR, "opendir (%s): %s", zSlockdir, strerror (errno));
                    413:       return FALSE;
                    414:     }
                    415: 
                    416:   /* We look for entries that start with "LCK.." and ignore everything
                    417:      else.  This won't find all possible lock files, but it should
                    418:      find all the locks on terminals and systems.  */
                    419: 
                    420:   calc = 0;
                    421:   pai = NULL;
                    422:   cgot = 0;
                    423:   while ((qentry = readdir (qdir)) != NULL)
                    424:     {
                    425:       char *zname;
                    426:       int o;
                    427: #if HAVE_V2_LOCKFILES
                    428:       int i;
                    429: #else
                    430:       char ab[12];
                    431: #endif
                    432:       int cread;
                    433:       int ierr;
                    434:       int ipid;
                    435: 
                    436:       if (strncmp (qentry->d_name, "LCK..", sizeof "LCK.." - 1) != 0)
                    437:        continue;
                    438: 
                    439:       zname = zsysdep_in_dir (zSlockdir, qentry->d_name);
                    440:       o = open ((char *) zname, O_RDONLY | O_NOCTTY, 0);
                    441:       if (o < 0)
                    442:        {
                    443:          if (errno != ENOENT)
                    444:            ulog (LOG_ERROR, "open (%s): %s", zname, strerror (errno));
                    445:          ubuffree (zname);
                    446:          continue;
                    447:        }
                    448: 
                    449: #if HAVE_V2_LOCKFILES
                    450:       cread = read (o, &i, sizeof i);
                    451: #else
                    452:       cread = read (o, ab, sizeof ab - 1);
                    453: #endif
                    454: 
                    455:       ierr = errno;
                    456:       (void) close (o);
                    457: 
                    458:       if (cread < 0)
                    459:        {
                    460:          ulog (LOG_ERROR, "read %s: %s", zname, strerror (ierr));
                    461:          ubuffree (zname);
                    462:          continue;
                    463:        }
                    464: 
                    465:       ubuffree (zname);
                    466: 
                    467: #if HAVE_V2_LOCKFILES
                    468:       ipid = i;
                    469: #else
                    470:       ab[cread] = '\0';
                    471:       ipid = strtol (ab, (char **) NULL, 10);
                    472: #endif
                    473: 
                    474:       printf ("%s: %d\n", qentry->d_name, ipid);
                    475: 
                    476:       if (cgot >= calc)
                    477:        {
                    478:          calc += 10;
                    479:          pai = (int *) xrealloc ((pointer) pai, calc * sizeof (int));
                    480:        }
                    481: 
                    482:       pai[cgot] = ipid;
                    483:       ++cgot;
                    484:     }
                    485: 
                    486:   if (cgot == 0)
                    487:     return TRUE;
                    488: 
                    489:   aidescs[0] = SPAWN_NULL;
                    490:   aidescs[1] = 1;
                    491:   aidescs[2] = 2;
                    492: 
                    493:   /* Parse PS_PROGRAM into an array of arguments.  */
                    494:   zcopy = zbufcpy (PS_PROGRAM);
                    495: 
                    496:   cargs = 0;
                    497:   for (ztok = strtok (zcopy, " \t");
                    498:        ztok != NULL;
                    499:        ztok = strtok ((char *) NULL, " \t"))
                    500:     ++cargs;
                    501: 
                    502:   pazargs = (char **) xmalloc ((cargs + 1) * sizeof (char *));
                    503: 
                    504:   memcpy (zcopy, PS_PROGRAM, sizeof PS_PROGRAM);
                    505:   for (ztok = strtok (zcopy, " \t"), iarg = 0;
                    506:        ztok != NULL;
                    507:        ztok = strtok ((char *) NULL, " \t"), ++iarg)
                    508:     pazargs[iarg] = ztok;
                    509:   pazargs[iarg] = NULL;
                    510: 
                    511: #if ! HAVE_PS_MULTIPLE
                    512:   /* We have to invoke ps multiple times.  */
                    513:   {
                    514:     int i;
                    515:     char *zlast, *zset;
                    516: 
                    517:     zlast = pazargs[cargs - 1];
                    518:     zset = zbufalc (strlen (zlast) + 20);
                    519:     for (i = 0; i < cgot; i++)
                    520:       {
                    521:        pid_t ipid;
                    522: 
                    523:        sprintf (zset, "%s%d", zlast, pai[i]);
                    524:        pazargs[cargs - 1] = zset;
                    525: 
                    526:        ipid = ixsspawn ((const char **) pazargs, aidescs, FALSE, FALSE,
                    527:                         (const char *) NULL, FALSE, TRUE,
                    528:                         (const char *) NULL, (const char *) NULL,
                    529:                         (const char *) NULL);
                    530:        if (ipid < 0)
                    531:          ulog (LOG_ERROR, "ixsspawn: %s", strerror (errno));
                    532:        else
                    533:          (void) ixswait ((unsigned long) ipid, PS_PROGRAM);
                    534:       }
                    535:     ubuffree (zset);
                    536:   }
                    537: #else
                    538:   {
                    539:     char *zlast;
                    540:     int i;
                    541:     pid_t ipid;
                    542: 
                    543:     zlast = zbufalc (strlen (pazargs[cargs - 1]) + cgot * 20 + 1);
                    544:     strcpy (zlast, pazargs[cargs - 1]);
                    545:     for (i = 0; i < cgot; i++)
                    546:       {
                    547:        char ab[20];
                    548: 
                    549:        sprintf (ab, "%d", pai[i]);
                    550:        strcat (zlast, ab);
                    551:        if (i + 1 < cgot)
                    552:          strcat (zlast, ",");
                    553:       }
                    554:     pazargs[cargs - 1] = zlast;
                    555: 
                    556:     ipid = ixsspawn ((const char **) pazargs, aidescs, FALSE, FALSE,
                    557:                     (const char *) NULL, FALSE, TRUE,
                    558:                     (const char *) NULL, (const char *) NULL,
                    559:                     (const char *) NULL);
                    560:     if (ipid < 0)
                    561:       ulog (LOG_ERROR, "ixsspawn: %s", strerror (errno));
                    562:     else
                    563:       (void) ixswait ((unsigned long) ipid, PS_PROGRAM);
                    564:     ubuffree (zlast);
                    565:   }
                    566: #endif    
                    567: 
                    568:   ubuffree (zcopy);
                    569:   xfree ((pointer) pazargs);
                    570: 
                    571:   return TRUE;
                    572: }

unix.superglobalmegacorp.com

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