add tests for gunzip
[oweals/busybox.git] / libbb / bb_askpass.c
index 097a0a290c3d7eb454ce71ca4e407a570fe5939c..435314ea029872f6975349b84bf2ae7b004a8ba2 100644 (file)
@@ -8,13 +8,7 @@
  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <signal.h>
 #include <termios.h>
-#include <sys/ioctl.h>
 
 #include "libbb.h"
 
@@ -25,18 +19,22 @@ static void askpass_timeout(int ATTRIBUTE_UNUSED ignore)
 
 char *bb_askpass(int timeout, const char * prompt)
 {
-       static char passwd[64];
+       /* Was static char[BIGNUM] */
+       enum { sizeof_passwd = 128 };
+       static char *passwd;
 
        char *ret;
        int i;
        struct sigaction sa;
        struct termios old, new;
 
+       if (!passwd)
+               passwd = xmalloc(sizeof_passwd);
+       memset(passwd, 0, sizeof_passwd);
+
        tcgetattr(STDIN_FILENO, &old);
        tcflush(STDIN_FILENO, TCIFLUSH);
 
-       memset(passwd, 0, sizeof(passwd));
-
        fputs(prompt, stdout);
        fflush(stdout);
 
@@ -53,7 +51,9 @@ char *bb_askpass(int timeout, const char * prompt)
        }
 
        ret = NULL;
-       if (read(STDIN_FILENO, passwd, sizeof(passwd)-1) > 0) {
+       /* On timeout, read will hopefully be interrupted by SIGALRM,
+        * and we return NULL */
+       if (read(STDIN_FILENO, passwd, sizeof_passwd-1) > 0) {
                ret = passwd;
                i = 0;
                /* Last byte is guaranteed to be 0
@@ -69,7 +69,7 @@ char *bb_askpass(int timeout, const char * prompt)
        }
 
        tcsetattr(STDIN_FILENO, TCSANOW, &old);
-       puts("");
+       bb_putchar('\n');
        fflush(stdout);
        return ret;
 }