Description: c option for pgrep for counting number of matched proceesses
Author: Craig Small <csmall@debian.org>
Bug-Debian: http://bugs.debian.org/375791
Index: b/pgrep.1
===================================================================
--- a/pgrep.1	2009-11-24 20:53:02.000000000 +1100
+++ b/pgrep.1	2009-11-24 21:00:45.000000000 +1100
@@ -7,7 +7,7 @@
 pgrep, pkill \- look up or signal processes based on name and other attributes
 
 .SH SYNOPSIS
-pgrep [\-flvx] [\-d \fIdelimiter\fP] [\-n|\-o] [\-P \fIppid\fP,...] [\-g \fIpgrp\fP,...]
+pgrep [\-cflvx] [\-d \fIdelimiter\fP] [\-n|\-o] [\-P \fIppid\fP,...] [\-g \fIpgrp\fP,...]
 .br
 	[\-s \fIsid\fP,...] [\-u \fIeuid\fP,...] [\-U \fIuid\fP,...] [\-G \fIgid\fP,...]
 .br
@@ -38,6 +38,9 @@
 
 .SH OPTIONS
 .TP
+\-c
+Suppress normal output; instead print a count of matching processes.
+.TP
 \-d \fIdelimiter\fP
 Sets the string used to delimit each process ID in the output (by
 default a newline).  (\fBpgrep\fP only.)
Index: b/pgrep.c
===================================================================
--- a/pgrep.c	2009-11-24 21:00:41.000000000 +1100
+++ b/pgrep.c	2009-11-24 21:00:45.000000000 +1100
@@ -54,6 +54,7 @@
 static int opt_newest = 0;
 static int opt_negate = 0;
 static int opt_exact = 0;
+static int opt_count = 0;
 static int opt_signal = SIGTERM;
 static int opt_lock = 0;
 static int opt_case = 0;
@@ -79,7 +80,7 @@
 	if (i_am_pkill)
 		fprintf (fp, "Usage: pkill [-SIGNAL] [-fvx] ");
 	else
-		fprintf (fp, "Usage: pgrep [-flvx] [-d DELIM] ");
+		fprintf (fp, "Usage: pgrep [-cflvx] [-d DELIM] ");
 	fprintf (fp, "[-n|-o] [-P PPIDLIST] [-g PGRPLIST] [-s SIDLIST]\n"
 		 "\t[-u EUIDLIST] [-U UIDLIST] [-G GIDLIST] [-t TERMLIST] "
 		 "[PATTERN]\n");
@@ -565,7 +566,7 @@
 		strcat (opts, "ld:");
 	}
 			
-	strcat (opts, "LF:fnovxP:g:s:u:U:G:t:?V");
+	strcat (opts, "LF:cfnovxP:g:s:u:U:G:t:?V");
 	
 	while ((opt = getopt (argc, argv, opts)) != -1) {
 		switch (opt) {
@@ -613,6 +614,9 @@
 			exit(EXIT_SUCCESS);
 //		case 'c':   // Solaris: match by contract ID
 //			break;
+        case 'c':
+            opt_count = 1;
+            break;
 		case 'd':   // Solaris: change the delimiter
 			opt_delim = strdup (optarg);
 			break;
@@ -724,10 +728,14 @@
 				 procs[i].num, strerror (errno));
 		}
 	} else {
-		if (opt_long)
-			output_strlist(procs,num);
-		else
-			output_numlist(procs,num);
+		if (opt_count) {
+			fprintf(stdout, "%ld\n", num);
+		} else {
+			if (opt_long)
+				output_strlist (procs,num);
+			else
+				output_numlist (procs,num);
+		}
 	}
 	return !num; // exit(EXIT_SUCCESS) if match, otherwise exit(EXIT_FAILURE)
 }
