msg.c revision 83351
117680Spst/* 217680Spst * The new sysinstall program. 317680Spst * 417680Spst * This is probably the last program in the `sysinstall' line - the next 517680Spst * generation being essentially a complete rewrite. 617680Spst * 717680Spst * $FreeBSD: head/usr.sbin/sade/msg.c 83351 2001-09-11 20:42:07Z jkh $ 817680Spst * 917680Spst * Copyright (c) 1995 1017680Spst * Jordan Hubbard. All rights reserved. 1117680Spst * 1217680Spst * Redistribution and use in source and binary forms, with or without 1317680Spst * modification, are permitted provided that the following conditions 1417680Spst * are met: 1517680Spst * 1. Redistributions of source code must retain the above copyright 1617680Spst * notice, this list of conditions and the following disclaimer, 1717680Spst * verbatim and that no modifications are made prior to this 1817680Spst * point in the file. 1917680Spst * 2. Redistributions in binary form must reproduce the above copyright 2057278Sfenner * notice, this list of conditions and the following disclaimer in the 2157278Sfenner * documentation and/or other materials provided with the distribution. 2217680Spst * 2317680Spst * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND 2417680Spst * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25127675Sbms * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26146778Ssam * ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE 2717680Spst * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2817680Spst * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2956893Sfenner * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) 3056893Sfenner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3156893Sfenner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3256893Sfenner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33127675Sbms * SUCH DAMAGE. 34146778Ssam * 3517680Spst */ 36146778Ssam 37146778Ssam#include "sysinstall.h" 38146778Ssam#include <stdarg.h> 39146778Ssam#include <sys/ioctl.h> 40146778Ssam#include <sys/consio.h> 41146778Ssam 42146778SsamBoolean 43146778SsamisDebug(void) 44146778Ssam{ 45146778Ssam char *cp; 46146778Ssam 47146778Ssam return (cp = variable_get(VAR_DEBUG)) && strcmp(cp, "no"); 48146778Ssam} 49146778Ssam 50146778Ssam/* Whack up an informational message on the status line, in stand-out */ 51146778Ssamvoid 52146778SsammsgYap(char *fmt, ...) 53146778Ssam{ 54146778Ssam va_list args; 55146778Ssam char *errstr; 56146778Ssam int attrs; 57146778Ssam 58146778Ssam errstr = (char *)alloca(FILENAME_MAX); 59146778Ssam va_start(args, fmt); 60146778Ssam vsnprintf(errstr, FILENAME_MAX, fmt, args); 61146778Ssam va_end(args); 62146778Ssam attrs = getattrs(stdscr); 63146778Ssam attrset(A_REVERSE); 64146778Ssam mvaddstr(StatusLine, 0, errstr); 65146778Ssam attrset(attrs); 66146778Ssam refresh(); 67146778Ssam} 68146778Ssam 69146778Ssam/* Whack up an informational message on the status line */ 70146778Ssamvoid 71146778SsammsgInfo(char *fmt, ...) 72146778Ssam{ 73146778Ssam va_list args; 74146778Ssam char *errstr; 75146778Ssam int i, attrs; 76146778Ssam char line[81]; 77146778Ssam 78146778Ssam attrs = getattrs(stdscr); 79146778Ssam /* NULL is a special convention meaning "erase the old stuff" */ 80146778Ssam if (!fmt) { 81146778Ssam move(StatusLine, 0); 82146778Ssam clrtoeol(); 83146778Ssam return; 84146778Ssam } 8556893Sfenner errstr = (char *)alloca(FILENAME_MAX); 8656893Sfenner va_start(args, fmt); 8756893Sfenner vsnprintf(errstr, FILENAME_MAX, fmt, args); 8856893Sfenner va_end(args); 8956893Sfenner memset(line, ' ', 80); 9056893Sfenner for (i = 0; i < 80; i++) { 9156893Sfenner if (errstr[i]) 9257278Sfenner line[i] = errstr[i]; 9357278Sfenner else 9456893Sfenner break; 9556893Sfenner } 9656893Sfenner line[80] = '\0'; 9756893Sfenner attrset(ATTR_TITLE); 9857278Sfenner mvaddstr(StatusLine, 0, line); 9957278Sfenner attrset(attrs); 10056893Sfenner move(StatusLine, 79); 10156893Sfenner refresh(); 10256893Sfenner} 10356893Sfenner 10456893Sfenner/* Whack up a warning on the status line */ 10517680Spstvoid 10617680SpstmsgWarn(char *fmt, ...) 10717680Spst{ 10817680Spst va_list args; 10917680Spst char *errstr; 11056893Sfenner int attrs; 11117680Spst 11275118Sfenner errstr = (char *)alloca(FILENAME_MAX); 11375118Sfenner strcpy(errstr, "Warning: "); 11456893Sfenner va_start(args, fmt); 11556893Sfenner vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 11656893Sfenner va_end(args); 11756893Sfenner attrs = getattrs(stdscr); 11856893Sfenner beep(); 11998527Sfenner attrset(ATTR_TITLE); 12098527Sfenner mvaddstr(StatusLine, 0, errstr); 12156893Sfenner attrset(attrs); 12298527Sfenner refresh(); 12398527Sfenner if (OnVTY && isDebug()) 12498527Sfenner msgDebug("Warning message `%s'\n", errstr); 12598527Sfenner} 12656893Sfenner 12798527Sfenner/* Whack up an error on the status line */ 12898527Sfennervoid 12998527SfennermsgError(char *fmt, ...) 13098527Sfenner{ 13198527Sfenner va_list args; 13298527Sfenner char *errstr; 13398527Sfenner int attrs; 13498527Sfenner 13598527Sfenner errstr = (char *)alloca(FILENAME_MAX); 13698527Sfenner strcpy(errstr, "Error: "); 13798527Sfenner va_start(args, fmt); 13898527Sfenner vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 13956893Sfenner va_end(args); 14056893Sfenner beep(); 14156893Sfenner attrs = getattrs(stdscr); 14298527Sfenner attrset(ATTR_TITLE); 14398527Sfenner mvaddstr(StatusLine, 0, errstr); 14456893Sfenner attrset(attrs); 14556893Sfenner refresh(); 14698527Sfenner if (OnVTY && isDebug()) 14798527Sfenner msgDebug("Error message `%s'\n", errstr); 14898527Sfenner} 14998527Sfenner 15098527Sfenner/* Whack up a fatal error on the status line */ 15198527Sfennervoid 15298527SfennermsgFatal(char *fmt, ...) 15398527Sfenner{ 15498527Sfenner va_list args; 15598527Sfenner char *errstr; 15698527Sfenner int attrs; 15798527Sfenner 15856893Sfenner errstr = (char *)alloca(FILENAME_MAX); 15998527Sfenner strcpy(errstr, "Fatal Error: "); 16098527Sfenner va_start(args, fmt); 16198527Sfenner vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args); 16298527Sfenner va_end(args); 16398527Sfenner beep(); 16498527Sfenner attrs = getattrs(stdscr); 16598527Sfenner attrset(ATTR_TITLE); 16698527Sfenner mvaddstr(StatusLine, 0, errstr); 16798527Sfenner addstr(" - "); 168127675Sbms addstr("PRESS ANY KEY TO "); 16998527Sfenner if (getpid() == 1) 17098527Sfenner addstr("REBOOT"); 17198527Sfenner else 17298527Sfenner addstr("QUIT"); 17398527Sfenner attrset(attrs); 17498527Sfenner refresh(); 17598527Sfenner if (OnVTY) 17698527Sfenner msgDebug("Fatal error `%s'!\n", errstr); 17798527Sfenner getch(); 178127675Sbms systemShutdown(1); 17998527Sfenner} 18098527Sfenner 18198527Sfenner/* Put up a message in a popup confirmation box */ 18298527Sfennervoid 18398527SfennermsgConfirm(char *fmt, ...) 18498527Sfenner{ 18598527Sfenner va_list args; 18656893Sfenner char *errstr; 18756893Sfenner WINDOW *w = savescr(); 18856893Sfenner 18998527Sfenner errstr = (char *)alloca(FILENAME_MAX); 19098527Sfenner va_start(args, fmt); 19198527Sfenner vsnprintf(errstr, FILENAME_MAX, fmt, args); 19298527Sfenner va_end(args); 19356893Sfenner use_helpline(NULL); 19498527Sfenner use_helpfile(NULL); 19556893Sfenner if (OnVTY) { 19698527Sfenner ioctl(0, VT_ACTIVATE, 1); 19798527Sfenner msgInfo(NULL); 19856893Sfenner } 19956893Sfenner dialog_notify(errstr); 20017680Spst restorescr(w); 20156893Sfenner} 20217680Spst 20398527Sfenner/* Put up a message in a popup information box */ 20498527Sfennervoid 20517680SpstmsgNotify(char *fmt, ...) 20698527Sfenner{ 20798527Sfenner va_list args; 20898527Sfenner char *errstr; 20917680Spst 210127675Sbms errstr = (char *)alloca(FILENAME_MAX); 21198527Sfenner va_start(args, fmt); 21217680Spst vsnprintf(errstr, FILENAME_MAX, fmt, args); 21398527Sfenner va_end(args); 21498527Sfenner use_helpline(NULL); 21598527Sfenner use_helpfile(NULL); 21698527Sfenner if (isDebug()) 21798527Sfenner msgDebug("Notify: %s\n", errstr); 21898527Sfenner dialog_msgbox(NULL, errstr, -1, -1, 0); 21998527Sfenner} 22056893Sfenner 22198527Sfenner/* Put up a message in a popup yes/no box and return 0 for YES, 1 for NO */ 22298527Sfennerint 22356893SfennermsgYesNo(char *fmt, ...) 22498527Sfenner{ 22598527Sfenner va_list args; 22656893Sfenner char *errstr; 22798527Sfenner int ret; 22898527Sfenner WINDOW *w = savescr(); 22956893Sfenner 23098527Sfenner errstr = (char *)alloca(FILENAME_MAX); 23156893Sfenner va_start(args, fmt); 23298527Sfenner vsnprintf(errstr, FILENAME_MAX, fmt, args); 23398527Sfenner va_end(args); 23498527Sfenner use_helpline(NULL); 23598527Sfenner use_helpfile(NULL); 23698527Sfenner if (OnVTY) { 23798527Sfenner ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 23898527Sfenner msgInfo(NULL); 23917680Spst } 24098527Sfenner if (variable_get(VAR_NONINTERACTIVE)) 24198527Sfenner return 0; /* If non-interactive, return YES all the time */ 24298527Sfenner ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1); 24398527Sfenner restorescr(w); 24498527Sfenner return ret; 24598527Sfenner} 24698527Sfenner 24798527Sfenner/* Put up a message in a popup no/yes box and return 0 for YES, 1 for NO */ 24898527Sfennerint 24998527SfennermsgNoYes(char *fmt, ...) 25098527Sfenner{ 25198527Sfenner va_list args; 25298527Sfenner char *errstr; 25398527Sfenner int ret; 25498527Sfenner WINDOW *w = savescr(); 25598527Sfenner 25698527Sfenner errstr = (char *)alloca(FILENAME_MAX); 25798527Sfenner va_start(args, fmt); 25898527Sfenner vsnprintf(errstr, FILENAME_MAX, fmt, args); 25998527Sfenner va_end(args); 26098527Sfenner use_helpline(NULL); 26198527Sfenner use_helpfile(NULL); 26256893Sfenner if (OnVTY) { 26398527Sfenner ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 26498527Sfenner msgInfo(NULL); 26598527Sfenner } 26698527Sfenner if (variable_get(VAR_NONINTERACTIVE)) 26798527Sfenner return 1; /* If non-interactive, return NO all the time */ 26898527Sfenner ret = dialog_noyes("User Confirmation Requested", errstr, -1, -1); 26998527Sfenner restorescr(w); 27098527Sfenner return ret; 27198527Sfenner} 27298527Sfenner 27398527Sfenner/* Put up a message in an input box and return the value */ 27456893Sfennerchar * 27556893SfennermsgGetInput(char *buf, char *fmt, ...) 27698527Sfenner{ 27798527Sfenner va_list args; 27898527Sfenner char *errstr; 27956893Sfenner static char input_buffer[256]; 28056893Sfenner int rval; 28198527Sfenner WINDOW *w = savescr(); 28298527Sfenner 28398527Sfenner errstr = (char *)alloca(FILENAME_MAX); 28498527Sfenner va_start(args, fmt); 28598527Sfenner vsnprintf(errstr, FILENAME_MAX, fmt, args); 28698527Sfenner va_end(args); 28798527Sfenner use_helpline(NULL); 28898527Sfenner use_helpfile(NULL); 28998527Sfenner if (buf) 29098527Sfenner SAFE_STRCPY(input_buffer, buf); 29198527Sfenner else 29298527Sfenner input_buffer[0] = '\0'; 29398527Sfenner if (OnVTY) { 29498527Sfenner ioctl(0, VT_ACTIVATE, 1); /* Switch back */ 29598527Sfenner msgInfo(NULL); 29698527Sfenner } 29798527Sfenner rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer); 29856893Sfenner restorescr(w); 29998527Sfenner if (!rval) 30098527Sfenner return input_buffer; 30198527Sfenner else 30217680Spst return NULL; 30356893Sfenner} 30498527Sfenner 30598527Sfenner/* Write something to the debugging port */ 30617680Spstvoid 30756893SfennermsgDebug(char *fmt, ...) 30856893Sfenner{ 30956893Sfenner va_list args; 31098527Sfenner char *dbg; 31198527Sfenner 31298527Sfenner if (DebugFD == -1) 31356893Sfenner return; 31456893Sfenner dbg = (char *)alloca(FILENAME_MAX); 31556893Sfenner strcpy(dbg, "DEBUG: "); 31656893Sfenner va_start(args, fmt); 31798527Sfenner vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args); 31898527Sfenner va_end(args); 31998527Sfenner write(DebugFD, dbg, strlen(dbg)); 32056893Sfenner} 32198527Sfenner 32298527Sfenner/* Tell the user there's some output to go look at */ 32398527Sfennervoid 32498527SfennermsgWeHaveOutput(char *fmt, ...) 32598527Sfenner{ 32698527Sfenner va_list args; 32798527Sfenner char *errstr; 32898527Sfenner WINDOW *w = savescr(); 32998527Sfenner 33098527Sfenner errstr = (char *)alloca(FILENAME_MAX); 33198527Sfenner va_start(args, fmt); 33298527Sfenner vsnprintf(errstr, FILENAME_MAX, fmt, args); 33398527Sfenner va_end(args); 33498527Sfenner use_helpline(NULL); 33556893Sfenner use_helpfile(NULL); 33698527Sfenner msgDebug("Notify: %s\n", errstr); 33798527Sfenner dialog_clear_norefresh(); 33856893Sfenner sleep(2); 33998527Sfenner dialog_msgbox(NULL, errstr, -1, -1, 0); 34098527Sfenner restorescr(w); 34198527Sfenner} 34298527Sfenner 34398527Sfenner/* Simple versions of msgConfirm() and msgNotify() for calling from scripts */ 34498527Sfennerint 34598527SfennermsgSimpleConfirm(char *str) 34656893Sfenner{ 34798527Sfenner msgConfirm("%s", str); 34856893Sfenner return DITEM_SUCCESS; 34998527Sfenner} 35056893Sfenner 35198527Sfennerint 35256893SfennermsgSimpleNotify(char *str) 35398527Sfenner{ 35498527Sfenner msgNotify("%s", str); 35598527Sfenner return DITEM_SUCCESS; 35698527Sfenner} 35798527Sfenner