File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bmon / src / signal.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:19:56 2012 UTC (12 years, 4 months ago) by misho
Branches: bmon, MAIN
CVS tags: v2_1_0p0, v2_1_0, HEAD
bmon

    1: /*
    2:  * signal.c           Signal Handling
    3:  *
    4:  * Copyright (c) 2001-2005 Thomas Graf <tgraf@suug.ch>
    5:  *
    6:  * Permission is hereby granted, free of charge, to any person obtaining a
    7:  * copy of this software and associated documentation files (the "Software"),
    8:  * to deal in the Software without restriction, including without limitation
    9:  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   10:  * and/or sell copies of the Software, and to permit persons to whom the
   11:  * Software is furnished to do so, subject to the following conditions:
   12:  *
   13:  * The above copyright notice and this permission notice shall be included
   14:  * in all copies or substantial portions of the Software.
   15:  *
   16:  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   17:  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   18:  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
   19:  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   20:  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
   21:  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
   22:  * DEALINGS IN THE SOFTWARE.
   23:  */
   24: 
   25: #include <bmon/bmon.h>
   26: #include <bmon/conf.h>
   27: #include <bmon/utils.h>
   28: 
   29: static int sig_state = 0;
   30: 
   31: static RETSIGTYPE sig_usr1(int unused)
   32: {
   33: 	sig_state = 1;
   34: 	signal(SIGUSR1, sig_usr1);
   35: }
   36: 
   37: int is_signal_recvd(void)
   38: {
   39: 	int ret = sig_state;
   40: 	sig_state = 0;
   41: 	return ret;
   42: }
   43: 
   44: #if defined PRAGMA_FALLBACK
   45: #pragma init (init_signal)
   46: #endif
   47: 
   48: static void __init init_signal(void)
   49: {
   50: 	if (signal(SIGUSR1, sig_usr1) == SIG_ERR) {
   51: 		perror("signal(SIGUSR1) failed");
   52: 		exit(1);
   53: 	}
   54: }
   55: 
   56: void send_signal(const char *arg)
   57: {
   58: 	if (*arg != '-') {
   59: 		long pid = strtol(arg, NULL, 10);
   60: 		
   61: 		if (pid != LONG_MIN && pid != LONG_MAX) {
   62: 			if (kill((int) pid, SIGUSR1) < 0)
   63: 				quit("kill(%d, SIGUSR1) failed: %s\n",
   64: 					(int) pid, strerror(errno));
   65: 		} else
   66: 			quit("Invalid pid.\n");
   67: 	} else {
   68: 		FILE *f;
   69: 		char buf[256], hdr[256], bmon_procs[10][256];
   70: 		int cnt = 0, pid_to_kill = -1;
   71: 		int my_uid = getuid();
   72: 		char cmd[64];
   73: 		
   74: 		memset(cmd, 0, sizeof(cmd));
   75: 		snprintf(cmd, sizeof(cmd)-1, "ps -U %d -o pid,uid,args", my_uid);
   76: 		
   77: 		if (!(f = popen(cmd, "r"))) {
   78: 			fprintf(stderr, "popen(%s: %s\n", cmd, strerror(errno));
   79: 			quit("Your ps is probably not POSIX compatible, use kill\n");
   80: 		}
   81: 
   82: 		fgets(hdr, sizeof(hdr), f);
   83: 		
   84: 		while(fgets(buf, sizeof(buf), f)) {
   85: 			int pid, uid, n;
   86: 			char args[256], cmd[256];
   87: 
   88: 			if (!strstr(buf, "bmon") || !strstr(buf, "-w") || strstr(buf, "-S"))
   89: 				continue;
   90: 
   91: 			n = sscanf(buf, "%d %d %s %[^\n\r]s", &pid, &uid, cmd, args);
   92: 			
   93: 			if (n != 4)
   94: 				continue;
   95: 			
   96: 			if (uid == my_uid) {
   97: 				if (cnt <= 9) {
   98: 					snprintf(bmon_procs[cnt], sizeof(bmon_procs[cnt])-1,
   99: 						"%5d %5d %s %s", pid, uid, cmd, args);
  100: 					pid_to_kill = pid;
  101: 					cnt++;
  102: 				} else
  103: 					break;
  104: 			}
  105: 		}
  106: 		
  107: 		pclose(f);
  108: 		
  109: 		if (cnt == 1) {
  110: 			if (pid_to_kill >= 0)
  111: 				if (kill((int) pid_to_kill, SIGUSR1) < 0)
  112: 					quit("kill(%d, SIGUSR1) failed: %s\n",
  113: 						(int) pid_to_kill, strerror(errno));
  114: 		} else {
  115: 			int n;
  116: 			
  117: 			fprintf(stderr, "%d instances of bmon are running, " \
  118: 				"use bmon -S <pid>\n", cnt);
  119: 			
  120: 			printf("%s", hdr);
  121: 			for (n=0; n < cnt; n++)
  122: 				printf("%s\n", bmon_procs[n]);
  123: 		}
  124: 	}
  125: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>