This commit is contained in:
parent
5c042ce76b
commit
dffb94a35a
@ -114,8 +114,8 @@
|
||||
+.SH AUTHOR
|
||||
+Werner Fink <werner@suse.de>
|
||||
--- mkill.c
|
||||
+++ mkill.c 2008-12-12 14:30:48.817075022 +0100
|
||||
@@ -0,0 +1,684 @@
|
||||
+++ mkill.c 2009-01-28 16:36:35.524201270 +0100
|
||||
@@ -0,0 +1,728 @@
|
||||
+/*
|
||||
+ * mkill.c Send a signal to all processes accessing a mount point
|
||||
+ *
|
||||
@ -186,6 +186,7 @@
|
||||
+ proc_t * this, *ptr, * last;
|
||||
+ struct dirent * dent;
|
||||
+ int num, nsig = SIGTERM;
|
||||
+ struct stat st;
|
||||
+ boolean found;
|
||||
+ DIR * proc;
|
||||
+
|
||||
@ -261,7 +262,7 @@
|
||||
+ name[len] = '\0';
|
||||
+ if (check(name)) {
|
||||
+ add_proc((pid_t)atol(dent->d_name));
|
||||
+ continue;
|
||||
+ goto fuse;
|
||||
+ }
|
||||
+
|
||||
+ *slash = '\0';
|
||||
@ -274,7 +275,7 @@
|
||||
+ name[len] = '\0';
|
||||
+ if (check(name)) {
|
||||
+ add_proc((pid_t)atol(dent->d_name));
|
||||
+ continue;
|
||||
+ goto fuse;
|
||||
+ }
|
||||
+
|
||||
+ *slash = '\0';
|
||||
@ -285,9 +286,11 @@
|
||||
+ if ((len = readlink(path, name, PATH_MAX)) < 0)
|
||||
+ continue;
|
||||
+ name[len] = '\0';
|
||||
+ if (strncmp(name, "/sbin/udevd", 11) == 0)
|
||||
+ continue;
|
||||
+ if (check(name)) {
|
||||
+ add_proc((pid_t)atol(dent->d_name));
|
||||
+ continue;
|
||||
+ goto fuse;
|
||||
+ }
|
||||
+
|
||||
+ *slash = '\0';
|
||||
@ -313,9 +316,10 @@
|
||||
+
|
||||
+ if (found) {
|
||||
+ add_proc((pid_t)atol(dent->d_name));
|
||||
+ continue;
|
||||
+ goto fuse;
|
||||
+ }
|
||||
+
|
||||
+ fuse:
|
||||
+ *(slash+strlen(dent->d_name)) = '\0';
|
||||
+ strcat(slash, "/fd");
|
||||
+
|
||||
@ -324,6 +328,7 @@
|
||||
+ strcat(slash, "/");
|
||||
+ flen = strlen(path);
|
||||
+ while ((dfd = readdir(fdir)) != (struct dirent*)0) {
|
||||
+ boolean isfuse = false;
|
||||
+
|
||||
+ if (*dfd->d_name == '.')
|
||||
+ continue;
|
||||
@ -337,15 +342,39 @@
|
||||
+ continue;
|
||||
+ name[len] = '\0';
|
||||
+
|
||||
+ if (check(name)) {
|
||||
+ found = true;
|
||||
+ if (strcmp("/dev/fuse", name) == 0)
|
||||
+ isfuse = true;
|
||||
+
|
||||
+ if (found) {
|
||||
+ if (isfuse) {
|
||||
+ this = procs;
|
||||
+ last = (proc_t*)0;
|
||||
+
|
||||
+ for (ptr = procs; this; ptr = this) {
|
||||
+ last = ptr->prev;
|
||||
+ this = ptr->next;
|
||||
+ if (ptr == procs) {
|
||||
+ if (this) this->prev = (proc_t*)0;
|
||||
+ procs = this;
|
||||
+ } else if (last) {
|
||||
+ if (this) this->prev = last;
|
||||
+ last->next = this;
|
||||
+ }
|
||||
+ free(ptr);
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ if ((*name == '/') && check(name)) {
|
||||
+ if (isfuse)
|
||||
+ break;
|
||||
+ found = true;
|
||||
+ add_proc((pid_t)atol(dent->d_name));
|
||||
+ }
|
||||
+ }
|
||||
+ (void)closedir(fdir);
|
||||
+
|
||||
+ if (found)
|
||||
+ add_proc((pid_t)atol(dent->d_name));
|
||||
+ }
|
||||
+ (void)closedir(proc);
|
||||
+ clear_mnt();
|
||||
@ -354,7 +383,7 @@
|
||||
+ this = procs;
|
||||
+ last = (proc_t*)0;
|
||||
+ found = false;
|
||||
+ for(ptr = procs; this; ptr = this) {
|
||||
+ for (ptr = procs; this; ptr = this) {
|
||||
+ last = ptr->prev;
|
||||
+ this = ptr->next;
|
||||
+ if (nsig) {
|
||||
@ -370,7 +399,11 @@
|
||||
+ if (num > 0)
|
||||
+ putc('\n', stdout);
|
||||
+
|
||||
+ num = 3000000;
|
||||
+ if (stat("/fastboot", &st) < 0)
|
||||
+ num = 2000000;
|
||||
+ else
|
||||
+ num = 6000000;
|
||||
+
|
||||
+ if (nsig == SIGTERM) while (found) {
|
||||
+
|
||||
+ if ((num <= 0) || !found)
|
||||
@ -381,7 +414,7 @@
|
||||
+ this = procs;
|
||||
+ last = (proc_t*)0;
|
||||
+ found = false;
|
||||
+ for(ptr = procs; this; ptr = this) {
|
||||
+ for (ptr = procs; this; ptr = this) {
|
||||
+ last = ptr->prev;
|
||||
+ this = ptr->next;
|
||||
+
|
||||
@ -401,6 +434,17 @@
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if ((nsig == SIGTERM) && found) {
|
||||
+ this = procs;
|
||||
+ last = (proc_t*)0;
|
||||
+ for (ptr = procs; this; ptr = this) {
|
||||
+ last = ptr->prev;
|
||||
+ this = ptr->next;
|
||||
+
|
||||
+ kill(ptr->pid, SIGKILL);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
|
@ -1,5 +1,5 @@
|
||||
--- makeboot.c
|
||||
+++ makeboot.c 2008-08-13 16:34:52.985916688 +0200
|
||||
+++ makeboot.c 2009-01-27 16:56:43.184201291 +0100
|
||||
@@ -13,6 +13,12 @@
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
@ -13,7 +13,30 @@
|
||||
|
||||
|
||||
int tree_entries = 0;
|
||||
@@ -158,11 +164,28 @@ void parse_makefile(const char *path)
|
||||
@@ -103,6 +109,8 @@ static int check_loop(struct makenode *d
|
||||
fprintf(stderr, "loop exists %s in %s!\n", dep->name, src->name);
|
||||
return 1;
|
||||
}
|
||||
+ if (loop++ > 999)
|
||||
+ return 1;
|
||||
if (check_loop(s->node, src))
|
||||
return 1;
|
||||
}
|
||||
@@ -112,11 +120,13 @@ static int check_loop(struct makenode *d
|
||||
/*
|
||||
* add to the dependecy and selection lists
|
||||
*/
|
||||
+static int loop;
|
||||
static void add_depend(struct makenode *node, const char *dst)
|
||||
{
|
||||
struct makenode *dep;
|
||||
|
||||
dep = add_target(dst);
|
||||
+ loop = 0;
|
||||
if (check_loop(dep, node))
|
||||
return;
|
||||
dep->select = new_list(node, dep->select);
|
||||
@@ -158,11 +168,28 @@ void parse_makefile(const char *path)
|
||||
char *s, *strp, *p;
|
||||
struct makenode *node;
|
||||
|
||||
@ -24,9 +47,10 @@
|
||||
+ if (getuid() == (uid_t)0)
|
||||
+ o_flags |= O_NOATIME;
|
||||
+ if ((fd = open(path, o_flags)) < 0) {
|
||||
+ fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno));
|
||||
+ exit(1);
|
||||
+ }
|
||||
fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
-
|
||||
+ (void)posix_fadvise(fd, 0, 0, POSIX_FADV_WILLNEED);
|
||||
+ (void)posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL);
|
||||
+ (void)posix_fadvise(fd, 0, 0, POSIX_FADV_NOREUSE);
|
||||
@ -36,15 +60,14 @@
|
||||
+ if ((fp = fopen(path, "r")) == NULL)
|
||||
+#endif
|
||||
+ {
|
||||
fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
-
|
||||
+ fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno));
|
||||
+ exit(1);
|
||||
+ }
|
||||
+
|
||||
while (fgets(buf, sizeof(buf), fp)) {
|
||||
for (s = buf; *s && isspace(*s); s++)
|
||||
;
|
||||
@@ -198,6 +221,11 @@ void parse_makefile(const char *path)
|
||||
@@ -198,6 +225,11 @@ void parse_makefile(const char *path)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -56,7 +79,7 @@
|
||||
fclose(fp);
|
||||
|
||||
for (node = tree_list; node; node = node->next) {
|
||||
@@ -234,7 +262,17 @@ static void filter_files(const char *dir
|
||||
@@ -234,7 +266,17 @@ static void filter_files(const char *dir
|
||||
|
||||
filter_prefix = prefix;
|
||||
snprintf(path, sizeof(path), "/etc/init.d/%s.d", dir);
|
||||
@ -74,7 +97,7 @@
|
||||
/* mark all matching nodes */
|
||||
for (i = 0; i < ndirs; i++) {
|
||||
t = lookup_target(dirlist[i]->d_name + 3);
|
||||
@@ -342,6 +380,17 @@ struct makenode *pickup_task(void)
|
||||
@@ -342,6 +384,17 @@ struct makenode *pickup_task(void)
|
||||
}
|
||||
}
|
||||
if (best) {
|
||||
@ -92,7 +115,7 @@
|
||||
blogger("service %s", best->name);
|
||||
best->status = T_RUNNING;
|
||||
}
|
||||
@@ -359,6 +408,17 @@ void finish_task(struct makenode *node)
|
||||
@@ -359,6 +412,17 @@ void finish_task(struct makenode *node)
|
||||
return;
|
||||
for (n = node->select; n; n = n->next)
|
||||
n->node->num_deps--;
|
||||
|
@ -1,13 +1,21 @@
|
||||
--- src/killall5.c
|
||||
+++ src/killall5.c 2008-10-01 18:05:29.829808878 +0200
|
||||
@@ -456,6 +456,39 @@ int readproc()
|
||||
return 0;
|
||||
+++ src/killall5.c 2009-01-27 16:32:40.048701097 +0100
|
||||
@@ -59,6 +59,8 @@ typedef struct proc {
|
||||
pid_t pid; /* Process ID. */
|
||||
int sid; /* Session ID. */
|
||||
char kernel; /* Kernel thread or zombie. */
|
||||
+ char isfuse; /* Provides FUSE filesystems */
|
||||
+ char isudev; /* Is the uevent handler */
|
||||
char nfs; /* Binary is loacted on NFS part. */
|
||||
struct proc *next; /* Pointer to next struct. */
|
||||
} PROC;
|
||||
@@ -283,6 +285,38 @@ int readarg(FILE *fp, char *buf, int sz)
|
||||
}
|
||||
|
||||
+/*
|
||||
/*
|
||||
+ * Scan the filedescriptors of pid for /dev/fuse
|
||||
+ */
|
||||
+int is_fuse(int pid) {
|
||||
+int is_fuse(const char *pid) {
|
||||
+ DIR *dir;
|
||||
+ char path[256];
|
||||
+ char buf[256];
|
||||
@ -15,19 +23,18 @@
|
||||
+ ssize_t len;
|
||||
+
|
||||
+ /* Open /proc/pid/fd/ */
|
||||
+ snprintf(path, sizeof(path), "/proc/%d/fd", pid);
|
||||
+ snprintf(path, sizeof(path), "/proc/%s/fd", pid);
|
||||
+ if ((dir = opendir(path)) != NULL) {
|
||||
+ int dfd = dirfd(dir);
|
||||
+ /* Walk through the directory. */
|
||||
+ while ((d = readdir(dir)) != NULL) {
|
||||
+ if (*d->d_name == '.')
|
||||
+ continue;
|
||||
+ /* check for /dev/fuse */
|
||||
+ snprintf(path, sizeof(path), "/proc/%d/fd/%s", pid, d->d_name);
|
||||
+ if ((len = readlink(path, buf, sizeof(buf))) > 0) {
|
||||
+ if (strncmp("/dev/fuse", buf, len) == 0) {
|
||||
+ /* Fuse filesystem */
|
||||
+ return 1;
|
||||
+ }
|
||||
+ if ((len = readlinkat(dfd, d->d_name, buf, sizeof(buf))) > 0) {
|
||||
+ buf[len] = '\0';
|
||||
+ if (strcmp("/dev/fuse", buf) == 0)
|
||||
+ return 1; /* Fuse filesystem */
|
||||
+ }
|
||||
+ }
|
||||
+ closedir(dir);
|
||||
@ -37,10 +44,32 @@
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
PIDQ_HEAD *init_pid_q(PIDQ_HEAD *q)
|
||||
{
|
||||
q->head = q->next = q->tail = NULL;
|
||||
@@ -779,11 +812,11 @@ int main(int argc, char **argv)
|
||||
+/*
|
||||
* Read the proc filesystem.
|
||||
*/
|
||||
int readproc()
|
||||
@@ -438,13 +472,19 @@ int readproc()
|
||||
|
||||
/* Try to stat the executable. */
|
||||
snprintf(path, sizeof(path), "/proc/%s/exe", d->d_name);
|
||||
- if (check4nfs(path, NULL))
|
||||
+ if (check4nfs(path, buf))
|
||||
p->nfs = 1;
|
||||
if ((p->nfs == 0) && (stat(path, &st) == 0)) {
|
||||
p->dev = st.st_dev;
|
||||
p->ino = st.st_ino;
|
||||
}
|
||||
|
||||
+ /* Check for uevent handler */
|
||||
+ p->isudev = (strncmp(buf, "/sbin/udevd", 11) == 0);
|
||||
+
|
||||
+ /* Check for provider of FUSE filesystems */
|
||||
+ p->isfuse = is_fuse(d->d_name);
|
||||
+
|
||||
/* Link it into the list. */
|
||||
p->next = plist;
|
||||
plist = p;
|
||||
@@ -779,14 +819,16 @@ int main(int argc, char **argv)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@ -50,7 +79,12 @@
|
||||
pid = (int)getpid();
|
||||
for (p = plist; p; p = p->next) {
|
||||
- if (p->pid == 1 || p->pid == pid || p->sid == sid || p->kernel) {
|
||||
+ if (p->pid == 1 || p->pid == pid || p->sid == sid || p->kernel || is_fuse(p->pid)) {
|
||||
+ if (p->pid == 1 || p->pid == pid || p->sid == sid || p->kernel || p->isfuse) {
|
||||
kill(p->pid, SIGCONT);
|
||||
continue;
|
||||
}
|
||||
+ if (((sig == SIGTERM) || (sig == SIGKILL)) && p->isudev)
|
||||
+ continue;
|
||||
kill(p->pid, sig);
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,16 @@
|
||||
-------------------------------------------------------------------
|
||||
Tue Jan 27 16:00:03 CET 2009 - werner@suse.de
|
||||
|
||||
- Do not terminate udevd with mkill(8)
|
||||
- Do not terminate udevd with killall5(8)
|
||||
- Avoid chrashing startpar due recursion caused by loops
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Jan 26 12:02:43 CET 2009 - werner@suse.de
|
||||
|
||||
- Do not kill fuse user space processes with mkill(8) (bnc#466484)
|
||||
- Minimize fuse patch for killall5(8) by using readlinkat(2)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Dec 10 14:27:34 CET 2008 - werner@suse.de
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# spec file for package sysvinit (Version 2.86)
|
||||
#
|
||||
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||
# Copyright (c) 2009 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||
#
|
||||
# All modifications and additions to the file contributed by third parties
|
||||
# remain the property of their copyright owners, unless otherwise agreed
|
||||
@ -30,7 +30,7 @@ Group: System/Base
|
||||
PreReq: coreutils
|
||||
AutoReqProv: on
|
||||
Version: 2.86
|
||||
Release: 189
|
||||
Release: 190
|
||||
Summary: SysV-Style init
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
BuildRequires: libselinux-devel libsepol-devel
|
||||
@ -321,6 +321,13 @@ rm -rf ${RPM_BUILD_ROOT}
|
||||
%doc %{_mandir}/man8/mkill.8.gz
|
||||
|
||||
%changelog
|
||||
* Tue Jan 27 2009 werner@suse.de
|
||||
- Do not terminate udevd with mkill(8)
|
||||
- Do not terminate udevd with killall5(8)
|
||||
- Avoid chrashing startpar due recursion caused by loops
|
||||
* Mon Jan 26 2009 werner@suse.de
|
||||
- Do not kill fuse user space processes with mkill(8) (bnc#466484)
|
||||
- Minimize fuse patch for killall5(8) by using readlinkat(2)
|
||||
* Wed Dec 10 2008 werner@suse.de
|
||||
- Mkill(8): add the option -0 for debugging and wait upto 3 seconds
|
||||
if a signal was send.
|
||||
|
Loading…
Reference in New Issue
Block a user