--- src/killall.c.orig 2012-02-19 23:08:52 UTC +++ src/killall.c @@ -36,6 +36,8 @@ #include #include #include +#include +#include #include #include #include @@ -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; }