/* Try to get the process ID of a given process. */ static PIDQ *pidof(char *prog) { struct stat st; int dostat = 0; PROC *p; PIDQ *q; char *s; int foundone = 0; int ok = 0; /* Try to stat the executable. */ if (prog[0] == '/' && stat(prog, &st) == 0) dostat++; /* Get basename of program. */ if ((s = strrchr(prog, '/')) == NULL) s = prog; else s++; q = (PIDQ *)malloc(sizeof(PIDQ)); q = init_pid_q(q); /* First try to find a match based on dev/ino pair. */ if (dostat) { for (p = plist; p; p = p->next) { if (p->dev == st.st_dev && p->ino == st.st_ino) { add_pid_to_q(q, p); foundone++; } } } /* If we didn't find a match based on dev/ino, try the name. */ if (!foundone) { for (p = plist; p; p = p->next) { ok = 0; ok += (strcmp(p->fullname, prog) == 0); ok += (strcmp(p->basename, s) == 0); if (p->fullname[0] == 0 || strchr(p->fullname, ' ') || scripts_too) ok += (strcmp(p->statname, s) == 0); if (ok) add_pid_to_q(q, p); } } return q; }
/* Try to get the process ID of a given process. */ PIDQ_HEAD *pidof(char *prog) { PROC *p; PIDQ_HEAD *q; struct stat st; char *s; int dostat = 0; int foundone = 0; int ok = 0; if (! prog) return NULL; /* Get basename of program. */ if ((s = strrchr(prog, '/')) == NULL) s = prog; else s++; if (! *s) return NULL; q = (PIDQ_HEAD *)xmalloc(sizeof(PIDQ_HEAD)); q = init_pid_q(q); /* Try to stat the executable. */ if (prog[0] == '/' && stat(prog, &st) == 0) dostat++; /* First try to find a match based on dev/ino pair. */ if (dostat) { for (p = plist; p; p = p->next) { if (p->dev == st.st_dev && p->ino == st.st_ino) { add_pid_to_q(q, p); foundone++; } } } /* If we didn't find a match based on dev/ino, try the name. */ if (!foundone) for (p = plist; p; p = p->next) { ok = 0; /* matching nonmatching * proc name prog name prog name * --- ----------- ------------ * b b, p/b, q/b * p/b b, p/b q/b * * Algorithm: Match if: * cmd = arg * or cmd = base(arg) * or base(cmd) = arg * * Specifically, do not match just because base(cmd) = base(arg) * as was done in earlier versions of this program, since this * allows /aaa/foo to match /bbb/foo . */ ok |= (p->argv0 && strcmp(p->argv0, prog) == 0) || (p->argv0 && s != prog && strcmp(p->argv0, s) == 0) || (p->argv0base && strcmp(p->argv0base, prog) == 0); /* For scripts, compare argv[1] as well. */ if ( scripts_too && p->statname && p->argv1base && !strncmp(p->statname, p->argv1base, STATNAMELEN) ) { ok |= (p->argv1 && strcmp(p->argv1, prog) == 0) || (p->argv1 && s != prog && strcmp(p->argv1, s) == 0) || (p->argv1base && strcmp(p->argv1base, prog) == 0); } /* * if we have a space in argv0, process probably * used setproctitle so try statname. */ if (strlen(s) <= STATNAMELEN && (p->argv0 == NULL || p->argv0[0] == 0 || strchr(p->argv0, ' '))) { ok |= (strcmp(p->statname, s) == 0); } if (ok) add_pid_to_q(q, p); } return q; }
/* Try to get the process ID of a given process. */ PIDQ_HEAD *pidof(char *prog) { PROC *p; PIDQ_HEAD *q; struct stat st; char *s; int dostat = 0; int foundone = 0; int ok = 0; /* Try to stat the executable. */ if (prog[0] == '/' && stat(prog, &st) == 0) dostat++; /* Get basename of program. */ if ((s = strrchr(prog, '/')) == NULL) s = prog; else s++; q = (PIDQ_HEAD *)xmalloc(sizeof(PIDQ_HEAD)); q = init_pid_q(q); /* First try to find a match based on dev/ino pair. */ if (dostat) { for (p = plist; p; p = p->next) { if (p->dev == st.st_dev && p->ino == st.st_ino) { add_pid_to_q(q, p); foundone++; } } } /* If we didn't find a match based on dev/ino, try the name. */ if (!foundone) for (p = plist; p; p = p->next) { ok = 0; /* Compare name (both basename and full path) */ ok += (p->argv0 && strcmp(p->argv0, prog) == 0); ok += (p->argv0 && strcmp(p->argv0base, s) == 0); /* For scripts, compare argv[1] as well. */ if (scripts_too && p->argv1 && !strncmp(p->statname, p->argv1base, STATNAMELEN)) { ok += (strcmp(p->argv1, prog) == 0); ok += (strcmp(p->argv1base, s) == 0); } /* * if we have a space in argv0, process probably * used setproctitle so try statname. */ if (strlen(s) <= STATNAMELEN && (p->argv0 == NULL || p->argv0[0] == 0 || strchr(p->argv0, ' '))) { ok += (strcmp(p->statname, s) == 0); } if (ok) add_pid_to_q(q, p); } return q; }