home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume4 / sco-crash / interact.c < prev    next >
C/C++ Source or Header  |  1989-02-03  |  3KB  |  184 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #include <setjmp.h>
  5. #include <signal.h>
  6.  
  7. extern    prbufs ();
  8. extern    prfiles ();
  9. extern    prinodes ();
  10. extern    prmounts ();
  11. extern    prprocs ();
  12. extern    prstats ();
  13. extern    prtexts ();
  14. extern    prusers ();
  15. extern    prvars ();
  16. extern    quit ();
  17. extern    help ();
  18. extern    int    errno;
  19.  
  20. jmp_buf    del;
  21. int    delflag;
  22.  
  23. struct    func {
  24.     void    (*f_func)();
  25.     char    *f_name;
  26. };
  27.  
  28. struct    func    commands[] = {
  29.     { prbufs, "b" },
  30.     { prbufs, "buf" },
  31.     { prfiles, "f" },
  32.     { prfiles, "file" },
  33.     { help, "h" },
  34.     { help, "help" },
  35.     { prinodes, "i" },
  36.     { prinodes, "ino" },
  37.     { prinodes, "inode" },
  38.     { prmounts, "m" },
  39.     { prmounts, "mount" },
  40.     { prprocs, "p" },
  41.     { prprocs, "proc" },
  42.     { quit, "q" },
  43.     { quit, "quit" },
  44.     { prstats, "s" },
  45.     { prstats, "stat" },
  46.     { prtexts, "t" },
  47.     { prtexts, "text" },
  48.     { prusers, "u" },
  49.     { prusers, "user" },
  50.     { prvars, "v" },
  51.     { prvars, "var" },
  52.     { 0, 0 }
  53. };
  54.  
  55. help ()
  56. {
  57.     printf ("command summary\n\n");
  58.  
  59.     printf ("buf (b)        - buffer headers\n");
  60.     printf ("file (f)       - open files\n");
  61.     printf ("help (h,?)     - list commands\n");
  62.     printf ("inode (ino,i)  - active inodes\n");
  63.     printf ("mount (m)      - mounted file systems\n");
  64.     printf ("proc (p)       - active and defunct processes\n");
  65.     printf ("quit (q,^D)    - exit crash\n");
  66.     printf ("stat (s)       - crash statistics, age, time\n");
  67.     printf ("text (t)       - active and sticky bit text segments\n");
  68.     printf ("user (u)       - user page information\n");
  69.     printf ("var (v)        - tunable parameters\n");
  70. }
  71.  
  72. quit ()
  73. {
  74.     exit (0);
  75. }
  76.  
  77. interupt (sig)
  78. int    sig;
  79. {
  80.     delflag = 1;
  81.     fflush (stdout);
  82.     fflush (stderr);
  83.     longjmp (del, sig);
  84. }
  85.  
  86. interact ()
  87. {
  88.     int    i;
  89.     int    items[100];
  90.     int    cnt;
  91.     char    *cp;
  92.     char    *com;
  93.     char    *num;
  94.     char    buf[BUFSIZ];
  95.  
  96.     while (setjmp (del))        /* catch that first interupt */
  97.         fprintf (stderr, "\nq to quit\n");
  98.  
  99.     signal (SIGINT, interupt);    /* and setup the handler */
  100.  
  101.     while (fprintf (stderr, "> "), gets (buf) != (char *) 0) {
  102.         while (setjmp (del))
  103.             goto eh;
  104.  
  105.         /*
  106.          * make all commands lower case.
  107.          */
  108.  
  109.         for (i = strlen (buf) - 1;i >= 0;i--)
  110.             if (isupper (buf[i]))
  111.                 buf[i] = tolower (buf[i]);
  112.  
  113.         /*
  114.          * find first non-white space character and skip if
  115.          * a blank line
  116.          */
  117.  
  118.         for (com = buf;*com && (*com == ' ' || *com == '\t');com++)
  119.             ;
  120.  
  121.         if (*com == '\0')
  122.             continue;
  123.  
  124.         /*
  125.          * find the entire command word
  126.          */
  127.  
  128.         if (*com == '?') {
  129.             help ();
  130.             continue;
  131.         }
  132.  
  133.         for (cp = com;*cp >= 'a' && *cp <= 'z';cp++)
  134.             ;
  135.  
  136.         if (*cp != '\0') {
  137.             *cp++ = '\0';
  138.  
  139.         /*
  140.          * tokenize the remainder of the string into numbers
  141.          */
  142.  
  143.             for (cnt = 0;*cp && cnt < 100;cnt++) {
  144.                 for (;*cp && isspace (*cp);cp++)
  145.                     ;
  146.  
  147.                 for (num = cp;*cp && isdigit (*cp);cp++)
  148.                     ;
  149.  
  150.                 if (*cp && ! isspace (*cp))
  151.                     goto eh;
  152.  
  153.                 if (*cp)
  154.                     *cp++ = '\0';
  155.  
  156.                 items[cnt] = atoi (num);
  157.             }
  158.         } else {
  159.             cnt = 0;
  160.         }
  161.         
  162.         for (i = 0;commands[i].f_name != (char *) 0;i++)
  163.             if (strcmp (commands[i].f_name, com) == 0)
  164.                 break;
  165.  
  166.         if (commands[i].f_name == (char *) 0)
  167.             goto eh;
  168.  
  169.         (*commands[i].f_func) (items, cnt);
  170.         continue;
  171.  
  172.         /*
  173.          * common error handler.  get here if an error is found.
  174.          */
  175. eh:
  176.         if (delflag) {
  177.             putc ('\n', stderr);
  178.             delflag = 0;
  179.         }
  180.         fprintf (stderr, "eh?\n");
  181.         signal (SIGINT, interupt);
  182.     }
  183. }
  184.