msg.c revision 70005
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 70005 2000-12-14 02:49:02Z 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 } 2408281Sjkh ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1); 24154587Sjkh restorescr(w); 2428208Sjkh return ret; 2438208Sjkh} 2448262Sjkh 24570005Sjkh/* Put up a message in a popup no/yes box and return 1 for YES, 0 for NO */ 24670005Sjkhint 24770005SjkhmsgNoYes(char *fmt, ...) 24870005Sjkh{ 24970005Sjkh va_list args; 25070005Sjkh char *errstr; 25170005Sjkh int ret; 25270005Sjkh WINDOW *w = savescr(); 25370005Sjkh 25470005Sjkh errstr = (char *)alloca(FILENAME_MAX); 25570005Sjkh va_start(args, fmt); 25670005Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 25770005Sjkh va_end(args); 25870005Sjkh use_helpline(NULL); 25970005Sjkh use_helpfile(NULL); 26070005Sjkh if (OnVTY) { 26170005Sjkh ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 26270005Sjkh msgInfo(NULL); 26370005Sjkh } 26470005Sjkh ret = dialog_noyes("User Confirmation Requested", errstr, -1, -1); 26570005Sjkh restorescr(w); 26670005Sjkh return ret; 26770005Sjkh} 26870005Sjkh 2698262Sjkh/* Put up a message in an input box and return the value */ 2708262Sjkhchar * 2718262SjkhmsgGetInput(char *buf, char *fmt, ...) 2728262Sjkh{ 2738262Sjkh va_list args; 2748262Sjkh char *errstr; 2758278Sjkh static char input_buffer[256]; 2768262Sjkh int rval; 27754587Sjkh WINDOW *w = savescr(); 2788262Sjkh 27915416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2808262Sjkh va_start(args, fmt); 2818262Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2828262Sjkh va_end(args); 2838262Sjkh use_helpline(NULL); 2848262Sjkh use_helpfile(NULL); 2858302Sjkh if (buf) 28620247Sjkh SAFE_STRCPY(input_buffer, buf); 2878302Sjkh else 2888302Sjkh input_buffer[0] = '\0'; 2898640Sjkh if (OnVTY) { 2909202Srgrimes ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 2918641Sjkh msgInfo(NULL); 2928640Sjkh } 2938262Sjkh rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer); 29454587Sjkh restorescr(w); 2958262Sjkh if (!rval) 2968262Sjkh return input_buffer; 2978262Sjkh else 2988262Sjkh return NULL; 2998262Sjkh} 3008262Sjkh 3018347Sjkh/* Write something to the debugging port */ 3028347Sjkhvoid 3038347SjkhmsgDebug(char *fmt, ...) 3048347Sjkh{ 3058347Sjkh va_list args; 3068347Sjkh char *dbg; 3078347Sjkh 3088594Sjkh if (DebugFD == -1) 3098594Sjkh return; 31015416Sjkh dbg = (char *)alloca(FILENAME_MAX); 3118347Sjkh strcpy(dbg, "DEBUG: "); 3128347Sjkh va_start(args, fmt); 3138347Sjkh vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args); 3148347Sjkh va_end(args); 3158347Sjkh write(DebugFD, dbg, strlen(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; 32454587Sjkh WINDOW *w = savescr(); 32554587Sjkh 32615416Sjkh errstr = (char *)alloca(FILENAME_MAX); 3278705Sjkh va_start(args, fmt); 3288705Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 3298705Sjkh va_end(args); 3308705Sjkh use_helpline(NULL); 3318705Sjkh use_helpfile(NULL); 3328705Sjkh msgDebug("Notify: %s\n", errstr); 33317404Sjkh dialog_clear_norefresh(); 33454722Sjkh sleep(2); 33529628Sjkh dialog_msgbox(NULL, errstr, -1, -1, 0); 33654587Sjkh restorescr(w); 3378705Sjkh} 33812661Speter 33912661Speter/* Simple versions of msgConfirm() and msgNotify() for calling from scripts */ 34012661Speterint 34112661SpetermsgSimpleConfirm(char *str) 34212661Speter{ 34312661Speter msgConfirm(str); 34415242Sjkh return DITEM_SUCCESS; 34512661Speter} 34612661Speter 34712661Speterint 34812661SpetermsgSimpleNotify(char *str) 34912661Speter{ 35012661Speter msgNotify(str); 35115242Sjkh return DITEM_SUCCESS; 35212661Speter} 353