msg.c revision 80674
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 80674 2001-07-30 20:45:54Z 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> 4066834Sphk#include <sys/consio.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; 2098302Sjkh 21015416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2118302Sjkh va_start(args, fmt); 2128302Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2138302Sjkh va_end(args); 2148302Sjkh use_helpline(NULL); 2158302Sjkh use_helpfile(NULL); 2168837Sjkh if (isDebug()) 2178837Sjkh msgDebug("Notify: %s\n", errstr); 21829628Sjkh dialog_msgbox(NULL, errstr, -1, -1, 0); 2198302Sjkh} 2208302Sjkh 2218208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */ 2228208Sjkhint 2238208SjkhmsgYesNo(char *fmt, ...) 2248208Sjkh{ 2258208Sjkh va_list args; 2268208Sjkh char *errstr; 2278208Sjkh int ret; 22854587Sjkh WINDOW *w = savescr(); 22954587Sjkh 23015416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2318208Sjkh va_start(args, fmt); 2328208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2338208Sjkh va_end(args); 2348208Sjkh use_helpline(NULL); 2358208Sjkh use_helpfile(NULL); 2368640Sjkh if (OnVTY) { 2379202Srgrimes ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 2388641Sjkh msgInfo(NULL); 2398640Sjkh } 24080674Sjkh if (variable_get(VAR_NONINTERACTIVE)) 24180674Sjkh return 1; /* If non-interactive, return YES all the time */ 2428281Sjkh ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1); 24354587Sjkh restorescr(w); 2448208Sjkh return ret; 2458208Sjkh} 2468262Sjkh 24770005Sjkh/* Put up a message in a popup no/yes box and return 1 for YES, 0 for NO */ 24870005Sjkhint 24970005SjkhmsgNoYes(char *fmt, ...) 25070005Sjkh{ 25170005Sjkh va_list args; 25270005Sjkh char *errstr; 25370005Sjkh int ret; 25470005Sjkh WINDOW *w = savescr(); 25570005Sjkh 25670005Sjkh errstr = (char *)alloca(FILENAME_MAX); 25770005Sjkh va_start(args, fmt); 25870005Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 25970005Sjkh va_end(args); 26070005Sjkh use_helpline(NULL); 26170005Sjkh use_helpfile(NULL); 26270005Sjkh if (OnVTY) { 26370005Sjkh ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 26470005Sjkh msgInfo(NULL); 26570005Sjkh } 26680674Sjkh if (variable_get(VAR_NONINTERACTIVE)) 26780674Sjkh return 0; /* If non-interactive, return NO all the time */ 26870005Sjkh ret = dialog_noyes("User Confirmation Requested", errstr, -1, -1); 26970005Sjkh restorescr(w); 27070005Sjkh return ret; 27170005Sjkh} 27270005Sjkh 2738262Sjkh/* Put up a message in an input box and return the value */ 2748262Sjkhchar * 2758262SjkhmsgGetInput(char *buf, char *fmt, ...) 2768262Sjkh{ 2778262Sjkh va_list args; 2788262Sjkh char *errstr; 2798278Sjkh static char input_buffer[256]; 2808262Sjkh int rval; 28154587Sjkh WINDOW *w = savescr(); 2828262Sjkh 28315416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2848262Sjkh va_start(args, fmt); 2858262Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2868262Sjkh va_end(args); 2878262Sjkh use_helpline(NULL); 2888262Sjkh use_helpfile(NULL); 2898302Sjkh if (buf) 29020247Sjkh SAFE_STRCPY(input_buffer, buf); 2918302Sjkh else 2928302Sjkh input_buffer[0] = '\0'; 2938640Sjkh if (OnVTY) { 2949202Srgrimes ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 2958641Sjkh msgInfo(NULL); 2968640Sjkh } 2978262Sjkh rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer); 29854587Sjkh restorescr(w); 2998262Sjkh if (!rval) 3008262Sjkh return input_buffer; 3018262Sjkh else 3028262Sjkh return NULL; 3038262Sjkh} 3048262Sjkh 3058347Sjkh/* Write something to the debugging port */ 3068347Sjkhvoid 3078347SjkhmsgDebug(char *fmt, ...) 3088347Sjkh{ 3098347Sjkh va_list args; 3108347Sjkh char *dbg; 3118347Sjkh 3128594Sjkh if (DebugFD == -1) 3138594Sjkh return; 31415416Sjkh dbg = (char *)alloca(FILENAME_MAX); 3158347Sjkh strcpy(dbg, "DEBUG: "); 3168347Sjkh va_start(args, fmt); 3178347Sjkh vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args); 3188347Sjkh va_end(args); 3198347Sjkh write(DebugFD, dbg, strlen(dbg)); 3208347Sjkh} 3218705Sjkh 3228705Sjkh/* Tell the user there's some output to go look at */ 3238705Sjkhvoid 3248705SjkhmsgWeHaveOutput(char *fmt, ...) 3258705Sjkh{ 3268705Sjkh va_list args; 3278705Sjkh char *errstr; 32854587Sjkh WINDOW *w = savescr(); 32954587Sjkh 33015416Sjkh errstr = (char *)alloca(FILENAME_MAX); 3318705Sjkh va_start(args, fmt); 3328705Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 3338705Sjkh va_end(args); 3348705Sjkh use_helpline(NULL); 3358705Sjkh use_helpfile(NULL); 3368705Sjkh msgDebug("Notify: %s\n", errstr); 33717404Sjkh dialog_clear_norefresh(); 33854722Sjkh sleep(2); 33929628Sjkh dialog_msgbox(NULL, errstr, -1, -1, 0); 34054587Sjkh restorescr(w); 3418705Sjkh} 34212661Speter 34312661Speter/* Simple versions of msgConfirm() and msgNotify() for calling from scripts */ 34412661Speterint 34512661SpetermsgSimpleConfirm(char *str) 34612661Speter{ 34779304Skris msgConfirm("%s", str); 34815242Sjkh return DITEM_SUCCESS; 34912661Speter} 35012661Speter 35112661Speterint 35212661SpetermsgSimpleNotify(char *str) 35312661Speter{ 35479304Skris msgNotify("%s", str); 35515242Sjkh return DITEM_SUCCESS; 35612661Speter} 357