OSDN Git Service

aplay: fix termio settings - return back old c_flag value on exit
authorJaroslav Kysela <perex@perex.cz>
Thu, 15 Jul 2010 11:39:14 +0000 (13:39 +0200)
committerJaroslav Kysela <perex@perex.cz>
Thu, 15 Jul 2010 11:39:14 +0000 (13:39 +0200)
- symptom - ssh client password authentication does not work with
  the modified terminal settings

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
aplay/aplay.c

index b5203a7..a92ca93 100644 (file)
@@ -117,6 +117,7 @@ static long long max_file_size = 0;
 static int max_file_time = 0;
 static int use_strftime = 0;
 volatile static int recycle_capture_file = 0;
+static long term_c_lflag = 0;
 
 static int fd = -1;
 static off64_t pbrec_count = LLONG_MAX, fdcount;
@@ -128,6 +129,8 @@ static int pidfile_written = 0;
 
 /* needed prototypes */
 
+static void done_stdin(void);
+
 static void playback(char *filename);
 static void capture(char *filename);
 static void playbackv(char **filenames, unsigned int count);
@@ -343,6 +346,7 @@ static void version(void)
  */
 static void prg_exit(int code) 
 {
+       done_stdin();
        if (handle)
                snd_pcm_close(handle);
        if (pidfile_written)
@@ -1202,16 +1206,28 @@ static void init_stdin(void)
        struct termios term;
        long flags;
 
+       tcgetattr(fileno(stdin), &term);
+       term_c_lflag = term.c_lflag;
        if (fd == fileno(stdin))
                return;
        flags = fcntl(fileno(stdin), F_GETFL);
        if (flags < 0 || fcntl(fileno(stdin), F_SETFL, flags|O_NONBLOCK) < 0)
                fprintf(stderr, _("stdin O_NONBLOCK flag setup failed\n"));
-       tcgetattr(fileno(stdin), &term);
        term.c_lflag &= ~ICANON;
        tcsetattr(fileno(stdin), TCSANOW, &term);
 }
 
+static void done_stdin(void)
+{
+       struct termios term;
+
+       if (fd == fileno(stdin))
+               return;
+       tcgetattr(fileno(stdin), &term);
+       term.c_lflag = term_c_lflag;
+       tcsetattr(fileno(stdin), TCSANOW, &term);
+}
+
 static void do_pause(void)
 {
        int err;