Add some code to be able to detect programs even as user with

kernel 3.0 and above
This commit is contained in:
Werner Fink 2011-10-17 12:53:27 +00:00
parent 4860983f8b
commit 6fe3edd48c
2 changed files with 31 additions and 21 deletions

View File

@ -39,6 +39,8 @@ sysvinit (2.89dsf) UNRELEASED; urgency=low
variable on non-linux platforms.
* Only set the VSWTC field for termios in init if it is available,
to get the source building on FreeBSD.
* Add some code to be able to detect programs even as user with
kernel 3.0 and above
-- Petter Reinholdtsen <pere@hungry.com> Sun Apr 11 11:28:55 CEST 2010

View File

@ -469,6 +469,7 @@ int readproc(int do_stat)
char *s, *q;
unsigned long startcode, endcode;
int pid, f;
ssize_t len;
/* Open the /proc directory. */
if (chdir("/proc") == -1) {
@ -635,23 +636,22 @@ int readproc(int do_stat)
switch (do_stat) {
case DO_NETFS:
if ((p->nfs = check4nfs(path, buf)))
break;
goto link;
case DO_STAT:
if (stat(path, &st) != 0)
break;
else {
char buf[PATH_MAX];
f = readlink(path, buf, sizeof buf);
if (f > 0) {
p->pathname = (char *)xmalloc(f + 1);
memcpy(p->pathname, buf, f);
p->pathname[f] = '\0';
}
}
p->dev = st.st_dev;
p->ino = st.st_ino;
/* Fall through */
default:
link:
len = readlink(path, buf, PATH_MAX);
if (len > 0) {
p->pathname = (char *)xmalloc(len + 1);
memcpy(p->pathname, buf, len);
p->pathname[len] = '\0';
}
break;
}
@ -722,6 +722,7 @@ PIDQ_HEAD *pidof(char *prog)
int dostat = 0;
int foundone = 0;
int ok = 0;
const int root = (getuid() == 0);
char real[PATH_MAX+1];
if (! prog)
@ -769,16 +770,11 @@ PIDQ_HEAD *pidof(char *prog)
* network FS located binaries */
if (!foundone && nfs) {
for (p = plist; p; p = p->next) {
char exe [PATH_MAX+1];
char path[PATH_MAX+1];
int len;
if (!p->pathname)
continue;
if (!p->nfs)
continue;
snprintf(exe, sizeof(exe), "/proc/%d/exe", p->pid);
if ((len = readlink(exe, path, PATH_MAX)) < 0)
continue;
path[len] = '\0';
if (strcmp(prog, path) != 0)
if (strcmp(prog, p->pathname) != 0)
continue;
add_pid_to_q(q, p);
foundone++;
@ -788,19 +784,31 @@ PIDQ_HEAD *pidof(char *prog)
/* If we didn't find a match based on dev/ino, try the name. */
if (!foundone) for (p = plist; p; p = p->next) {
if (prog[0] == '/') {
if (!p->pathname)
continue;
if (!p->pathname) {
if (root)
continue;
goto fallback;
}
if (strcmp(prog, p->pathname)) {
int len = strlen(prog);
if (strncmp(prog, p->pathname, len))
{
if (scripts_too)
goto fallback;
continue;
}
if (strcmp(" (deleted)", p->pathname + len))
{
if (scripts_too)
goto fallback;
continue;
}
}
add_pid_to_q(q, p);
continue;
}
fallback:
ok = 0;
/* matching nonmatching