This commit was generated by cvs2svn to compensate for changes in r36, which
[alioth/cvs.git] / vms / getpass.c
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 *
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
63 main ()
64 {
65     printf ("thank you for saying \"%s\"\n", getpass ("What'll it be? "));
66     return 0;
67 }
68
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