Line data Source code
1 : /*
2 : * SPDX-License-Identifier: MPL-2.0
3 : *
4 : * This Source Code Form is subject to the terms of the Mozilla Public
5 : * License, v. 2.0. If a copy of the MPL was not distributed with this
6 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 : *
8 : * Copyright 2024 MonetDB Foundation;
9 : * Copyright August 2008 - 2023 MonetDB B.V.;
10 : * Copyright 1997 - July 2008 CWI.
11 : */
12 :
13 : #include "monetdb_config.h"
14 : #include <unistd.h>
15 : #include <string.h>
16 : #ifndef _MSC_VER
17 : #ifdef HAVE_TERMIOS_H
18 : #include <termios.h>
19 : #endif
20 : #endif
21 : #include "mprompt.h"
22 :
23 : #ifdef _MSC_VER
24 : #define fileno _fileno
25 : #include <conio.h>
26 : #endif
27 :
28 : #ifndef HAVE_GETLOGIN
29 : /* we assume this must be windows */
30 : static char *defaultlogin = "win32";
31 : #endif
32 :
33 : char *
34 0 : prompt_getlogin(void)
35 : {
36 : #ifdef HAVE_GETLOGIN
37 : # ifdef __sun__
38 : /* from Solaris' getlogin manpage:
39 : * The correct procedure for determining the login name is to call
40 : * cuserid(3C), or to call getlogin() and if it fails to call
41 : * getpwuid(3C). */
42 : return cuserid(NULL);
43 : # else
44 0 : return getlogin();
45 : # endif
46 : #else
47 : return defaultlogin;
48 : #endif
49 : }
50 :
51 : #ifdef _MSC_VER
52 : char *
53 : simple_prompt(const char *prompt, int maxlen, int echo, const char *def)
54 : {
55 : size_t length = 0;
56 : char *destination = NULL;
57 :
58 : destination = (char *) malloc(maxlen + 2);
59 : if (!destination)
60 : return NULL;
61 :
62 : if (prompt) {
63 : _cputs(prompt);
64 : if (def) {
65 : _cputs("(");
66 : _cputs(def);
67 : _cputs(")");
68 : }
69 : _cputs(":");
70 : }
71 : if (echo) {
72 : _cgets_s(destination, maxlen, &length);
73 : while (length > 0 &&
74 : (destination[length - 1] == '\n' ||
75 : destination[length - 1] == '\r'))
76 : destination[--length] = 0;
77 : } else {
78 : int c;
79 :
80 : while ((c = _getch()) != '\r' && c != '\n') {
81 : if (length < (size_t) maxlen)
82 : destination[length++] = c;
83 : }
84 : destination[length] = 0;
85 : _cputs("\r\n");
86 : }
87 : if (length == 0 && def)
88 : strcpy(destination, def);
89 : return destination;
90 : }
91 : #else
92 : char *
93 0 : simple_prompt(const char *prompt, int maxlen, int echo, const char *def)
94 : {
95 0 : size_t length = 0;
96 0 : char *destination = NULL;
97 0 : FILE *termin = NULL, *termout = NULL;
98 :
99 : #ifdef HAVE_TERMIOS_H
100 0 : struct termios t_orig, t;
101 : #else
102 : (void) echo;
103 : #endif
104 :
105 0 : destination = (char *) malloc(maxlen + 2);
106 0 : if (!destination)
107 : return NULL;
108 :
109 0 : termin = fopen("/dev/tty", "r");
110 0 : termout = fopen("/dev/tty", "w");
111 :
112 0 : if (termin == NULL || termout == NULL) {
113 0 : if (termin)
114 0 : fclose(termin);
115 0 : if (termout)
116 0 : fclose(termout);
117 0 : termin = stdin;
118 0 : termout = stderr;
119 : }
120 :
121 : #ifdef HAVE_TERMIOS_H
122 0 : if (!echo) {
123 0 : tcgetattr(fileno(termin), &t);
124 0 : t_orig = t;
125 0 : t.c_lflag &= ~ECHO;
126 0 : tcsetattr(fileno(termin), TCSAFLUSH, &t);
127 : }
128 : #endif
129 0 : if (prompt) {
130 0 : if (def)
131 0 : fprintf(termout, "%s(%s):", prompt, def);
132 : else
133 0 : fprintf(termout, "%s:", prompt);
134 0 : fflush(termout);
135 : }
136 0 : if (fgets(destination, maxlen, termin) == NULL)
137 0 : destination[0] = '\0';
138 :
139 0 : length = strlen(destination);
140 0 : if (length > 0 && destination[length - 1] != '\n') {
141 0 : char buf[128];
142 0 : size_t buflen;
143 :
144 0 : do {
145 0 : if (fgets(buf, sizeof(buf), termin) == NULL)
146 : break;
147 0 : buflen = strlen(buf);
148 0 : } while (buflen > 0 && buf[buflen - 1] != '\n');
149 : }
150 :
151 0 : if (length > 0 && destination[length - 1] == '\n')
152 0 : destination[length - 1] = '\0';
153 : #ifdef HAVE_TERMIOS_H
154 0 : if (!echo) {
155 0 : tcsetattr(fileno(termin), TCSAFLUSH, &t_orig);
156 0 : fputs("\n", termout);
157 0 : fflush(termout);
158 : }
159 : #endif
160 0 : if (termin != stdin)
161 0 : fclose(termin);
162 0 : if (termout != stdout)
163 0 : fclose(termout);
164 0 : if (destination[0] == 0 && def)
165 0 : strcpy(destination, def);
166 : return destination;
167 : }
168 : #endif /* _MSC_VER */
|