home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume11 / musbus / part04 / ttychk.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-09-16  |  2.5 KB  |  115 lines

  1. /*
  2.  *
  3.  * Checks for tty accessability and bandwidth saturation.
  4.  *
  5.  * $Header: ttychk.c,v 3.6 87/06/22 14:32:58 kjmcdonell Beta $
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <sgtty.h>
  10. #include <signal.h>
  11.  
  12. struct {
  13.     int    baud;    /* baud rate */
  14.     int    symb;    /* symbolic constant for baud rate */
  15. } bmap[] = {
  16.     {  300,  B300 },
  17.     { 1200, B1200 },
  18.     { 2400, B2400 },
  19.     { 4800, B4800 },
  20.     { 9600, B9600 },
  21.     {    0,     0 }
  22. };
  23. int        status = 0;    /* exit() status */
  24.  
  25. main(argc, argv)
  26. int    argc;
  27. char    *argv[];
  28. {
  29.     struct sgttyb    ttyb;
  30.     int        nusers;        /* number of simulated users */
  31.     int        nscript;    /* number of script files */
  32.     int        baud = 0;    /* aggregate baud rate across
  33.                        active ttys */
  34.     int        br;
  35.     int        nttys;        /* number of active ttys */
  36.     int        i;
  37.     int        fd;
  38.     int        l;
  39.     float        orate;        /* estimated output rate per user */
  40.         int        onalarm();
  41.  
  42.     if (argc < 5) {
  43.         fprintf(stderr, "Usage: ttychk nusers orate nscript ttydev ... \n");
  44.         exit(1);
  45.     }
  46.     nusers = atoi(argv[1]);
  47.     if (nusers < 1) {
  48.         fprintf(stderr, "ttychk: nusers must be > 0\n");
  49.         status |= 1;
  50.     }
  51.     sscanf(argv[2], "%f", &orate);
  52.     nscript = atoi(argv[3]);
  53.     if (nscript < 1) {
  54.         fprintf(stderr, "ttychk: nscript must be > 0\n");
  55.         status |= 1;
  56.     }
  57.  
  58.     nttys = nusers <= nscript ? nusers : nscript;
  59.  
  60.     signal(SIGALRM, onalarm);
  61.     for (i = 4; i < argc && nttys; i++, nttys--) {
  62.         alarm(3);
  63.         if ((fd = open(argv[i], 1)) < 0) {
  64.             fprintf(stderr, "ttychk: cannot open %s for writing\n",
  65.                 argv[i]);
  66.             perror("");
  67.             status |= 1;
  68.             continue;
  69.         }
  70.         alarm(0);
  71.         if (ioctl(fd, TIOCGETP, &ttyb) < 0) {
  72.             fprintf(stderr, "ttychk: cannot stat %s\n",
  73.                 argv[i]);
  74.             perror("");
  75.             status |= 1;
  76.             close(fd);
  77.             continue;
  78.         }
  79.         close(fd);
  80.         br = 0;
  81.         for (l = 0; bmap[l].baud; l++) {
  82.             if (bmap[l].symb == ttyb.sg_ospeed) {
  83.                 br = bmap[l].baud;
  84.                 break;
  85.             }
  86.         }
  87. #ifdef DEBUG
  88.         fprintf(stderr, "%s: %d baud\n", argv[i], br);
  89. #endif
  90.         if (br != 9600)
  91.             fprintf(stderr, "ttychk: Warning - baud rate at %d for %s\n",
  92.                 br, argv[i]);
  93.         baud += br;
  94.     }
  95.     nttys = nusers <= nscript ? nusers : nscript;
  96. #ifdef DEBUG
  97.     fprintf(stderr, "aggregate tty bandwidth: %d baud\n", baud);
  98.     fprintf(stderr, "aggregate tty output rate: %d chars/sec (for %d ttys)\n", (int)(orate*nusers), nttys);
  99. #endif
  100.  
  101.     /* assume 10 bits per character, and the 50% figure is arbitrary! */
  102.     if (nusers*orate > 0.5*(baud/10)) {
  103.         fprintf(stderr, "ttychk panic: Total tty output rate (%d chars/sec) exceeds 50%% of\n              total tty bandwidth (%d chars/sec)\n",
  104.             (int)(nusers*orate), baud/10);
  105.         status |= 1;
  106.     }
  107.  
  108.     exit(status);
  109. }
  110.  
  111. onalarm()
  112. {
  113.     status |= 1;
  114. }
  115.