msg.c revision 8628
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 *
78628Sjkh * $Id: msg.c,v 1.13 1995/05/18 14:11:16 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();
648628Sjkh    if (OnVTY)
658628Sjkh	msgDebug("Informational message `%s'\n", errstr);
668262Sjkh    free(errstr);
678262Sjkh}
688262Sjkh
698097Sjkh/* Whack up an informational message on the status line */
708097Sjkhvoid
718097SjkhmsgInfo(char *fmt, ...)
728097Sjkh{
738097Sjkh    va_list args;
748097Sjkh    char *errstr;
758262Sjkh    int attrs;
768097Sjkh
778317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
788097Sjkh    va_start(args, fmt);
798347Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
808097Sjkh    va_end(args);
818262Sjkh    attrs = getattrs(stdscr);
828262Sjkh    attrset(A_NORMAL);
838262Sjkh    mvaddstr(23, 0, errstr);
848262Sjkh    attrset(attrs);
858262Sjkh    refresh();
868628Sjkh    if (OnVTY)
878628Sjkh	msgDebug("Informational message `%s'\n", errstr);
888097Sjkh    free(errstr);
898097Sjkh}
908097Sjkh
918097Sjkh/* Whack up a warning on the status line */
928097Sjkhvoid
938097SjkhmsgWarn(char *fmt, ...)
948097Sjkh{
958097Sjkh    va_list args;
968097Sjkh    char *errstr;
978262Sjkh    int attrs;
988097Sjkh
998317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1008097Sjkh    strcpy(errstr, "Warning: ");
1018097Sjkh    va_start(args, fmt);
1028097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1038097Sjkh    va_end(args);
1048262Sjkh    attrs = getattrs(stdscr);
1058097Sjkh    beep();
1068314Sjkh    attrset(A_REVERSE);
1078262Sjkh    mvaddstr(23, 0, errstr);
1088262Sjkh    attrset(attrs);
1098262Sjkh    refresh();
1108628Sjkh    if (OnVTY)
1118628Sjkh	msgDebug("Warning message `%s'\n", errstr);
1128097Sjkh    free(errstr);
1138097Sjkh}
1148097Sjkh
1158097Sjkh/* Whack up an error on the status line */
1168097Sjkhvoid
1178097SjkhmsgError(char *fmt, ...)
1188097Sjkh{
1198097Sjkh    va_list args;
1208097Sjkh    char *errstr;
1218262Sjkh    int attrs;
1228097Sjkh
1238317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1248097Sjkh    strcpy(errstr, "Error: ");
1258097Sjkh    va_start(args, fmt);
1268097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1278097Sjkh    va_end(args);
1288097Sjkh    beep();
1298262Sjkh    attrs = getattrs(stdscr);
1308314Sjkh    attrset(A_REVERSE);
1318262Sjkh    mvaddstr(23, 0, errstr);
1328262Sjkh    attrset(attrs);
1338262Sjkh    refresh();
1348628Sjkh    if (OnVTY)
1358628Sjkh	msgDebug("Error message `%s'\n", errstr);
1368097Sjkh    free(errstr);
1378097Sjkh}
1388097Sjkh
1398097Sjkh/* Whack up a fatal error on the status line */
1408097Sjkhvoid
1418097SjkhmsgFatal(char *fmt, ...)
1428097Sjkh{
1438097Sjkh    va_list args;
1448097Sjkh    char *errstr;
1458262Sjkh    int attrs;
1468097Sjkh
1478317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1488097Sjkh    strcpy(errstr, "Fatal Error: ");
1498097Sjkh    va_start(args, fmt);
1508097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1518097Sjkh    va_end(args);
1528097Sjkh    beep();
1538262Sjkh    attrs = getattrs(stdscr);
1548314Sjkh    attrset(A_REVERSE);
1558262Sjkh    mvaddstr(23, 0, errstr);
1568097Sjkh    addstr(" - ");
1578097Sjkh    addstr("PRESS ANY KEY TO ");
1588097Sjkh    if (getpid() == 1)
1598097Sjkh	addstr("REBOOT");
1608097Sjkh    else
1618097Sjkh	addstr("QUIT");
1628262Sjkh    attrset(attrs);
1638262Sjkh    refresh();
1648628Sjkh    if (OnVTY)
1658628Sjkh	msgDebug("Fatal error `%s'!\n", errstr);
1668097Sjkh    free(errstr);
1678097Sjkh    getch();
1688097Sjkh    systemShutdown();
1698097Sjkh}
1708097Sjkh
1718208Sjkh/* Put up a message in a popup confirmation box */
1728208Sjkhvoid
1738208SjkhmsgConfirm(char *fmt, ...)
1748208Sjkh{
1758208Sjkh    va_list args;
1768208Sjkh    char *errstr;
1778208Sjkh
1788317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1798208Sjkh    va_start(args, fmt);
1808208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
1818208Sjkh    va_end(args);
1828208Sjkh    use_helpline(NULL);
1838208Sjkh    use_helpfile(NULL);
1848628Sjkh    if (OnVTY)
1858628Sjkh	msgDebug("User confirmation requested (type ALT-F1)\n");
1868556Sjkh    dialog_notify(errstr);
1878208Sjkh    free(errstr);
1888208Sjkh}
1898208Sjkh
1908302Sjkh/* Put up a message in a popup information box */
1918302Sjkhvoid
1928302SjkhmsgNotify(char *fmt, ...)
1938302Sjkh{
1948302Sjkh    va_list args;
1958302Sjkh    char *errstr;
1968556Sjkh    WINDOW *w;
1978302Sjkh
1988317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1998302Sjkh    va_start(args, fmt);
2008302Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2018302Sjkh    va_end(args);
2028302Sjkh    use_helpline(NULL);
2038302Sjkh    use_helpfile(NULL);
2048628Sjkh    msgDebug("Notify: %s\n", errstr);
2058556Sjkh    w = dupwin(newscr);
2068438Sjkh    dialog_msgbox("Information Dialog", errstr, -1, -1, 0);
2078556Sjkh    touchwin(w);
2088556Sjkh    wrefresh(w);
2098556Sjkh    delwin(w);
2108302Sjkh    free(errstr);
2118302Sjkh}
2128302Sjkh
2138208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */
2148208Sjkhint
2158208SjkhmsgYesNo(char *fmt, ...)
2168208Sjkh{
2178208Sjkh    va_list args;
2188208Sjkh    char *errstr;
2198208Sjkh    int ret;
2208556Sjkh    WINDOW *w;
2218208Sjkh
2228317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2238208Sjkh    va_start(args, fmt);
2248208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2258208Sjkh    va_end(args);
2268208Sjkh    use_helpline(NULL);
2278208Sjkh    use_helpfile(NULL);
2288556Sjkh    w = dupwin(newscr);
2298628Sjkh    if (OnVTY)
2308628Sjkh	msgDebug("User decision requested (type ALT-F1)\n");
2318281Sjkh    ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1);
2328556Sjkh    touchwin(w);
2338556Sjkh    wrefresh(w);
2348556Sjkh    delwin(w);
2358208Sjkh    free(errstr);
2368208Sjkh    return ret;
2378208Sjkh}
2388262Sjkh
2398262Sjkh/* Put up a message in an input box and return the value */
2408262Sjkhchar *
2418262SjkhmsgGetInput(char *buf, char *fmt, ...)
2428262Sjkh{
2438262Sjkh    va_list args;
2448262Sjkh    char *errstr;
2458278Sjkh    static char input_buffer[256];
2468262Sjkh    int rval;
2478556Sjkh    WINDOW *w;
2488262Sjkh
2498317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2508262Sjkh    va_start(args, fmt);
2518262Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2528262Sjkh    va_end(args);
2538262Sjkh    use_helpline(NULL);
2548262Sjkh    use_helpfile(NULL);
2558302Sjkh    if (buf)
2568302Sjkh	strcpy(input_buffer, buf);
2578302Sjkh    else
2588302Sjkh	input_buffer[0] = '\0';
2598556Sjkh    w = dupwin(newscr);
2608628Sjkh    if (OnVTY)
2618628Sjkh	msgDebug("User input requested (type ALT-F1)\n");
2628262Sjkh    rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer);
2638556Sjkh    touchwin(w);
2648556Sjkh    wrefresh(w);
2658556Sjkh    delwin(w);
2668262Sjkh    free(errstr);
2678262Sjkh    if (!rval)
2688262Sjkh	return input_buffer;
2698262Sjkh    else
2708262Sjkh	return NULL;
2718262Sjkh}
2728262Sjkh
2738347Sjkh/* Write something to the debugging port */
2748347Sjkhvoid
2758347SjkhmsgDebug(char *fmt, ...)
2768347Sjkh{
2778347Sjkh    va_list args;
2788347Sjkh    char *dbg;
2798347Sjkh
2808594Sjkh    if (DebugFD == -1)
2818594Sjkh	return;
2828347Sjkh    dbg = (char *)safe_malloc(FILENAME_MAX);
2838347Sjkh    strcpy(dbg, "DEBUG: ");
2848347Sjkh    va_start(args, fmt);
2858347Sjkh    vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args);
2868347Sjkh    va_end(args);
2878347Sjkh    write(DebugFD, dbg, strlen(dbg));
2888347Sjkh    free(dbg);
2898347Sjkh}
290