msg.c revision 15416
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 *
715416Sjkh * $Id: msg.c,v 1.31 1996/04/13 13:32:02 jkh Exp $
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>
408825Sjkh#include <machine/console.h>
418097Sjkh
428702Sjkh#define VTY_STATLINE	24
438702Sjkh#define TTY_STATLINE	23
448702Sjkh
458837SjkhBoolean
468837SjkhisDebug(void)
478837Sjkh{
4812661Speter    char *cp;
4912661Speter
5012661Speter    return (cp = variable_get(VAR_DEBUG)) && strcmp(cp, "no");
518837Sjkh}
528837Sjkh
538262Sjkh/* Whack up an informational message on the status line, in stand-out */
548262Sjkhvoid
558262SjkhmsgYap(char *fmt, ...)
568262Sjkh{
578262Sjkh    va_list args;
588262Sjkh    char *errstr;
598262Sjkh    int attrs;
608262Sjkh
6115416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
628262Sjkh    va_start(args, fmt);
638347Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
648262Sjkh    va_end(args);
658262Sjkh    attrs = getattrs(stdscr);
668314Sjkh    attrset(A_REVERSE);
678702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
688262Sjkh    attrset(attrs);
698262Sjkh    refresh();
708262Sjkh}
718262Sjkh
728097Sjkh/* Whack up an informational message on the status line */
738097Sjkhvoid
748097SjkhmsgInfo(char *fmt, ...)
758097Sjkh{
768097Sjkh    va_list args;
778097Sjkh    char *errstr;
788705Sjkh    int i, attrs;
798705Sjkh    char line[81];
808097Sjkh
818705Sjkh    attrs = getattrs(stdscr);
828641Sjkh    /* NULL is a special convention meaning "erase the old stuff" */
838641Sjkh    if (!fmt) {
848702Sjkh	move(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0);
858705Sjkh	attrset(A_REVERSE);
868641Sjkh	clrtoeol();
878705Sjkh	attrset(attrs);
888641Sjkh	return;
898641Sjkh    }
9015416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
918097Sjkh    va_start(args, fmt);
928347Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
938097Sjkh    va_end(args);
948705Sjkh    memset(line, ' ', 80);
958705Sjkh    for (i = 0; i < 80; i++) {
968705Sjkh	if (errstr[i])
978705Sjkh	    line[i] = errstr[i];
988705Sjkh	else
998705Sjkh	    break;
1008705Sjkh    }
1018705Sjkh    line[80] = '\0';
1028705Sjkh    attrset(A_REVERSE);
1038705Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, line);
1048262Sjkh    attrset(attrs);
1058722Sjkh    move(OnVTY ? VTY_STATLINE : TTY_STATLINE, 79);
1068262Sjkh    refresh();
1078640Sjkh    if (OnVTY) {
1088837Sjkh	if (isDebug())
1098837Sjkh	    msgDebug("Information: `%s'\n", errstr);
1108641Sjkh	msgInfo(NULL);
1118640Sjkh    }
1128097Sjkh}
1138097Sjkh
1148097Sjkh/* Whack up a warning on the status line */
1158097Sjkhvoid
1168097SjkhmsgWarn(char *fmt, ...)
1178097Sjkh{
1188097Sjkh    va_list args;
1198097Sjkh    char *errstr;
1208262Sjkh    int attrs;
1218097Sjkh
12215416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
1238097Sjkh    strcpy(errstr, "Warning: ");
1248097Sjkh    va_start(args, fmt);
1258097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1268097Sjkh    va_end(args);
1278262Sjkh    attrs = getattrs(stdscr);
1288097Sjkh    beep();
1298314Sjkh    attrset(A_REVERSE);
1308702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
1318262Sjkh    attrset(attrs);
1328262Sjkh    refresh();
1338837Sjkh    if (OnVTY && isDebug())
1348628Sjkh	msgDebug("Warning message `%s'\n", errstr);
1358097Sjkh}
1368097Sjkh
1378097Sjkh/* Whack up an error on the status line */
1388097Sjkhvoid
1398097SjkhmsgError(char *fmt, ...)
1408097Sjkh{
1418097Sjkh    va_list args;
1428097Sjkh    char *errstr;
1438262Sjkh    int attrs;
1448097Sjkh
14515416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
1468097Sjkh    strcpy(errstr, "Error: ");
1478097Sjkh    va_start(args, fmt);
1488097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1498097Sjkh    va_end(args);
1508097Sjkh    beep();
1518262Sjkh    attrs = getattrs(stdscr);
1528314Sjkh    attrset(A_REVERSE);
1538702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
1548262Sjkh    attrset(attrs);
1558262Sjkh    refresh();
1568837Sjkh    if (OnVTY && isDebug())
1578628Sjkh	msgDebug("Error message `%s'\n", errstr);
1588097Sjkh}
1598097Sjkh
1608097Sjkh/* Whack up a fatal error on the status line */
1618097Sjkhvoid
1628097SjkhmsgFatal(char *fmt, ...)
1638097Sjkh{
1648097Sjkh    va_list args;
1658097Sjkh    char *errstr;
1668262Sjkh    int attrs;
1678097Sjkh
16815416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
1698097Sjkh    strcpy(errstr, "Fatal Error: ");
1708097Sjkh    va_start(args, fmt);
1718097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1728097Sjkh    va_end(args);
1738097Sjkh    beep();
1748262Sjkh    attrs = getattrs(stdscr);
1758314Sjkh    attrset(A_REVERSE);
1768702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
1778097Sjkh    addstr(" - ");
1788097Sjkh    addstr("PRESS ANY KEY TO ");
1798097Sjkh    if (getpid() == 1)
1808097Sjkh	addstr("REBOOT");
1818097Sjkh    else
1828097Sjkh	addstr("QUIT");
1838262Sjkh    attrset(attrs);
1848262Sjkh    refresh();
1858628Sjkh    if (OnVTY)
1868628Sjkh	msgDebug("Fatal error `%s'!\n", errstr);
1878097Sjkh    getch();
1888097Sjkh    systemShutdown();
1898097Sjkh}
1908097Sjkh
1918208Sjkh/* Put up a message in a popup confirmation box */
1928208Sjkhvoid
1938208SjkhmsgConfirm(char *fmt, ...)
1948208Sjkh{
1958208Sjkh    va_list args;
1968208Sjkh    char *errstr;
1978649Sjkh    WINDOW *w;
1988208Sjkh
19915416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
2008208Sjkh    va_start(args, fmt);
2018208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2028208Sjkh    va_end(args);
2038208Sjkh    use_helpline(NULL);
2048208Sjkh    use_helpfile(NULL);
20515242Sjkh    w = savescr();
2068640Sjkh    if (OnVTY) {
20712661Speter	msgDebug("Switching back to VTY1\n");
2089202Srgrimes	ioctl(0, VT_ACTIVATE, 1);
2098641Sjkh	msgInfo(NULL);
2108640Sjkh    }
2118556Sjkh    dialog_notify(errstr);
21215242Sjkh    restorescr(w);
2138208Sjkh}
2148208Sjkh
2158302Sjkh/* Put up a message in a popup information box */
2168302Sjkhvoid
2178302SjkhmsgNotify(char *fmt, ...)
2188302Sjkh{
2198302Sjkh    va_list args;
2208302Sjkh    char *errstr;
2218302Sjkh
22215416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
2238302Sjkh    va_start(args, fmt);
2248302Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2258302Sjkh    va_end(args);
2268302Sjkh    use_helpline(NULL);
2278302Sjkh    use_helpfile(NULL);
2288837Sjkh    if (isDebug())
2298837Sjkh	msgDebug("Notify: %s\n", errstr);
2308649Sjkh    dialog_clear();
2318438Sjkh    dialog_msgbox("Information Dialog", errstr, -1, -1, 0);
2328302Sjkh}
2338302Sjkh
2348208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */
2358208Sjkhint
2368208SjkhmsgYesNo(char *fmt, ...)
2378208Sjkh{
2388208Sjkh    va_list args;
2398208Sjkh    char *errstr;
2408208Sjkh    int ret;
2418556Sjkh    WINDOW *w;
2428208Sjkh
24315416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
2448208Sjkh    va_start(args, fmt);
2458208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2468208Sjkh    va_end(args);
2478208Sjkh    use_helpline(NULL);
2488208Sjkh    use_helpfile(NULL);
24915242Sjkh    w = savescr();
2508640Sjkh    if (OnVTY) {
25112661Speter	msgDebug("Switching back to VTY1\n");
2529202Srgrimes	ioctl(0, VT_ACTIVATE, 1);	/* Switch back */
2538641Sjkh	msgInfo(NULL);
2548640Sjkh    }
2558281Sjkh    ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1);
25615242Sjkh    restorescr(w);
2578208Sjkh    return ret;
2588208Sjkh}
2598262Sjkh
2608262Sjkh/* Put up a message in an input box and return the value */
2618262Sjkhchar *
2628262SjkhmsgGetInput(char *buf, char *fmt, ...)
2638262Sjkh{
2648262Sjkh    va_list args;
2658262Sjkh    char *errstr;
2668278Sjkh    static char input_buffer[256];
2678262Sjkh    int rval;
2688556Sjkh    WINDOW *w;
2698262Sjkh
27015416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
2718262Sjkh    va_start(args, fmt);
2728262Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2738262Sjkh    va_end(args);
2748262Sjkh    use_helpline(NULL);
2758262Sjkh    use_helpfile(NULL);
2768302Sjkh    if (buf)
2778302Sjkh	strcpy(input_buffer, buf);
2788302Sjkh    else
2798302Sjkh	input_buffer[0] = '\0';
28015242Sjkh    w = savescr();
2818640Sjkh    if (OnVTY) {
28212661Speter	msgDebug("Switching back to VTY1\n");
2839202Srgrimes	ioctl(0, VT_ACTIVATE, 1);	/* Switch back */
2848641Sjkh	msgInfo(NULL);
2858640Sjkh    }
2868262Sjkh    rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer);
28715242Sjkh    restorescr(w);
2888262Sjkh    if (!rval)
2898262Sjkh	return input_buffer;
2908262Sjkh    else
2918262Sjkh	return NULL;
2928262Sjkh}
2938262Sjkh
2948347Sjkh/* Write something to the debugging port */
2958347Sjkhvoid
2968347SjkhmsgDebug(char *fmt, ...)
2978347Sjkh{
2988347Sjkh    va_list args;
2998347Sjkh    char *dbg;
3008347Sjkh
3018594Sjkh    if (DebugFD == -1)
3028594Sjkh	return;
30315416Sjkh    dbg = (char *)alloca(FILENAME_MAX);
3048347Sjkh    strcpy(dbg, "DEBUG: ");
3058347Sjkh    va_start(args, fmt);
3068347Sjkh    vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args);
3078347Sjkh    va_end(args);
3088347Sjkh    write(DebugFD, dbg, strlen(dbg));
3098347Sjkh}
3108705Sjkh
3118705Sjkh/* Tell the user there's some output to go look at */
3128705Sjkhvoid
3138705SjkhmsgWeHaveOutput(char *fmt, ...)
3148705Sjkh{
3158705Sjkh    va_list args;
3168705Sjkh    char *errstr;
3178705Sjkh
31815416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
3198705Sjkh    va_start(args, fmt);
3208705Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
3218705Sjkh    va_end(args);
3228705Sjkh    use_helpline(NULL);
3238705Sjkh    use_helpfile(NULL);
3248705Sjkh    msgDebug("Notify: %s\n", errstr);
3258705Sjkh    dialog_clear();
3268705Sjkh    dialog_msgbox("Information Dialog", errstr, -1, -1, 0);
3278705Sjkh    if (OnVTY)
32812661Speter	msgInfo("Command output is on VTY2 - type ALT-F2 to see it");
3298705Sjkh}
33012661Speter
33112661Speter/* Simple versions of msgConfirm() and msgNotify() for calling from scripts */
33212661Speterint
33312661SpetermsgSimpleConfirm(char *str)
33412661Speter{
33512661Speter    msgConfirm(str);
33615242Sjkh    return DITEM_SUCCESS;
33712661Speter}
33812661Speter
33912661Speterint
34012661SpetermsgSimpleNotify(char *str)
34112661Speter{
34212661Speter    msgNotify(str);
34315242Sjkh    return DITEM_SUCCESS;
34412661Speter}
345