msg.c revision 8705
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 * 78705Sjkh * $Id: msg.c,v 1.22 1995/05/22 14:10:25 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 168097Sjkh * notice, this list of conditions and the following disclaimer, 178097Sjkh * 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> 468097Sjkh 478702Sjkh#define VTY_STATLINE 24 488702Sjkh#define TTY_STATLINE 23 498702Sjkh 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 588317Sjkh errstr = (char *)safe_malloc(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); 648702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 658262Sjkh attrset(attrs); 668262Sjkh refresh(); 678262Sjkh free(errstr); 688262Sjkh} 698262Sjkh 708097Sjkh/* Whack up an informational message on the status line */ 718097Sjkhvoid 728097SjkhmsgInfo(char *fmt, ...) 738097Sjkh{ 748097Sjkh va_list args; 758097Sjkh char *errstr; 768705Sjkh int i, attrs; 778705Sjkh char line[81]; 788097Sjkh 798705Sjkh attrs = getattrs(stdscr); 808641Sjkh /* NULL is a special convention meaning "erase the old stuff" */ 818641Sjkh if (!fmt) { 828702Sjkh move(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0); 838705Sjkh attrset(A_REVERSE); 848641Sjkh clrtoeol(); 858705Sjkh attrset(attrs); 868641Sjkh return; 878641Sjkh } 888317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 898097Sjkh va_start(args, fmt); 908347Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 918097Sjkh va_end(args); 928705Sjkh memset(line, ' ', 80); 938705Sjkh for (i = 0; i < 80; i++) { 948705Sjkh if (errstr[i]) 958705Sjkh line[i] = errstr[i]; 968705Sjkh else 978705Sjkh break; 988705Sjkh } 998705Sjkh line[80] = '\0'; 1008705Sjkh attrset(A_REVERSE); 1018705Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, line); 1028262Sjkh attrset(attrs); 1038262Sjkh refresh(); 1048640Sjkh if (OnVTY) { 1058658Sphk msgDebug("Information: `%s'\n", errstr); 1068641Sjkh msgInfo(NULL); 1078640Sjkh } 1088097Sjkh free(errstr); 1098097Sjkh} 1108097Sjkh 1118097Sjkh/* Whack up a warning on the status line */ 1128097Sjkhvoid 1138097SjkhmsgWarn(char *fmt, ...) 1148097Sjkh{ 1158097Sjkh va_list args; 1168097Sjkh char *errstr; 1178262Sjkh int attrs; 1188097Sjkh 1198317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1208097Sjkh strcpy(errstr, "Warning: "); 1218097Sjkh va_start(args, fmt); 1228097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1238097Sjkh va_end(args); 1248262Sjkh attrs = getattrs(stdscr); 1258097Sjkh beep(); 1268314Sjkh attrset(A_REVERSE); 1278702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 1288262Sjkh attrset(attrs); 1298262Sjkh refresh(); 1308628Sjkh if (OnVTY) 1318628Sjkh msgDebug("Warning message `%s'\n", errstr); 1328097Sjkh free(errstr); 1338097Sjkh} 1348097Sjkh 1358097Sjkh/* Whack up an error on the status line */ 1368097Sjkhvoid 1378097SjkhmsgError(char *fmt, ...) 1388097Sjkh{ 1398097Sjkh va_list args; 1408097Sjkh char *errstr; 1418262Sjkh int attrs; 1428097Sjkh 1438317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1448097Sjkh strcpy(errstr, "Error: "); 1458097Sjkh va_start(args, fmt); 1468097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1478097Sjkh va_end(args); 1488097Sjkh beep(); 1498262Sjkh attrs = getattrs(stdscr); 1508314Sjkh attrset(A_REVERSE); 1518702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 1528262Sjkh attrset(attrs); 1538262Sjkh refresh(); 1548628Sjkh if (OnVTY) 1558628Sjkh msgDebug("Error message `%s'\n", errstr); 1568097Sjkh free(errstr); 1578097Sjkh} 1588097Sjkh 1598097Sjkh/* Whack up a fatal error on the status line */ 1608097Sjkhvoid 1618097SjkhmsgFatal(char *fmt, ...) 1628097Sjkh{ 1638097Sjkh va_list args; 1648097Sjkh char *errstr; 1658262Sjkh int attrs; 1668097Sjkh 1678317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 1688097Sjkh strcpy(errstr, "Fatal Error: "); 1698097Sjkh va_start(args, fmt); 1708097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1718097Sjkh va_end(args); 1728097Sjkh beep(); 1738262Sjkh attrs = getattrs(stdscr); 1748314Sjkh attrset(A_REVERSE); 1758702Sjkh mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr); 1768097Sjkh addstr(" - "); 1778097Sjkh addstr("PRESS ANY KEY TO "); 1788097Sjkh if (getpid() == 1) 1798097Sjkh addstr("REBOOT"); 1808097Sjkh else 1818097Sjkh addstr("QUIT"); 1828262Sjkh attrset(attrs); 1838262Sjkh refresh(); 1848628Sjkh if (OnVTY) 1858628Sjkh msgDebug("Fatal error `%s'!\n", errstr); 1868097Sjkh free(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 1998317Sjkh errstr = (char *)safe_malloc(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); 2058649Sjkh w = dupwin(newscr); 2068640Sjkh if (OnVTY) { 2078628Sjkh msgDebug("User confirmation requested (type ALT-F1)\n"); 2088641Sjkh msgInfo(NULL); 2098640Sjkh } 2108556Sjkh dialog_notify(errstr); 2118649Sjkh touchwin(w); 2128649Sjkh wrefresh(w); 2138649Sjkh delwin(w); 2148208Sjkh free(errstr); 2158208Sjkh} 2168208Sjkh 2178302Sjkh/* Put up a message in a popup information box */ 2188302Sjkhvoid 2198302SjkhmsgNotify(char *fmt, ...) 2208302Sjkh{ 2218302Sjkh va_list args; 2228302Sjkh char *errstr; 2238302Sjkh 2248317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2258302Sjkh va_start(args, fmt); 2268302Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2278302Sjkh va_end(args); 2288302Sjkh use_helpline(NULL); 2298302Sjkh use_helpfile(NULL); 2308628Sjkh msgDebug("Notify: %s\n", errstr); 2318649Sjkh dialog_clear(); 2328438Sjkh dialog_msgbox("Information Dialog", errstr, -1, -1, 0); 2338302Sjkh free(errstr); 2348302Sjkh} 2358302Sjkh 2368208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */ 2378208Sjkhint 2388208SjkhmsgYesNo(char *fmt, ...) 2398208Sjkh{ 2408208Sjkh va_list args; 2418208Sjkh char *errstr; 2428208Sjkh int ret; 2438556Sjkh WINDOW *w; 2448208Sjkh 2458317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2468208Sjkh va_start(args, fmt); 2478208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2488208Sjkh va_end(args); 2498208Sjkh use_helpline(NULL); 2508208Sjkh use_helpfile(NULL); 2518556Sjkh w = dupwin(newscr); 2528640Sjkh if (OnVTY) { 2538628Sjkh msgDebug("User decision requested (type ALT-F1)\n"); 2548641Sjkh msgInfo(NULL); 2558640Sjkh } 2568281Sjkh ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1); 2578556Sjkh touchwin(w); 2588556Sjkh wrefresh(w); 2598556Sjkh delwin(w); 2608208Sjkh free(errstr); 2618208Sjkh return ret; 2628208Sjkh} 2638262Sjkh 2648262Sjkh/* Put up a message in an input box and return the value */ 2658262Sjkhchar * 2668262SjkhmsgGetInput(char *buf, char *fmt, ...) 2678262Sjkh{ 2688262Sjkh va_list args; 2698262Sjkh char *errstr; 2708278Sjkh static char input_buffer[256]; 2718262Sjkh int rval; 2728556Sjkh WINDOW *w; 2738262Sjkh 2748317Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 2758262Sjkh va_start(args, fmt); 2768262Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2778262Sjkh va_end(args); 2788262Sjkh use_helpline(NULL); 2798262Sjkh use_helpfile(NULL); 2808302Sjkh if (buf) 2818302Sjkh strcpy(input_buffer, buf); 2828302Sjkh else 2838302Sjkh input_buffer[0] = '\0'; 2848556Sjkh w = dupwin(newscr); 2858640Sjkh if (OnVTY) { 2868628Sjkh msgDebug("User input requested (type ALT-F1)\n"); 2878641Sjkh msgInfo(NULL); 2888640Sjkh } 2898262Sjkh rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer); 2908556Sjkh touchwin(w); 2918556Sjkh wrefresh(w); 2928556Sjkh delwin(w); 2938262Sjkh free(errstr); 2948262Sjkh if (!rval) 2958262Sjkh return input_buffer; 2968262Sjkh else 2978262Sjkh return NULL; 2988262Sjkh} 2998262Sjkh 3008347Sjkh/* Write something to the debugging port */ 3018347Sjkhvoid 3028347SjkhmsgDebug(char *fmt, ...) 3038347Sjkh{ 3048347Sjkh va_list args; 3058347Sjkh char *dbg; 3068347Sjkh 3078594Sjkh if (DebugFD == -1) 3088594Sjkh return; 3098347Sjkh dbg = (char *)safe_malloc(FILENAME_MAX); 3108347Sjkh strcpy(dbg, "DEBUG: "); 3118347Sjkh va_start(args, fmt); 3128347Sjkh vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args); 3138347Sjkh va_end(args); 3148347Sjkh write(DebugFD, dbg, strlen(dbg)); 3158347Sjkh free(dbg); 3168347Sjkh} 3178705Sjkh 3188705Sjkh/* Tell the user there's some output to go look at */ 3198705Sjkhvoid 3208705SjkhmsgWeHaveOutput(char *fmt, ...) 3218705Sjkh{ 3228705Sjkh va_list args; 3238705Sjkh char *errstr; 3248705Sjkh 3258705Sjkh errstr = (char *)safe_malloc(FILENAME_MAX); 3268705Sjkh va_start(args, fmt); 3278705Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 3288705Sjkh va_end(args); 3298705Sjkh use_helpline(NULL); 3308705Sjkh use_helpfile(NULL); 3318705Sjkh msgDebug("Notify: %s\n", errstr); 3328705Sjkh dialog_clear(); 3338705Sjkh dialog_msgbox("Information Dialog", errstr, -1, -1, 0); 3348705Sjkh free(errstr); 3358705Sjkh if (OnVTY) 3368705Sjkh msgInfo("Command output is on debugging screen - type ALT-F2 to see it"); 3378705Sjkh} 338