4719581d0c
While here, regenerate the other patches
187 lines
5 KiB
C
187 lines
5 KiB
C
--- src/killall.c.orig 2012-02-19 23:08:52 UTC
|
|
+++ src/killall.c
|
|
@@ -36,6 +36,8 @@
|
|
#include <dirent.h>
|
|
#include <signal.h>
|
|
#include <errno.h>
|
|
+#include <limits.h>
|
|
+#include <locale.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <getopt.h>
|
|
@@ -87,40 +89,35 @@ static int verbose = 0, exact = 0, inter
|
|
ignore_case = 0, pidof;
|
|
static long younger_than = 0, older_than = 0;
|
|
|
|
+ /*
|
|
+ * This is based on the implementation from 21.5, as the one in 21.6
|
|
+ * and newer uses Linux specific functions getline() and rpmatch()
|
|
+ */
|
|
static int
|
|
ask (char *name, pid_t pid, const int signal)
|
|
{
|
|
- int res;
|
|
- size_t len;
|
|
- char *line;
|
|
-
|
|
- line = NULL;
|
|
- len = 0;
|
|
-
|
|
- do {
|
|
- if (signal == SIGTERM)
|
|
- printf (_("Kill %s(%s%d) ? (y/N) "), name, process_group ? "pgid " : "",
|
|
- pid);
|
|
- else
|
|
- printf (_("Signal %s(%s%d) ? (y/N) "), name, process_group ? "pgid " : "",
|
|
- pid);
|
|
-
|
|
- fflush (stdout);
|
|
+ int ch, c;
|
|
|
|
- if (getline (&line, &len, stdin) < 0)
|
|
- return 0;
|
|
- /* Check for default */
|
|
- if (line[0] == '\n') {
|
|
- free(line);
|
|
- return 0;
|
|
- }
|
|
- res = rpmatch(line);
|
|
- if (res >= 0) {
|
|
- free(line);
|
|
- return res;
|
|
+ do
|
|
+ {
|
|
+ if (signal == SIGTERM)
|
|
+ printf (_("Kill %s(%s%d) ? (y/N) "), name, process_group ? "pgid " : "",
|
|
+ pid);
|
|
+ else
|
|
+ printf (_("Signal %s(%s%d) ? (y/N) "), name, process_group ? "pgid " : "",
|
|
+ pid);
|
|
+ fflush (stdout);
|
|
+ do
|
|
+ if ((ch = getchar ()) == EOF)
|
|
+ exit (0);
|
|
+ while (ch == '\n' || ch == '\t' || ch == ' ');
|
|
+ do
|
|
+ if ((c = getchar ()) == EOF)
|
|
+ exit (0);
|
|
+ while (c != '\n');
|
|
}
|
|
- } while(1);
|
|
- /* Never should get here */
|
|
+ while (ch != 'y' && ch != 'n' && ch != 'Y' && ch != 'N');
|
|
+ return ch == 'y' || ch == 'Y';
|
|
}
|
|
|
|
static double
|
|
@@ -197,7 +194,7 @@ match_process_uid(pid_t pid, uid_t uid)
|
|
|
|
while (fgets(buf, sizeof buf, f))
|
|
{
|
|
- if (sscanf (buf, "Uid:\t%d", &puid))
|
|
+ if (sscanf (buf, "%*s %*d %*d %*d %*d %*s %*s %*s %*s %*s %*s %*s %d", &puid))
|
|
{
|
|
re = uid==puid;
|
|
break;
|
|
@@ -360,7 +357,7 @@ kill_all (int signal, int names, char **
|
|
}
|
|
#endif /*WITH_SELINUX*/
|
|
/* load process name */
|
|
- if (asprintf (&path, PROC_BASE "/%d/stat", pid_table[i]) < 0)
|
|
+ if (asprintf (&path, PROC_BASE "/%d/status", pid_table[i]) < 0)
|
|
continue;
|
|
if (!(file = fopen (path, "r")))
|
|
{
|
|
@@ -368,7 +365,7 @@ kill_all (int signal, int names, char **
|
|
continue;
|
|
}
|
|
free (path);
|
|
- okay = fscanf (file, "%*d (%15[^)]", comm) == 1;
|
|
+ okay = fscanf (file, "%s", comm) == 1;
|
|
if (!okay) {
|
|
fclose(file);
|
|
continue;
|
|
@@ -390,65 +387,6 @@ kill_all (int signal, int names, char **
|
|
got_long = 0;
|
|
command = NULL; /* make gcc happy */
|
|
length = strlen (comm);
|
|
- if (length == COMM_LEN - 1)
|
|
- {
|
|
- if (asprintf (&path, PROC_BASE "/%d/cmdline", pid_table[i]) < 0)
|
|
- continue;
|
|
- if (!(file = fopen (path, "r"))) {
|
|
- free (path);
|
|
- continue;
|
|
- }
|
|
- free (path);
|
|
- while (1) {
|
|
- /* look for actual command so we skip over initial "sh" if any */
|
|
- char *p;
|
|
- int cmd_size = 128;
|
|
- command_buf = (char *)malloc (cmd_size);
|
|
- if (!command_buf)
|
|
- exit (1);
|
|
-
|
|
- /* 'cmdline' has arguments separated by nulls */
|
|
- for (p=command_buf; ; p++) {
|
|
- int c;
|
|
- if (p == (command_buf + cmd_size))
|
|
- {
|
|
- int cur_size = cmd_size;
|
|
- cmd_size *= 2;
|
|
- command_buf = (char *)realloc(command_buf, cmd_size);
|
|
- if (!command_buf)
|
|
- exit (1);
|
|
- p = command_buf + cur_size;
|
|
- }
|
|
- c = fgetc(file);
|
|
- if (c == EOF || c == '\0') {
|
|
- *p = '\0';
|
|
- break;
|
|
- } else {
|
|
- *p = c;
|
|
- }
|
|
- }
|
|
- if (strlen(command_buf) == 0) {
|
|
- okay = 0;
|
|
- break;
|
|
- }
|
|
- p = strrchr(command_buf,'/');
|
|
- p = p ? p+1 : command_buf;
|
|
- if (strncmp(p, comm, COMM_LEN-1) == 0) {
|
|
- okay = 1;
|
|
- command = p;
|
|
- break;
|
|
- }
|
|
- }
|
|
- (void) fclose(file);
|
|
- if (exact && !okay)
|
|
- {
|
|
- if (verbose)
|
|
- fprintf (stderr, _("skipping partial match %s(%d)\n"), comm,
|
|
- pid_table[i]);
|
|
- continue;
|
|
- }
|
|
- got_long = okay;
|
|
- }
|
|
/* mach by process name */
|
|
for (j = 0; j < names; j++)
|
|
{
|
|
@@ -499,7 +437,7 @@ kill_all (int signal, int names, char **
|
|
{
|
|
int ok = 1;
|
|
|
|
- if (asprintf (&path, PROC_BASE "/%d/exe", pid_table[i]) < 0)
|
|
+ if (asprintf (&path, PROC_BASE "/%d/file", pid_table[i]) < 0)
|
|
continue;
|
|
|
|
if (stat (path, &st) < 0)
|
|
@@ -693,7 +631,7 @@ have_proc_self_stat (void)
|
|
struct stat isproc;
|
|
pid_t pid = getpid();
|
|
|
|
- snprintf(filename, sizeof(filename), PROC_BASE"/%d/stat", (int) pid);
|
|
+ snprintf(filename, sizeof(filename), PROC_BASE"/%d/status", (int) pid);
|
|
return stat(filename, &isproc) == 0;
|
|
}
|
|
|