msg.c revision 8825
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 *
78825Sjkh * $Id: msg.c,v 1.24 1995/05/24 09:00:56 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
168097Sjkh *    notice, this list of conditions and the following disclaimer,
178097Sjkh *    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 * 3. All advertising materials mentioning features or use of this software
238097Sjkh *    must display the following acknowledgement:
248097Sjkh *	This product includes software developed by Jordan Hubbard
258097Sjkh *	for the FreeBSD Project.
268097Sjkh * 4. The name of Jordan Hubbard or the FreeBSD project may not be used to
278097Sjkh *    endorse or promote products derived from this software without specific
288097Sjkh *    prior written permission.
298097Sjkh *
308097Sjkh * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND
318097Sjkh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
328097Sjkh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
338097Sjkh * ARE DISCLAIMED.  IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE
348097Sjkh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
358097Sjkh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
368097Sjkh * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION)
378097Sjkh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
388097Sjkh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
398097Sjkh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
408097Sjkh * SUCH DAMAGE.
418097Sjkh *
428097Sjkh */
438097Sjkh
448097Sjkh#include "sysinstall.h"
458097Sjkh#include <stdarg.h>
468825Sjkh#include <sys/ioctl.h>
478825Sjkh#include <machine/console.h>
488097Sjkh
498702Sjkh#define VTY_STATLINE	24
508702Sjkh#define TTY_STATLINE	23
518702Sjkh
528262Sjkh/* Whack up an informational message on the status line, in stand-out */
538262Sjkhvoid
548262SjkhmsgYap(char *fmt, ...)
558262Sjkh{
568262Sjkh    va_list args;
578262Sjkh    char *errstr;
588262Sjkh    int attrs;
598262Sjkh
608317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
618262Sjkh    va_start(args, fmt);
628347Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
638262Sjkh    va_end(args);
648262Sjkh    attrs = getattrs(stdscr);
658314Sjkh    attrset(A_REVERSE);
668702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
678262Sjkh    attrset(attrs);
688262Sjkh    refresh();
698262Sjkh    free(errstr);
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    }
908317Sjkh    errstr = (char *)safe_malloc(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) {
1088658Sphk	msgDebug("Information: `%s'\n", errstr);
1098641Sjkh	msgInfo(NULL);
1108640Sjkh    }
1118097Sjkh    free(errstr);
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
1228317Sjkh    errstr = (char *)safe_malloc(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();
1338628Sjkh    if (OnVTY)
1348628Sjkh	msgDebug("Warning message `%s'\n", errstr);
1358097Sjkh    free(errstr);
1368097Sjkh}
1378097Sjkh
1388097Sjkh/* Whack up an error on the status line */
1398097Sjkhvoid
1408097SjkhmsgError(char *fmt, ...)
1418097Sjkh{
1428097Sjkh    va_list args;
1438097Sjkh    char *errstr;
1448262Sjkh    int attrs;
1458097Sjkh
1468317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1478097Sjkh    strcpy(errstr, "Error: ");
1488097Sjkh    va_start(args, fmt);
1498097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1508097Sjkh    va_end(args);
1518097Sjkh    beep();
1528262Sjkh    attrs = getattrs(stdscr);
1538314Sjkh    attrset(A_REVERSE);
1548702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
1558262Sjkh    attrset(attrs);
1568262Sjkh    refresh();
1578628Sjkh    if (OnVTY)
1588628Sjkh	msgDebug("Error message `%s'\n", errstr);
1598097Sjkh    free(errstr);
1608097Sjkh}
1618097Sjkh
1628097Sjkh/* Whack up a fatal error on the status line */
1638097Sjkhvoid
1648097SjkhmsgFatal(char *fmt, ...)
1658097Sjkh{
1668097Sjkh    va_list args;
1678097Sjkh    char *errstr;
1688262Sjkh    int attrs;
1698097Sjkh
1708317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1718097Sjkh    strcpy(errstr, "Fatal Error: ");
1728097Sjkh    va_start(args, fmt);
1738097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1748097Sjkh    va_end(args);
1758097Sjkh    beep();
1768262Sjkh    attrs = getattrs(stdscr);
1778314Sjkh    attrset(A_REVERSE);
1788702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
1798097Sjkh    addstr(" - ");
1808097Sjkh    addstr("PRESS ANY KEY TO ");
1818097Sjkh    if (getpid() == 1)
1828097Sjkh	addstr("REBOOT");
1838097Sjkh    else
1848097Sjkh	addstr("QUIT");
1858262Sjkh    attrset(attrs);
1868262Sjkh    refresh();
1878628Sjkh    if (OnVTY)
1888628Sjkh	msgDebug("Fatal error `%s'!\n", errstr);
1898097Sjkh    free(errstr);
1908097Sjkh    getch();
1918097Sjkh    systemShutdown();
1928097Sjkh}
1938097Sjkh
1948208Sjkh/* Put up a message in a popup confirmation box */
1958208Sjkhvoid
1968208SjkhmsgConfirm(char *fmt, ...)
1978208Sjkh{
1988208Sjkh    va_list args;
1998208Sjkh    char *errstr;
2008649Sjkh    WINDOW *w;
2018208Sjkh
2028317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2038208Sjkh    va_start(args, fmt);
2048208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2058208Sjkh    va_end(args);
2068208Sjkh    use_helpline(NULL);
2078208Sjkh    use_helpfile(NULL);
2088649Sjkh    w = dupwin(newscr);
2098640Sjkh    if (OnVTY) {
2108825Sjkh	ioctl(0, VT_RELDISP, 0);	/* Switch back */
2118641Sjkh	msgInfo(NULL);
2128640Sjkh    }
2138556Sjkh    dialog_notify(errstr);
2148649Sjkh    touchwin(w);
2158649Sjkh    wrefresh(w);
2168649Sjkh    delwin(w);
2178208Sjkh    free(errstr);
2188208Sjkh}
2198208Sjkh
2208302Sjkh/* Put up a message in a popup information box */
2218302Sjkhvoid
2228302SjkhmsgNotify(char *fmt, ...)
2238302Sjkh{
2248302Sjkh    va_list args;
2258302Sjkh    char *errstr;
2268302Sjkh
2278317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2288302Sjkh    va_start(args, fmt);
2298302Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2308302Sjkh    va_end(args);
2318302Sjkh    use_helpline(NULL);
2328302Sjkh    use_helpfile(NULL);
2338628Sjkh    msgDebug("Notify: %s\n", errstr);
2348649Sjkh    dialog_clear();
2358438Sjkh    dialog_msgbox("Information Dialog", errstr, -1, -1, 0);
2368302Sjkh    free(errstr);
2378302Sjkh}
2388302Sjkh
2398208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */
2408208Sjkhint
2418208SjkhmsgYesNo(char *fmt, ...)
2428208Sjkh{
2438208Sjkh    va_list args;
2448208Sjkh    char *errstr;
2458208Sjkh    int ret;
2468556Sjkh    WINDOW *w;
2478208Sjkh
2488317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2498208Sjkh    va_start(args, fmt);
2508208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2518208Sjkh    va_end(args);
2528208Sjkh    use_helpline(NULL);
2538208Sjkh    use_helpfile(NULL);
2548556Sjkh    w = dupwin(newscr);
2558640Sjkh    if (OnVTY) {
2568825Sjkh	ioctl(0, VT_RELDISP, 0);	/* Switch back */
2578641Sjkh	msgInfo(NULL);
2588640Sjkh    }
2598281Sjkh    ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1);
2608556Sjkh    touchwin(w);
2618556Sjkh    wrefresh(w);
2628556Sjkh    delwin(w);
2638208Sjkh    free(errstr);
2648208Sjkh    return ret;
2658208Sjkh}
2668262Sjkh
2678262Sjkh/* Put up a message in an input box and return the value */
2688262Sjkhchar *
2698262SjkhmsgGetInput(char *buf, char *fmt, ...)
2708262Sjkh{
2718262Sjkh    va_list args;
2728262Sjkh    char *errstr;
2738278Sjkh    static char input_buffer[256];
2748262Sjkh    int rval;
2758556Sjkh    WINDOW *w;
2768262Sjkh
2778317Sjkh    errstr = (char *)safe_malloc(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)
2848302Sjkh	strcpy(input_buffer, buf);
2858302Sjkh    else
2868302Sjkh	input_buffer[0] = '\0';
2878556Sjkh    w = dupwin(newscr);
2888640Sjkh    if (OnVTY) {
2898825Sjkh	ioctl(0, VT_RELDISP, 0);	/* Switch back */
2908641Sjkh	msgInfo(NULL);
2918640Sjkh    }
2928262Sjkh    rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer);
2938556Sjkh    touchwin(w);
2948556Sjkh    wrefresh(w);
2958556Sjkh    delwin(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)
3398705Sjkh	msgInfo("Command output is on debugging screen - type ALT-F2 to see it");
3408705Sjkh}
341