1 /* This program is free software; you can redistribute it and/or modify
2 it under the terms of the GNU General Public License as published by
3 the Free Software Foundation; either version 2, or (at your option)
4 any later version.
5
6 This program is distributed in the hope that it will be useful,
7 but WITHOUT ANY WARRANTY; without even the implied warranty of
8 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 GNU General Public License for more details. */
10
11 #undef TEST
12
13 #include <stdio.h>
14 #include <iodef.h>
15 #include <descrip.h>
16 #include <starlet.h>
17 #include <string.h>
18
19 #ifdef TEST
20 #include <stdlib.h>
21 static void error (int, int, char *);
22 #else
23 # include "cvs.h"
24 #endif
25
26 char *
getpass(char * prompt)27 getpass (char *prompt)
28 {
29 int status;
30 unsigned short chan;
31 static $DESCRIPTOR (sys_command, "SYS$COMMAND");
32 unsigned short iosb[4];
33 /* Arbitrary limit. It doesn't seem worth going through multiple
34 SYS$QIOW calls and who knows what to get rid of it, I don't
35 think. */
36 static char buf[2048];
37
38 /* Try to ensure that we avoid stepping on whatever output has
39 been sent to stdout. */
40 printf ("\n");
41 fflush (stdout);
42
43 status = sys$assign (&sys_command, &chan, 0, 0);
44 if (!(status & 1))
45 error (1, 0, "sys$assign failed in getpass");
46 status = sys$qiow (0, chan, IO$_READPROMPT | IO$M_NOECHO, &iosb, 0, 0,
47 buf, sizeof (buf) - 1, 0, 0, prompt, strlen (prompt));
48 if (!(status & 1))
49 error (1, 0, "sys$qiow failed in getpass");
50 if (!(iosb[0] & 1))
51 error (1, 0, "sys$qiow (iosb) failed in getpass");
52 buf[iosb[1]] = '\0';
53 status = sys$dassgn (chan);
54 if (!(status & 1))
55 error (0, 0, "sys$dassgn failed in getpass");
56 /* Since there is no echo, we better go to the next line ourselves. */
57 printf ("\n");
58 return buf;
59 }
60
61 #ifdef TEST
62 int
main()63 main ()
64 {
65 printf ("thank you for saying \"%s\"\n", getpass ("What'll it be? "));
66 return 0;
67 }
68
error(int x,int y,char * msg)69 static void error (int x, int y, char *msg)
70 {
71 printf ("error: %s\n", msg);
72 if (x)
73 exit (EXIT_FAILURE);
74 }
75 #endif
76