msg.c revision 8705
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 *
78705Sjkh * $Id: msg.c,v 1.22 1995/05/22 14:10:25 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>
468097Sjkh
478702Sjkh#define VTY_STATLINE	24
488702Sjkh#define TTY_STATLINE	23
498702Sjkh
508262Sjkh/* Whack up an informational message on the status line, in stand-out */
518262Sjkhvoid
528262SjkhmsgYap(char *fmt, ...)
538262Sjkh{
548262Sjkh    va_list args;
558262Sjkh    char *errstr;
568262Sjkh    int attrs;
578262Sjkh
588317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
598262Sjkh    va_start(args, fmt);
608347Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
618262Sjkh    va_end(args);
628262Sjkh    attrs = getattrs(stdscr);
638314Sjkh    attrset(A_REVERSE);
648702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
658262Sjkh    attrset(attrs);
668262Sjkh    refresh();
678262Sjkh    free(errstr);
688262Sjkh}
698262Sjkh
708097Sjkh/* Whack up an informational message on the status line */
718097Sjkhvoid
728097SjkhmsgInfo(char *fmt, ...)
738097Sjkh{
748097Sjkh    va_list args;
758097Sjkh    char *errstr;
768705Sjkh    int i, attrs;
778705Sjkh    char line[81];
788097Sjkh
798705Sjkh    attrs = getattrs(stdscr);
808641Sjkh    /* NULL is a special convention meaning "erase the old stuff" */
818641Sjkh    if (!fmt) {
828702Sjkh	move(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0);
838705Sjkh	attrset(A_REVERSE);
848641Sjkh	clrtoeol();
858705Sjkh	attrset(attrs);
868641Sjkh	return;
878641Sjkh    }
888317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
898097Sjkh    va_start(args, fmt);
908347Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
918097Sjkh    va_end(args);
928705Sjkh    memset(line, ' ', 80);
938705Sjkh    for (i = 0; i < 80; i++) {
948705Sjkh	if (errstr[i])
958705Sjkh	    line[i] = errstr[i];
968705Sjkh	else
978705Sjkh	    break;
988705Sjkh    }
998705Sjkh    line[80] = '\0';
1008705Sjkh    attrset(A_REVERSE);
1018705Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, line);
1028262Sjkh    attrset(attrs);
1038262Sjkh    refresh();
1048640Sjkh    if (OnVTY) {
1058658Sphk	msgDebug("Information: `%s'\n", errstr);
1068641Sjkh	msgInfo(NULL);
1078640Sjkh    }
1088097Sjkh    free(errstr);
1098097Sjkh}
1108097Sjkh
1118097Sjkh/* Whack up a warning on the status line */
1128097Sjkhvoid
1138097SjkhmsgWarn(char *fmt, ...)
1148097Sjkh{
1158097Sjkh    va_list args;
1168097Sjkh    char *errstr;
1178262Sjkh    int attrs;
1188097Sjkh
1198317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1208097Sjkh    strcpy(errstr, "Warning: ");
1218097Sjkh    va_start(args, fmt);
1228097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1238097Sjkh    va_end(args);
1248262Sjkh    attrs = getattrs(stdscr);
1258097Sjkh    beep();
1268314Sjkh    attrset(A_REVERSE);
1278702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
1288262Sjkh    attrset(attrs);
1298262Sjkh    refresh();
1308628Sjkh    if (OnVTY)
1318628Sjkh	msgDebug("Warning message `%s'\n", errstr);
1328097Sjkh    free(errstr);
1338097Sjkh}
1348097Sjkh
1358097Sjkh/* Whack up an error on the status line */
1368097Sjkhvoid
1378097SjkhmsgError(char *fmt, ...)
1388097Sjkh{
1398097Sjkh    va_list args;
1408097Sjkh    char *errstr;
1418262Sjkh    int attrs;
1428097Sjkh
1438317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1448097Sjkh    strcpy(errstr, "Error: ");
1458097Sjkh    va_start(args, fmt);
1468097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1478097Sjkh    va_end(args);
1488097Sjkh    beep();
1498262Sjkh    attrs = getattrs(stdscr);
1508314Sjkh    attrset(A_REVERSE);
1518702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
1528262Sjkh    attrset(attrs);
1538262Sjkh    refresh();
1548628Sjkh    if (OnVTY)
1558628Sjkh	msgDebug("Error message `%s'\n", errstr);
1568097Sjkh    free(errstr);
1578097Sjkh}
1588097Sjkh
1598097Sjkh/* Whack up a fatal error on the status line */
1608097Sjkhvoid
1618097SjkhmsgFatal(char *fmt, ...)
1628097Sjkh{
1638097Sjkh    va_list args;
1648097Sjkh    char *errstr;
1658262Sjkh    int attrs;
1668097Sjkh
1678317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1688097Sjkh    strcpy(errstr, "Fatal Error: ");
1698097Sjkh    va_start(args, fmt);
1708097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1718097Sjkh    va_end(args);
1728097Sjkh    beep();
1738262Sjkh    attrs = getattrs(stdscr);
1748314Sjkh    attrset(A_REVERSE);
1758702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
1768097Sjkh    addstr(" - ");
1778097Sjkh    addstr("PRESS ANY KEY TO ");
1788097Sjkh    if (getpid() == 1)
1798097Sjkh	addstr("REBOOT");
1808097Sjkh    else
1818097Sjkh	addstr("QUIT");
1828262Sjkh    attrset(attrs);
1838262Sjkh    refresh();
1848628Sjkh    if (OnVTY)
1858628Sjkh	msgDebug("Fatal error `%s'!\n", errstr);
1868097Sjkh    free(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
1998317Sjkh    errstr = (char *)safe_malloc(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);
2058649Sjkh    w = dupwin(newscr);
2068640Sjkh    if (OnVTY) {
2078628Sjkh	msgDebug("User confirmation requested (type ALT-F1)\n");
2088641Sjkh	msgInfo(NULL);
2098640Sjkh    }
2108556Sjkh    dialog_notify(errstr);
2118649Sjkh    touchwin(w);
2128649Sjkh    wrefresh(w);
2138649Sjkh    delwin(w);
2148208Sjkh    free(errstr);
2158208Sjkh}
2168208Sjkh
2178302Sjkh/* Put up a message in a popup information box */
2188302Sjkhvoid
2198302SjkhmsgNotify(char *fmt, ...)
2208302Sjkh{
2218302Sjkh    va_list args;
2228302Sjkh    char *errstr;
2238302Sjkh
2248317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2258302Sjkh    va_start(args, fmt);
2268302Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2278302Sjkh    va_end(args);
2288302Sjkh    use_helpline(NULL);
2298302Sjkh    use_helpfile(NULL);
2308628Sjkh    msgDebug("Notify: %s\n", errstr);
2318649Sjkh    dialog_clear();
2328438Sjkh    dialog_msgbox("Information Dialog", errstr, -1, -1, 0);
2338302Sjkh    free(errstr);
2348302Sjkh}
2358302Sjkh
2368208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */
2378208Sjkhint
2388208SjkhmsgYesNo(char *fmt, ...)
2398208Sjkh{
2408208Sjkh    va_list args;
2418208Sjkh    char *errstr;
2428208Sjkh    int ret;
2438556Sjkh    WINDOW *w;
2448208Sjkh
2458317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2468208Sjkh    va_start(args, fmt);
2478208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2488208Sjkh    va_end(args);
2498208Sjkh    use_helpline(NULL);
2508208Sjkh    use_helpfile(NULL);
2518556Sjkh    w = dupwin(newscr);
2528640Sjkh    if (OnVTY) {
2538628Sjkh	msgDebug("User decision requested (type ALT-F1)\n");
2548641Sjkh	msgInfo(NULL);
2558640Sjkh    }
2568281Sjkh    ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1);
2578556Sjkh    touchwin(w);
2588556Sjkh    wrefresh(w);
2598556Sjkh    delwin(w);
2608208Sjkh    free(errstr);
2618208Sjkh    return ret;
2628208Sjkh}
2638262Sjkh
2648262Sjkh/* Put up a message in an input box and return the value */
2658262Sjkhchar *
2668262SjkhmsgGetInput(char *buf, char *fmt, ...)
2678262Sjkh{
2688262Sjkh    va_list args;
2698262Sjkh    char *errstr;
2708278Sjkh    static char input_buffer[256];
2718262Sjkh    int rval;
2728556Sjkh    WINDOW *w;
2738262Sjkh
2748317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2758262Sjkh    va_start(args, fmt);
2768262Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2778262Sjkh    va_end(args);
2788262Sjkh    use_helpline(NULL);
2798262Sjkh    use_helpfile(NULL);
2808302Sjkh    if (buf)
2818302Sjkh	strcpy(input_buffer, buf);
2828302Sjkh    else
2838302Sjkh	input_buffer[0] = '\0';
2848556Sjkh    w = dupwin(newscr);
2858640Sjkh    if (OnVTY) {
2868628Sjkh	msgDebug("User input requested (type ALT-F1)\n");
2878641Sjkh	msgInfo(NULL);
2888640Sjkh    }
2898262Sjkh    rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer);
2908556Sjkh    touchwin(w);
2918556Sjkh    wrefresh(w);
2928556Sjkh    delwin(w);
2938262Sjkh    free(errstr);
2948262Sjkh    if (!rval)
2958262Sjkh	return input_buffer;
2968262Sjkh    else
2978262Sjkh	return NULL;
2988262Sjkh}
2998262Sjkh
3008347Sjkh/* Write something to the debugging port */
3018347Sjkhvoid
3028347SjkhmsgDebug(char *fmt, ...)
3038347Sjkh{
3048347Sjkh    va_list args;
3058347Sjkh    char *dbg;
3068347Sjkh
3078594Sjkh    if (DebugFD == -1)
3088594Sjkh	return;
3098347Sjkh    dbg = (char *)safe_malloc(FILENAME_MAX);
3108347Sjkh    strcpy(dbg, "DEBUG: ");
3118347Sjkh    va_start(args, fmt);
3128347Sjkh    vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args);
3138347Sjkh    va_end(args);
3148347Sjkh    write(DebugFD, dbg, strlen(dbg));
3158347Sjkh    free(dbg);
3168347Sjkh}
3178705Sjkh
3188705Sjkh/* Tell the user there's some output to go look at */
3198705Sjkhvoid
3208705SjkhmsgWeHaveOutput(char *fmt, ...)
3218705Sjkh{
3228705Sjkh    va_list args;
3238705Sjkh    char *errstr;
3248705Sjkh
3258705Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
3268705Sjkh    va_start(args, fmt);
3278705Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
3288705Sjkh    va_end(args);
3298705Sjkh    use_helpline(NULL);
3308705Sjkh    use_helpfile(NULL);
3318705Sjkh    msgDebug("Notify: %s\n", errstr);
3328705Sjkh    dialog_clear();
3338705Sjkh    dialog_msgbox("Information Dialog", errstr, -1, -1, 0);
3348705Sjkh    free(errstr);
3358705Sjkh    if (OnVTY)
3368705Sjkh	msgInfo("Command output is on debugging screen - type ALT-F2 to see it");
3378705Sjkh}
338