msg.c revision 54587
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 * 750479Speter * $FreeBSD: head/usr.sbin/sade/msg.c 54587 1999-12-14 04:25:29Z jkh $ 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; 18754587Sjkh WINDOW *w = savescr(); 1888208Sjkh 18915416Sjkh errstr = (char *)alloca(FILENAME_MAX); 1908208Sjkh va_start(args, fmt); 1918208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 1928208Sjkh va_end(args); 1938208Sjkh use_helpline(NULL); 1948208Sjkh use_helpfile(NULL); 1958640Sjkh if (OnVTY) { 1969202Srgrimes ioctl(0, VT_ACTIVATE, 1); 1978641Sjkh msgInfo(NULL); 1988640Sjkh } 1998556Sjkh dialog_notify(errstr); 20054587Sjkh restorescr(w); 2018208Sjkh} 2028208Sjkh 2038302Sjkh/* Put up a message in a popup information box */ 2048302Sjkhvoid 2058302SjkhmsgNotify(char *fmt, ...) 2068302Sjkh{ 2078302Sjkh va_list args; 2088302Sjkh char *errstr; 20954587Sjkh WINDOW *w = savescr(); 2108302Sjkh 21115416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2128302Sjkh va_start(args, fmt); 2138302Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2148302Sjkh va_end(args); 2158302Sjkh use_helpline(NULL); 2168302Sjkh use_helpfile(NULL); 2178837Sjkh if (isDebug()) 2188837Sjkh msgDebug("Notify: %s\n", errstr); 21929628Sjkh dialog_msgbox(NULL, errstr, -1, -1, 0); 22054587Sjkh sleep(1); 22154587Sjkh restorescr(w); 2228302Sjkh} 2238302Sjkh 2248208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */ 2258208Sjkhint 2268208SjkhmsgYesNo(char *fmt, ...) 2278208Sjkh{ 2288208Sjkh va_list args; 2298208Sjkh char *errstr; 2308208Sjkh int ret; 23154587Sjkh WINDOW *w = savescr(); 23254587Sjkh 23315416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2348208Sjkh va_start(args, fmt); 2358208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2368208Sjkh va_end(args); 2378208Sjkh use_helpline(NULL); 2388208Sjkh use_helpfile(NULL); 2398640Sjkh if (OnVTY) { 2409202Srgrimes ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 2418641Sjkh msgInfo(NULL); 2428640Sjkh } 2438281Sjkh ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1); 24454587Sjkh restorescr(w); 2458208Sjkh return ret; 2468208Sjkh} 2478262Sjkh 2488262Sjkh/* Put up a message in an input box and return the value */ 2498262Sjkhchar * 2508262SjkhmsgGetInput(char *buf, char *fmt, ...) 2518262Sjkh{ 2528262Sjkh va_list args; 2538262Sjkh char *errstr; 2548278Sjkh static char input_buffer[256]; 2558262Sjkh int rval; 25654587Sjkh WINDOW *w = savescr(); 2578262Sjkh 25815416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2598262Sjkh va_start(args, fmt); 2608262Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2618262Sjkh va_end(args); 2628262Sjkh use_helpline(NULL); 2638262Sjkh use_helpfile(NULL); 2648302Sjkh if (buf) 26520247Sjkh SAFE_STRCPY(input_buffer, buf); 2668302Sjkh else 2678302Sjkh input_buffer[0] = '\0'; 2688640Sjkh if (OnVTY) { 2699202Srgrimes ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 2708641Sjkh msgInfo(NULL); 2718640Sjkh } 2728262Sjkh rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer); 27354587Sjkh restorescr(w); 2748262Sjkh if (!rval) 2758262Sjkh return input_buffer; 2768262Sjkh else 2778262Sjkh return NULL; 2788262Sjkh} 2798262Sjkh 2808347Sjkh/* Write something to the debugging port */ 2818347Sjkhvoid 2828347SjkhmsgDebug(char *fmt, ...) 2838347Sjkh{ 2848347Sjkh va_list args; 2858347Sjkh char *dbg; 2868347Sjkh 2878594Sjkh if (DebugFD == -1) 2888594Sjkh return; 28915416Sjkh dbg = (char *)alloca(FILENAME_MAX); 2908347Sjkh strcpy(dbg, "DEBUG: "); 2918347Sjkh va_start(args, fmt); 2928347Sjkh vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args); 2938347Sjkh va_end(args); 2948347Sjkh write(DebugFD, dbg, strlen(dbg)); 2958347Sjkh} 2968705Sjkh 2978705Sjkh/* Tell the user there's some output to go look at */ 2988705Sjkhvoid 2998705SjkhmsgWeHaveOutput(char *fmt, ...) 3008705Sjkh{ 3018705Sjkh va_list args; 3028705Sjkh char *errstr; 30354587Sjkh WINDOW *w = savescr(); 30454587Sjkh 30515416Sjkh errstr = (char *)alloca(FILENAME_MAX); 3068705Sjkh va_start(args, fmt); 3078705Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 3088705Sjkh va_end(args); 3098705Sjkh use_helpline(NULL); 3108705Sjkh use_helpfile(NULL); 3118705Sjkh msgDebug("Notify: %s\n", errstr); 31217404Sjkh dialog_clear_norefresh(); 31329628Sjkh dialog_msgbox(NULL, errstr, -1, -1, 0); 31454587Sjkh restorescr(w); 3158705Sjkh} 31612661Speter 31712661Speter/* Simple versions of msgConfirm() and msgNotify() for calling from scripts */ 31812661Speterint 31912661SpetermsgSimpleConfirm(char *str) 32012661Speter{ 32112661Speter msgConfirm(str); 32215242Sjkh return DITEM_SUCCESS; 32312661Speter} 32412661Speter 32512661Speterint 32612661SpetermsgSimpleNotify(char *str) 32712661Speter{ 32812661Speter msgNotify(str); 32915242Sjkh return DITEM_SUCCESS; 33012661Speter} 331