home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / mint / mntutl95.lzh / MNTUTL95 / LIMIT.C < prev    next >
C/C++ Source or Header  |  1993-08-03  |  2KB  |  152 lines

  1. /*
  2.  * compiling this requires the GCC library, and/or the spawnvp found
  3.  * in the init directory
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <process.h>
  8. #include <osbind.h>
  9. #include <mintbind.h>
  10. #include <ctype.h>
  11. #include <signal.h>
  12.  
  13. void
  14. usage()
  15. {
  16.     fprintf(stderr,
  17. "Usage: limit [-m maxmalloc][-M maxmem][-t maxtime][-v] program [args ... ]\n");
  18.     exit(2);
  19. }
  20.  
  21. /*
  22.  * get a memory value, e.g. 100K or 1024
  23.  */
  24.  
  25. long
  26. getmem(s)
  27.     char *s;
  28. {
  29.     char *olds = s;
  30.     int c;
  31.     long val = 0;
  32.  
  33.     for(;;) {
  34.         c = *s++;
  35.         if (!c) break;
  36.         if (isdigit(c)) {
  37.             val = val * 10 + (c - '0');
  38.         }
  39.         else
  40.             break;
  41.     }
  42.     if (c == 'k' || c == 'K')
  43.         val = 1024 * val;
  44.     else if (c != 0) {
  45.         fprintf(stderr, "invalid number: %s\n", olds);
  46.         usage();
  47.     }
  48.     return val;
  49. }
  50.  
  51. /*
  52.  * get a time value, either an absolute number of seconds or in the form
  53.  * hh:mm:ss.xxxx
  54.  */
  55. long
  56. gettime(s)
  57.     char *s;
  58. {
  59.     char *olds = s;
  60.     long val = 0, subval = 0;
  61.     int c;
  62.  
  63.     for(;;) {
  64.         c = *s++;
  65.         if (!c) break;
  66.         if (isdigit(c)) {
  67.             val = val * 10 + (c - '0');
  68.         }
  69.         else if (c == ':') {
  70.             val = 60 * val;
  71.         }
  72.         else
  73.             break;
  74.     }
  75.     val = val * 1000;
  76.     if (c == '.') {
  77.         c = *s++;
  78.         subval = 100;
  79.         while(c && isdigit(c)) {
  80.             val += subval * (c - '0');
  81.             subval /= 10;
  82.             c = *s++;
  83.         }
  84.     }
  85.  
  86.     if (c != 0) {
  87.         fprintf(stderr, "invalid time: %s\n", olds);
  88.         usage();
  89.     }
  90.     return val;
  91. }
  92.  
  93. void
  94. ign_it()
  95. {
  96. }
  97.  
  98. int
  99. main(argc, argv)
  100.     int argc;
  101.     char **argv;
  102. {
  103.     long r;
  104.     long maxmem, maxalloc, maxtime;
  105.     int c, verbose;
  106.     char *name;
  107.  
  108.     verbose = 0;
  109.     argv++;
  110.     name = *argv;
  111.  
  112.     maxtime = Psetlimit(1, -1L);
  113.     maxmem = Psetlimit(2, -1L);
  114.     maxalloc = Psetlimit(3, -1L);
  115.  
  116.     while (name && *name == '-') {
  117.         c = name[1];
  118.         if (c == 'v')
  119.             verbose = 1;
  120.         else {
  121.             name = *++argv;
  122.             if (c == 0 || !name) usage();
  123.             switch(c) {
  124.               case 'm': maxalloc = getmem(name); break;
  125.               case 'M': maxmem = getmem(name); break;
  126.               case 't': maxtime = gettime(name); break;
  127.               default: usage();
  128.             }
  129.         }
  130.         name = *++argv;
  131.     }
  132.  
  133.     Psignal(SIGXCPU, ign_it);
  134.     if (verbose)
  135. printf("limits:\ntime: %.3f seconds     memory: %ld total %ld allocation\n",
  136.           ((double)maxtime/1000), maxmem, maxalloc);
  137.     Psetlimit(1, maxtime);
  138.     Psetlimit(2, maxmem);
  139.     Psetlimit(3, maxalloc);
  140.  
  141.     if (name)
  142.         r = spawnvp(P_OVERLAY, name, argv);
  143.     else
  144.         r = 0;
  145.  
  146.     if (r < 0) {
  147.         perror(name);
  148.         exit(1);
  149.     }
  150.     exit(r);
  151. }
  152.