msg.c revision 8825
18097Sjkh/* 28097Sjkh * The new sysinstall program. 38097Sjkh * 48097Sjkh * This is probably the last program in the `sysinstall' line - the next 58097Sjkh * generation being essentially a complete rewrite. 68097Sjkh * 78825Sjkh * $Id: msg.c,v 1.24 1995/05/24 09:00:56 jkh Exp $ 88097Sjkh * 98097Sjkh * Copyright (c) 1995 108097Sjkh * Jordan Hubbard. All rights reserved. 118097Sjkh * 128097Sjkh * Redistribution and use in source and binary forms, with or without 138097Sjkh * modification, are permitted provided that the following conditions 148097Sjkh * are met: 158097Sjkh * 1. Redistributions of source code must retain the above copyright 168097Sjkh * notice, this list of conditions and the following disclaimer, 178097Sjkh * verbatim and that no modifications are made prior to this 188097Sjkh * point in the file. 198097Sjkh * 2. Redistributions in binary form must reproduce the above copyright 208097Sjkh * notice, this list of conditions and the following disclaimer in the 218097Sjkh * documentation and/or other materials provided with the distribution. 228097Sjkh * 3. All advertising materials mentioning features or use of this software 238097Sjkh * must display the following acknowledgement: 248097Sjkh * This product includes software developed by Jordan Hubbard 258097Sjkh * for the FreeBSD Project. 268097Sjkh * 4. The name of Jordan Hubbard or the FreeBSD project may not be used to 278097Sjkh * endorse or promote products derived from this software without specific 288097Sjkh * prior written permission. 298097Sjkh * 308097Sjkh * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND 318097Sjkh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 328097Sjkh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 338097Sjkh * ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE 348097Sjkh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 358097Sjkh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 368097Sjkh * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) 378097Sjkh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 388097Sjkh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 398097Sjkh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 408097Sjkh * SUCH DAMAGE. 418097Sjkh * 428097Sjkh */ 438097Sjkh 448097Sjkh#include "sysinstall.h" 458097Sjkh#include <stdarg.h> 468825Sjkh#include <sys/ioctl.h> 478825Sjkh#include <machine/console.h> 488097Sjkh 498702Sjkh#define VTY_STATLINE 24 508702Sjkh#define TTY_STATLINE 23 518702Sjkh 528262Sjkh/* Whack up an informational message on the status line, in stand-out */ 538262Sjkhvoid 548262SjkhmsgYap(char *fmt, ...) 558262Sjkh{ 568262Sjkh va_list args; 578262Sjkh char *errstr; 588262Sjkh int attrs; 598262Sjkh 608317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 618262Sjkh va_start(args, fmt); 628347Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 638262Sjkh va_end(args); 648262Sjkh attrs = getattrs(stdscr); 658314Sjkh attrset(A_REVERSE); 668702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 678262Sjkh attrset(attrs); 688262Sjkh refresh(); 698262Sjkh free(errstr); 708262Sjkh} 718262Sjkh 728097Sjkh/* Whack up an informational message on the status line */ 738097Sjkhvoid 748097SjkhmsgInfo(char *fmt, ...) 758097Sjkh{ 768097Sjkh va_list args; 778097Sjkh char *errstr; 788705Sjkh int i, attrs; 798705Sjkh char line[81]; 808097Sjkh 818705Sjkh attrs = getattrs(stdscr); 828641Sjkh /* NULL is a special convention meaning "erase the old stuff" */ 838641Sjkh if (!fmt) { 848702Sjkh move(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0); 858705Sjkh attrset(A_REVERSE); 868641Sjkh clrtoeol(); 878705Sjkh attrset(attrs); 888641Sjkh return; 898641Sjkh } 908317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 918097Sjkh va_start(args, fmt); 928347Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 938097Sjkh va_end(args); 948705Sjkh memset(line, ' ', 80); 958705Sjkh for (i = 0; i < 80; i++) { 968705Sjkh if (errstr[i]) 978705Sjkh line[i] = errstr[i]; 988705Sjkh else 998705Sjkh break; 1008705Sjkh } 1018705Sjkh line[80] = '\0'; 1028705Sjkh attrset(A_REVERSE); 1038705Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, line); 1048262Sjkh attrset(attrs); 1058722Sjkh move(OnVTY ? VTY_STATLINE : TTY_STATLINE, 79); 1068262Sjkh refresh(); 1078640Sjkh if (OnVTY) { 1088658Sphk msgDebug("Information: `%s'\n", errstr); 1098641Sjkh msgInfo(NULL); 1108640Sjkh } 1118097Sjkh free(errstr); 1128097Sjkh} 1138097Sjkh 1148097Sjkh/* Whack up a warning on the status line */ 1158097Sjkhvoid 1168097SjkhmsgWarn(char *fmt, ...) 1178097Sjkh{ 1188097Sjkh va_list args; 1198097Sjkh char *errstr; 1208262Sjkh int attrs; 1218097Sjkh 1228317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1238097Sjkh strcpy(errstr, "Warning: "); 1248097Sjkh va_start(args, fmt); 1258097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1268097Sjkh va_end(args); 1278262Sjkh attrs = getattrs(stdscr); 1288097Sjkh beep(); 1298314Sjkh attrset(A_REVERSE); 1308702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 1318262Sjkh attrset(attrs); 1328262Sjkh refresh(); 1338628Sjkh if (OnVTY) 1348628Sjkh msgDebug("Warning message `%s'\n", errstr); 1358097Sjkh free(errstr); 1368097Sjkh} 1378097Sjkh 1388097Sjkh/* Whack up an error on the status line */ 1398097Sjkhvoid 1408097SjkhmsgError(char *fmt, ...) 1418097Sjkh{ 1428097Sjkh va_list args; 1438097Sjkh char *errstr; 1448262Sjkh int attrs; 1458097Sjkh 1468317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1478097Sjkh strcpy(errstr, "Error: "); 1488097Sjkh va_start(args, fmt); 1498097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1508097Sjkh va_end(args); 1518097Sjkh beep(); 1528262Sjkh attrs = getattrs(stdscr); 1538314Sjkh attrset(A_REVERSE); 1548702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 1558262Sjkh attrset(attrs); 1568262Sjkh refresh(); 1578628Sjkh if (OnVTY) 1588628Sjkh msgDebug("Error message `%s'\n", errstr); 1598097Sjkh free(errstr); 1608097Sjkh} 1618097Sjkh 1628097Sjkh/* Whack up a fatal error on the status line */ 1638097Sjkhvoid 1648097SjkhmsgFatal(char *fmt, ...) 1658097Sjkh{ 1668097Sjkh va_list args; 1678097Sjkh char *errstr; 1688262Sjkh int attrs; 1698097Sjkh 1708317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1718097Sjkh strcpy(errstr, "Fatal Error: "); 1728097Sjkh va_start(args, fmt); 1738097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1748097Sjkh va_end(args); 1758097Sjkh beep(); 1768262Sjkh attrs = getattrs(stdscr); 1778314Sjkh attrset(A_REVERSE); 1788702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 1798097Sjkh addstr(" - "); 1808097Sjkh addstr("PRESS ANY KEY TO "); 1818097Sjkh if (getpid() == 1) 1828097Sjkh addstr("REBOOT"); 1838097Sjkh else 1848097Sjkh addstr("QUIT"); 1858262Sjkh attrset(attrs); 1868262Sjkh refresh(); 1878628Sjkh if (OnVTY) 1888628Sjkh msgDebug("Fatal error `%s'!\n", errstr); 1898097Sjkh free(errstr); 1908097Sjkh getch(); 1918097Sjkh systemShutdown(); 1928097Sjkh} 1938097Sjkh 1948208Sjkh/* Put up a message in a popup confirmation box */ 1958208Sjkhvoid 1968208SjkhmsgConfirm(char *fmt, ...) 1978208Sjkh{ 1988208Sjkh va_list args; 1998208Sjkh char *errstr; 2008649Sjkh WINDOW *w; 2018208Sjkh 2028317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2038208Sjkh va_start(args, fmt); 2048208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2058208Sjkh va_end(args); 2068208Sjkh use_helpline(NULL); 2078208Sjkh use_helpfile(NULL); 2088649Sjkh w = dupwin(newscr); 2098640Sjkh if (OnVTY) { 2108825Sjkh ioctl(0, VT_RELDISP, 0); /* Switch back */ 2118641Sjkh msgInfo(NULL); 2128640Sjkh } 2138556Sjkh dialog_notify(errstr); 2148649Sjkh touchwin(w); 2158649Sjkh wrefresh(w); 2168649Sjkh delwin(w); 2178208Sjkh free(errstr); 2188208Sjkh} 2198208Sjkh 2208302Sjkh/* Put up a message in a popup information box */ 2218302Sjkhvoid 2228302SjkhmsgNotify(char *fmt, ...) 2238302Sjkh{ 2248302Sjkh va_list args; 2258302Sjkh char *errstr; 2268302Sjkh 2278317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2288302Sjkh va_start(args, fmt); 2298302Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2308302Sjkh va_end(args); 2318302Sjkh use_helpline(NULL); 2328302Sjkh use_helpfile(NULL); 2338628Sjkh msgDebug("Notify: %s\n", errstr); 2348649Sjkh dialog_clear(); 2358438Sjkh dialog_msgbox("Information Dialog", errstr, -1, -1, 0); 2368302Sjkh free(errstr); 2378302Sjkh} 2388302Sjkh 2398208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */ 2408208Sjkhint 2418208SjkhmsgYesNo(char *fmt, ...) 2428208Sjkh{ 2438208Sjkh va_list args; 2448208Sjkh char *errstr; 2458208Sjkh int ret; 2468556Sjkh WINDOW *w; 2478208Sjkh 2488317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2498208Sjkh va_start(args, fmt); 2508208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2518208Sjkh va_end(args); 2528208Sjkh use_helpline(NULL); 2538208Sjkh use_helpfile(NULL); 2548556Sjkh w = dupwin(newscr); 2558640Sjkh if (OnVTY) { 2568825Sjkh ioctl(0, VT_RELDISP, 0); /* Switch back */ 2578641Sjkh msgInfo(NULL); 2588640Sjkh } 2598281Sjkh ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1); 2608556Sjkh touchwin(w); 2618556Sjkh wrefresh(w); 2628556Sjkh delwin(w); 2638208Sjkh free(errstr); 2648208Sjkh return ret; 2658208Sjkh} 2668262Sjkh 2678262Sjkh/* Put up a message in an input box and return the value */ 2688262Sjkhchar * 2698262SjkhmsgGetInput(char *buf, char *fmt, ...) 2708262Sjkh{ 2718262Sjkh va_list args; 2728262Sjkh char *errstr; 2738278Sjkh static char input_buffer[256]; 2748262Sjkh int rval; 2758556Sjkh WINDOW *w; 2768262Sjkh 2778317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2788262Sjkh va_start(args, fmt); 2798262Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2808262Sjkh va_end(args); 2818262Sjkh use_helpline(NULL); 2828262Sjkh use_helpfile(NULL); 2838302Sjkh if (buf) 2848302Sjkh strcpy(input_buffer, buf); 2858302Sjkh else 2868302Sjkh input_buffer[0] = '\0'; 2878556Sjkh w = dupwin(newscr); 2888640Sjkh if (OnVTY) { 2898825Sjkh ioctl(0, VT_RELDISP, 0); /* Switch back */ 2908641Sjkh msgInfo(NULL); 2918640Sjkh } 2928262Sjkh rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer); 2938556Sjkh touchwin(w); 2948556Sjkh wrefresh(w); 2958556Sjkh delwin(w); 2968262Sjkh free(errstr); 2978262Sjkh if (!rval) 2988262Sjkh return input_buffer; 2998262Sjkh else 3008262Sjkh return NULL; 3018262Sjkh} 3028262Sjkh 3038347Sjkh/* Write something to the debugging port */ 3048347Sjkhvoid 3058347SjkhmsgDebug(char *fmt, ...) 3068347Sjkh{ 3078347Sjkh va_list args; 3088347Sjkh char *dbg; 3098347Sjkh 3108594Sjkh if (DebugFD == -1) 3118594Sjkh return; 3128347Sjkh dbg = (char *)safe_malloc(FILENAME_MAX); 3138347Sjkh strcpy(dbg, "DEBUG: "); 3148347Sjkh va_start(args, fmt); 3158347Sjkh vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args); 3168347Sjkh va_end(args); 3178347Sjkh write(DebugFD, dbg, strlen(dbg)); 3188347Sjkh free(dbg); 3198347Sjkh} 3208705Sjkh 3218705Sjkh/* Tell the user there's some output to go look at */ 3228705Sjkhvoid 3238705SjkhmsgWeHaveOutput(char *fmt, ...) 3248705Sjkh{ 3258705Sjkh va_list args; 3268705Sjkh char *errstr; 3278705Sjkh 3288705Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 3298705Sjkh va_start(args, fmt); 3308705Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 3318705Sjkh va_end(args); 3328705Sjkh use_helpline(NULL); 3338705Sjkh use_helpfile(NULL); 3348705Sjkh msgDebug("Notify: %s\n", errstr); 3358705Sjkh dialog_clear(); 3368705Sjkh dialog_msgbox("Information Dialog", errstr, -1, -1, 0); 3378705Sjkh free(errstr); 3388705Sjkh if (OnVTY) 3398705Sjkh msgInfo("Command output is on debugging screen - type ALT-F2 to see it"); 3408705Sjkh} 341