You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdelibs/kdeprint/signal_proc.c

137 lines
2.2 KiB

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
void commandFromPid(int pid, char *name)
{
char buf[256], c;
FILE *f;
int i;
name[0] = 0;
snprintf(buf, 256, "/proc/%d/stat", pid);
f = fopen(buf, "r");
if (f == NULL)
return;
while ((c = fgetc(f)) != '(') ;
i = 0;
while ((c = fgetc(f)) != ')')
name[i++] = c;
name[i] = 0;
}
int tqfindPid(const char *progname)
{
char name[256];
DIR *dir;
int pid = -1;
struct dirent *ds;
dir = opendir("/proc");
if (dir == NULL)
return -1;
while ((ds = readdir(dir)) !=NULL )
{
pid = -1;
pid = atoi(ds->d_name);
if (pid != -1)
{
commandFromPid(pid, name);
if (strcmp(progname, name) == 0)
return pid;
}
}
return -1;
}
void usage()
{
printf("usage: signal_proc [ -s signal_number ] [ -l ] -p <progname>\n");
}
int main(int argc, char **argv)
{
int pid = -1;
char progname[128] = {0};
int signal_number = -1, i, list_only = 0;
for (i = 1; i < argc; i++)
{
if (argv[i][0] != '-')
{
usage();
return(-1);
}
switch (argv[i][1])
{
case 'p':
strncpy(progname, argv[++i], 128);
progname[127]='\0';
break;
case 's':
signal_number = atoi(argv[++i]);
break;
case 'l':
list_only = 1;
break;
default:
usage();
return -1;
}
}
if (progname[0] == 0)
{
usage();
return -1;
}
pid = tqfindPid(progname);
if (pid == -1)
{
fprintf(stderr, "no such program: %s\n", progname);
return -1;
}
if (list_only)
{
fprintf(stdout, "PID: %d\n", pid);
return 0;
}
if (signal_number != -1)
{
int result;
result = kill(pid, signal_number);
if (result == -1)
{
if (errno == EPERM)
{
char buf[256];
fprintf(stderr, "operation not authorized, switching to root\n");
snprintf(buf, 256, "kill -%d %d", signal_number, pid);
if (execlp("kdesu", "kdesu", "-c", buf, (void *)0) == -1)
{
fprintf(stderr, "operation failed: %s\n", strerror(errno));
return -1;
}
}
else
{
fprintf(stderr, "operation failed (invalid signal or no such process)\n");
return -1;
}
}
}
else
{
fprintf(stderr, "only signal sending is currently supported\n");
return -1;
}
return 0;
}