]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - usr.sbin/sade/msg.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / usr.sbin / sade / msg.c
1 /*
2  * $FreeBSD$
3  *
4  * Copyright (c) 1995
5  *      Jordan Hubbard.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer,
12  *    verbatim and that no modifications are made prior to this
13  *    point in the file.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED.  IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  *
30  */
31
32 #include "sade.h"
33 #include <stdarg.h>
34 #include <sys/ioctl.h>
35 #include <sys/consio.h>
36
37 Boolean
38 isDebug(void)
39 {
40     char *cp;
41
42     return (cp = variable_get(VAR_DEBUG)) && strcmp(cp, "no");
43 }
44
45 /* Whack up an informational message on the status line, in stand-out */
46 void
47 msgYap(const char *fmt, ...)
48 {
49     va_list args;
50     char *errstr;
51     int attrs;
52
53     errstr = (char *)alloca(FILENAME_MAX);
54     va_start(args, fmt);
55     vsnprintf(errstr, FILENAME_MAX, fmt, args);
56     va_end(args);
57     attrs = getattrs(stdscr);
58     attrset(A_REVERSE);
59     mvaddstr(StatusLine, 0, errstr);
60     attrset(attrs);
61     refresh();
62 }
63
64 /* Whack up an informational message on the status line */
65 void
66 msgInfo(const char *fmt, ...)
67 {
68     va_list args;
69     char *errstr;
70     int i, attrs;
71     char line[81];
72
73     attrs = getattrs(stdscr);
74     /* NULL is a special convention meaning "erase the old stuff" */
75     if (!fmt) {
76         move(StatusLine, 0);
77         clrtoeol();
78         return;
79     }
80     errstr = (char *)alloca(FILENAME_MAX);
81     va_start(args, fmt);
82     vsnprintf(errstr, FILENAME_MAX, fmt, args);
83     va_end(args);
84     memset(line, ' ', 80);
85     for (i = 0; i < 80; i++) {
86         if (errstr[i])
87             line[i] = errstr[i];
88         else
89             break;
90     }
91     line[80] = '\0';
92     attrset(ATTR_TITLE);
93     mvaddstr(StatusLine, 0, line);
94     attrset(attrs);
95     move(StatusLine, 79);
96     refresh();
97 }
98
99 /* Whack up a warning on the status line */
100 void
101 msgWarn(const char *fmt, ...)
102 {
103     va_list args;
104     char *errstr;
105     int attrs;
106
107     errstr = (char *)alloca(FILENAME_MAX);
108     strcpy(errstr, "Warning: ");
109     va_start(args, fmt);
110     vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
111     va_end(args);
112     attrs = getattrs(stdscr);
113     beep();
114     attrset(ATTR_TITLE);
115     mvaddstr(StatusLine, 0, errstr);
116     attrset(attrs);
117     refresh();
118     if (OnVTY && isDebug())
119         msgDebug("Warning message `%s'\n", errstr);
120 }
121
122 /* Whack up an error on the status line */
123 void
124 msgError(const char *fmt, ...)
125 {
126     va_list args;
127     char *errstr;
128     int attrs;
129
130     errstr = (char *)alloca(FILENAME_MAX);
131     strcpy(errstr, "Error: ");
132     va_start(args, fmt);
133     vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
134     va_end(args);
135     beep();
136     attrs = getattrs(stdscr);
137     attrset(ATTR_TITLE);
138     mvaddstr(StatusLine, 0, errstr);
139     attrset(attrs);
140     refresh();
141     if (OnVTY && isDebug())
142         msgDebug("Error message `%s'\n", errstr);
143 }
144
145 /* Whack up a fatal error on the status line */
146 void
147 msgFatal(const char *fmt, ...)
148 {
149     va_list args;
150     char *errstr;
151     int attrs;
152
153     errstr = (char *)alloca(FILENAME_MAX);
154     strcpy(errstr, "Fatal Error: ");
155     va_start(args, fmt);
156     vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
157     va_end(args);
158     beep();
159     attrs = getattrs(stdscr);
160     attrset(ATTR_TITLE);
161     mvaddstr(StatusLine, 0, errstr);
162     addstr(" - ");
163     addstr("PRESS ANY KEY TO ");
164     if (getpid() == 1)
165         addstr("REBOOT");
166     else
167         addstr("QUIT");
168     attrset(attrs);
169     refresh();
170     if (OnVTY)
171         msgDebug("Fatal error `%s'!\n", errstr);
172     getch();
173 }
174
175 /* Put up a message in a popup confirmation box */
176 void
177 msgConfirm(const char *fmt, ...)
178 {
179     va_list args;
180     char *errstr;
181     WINDOW *w = savescr();
182
183     errstr = (char *)alloca(FILENAME_MAX);
184     va_start(args, fmt);
185     vsnprintf(errstr, FILENAME_MAX, fmt, args);
186     va_end(args);
187     use_helpline(NULL);
188     use_helpfile(NULL);
189     if (OnVTY) {
190         ioctl(0, VT_ACTIVATE, 1);
191         msgInfo(NULL);
192     }
193     dialog_notify(errstr);
194     restorescr(w);
195 }
196
197 /* Put up a message in a popup information box */
198 void
199 msgNotify(const char *fmt, ...)
200 {
201     va_list args;
202     char *errstr;
203
204     errstr = (char *)alloca(FILENAME_MAX);
205     va_start(args, fmt);
206     vsnprintf(errstr, FILENAME_MAX, fmt, args);
207     va_end(args);
208     use_helpline(NULL);
209     use_helpfile(NULL);
210     if (isDebug())
211         msgDebug("Notify: %s\n", errstr);
212     dialog_msgbox(NULL, errstr, -1, -1, 0);
213 }
214
215 /* Put up a message in a popup yes/no box and return 0 for YES, 1 for NO */
216 int
217 msgYesNo(const char *fmt, ...)
218 {
219     va_list args;
220     char *errstr;
221     int ret;
222     WINDOW *w = savescr();
223     
224     errstr = (char *)alloca(FILENAME_MAX);
225     va_start(args, fmt);
226     vsnprintf(errstr, FILENAME_MAX, fmt, args);
227     va_end(args);
228     use_helpline(NULL);
229     use_helpfile(NULL);
230     if (OnVTY) {
231         ioctl(0, VT_ACTIVATE, 1);       /* Switch back */
232         msgInfo(NULL);
233     }
234     if (variable_get(VAR_NONINTERACTIVE))
235         return 0;       /* If non-interactive, return YES all the time */
236     ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1);
237     restorescr(w);
238     return ret;
239 }
240
241 /* Put up a message in a popup no/yes box and return 0 for YES, 1 for NO */
242 int
243 msgNoYes(const char *fmt, ...)
244 {
245     va_list args;
246     char *errstr;
247     int ret;
248     WINDOW *w = savescr();
249     
250     errstr = (char *)alloca(FILENAME_MAX);
251     va_start(args, fmt);
252     vsnprintf(errstr, FILENAME_MAX, fmt, args);
253     va_end(args);
254     use_helpline(NULL);
255     use_helpfile(NULL);
256     if (OnVTY) {
257         ioctl(0, VT_ACTIVATE, 1);       /* Switch back */
258         msgInfo(NULL);
259     }
260     if (variable_get(VAR_NONINTERACTIVE))
261         return 1;       /* If non-interactive, return NO all the time */
262     ret = dialog_noyes("User Confirmation Requested", errstr, -1, -1);
263     restorescr(w);
264     return ret;
265 }
266
267 /* Put up a message in an input box and return the value */
268 char *
269 msgGetInput(char *buf, const char *fmt, ...)
270 {
271     va_list args;
272     char *errstr;
273     static char input_buffer[256];
274     int rval;
275     WINDOW *w = savescr();
276
277     errstr = (char *)alloca(FILENAME_MAX);
278     va_start(args, fmt);
279     vsnprintf(errstr, FILENAME_MAX, fmt, args);
280     va_end(args);
281     use_helpline(NULL);
282     use_helpfile(NULL);
283     if (buf)
284         SAFE_STRCPY(input_buffer, buf);
285     else
286         input_buffer[0] = '\0';
287     if (OnVTY) {
288         ioctl(0, VT_ACTIVATE, 1);       /* Switch back */
289         msgInfo(NULL);
290     }
291     rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer);
292     restorescr(w);
293     if (!rval)
294         return input_buffer;
295     else
296         return NULL;
297 }
298
299 /* Write something to the debugging port */
300 void
301 msgDebug(const char *fmt, ...)
302 {
303     va_list args;
304     char *dbg;
305
306     if (DebugFD == -1)
307         return;
308     dbg = (char *)alloca(FILENAME_MAX);
309     strcpy(dbg, "DEBUG: ");
310     va_start(args, fmt);
311     vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args);
312     va_end(args);
313     write(DebugFD, dbg, strlen(dbg));
314 }
315
316 /* Tell the user there's some output to go look at */
317 void
318 msgWeHaveOutput(const char *fmt, ...)
319 {
320     va_list args;
321     char *errstr;
322     WINDOW *w = savescr();
323     
324     errstr = (char *)alloca(FILENAME_MAX);
325     va_start(args, fmt);
326     vsnprintf(errstr, FILENAME_MAX, fmt, args);
327     va_end(args);
328     use_helpline(NULL);
329     use_helpfile(NULL);
330     msgDebug("Notify: %s\n", errstr);
331     dialog_clear_norefresh();
332     sleep(2);
333     dialog_msgbox(NULL, errstr, -1, -1, 0);
334     restorescr(w);
335 }
336
337 /* Simple versions of msgConfirm() and msgNotify() for calling from scripts */
338 int
339 msgSimpleConfirm(const char *str)
340 {
341     msgConfirm("%s", str);
342     return DITEM_SUCCESS;
343 }
344
345 int
346 msgSimpleNotify(const char *str)
347 {
348     msgNotify("%s", str);
349     return DITEM_SUCCESS;
350 }