msg.c revision 15242
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 *
715242Sjkh * $Id: msg.c,v 1.30 1995/12/07 10:34:09 peter 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
618317Sjkh    errstr = (char *)safe_malloc(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    free(errstr);
718262Sjkh}
728262Sjkh
738097Sjkh/* Whack up an informational message on the status line */
748097Sjkhvoid
758097SjkhmsgInfo(char *fmt, ...)
768097Sjkh{
778097Sjkh    va_list args;
788097Sjkh    char *errstr;
798705Sjkh    int i, attrs;
808705Sjkh    char line[81];
818097Sjkh
828705Sjkh    attrs = getattrs(stdscr);
838641Sjkh    /* NULL is a special convention meaning "erase the old stuff" */
848641Sjkh    if (!fmt) {
858702Sjkh	move(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0);
868705Sjkh	attrset(A_REVERSE);
878641Sjkh	clrtoeol();
888705Sjkh	attrset(attrs);
898641Sjkh	return;
908641Sjkh    }
918317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
928097Sjkh    va_start(args, fmt);
938347Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
948097Sjkh    va_end(args);
958705Sjkh    memset(line, ' ', 80);
968705Sjkh    for (i = 0; i < 80; i++) {
978705Sjkh	if (errstr[i])
988705Sjkh	    line[i] = errstr[i];
998705Sjkh	else
1008705Sjkh	    break;
1018705Sjkh    }
1028705Sjkh    line[80] = '\0';
1038705Sjkh    attrset(A_REVERSE);
1048705Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, line);
1058262Sjkh    attrset(attrs);
1068722Sjkh    move(OnVTY ? VTY_STATLINE : TTY_STATLINE, 79);
1078262Sjkh    refresh();
1088640Sjkh    if (OnVTY) {
1098837Sjkh	if (isDebug())
1108837Sjkh	    msgDebug("Information: `%s'\n", errstr);
1118641Sjkh	msgInfo(NULL);
1128640Sjkh    }
1138097Sjkh    free(errstr);
1148097Sjkh}
1158097Sjkh
1168097Sjkh/* Whack up a warning on the status line */
1178097Sjkhvoid
1188097SjkhmsgWarn(char *fmt, ...)
1198097Sjkh{
1208097Sjkh    va_list args;
1218097Sjkh    char *errstr;
1228262Sjkh    int attrs;
1238097Sjkh
1248317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1258097Sjkh    strcpy(errstr, "Warning: ");
1268097Sjkh    va_start(args, fmt);
1278097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1288097Sjkh    va_end(args);
1298262Sjkh    attrs = getattrs(stdscr);
1308097Sjkh    beep();
1318314Sjkh    attrset(A_REVERSE);
1328702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
1338262Sjkh    attrset(attrs);
1348262Sjkh    refresh();
1358837Sjkh    if (OnVTY && isDebug())
1368628Sjkh	msgDebug("Warning message `%s'\n", errstr);
1378097Sjkh    free(errstr);
1388097Sjkh}
1398097Sjkh
1408097Sjkh/* Whack up an error on the status line */
1418097Sjkhvoid
1428097SjkhmsgError(char *fmt, ...)
1438097Sjkh{
1448097Sjkh    va_list args;
1458097Sjkh    char *errstr;
1468262Sjkh    int attrs;
1478097Sjkh
1488317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1498097Sjkh    strcpy(errstr, "Error: ");
1508097Sjkh    va_start(args, fmt);
1518097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1528097Sjkh    va_end(args);
1538097Sjkh    beep();
1548262Sjkh    attrs = getattrs(stdscr);
1558314Sjkh    attrset(A_REVERSE);
1568702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
1578262Sjkh    attrset(attrs);
1588262Sjkh    refresh();
1598837Sjkh    if (OnVTY && isDebug())
1608628Sjkh	msgDebug("Error message `%s'\n", errstr);
1618097Sjkh    free(errstr);
1628097Sjkh}
1638097Sjkh
1648097Sjkh/* Whack up a fatal error on the status line */
1658097Sjkhvoid
1668097SjkhmsgFatal(char *fmt, ...)
1678097Sjkh{
1688097Sjkh    va_list args;
1698097Sjkh    char *errstr;
1708262Sjkh    int attrs;
1718097Sjkh
1728317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1738097Sjkh    strcpy(errstr, "Fatal Error: ");
1748097Sjkh    va_start(args, fmt);
1758097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1768097Sjkh    va_end(args);
1778097Sjkh    beep();
1788262Sjkh    attrs = getattrs(stdscr);
1798314Sjkh    attrset(A_REVERSE);
1808702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
1818097Sjkh    addstr(" - ");
1828097Sjkh    addstr("PRESS ANY KEY TO ");
1838097Sjkh    if (getpid() == 1)
1848097Sjkh	addstr("REBOOT");
1858097Sjkh    else
1868097Sjkh	addstr("QUIT");
1878262Sjkh    attrset(attrs);
1888262Sjkh    refresh();
1898628Sjkh    if (OnVTY)
1908628Sjkh	msgDebug("Fatal error `%s'!\n", errstr);
1918097Sjkh    free(errstr);
1928097Sjkh    getch();
1938097Sjkh    systemShutdown();
1948097Sjkh}
1958097Sjkh
1968208Sjkh/* Put up a message in a popup confirmation box */
1978208Sjkhvoid
1988208SjkhmsgConfirm(char *fmt, ...)
1998208Sjkh{
2008208Sjkh    va_list args;
2018208Sjkh    char *errstr;
2028649Sjkh    WINDOW *w;
2038208Sjkh
2048317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2058208Sjkh    va_start(args, fmt);
2068208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2078208Sjkh    va_end(args);
2088208Sjkh    use_helpline(NULL);
2098208Sjkh    use_helpfile(NULL);
21015242Sjkh    w = savescr();
2118640Sjkh    if (OnVTY) {
21212661Speter	msgDebug("Switching back to VTY1\n");
2139202Srgrimes	ioctl(0, VT_ACTIVATE, 1);
2148641Sjkh	msgInfo(NULL);
2158640Sjkh    }
2168556Sjkh    dialog_notify(errstr);
21715242Sjkh    restorescr(w);
2188208Sjkh    free(errstr);
2198208Sjkh}
2208208Sjkh
2218302Sjkh/* Put up a message in a popup information box */
2228302Sjkhvoid
2238302SjkhmsgNotify(char *fmt, ...)
2248302Sjkh{
2258302Sjkh    va_list args;
2268302Sjkh    char *errstr;
2278302Sjkh
2288317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2298302Sjkh    va_start(args, fmt);
2308302Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2318302Sjkh    va_end(args);
2328302Sjkh    use_helpline(NULL);
2338302Sjkh    use_helpfile(NULL);
2348837Sjkh    if (isDebug())
2358837Sjkh	msgDebug("Notify: %s\n", errstr);
2368649Sjkh    dialog_clear();
2378438Sjkh    dialog_msgbox("Information Dialog", errstr, -1, -1, 0);
2388302Sjkh    free(errstr);
2398302Sjkh}
2408302Sjkh
2418208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */
2428208Sjkhint
2438208SjkhmsgYesNo(char *fmt, ...)
2448208Sjkh{
2458208Sjkh    va_list args;
2468208Sjkh    char *errstr;
2478208Sjkh    int ret;
2488556Sjkh    WINDOW *w;
2498208Sjkh
2508317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2518208Sjkh    va_start(args, fmt);
2528208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2538208Sjkh    va_end(args);
2548208Sjkh    use_helpline(NULL);
2558208Sjkh    use_helpfile(NULL);
25615242Sjkh    w = savescr();
2578640Sjkh    if (OnVTY) {
25812661Speter	msgDebug("Switching back to VTY1\n");
2599202Srgrimes	ioctl(0, VT_ACTIVATE, 1);	/* Switch back */
2608641Sjkh	msgInfo(NULL);
2618640Sjkh    }
2628281Sjkh    ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1);
26315242Sjkh    restorescr(w);
2648208Sjkh    free(errstr);
2658208Sjkh    return ret;
2668208Sjkh}
2678262Sjkh
2688262Sjkh/* Put up a message in an input box and return the value */
2698262Sjkhchar *
2708262SjkhmsgGetInput(char *buf, char *fmt, ...)
2718262Sjkh{
2728262Sjkh    va_list args;
2738262Sjkh    char *errstr;
2748278Sjkh    static char input_buffer[256];
2758262Sjkh    int rval;
2768556Sjkh    WINDOW *w;
2778262Sjkh
2788317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2798262Sjkh    va_start(args, fmt);
2808262Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2818262Sjkh    va_end(args);
2828262Sjkh    use_helpline(NULL);
2838262Sjkh    use_helpfile(NULL);
2848302Sjkh    if (buf)
2858302Sjkh	strcpy(input_buffer, buf);
2868302Sjkh    else
2878302Sjkh	input_buffer[0] = '\0';
28815242Sjkh    w = savescr();
2898640Sjkh    if (OnVTY) {
29012661Speter	msgDebug("Switching back to VTY1\n");
2919202Srgrimes	ioctl(0, VT_ACTIVATE, 1);	/* Switch back */
2928641Sjkh	msgInfo(NULL);
2938640Sjkh    }
2948262Sjkh    rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer);
29515242Sjkh    restorescr(w);
2968262Sjkh    free(errstr);
2978262Sjkh    if (!rval)
2988262Sjkh	return input_buffer;
2998262Sjkh    else
3008262Sjkh	return NULL;
3018262Sjkh}
3028262Sjkh
3038347Sjkh/* Write something to the debugging port */
3048347Sjkhvoid
3058347SjkhmsgDebug(char *fmt, ...)
3068347Sjkh{
3078347Sjkh    va_list args;
3088347Sjkh    char *dbg;
3098347Sjkh
3108594Sjkh    if (DebugFD == -1)
3118594Sjkh	return;
3128347Sjkh    dbg = (char *)safe_malloc(FILENAME_MAX);
3138347Sjkh    strcpy(dbg, "DEBUG: ");
3148347Sjkh    va_start(args, fmt);
3158347Sjkh    vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args);
3168347Sjkh    va_end(args);
3178347Sjkh    write(DebugFD, dbg, strlen(dbg));
3188347Sjkh    free(dbg);
3198347Sjkh}
3208705Sjkh
3218705Sjkh/* Tell the user there's some output to go look at */
3228705Sjkhvoid
3238705SjkhmsgWeHaveOutput(char *fmt, ...)
3248705Sjkh{
3258705Sjkh    va_list args;
3268705Sjkh    char *errstr;
3278705Sjkh
3288705Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
3298705Sjkh    va_start(args, fmt);
3308705Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
3318705Sjkh    va_end(args);
3328705Sjkh    use_helpline(NULL);
3338705Sjkh    use_helpfile(NULL);
3348705Sjkh    msgDebug("Notify: %s\n", errstr);
3358705Sjkh    dialog_clear();
3368705Sjkh    dialog_msgbox("Information Dialog", errstr, -1, -1, 0);
3378705Sjkh    free(errstr);
3388705Sjkh    if (OnVTY)
33912661Speter	msgInfo("Command output is on VTY2 - type ALT-F2 to see it");
3408705Sjkh}
34112661Speter
34212661Speter/* Simple versions of msgConfirm() and msgNotify() for calling from scripts */
34312661Speterint
34412661SpetermsgSimpleConfirm(char *str)
34512661Speter{
34612661Speter    msgConfirm(str);
34715242Sjkh    return DITEM_SUCCESS;
34812661Speter}
34912661Speter
35012661Speterint
35112661SpetermsgSimpleNotify(char *str)
35212661Speter{
35312661Speter    msgNotify(str);
35415242Sjkh    return DITEM_SUCCESS;
35512661Speter}
356