159 lines
3.9 KiB
Plaintext
159 lines
3.9 KiB
Plaintext
--- checkproc.c
|
|
+++ checkproc.c 2011-02-08 18:49:40.991925970 +0000
|
|
@@ -210,6 +210,8 @@ int main(int argc, char **argv)
|
|
if (pid_file) { /* The case of having a pid file */
|
|
if (verify_pidfile(pid_file,fullname,root,flags,false) < 0)
|
|
exit(LSB_STATUS_PROOFX);
|
|
+ if (iargc)
|
|
+ clear_pids();
|
|
}
|
|
if (list_empty(&remember)) { /* No process found with pid file */
|
|
if (pid_forced)
|
|
--- libinit.c
|
|
+++ libinit.c 2011-02-09 08:12:47.703926223 +0000
|
|
@@ -314,9 +314,42 @@ static void init_mounts(void)
|
|
join(&save, &mounts);
|
|
}
|
|
|
|
+static MNTINFO *find_prefix(const char * path, const dev_t dev)
|
|
+{
|
|
+ const size_t nlen = strlen(path);
|
|
+ list_t *ptr;
|
|
+
|
|
+ list_for_each(ptr, &mounts) {
|
|
+ MNTINFO *m = list_entry(ptr, MNTINFO);
|
|
+ if (m->dev != dev)
|
|
+ continue;
|
|
+ if (nlen < m->nlen)
|
|
+ continue;
|
|
+ if (m->nlen == 1) /* root fs is the last entry */
|
|
+ return m;
|
|
+ if (strncmp(path, m->point, m->nlen))
|
|
+ continue;
|
|
+ return m;
|
|
+ }
|
|
+ return (MNTINFO*)0;
|
|
+}
|
|
+
|
|
static int find_mount(const char * path, MNTINFO *s)
|
|
{
|
|
- return (strncmp(path, s->point, s->nlen) == 0);
|
|
+ const size_t nlen = strlen(path);
|
|
+ list_t *ptr;
|
|
+
|
|
+ list_for_each(ptr, &mounts) {
|
|
+ MNTINFO *m = list_entry(ptr, MNTINFO);
|
|
+ if (nlen < m->nlen)
|
|
+ continue;
|
|
+ if (m->nlen == 1) /* root fs is the last entry */
|
|
+ return (m == s);
|
|
+ if (strncmp(path, m->point, m->nlen))
|
|
+ continue;
|
|
+ return (m == s);
|
|
+ }
|
|
+ return 0;
|
|
}
|
|
|
|
extern inline char * handl_buf(char *restrict buf)
|
|
@@ -661,17 +694,8 @@ int pidof (const char * inname, const ch
|
|
}
|
|
realname = expandpath(fullname);
|
|
if (realname) {
|
|
- list_t *ptr;
|
|
init_mounts();
|
|
- list_for_each(ptr, &mounts) {
|
|
- MNTINFO *m = list_entry(ptr, MNTINFO);
|
|
- if (m->dev != full_st.st_dev)
|
|
- continue;
|
|
- if (strncmp(realname, m->point, m->nlen) != 0)
|
|
- continue;
|
|
- prefix = m;
|
|
- break;
|
|
- }
|
|
+ prefix = find_prefix(realname, full_st.st_dev);
|
|
}
|
|
}
|
|
|
|
--- mkill.c
|
|
+++ mkill.c 2011-02-09 09:21:58.369993020 +0000
|
|
@@ -172,7 +172,7 @@ int main(int argc, char* argv[])
|
|
const size_t alen = strlen(argv[num]);
|
|
char * astr = argv[num];
|
|
|
|
- if (alen == 0)
|
|
+ if (alen <= 1)
|
|
continue;
|
|
|
|
if (*(astr+(alen-1)) == '/')
|
|
@@ -192,8 +192,9 @@ int main(int argc, char* argv[])
|
|
char line[BUFSIZ+1];
|
|
char path[256];
|
|
char * slash;
|
|
+ char * pline;
|
|
ssize_t len;
|
|
- FILE * maps;
|
|
+ FILE * file;
|
|
DIR * fdir;
|
|
int order;
|
|
int dffd;
|
|
@@ -222,6 +223,16 @@ int main(int argc, char* argv[])
|
|
slash = &path[len];
|
|
|
|
*slash = '\0';
|
|
+ strcat(slash, "/statm");
|
|
+
|
|
+ if ((file = fopenat(dfd, path)) == (FILE*)0)
|
|
+ continue;
|
|
+ pline = fgets(line, BUFSIZ, file);
|
|
+ fclose(file);
|
|
+ if (!pline || line[0] == '0')
|
|
+ continue;
|
|
+
|
|
+ *slash = '\0';
|
|
strcat(slash, "/root");
|
|
|
|
errno = 0;
|
|
@@ -262,9 +273,9 @@ int main(int argc, char* argv[])
|
|
*slash = '\0';
|
|
strcat(slash, "/maps");
|
|
|
|
- if ((maps = fopenat(dfd, path)) == (FILE*)0)
|
|
+ if ((file = fopenat(dfd, path)) == (FILE*)0)
|
|
continue;
|
|
- while (fgets(line, BUFSIZ, maps)) {
|
|
+ while (fgets(line, BUFSIZ, file)) {
|
|
if (sscanf(line, "%*s %*s %*s %*x:%*x %*d %s", name) == 1) {
|
|
|
|
if (name[0] == '\0' || name[0] == '[')
|
|
@@ -277,7 +288,7 @@ int main(int argc, char* argv[])
|
|
}
|
|
if (found) break;
|
|
}
|
|
- (void)fclose(maps);
|
|
+ (void)fclose(file);
|
|
|
|
if (found) {
|
|
add_proc(curr, order);
|
|
@@ -469,7 +480,6 @@ static void init_mnt(int argc, char* arg
|
|
return;
|
|
}
|
|
|
|
-
|
|
if ((mnt = setmntent("/proc/mounts", "r")) == (FILE*)0)
|
|
error(100, "cannot open /proc/mounts: %s\n", strerror(errno));
|
|
|
|
@@ -619,6 +629,13 @@ static int check(const char *restrict na
|
|
mntent_t *p = list_entry(ptr, mntent_t);
|
|
if (nlen < p->nlen)
|
|
continue;
|
|
+ if (p->nlen == 1) {
|
|
+ if (nlen == 1)
|
|
+ return p->order;
|
|
+ if (shadow(&p->shadow.this, name, nlen))
|
|
+ continue;
|
|
+ return p->order;
|
|
+ }
|
|
if (name[p->nlen] != '\0' && name[p->nlen] != '/')
|
|
continue;
|
|
if (strncmp(name, p->name, p->nlen) == 0) {
|