home *** CD-ROM | disk | FTP | other *** search
/ Chip 1995 March / CHIP3.mdf / slackwar / a / util / util-lin.10 / util-lin / util-linux-1.10 / kill.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-26  |  2.0 KB  |  101 lines

  1. /* kill.c : copyright (92) Peter MacDonald: Distribute freely, don't
  2. restrict*/
  3. /* Modified, Thu Dec 24 14:37:43 1992, faith@cs.unc.edu to support the -l
  4. option to list signal names. */
  5.  
  6. #include <sys/types.h>
  7. #include <signal.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #include <unistd.h>
  11.  
  12. #define ERR 2
  13. const char *usagestr = "usage: kill [-signal] pid ...\n";
  14.  
  15. void oops(void)
  16. { write(ERR,usagestr,strlen(usagestr));
  17.   exit(1);
  18. }   
  19.  
  20. void oops2(char *str1, char *str2)
  21. {
  22.   write(ERR,str1,strlen(str1));
  23.   write(ERR,str2,strlen(str2));
  24.   write(ERR,"\n",1);
  25.   exit(1);
  26. }   
  27.  
  28. char *itoa(int num)
  29. { int sign = 0; 
  30.   static char buf[15];
  31.   char *cp = buf+sizeof(buf)-1;
  32.   if (num<0)
  33.   { sign = 1;
  34.     num = -num;
  35.   }
  36.   do
  37.   { 
  38.     *cp-- = '0'+num%10; 
  39.     num /= 10;
  40.   } while (num);
  41.   if (sign)
  42.     *cp-- = '-';
  43.   return(cp+1);
  44. }
  45.  
  46. const char *signames[] =  {
  47.     "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "UNUSED", 
  48.     "FPE", "KILL", "USR1", "SEGV", "USR2", "PIPE", "ALRM", "TERM", 
  49.     "STKFLT", "CHLD", "CONT", "STOP", "TSTP", "TTIN", "TTOU", 0 };
  50.  
  51. int main(int argc, char **argv)
  52. {
  53.   int i, signum = SIGTERM;
  54.   
  55.   if (argc < 2)
  56.     oops();
  57.   if ((argc>1) && ('-' == *argv[1]))
  58.   {
  59.     if ('?' == argv[1][1] || 'l' == argv[1][1])
  60.       for (i=0; i<NSIG; i++)
  61.         if (!signames[i])
  62.         { write(ERR,"\n",1);
  63.           exit(0);
  64.         }
  65.         else
  66.         { write(ERR,signames[i],strlen(signames[i]));
  67.           write(ERR," ", 1);
  68.           if (i==10)
  69.             write(ERR,"\n",1);
  70.         }
  71.           
  72.     for (i=0; i<NSIG; i++)
  73.       if (!signames[i])
  74.       { i = NSIG; 
  75.         break;
  76.       }
  77.       else
  78.         if (!strcmp(signames[i],argv[1]+1))
  79.           break;
  80.          
  81.     if (i < NSIG)
  82.       signum = i+1;
  83.     else
  84.       if ((!(signum = atoi(argv[1]+1))) || (signum<=0) || (signum>NSIG))
  85.         oops();
  86.     argc--;
  87.     argv++;    
  88.   }      
  89.  
  90.   while (--argc)
  91.   { 
  92.     argv++;
  93.     if ((i = atoi(*argv)) <= 3)
  94.       oops();
  95.     if (kill(i,signum))
  96.       oops2( "kill: no such process ", itoa(i));
  97.   }
  98.   return(0);
  99. }
  100.   
  101.