msg.c revision 29628
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 * 729628Sjkh * $Id: msg.c,v 1.46 1997/09/09 16:27:50 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 168881Srgrimes * notice, this list of conditions and the following disclaimer, 178881Srgrimes * 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 * 238097Sjkh * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND 248097Sjkh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 258097Sjkh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 268097Sjkh * ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE 278097Sjkh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 288097Sjkh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 298097Sjkh * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) 308097Sjkh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 318097Sjkh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 328097Sjkh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 338097Sjkh * SUCH DAMAGE. 348097Sjkh * 358097Sjkh */ 368097Sjkh 378097Sjkh#include "sysinstall.h" 388097Sjkh#include <stdarg.h> 398825Sjkh#include <sys/ioctl.h> 408825Sjkh#include <machine/console.h> 418097Sjkh 428837SjkhBoolean 438837SjkhisDebug(void) 448837Sjkh{ 4512661Speter char *cp; 4612661Speter 4712661Speter return (cp = variable_get(VAR_DEBUG)) && strcmp(cp, "no"); 488837Sjkh} 498837Sjkh 508262Sjkh/* Whack up an informational message on the status line, in stand-out */ 518262Sjkhvoid 528262SjkhmsgYap(char *fmt, ...) 538262Sjkh{ 548262Sjkh va_list args; 558262Sjkh char *errstr; 568262Sjkh int attrs; 578262Sjkh 5815416Sjkh errstr = (char *)alloca(FILENAME_MAX); 598262Sjkh va_start(args, fmt); 608347Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 618262Sjkh va_end(args); 628262Sjkh attrs = getattrs(stdscr); 638314Sjkh attrset(A_REVERSE); 6417375Sjkh mvaddstr(StatusLine, 0, errstr); 658262Sjkh attrset(attrs); 668262Sjkh refresh(); 678262Sjkh} 688262Sjkh 698097Sjkh/* Whack up an informational message on the status line */ 708097Sjkhvoid 718097SjkhmsgInfo(char *fmt, ...) 728097Sjkh{ 738097Sjkh va_list args; 748097Sjkh char *errstr; 758705Sjkh int i, attrs; 768705Sjkh char line[81]; 778097Sjkh 788705Sjkh attrs = getattrs(stdscr); 798641Sjkh /* NULL is a special convention meaning "erase the old stuff" */ 808641Sjkh if (!fmt) { 8117375Sjkh move(StatusLine, 0); 828641Sjkh clrtoeol(); 838641Sjkh return; 848641Sjkh } 8515416Sjkh errstr = (char *)alloca(FILENAME_MAX); 868097Sjkh va_start(args, fmt); 878347Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 888097Sjkh va_end(args); 898705Sjkh memset(line, ' ', 80); 908705Sjkh for (i = 0; i < 80; i++) { 918705Sjkh if (errstr[i]) 928705Sjkh line[i] = errstr[i]; 938705Sjkh else 948705Sjkh break; 958705Sjkh } 968705Sjkh line[80] = '\0'; 9716366Sjkh attrset(ATTR_TITLE); 9817375Sjkh mvaddstr(StatusLine, 0, line); 998262Sjkh attrset(attrs); 10017375Sjkh move(StatusLine, 79); 1018262Sjkh refresh(); 1028097Sjkh} 1038097Sjkh 1048097Sjkh/* Whack up a warning on the status line */ 1058097Sjkhvoid 1068097SjkhmsgWarn(char *fmt, ...) 1078097Sjkh{ 1088097Sjkh va_list args; 1098097Sjkh char *errstr; 1108262Sjkh int attrs; 1118097Sjkh 11215416Sjkh errstr = (char *)alloca(FILENAME_MAX); 1138097Sjkh strcpy(errstr, "Warning: "); 1148097Sjkh va_start(args, fmt); 1158097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1168097Sjkh va_end(args); 1178262Sjkh attrs = getattrs(stdscr); 1188097Sjkh beep(); 11916366Sjkh attrset(ATTR_TITLE); 12017375Sjkh mvaddstr(StatusLine, 0, errstr); 1218262Sjkh attrset(attrs); 1228262Sjkh refresh(); 1238837Sjkh if (OnVTY && isDebug()) 1248628Sjkh msgDebug("Warning message `%s'\n", errstr); 1258097Sjkh} 1268097Sjkh 1278097Sjkh/* Whack up an error on the status line */ 1288097Sjkhvoid 1298097SjkhmsgError(char *fmt, ...) 1308097Sjkh{ 1318097Sjkh va_list args; 1328097Sjkh char *errstr; 1338262Sjkh int attrs; 1348097Sjkh 13515416Sjkh errstr = (char *)alloca(FILENAME_MAX); 1368097Sjkh strcpy(errstr, "Error: "); 1378097Sjkh va_start(args, fmt); 1388097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1398097Sjkh va_end(args); 1408097Sjkh beep(); 1418262Sjkh attrs = getattrs(stdscr); 14216366Sjkh attrset(ATTR_TITLE); 14317375Sjkh mvaddstr(StatusLine, 0, errstr); 1448262Sjkh attrset(attrs); 1458262Sjkh refresh(); 1468837Sjkh if (OnVTY && isDebug()) 1478628Sjkh msgDebug("Error message `%s'\n", errstr); 1488097Sjkh} 1498097Sjkh 1508097Sjkh/* Whack up a fatal error on the status line */ 1518097Sjkhvoid 1528097SjkhmsgFatal(char *fmt, ...) 1538097Sjkh{ 1548097Sjkh va_list args; 1558097Sjkh char *errstr; 1568262Sjkh int attrs; 1578097Sjkh 15815416Sjkh errstr = (char *)alloca(FILENAME_MAX); 1598097Sjkh strcpy(errstr, "Fatal Error: "); 1608097Sjkh va_start(args, fmt); 1618097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1628097Sjkh va_end(args); 1638097Sjkh beep(); 1648262Sjkh attrs = getattrs(stdscr); 16516366Sjkh attrset(ATTR_TITLE); 16617375Sjkh mvaddstr(StatusLine, 0, errstr); 1678097Sjkh addstr(" - "); 1688097Sjkh addstr("PRESS ANY KEY TO "); 1698097Sjkh if (getpid() == 1) 1708097Sjkh addstr("REBOOT"); 1718097Sjkh else 1728097Sjkh addstr("QUIT"); 1738262Sjkh attrset(attrs); 1748262Sjkh refresh(); 1758628Sjkh if (OnVTY) 1768628Sjkh msgDebug("Fatal error `%s'!\n", errstr); 1778097Sjkh getch(); 17815788Sjkh systemShutdown(1); 1798097Sjkh} 1808097Sjkh 1818208Sjkh/* Put up a message in a popup confirmation box */ 1828208Sjkhvoid 1838208SjkhmsgConfirm(char *fmt, ...) 1848208Sjkh{ 1858208Sjkh va_list args; 1868208Sjkh char *errstr; 1878208Sjkh 18815416Sjkh errstr = (char *)alloca(FILENAME_MAX); 1898208Sjkh va_start(args, fmt); 1908208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 1918208Sjkh va_end(args); 1928208Sjkh use_helpline(NULL); 1938208Sjkh use_helpfile(NULL); 1948640Sjkh if (OnVTY) { 1959202Srgrimes ioctl(0, VT_ACTIVATE, 1); 1968641Sjkh msgInfo(NULL); 1978640Sjkh } 1988556Sjkh dialog_notify(errstr); 1998208Sjkh} 2008208Sjkh 2018302Sjkh/* Put up a message in a popup information box */ 2028302Sjkhvoid 2038302SjkhmsgNotify(char *fmt, ...) 2048302Sjkh{ 2058302Sjkh va_list args; 2068302Sjkh char *errstr; 2078302Sjkh 20815416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2098302Sjkh va_start(args, fmt); 2108302Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2118302Sjkh va_end(args); 2128302Sjkh use_helpline(NULL); 2138302Sjkh use_helpfile(NULL); 2148837Sjkh if (isDebug()) 2158837Sjkh msgDebug("Notify: %s\n", errstr); 21617404Sjkh dialog_clear_norefresh(); 21729628Sjkh dialog_msgbox(NULL, errstr, -1, -1, 0); 2188302Sjkh} 2198302Sjkh 2208208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */ 2218208Sjkhint 2228208SjkhmsgYesNo(char *fmt, ...) 2238208Sjkh{ 2248208Sjkh va_list args; 2258208Sjkh char *errstr; 2268208Sjkh int ret; 2278208Sjkh 22815416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2298208Sjkh va_start(args, fmt); 2308208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2318208Sjkh va_end(args); 2328208Sjkh use_helpline(NULL); 2338208Sjkh use_helpfile(NULL); 2348640Sjkh if (OnVTY) { 2359202Srgrimes ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 2368641Sjkh msgInfo(NULL); 2378640Sjkh } 2388281Sjkh ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1); 2398208Sjkh return ret; 2408208Sjkh} 2418262Sjkh 2428262Sjkh/* Put up a message in an input box and return the value */ 2438262Sjkhchar * 2448262SjkhmsgGetInput(char *buf, char *fmt, ...) 2458262Sjkh{ 2468262Sjkh va_list args; 2478262Sjkh char *errstr; 2488278Sjkh static char input_buffer[256]; 2498262Sjkh int rval; 2508262Sjkh 25115416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2528262Sjkh va_start(args, fmt); 2538262Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2548262Sjkh va_end(args); 2558262Sjkh use_helpline(NULL); 2568262Sjkh use_helpfile(NULL); 2578302Sjkh if (buf) 25820247Sjkh SAFE_STRCPY(input_buffer, buf); 2598302Sjkh else 2608302Sjkh input_buffer[0] = '\0'; 2618640Sjkh if (OnVTY) { 2629202Srgrimes ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 2638641Sjkh msgInfo(NULL); 2648640Sjkh } 2658262Sjkh rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer); 2668262Sjkh if (!rval) 2678262Sjkh return input_buffer; 2688262Sjkh else 2698262Sjkh return NULL; 2708262Sjkh} 2718262Sjkh 2728347Sjkh/* Write something to the debugging port */ 2738347Sjkhvoid 2748347SjkhmsgDebug(char *fmt, ...) 2758347Sjkh{ 2768347Sjkh va_list args; 2778347Sjkh char *dbg; 2788347Sjkh 2798594Sjkh if (DebugFD == -1) 2808594Sjkh return; 28115416Sjkh dbg = (char *)alloca(FILENAME_MAX); 2828347Sjkh strcpy(dbg, "DEBUG: "); 2838347Sjkh va_start(args, fmt); 2848347Sjkh vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args); 2858347Sjkh va_end(args); 2868347Sjkh write(DebugFD, dbg, strlen(dbg)); 2878347Sjkh} 2888705Sjkh 2898705Sjkh/* Tell the user there's some output to go look at */ 2908705Sjkhvoid 2918705SjkhmsgWeHaveOutput(char *fmt, ...) 2928705Sjkh{ 2938705Sjkh va_list args; 2948705Sjkh char *errstr; 2958705Sjkh 29615416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2978705Sjkh va_start(args, fmt); 2988705Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2998705Sjkh va_end(args); 3008705Sjkh use_helpline(NULL); 3018705Sjkh use_helpfile(NULL); 3028705Sjkh msgDebug("Notify: %s\n", errstr); 30317404Sjkh dialog_clear_norefresh(); 30429628Sjkh dialog_msgbox(NULL, errstr, -1, -1, 0); 3058705Sjkh} 30612661Speter 30712661Speter/* Simple versions of msgConfirm() and msgNotify() for calling from scripts */ 30812661Speterint 30912661SpetermsgSimpleConfirm(char *str) 31012661Speter{ 31112661Speter msgConfirm(str); 31215242Sjkh return DITEM_SUCCESS; 31312661Speter} 31412661Speter 31512661Speterint 31612661SpetermsgSimpleNotify(char *str) 31712661Speter{ 31812661Speter msgNotify(str); 31915242Sjkh return DITEM_SUCCESS; 32012661Speter} 321