summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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) {