rtoss - Blame information for rev 214

Subversion Repositories:
Rev:
Rev Author Line No. Line
213 roytam 1 #include <windows.h>
2 #include <stdio.h>
3 /*
4  * getpass: modified from
5  * http://cboard.cprogramming.com/windows-programming/67166-portable-getch.html#post477362
6  */
7 /* Password function for Win32 console
8 * reads keystrokes but displays * to mask printable entries
9 * first parameter: a pointer to a char array, buffer to hold password
10 * second parameter: password buffer size, including null terminator
11 * return value: funtion returns 1 if max buffer is reached, else returns 0
12 */
13  
214 roytam 14 int Password(char * buffer, int buffSize, HANDLE hInput, HANDLE hOutput, int show) {
15         int count = 0;
16         INPUT_RECORD inRec;
17         DWORD dwCharsRead, dwCharsWritten;
18  
19         buffSize--;
20  
21         while(ReadConsoleInput(hInput, &inRec, 1, &dwCharsRead) && count < buffSize)
22                 if(inRec.EventType == KEY_EVENT && inRec.Event.KeyEvent.bKeyDown == TRUE)
23                         if(isprint(inRec.Event.KeyEvent.uChar.AsciiChar)) {
24                                 buffer[count++] = inRec.Event.KeyEvent.uChar.AsciiChar;
213 roytam 25                                 if(show)
214 roytam 26                                         WriteConsole(hOutput, "*", 1, &dwCharsWritten, NULL);
27                         } else
28                         if(inRec.Event.KeyEvent.uChar.AsciiChar == '\b' && count > 0) {
213 roytam 29                                 if(show)
214 roytam 30                                         WriteConsole(hOutput, "\b \b", 3, &dwCharsWritten, NULL);
31                                 count--;
32                         } else
33                         if(inRec.Event.KeyEvent.uChar.AsciiChar == '\r')
34                                 break;
35  
36         buffer[count] = '\0';
37  
38         if(count == buffSize)
39         return(1);
40         else
41         return(0);
213 roytam 42 }
43  
214 roytam 44 int main(int argc, char* argv[]) {
45         HANDLE hInput, hOutput;
46         DWORD dwCharsWritten;
213 roytam 47  
214 roytam 48         char buffer[256];
49         int show = 0;
50         int start = 1;
51         int i;
213 roytam 52  
214 roytam 53         if(argc > 1) {
54                 if(argv[1][0] == '-'){
55                         if(argv[1][1] == '?'){
56                                 printf("Usage: %s [-s|?] [\"prompt\"]\n",argv[0]);
57                                 return 1;
58                         } else if(argv[1][1] == 's'){
59                                 show = 1;
60                                 ++start;
61                         }
62                 }
63         }
64  
65         hInput = GetStdHandle(STD_INPUT_HANDLE);
66         hOutput = GetStdHandle(STD_ERROR_HANDLE);
67  
68         if(argc > 1) {
69                 for(i = start; i < argc; ++i) {
70                         WriteConsole(hOutput, argv[i], strlen(argv[i]), &dwCharsWritten, NULL);
71                         WriteConsole(hOutput, " ", 1, &dwCharsWritten, NULL);
72                 }
73         }
74  
75         Password(buffer, 256, hInput, hOutput, show);
76  
213 roytam 77         printf("%s",buffer);
78  
79         if(buffer[0])
214 roytam 80                 return 0;
213 roytam 81         else
82                 return 1;
83 }