]> git.alsa-project.org Git - alsa-utils.git/commitdiff
axfer: check whether a terminal is referred for stdio
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Wed, 5 Dec 2018 01:25:04 +0000 (10:25 +0900)
committerTakashi Iwai <tiwai@suse.de>
Wed, 5 Dec 2018 14:29:51 +0000 (15:29 +0100)
A reference to a terminal for standard input/output brings some
troubles. For capture transmission, it can bring some terminal
control codes and it's possible to make the terminal in disorder.
For playback transmission, it can bring endless loop to read
data for detection of type of container.

This commit checks whether a terminal is referred for the standard
input/output by a call isatty(3). When detecting a terminal,
axfer run time prints message and goes to finish.

Suggested-by: Takashi Iwai <tiwai@suse.com>
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
axfer/container.c

index 690fe5b963788472c4e27b116f5bb64bd8d9c44f..6b0e42e5b7ec4822d308319c01aced25624e9e0f 100644 (file)
@@ -168,6 +168,13 @@ int container_parser_init(struct container_context *cntr,
        // Open a target descriptor.
        if (!strcmp(path, "-")) {
                cntr->fd = fileno(stdin);
+               if (isatty(cntr->fd)) {
+                       fprintf(stderr,
+                               "A terminal is referred for standard input. "
+                               "Output from any process or shell redirection "
+                               "should be referred instead.\n");
+                       return -EIO;
+               }
                err = set_nonblock_flag(cntr->fd);
                if (err < 0)
                        return err;
@@ -245,6 +252,13 @@ int container_builder_init(struct container_context *cntr,
                return -EINVAL;
        if (!strcmp(path, "-")) {
                cntr->fd = fileno(stdout);
+               if (isatty(cntr->fd)) {
+                       fprintf(stderr,
+                               "A terminal is referred for standard output. "
+                               "Input to any process or shell redirection "
+                               "should be referred instead.\n");
+                       return -EIO;
+               }
                err = set_nonblock_flag(cntr->fd);
                if (err < 0)
                        return err;