1 |
douglas |
455 |
--- src/killall.c.orig 2011-06-20 04:43:24.000000000 -0700 |
2 |
|
|
+++ src/killall.c 2011-08-06 21:48:35.014330713 -0700 |
3 |
douglas |
279 |
@@ -36,6 +36,8 @@ |
4 |
|
|
#include <dirent.h> |
5 |
|
|
#include <signal.h> |
6 |
|
|
#include <errno.h> |
7 |
|
|
+#include <limits.h> |
8 |
|
|
+#include <locale.h> |
9 |
|
|
#include <sys/types.h> |
10 |
|
|
#include <sys/stat.h> |
11 |
|
|
#include <getopt.h> |
12 |
douglas |
455 |
@@ -87,40 +89,35 @@ |
13 |
douglas |
279 |
ignore_case = 0, pidof; |
14 |
|
|
static long younger_than = 0, older_than = 0; |
15 |
|
|
|
16 |
|
|
+ /* |
17 |
|
|
+ * This is based on the implementation from 21.5, as the one in 21.6 |
18 |
|
|
+ * and newer uses Linux specific functions getline() and rpmatch() |
19 |
|
|
+ */ |
20 |
|
|
static int |
21 |
|
|
ask (char *name, pid_t pid, const int signal) |
22 |
|
|
{ |
23 |
|
|
- int res; |
24 |
|
|
- size_t len; |
25 |
|
|
- char *line; |
26 |
|
|
- |
27 |
|
|
- line = NULL; |
28 |
|
|
- len = 0; |
29 |
|
|
- |
30 |
|
|
- do { |
31 |
|
|
- if (signal == SIGTERM) |
32 |
|
|
- printf (_("Kill %s(%s%d) ? (y/N) "), name, process_group ? "pgid " : "", |
33 |
|
|
- pid); |
34 |
|
|
- else |
35 |
|
|
- printf (_("Signal %s(%s%d) ? (y/N) "), name, process_group ? "pgid " : "", |
36 |
|
|
- pid); |
37 |
douglas |
455 |
- |
38 |
|
|
- fflush (stdout); |
39 |
douglas |
279 |
+ int ch, c; |
40 |
|
|
|
41 |
|
|
- if (getline (&line, &len, stdin) < 0) |
42 |
|
|
- return 0; |
43 |
|
|
- /* Check for default */ |
44 |
|
|
- if (line[0] == '\n') { |
45 |
|
|
- free(line); |
46 |
|
|
- return 0; |
47 |
|
|
- } |
48 |
|
|
- res = rpmatch(line); |
49 |
|
|
- if (res >= 0) { |
50 |
|
|
- free(line); |
51 |
|
|
- return res; |
52 |
|
|
+ do |
53 |
|
|
+ { |
54 |
|
|
+ if (signal == SIGTERM) |
55 |
|
|
+ printf (_("Kill %s(%s%d) ? (y/N) "), name, process_group ? "pgid " : "", |
56 |
|
|
+ pid); |
57 |
|
|
+ else |
58 |
|
|
+ printf (_("Signal %s(%s%d) ? (y/N) "), name, process_group ? "pgid " : "", |
59 |
|
|
+ pid); |
60 |
|
|
+ fflush (stdout); |
61 |
|
|
+ do |
62 |
|
|
+ if ((ch = getchar ()) == EOF) |
63 |
|
|
+ exit (0); |
64 |
|
|
+ while (ch == '\n' || ch == '\t' || ch == ' '); |
65 |
|
|
+ do |
66 |
|
|
+ if ((c = getchar ()) == EOF) |
67 |
|
|
+ exit (0); |
68 |
|
|
+ while (c != '\n'); |
69 |
|
|
} |
70 |
|
|
- } while(1); |
71 |
|
|
- /* Never should get here */ |
72 |
|
|
+ while (ch != 'y' && ch != 'n' && ch != 'Y' && ch != 'N'); |
73 |
|
|
+ return ch == 'y' || ch == 'Y'; |
74 |
|
|
} |
75 |
|
|
|
76 |
|
|
static double |
77 |
douglas |
455 |
@@ -197,7 +194,7 @@ |
78 |
|
|
|
79 |
|
|
while (fgets(buf, sizeof buf, f)) |
80 |
|
|
{ |
81 |
|
|
- if (sscanf (buf, "Uid:\t%d", &puid)) |
82 |
|
|
+ if (sscanf (buf, "%*s %*d %*d %*d %*d %*s %*s %*s %*s %*s %*s %*s %d", &puid)) |
83 |
|
|
{ |
84 |
|
|
re = uid==puid; |
85 |
|
|
break; |
86 |
|
|
@@ -360,7 +357,7 @@ |
87 |
douglas |
279 |
} |
88 |
|
|
#endif /*WITH_SELINUX*/ |
89 |
|
|
/* load process name */ |
90 |
|
|
- if (asprintf (&path, PROC_BASE "/%d/stat", pid_table[i]) < 0) |
91 |
|
|
+ if (asprintf (&path, PROC_BASE "/%d/status", pid_table[i]) < 0) |
92 |
|
|
continue; |
93 |
|
|
if (!(file = fopen (path, "r"))) |
94 |
|
|
{ |
95 |
douglas |
455 |
@@ -368,7 +365,7 @@ |
96 |
douglas |
279 |
continue; |
97 |
|
|
} |
98 |
|
|
free (path); |
99 |
|
|
- okay = fscanf (file, "%*d (%15[^)]", comm) == 1; |
100 |
|
|
+ okay = fscanf (file, "%s", comm) == 1; |
101 |
|
|
if (!okay) { |
102 |
|
|
fclose(file); |
103 |
|
|
continue; |
104 |
douglas |
455 |
@@ -390,65 +387,6 @@ |
105 |
douglas |
279 |
got_long = 0; |
106 |
|
|
command = NULL; /* make gcc happy */ |
107 |
|
|
length = strlen (comm); |
108 |
|
|
- if (length == COMM_LEN - 1) |
109 |
|
|
- { |
110 |
|
|
- if (asprintf (&path, PROC_BASE "/%d/cmdline", pid_table[i]) < 0) |
111 |
|
|
- continue; |
112 |
|
|
- if (!(file = fopen (path, "r"))) { |
113 |
|
|
- free (path); |
114 |
|
|
- continue; |
115 |
|
|
- } |
116 |
|
|
- free (path); |
117 |
|
|
- while (1) { |
118 |
|
|
- /* look for actual command so we skip over initial "sh" if any */ |
119 |
|
|
- char *p; |
120 |
|
|
- int cmd_size = 128; |
121 |
|
|
- command_buf = (char *)malloc (cmd_size); |
122 |
|
|
- if (!command_buf) |
123 |
|
|
- exit (1); |
124 |
|
|
- |
125 |
|
|
- /* 'cmdline' has arguments separated by nulls */ |
126 |
|
|
- for (p=command_buf; ; p++) { |
127 |
|
|
- int c; |
128 |
|
|
- if (p == (command_buf + cmd_size)) |
129 |
|
|
- { |
130 |
|
|
- int cur_size = cmd_size; |
131 |
|
|
- cmd_size *= 2; |
132 |
|
|
- command_buf = (char *)realloc(command_buf, cmd_size); |
133 |
|
|
- if (!command_buf) |
134 |
|
|
- exit (1); |
135 |
|
|
- p = command_buf + cur_size; |
136 |
|
|
- } |
137 |
|
|
- c = fgetc(file); |
138 |
|
|
- if (c == EOF || c == '\0') { |
139 |
|
|
- *p = '\0'; |
140 |
|
|
- break; |
141 |
|
|
- } else { |
142 |
|
|
- *p = c; |
143 |
|
|
- } |
144 |
|
|
- } |
145 |
|
|
- if (strlen(command_buf) == 0) { |
146 |
|
|
- okay = 0; |
147 |
|
|
- break; |
148 |
|
|
- } |
149 |
|
|
- p = strrchr(command_buf,'/'); |
150 |
|
|
- p = p ? p+1 : command_buf; |
151 |
|
|
- if (strncmp(p, comm, COMM_LEN-1) == 0) { |
152 |
|
|
- okay = 1; |
153 |
|
|
- command = p; |
154 |
|
|
- break; |
155 |
|
|
- } |
156 |
|
|
- } |
157 |
|
|
- (void) fclose(file); |
158 |
|
|
- if (exact && !okay) |
159 |
|
|
- { |
160 |
|
|
- if (verbose) |
161 |
|
|
- fprintf (stderr, _("skipping partial match %s(%d)\n"), comm, |
162 |
|
|
- pid_table[i]); |
163 |
|
|
- continue; |
164 |
|
|
- } |
165 |
|
|
- got_long = okay; |
166 |
|
|
- } |
167 |
|
|
/* mach by process name */ |
168 |
|
|
for (j = 0; j < names; j++) |
169 |
|
|
{ |
170 |
douglas |
455 |
@@ -499,7 +437,7 @@ |
171 |
douglas |
279 |
{ |
172 |
|
|
int ok = 1; |
173 |
|
|
|
174 |
|
|
- if (asprintf (&path, PROC_BASE "/%d/exe", pid_table[i]) < 0) |
175 |
|
|
+ if (asprintf (&path, PROC_BASE "/%d/file", pid_table[i]) < 0) |
176 |
|
|
continue; |
177 |
|
|
|
178 |
|
|
if (stat (path, &st) < 0) |
179 |
douglas |
455 |
@@ -693,7 +631,7 @@ |
180 |
|
|
struct stat isproc; |
181 |
|
|
pid_t pid = getpid(); |
182 |
|
|
|
183 |
|
|
- snprintf(filename, sizeof(filename), PROC_BASE"/%d/stat", (int) pid); |
184 |
|
|
+ snprintf(filename, sizeof(filename), PROC_BASE"/%d/status", (int) pid); |
185 |
|
|
return stat(filename, &isproc) == 0; |
186 |
|
|
} |
187 |
|
|
|