msg.c revision 9202
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 * 79202Srgrimes * $Id: msg.c,v 1.28.2.2 1995/06/02 15:31: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 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 * 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> 468825Sjkh#include <sys/ioctl.h> 478825Sjkh#include <machine/console.h> 488097Sjkh 498702Sjkh#define VTY_STATLINE 24 508702Sjkh#define TTY_STATLINE 23 518702Sjkh 528837SjkhBoolean 538837SjkhisDebug(void) 548837Sjkh{ 559202Srgrimes if (OptFlags & OPT_DEBUG) 568837Sjkh return TRUE; 578837Sjkh return FALSE; 588837Sjkh} 598837Sjkh 608262Sjkh/* Whack up an informational message on the status line, in stand-out */ 618262Sjkhvoid 628262SjkhmsgYap(char *fmt, ...) 638262Sjkh{ 648262Sjkh va_list args; 658262Sjkh char *errstr; 668262Sjkh int attrs; 678262Sjkh 688317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 698262Sjkh va_start(args, fmt); 708347Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 718262Sjkh va_end(args); 728262Sjkh attrs = getattrs(stdscr); 738314Sjkh attrset(A_REVERSE); 748702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 758262Sjkh attrset(attrs); 768262Sjkh refresh(); 778262Sjkh free(errstr); 788262Sjkh} 798262Sjkh 808097Sjkh/* Whack up an informational message on the status line */ 818097Sjkhvoid 828097SjkhmsgInfo(char *fmt, ...) 838097Sjkh{ 848097Sjkh va_list args; 858097Sjkh char *errstr; 868705Sjkh int i, attrs; 878705Sjkh char line[81]; 888097Sjkh 898705Sjkh attrs = getattrs(stdscr); 908641Sjkh /* NULL is a special convention meaning "erase the old stuff" */ 918641Sjkh if (!fmt) { 928702Sjkh move(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0); 938705Sjkh attrset(A_REVERSE); 948641Sjkh clrtoeol(); 958705Sjkh attrset(attrs); 968641Sjkh return; 978641Sjkh } 988317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 998097Sjkh va_start(args, fmt); 1008347Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 1018097Sjkh va_end(args); 1028705Sjkh memset(line, ' ', 80); 1038705Sjkh for (i = 0; i < 80; i++) { 1048705Sjkh if (errstr[i]) 1058705Sjkh line[i] = errstr[i]; 1068705Sjkh else 1078705Sjkh break; 1088705Sjkh } 1098705Sjkh line[80] = '\0'; 1108705Sjkh attrset(A_REVERSE); 1118705Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, line); 1128262Sjkh attrset(attrs); 1138722Sjkh move(OnVTY ? VTY_STATLINE : TTY_STATLINE, 79); 1148262Sjkh refresh(); 1158640Sjkh if (OnVTY) { 1168837Sjkh if (isDebug()) 1178837Sjkh msgDebug("Information: `%s'\n", errstr); 1188641Sjkh msgInfo(NULL); 1198640Sjkh } 1208097Sjkh free(errstr); 1218097Sjkh} 1228097Sjkh 1238097Sjkh/* Whack up a warning on the status line */ 1248097Sjkhvoid 1258097SjkhmsgWarn(char *fmt, ...) 1268097Sjkh{ 1278097Sjkh va_list args; 1288097Sjkh char *errstr; 1298262Sjkh int attrs; 1308097Sjkh 1318317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1328097Sjkh strcpy(errstr, "Warning: "); 1338097Sjkh va_start(args, fmt); 1348097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1358097Sjkh va_end(args); 1368262Sjkh attrs = getattrs(stdscr); 1378097Sjkh beep(); 1388314Sjkh attrset(A_REVERSE); 1398702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 1408262Sjkh attrset(attrs); 1418262Sjkh refresh(); 1428837Sjkh if (OnVTY && isDebug()) 1438628Sjkh msgDebug("Warning message `%s'\n", errstr); 1448097Sjkh free(errstr); 1458097Sjkh} 1468097Sjkh 1478097Sjkh/* Whack up an error on the status line */ 1488097Sjkhvoid 1498097SjkhmsgError(char *fmt, ...) 1508097Sjkh{ 1518097Sjkh va_list args; 1528097Sjkh char *errstr; 1538262Sjkh int attrs; 1548097Sjkh 1558317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1568097Sjkh strcpy(errstr, "Error: "); 1578097Sjkh va_start(args, fmt); 1588097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1598097Sjkh va_end(args); 1608097Sjkh beep(); 1618262Sjkh attrs = getattrs(stdscr); 1628314Sjkh attrset(A_REVERSE); 1638702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 1648262Sjkh attrset(attrs); 1658262Sjkh refresh(); 1668837Sjkh if (OnVTY && isDebug()) 1678628Sjkh msgDebug("Error message `%s'\n", errstr); 1688097Sjkh free(errstr); 1698097Sjkh} 1708097Sjkh 1718097Sjkh/* Whack up a fatal error on the status line */ 1728097Sjkhvoid 1738097SjkhmsgFatal(char *fmt, ...) 1748097Sjkh{ 1758097Sjkh va_list args; 1768097Sjkh char *errstr; 1778262Sjkh int attrs; 1788097Sjkh 1798317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1808097Sjkh strcpy(errstr, "Fatal Error: "); 1818097Sjkh va_start(args, fmt); 1828097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1838097Sjkh va_end(args); 1848097Sjkh beep(); 1858262Sjkh attrs = getattrs(stdscr); 1868314Sjkh attrset(A_REVERSE); 1878702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 1888097Sjkh addstr(" - "); 1898097Sjkh addstr("PRESS ANY KEY TO "); 1908097Sjkh if (getpid() == 1) 1918097Sjkh addstr("REBOOT"); 1928097Sjkh else 1938097Sjkh addstr("QUIT"); 1948262Sjkh attrset(attrs); 1958262Sjkh refresh(); 1968628Sjkh if (OnVTY) 1978628Sjkh msgDebug("Fatal error `%s'!\n", errstr); 1988097Sjkh free(errstr); 1998097Sjkh getch(); 2008097Sjkh systemShutdown(); 2018097Sjkh} 2028097Sjkh 2038208Sjkh/* Put up a message in a popup confirmation box */ 2048208Sjkhvoid 2058208SjkhmsgConfirm(char *fmt, ...) 2068208Sjkh{ 2078208Sjkh va_list args; 2088208Sjkh char *errstr; 2098649Sjkh WINDOW *w; 2108208Sjkh 2118317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2128208Sjkh va_start(args, fmt); 2138208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2148208Sjkh va_end(args); 2158208Sjkh use_helpline(NULL); 2168208Sjkh use_helpfile(NULL); 2178649Sjkh w = dupwin(newscr); 2188640Sjkh if (OnVTY) { 2198828Sjkh msgDebug("Switching back to VTY 0\n"); 2209202Srgrimes ioctl(0, VT_ACTIVATE, 1); 2218641Sjkh msgInfo(NULL); 2228640Sjkh } 2238556Sjkh dialog_notify(errstr); 2248649Sjkh touchwin(w); 2258649Sjkh wrefresh(w); 2268649Sjkh delwin(w); 2278208Sjkh free(errstr); 2288208Sjkh} 2298208Sjkh 2308302Sjkh/* Put up a message in a popup information box */ 2318302Sjkhvoid 2328302SjkhmsgNotify(char *fmt, ...) 2338302Sjkh{ 2348302Sjkh va_list args; 2358302Sjkh char *errstr; 2368302Sjkh 2378317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2388302Sjkh va_start(args, fmt); 2398302Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2408302Sjkh va_end(args); 2418302Sjkh use_helpline(NULL); 2428302Sjkh use_helpfile(NULL); 2438837Sjkh if (isDebug()) 2448837Sjkh msgDebug("Notify: %s\n", errstr); 2458649Sjkh dialog_clear(); 2468438Sjkh dialog_msgbox("Information Dialog", errstr, -1, -1, 0); 2478302Sjkh free(errstr); 2488302Sjkh} 2498302Sjkh 2508208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */ 2518208Sjkhint 2528208SjkhmsgYesNo(char *fmt, ...) 2538208Sjkh{ 2548208Sjkh va_list args; 2558208Sjkh char *errstr; 2568208Sjkh int ret; 2578556Sjkh WINDOW *w; 2588208Sjkh 2598317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2608208Sjkh va_start(args, fmt); 2618208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2628208Sjkh va_end(args); 2638208Sjkh use_helpline(NULL); 2648208Sjkh use_helpfile(NULL); 2658556Sjkh w = dupwin(newscr); 2668640Sjkh if (OnVTY) { 2678837Sjkh msgDebug("Switching back to VTY 0\n"); 2689202Srgrimes ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 2698641Sjkh msgInfo(NULL); 2708640Sjkh } 2718281Sjkh ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1); 2728556Sjkh touchwin(w); 2738556Sjkh wrefresh(w); 2748556Sjkh delwin(w); 2758208Sjkh free(errstr); 2768208Sjkh return ret; 2778208Sjkh} 2788262Sjkh 2798262Sjkh/* Put up a message in an input box and return the value */ 2808262Sjkhchar * 2818262SjkhmsgGetInput(char *buf, char *fmt, ...) 2828262Sjkh{ 2838262Sjkh va_list args; 2848262Sjkh char *errstr; 2858278Sjkh static char input_buffer[256]; 2868262Sjkh int rval; 2878556Sjkh WINDOW *w; 2888262Sjkh 2898317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2908262Sjkh va_start(args, fmt); 2918262Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2928262Sjkh va_end(args); 2938262Sjkh use_helpline(NULL); 2948262Sjkh use_helpfile(NULL); 2958302Sjkh if (buf) 2968302Sjkh strcpy(input_buffer, buf); 2978302Sjkh else 2988302Sjkh input_buffer[0] = '\0'; 2998556Sjkh w = dupwin(newscr); 3008640Sjkh if (OnVTY) { 3018828Sjkh msgDebug("Switching back to VTY 0\n"); 3029202Srgrimes ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 3038641Sjkh msgInfo(NULL); 3048640Sjkh } 3058262Sjkh rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer); 3068556Sjkh touchwin(w); 3078556Sjkh wrefresh(w); 3088556Sjkh delwin(w); 3098262Sjkh free(errstr); 3108262Sjkh if (!rval) 3118262Sjkh return input_buffer; 3128262Sjkh else 3138262Sjkh return NULL; 3148262Sjkh} 3158262Sjkh 3168347Sjkh/* Write something to the debugging port */ 3178347Sjkhvoid 3188347SjkhmsgDebug(char *fmt, ...) 3198347Sjkh{ 3208347Sjkh va_list args; 3218347Sjkh char *dbg; 3228347Sjkh 3238594Sjkh if (DebugFD == -1) 3248594Sjkh return; 3258347Sjkh dbg = (char *)safe_malloc(FILENAME_MAX); 3268347Sjkh strcpy(dbg, "DEBUG: "); 3278347Sjkh va_start(args, fmt); 3288347Sjkh vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args); 3298347Sjkh va_end(args); 3308347Sjkh write(DebugFD, dbg, strlen(dbg)); 3318347Sjkh free(dbg); 3328347Sjkh} 3338705Sjkh 3348705Sjkh/* Tell the user there's some output to go look at */ 3358705Sjkhvoid 3368705SjkhmsgWeHaveOutput(char *fmt, ...) 3378705Sjkh{ 3388705Sjkh va_list args; 3398705Sjkh char *errstr; 3408705Sjkh 3418705Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 3428705Sjkh va_start(args, fmt); 3438705Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 3448705Sjkh va_end(args); 3458705Sjkh use_helpline(NULL); 3468705Sjkh use_helpfile(NULL); 3478705Sjkh msgDebug("Notify: %s\n", errstr); 3488705Sjkh dialog_clear(); 3498705Sjkh dialog_msgbox("Information Dialog", errstr, -1, -1, 0); 3508705Sjkh free(errstr); 3518705Sjkh if (OnVTY) 3528705Sjkh msgInfo("Command output is on debugging screen - type ALT-F2 to see it"); 3538705Sjkh} 354