#if CONFIG_xxx -> #if ENABLE_xxx
[oweals/busybox.git] / libbb / bb_askpass.c
index 42ccd66d322ca0dcfef2fece0c20ea5d6b813632..cf384e52b9d1915b2f2275048c2b4443f898bfb5 100644 (file)
@@ -5,19 +5,7 @@
  *
  * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
 #include <stdio.h>
 #include <signal.h>
 #include <termios.h>
 #include <sys/ioctl.h>
-#define PWD_BUFFER_SIZE 256
 
+#include "libbb.h"
 
 /* do nothing signal handler */
-static void askpass_timeout(int ignore)
+static void askpass_timeout(int ATTRIBUTE_UNUSED ignore)
 {
 }
 
 char *bb_askpass(int timeout, const char * prompt)
 {
+       static char passwd[64];
+
        char *ret;
-       int i, size;
+       int i;
        struct sigaction sa;
        struct termios old, new;
-       static char passwd[PWD_BUFFER_SIZE];
 
        tcgetattr(STDIN_FILENO, &old);
        tcflush(STDIN_FILENO, TCIFLUSH);
 
-       size = sizeof(passwd);
-       ret = passwd;
-       memset(passwd, 0, size);
+       memset(passwd, 0, sizeof(passwd));
 
        fputs(prompt, stdout);
        fflush(stdout);
@@ -65,15 +52,16 @@ char *bb_askpass(int timeout, const char * prompt)
                alarm(timeout);
        }
 
-       if (read(STDIN_FILENO, passwd, size-1) <= 0) {
-               ret = NULL;
-       } else {
-               for(i = 0; i < size && passwd[i]; i++) {
-                       if (passwd[i]== '\r' || passwd[i] == '\n') {
-                               passwd[i]= 0;
-                               break;
-                       }
-               }
+       ret = NULL;
+       if (read(STDIN_FILENO, passwd, sizeof(passwd)-1) > 0) {
+               ret = passwd;
+               i = 0;
+               /* Last byte is guaranteed to be 0
+                  (read did not overwrite it) */
+               do {
+                       if (passwd[i] == '\r' || passwd[i] == '\n')
+                               passwd[i] = 0;
+               } while (passwd[i++]);
        }
 
        if (timeout) {
@@ -81,8 +69,7 @@ char *bb_askpass(int timeout, const char * prompt)
        }
 
        tcsetattr(STDIN_FILENO, TCSANOW, &old);
-       fputs("\n", stdout);
+       puts("");
        fflush(stdout);
        return ret;
 }
-