summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDave Reisner <d@falconindy.com>2010-11-04 21:05:28 +0100
committerDan McGee <dan@archlinux.org>2010-11-05 03:10:32 +0100
commit4fb3cfc48f626f84329c78351d6a8710255a35e3 (patch)
tree565967136382130ddc850ceac030c7543c635909 /src
parent0f3957ab48f34df8e151ec026dfac0d9d2df5aec (diff)
downloadpacman-4fb3cfc48f626f84329c78351d6a8710255a35e3.tar.gz
pacman-4fb3cfc48f626f84329c78351d6a8710255a35e3.tar.xz
Support reading package args from stdin
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 This is better than using xargs, as xargs will not reconnect stdin to the terminal. The above operation performed using xargs would require the --noconfirm flag to be passed to pacman. Signed-off-by: Dave Reisner <d@falconindy.com>
Diffstat (limited to 'src')
-rw-r--r--src/pacman/pacman.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index 15abecc5..e078aaba 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>
@@ -1305,6 +1306,38 @@ int main(int argc, char *argv[])
cleanup(ret);
}
+ /* read package arguments from stdin if we have none yet */
+ if(!pm_targets && !isatty(fileno(stdin))) {
+ char line[PATH_MAX];
+ int i = 0;
+ while(i < PATH_MAX && (line[i] = fgetc(stdin)) != EOF) {
+ if(isspace((unsigned char)line[i])) {
+ line[i] = '\0';
+ /* avoid adding zero length arg when multiple spaces separate args */
+ if(i > 0) {
+ pm_targets = alpm_list_add(pm_targets, strdup(line));
+ i = 0;
+ }
+ } else {
+ i++;
+ }
+ }
+ /* check for buffer overflow */
+ if (i >= PATH_MAX) {
+ pm_printf(PM_LOG_ERROR, _("buffer overflow detected in arg parsing\n"));
+ cleanup(EXIT_FAILURE);
+ }
+
+ /* end of stream -- check for data still in line buffer */
+ if(i > 0) {
+ pm_targets = alpm_list_add(pm_targets, strdup(line));
+ }
+ if (!freopen(ctermid(NULL), "r", stdin)) {
+ pm_printf(PM_LOG_ERROR, _("failed to reopen stdin for reading: (%s)\n"),
+ strerror(errno));
+ }
+ }
+
/* parse the config file */
ret = parseconfig(config->configfile);
if(ret != 0) {