This commit is contained in:
parent
5c042ce76b
commit
dffb94a35a
@ -114,8 +114,8 @@
|
|||||||
+.SH AUTHOR
|
+.SH AUTHOR
|
||||||
+Werner Fink <werner@suse.de>
|
+Werner Fink <werner@suse.de>
|
||||||
--- mkill.c
|
--- mkill.c
|
||||||
+++ mkill.c 2008-12-12 14:30:48.817075022 +0100
|
+++ mkill.c 2009-01-28 16:36:35.524201270 +0100
|
||||||
@@ -0,0 +1,684 @@
|
@@ -0,0 +1,728 @@
|
||||||
+/*
|
+/*
|
||||||
+ * mkill.c Send a signal to all processes accessing a mount point
|
+ * mkill.c Send a signal to all processes accessing a mount point
|
||||||
+ *
|
+ *
|
||||||
@ -186,6 +186,7 @@
|
|||||||
+ proc_t * this, *ptr, * last;
|
+ proc_t * this, *ptr, * last;
|
||||||
+ struct dirent * dent;
|
+ struct dirent * dent;
|
||||||
+ int num, nsig = SIGTERM;
|
+ int num, nsig = SIGTERM;
|
||||||
|
+ struct stat st;
|
||||||
+ boolean found;
|
+ boolean found;
|
||||||
+ DIR * proc;
|
+ DIR * proc;
|
||||||
+
|
+
|
||||||
@ -261,7 +262,7 @@
|
|||||||
+ name[len] = '\0';
|
+ name[len] = '\0';
|
||||||
+ if (check(name)) {
|
+ if (check(name)) {
|
||||||
+ add_proc((pid_t)atol(dent->d_name));
|
+ add_proc((pid_t)atol(dent->d_name));
|
||||||
+ continue;
|
+ goto fuse;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ *slash = '\0';
|
+ *slash = '\0';
|
||||||
@ -274,7 +275,7 @@
|
|||||||
+ name[len] = '\0';
|
+ name[len] = '\0';
|
||||||
+ if (check(name)) {
|
+ if (check(name)) {
|
||||||
+ add_proc((pid_t)atol(dent->d_name));
|
+ add_proc((pid_t)atol(dent->d_name));
|
||||||
+ continue;
|
+ goto fuse;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ *slash = '\0';
|
+ *slash = '\0';
|
||||||
@ -285,9 +286,11 @@
|
|||||||
+ if ((len = readlink(path, name, PATH_MAX)) < 0)
|
+ if ((len = readlink(path, name, PATH_MAX)) < 0)
|
||||||
+ continue;
|
+ continue;
|
||||||
+ name[len] = '\0';
|
+ name[len] = '\0';
|
||||||
|
+ if (strncmp(name, "/sbin/udevd", 11) == 0)
|
||||||
|
+ continue;
|
||||||
+ if (check(name)) {
|
+ if (check(name)) {
|
||||||
+ add_proc((pid_t)atol(dent->d_name));
|
+ add_proc((pid_t)atol(dent->d_name));
|
||||||
+ continue;
|
+ goto fuse;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ *slash = '\0';
|
+ *slash = '\0';
|
||||||
@ -313,9 +316,10 @@
|
|||||||
+
|
+
|
||||||
+ if (found) {
|
+ if (found) {
|
||||||
+ add_proc((pid_t)atol(dent->d_name));
|
+ add_proc((pid_t)atol(dent->d_name));
|
||||||
+ continue;
|
+ goto fuse;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
|
+ fuse:
|
||||||
+ *(slash+strlen(dent->d_name)) = '\0';
|
+ *(slash+strlen(dent->d_name)) = '\0';
|
||||||
+ strcat(slash, "/fd");
|
+ strcat(slash, "/fd");
|
||||||
+
|
+
|
||||||
@ -324,6 +328,7 @@
|
|||||||
+ strcat(slash, "/");
|
+ strcat(slash, "/");
|
||||||
+ flen = strlen(path);
|
+ flen = strlen(path);
|
||||||
+ while ((dfd = readdir(fdir)) != (struct dirent*)0) {
|
+ while ((dfd = readdir(fdir)) != (struct dirent*)0) {
|
||||||
|
+ boolean isfuse = false;
|
||||||
+
|
+
|
||||||
+ if (*dfd->d_name == '.')
|
+ if (*dfd->d_name == '.')
|
||||||
+ continue;
|
+ continue;
|
||||||
@ -337,15 +342,39 @@
|
|||||||
+ continue;
|
+ continue;
|
||||||
+ name[len] = '\0';
|
+ name[len] = '\0';
|
||||||
+
|
+
|
||||||
+ if (check(name)) {
|
+ if (strcmp("/dev/fuse", name) == 0)
|
||||||
+ found = true;
|
+ 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;
|
+ break;
|
||||||
+ }
|
+ }
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if ((*name == '/') && check(name)) {
|
||||||
|
+ if (isfuse)
|
||||||
|
+ break;
|
||||||
|
+ found = true;
|
||||||
|
+ add_proc((pid_t)atol(dent->d_name));
|
||||||
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+ (void)closedir(fdir);
|
+ (void)closedir(fdir);
|
||||||
+
|
|
||||||
+ if (found)
|
|
||||||
+ add_proc((pid_t)atol(dent->d_name));
|
|
||||||
+ }
|
+ }
|
||||||
+ (void)closedir(proc);
|
+ (void)closedir(proc);
|
||||||
+ clear_mnt();
|
+ clear_mnt();
|
||||||
@ -370,7 +399,11 @@
|
|||||||
+ if (num > 0)
|
+ if (num > 0)
|
||||||
+ putc('\n', stdout);
|
+ putc('\n', stdout);
|
||||||
+
|
+
|
||||||
+ num = 3000000;
|
+ if (stat("/fastboot", &st) < 0)
|
||||||
|
+ num = 2000000;
|
||||||
|
+ else
|
||||||
|
+ num = 6000000;
|
||||||
|
+
|
||||||
+ if (nsig == SIGTERM) while (found) {
|
+ if (nsig == SIGTERM) while (found) {
|
||||||
+
|
+
|
||||||
+ if ((num <= 0) || !found)
|
+ if ((num <= 0) || !found)
|
||||||
@ -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;
|
+ return 0;
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
--- makeboot.c
|
--- 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 @@
|
@@ -13,6 +13,12 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
@ -13,7 +13,30 @@
|
|||||||
|
|
||||||
|
|
||||||
int tree_entries = 0;
|
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;
|
char *s, *strp, *p;
|
||||||
struct makenode *node;
|
struct makenode *node;
|
||||||
|
|
||||||
@ -24,9 +47,10 @@
|
|||||||
+ if (getuid() == (uid_t)0)
|
+ if (getuid() == (uid_t)0)
|
||||||
+ o_flags |= O_NOATIME;
|
+ o_flags |= O_NOATIME;
|
||||||
+ if ((fd = open(path, o_flags)) < 0) {
|
+ if ((fd = open(path, o_flags)) < 0) {
|
||||||
+ fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno));
|
fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno));
|
||||||
+ exit(1);
|
exit(1);
|
||||||
+ }
|
}
|
||||||
|
-
|
||||||
+ (void)posix_fadvise(fd, 0, 0, POSIX_FADV_WILLNEED);
|
+ (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_SEQUENTIAL);
|
||||||
+ (void)posix_fadvise(fd, 0, 0, POSIX_FADV_NOREUSE);
|
+ (void)posix_fadvise(fd, 0, 0, POSIX_FADV_NOREUSE);
|
||||||
@ -36,15 +60,14 @@
|
|||||||
+ if ((fp = fopen(path, "r")) == NULL)
|
+ if ((fp = fopen(path, "r")) == NULL)
|
||||||
+#endif
|
+#endif
|
||||||
+ {
|
+ {
|
||||||
fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno));
|
+ fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno));
|
||||||
exit(1);
|
+ exit(1);
|
||||||
}
|
+ }
|
||||||
-
|
|
||||||
+
|
+
|
||||||
while (fgets(buf, sizeof(buf), fp)) {
|
while (fgets(buf, sizeof(buf), fp)) {
|
||||||
for (s = buf; *s && isspace(*s); s++)
|
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);
|
fclose(fp);
|
||||||
|
|
||||||
for (node = tree_list; node; node = node->next) {
|
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;
|
filter_prefix = prefix;
|
||||||
snprintf(path, sizeof(path), "/etc/init.d/%s.d", dir);
|
snprintf(path, sizeof(path), "/etc/init.d/%s.d", dir);
|
||||||
@ -74,7 +97,7 @@
|
|||||||
/* mark all matching nodes */
|
/* mark all matching nodes */
|
||||||
for (i = 0; i < ndirs; i++) {
|
for (i = 0; i < ndirs; i++) {
|
||||||
t = lookup_target(dirlist[i]->d_name + 3);
|
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) {
|
if (best) {
|
||||||
@ -92,7 +115,7 @@
|
|||||||
blogger("service %s", best->name);
|
blogger("service %s", best->name);
|
||||||
best->status = T_RUNNING;
|
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;
|
return;
|
||||||
for (n = node->select; n; n = n->next)
|
for (n = node->select; n; n = n->next)
|
||||||
n->node->num_deps--;
|
n->node->num_deps--;
|
||||||
|
@ -1,13 +1,21 @@
|
|||||||
--- src/killall5.c
|
--- src/killall5.c
|
||||||
+++ src/killall5.c 2008-10-01 18:05:29.829808878 +0200
|
+++ src/killall5.c 2009-01-27 16:32:40.048701097 +0100
|
||||||
@@ -456,6 +456,39 @@ int readproc()
|
@@ -59,6 +59,8 @@ typedef struct proc {
|
||||||
return 0;
|
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
|
+ * Scan the filedescriptors of pid for /dev/fuse
|
||||||
+ */
|
+ */
|
||||||
+int is_fuse(int pid) {
|
+int is_fuse(const char *pid) {
|
||||||
+ DIR *dir;
|
+ DIR *dir;
|
||||||
+ char path[256];
|
+ char path[256];
|
||||||
+ char buf[256];
|
+ char buf[256];
|
||||||
@ -15,19 +23,18 @@
|
|||||||
+ ssize_t len;
|
+ ssize_t len;
|
||||||
+
|
+
|
||||||
+ /* Open /proc/pid/fd/ */
|
+ /* 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) {
|
+ if ((dir = opendir(path)) != NULL) {
|
||||||
|
+ int dfd = dirfd(dir);
|
||||||
+ /* Walk through the directory. */
|
+ /* Walk through the directory. */
|
||||||
+ while ((d = readdir(dir)) != NULL) {
|
+ while ((d = readdir(dir)) != NULL) {
|
||||||
+ if (*d->d_name == '.')
|
+ if (*d->d_name == '.')
|
||||||
+ continue;
|
+ continue;
|
||||||
+ /* check for /dev/fuse */
|
+ /* check for /dev/fuse */
|
||||||
+ snprintf(path, sizeof(path), "/proc/%d/fd/%s", pid, d->d_name);
|
+ if ((len = readlinkat(dfd, d->d_name, buf, sizeof(buf))) > 0) {
|
||||||
+ if ((len = readlink(path, buf, sizeof(buf))) > 0) {
|
+ buf[len] = '\0';
|
||||||
+ if (strncmp("/dev/fuse", buf, len) == 0) {
|
+ if (strcmp("/dev/fuse", buf) == 0)
|
||||||
+ /* Fuse filesystem */
|
+ return 1; /* Fuse filesystem */
|
||||||
+ return 1;
|
|
||||||
+ }
|
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+ closedir(dir);
|
+ closedir(dir);
|
||||||
@ -37,10 +44,32 @@
|
|||||||
+ return 0;
|
+ return 0;
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
PIDQ_HEAD *init_pid_q(PIDQ_HEAD *q)
|
+/*
|
||||||
{
|
* Read the proc filesystem.
|
||||||
q->head = q->next = q->tail = NULL;
|
*/
|
||||||
@@ -779,11 +812,11 @@ int main(int argc, char **argv)
|
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);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,7 +79,12 @@
|
|||||||
pid = (int)getpid();
|
pid = (int)getpid();
|
||||||
for (p = plist; p; p = p->next) {
|
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) {
|
||||||
+ 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);
|
kill(p->pid, SIGCONT);
|
||||||
continue;
|
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
|
Wed Dec 10 14:27:34 CET 2008 - werner@suse.de
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# spec file for package sysvinit (Version 2.86)
|
# 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
|
# All modifications and additions to the file contributed by third parties
|
||||||
# remain the property of their copyright owners, unless otherwise agreed
|
# remain the property of their copyright owners, unless otherwise agreed
|
||||||
@ -30,7 +30,7 @@ Group: System/Base
|
|||||||
PreReq: coreutils
|
PreReq: coreutils
|
||||||
AutoReqProv: on
|
AutoReqProv: on
|
||||||
Version: 2.86
|
Version: 2.86
|
||||||
Release: 189
|
Release: 190
|
||||||
Summary: SysV-Style init
|
Summary: SysV-Style init
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
BuildRequires: libselinux-devel libsepol-devel
|
BuildRequires: libselinux-devel libsepol-devel
|
||||||
@ -321,6 +321,13 @@ rm -rf ${RPM_BUILD_ROOT}
|
|||||||
%doc %{_mandir}/man8/mkill.8.gz
|
%doc %{_mandir}/man8/mkill.8.gz
|
||||||
|
|
||||||
%changelog
|
%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
|
* Wed Dec 10 2008 werner@suse.de
|
||||||
- Mkill(8): add the option -0 for debugging and wait upto 3 seconds
|
- Mkill(8): add the option -0 for debugging and wait upto 3 seconds
|
||||||
if a signal was send.
|
if a signal was send.
|
||||||
|
Loading…
Reference in New Issue
Block a user