home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / uulocks / part01 / uulocks.c < prev   
C/C++ Source or Header  |  1993-07-01  |  3KB  |  175 lines

  1. /* uulocks - show status of UUCP ("modem") locks
  2.  * vixie 30jun93 [original]
  3.  *
  4.  * $Id: uulocks.c,v 1.1 1993/07/01 20:17:02 vixie Exp $
  5.  */
  6.  
  7. #include <sys/param.h>
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. #include <dirent.h>
  11. #include <stdio.h>
  12. #include <errno.h>
  13. #include <string.h>
  14.  
  15. static char LckPre[] = "LCK..";
  16. static int LPLen = (sizeof LckPre) - 1;
  17. static int BadExit = 1, GoodExit = 0;
  18. static int PS = 0, Fix = 0, NoHdr = 0;
  19. #if (BSD >= 199103)
  20. static char *PScmd = "ps %s -p %d";
  21. static char *PSarg = "-o user,tt,ucomm,state,start";
  22. #else
  23. static char *PScmd = "ps %s%d";
  24. static char *PSarg = "u";
  25. #endif
  26. static char AsciiBS = 0x08;
  27. static time_t Now;
  28.  
  29. main(argc, argv)
  30.     int argc;
  31.     char *argv[];
  32. {
  33.     time(&Now);
  34.     args(argc, argv);
  35.     do_hdr();
  36.     do_dir("/var/spool/uucp");
  37.     do_dir("/var/run");
  38.     exit(GoodExit);
  39. }
  40.  
  41. usage() {
  42.     fprintf(stderr, "usage:  uulocks [-h] [-p] [-a psargs] [-f]\n");
  43.     exit(BadExit);
  44. }
  45.  
  46. args(argc, argv)
  47.     int argc;
  48.     char *argv[];
  49. {
  50.     extern char *optarg;
  51.     char ch;
  52.  
  53.     while ((ch = getopt(argc, argv, "hpa:f")) != EOF) {
  54.         switch (ch) {
  55.         case 'h': NoHdr++; break;
  56.         case 'p': PS++; break;
  57.         case 'a': PSarg = optarg; break;
  58.         case 'f': Fix++; break;
  59.         default: usage(); break;
  60.         }
  61.     }
  62. }
  63.  
  64. do_hdr() {
  65.     if (!NoHdr) {
  66.         fputs("\
  67. Resource           PID   Lock Age   PStat\
  68. "            , stdout);
  69.         if (PS) {
  70.             fputs(          " (PS Result)", stdout);
  71.         }
  72. /*
  73. ttya1            23321 001+00:35:51 alive (root 23321 ?? getty IE Wed12PM)
  74. */
  75.         putchar('\n');
  76.     }
  77. }
  78.  
  79. do_dir(path)
  80.     char *path;
  81. {
  82.     DIR *dir;
  83.     struct dirent *dp;
  84.  
  85.     if (chdir(path) < 0) {
  86.         perror(path);
  87.         exit(BadExit);
  88.     }
  89.     if (!(dir = opendir("."))) {
  90.         perror(path);
  91.         exit(BadExit);
  92.     }
  93.     while (dp = readdir(dir)) {
  94.         FILE *lck;
  95.         pid_t pid;
  96.         struct stat sb;
  97.         time_t age;
  98.         char timbuf[(sizeof "000+00:00:00")];
  99.         int j;
  100.  
  101.         if ((dp->d_namlen < LPLen)
  102.             || strncmp("LCK..", dp->d_name, LPLen))
  103.             continue;
  104.         if (!(lck = fopen(dp->d_name, "r"))) {
  105.             perror(dp->d_name);
  106.             continue;
  107.         }
  108.         if (fstat(fileno(lck), &sb)) {
  109.             perror(dp->d_name);
  110.             continue;
  111.         }
  112.         pid = (pid_t) getw(lck);
  113.         fclose(lck);
  114.         age = Now - sb.st_mtime;
  115.         strftime(timbuf, sizeof timbuf, "%j+%H:%M:%S", gmtime(&age));
  116.         sprintf(timbuf, "%03d", atoi(timbuf)-1);
  117.         timbuf[3] = '+';    /* ugly */
  118.         if (kill(pid, 0) >= 0)
  119.             j = 1;
  120.         else
  121.             j = (errno != ESRCH);
  122.         printf("%-12s%10d %s %-5s",
  123.                dp->d_name+LPLen, pid, timbuf,
  124.                j ?"alive" :"dead");
  125.         if (Fix && !j) {
  126.             printf(" [unlink: %s]",
  127.                    (unlink(dp->d_name)>=0) ?"ok" :strerror(errno));
  128.         }
  129.         if (PS && j) {
  130.             char cmdbuf[100];    /* ugly */
  131.             FILE *ps;
  132.  
  133.             sprintf(cmdbuf, PScmd, PSarg, pid);
  134.             if (!(ps = popen(cmdbuf, "r"))) {
  135.                 printf(" [ps: %s]", strerror(errno));
  136.             } else {
  137.                 char ch, last_ch;
  138.  
  139.                 /* eat header */
  140.                 while (((ch = getc(ps)) != '\n')
  141.                        && (ch != EOF)
  142.                        )
  143.                     ;
  144.                 /* get first line, compress multiple blanks */
  145.                 if ((last_ch = ch) != EOF) {
  146.                     fputs(" (", stdout);
  147.                     while (((ch = getc(ps)) != '\n')
  148.                            && (ch != EOF)
  149.                            ) {
  150.                         if (ch == ' '
  151.                             && last_ch == ' '
  152.                             ) {
  153.                             continue;
  154.                         }
  155.                         putchar(ch);
  156.                         last_ch = ch;
  157.                     }
  158.                     if (last_ch == ' ') {
  159.                         putchar(AsciiBS);  /* ugly */
  160.                     }
  161.                     putchar(')');
  162.                 }
  163.                 /* run it out */
  164.                 while (ch != EOF) {
  165.                     last_ch = ch;
  166.                     ch = getc(ps);
  167.                 }
  168.             }
  169.             pclose(ps);
  170.         }
  171.         putchar('\n');
  172.     }
  173.     closedir(dir);
  174. }
  175.