Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <pc.h>
  5.  
  6. int
  7. getlongpass(const char *prompt, char *password, int max_length)
  8. {
  9.   char *p = password;
  10.   int c, count = 0;
  11.  
  12.   fflush(stdout);
  13.   /* If we can't prompt, abort */
  14.   if (fputs(prompt, stderr) < 0)
  15.   {
  16.     *p = '\0';
  17.     return -1;
  18.   }
  19.  
  20.   while (1)
  21.   {
  22.     /* Get a character with no echo */
  23.     c = getkey();
  24.  
  25.     /* Exit on interrupt (^c or ^break) */
  26.     if (c == '\003' || c == 0x100)
  27.       exit(1);
  28.  
  29.     /* Terminate on end of line or file (^j, ^m, ^d, ^z) */
  30.     if (c == '\r' || c == '\n' || c == '\004' || c == '\032')
  31.       break;
  32.  
  33.     /* Back up on backspace */
  34.     if (c == '\b')
  35.     {
  36.       if (count)
  37.         count--;
  38.       else if (p > password)
  39.           p--;
  40.       continue;
  41.     }
  42.  
  43.     /* Ignore DOS extended characters */
  44.     if ((c & 0xff) != c)
  45.       continue;
  46.  
  47.     /* Add to password if it isn't full */
  48.     if (p < password + max_length - 1)
  49.       *p++ = c;
  50.     else
  51.       count++;
  52.   }
  53.   *p = '\0';
  54.  
  55.   fputc('\n', stderr);
  56.  
  57.   return 0;
  58. }
  59.