From: Craig Small Date: Wed, 28 Apr 2004 05:17:31 +0000 (+0000) Subject: posix -m option and output changes for fuser X-Git-Tag: v22.11~158 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8e982fd2ad3cefc979638e06e019c733b10fc942;p=psmisc posix -m option and output changes for fuser --- diff --git a/ChangeLog b/ChangeLog index 5833b16..5213954 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,10 @@ not-yet-released * inode and devices use ino_t and dev_t SF#: * Allow pstree to use ASCII characters with -A flag, patch by Branden Robinson Debian: #240973 + * Debug "here" statement removed + * POSIX -m option added, part of SF Bug: #901841 + * fuser sends PIDs only to stdout, the rest goes to stderr. + Changed for POSIX compatibility 2004-04-05 gettextize diff --git a/doc/fuser.1 b/doc/fuser.1 index 8e52f89..11357f5 100644 --- a/doc/fuser.1 +++ b/doc/fuser.1 @@ -4,7 +4,7 @@ fuser \- identify processes using files or sockets .SH SYNOPSIS .ad l .B fuser -.RB [ \-a | \-s ] +.RB [ \-a | \-s | \-c ] .RB [ \-4 | \-6 ] .RB [ \-n\ \fIspace ] .RB [ \-\fIsignal\fB ] @@ -50,10 +50,14 @@ are optional, but commas in front of missing fields must be present: Either symbolic or numeric values can be used for IP addresses and port numbers. +.PP +\fBfuser\fP outputs only the PIDs to stdout, everything else is sent to stderr. .SH OPTIONS .IP \fB\-a\fP Show all files specified on the command line. By default, only files that are accessed by at least one process are shown. +.IP \fB\-c\fP +Same as \-m option, used for POSIX compatibility. .IP \fB\-k\fP Kill processes accessing the file. Unless changed with \fB-\fP\fIsignal\fP, SIGKILL is sent. An \fBfuser\fP process never kills itself, but may kill diff --git a/src/fuser.c b/src/fuser.c index 8e165d6..28f6eae 100644 --- a/src/fuser.c +++ b/src/fuser.c @@ -210,7 +210,6 @@ parse_net_file (SPACE_DSC * dsc,char *filename, NET_CACHE **lastptr,int version &((struct sockaddr_in6 *)&new->rmt_addr)->sin6_addr.s6_addr32[2], &((struct sockaddr_in6 *)&new->rmt_addr)->sin6_addr.s6_addr32[3]); inet_ntop(AF_INET6, &((struct sockaddr_in6 *)&new->rmt_addr)->sin6_addr, addr6, sizeof(addr6)); - /*printf("address %s\n", addr6);*/ } else { sscanf(rmt_addr, "%X", &((struct sockaddr_in *) &new->rmt_addr)->sin_addr.s_addr); @@ -670,31 +669,31 @@ show_files_or_kill (void) { if (header && (file->flags & FLAG_VERB)) { - printf ("\n%*s USER PID ACCESS COMMAND\n", NAME_FIELD, ""); + fprintf (stderr, "\n%*s USER PID ACCESS COMMAND\n", NAME_FIELD, ""); header = 0; } length = 0; for (scan = file->name; scan && *scan; scan++) if (*scan == '\\') - length += printf ("\\\\"); + length += fprintf (stderr, "\\\\"); else if (*scan > ' ' && *scan <= '~') { - putchar (*scan); + putc(*scan,stderr); length++; } else - length += printf ("\\%03o", *scan); + length += fprintf (stderr, "\\%03o", *scan); if (file->name_space) - length += printf ("/%s", file->name_space->name); + length += fprintf (stderr, "/%s", file->name_space->name); if (length > 0) last_namelen=length; else - printf("\n%*.*s",last_namelen,last_namelen," "); + fprintf(stderr, "\n%*.*s",last_namelen,last_namelen," "); if (!(file->flags & FLAG_VERB)) { - putchar (':'); + putc (':',stderr); length++; } @@ -708,27 +707,28 @@ show_files_or_kill (void) if ((first==1) && (item->u.proc.ref_set & (REF_FILE|REF_ROOT|REF_CWD|REF_EXE|REF_MMAP))) { while (length < NAME_FIELD) { - putchar (' '); + putc(' ',stderr); length++; } } - if (item->u.proc.ref_set & REF_FILE) - printf ("%6d", item->u.proc.pid); + printf ("%6d", item->u.proc.pid); + fflush(stdout); + /* if (item->u.proc.ref_set & REF_FILE)*/ if (item->u.proc.ref_set & REF_ROOT) - printf ("%6dr", item->u.proc.pid); + putc ('r', stderr); if (item->u.proc.ref_set & REF_CWD) - printf ("%6dc", item->u.proc.pid); + putc ('c', stderr); if (item->u.proc.ref_set & REF_EXE) - printf ("%6de", item->u.proc.pid); + putc ('e', stderr); else if (item->u.proc.ref_set & REF_MMAP) - printf ("%6dm", item->u.proc.pid); + putc ('m', stderr); if ((file->flags & FLAG_UID) && item->u.proc.uid != UID_UNKNOWN) { if ((pw = getpwuid (item->u.proc.uid)) != NULL) { - printf ("(%s)", pw->pw_name); + fprintf (stderr, "(%s)", pw->pw_name); } else { - printf ("(%d)", item->u.proc.uid); + fprintf (stderr, "(%d)", item->u.proc.uid); } } first = 0; @@ -773,20 +773,22 @@ show_files_or_kill (void) user = tmp; } if (!first) - printf ("%*s", NAME_FIELD, ""); + fprintf (stderr, "%*s", NAME_FIELD, ""); else if (length > NAME_FIELD) - printf ("\n%*s", NAME_FIELD, ""); + fprintf (stderr, "\n%*s", NAME_FIELD, ""); else while (length < NAME_FIELD) { - putchar (' '); + putc(' ', stderr); length++; } - printf (" %-8s ", user); + fprintf (stderr, " %-8s ", user); switch (item->type) { case it_proc: - printf ("%6d %c%c%c%c%c ", item->u.proc.pid, + printf ("%6d", item->u.proc.pid); + fflush(stdout); + fprintf (stderr, " %c%c%c%c%c ", item->u.proc.ref_set & REF_FILE ? 'f' : '.', item->u.proc.ref_set & REF_ROOT ? 'r' : '.', item->u.proc.ref_set & REF_CWD ? 'c' : '.', @@ -795,31 +797,31 @@ show_files_or_kill (void) !(item->u.proc.ref_set & REF_EXE) ? 'm' : '.'); break; case it_mount: - printf (_("kernel mount ")); + fprintf (stderr, _("kernel mount ")); break; case it_loop: - printf (_("kernel loop ")); + fprintf (stderr, _("kernel loop ")); break; case it_swap: - printf (_("kernel swap ")); + fprintf (stderr, _("kernel swap ")); break; } if (name) { for (scan = name; *scan; scan++) if (*scan == '\\') - printf ("\\\\"); + fprintf (stderr, "\\\\"); else if (*scan > ' ' && *scan <= '~') - putchar (*scan); + putc (*scan,stderr); else - printf ("\\%03o", (unsigned char) *scan); + fprintf (stderr, "\\%03o", (unsigned char) *scan); } - putchar ('\n'); + putc ('\n',stderr); } first = 0; } if (!(file->flags & FLAG_VERB) || first) - putchar ('\n'); + putc('\n',stderr); if (file->flags & FLAG_KILL) for (item = file->items; item; item = item->next) kill_item (file, item); @@ -966,11 +968,12 @@ static void usage (void) { fprintf (stderr, _( - "usage: fuser [ -a | -s ] [ -n space ] [ -signal ] [ -kimuv ] name ...\n" + "usage: fuser [ -a | -s | -c ] [ -n space ] [ -signal ] [ -kimuv ] name ...\n" " [ - ] [ -n space ] [ -signal ] [ -kimuv ] name ...\n" " fuser -l\n" " fuser -V\n\n" " -a display unused files too\n" + " -c mounted FS\n" " -k kill processes accessing that file\n" " -i ask before killing (ignored without -k)\n" " -l list signal names\n" @@ -1055,6 +1058,7 @@ main (int argc, char **argv) flags |= FLAG_ASK; break; case 'm': + case 'c': flags |= FLAG_DEV; break; case 'n':