mirror of
https://github.com/alsa-project/alsa-utils
synced 2025-01-05 16:46:41 +01:00
aplay: fix termio settings - return back old c_flag value on exit
- symptom - ssh client password authentication does not work with the modified terminal settings Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
3bd6533622
commit
73c79ebf26
1 changed files with 17 additions and 1 deletions
|
@ -117,6 +117,7 @@ static long long max_file_size = 0;
|
||||||
static int max_file_time = 0;
|
static int max_file_time = 0;
|
||||||
static int use_strftime = 0;
|
static int use_strftime = 0;
|
||||||
volatile static int recycle_capture_file = 0;
|
volatile static int recycle_capture_file = 0;
|
||||||
|
static long term_c_lflag = 0;
|
||||||
|
|
||||||
static int fd = -1;
|
static int fd = -1;
|
||||||
static off64_t pbrec_count = LLONG_MAX, fdcount;
|
static off64_t pbrec_count = LLONG_MAX, fdcount;
|
||||||
|
@ -128,6 +129,8 @@ static int pidfile_written = 0;
|
||||||
|
|
||||||
/* needed prototypes */
|
/* needed prototypes */
|
||||||
|
|
||||||
|
static void done_stdin(void);
|
||||||
|
|
||||||
static void playback(char *filename);
|
static void playback(char *filename);
|
||||||
static void capture(char *filename);
|
static void capture(char *filename);
|
||||||
static void playbackv(char **filenames, unsigned int count);
|
static void playbackv(char **filenames, unsigned int count);
|
||||||
|
@ -343,6 +346,7 @@ static void version(void)
|
||||||
*/
|
*/
|
||||||
static void prg_exit(int code)
|
static void prg_exit(int code)
|
||||||
{
|
{
|
||||||
|
done_stdin();
|
||||||
if (handle)
|
if (handle)
|
||||||
snd_pcm_close(handle);
|
snd_pcm_close(handle);
|
||||||
if (pidfile_written)
|
if (pidfile_written)
|
||||||
|
@ -1202,16 +1206,28 @@ static void init_stdin(void)
|
||||||
struct termios term;
|
struct termios term;
|
||||||
long flags;
|
long flags;
|
||||||
|
|
||||||
|
tcgetattr(fileno(stdin), &term);
|
||||||
|
term_c_lflag = term.c_lflag;
|
||||||
if (fd == fileno(stdin))
|
if (fd == fileno(stdin))
|
||||||
return;
|
return;
|
||||||
flags = fcntl(fileno(stdin), F_GETFL);
|
flags = fcntl(fileno(stdin), F_GETFL);
|
||||||
if (flags < 0 || fcntl(fileno(stdin), F_SETFL, flags|O_NONBLOCK) < 0)
|
if (flags < 0 || fcntl(fileno(stdin), F_SETFL, flags|O_NONBLOCK) < 0)
|
||||||
fprintf(stderr, _("stdin O_NONBLOCK flag setup failed\n"));
|
fprintf(stderr, _("stdin O_NONBLOCK flag setup failed\n"));
|
||||||
tcgetattr(fileno(stdin), &term);
|
|
||||||
term.c_lflag &= ~ICANON;
|
term.c_lflag &= ~ICANON;
|
||||||
tcsetattr(fileno(stdin), TCSANOW, &term);
|
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)
|
static void do_pause(void)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
Loading…
Reference in a new issue