Only occurs if no arguments were provided directly. Arguments can be
separated by any amount of valid whitespace. This allows for piping into
pacman from other programs or from itself, e.g.:

  pacman -Qdtq | pacman -Rs

Signed-off-by: Dave Reisner <d...@falconindy.com>
---
 src/pacman/pacman.c |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index 049bc40..6d9d954 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -26,6 +26,7 @@
 #define PACKAGE_VERSION GIT_VERSION
 #endif
 
+#include <ctype.h> /* isspace */
 #include <stdlib.h> /* atoi */
 #include <stdio.h>
 #include <limits.h>
@@ -1172,6 +1173,29 @@ int main(int argc, char *argv[])
                cleanup(ret);
        }
 
+       /* read package arguments from stdin if we have none yet */
+       if(!pm_targets && !isatty(0)) {
+               char line[BUFSIZ];
+               int i = 0;
+               while((line[i] = fgetc(stdin)) != EOF) {
+                       if(isspace(line[i])) {
+                               line[i] = 0;
+                               /* avoid adding zero length arg, if multiple 
spaces separate args */
+                               if(i > 0) {
+                                       pm_targets = alpm_list_add(pm_targets, 
strdup(line));
+                                       i = 0;
+                               }
+                               continue;
+                       }
+                       ++i;
+               }
+               /* end of stream -- check for data still in line buffer */
+               if(i > 0) {
+                       pm_targets = alpm_list_add(pm_targets, strdup(line));
+               }
+               freopen(ctermid(NULL), "r", stdin);
+       }
+
        /* parse the config file */
        ret = parseconfig(config->configfile);
        if(ret != 0) {
-- 
1.7.2


Reply via email to