getpass: Don't fail if stdin is not a tty
authorStef Walter <stefw@gnome.org>
Thu, 4 Apr 2013 13:55:10 +0000 (15:55 +0200)
committerAlexander Bokovoy <ab@samba.org>
Fri, 5 Apr 2013 05:34:37 +0000 (07:34 +0200)
We don't need to manipulate the tty state (such as turning off
echo) when prompting for passwords if we're not reading from a tty.

Reviewed-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Alexander Bokovoy <ab@samba.org>
Autobuild-User(master): Alexander Bokovoy <ab@samba.org>
Autobuild-Date(master): Fri Apr  5 07:34:37 CEST 2013 on sn-devel-104

lib/util/getpass.c

index 480bd5689864be3a51fa57c4c3370b30ebb0266d..0cbc7dd25324d5fa7f89686c0c8f1ddfb011fa7c 100644 (file)
@@ -170,31 +170,34 @@ int samba_getpass(const char *prompt,
                return -1;
        }
 
-       ZERO_STRUCT(attr);
-       ZERO_STRUCT(old_attr);
+       if (isatty (STDIN_FILENO)) {
 
-       /* get local terminal attributes */
-       if (tcgetattr(STDIN_FILENO, &attr) < 0) {
-               perror("tcgetattr");
-               return -1;
-       }
+               ZERO_STRUCT(attr);
+               ZERO_STRUCT(old_attr);
 
-       /* save terminal attributes */
-       memcpy(&old_attr, &attr, sizeof(attr));
-       if((fd = fcntl(0, F_GETFL, 0)) < 0) {
-               perror("fcntl");
-               return -1;
-       }
+               /* get local terminal attributes */
+               if (tcgetattr(STDIN_FILENO, &attr) < 0) {
+                       perror("tcgetattr");
+                       return -1;
+               }
 
-       /* disable echo */
-       if (!echo) {
-               attr.c_lflag &= ~(ECHO);
-       }
+               /* save terminal attributes */
+               memcpy(&old_attr, &attr, sizeof(attr));
+               if((fd = fcntl(0, F_GETFL, 0)) < 0) {
+                       perror("fcntl");
+                       return -1;
+               }
 
-       /* write attributes to terminal */
-       if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &attr) < 0) {
-               perror("tcsetattr");
-               return -1;
+               /* disable echo */
+               if (!echo) {
+                       attr.c_lflag &= ~(ECHO);
+               }
+
+               /* write attributes to terminal */
+               if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &attr) < 0) {
+                       perror("tcsetattr");
+                       return -1;
+               }
        }
 
        /* disable nonblocking I/O */
@@ -204,8 +207,11 @@ int samba_getpass(const char *prompt,
 
        ok = samba_gets(prompt, buf, len, verify);
 
-       /* reset terminal */
-       tcsetattr(STDIN_FILENO, TCSANOW, &old_attr);
+       if (isatty (STDIN_FILENO)) {
+
+               /* reset terminal */
+               tcsetattr(STDIN_FILENO, TCSANOW, &old_attr);
+       }
 
        /* close fd */
        if (fd & O_NDELAY) {