msg.c revision 8658
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 *
78658Sphk * $Id: msg.c,v 1.20 1995/05/20 14:05:31 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
478262Sjkh/* Whack up an informational message on the status line, in stand-out */
488262Sjkhvoid
498262SjkhmsgYap(char *fmt, ...)
508262Sjkh{
518262Sjkh    va_list args;
528262Sjkh    char *errstr;
538262Sjkh    int attrs;
548262Sjkh
558317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
568262Sjkh    va_start(args, fmt);
578347Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
588262Sjkh    va_end(args);
598262Sjkh    attrs = getattrs(stdscr);
608314Sjkh    attrset(A_REVERSE);
618262Sjkh    mvaddstr(23, 0, errstr);
628262Sjkh    attrset(attrs);
638262Sjkh    refresh();
648262Sjkh    free(errstr);
658262Sjkh}
668262Sjkh
678097Sjkh/* Whack up an informational message on the status line */
688097Sjkhvoid
698097SjkhmsgInfo(char *fmt, ...)
708097Sjkh{
718097Sjkh    va_list args;
728097Sjkh    char *errstr;
738262Sjkh    int attrs;
748097Sjkh
758641Sjkh    /* NULL is a special convention meaning "erase the old stuff" */
768641Sjkh    if (!fmt) {
778641Sjkh	move(23, 0);
788641Sjkh	clrtoeol();
798641Sjkh	return;
808641Sjkh    }
818317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
828097Sjkh    va_start(args, fmt);
838347Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
848097Sjkh    va_end(args);
858262Sjkh    attrs = getattrs(stdscr);
868262Sjkh    attrset(A_NORMAL);
878262Sjkh    mvaddstr(23, 0, errstr);
888262Sjkh    attrset(attrs);
898262Sjkh    refresh();
908640Sjkh    if (OnVTY) {
918658Sphk	msgDebug("Information: `%s'\n", errstr);
928641Sjkh	msgInfo(NULL);
938640Sjkh    }
948097Sjkh    free(errstr);
958097Sjkh}
968097Sjkh
978097Sjkh/* Whack up a warning on the status line */
988097Sjkhvoid
998097SjkhmsgWarn(char *fmt, ...)
1008097Sjkh{
1018097Sjkh    va_list args;
1028097Sjkh    char *errstr;
1038262Sjkh    int attrs;
1048097Sjkh
1058317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1068097Sjkh    strcpy(errstr, "Warning: ");
1078097Sjkh    va_start(args, fmt);
1088097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1098097Sjkh    va_end(args);
1108262Sjkh    attrs = getattrs(stdscr);
1118097Sjkh    beep();
1128314Sjkh    attrset(A_REVERSE);
1138262Sjkh    mvaddstr(23, 0, errstr);
1148262Sjkh    attrset(attrs);
1158262Sjkh    refresh();
1168628Sjkh    if (OnVTY)
1178628Sjkh	msgDebug("Warning message `%s'\n", errstr);
1188097Sjkh    free(errstr);
1198097Sjkh}
1208097Sjkh
1218097Sjkh/* Whack up an error on the status line */
1228097Sjkhvoid
1238097SjkhmsgError(char *fmt, ...)
1248097Sjkh{
1258097Sjkh    va_list args;
1268097Sjkh    char *errstr;
1278262Sjkh    int attrs;
1288097Sjkh
1298317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1308097Sjkh    strcpy(errstr, "Error: ");
1318097Sjkh    va_start(args, fmt);
1328097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1338097Sjkh    va_end(args);
1348097Sjkh    beep();
1358262Sjkh    attrs = getattrs(stdscr);
1368314Sjkh    attrset(A_REVERSE);
1378262Sjkh    mvaddstr(23, 0, errstr);
1388262Sjkh    attrset(attrs);
1398262Sjkh    refresh();
1408628Sjkh    if (OnVTY)
1418628Sjkh	msgDebug("Error message `%s'\n", errstr);
1428097Sjkh    free(errstr);
1438097Sjkh}
1448097Sjkh
1458097Sjkh/* Whack up a fatal error on the status line */
1468097Sjkhvoid
1478097SjkhmsgFatal(char *fmt, ...)
1488097Sjkh{
1498097Sjkh    va_list args;
1508097Sjkh    char *errstr;
1518262Sjkh    int attrs;
1528097Sjkh
1538317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1548097Sjkh    strcpy(errstr, "Fatal Error: ");
1558097Sjkh    va_start(args, fmt);
1568097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1578097Sjkh    va_end(args);
1588097Sjkh    beep();
1598262Sjkh    attrs = getattrs(stdscr);
1608314Sjkh    attrset(A_REVERSE);
1618262Sjkh    mvaddstr(23, 0, errstr);
1628097Sjkh    addstr(" - ");
1638097Sjkh    addstr("PRESS ANY KEY TO ");
1648097Sjkh    if (getpid() == 1)
1658097Sjkh	addstr("REBOOT");
1668097Sjkh    else
1678097Sjkh	addstr("QUIT");
1688262Sjkh    attrset(attrs);
1698262Sjkh    refresh();
1708628Sjkh    if (OnVTY)
1718628Sjkh	msgDebug("Fatal error `%s'!\n", errstr);
1728097Sjkh    free(errstr);
1738097Sjkh    getch();
1748097Sjkh    systemShutdown();
1758097Sjkh}
1768097Sjkh
1778208Sjkh/* Put up a message in a popup confirmation box */
1788208Sjkhvoid
1798208SjkhmsgConfirm(char *fmt, ...)
1808208Sjkh{
1818208Sjkh    va_list args;
1828208Sjkh    char *errstr;
1838649Sjkh    WINDOW *w;
1848208Sjkh
1858317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1868208Sjkh    va_start(args, fmt);
1878208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
1888208Sjkh    va_end(args);
1898208Sjkh    use_helpline(NULL);
1908208Sjkh    use_helpfile(NULL);
1918649Sjkh    w = dupwin(newscr);
1928640Sjkh    if (OnVTY) {
1938628Sjkh	msgDebug("User confirmation requested (type ALT-F1)\n");
1948641Sjkh	msgInfo(NULL);
1958640Sjkh    }
1968556Sjkh    dialog_notify(errstr);
1978649Sjkh    touchwin(w);
1988649Sjkh    wrefresh(w);
1998649Sjkh    delwin(w);
2008208Sjkh    free(errstr);
2018208Sjkh}
2028208Sjkh
2038302Sjkh/* Put up a message in a popup information box */
2048302Sjkhvoid
2058302SjkhmsgNotify(char *fmt, ...)
2068302Sjkh{
2078302Sjkh    va_list args;
2088302Sjkh    char *errstr;
2098302Sjkh
2108317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2118302Sjkh    va_start(args, fmt);
2128302Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2138302Sjkh    va_end(args);
2148302Sjkh    use_helpline(NULL);
2158302Sjkh    use_helpfile(NULL);
2168628Sjkh    msgDebug("Notify: %s\n", errstr);
2178649Sjkh    dialog_clear();
2188438Sjkh    dialog_msgbox("Information Dialog", errstr, -1, -1, 0);
2198302Sjkh    free(errstr);
2208302Sjkh}
2218302Sjkh
2228208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */
2238208Sjkhint
2248208SjkhmsgYesNo(char *fmt, ...)
2258208Sjkh{
2268208Sjkh    va_list args;
2278208Sjkh    char *errstr;
2288208Sjkh    int ret;
2298556Sjkh    WINDOW *w;
2308208Sjkh
2318317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2328208Sjkh    va_start(args, fmt);
2338208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2348208Sjkh    va_end(args);
2358208Sjkh    use_helpline(NULL);
2368208Sjkh    use_helpfile(NULL);
2378556Sjkh    w = dupwin(newscr);
2388640Sjkh    if (OnVTY) {
2398628Sjkh	msgDebug("User decision requested (type ALT-F1)\n");
2408641Sjkh	msgInfo(NULL);
2418640Sjkh    }
2428281Sjkh    ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1);
2438556Sjkh    touchwin(w);
2448556Sjkh    wrefresh(w);
2458556Sjkh    delwin(w);
2468208Sjkh    free(errstr);
2478208Sjkh    return ret;
2488208Sjkh}
2498262Sjkh
2508262Sjkh/* Put up a message in an input box and return the value */
2518262Sjkhchar *
2528262SjkhmsgGetInput(char *buf, char *fmt, ...)
2538262Sjkh{
2548262Sjkh    va_list args;
2558262Sjkh    char *errstr;
2568278Sjkh    static char input_buffer[256];
2578262Sjkh    int rval;
2588556Sjkh    WINDOW *w;
2598262Sjkh
2608317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2618262Sjkh    va_start(args, fmt);
2628262Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2638262Sjkh    va_end(args);
2648262Sjkh    use_helpline(NULL);
2658262Sjkh    use_helpfile(NULL);
2668302Sjkh    if (buf)
2678302Sjkh	strcpy(input_buffer, buf);
2688302Sjkh    else
2698302Sjkh	input_buffer[0] = '\0';
2708556Sjkh    w = dupwin(newscr);
2718640Sjkh    if (OnVTY) {
2728628Sjkh	msgDebug("User input requested (type ALT-F1)\n");
2738641Sjkh	msgInfo(NULL);
2748640Sjkh    }
2758262Sjkh    rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer);
2768556Sjkh    touchwin(w);
2778556Sjkh    wrefresh(w);
2788556Sjkh    delwin(w);
2798262Sjkh    free(errstr);
2808262Sjkh    if (!rval)
2818262Sjkh	return input_buffer;
2828262Sjkh    else
2838262Sjkh	return NULL;
2848262Sjkh}
2858262Sjkh
2868347Sjkh/* Write something to the debugging port */
2878347Sjkhvoid
2888347SjkhmsgDebug(char *fmt, ...)
2898347Sjkh{
2908347Sjkh    va_list args;
2918347Sjkh    char *dbg;
2928347Sjkh
2938594Sjkh    if (DebugFD == -1)
2948594Sjkh	return;
2958347Sjkh    dbg = (char *)safe_malloc(FILENAME_MAX);
2968347Sjkh    strcpy(dbg, "DEBUG: ");
2978347Sjkh    va_start(args, fmt);
2988347Sjkh    vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args);
2998347Sjkh    va_end(args);
3008347Sjkh    write(DebugFD, dbg, strlen(dbg));
3018347Sjkh    free(dbg);
3028347Sjkh}
303