Tags: patch
This patch include the following changes:
- A new flag -a modify output format and shows full command line.
- Output format depend on -l and -a flags, not anymore on -f.
- -f flag only modify where to match the pattern, not output format.
For example:
> pgrep firefox
1911
1920
> pgrep -l firefox
1911 firefox
1920 firefox-bin
> pgrep -a firefox
1911 /bin/sh /usr/lib/firefox-3.6.13/firefox
1920 /usr/lib/firefox-3.6.13/firefox-bin
> pgrep -f firefox
1911
1916
1920
1964
> pgrep -fl firefox
1911 firefox
1916 run-mozilla.sh
1920 firefox-bin
1964 plugin-containe
> pgrep -fa firefox
1911 /bin/sh /usr/lib/firefox-3.6.13/firefox
1916 /bin/sh /usr/lib/firefox-3.6.13/run-mozilla.sh
/usr/lib/firefox-3.6.13/firefox-bin
1920 /usr/lib/firefox-3.6.13/firefox-bin
1964 /usr/lib/firefox-3.6.13/plugin-container
/usr/lib/flashplugin-installer/libflashplayer.so 1920 plugin
Alfredo
diff -ur procps-3.2.8/pgrep.1 procps-3.2.8.new/pgrep.1
--- procps-3.2.8/pgrep.1 2010-12-31 15:20:51.699780975 +0100
+++ procps-3.2.8.new/pgrep.1 2010-12-31 15:14:49.569780976 +0100
@@ -8,7 +8,7 @@
.SH SYNOPSIS
.na
-\fBpgrep\fR [\fB\-cflvx\fR] [\fB\-d\ \fIdelimiter\fR] [\fB\-n\fR|\fB\-o\fR] \
+\fBpgrep\fR [\fB\-cflavx\fR] [\fB\-d\ \fIdelimiter\fR] [\fB\-n\fR|\fB\-o\fR] \
[\fB\-P\ \fIppid\fR,...] [\fB\-g\ \fIpgrp\fR,...] [\fB\-s\ \fIsid\fR,...] \
[\fB\-u\ \fIeuid\fR,...] [\fB\-U\ \fIuid\fR,...] [\fB\-G\ \fIgid\fR,...] \
[\fB\-t\ \fIterm\fR,...] [\fIpattern\fR]
@@ -64,6 +64,9 @@
\fB\-l\fR
List the process name as well as the process ID. (\fBpgrep\fP only.)
.TP
+\fB\-a\fR
+List the full command line as well as the process ID. (\fBpgrep\fP only.)
+.TP
\fB\-n\fR
Select only the newest (most recently started) of the matching
processes.
diff -ur procps-3.2.8/pgrep.c procps-3.2.8.new/pgrep.c
--- procps-3.2.8/pgrep.c 2010-12-31 15:20:53.549780978 +0100
+++ procps-3.2.8.new/pgrep.c 2010-12-31 15:22:58.119780975 +0100
@@ -38,6 +38,8 @@
#define EXIT_USAGE 2
#define EXIT_FATAL 3
+#define CMDSTRSIZE 4096
+
static int i_am_pkill = 0;
static const char *progname = "pgrep";
@@ -48,6 +50,7 @@
/* User supplied arguments */
+static int opt_longlong = 0;
static int opt_full = 0;
static int opt_long = 0;
static int opt_oldest = 0;
@@ -425,7 +428,9 @@
regex_t *preg;
pid_t myself = getpid();
union el *list = NULL;
- char cmd[4096];
+ char cmdline[CMDSTRSIZE];
+ char searchcmd[CMDSTRSIZE];
+ char outputcmd[CMDSTRSIZE];
ptp = do_openproc();
preg = do_regcomp();
@@ -470,30 +475,43 @@
match = match_strlist (tty, opt_term);
}
}
- if (opt_long || (match && opt_pattern)) {
+
+ if ( (opt_full || opt_longlong) && task.cmdline) {
+ int i = 0;
+ int bytes = sizeof (cmdline) - 1;
+
+ /* make sure it is always NUL-terminated */
+ cmdline[bytes] = 0;
+ /* make room for SPC in loop below */
+ --bytes;
+
+ strncpy (cmdline, task.cmdline[i], bytes);
+ bytes -= strlen (task.cmdline[i++]);
+ while (task.cmdline[i] && bytes > 0) {
+ strncat (cmdline, " ", bytes);
+ strncat (cmdline, task.cmdline[i], bytes);
+ bytes -= strlen (task.cmdline[i++]) + 1;
+ }
+ }
+
+ if (match && opt_pattern) {
if (opt_full && task.cmdline) {
- int i = 0;
- int bytes = sizeof (cmd) - 1;
+ strncpy (searchcmd, cmdline, CMDSTRSIZE);
+ } else {
+ strcpy (searchcmd, task.cmd);
+ }
+ }
- /* make sure it is always NUL-terminated */
- cmd[bytes] = 0;
- /* make room for SPC in loop below */
- --bytes;
-
- strncpy (cmd, task.cmdline[i], bytes);
- bytes -= strlen (task.cmdline[i++]);
- while (task.cmdline[i] && bytes > 0) {
- strncat (cmd, " ", bytes);
- strncat (cmd, task.cmdline[i], bytes);
- bytes -= strlen (task.cmdline[i++]) + 1;
- }
+ if (opt_long || opt_longlong) {
+ if (opt_longlong && task.cmdline) {
+ strncpy (outputcmd, cmdline, CMDSTRSIZE);
} else {
- strcpy (cmd, task.cmd);
+ strcpy (outputcmd, task.cmd);
}
}
if (match && opt_pattern) {
- if (regexec (preg, cmd, 0, NULL, 0) != 0)
+ if (regexec (preg, searchcmd, 0, NULL, 0) != 0)
match = 0;
}
@@ -520,9 +538,9 @@
if (list == NULL)
exit (EXIT_FATAL);
}
- if (opt_long) {
+ if (opt_long || opt_longlong) {
char buff[5096]; // FIXME
- sprintf (buff, "%d %s", task.XXXID, cmd);
+ sprintf (buff, "%d %s", task.XXXID, outputcmd);
list[matches++].str = strdup (buff);
} else {
list[matches++].num = task.XXXID;
@@ -563,7 +581,7 @@
}
} else {
/* These options are for pgrep only */
- strcat (opts, "ld:");
+ strcat (opts, "lad:");
}
strcat (opts, "LF:cfnovxP:g:s:u:U:G:t:?V");
@@ -639,6 +657,9 @@
case 'l': // Solaris: long output format (pgrep only) Should require -f for beyond argv[0] maybe?
opt_long = 1;
break;
+ case 'a':
+ opt_longlong = 1;
+ break;
case 'n': // Solaris: match only the newest
if (opt_oldest|opt_negate|opt_newest)
usage (opt);
@@ -731,7 +752,7 @@
if (opt_count) {
fprintf(stdout, "%ld\n", num);
} else {
- if (opt_long)
+ if (opt_long || opt_longlong)
output_strlist (procs,num);
else
output_numlist (procs,num);