18097Sjkh/* 250479Speter * $FreeBSD$ 38097Sjkh * 48097Sjkh * Copyright (c) 1995 58097Sjkh * Jordan Hubbard. All rights reserved. 68097Sjkh * 78097Sjkh * Redistribution and use in source and binary forms, with or without 88097Sjkh * modification, are permitted provided that the following conditions 98097Sjkh * are met: 108097Sjkh * 1. Redistributions of source code must retain the above copyright 118881Srgrimes * notice, this list of conditions and the following disclaimer, 128881Srgrimes * verbatim and that no modifications are made prior to this 138097Sjkh * point in the file. 148097Sjkh * 2. Redistributions in binary form must reproduce the above copyright 158097Sjkh * notice, this list of conditions and the following disclaimer in the 168097Sjkh * documentation and/or other materials provided with the distribution. 178097Sjkh * 188097Sjkh * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND 198097Sjkh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 208097Sjkh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 218097Sjkh * ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE 228097Sjkh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 238097Sjkh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 248097Sjkh * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) 258097Sjkh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 268097Sjkh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 278097Sjkh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 288097Sjkh * SUCH DAMAGE. 298097Sjkh * 308097Sjkh */ 318097Sjkh 32161060Snetchild#include "sade.h" 338097Sjkh#include <stdarg.h> 348825Sjkh#include <sys/ioctl.h> 3566834Sphk#include <sys/consio.h> 368097Sjkh 378837SjkhBoolean 388837SjkhisDebug(void) 398837Sjkh{ 4012661Speter char *cp; 4112661Speter 4212661Speter return (cp = variable_get(VAR_DEBUG)) && strcmp(cp, "no"); 438837Sjkh} 448837Sjkh 458262Sjkh/* Whack up an informational message on the status line, in stand-out */ 468262Sjkhvoid 47161099SdelphijmsgYap(const char *fmt, ...) 488262Sjkh{ 498262Sjkh va_list args; 508262Sjkh char *errstr; 518262Sjkh int attrs; 528262Sjkh 5315416Sjkh errstr = (char *)alloca(FILENAME_MAX); 548262Sjkh va_start(args, fmt); 558347Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 568262Sjkh va_end(args); 578262Sjkh attrs = getattrs(stdscr); 588314Sjkh attrset(A_REVERSE); 5917375Sjkh mvaddstr(StatusLine, 0, errstr); 608262Sjkh attrset(attrs); 618262Sjkh refresh(); 628262Sjkh} 638262Sjkh 648097Sjkh/* Whack up an informational message on the status line */ 658097Sjkhvoid 66161099SdelphijmsgInfo(const char *fmt, ...) 678097Sjkh{ 688097Sjkh va_list args; 698097Sjkh char *errstr; 708705Sjkh int i, attrs; 718705Sjkh char line[81]; 728097Sjkh 738705Sjkh attrs = getattrs(stdscr); 748641Sjkh /* NULL is a special convention meaning "erase the old stuff" */ 758641Sjkh if (!fmt) { 7617375Sjkh move(StatusLine, 0); 778641Sjkh clrtoeol(); 788641Sjkh return; 798641Sjkh } 8015416Sjkh errstr = (char *)alloca(FILENAME_MAX); 818097Sjkh va_start(args, fmt); 828347Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 838097Sjkh va_end(args); 848705Sjkh memset(line, ' ', 80); 858705Sjkh for (i = 0; i < 80; i++) { 868705Sjkh if (errstr[i]) 878705Sjkh line[i] = errstr[i]; 888705Sjkh else 898705Sjkh break; 908705Sjkh } 918705Sjkh line[80] = '\0'; 9216366Sjkh attrset(ATTR_TITLE); 9317375Sjkh mvaddstr(StatusLine, 0, line); 948262Sjkh attrset(attrs); 9517375Sjkh move(StatusLine, 79); 968262Sjkh refresh(); 978097Sjkh} 988097Sjkh 998097Sjkh/* Whack up a warning on the status line */ 1008097Sjkhvoid 101161099SdelphijmsgWarn(const char *fmt, ...) 1028097Sjkh{ 1038097Sjkh va_list args; 1048097Sjkh char *errstr; 1058262Sjkh int attrs; 1068097Sjkh 10715416Sjkh errstr = (char *)alloca(FILENAME_MAX); 1088097Sjkh strcpy(errstr, "Warning: "); 1098097Sjkh va_start(args, fmt); 1108097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1118097Sjkh va_end(args); 1128262Sjkh attrs = getattrs(stdscr); 1138097Sjkh beep(); 11416366Sjkh attrset(ATTR_TITLE); 11517375Sjkh mvaddstr(StatusLine, 0, errstr); 1168262Sjkh attrset(attrs); 1178262Sjkh refresh(); 1188837Sjkh if (OnVTY && isDebug()) 1198628Sjkh msgDebug("Warning message `%s'\n", errstr); 1208097Sjkh} 1218097Sjkh 1228097Sjkh/* Whack up an error on the status line */ 1238097Sjkhvoid 124161099SdelphijmsgError(const char *fmt, ...) 1258097Sjkh{ 1268097Sjkh va_list args; 1278097Sjkh char *errstr; 1288262Sjkh int attrs; 1298097Sjkh 13015416Sjkh errstr = (char *)alloca(FILENAME_MAX); 1318097Sjkh strcpy(errstr, "Error: "); 1328097Sjkh va_start(args, fmt); 1338097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1348097Sjkh va_end(args); 1358097Sjkh beep(); 1368262Sjkh attrs = getattrs(stdscr); 13716366Sjkh attrset(ATTR_TITLE); 13817375Sjkh mvaddstr(StatusLine, 0, errstr); 1398262Sjkh attrset(attrs); 1408262Sjkh refresh(); 1418837Sjkh if (OnVTY && isDebug()) 1428628Sjkh msgDebug("Error message `%s'\n", errstr); 1438097Sjkh} 1448097Sjkh 1458097Sjkh/* Whack up a fatal error on the status line */ 1468097Sjkhvoid 147161099SdelphijmsgFatal(const char *fmt, ...) 1488097Sjkh{ 1498097Sjkh va_list args; 1508097Sjkh char *errstr; 1518262Sjkh int attrs; 1528097Sjkh 15315416Sjkh errstr = (char *)alloca(FILENAME_MAX); 1548097Sjkh strcpy(errstr, "Fatal Error: "); 1558097Sjkh va_start(args, fmt); 1568097Sjkh vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 1578097Sjkh va_end(args); 1588097Sjkh beep(); 1598262Sjkh attrs = getattrs(stdscr); 16016366Sjkh attrset(ATTR_TITLE); 16117375Sjkh mvaddstr(StatusLine, 0, errstr); 1628097Sjkh addstr(" - "); 1638097Sjkh addstr("PRESS ANY KEY TO "); 1648097Sjkh if (getpid() == 1) 1658097Sjkh addstr("REBOOT"); 1668097Sjkh else 1678097Sjkh addstr("QUIT"); 1688262Sjkh attrset(attrs); 1698262Sjkh refresh(); 1708628Sjkh if (OnVTY) 1718628Sjkh msgDebug("Fatal error `%s'!\n", errstr); 1728097Sjkh getch(); 1738097Sjkh} 1748097Sjkh 1758208Sjkh/* Put up a message in a popup confirmation box */ 1768208Sjkhvoid 177161099SdelphijmsgConfirm(const char *fmt, ...) 1788208Sjkh{ 1798208Sjkh va_list args; 1808208Sjkh char *errstr; 18154587Sjkh WINDOW *w = savescr(); 1828208Sjkh 18315416Sjkh errstr = (char *)alloca(FILENAME_MAX); 1848208Sjkh va_start(args, fmt); 1858208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 1868208Sjkh va_end(args); 1878208Sjkh use_helpline(NULL); 1888208Sjkh use_helpfile(NULL); 1898640Sjkh if (OnVTY) { 1909202Srgrimes ioctl(0, VT_ACTIVATE, 1); 1918641Sjkh msgInfo(NULL); 1928640Sjkh } 1938556Sjkh dialog_notify(errstr); 19454587Sjkh restorescr(w); 1958208Sjkh} 1968208Sjkh 1978302Sjkh/* Put up a message in a popup information box */ 1988302Sjkhvoid 199161099SdelphijmsgNotify(const char *fmt, ...) 2008302Sjkh{ 2018302Sjkh va_list args; 2028302Sjkh char *errstr; 2038302Sjkh 20415416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2058302Sjkh va_start(args, fmt); 2068302Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2078302Sjkh va_end(args); 2088302Sjkh use_helpline(NULL); 2098302Sjkh use_helpfile(NULL); 2108837Sjkh if (isDebug()) 2118837Sjkh msgDebug("Notify: %s\n", errstr); 21229628Sjkh dialog_msgbox(NULL, errstr, -1, -1, 0); 2138302Sjkh} 2148302Sjkh 21583351Sjkh/* Put up a message in a popup yes/no box and return 0 for YES, 1 for NO */ 2168208Sjkhint 217161099SdelphijmsgYesNo(const char *fmt, ...) 2188208Sjkh{ 2198208Sjkh va_list args; 2208208Sjkh char *errstr; 2218208Sjkh int ret; 22254587Sjkh WINDOW *w = savescr(); 22354587Sjkh 22415416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2258208Sjkh va_start(args, fmt); 2268208Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2278208Sjkh va_end(args); 2288208Sjkh use_helpline(NULL); 2298208Sjkh use_helpfile(NULL); 2308640Sjkh if (OnVTY) { 2319202Srgrimes ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 2328641Sjkh msgInfo(NULL); 2338640Sjkh } 23480674Sjkh if (variable_get(VAR_NONINTERACTIVE)) 23583351Sjkh return 0; /* If non-interactive, return YES all the time */ 2368281Sjkh ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1); 23754587Sjkh restorescr(w); 2388208Sjkh return ret; 2398208Sjkh} 2408262Sjkh 24183351Sjkh/* Put up a message in a popup no/yes box and return 0 for YES, 1 for NO */ 24270005Sjkhint 243161099SdelphijmsgNoYes(const char *fmt, ...) 24470005Sjkh{ 24570005Sjkh va_list args; 24670005Sjkh char *errstr; 24770005Sjkh int ret; 24870005Sjkh WINDOW *w = savescr(); 24970005Sjkh 25070005Sjkh errstr = (char *)alloca(FILENAME_MAX); 25170005Sjkh va_start(args, fmt); 25270005Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 25370005Sjkh va_end(args); 25470005Sjkh use_helpline(NULL); 25570005Sjkh use_helpfile(NULL); 25670005Sjkh if (OnVTY) { 25770005Sjkh ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 25870005Sjkh msgInfo(NULL); 25970005Sjkh } 26080674Sjkh if (variable_get(VAR_NONINTERACTIVE)) 26183351Sjkh return 1; /* If non-interactive, return NO all the time */ 26270005Sjkh ret = dialog_noyes("User Confirmation Requested", errstr, -1, -1); 26370005Sjkh restorescr(w); 26470005Sjkh return ret; 26570005Sjkh} 26670005Sjkh 2678262Sjkh/* Put up a message in an input box and return the value */ 2688262Sjkhchar * 269161099SdelphijmsgGetInput(char *buf, const char *fmt, ...) 2708262Sjkh{ 2718262Sjkh va_list args; 2728262Sjkh char *errstr; 2738278Sjkh static char input_buffer[256]; 2748262Sjkh int rval; 27554587Sjkh WINDOW *w = savescr(); 2768262Sjkh 27715416Sjkh errstr = (char *)alloca(FILENAME_MAX); 2788262Sjkh va_start(args, fmt); 2798262Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 2808262Sjkh va_end(args); 2818262Sjkh use_helpline(NULL); 2828262Sjkh use_helpfile(NULL); 2838302Sjkh if (buf) 28420247Sjkh SAFE_STRCPY(input_buffer, buf); 2858302Sjkh else 2868302Sjkh input_buffer[0] = '\0'; 2878640Sjkh if (OnVTY) { 2889202Srgrimes ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 2898641Sjkh msgInfo(NULL); 2908640Sjkh } 2918262Sjkh rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer); 29254587Sjkh restorescr(w); 2938262Sjkh if (!rval) 2948262Sjkh return input_buffer; 2958262Sjkh else 2968262Sjkh return NULL; 2978262Sjkh} 2988262Sjkh 2998347Sjkh/* Write something to the debugging port */ 3008347Sjkhvoid 301161099SdelphijmsgDebug(const char *fmt, ...) 3028347Sjkh{ 3038347Sjkh va_list args; 3048347Sjkh char *dbg; 3058347Sjkh 3068594Sjkh if (DebugFD == -1) 3078594Sjkh return; 30815416Sjkh dbg = (char *)alloca(FILENAME_MAX); 3098347Sjkh strcpy(dbg, "DEBUG: "); 3108347Sjkh va_start(args, fmt); 3118347Sjkh vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args); 3128347Sjkh va_end(args); 3138347Sjkh write(DebugFD, dbg, strlen(dbg)); 3148347Sjkh} 3158705Sjkh 3168705Sjkh/* Tell the user there's some output to go look at */ 3178705Sjkhvoid 318161099SdelphijmsgWeHaveOutput(const char *fmt, ...) 3198705Sjkh{ 3208705Sjkh va_list args; 3218705Sjkh char *errstr; 32254587Sjkh WINDOW *w = savescr(); 32354587Sjkh 32415416Sjkh errstr = (char *)alloca(FILENAME_MAX); 3258705Sjkh va_start(args, fmt); 3268705Sjkh vsnprintf(errstr, FILENAME_MAX, fmt, args); 3278705Sjkh va_end(args); 3288705Sjkh use_helpline(NULL); 3298705Sjkh use_helpfile(NULL); 3308705Sjkh msgDebug("Notify: %s\n", errstr); 33117404Sjkh dialog_clear_norefresh(); 33254722Sjkh sleep(2); 33329628Sjkh dialog_msgbox(NULL, errstr, -1, -1, 0); 33454587Sjkh restorescr(w); 3358705Sjkh} 33612661Speter 33712661Speter/* Simple versions of msgConfirm() and msgNotify() for calling from scripts */ 33812661Speterint 339161099SdelphijmsgSimpleConfirm(const char *str) 34012661Speter{ 34179304Skris msgConfirm("%s", str); 34215242Sjkh return DITEM_SUCCESS; 34312661Speter} 34412661Speter 34512661Speterint 346161099SdelphijmsgSimpleNotify(const char *str) 34712661Speter{ 34879304Skris msgNotify("%s", str); 34915242Sjkh return DITEM_SUCCESS; 35012661Speter} 351