msg.c revision 8658
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 * 78658Sphk * $Id: msg.c,v 1.20 1995/05/20 14:05:31 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> 468097Sjkh 478262Sjkh/* Whack up an informational message on the status line, in stand-out */ 488262Sjkhvoid 498262SjkhmsgYap(char *fmt, ...) 508262Sjkh{ 518262Sjkh va_list args; 528262Sjkh char *errstr; 538262Sjkh int attrs; 548262Sjkh 558317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 568262Sjkh va_start(args, fmt); 578347Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 588262Sjkh va_end(args); 598262Sjkh attrs = getattrs(stdscr); 608314Sjkh attrset(A_REVERSE); 618262Sjkh mvaddstr(23, 0, errstr); 628262Sjkh attrset(attrs); 638262Sjkh refresh(); 648262Sjkh free(errstr); 658262Sjkh} 668262Sjkh 678097Sjkh/* Whack up an informational message on the status line */ 688097Sjkhvoid 698097SjkhmsgInfo(char *fmt, ...) 708097Sjkh{ 718097Sjkh va_list args; 728097Sjkh char *errstr; 738262Sjkh int attrs; 748097Sjkh 758641Sjkh /* NULL is a special convention meaning "erase the old stuff" */ 768641Sjkh if (!fmt) { 778641Sjkh move(23, 0); 788641Sjkh clrtoeol(); 798641Sjkh return; 808641Sjkh } 818317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 828097Sjkh va_start(args, fmt); 838347Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 848097Sjkh va_end(args); 858262Sjkh attrs = getattrs(stdscr); 868262Sjkh attrset(A_NORMAL); 878262Sjkh mvaddstr(23, 0, errstr); 888262Sjkh attrset(attrs); 898262Sjkh refresh(); 908640Sjkh if (OnVTY) { 918658Sphk msgDebug("Information: `%s'\n", errstr); 928641Sjkh msgInfo(NULL); 938640Sjkh } 948097Sjkh free(errstr); 958097Sjkh} 968097Sjkh 978097Sjkh/* Whack up a warning on the status line */ 988097Sjkhvoid 998097SjkhmsgWarn(char *fmt, ...) 1008097Sjkh{ 1018097Sjkh va_list args; 1028097Sjkh char *errstr; 1038262Sjkh int attrs; 1048097Sjkh 1058317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1068097Sjkh strcpy(errstr, "Warning: "); 1078097Sjkh va_start(args, fmt); 1088097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1098097Sjkh va_end(args); 1108262Sjkh attrs = getattrs(stdscr); 1118097Sjkh beep(); 1128314Sjkh attrset(A_REVERSE); 1138262Sjkh mvaddstr(23, 0, errstr); 1148262Sjkh attrset(attrs); 1158262Sjkh refresh(); 1168628Sjkh if (OnVTY) 1178628Sjkh msgDebug("Warning message `%s'\n", errstr); 1188097Sjkh free(errstr); 1198097Sjkh} 1208097Sjkh 1218097Sjkh/* Whack up an error on the status line */ 1228097Sjkhvoid 1238097SjkhmsgError(char *fmt, ...) 1248097Sjkh{ 1258097Sjkh va_list args; 1268097Sjkh char *errstr; 1278262Sjkh int attrs; 1288097Sjkh 1298317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1308097Sjkh strcpy(errstr, "Error: "); 1318097Sjkh va_start(args, fmt); 1328097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1338097Sjkh va_end(args); 1348097Sjkh beep(); 1358262Sjkh attrs = getattrs(stdscr); 1368314Sjkh attrset(A_REVERSE); 1378262Sjkh mvaddstr(23, 0, errstr); 1388262Sjkh attrset(attrs); 1398262Sjkh refresh(); 1408628Sjkh if (OnVTY) 1418628Sjkh msgDebug("Error message `%s'\n", errstr); 1428097Sjkh free(errstr); 1438097Sjkh} 1448097Sjkh 1458097Sjkh/* Whack up a fatal error on the status line */ 1468097Sjkhvoid 1478097SjkhmsgFatal(char *fmt, ...) 1488097Sjkh{ 1498097Sjkh va_list args; 1508097Sjkh char *errstr; 1518262Sjkh int attrs; 1528097Sjkh 1538317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1548097Sjkh strcpy(errstr, "Fatal Error: "); 1558097Sjkh va_start(args, fmt); 1568097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1578097Sjkh va_end(args); 1588097Sjkh beep(); 1598262Sjkh attrs = getattrs(stdscr); 1608314Sjkh attrset(A_REVERSE); 1618262Sjkh mvaddstr(23, 0, errstr); 1628097Sjkh addstr(" - "); 1638097Sjkh addstr("PRESS ANY KEY TO "); 1648097Sjkh if (getpid() == 1) 1658097Sjkh addstr("REBOOT"); 1668097Sjkh else 1678097Sjkh addstr("QUIT"); 1688262Sjkh attrset(attrs); 1698262Sjkh refresh(); 1708628Sjkh if (OnVTY) 1718628Sjkh msgDebug("Fatal error `%s'!\n", errstr); 1728097Sjkh free(errstr); 1738097Sjkh getch(); 1748097Sjkh systemShutdown(); 1758097Sjkh} 1768097Sjkh 1778208Sjkh/* Put up a message in a popup confirmation box */ 1788208Sjkhvoid 1798208SjkhmsgConfirm(char *fmt, ...) 1808208Sjkh{ 1818208Sjkh va_list args; 1828208Sjkh char *errstr; 1838649Sjkh WINDOW *w; 1848208Sjkh 1858317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1868208Sjkh va_start(args, fmt); 1878208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 1888208Sjkh va_end(args); 1898208Sjkh use_helpline(NULL); 1908208Sjkh use_helpfile(NULL); 1918649Sjkh w = dupwin(newscr); 1928640Sjkh if (OnVTY) { 1938628Sjkh msgDebug("User confirmation requested (type ALT-F1)\n"); 1948641Sjkh msgInfo(NULL); 1958640Sjkh } 1968556Sjkh dialog_notify(errstr); 1978649Sjkh touchwin(w); 1988649Sjkh wrefresh(w); 1998649Sjkh delwin(w); 2008208Sjkh free(errstr); 2018208Sjkh} 2028208Sjkh 2038302Sjkh/* Put up a message in a popup information box */ 2048302Sjkhvoid 2058302SjkhmsgNotify(char *fmt, ...) 2068302Sjkh{ 2078302Sjkh va_list args; 2088302Sjkh char *errstr; 2098302Sjkh 2108317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2118302Sjkh va_start(args, fmt); 2128302Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2138302Sjkh va_end(args); 2148302Sjkh use_helpline(NULL); 2158302Sjkh use_helpfile(NULL); 2168628Sjkh msgDebug("Notify: %s\n", errstr); 2178649Sjkh dialog_clear(); 2188438Sjkh dialog_msgbox("Information Dialog", errstr, -1, -1, 0); 2198302Sjkh free(errstr); 2208302Sjkh} 2218302Sjkh 2228208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */ 2238208Sjkhint 2248208SjkhmsgYesNo(char *fmt, ...) 2258208Sjkh{ 2268208Sjkh va_list args; 2278208Sjkh char *errstr; 2288208Sjkh int ret; 2298556Sjkh WINDOW *w; 2308208Sjkh 2318317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2328208Sjkh va_start(args, fmt); 2338208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2348208Sjkh va_end(args); 2358208Sjkh use_helpline(NULL); 2368208Sjkh use_helpfile(NULL); 2378556Sjkh w = dupwin(newscr); 2388640Sjkh if (OnVTY) { 2398628Sjkh msgDebug("User decision requested (type ALT-F1)\n"); 2408641Sjkh msgInfo(NULL); 2418640Sjkh } 2428281Sjkh ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1); 2438556Sjkh touchwin(w); 2448556Sjkh wrefresh(w); 2458556Sjkh delwin(w); 2468208Sjkh free(errstr); 2478208Sjkh return ret; 2488208Sjkh} 2498262Sjkh 2508262Sjkh/* Put up a message in an input box and return the value */ 2518262Sjkhchar * 2528262SjkhmsgGetInput(char *buf, char *fmt, ...) 2538262Sjkh{ 2548262Sjkh va_list args; 2558262Sjkh char *errstr; 2568278Sjkh static char input_buffer[256]; 2578262Sjkh int rval; 2588556Sjkh WINDOW *w; 2598262Sjkh 2608317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2618262Sjkh va_start(args, fmt); 2628262Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2638262Sjkh va_end(args); 2648262Sjkh use_helpline(NULL); 2658262Sjkh use_helpfile(NULL); 2668302Sjkh if (buf) 2678302Sjkh strcpy(input_buffer, buf); 2688302Sjkh else 2698302Sjkh input_buffer[0] = '\0'; 2708556Sjkh w = dupwin(newscr); 2718640Sjkh if (OnVTY) { 2728628Sjkh msgDebug("User input requested (type ALT-F1)\n"); 2738641Sjkh msgInfo(NULL); 2748640Sjkh } 2758262Sjkh rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer); 2768556Sjkh touchwin(w); 2778556Sjkh wrefresh(w); 2788556Sjkh delwin(w); 2798262Sjkh free(errstr); 2808262Sjkh if (!rval) 2818262Sjkh return input_buffer; 2828262Sjkh else 2838262Sjkh return NULL; 2848262Sjkh} 2858262Sjkh 2868347Sjkh/* Write something to the debugging port */ 2878347Sjkhvoid 2888347SjkhmsgDebug(char *fmt, ...) 2898347Sjkh{ 2908347Sjkh va_list args; 2918347Sjkh char *dbg; 2928347Sjkh 2938594Sjkh if (DebugFD == -1) 2948594Sjkh return; 2958347Sjkh dbg = (char *)safe_malloc(FILENAME_MAX); 2968347Sjkh strcpy(dbg, "DEBUG: "); 2978347Sjkh va_start(args, fmt); 2988347Sjkh vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args); 2998347Sjkh va_end(args); 3008347Sjkh write(DebugFD, dbg, strlen(dbg)); 3018347Sjkh free(dbg); 3028347Sjkh} 303