diff options
Diffstat (limited to 'busybox/busybox-1.00-rc1/busybox-1.00-pre10-fuser.patch')
-rw-r--r-- | busybox/busybox-1.00-rc1/busybox-1.00-pre10-fuser.patch | 649 |
1 files changed, 0 insertions, 649 deletions
diff --git a/busybox/busybox-1.00-rc1/busybox-1.00-pre10-fuser.patch b/busybox/busybox-1.00-rc1/busybox-1.00-pre10-fuser.patch deleted file mode 100644 index 3bae1a8458..0000000000 --- a/busybox/busybox-1.00-rc1/busybox-1.00-pre10-fuser.patch +++ /dev/null @@ -1,649 +0,0 @@ -diff -urN busybox-1.00-pre10.orig/include/applets.h busybox-1.00-pre10/include/applets.h ---- busybox-1.00-pre10.orig/include/applets.h 2004-04-06 11:59:43.000000000 -0500 -+++ busybox-1.00-pre10/include/applets.h 2004-04-13 12:46:08.000000000 -0500 -@@ -223,6 +223,9 @@ - #ifdef CONFIG_FTPPUT - APPLET(ftpput, ftpgetput_main, _BB_DIR_USR_BIN, _BB_SUID_NEVER) - #endif -+#ifdef CONFIG_FUSER -+ APPLET(fuser, fuser_main, _BB_DIR_USR_BIN, _BB_SUID_NEVER) -+#endif - #ifdef CONFIG_GETOPT - APPLET(getopt, getopt_main, _BB_DIR_BIN, _BB_SUID_NEVER) - #endif -@@ -355,6 +358,9 @@ - #ifdef CONFIG_LS - APPLET(ls, ls_main, _BB_DIR_BIN, _BB_SUID_NEVER) - #endif -+#ifdef CONFIG_FEATURE_FUSER_LSOF -+ APPLET(lsof, lsof_main, _BB_DIR_USR_BIN, _BB_SUID_NEVER) -+#endif - #ifdef CONFIG_LSMOD - APPLET(lsmod, lsmod_main, _BB_DIR_SBIN, _BB_SUID_NEVER) - #endif -diff -urN busybox-1.00-pre10.orig/include/usage.h busybox-1.00-pre10/include/usage.h ---- busybox-1.00-pre10.orig/include/usage.h 2004-04-06 12:52:02.000000000 -0500 -+++ busybox-1.00-pre10/include/usage.h 2004-04-13 16:10:45.000000000 -0500 -@@ -729,6 +729,17 @@ - "\t-p, --password Password to be used\n" \ - "\t-P, --port Port number to be used" - -+#define fuser_trivial_usage \ -+ "[options] file OR port/proto" -+#define fuser_full_usage \ -+ "Options:\n" \ -+ "\t-m Show all processes on the same mounted fs\n" \ -+ "\t-k Kill all processes that match.\n" \ -+ "\t-s Don't print or kill anything.\n" \ -+ "\t-4 When using port/proto only search IPv4 space\n" \ -+ "\t-6 When using port/proto only search IPv6 space\n" \ -+ "\t-SIGNAL When used with -k, this signal will be used to kill\n" -+ - #define getopt_trivial_usage \ - "[OPTIONS]..." - #define getopt_full_usage \ -@@ -1536,6 +1547,13 @@ - USAGE_SELINUX("\t-k\tprint security context\n") \ - USAGE_SELINUX("\t-K\tprint security context in long format\n") - -+#define lsof_trivial_usage \ -+ "[filelist]" -+#define lsof_full_usage \ -+ "List open files with associated process information.\n" \ -+ "Specify a filename or list of filenames to only see information\n " \ -+ "about those files." -+ - #define lsmod_trivial_usage \ - "" - #define lsmod_full_usage \ -diff -urN busybox-1.00-pre10.orig/procps/Config.in busybox-1.00-pre10/procps/Config.in ---- busybox-1.00-pre10.orig/procps/Config.in 2003-12-24 00:02:11.000000000 -0600 -+++ busybox-1.00-pre10/procps/Config.in 2004-04-13 16:13:25.000000000 -0500 -@@ -13,6 +13,24 @@ - memory in the system, as well as the buffers used by the kernel. - The shared memory column should be ignored; it is obsolete. - -+config CONFIG_FUSER -+ bool "fuser" -+ default n -+ help -+ fuser lists all PIDs (Process IDs) that currently have a given -+ file open. fuser can also list all PIDs that have a given network -+ (TCP or UDP) port open. -+ -+config CONFIG_FEATURE_FUSER_LSOF -+ bool " lsof" -+ default n -+ depends on CONFIG_FUSER -+ help -+ lsof shows open files with associated process information. If -+ invoked without any parameters it lists ALL open file handles -+ on the system. It also accepts a filename or list of filenames as -+ input to narrow the output to only those files. -+ - config CONFIG_KILL - bool "kill" - default n -@@ -78,5 +96,6 @@ - help - sysctl - configure kernel parameters at runtime - -+ - endmenu - -diff -urN busybox-1.00-pre10.orig/procps/Makefile.in busybox-1.00-pre10/procps/Makefile.in ---- busybox-1.00-pre10.orig/procps/Makefile.in 2004-03-15 02:29:03.000000000 -0600 -+++ busybox-1.00-pre10/procps/Makefile.in 2004-04-13 11:36:54.000000000 -0500 -@@ -31,6 +31,7 @@ - PROCPS-$(CONFIG_SYSCTL) += sysctl.o - PROCPS-$(CONFIG_TOP) += top.o - PROCPS-$(CONFIG_UPTIME) += uptime.o -+PROCPS-$(CONFIG_FUSER) += fuser.o - - libraries-y+=$(PROCPS_DIR)$(PROCPS_AR) - -diff -urN busybox-1.00-pre10.orig/procps/fuser.c busybox-1.00-pre10/procps/fuser.c ---- busybox-1.00-pre10.orig/procps/fuser.c 1969-12-31 18:00:00.000000000 -0600 -+++ busybox-1.00-pre10/procps/fuser.c 2004-04-13 16:03:56.000000000 -0500 -@@ -0,0 +1,541 @@ -+/* -+ * tiny fuser implementation -+ * -+ * Copyright 2004 Tony J. White -+ * -+ * May be distributed under the conditions of the -+ * GNU Library General Public License -+ */ -+ -+/* this define is needed for asprintf() */ -+#ifndef _GNU_SOURCE -+#define _GNU_SOURCE -+#endif -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <unistd.h> -+#include <string.h> -+#include <limits.h> -+#include <dirent.h> -+#include <signal.h> -+#include <sys/types.h> -+#include <sys/ioctl.h> -+#include <sys/stat.h> -+#include <sys/socket.h> -+#include "busybox.h" -+ -+#define FUSER_PROC_DIR "/proc" -+#define FUSER_MAX_LINE 255 -+ -+#define FUSER_OPT_MOUNT 1 -+#define FUSER_OPT_KILL 2 -+#define FUSER_OPT_SILENT 4 -+#define FUSER_OPT_IP6 8 -+#define FUSER_OPT_IP4 16 -+#define FUSER_OPT_SHOWALL 32 -+ -+typedef struct inode_list { -+ ino_t inode; -+ dev_t dev; -+ struct inode_list *next; -+} inode_list; -+ -+typedef struct pid_list { -+ pid_t pid; -+ ino_t inode; -+ dev_t dev; -+ char *filename; -+ struct pid_list *next; -+} pid_list; -+ -+static int fuser_option(char *option) -+{ -+ int opt = 0; -+ -+ if(!(strlen(option))) return 0; -+ if(option[0] != '-') return 0; -+ *++option; -+ while(*option != '\0') { -+ if(*option == 'm') opt |= FUSER_OPT_MOUNT; -+ else if(*option == 'k') opt |= FUSER_OPT_KILL; -+ else if(*option == 's') opt |= FUSER_OPT_SILENT; -+ else if(*option == '6') opt |= FUSER_OPT_IP6; -+ else if(*option == '4') opt |= FUSER_OPT_IP4; -+ else { -+ bb_error_msg_and_die( -+ "Unsupported option '%c'", *option); -+ } -+ *++option; -+ } -+ return opt; -+} -+ -+static int fuser_file_to_dev_inode(const char *filename, -+ dev_t *dev, ino_t *inode) -+{ -+ struct stat f_stat; -+ if((stat(filename, &f_stat)) < 0) return 0; -+ memcpy(inode, &f_stat.st_ino, sizeof(ino_t)); -+ memcpy(dev, &f_stat.st_dev, sizeof(dev_t)); -+ return 1; -+} -+ -+static int fuser_find_socket_dev(dev_t *dev) { -+ int fd = socket(PF_INET, SOCK_DGRAM,0); -+ struct stat buf; -+ -+ if (fd >= 0 && (fstat(fd, &buf)) == 0) { -+ memcpy(dev, &buf.st_dev, sizeof(dev_t)); -+ close(fd); -+ return 1; -+ } -+ return 0; -+} -+ -+static int fuser_parse_net_arg(const char *filename, -+ const char **proto, int *port) -+{ -+ int tport; -+ char path[PATH_MAX+1], tproto[5]; -+ -+ if((sscanf(filename, "%d/%4s", &tport, &tproto[0])) != 2) return 0; -+ strncpy(path, FUSER_PROC_DIR, sizeof(FUSER_PROC_DIR)); -+ strncat(path, "/net/", 5); -+ strncat(path, tproto, strlen(tproto)); -+ if((access(path, R_OK)) != 0) return 0; -+ *proto = bb_xstrndup(tproto, strlen(tproto)); -+ memcpy(port, &tport, sizeof(int)); -+ return 1; -+} -+ -+static int fuser_add_pid(pid_list *plist, pid_t pid, -+ dev_t dev, ino_t inode, const char *filename) -+{ -+ pid_list *curr = NULL, *last = NULL; -+ -+ if(plist->pid == 0) { -+ plist->pid = pid; -+ plist->dev = dev; -+ plist->inode = inode; -+ plist->filename = bb_xstrndup(filename, strlen(filename)); -+ return 1; -+ } -+ curr = plist; -+ while(curr != NULL) { -+ if(curr->pid == pid && curr->dev == dev && curr->inode == inode) -+ return 1; -+ last = curr; -+ curr = curr->next; -+ } -+ curr = xmalloc(sizeof(pid_list)); -+ last->next = curr; -+ curr->pid = pid; -+ curr->dev = dev; -+ curr->inode = inode; -+ curr->filename = bb_xstrndup(filename, strlen(filename)); -+ curr->next = NULL; -+ return 1; -+} -+ -+static int fuser_add_inode(inode_list *ilist, dev_t dev, ino_t inode) -+{ -+ inode_list *curr = NULL, *last = NULL; -+ -+ if(!ilist->inode && !ilist->dev) { -+ ilist->dev = dev; -+ ilist->inode = inode; -+ } -+ curr = ilist; -+ while(curr != NULL) { -+ if(curr->inode == inode && curr->dev == dev) return 1; -+ last = curr; -+ curr = curr->next; -+ } -+ curr = xmalloc(sizeof(inode_list)); -+ last->next = curr; -+ curr->dev = dev; -+ curr->inode = inode; -+ curr->next = NULL; -+ return 1; -+} -+ -+static int fuser_clear_pid_list(pid_list *plist) -+{ -+ pid_list *curr, *next; -+ curr = next = plist->next; -+ while(curr != NULL) { -+ next = curr->next; -+ free(curr); -+ curr = next; -+ } -+ plist->pid = 0; -+ plist->next = NULL; -+ return 1; -+} -+ -+static int fuser_clear_inode_list(inode_list *ilist) -+{ -+ inode_list *curr, *next; -+ curr = next = ilist->next; -+ while(curr != NULL) { -+ next = curr->next; -+ free(curr); -+ curr = next; -+ } -+ ilist->dev = 0; -+ ilist->inode = 0; -+ ilist->next = NULL; -+ return 1; -+} -+ -+ -+static int fuser_scan_proc_net(int opts, const char *proto, -+ int port, inode_list *ilist) -+{ -+ char path[PATH_MAX+1], line[FUSER_MAX_LINE+1]; -+ char addr[128]; -+ ino_t tmp_inode; -+ dev_t tmp_dev; -+ int tmp_port; -+ FILE *f; -+ -+ if(!fuser_find_socket_dev(&tmp_dev)) tmp_dev = 0; -+ -+ strncpy(path, FUSER_PROC_DIR, sizeof(FUSER_PROC_DIR)); -+ strncat(path, "/net/", 5); -+ strncat(path, proto, strlen(proto)); -+ -+ if (!(f = fopen(path, "r"))) return 0; -+ while(fgets(line, FUSER_MAX_LINE, f)) { -+ if(sscanf(line, -+ "%*d: %64[0-9A-Fa-f]:%x %*x:%*x %*x %*x:%*x " -+ "%*x:%*x %*x %*d %*d %lu", -+ &addr[0], &tmp_port, &tmp_inode) == 3) { -+ if((strlen(addr) == 8) && -+ (opts & FUSER_OPT_IP6)) continue; -+ else if((strlen(addr) > 8) && -+ (opts & FUSER_OPT_IP4)) continue; -+ if(tmp_port == port) { -+ fuser_add_inode(ilist, tmp_dev, tmp_inode); -+ } -+ } -+ -+ } -+ fclose(f); -+ return 1; -+} -+ -+static int fuser_search_dev_inode(int opts, inode_list *ilist, -+ dev_t dev, ino_t inode) -+{ -+ inode_list *curr; -+ curr = ilist; -+ -+ while(curr) { -+ if((opts & FUSER_OPT_MOUNT) && curr->dev == dev) -+ return 1; -+ if(curr->inode == inode && curr->dev == dev) -+ return 1; -+ curr = curr->next; -+ } -+ return 0; -+} -+ -+static int fuser_scan_pid_maps(int opts, const char *fname, pid_t pid, -+ inode_list *ilist, pid_list *plist) -+{ -+ FILE *file; -+ char line[FUSER_MAX_LINE + 1]; -+ int major, minor; -+ ino_t inode; -+ dev_t dev; -+ char filename[FUSER_MAX_LINE]; -+ -+ if (!(file = fopen(fname, "r"))) return 0; -+ while (fgets(line, FUSER_MAX_LINE, file)) { -+ if(sscanf(line, "%*s %*s %*s %x:%x %ld%*[ \t]%s", -+ &major, &minor, &inode, &filename[0]) < 3) continue; -+ if(major == 0 && minor == 0 && inode == 0) continue; -+ dev = makedev(major, minor); -+ if((opts & FUSER_OPT_SHOWALL) -+ || fuser_search_dev_inode(opts, ilist, dev, inode)) { -+ fuser_add_pid(plist, pid, dev, inode, filename); -+ } -+ } -+ fclose(file); -+ return 1; -+} -+ -+static int fuser_scan_link(int opts, const char *lname, pid_t pid, -+ inode_list *ilist, pid_list *plist) -+{ -+ ino_t inode; -+ dev_t dev; -+ -+ if(!fuser_file_to_dev_inode(lname, &dev, &inode)) return 0; -+ -+ if((opts & FUSER_OPT_SHOWALL) -+ || fuser_search_dev_inode(opts, ilist, dev, inode)) -+ fuser_add_pid(plist, pid, dev, inode, xreadlink(lname)); -+ return 1; -+} -+ -+static int fuser_scan_dir_links(int opts, const char *dname, pid_t pid, -+ inode_list *ilist, pid_list *plist) -+{ -+ DIR *d; -+ struct dirent *de; -+ char *lname; -+ -+ if((d = opendir(dname))) { -+ while((de = readdir(d)) != NULL) { -+ if(!(strcmp(de->d_name, "."))) continue; -+ if(!(strcmp(de->d_name, ".."))) continue; -+ if(asprintf(&lname, "%s/%s", dname, de->d_name) < 0) { -+ free(lname); -+ continue; -+ } -+ fuser_scan_link(opts, lname, pid, ilist, plist); -+ free(lname); -+ } -+ closedir(d); -+ } -+ else return 0; -+ return 1; -+ -+} -+ -+static int fuser_scan_proc_pids(int opts, inode_list *ilist, pid_list *plist) -+{ -+ struct dirent **de; -+ pid_t pid; -+ char *dname; -+ int n = 0, i = 0; -+ -+ n = scandir(FUSER_PROC_DIR, &de, 0, versionsort); -+ if(n < 0) -+ bb_perror_msg_and_die("could not open procfs dir %s", -+ FUSER_PROC_DIR); -+ for(i=0; i<n; i++) { -+ pid = (pid_t)atoi(de[i]->d_name); -+ if(!pid) continue; -+ if(asprintf(&dname, "%s/%d/", FUSER_PROC_DIR, pid) < 0) { -+ free(dname); -+ continue; -+ } -+ if(chdir(dname) < 0) { -+ free(dname); -+ continue; -+ } -+ free(dname); -+ fuser_scan_link(opts, "cwd", pid, ilist, plist); -+ fuser_scan_link(opts, "exe", pid, ilist, plist); -+ fuser_scan_link(opts, "root", pid, ilist, plist); -+ fuser_scan_dir_links(opts, "fd", pid, ilist, plist); -+ fuser_scan_dir_links(opts, "lib", pid, ilist, plist); -+ fuser_scan_dir_links(opts, "mmap", pid, ilist, plist); -+ fuser_scan_pid_maps(opts, "maps", pid, ilist, plist); -+ } -+ return 1; -+} -+ -+static int fuser_print_pid_list(pid_list *plist) { -+ pid_list *curr; -+ curr = plist; -+ -+ if(plist == NULL) return 0; -+ while(curr != NULL) { -+ if(curr->pid > 0) printf("%d ", curr->pid); -+ curr = curr->next; -+ } -+ printf("\n"); -+ return 1; -+} -+ -+static int fuser_kill_pid_list(pid_list *plist, int sig) { -+ pid_list *curr; -+ curr = plist; -+ pid_t mypid = getpid(); -+ int success = 1; -+ -+ if(plist == NULL) return 0; -+ while(curr != NULL) { -+ if(curr->pid > 0 && curr->pid != mypid) { -+ if (kill(curr->pid, sig) != 0) { -+ bb_perror_msg( -+ "Could not kill pid '%d'", curr->pid); -+ success = 0; -+ } -+ } -+ curr = curr->next; -+ } -+ return success; -+} -+ -+extern int fuser_main(int argc, char **argv) { -+ int port, i, optn; -+ int* fni; /* file name indexes of argv */ -+ int fnic = 0; /* file name index count */ -+ const char *proto; -+ static int opt = 0; /* FUSER_OPT_ */ -+ dev_t dev; -+ ino_t inode; -+ pid_list *pids; -+ inode_list *inodes; -+ int killsig = SIGTERM; -+ int success = 1; -+ -+ fni = xmalloc(sizeof(int)); -+ for(i=1;i<argc;i++) { -+ optn = fuser_option(argv[i]); -+ if(optn) opt |= optn; -+ else if(argv[i][0] == '-') { -+ if(!(u_signal_names(argv[i]+1, &killsig, 0))) -+ killsig = SIGTERM; -+ } -+ else { -+ fni = xrealloc(fni, sizeof(int) * (fnic+2)); -+ fni[fnic++] = i; -+ } -+ } -+ if(!fnic) return 1; -+ pids = xmalloc(sizeof(pid_list)); -+ inodes = xmalloc(sizeof(inode_list)); -+ for(i=0;i<fnic;i++) { -+ if(fuser_parse_net_arg(argv[fni[i]], &proto, &port)) { -+ fuser_scan_proc_net(opt, proto, port, inodes); -+ } -+ else { -+ if(!fuser_file_to_dev_inode( -+ argv[fni[i]], &dev, &inode)) { -+ bb_perror_msg_and_die( -+ "Could not open '%s'", argv[fni[i]]); -+ } -+ fuser_add_inode(inodes, dev, inode); -+ } -+ success = fuser_scan_proc_pids(opt, inodes, pids); -+ /* if the first pid in the list is 0, none have been found */ -+ if(pids->pid == 0) success = 0; -+ if(!success) break; -+ if(opt & FUSER_OPT_KILL) { -+ success = fuser_kill_pid_list(pids, killsig); -+ } -+ else if(!(opt & FUSER_OPT_SILENT)) { -+ printf("%s: ", argv[fni[i]]); -+ success = fuser_print_pid_list(pids); -+ } -+ fuser_clear_pid_list(pids); -+ fuser_clear_inode_list(inodes); -+ } -+ /* return 0 on (success == 1) 1 otherwise */ -+ return (success != 1); -+} -+ -+#ifdef CONFIG_FEATURE_FUSER_LSOF -+ -+static int lsof_option(char *option) -+{ -+ if(!(strlen(option))) return 0; -+ if(option[0] != '-') return 0; -+ /* see fuser_option() for an example on how to add options -+ currently none are supported */ -+ bb_error_msg_and_die("Unsupported option '%c'", *option); -+ return 0; -+} -+ -+static int lsof_print_pid_list(pid_list *plist) { -+ pid_list *curr; -+ procps_status_t *ps, *ps_tmp; -+ int nps = 0, n = 0; -+ char *devstr; -+ -+ curr = plist; -+ if(plist == NULL) return 0; -+ ps = xmalloc(sizeof(procps_status_t)); -+#ifdef CONFIG_SELINUX -+ while ((ps_tmp = procps_scan(0, 0, NULL) ) != 0) { -+#else -+ while ((ps_tmp = procps_scan(0)) != 0) { -+#endif -+ n = nps; -+ ps = xrealloc(ps, (++nps)*sizeof(procps_status_t)); -+ memcpy(ps + n, ps_tmp, sizeof(procps_status_t)); -+ } -+ -+ if(curr != NULL) { -+ printf("COMMAND PID USER DEVICE NODE NAME\n"); -+ } -+ while(curr != NULL) { -+ if(curr->pid > 0) { -+ for(n = 0; n < nps; n++) { -+ ps_tmp = ps + n; -+ if(ps_tmp->pid == curr->pid) { -+ printf("%-9.9s ", ps_tmp->short_cmd); -+ printf("%6d ", curr->pid); -+ printf("%7.7s ", ps_tmp->user); -+ } -+ } -+ asprintf(&devstr, "%d,%d", -+ major(curr->dev), minor(curr->dev)); -+ printf("%6.6s", devstr); -+ free(devstr); -+ printf("%10ld ", curr->inode); -+ printf("%s\n", curr->filename); -+ } -+ curr = curr->next; -+ } -+ printf("\n"); -+ return 1; -+} -+ -+extern int lsof_main(int argc, char **argv) { -+ int i, optn; -+ int* fni; /* file name indexes of argv */ -+ int fnic = 0; /* file name index count */ -+ static int opt = 0; /* FUSER_OPT_ */ -+ dev_t dev; -+ ino_t inode; -+ pid_list *pids; -+ inode_list *inodes; -+ int success = 1; -+ -+ fni = xmalloc(sizeof(int)); -+ for(i=1;i<argc;i++) { -+ optn = lsof_option(argv[i]); -+ if(optn) opt |= optn; -+ else { -+ fni = xrealloc(fni, sizeof(int) * (fnic+2)); -+ fni[fnic++] = i; -+ } -+ } -+ pids = xmalloc(sizeof(pid_list)); -+ inodes = xmalloc(sizeof(inode_list)); -+ if(!fnic) { -+ opt |= FUSER_OPT_SHOWALL; -+ success = fuser_scan_proc_pids(opt, inodes, pids); -+ if(success) { -+ success = lsof_print_pid_list(pids); -+ fuser_clear_pid_list(pids); -+ } -+ } -+ else { -+ for(i=0;i<fnic;i++) { -+ if(!fuser_file_to_dev_inode( -+ argv[fni[i]], &dev, &inode)) { -+ bb_perror_msg_and_die( -+ "Could not open '%s'", argv[fni[i]]); -+ } -+ fuser_add_inode(inodes, dev, inode); -+ success = fuser_scan_proc_pids(opt, inodes, pids); -+ if(pids->pid == 0) success = 0; -+ if(!success) break; -+ success = lsof_print_pid_list(pids); -+ fuser_clear_pid_list(pids); -+ fuser_clear_inode_list(inodes); -+ } -+ } -+ /* return 0 on (success == 1) 1 otherwise */ -+ return (success != 1); -+} -+#endif /* CONFIG_FEATURE_FUSER_LSOF */ |