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