msg.c revision 15416
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 * 715416Sjkh * $Id: msg.c,v 1.31 1996/04/13 13:32:02 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 428702Sjkh#define VTY_STATLINE 24 438702Sjkh#define TTY_STATLINE 23 448702Sjkh 458837SjkhBoolean 468837SjkhisDebug(void) 478837Sjkh{ 4812661Speter char *cp; 4912661Speter 5012661Speter return (cp = variable_get(VAR_DEBUG)) && strcmp(cp, "no"); 518837Sjkh} 528837Sjkh 538262Sjkh/* Whack up an informational message on the status line, in stand-out */ 548262Sjkhvoid 558262SjkhmsgYap(char *fmt, ...) 568262Sjkh{ 578262Sjkh va_list args; 588262Sjkh char *errstr; 598262Sjkh int attrs; 608262Sjkh 6115416Sjkh errstr = (char *)alloca(FILENAME_MAX); 628262Sjkh va_start(args, fmt); 638347Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 648262Sjkh va_end(args); 658262Sjkh attrs = getattrs(stdscr); 668314Sjkh attrset(A_REVERSE); 678702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 688262Sjkh attrset(attrs); 698262Sjkh refresh(); 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 } 9015416Sjkh errstr = (char *)alloca(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) { 1088837Sjkh if (isDebug()) 1098837Sjkh msgDebug("Information: `%s'\n", errstr); 1108641Sjkh msgInfo(NULL); 1118640Sjkh } 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 12215416Sjkh errstr = (char *)alloca(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(); 1338837Sjkh if (OnVTY && isDebug()) 1348628Sjkh msgDebug("Warning message `%s'\n", errstr); 1358097Sjkh} 1368097Sjkh 1378097Sjkh/* Whack up an error on the status line */ 1388097Sjkhvoid 1398097SjkhmsgError(char *fmt, ...) 1408097Sjkh{ 1418097Sjkh va_list args; 1428097Sjkh char *errstr; 1438262Sjkh int attrs; 1448097Sjkh 14515416Sjkh errstr = (char *)alloca(FILENAME_MAX); 1468097Sjkh strcpy(errstr, "Error: "); 1478097Sjkh va_start(args, fmt); 1488097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1498097Sjkh va_end(args); 1508097Sjkh beep(); 1518262Sjkh attrs = getattrs(stdscr); 1528314Sjkh attrset(A_REVERSE); 1538702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 1548262Sjkh attrset(attrs); 1558262Sjkh refresh(); 1568837Sjkh if (OnVTY && isDebug()) 1578628Sjkh msgDebug("Error message `%s'\n", errstr); 1588097Sjkh} 1598097Sjkh 1608097Sjkh/* Whack up a fatal error on the status line */ 1618097Sjkhvoid 1628097SjkhmsgFatal(char *fmt, ...) 1638097Sjkh{ 1648097Sjkh va_list args; 1658097Sjkh char *errstr; 1668262Sjkh int attrs; 1678097Sjkh 16815416Sjkh errstr = (char *)alloca(FILENAME_MAX); 1698097Sjkh strcpy(errstr, "Fatal Error: "); 1708097Sjkh va_start(args, fmt); 1718097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1728097Sjkh va_end(args); 1738097Sjkh beep(); 1748262Sjkh attrs = getattrs(stdscr); 1758314Sjkh attrset(A_REVERSE); 1768702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 1778097Sjkh addstr(" - "); 1788097Sjkh addstr("PRESS ANY KEY TO "); 1798097Sjkh if (getpid() == 1) 1808097Sjkh addstr("REBOOT"); 1818097Sjkh else 1828097Sjkh addstr("QUIT"); 1838262Sjkh attrset(attrs); 1848262Sjkh refresh(); 1858628Sjkh if (OnVTY) 1868628Sjkh msgDebug("Fatal error `%s'!\n", errstr); 1878097Sjkh getch(); 1888097Sjkh systemShutdown(); 1898097Sjkh} 1908097Sjkh 1918208Sjkh/* Put up a message in a popup confirmation box */ 1928208Sjkhvoid 1938208SjkhmsgConfirm(char *fmt, ...) 1948208Sjkh{ 1958208Sjkh va_list args; 1968208Sjkh char *errstr; 1978649Sjkh WINDOW *w; 1988208Sjkh 19915416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2008208Sjkh va_start(args, fmt); 2018208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2028208Sjkh va_end(args); 2038208Sjkh use_helpline(NULL); 2048208Sjkh use_helpfile(NULL); 20515242Sjkh w = savescr(); 2068640Sjkh if (OnVTY) { 20712661Speter msgDebug("Switching back to VTY1\n"); 2089202Srgrimes ioctl(0, VT_ACTIVATE, 1); 2098641Sjkh msgInfo(NULL); 2108640Sjkh } 2118556Sjkh dialog_notify(errstr); 21215242Sjkh restorescr(w); 2138208Sjkh} 2148208Sjkh 2158302Sjkh/* Put up a message in a popup information box */ 2168302Sjkhvoid 2178302SjkhmsgNotify(char *fmt, ...) 2188302Sjkh{ 2198302Sjkh va_list args; 2208302Sjkh char *errstr; 2218302Sjkh 22215416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2238302Sjkh va_start(args, fmt); 2248302Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2258302Sjkh va_end(args); 2268302Sjkh use_helpline(NULL); 2278302Sjkh use_helpfile(NULL); 2288837Sjkh if (isDebug()) 2298837Sjkh msgDebug("Notify: %s\n", errstr); 2308649Sjkh dialog_clear(); 2318438Sjkh dialog_msgbox("Information Dialog", errstr, -1, -1, 0); 2328302Sjkh} 2338302Sjkh 2348208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */ 2358208Sjkhint 2368208SjkhmsgYesNo(char *fmt, ...) 2378208Sjkh{ 2388208Sjkh va_list args; 2398208Sjkh char *errstr; 2408208Sjkh int ret; 2418556Sjkh WINDOW *w; 2428208Sjkh 24315416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2448208Sjkh va_start(args, fmt); 2458208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2468208Sjkh va_end(args); 2478208Sjkh use_helpline(NULL); 2488208Sjkh use_helpfile(NULL); 24915242Sjkh w = savescr(); 2508640Sjkh if (OnVTY) { 25112661Speter msgDebug("Switching back to VTY1\n"); 2529202Srgrimes ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 2538641Sjkh msgInfo(NULL); 2548640Sjkh } 2558281Sjkh ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1); 25615242Sjkh restorescr(w); 2578208Sjkh return ret; 2588208Sjkh} 2598262Sjkh 2608262Sjkh/* Put up a message in an input box and return the value */ 2618262Sjkhchar * 2628262SjkhmsgGetInput(char *buf, char *fmt, ...) 2638262Sjkh{ 2648262Sjkh va_list args; 2658262Sjkh char *errstr; 2668278Sjkh static char input_buffer[256]; 2678262Sjkh int rval; 2688556Sjkh WINDOW *w; 2698262Sjkh 27015416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2718262Sjkh va_start(args, fmt); 2728262Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2738262Sjkh va_end(args); 2748262Sjkh use_helpline(NULL); 2758262Sjkh use_helpfile(NULL); 2768302Sjkh if (buf) 2778302Sjkh strcpy(input_buffer, buf); 2788302Sjkh else 2798302Sjkh input_buffer[0] = '\0'; 28015242Sjkh w = savescr(); 2818640Sjkh if (OnVTY) { 28212661Speter msgDebug("Switching back to VTY1\n"); 2839202Srgrimes ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 2848641Sjkh msgInfo(NULL); 2858640Sjkh } 2868262Sjkh rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer); 28715242Sjkh restorescr(w); 2888262Sjkh if (!rval) 2898262Sjkh return input_buffer; 2908262Sjkh else 2918262Sjkh return NULL; 2928262Sjkh} 2938262Sjkh 2948347Sjkh/* Write something to the debugging port */ 2958347Sjkhvoid 2968347SjkhmsgDebug(char *fmt, ...) 2978347Sjkh{ 2988347Sjkh va_list args; 2998347Sjkh char *dbg; 3008347Sjkh 3018594Sjkh if (DebugFD == -1) 3028594Sjkh return; 30315416Sjkh dbg = (char *)alloca(FILENAME_MAX); 3048347Sjkh strcpy(dbg, "DEBUG: "); 3058347Sjkh va_start(args, fmt); 3068347Sjkh vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args); 3078347Sjkh va_end(args); 3088347Sjkh write(DebugFD, dbg, strlen(dbg)); 3098347Sjkh} 3108705Sjkh 3118705Sjkh/* Tell the user there's some output to go look at */ 3128705Sjkhvoid 3138705SjkhmsgWeHaveOutput(char *fmt, ...) 3148705Sjkh{ 3158705Sjkh va_list args; 3168705Sjkh char *errstr; 3178705Sjkh 31815416Sjkh errstr = (char *)alloca(FILENAME_MAX); 3198705Sjkh va_start(args, fmt); 3208705Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 3218705Sjkh va_end(args); 3228705Sjkh use_helpline(NULL); 3238705Sjkh use_helpfile(NULL); 3248705Sjkh msgDebug("Notify: %s\n", errstr); 3258705Sjkh dialog_clear(); 3268705Sjkh dialog_msgbox("Information Dialog", errstr, -1, -1, 0); 3278705Sjkh if (OnVTY) 32812661Speter msgInfo("Command output is on VTY2 - type ALT-F2 to see it"); 3298705Sjkh} 33012661Speter 33112661Speter/* Simple versions of msgConfirm() and msgNotify() for calling from scripts */ 33212661Speterint 33312661SpetermsgSimpleConfirm(char *str) 33412661Speter{ 33512661Speter msgConfirm(str); 33615242Sjkh return DITEM_SUCCESS; 33712661Speter} 33812661Speter 33912661Speterint 34012661SpetermsgSimpleNotify(char *str) 34112661Speter{ 34212661Speter msgNotify(str); 34315242Sjkh return DITEM_SUCCESS; 34412661Speter} 345