msg.c revision 15242
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 * 715242Sjkh * $Id: msg.c,v 1.30 1995/12/07 10:34:09 peter 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 618317Sjkh errstr = (char *)safe_malloc(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 free(errstr); 718262Sjkh} 728262Sjkh 738097Sjkh/* Whack up an informational message on the status line */ 748097Sjkhvoid 758097SjkhmsgInfo(char *fmt, ...) 768097Sjkh{ 778097Sjkh va_list args; 788097Sjkh char *errstr; 798705Sjkh int i, attrs; 808705Sjkh char line[81]; 818097Sjkh 828705Sjkh attrs = getattrs(stdscr); 838641Sjkh /* NULL is a special convention meaning "erase the old stuff" */ 848641Sjkh if (!fmt) { 858702Sjkh move(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0); 868705Sjkh attrset(A_REVERSE); 878641Sjkh clrtoeol(); 888705Sjkh attrset(attrs); 898641Sjkh return; 908641Sjkh } 918317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 928097Sjkh va_start(args, fmt); 938347Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 948097Sjkh va_end(args); 958705Sjkh memset(line, ' ', 80); 968705Sjkh for (i = 0; i < 80; i++) { 978705Sjkh if (errstr[i]) 988705Sjkh line[i] = errstr[i]; 998705Sjkh else 1008705Sjkh break; 1018705Sjkh } 1028705Sjkh line[80] = '\0'; 1038705Sjkh attrset(A_REVERSE); 1048705Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, line); 1058262Sjkh attrset(attrs); 1068722Sjkh move(OnVTY ? VTY_STATLINE : TTY_STATLINE, 79); 1078262Sjkh refresh(); 1088640Sjkh if (OnVTY) { 1098837Sjkh if (isDebug()) 1108837Sjkh msgDebug("Information: `%s'\n", errstr); 1118641Sjkh msgInfo(NULL); 1128640Sjkh } 1138097Sjkh free(errstr); 1148097Sjkh} 1158097Sjkh 1168097Sjkh/* Whack up a warning on the status line */ 1178097Sjkhvoid 1188097SjkhmsgWarn(char *fmt, ...) 1198097Sjkh{ 1208097Sjkh va_list args; 1218097Sjkh char *errstr; 1228262Sjkh int attrs; 1238097Sjkh 1248317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1258097Sjkh strcpy(errstr, "Warning: "); 1268097Sjkh va_start(args, fmt); 1278097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1288097Sjkh va_end(args); 1298262Sjkh attrs = getattrs(stdscr); 1308097Sjkh beep(); 1318314Sjkh attrset(A_REVERSE); 1328702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 1338262Sjkh attrset(attrs); 1348262Sjkh refresh(); 1358837Sjkh if (OnVTY && isDebug()) 1368628Sjkh msgDebug("Warning message `%s'\n", errstr); 1378097Sjkh free(errstr); 1388097Sjkh} 1398097Sjkh 1408097Sjkh/* Whack up an error on the status line */ 1418097Sjkhvoid 1428097SjkhmsgError(char *fmt, ...) 1438097Sjkh{ 1448097Sjkh va_list args; 1458097Sjkh char *errstr; 1468262Sjkh int attrs; 1478097Sjkh 1488317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1498097Sjkh strcpy(errstr, "Error: "); 1508097Sjkh va_start(args, fmt); 1518097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1528097Sjkh va_end(args); 1538097Sjkh beep(); 1548262Sjkh attrs = getattrs(stdscr); 1558314Sjkh attrset(A_REVERSE); 1568702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 1578262Sjkh attrset(attrs); 1588262Sjkh refresh(); 1598837Sjkh if (OnVTY && isDebug()) 1608628Sjkh msgDebug("Error message `%s'\n", errstr); 1618097Sjkh free(errstr); 1628097Sjkh} 1638097Sjkh 1648097Sjkh/* Whack up a fatal error on the status line */ 1658097Sjkhvoid 1668097SjkhmsgFatal(char *fmt, ...) 1678097Sjkh{ 1688097Sjkh va_list args; 1698097Sjkh char *errstr; 1708262Sjkh int attrs; 1718097Sjkh 1728317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1738097Sjkh strcpy(errstr, "Fatal Error: "); 1748097Sjkh va_start(args, fmt); 1758097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1768097Sjkh va_end(args); 1778097Sjkh beep(); 1788262Sjkh attrs = getattrs(stdscr); 1798314Sjkh attrset(A_REVERSE); 1808702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 1818097Sjkh addstr(" - "); 1828097Sjkh addstr("PRESS ANY KEY TO "); 1838097Sjkh if (getpid() == 1) 1848097Sjkh addstr("REBOOT"); 1858097Sjkh else 1868097Sjkh addstr("QUIT"); 1878262Sjkh attrset(attrs); 1888262Sjkh refresh(); 1898628Sjkh if (OnVTY) 1908628Sjkh msgDebug("Fatal error `%s'!\n", errstr); 1918097Sjkh free(errstr); 1928097Sjkh getch(); 1938097Sjkh systemShutdown(); 1948097Sjkh} 1958097Sjkh 1968208Sjkh/* Put up a message in a popup confirmation box */ 1978208Sjkhvoid 1988208SjkhmsgConfirm(char *fmt, ...) 1998208Sjkh{ 2008208Sjkh va_list args; 2018208Sjkh char *errstr; 2028649Sjkh WINDOW *w; 2038208Sjkh 2048317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2058208Sjkh va_start(args, fmt); 2068208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2078208Sjkh va_end(args); 2088208Sjkh use_helpline(NULL); 2098208Sjkh use_helpfile(NULL); 21015242Sjkh w = savescr(); 2118640Sjkh if (OnVTY) { 21212661Speter msgDebug("Switching back to VTY1\n"); 2139202Srgrimes ioctl(0, VT_ACTIVATE, 1); 2148641Sjkh msgInfo(NULL); 2158640Sjkh } 2168556Sjkh dialog_notify(errstr); 21715242Sjkh restorescr(w); 2188208Sjkh free(errstr); 2198208Sjkh} 2208208Sjkh 2218302Sjkh/* Put up a message in a popup information box */ 2228302Sjkhvoid 2238302SjkhmsgNotify(char *fmt, ...) 2248302Sjkh{ 2258302Sjkh va_list args; 2268302Sjkh char *errstr; 2278302Sjkh 2288317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2298302Sjkh va_start(args, fmt); 2308302Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2318302Sjkh va_end(args); 2328302Sjkh use_helpline(NULL); 2338302Sjkh use_helpfile(NULL); 2348837Sjkh if (isDebug()) 2358837Sjkh msgDebug("Notify: %s\n", errstr); 2368649Sjkh dialog_clear(); 2378438Sjkh dialog_msgbox("Information Dialog", errstr, -1, -1, 0); 2388302Sjkh free(errstr); 2398302Sjkh} 2408302Sjkh 2418208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */ 2428208Sjkhint 2438208SjkhmsgYesNo(char *fmt, ...) 2448208Sjkh{ 2458208Sjkh va_list args; 2468208Sjkh char *errstr; 2478208Sjkh int ret; 2488556Sjkh WINDOW *w; 2498208Sjkh 2508317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2518208Sjkh va_start(args, fmt); 2528208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2538208Sjkh va_end(args); 2548208Sjkh use_helpline(NULL); 2558208Sjkh use_helpfile(NULL); 25615242Sjkh w = savescr(); 2578640Sjkh if (OnVTY) { 25812661Speter msgDebug("Switching back to VTY1\n"); 2599202Srgrimes ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 2608641Sjkh msgInfo(NULL); 2618640Sjkh } 2628281Sjkh ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1); 26315242Sjkh restorescr(w); 2648208Sjkh free(errstr); 2658208Sjkh return ret; 2668208Sjkh} 2678262Sjkh 2688262Sjkh/* Put up a message in an input box and return the value */ 2698262Sjkhchar * 2708262SjkhmsgGetInput(char *buf, char *fmt, ...) 2718262Sjkh{ 2728262Sjkh va_list args; 2738262Sjkh char *errstr; 2748278Sjkh static char input_buffer[256]; 2758262Sjkh int rval; 2768556Sjkh WINDOW *w; 2778262Sjkh 2788317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2798262Sjkh va_start(args, fmt); 2808262Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2818262Sjkh va_end(args); 2828262Sjkh use_helpline(NULL); 2838262Sjkh use_helpfile(NULL); 2848302Sjkh if (buf) 2858302Sjkh strcpy(input_buffer, buf); 2868302Sjkh else 2878302Sjkh input_buffer[0] = '\0'; 28815242Sjkh w = savescr(); 2898640Sjkh if (OnVTY) { 29012661Speter msgDebug("Switching back to VTY1\n"); 2919202Srgrimes ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 2928641Sjkh msgInfo(NULL); 2938640Sjkh } 2948262Sjkh rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer); 29515242Sjkh restorescr(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) 33912661Speter msgInfo("Command output is on VTY2 - type ALT-F2 to see it"); 3408705Sjkh} 34112661Speter 34212661Speter/* Simple versions of msgConfirm() and msgNotify() for calling from scripts */ 34312661Speterint 34412661SpetermsgSimpleConfirm(char *str) 34512661Speter{ 34612661Speter msgConfirm(str); 34715242Sjkh return DITEM_SUCCESS; 34812661Speter} 34912661Speter 35012661Speterint 35112661SpetermsgSimpleNotify(char *str) 35212661Speter{ 35312661Speter msgNotify(str); 35415242Sjkh return DITEM_SUCCESS; 35512661Speter} 356