diff options
-rw-r--r-- | procps/fuser.c | 44 |
1 files changed, 15 insertions, 29 deletions
diff --git a/procps/fuser.c b/procps/fuser.c index 7465d4554..85523c31c 100644 --- a/procps/fuser.c +++ b/procps/fuser.c @@ -40,31 +40,6 @@ struct globals { #define INIT_G() do { } while (0) -static dev_t find_socket_dev(void) -{ - int fd = socket(AF_INET, SOCK_DGRAM, 0); - if (fd >= 0) { - struct stat buf; - int r = fstat(fd, &buf); - close(fd); - if (r == 0) - return buf.st_dev; - } - return 0; -} - -static char *parse_net_arg(const char *arg, unsigned *port) -{ - char path[20], tproto[5]; - - if (sscanf(arg, "%u/%4s", port, tproto) != 2) - return NULL; - sprintf(path, "/proc/net/%s", tproto); - if (access(path, R_OK) != 0) - return NULL; - return xstrdup(path); -} - static void add_pid(const pid_t pid) { pid_list **curr = &G.pid_list_head; @@ -104,8 +79,15 @@ static void scan_proc_net(const char *path, unsigned port) unsigned tmp_port; FILE *f; struct stat st; + int fd; - st.st_dev = find_socket_dev(); + /* find socket dev */ + st.st_dev = 0; + fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd >= 0) { + fstat(fd, &st); + close(fd); + } f = fopen_for_read(path); if (!f) @@ -284,11 +266,15 @@ Find processes which use FILEs or PORTs pp = argv; while (*pp) { - char *path = parse_net_arg(*pp, &port); - if (path) { /* PORT/PROTO */ + /* parse net arg */ + char path[20], tproto[5]; + if (sscanf(*pp, "%u/%4s", &port, tproto) != 2) + goto file; + sprintf(path, "/proc/net/%s", tproto); + if (access(path, R_OK) != 0) { /* PORT/PROTO */ scan_proc_net(path, port); - free(path); } else { /* FILE */ + file: xstat(*pp, &st); add_inode(&st); } |