msg.c revision 29628
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 *
729628Sjkh * $Id: msg.c,v 1.46 1997/09/09 16:27:50 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
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
428837SjkhBoolean
438837SjkhisDebug(void)
448837Sjkh{
4512661Speter    char *cp;
4612661Speter
4712661Speter    return (cp = variable_get(VAR_DEBUG)) && strcmp(cp, "no");
488837Sjkh}
498837Sjkh
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
5815416Sjkh    errstr = (char *)alloca(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);
6417375Sjkh    mvaddstr(StatusLine, 0, errstr);
658262Sjkh    attrset(attrs);
668262Sjkh    refresh();
678262Sjkh}
688262Sjkh
698097Sjkh/* Whack up an informational message on the status line */
708097Sjkhvoid
718097SjkhmsgInfo(char *fmt, ...)
728097Sjkh{
738097Sjkh    va_list args;
748097Sjkh    char *errstr;
758705Sjkh    int i, attrs;
768705Sjkh    char line[81];
778097Sjkh
788705Sjkh    attrs = getattrs(stdscr);
798641Sjkh    /* NULL is a special convention meaning "erase the old stuff" */
808641Sjkh    if (!fmt) {
8117375Sjkh	move(StatusLine, 0);
828641Sjkh	clrtoeol();
838641Sjkh	return;
848641Sjkh    }
8515416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
868097Sjkh    va_start(args, fmt);
878347Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
888097Sjkh    va_end(args);
898705Sjkh    memset(line, ' ', 80);
908705Sjkh    for (i = 0; i < 80; i++) {
918705Sjkh	if (errstr[i])
928705Sjkh	    line[i] = errstr[i];
938705Sjkh	else
948705Sjkh	    break;
958705Sjkh    }
968705Sjkh    line[80] = '\0';
9716366Sjkh    attrset(ATTR_TITLE);
9817375Sjkh    mvaddstr(StatusLine, 0, line);
998262Sjkh    attrset(attrs);
10017375Sjkh    move(StatusLine, 79);
1018262Sjkh    refresh();
1028097Sjkh}
1038097Sjkh
1048097Sjkh/* Whack up a warning on the status line */
1058097Sjkhvoid
1068097SjkhmsgWarn(char *fmt, ...)
1078097Sjkh{
1088097Sjkh    va_list args;
1098097Sjkh    char *errstr;
1108262Sjkh    int attrs;
1118097Sjkh
11215416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
1138097Sjkh    strcpy(errstr, "Warning: ");
1148097Sjkh    va_start(args, fmt);
1158097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1168097Sjkh    va_end(args);
1178262Sjkh    attrs = getattrs(stdscr);
1188097Sjkh    beep();
11916366Sjkh    attrset(ATTR_TITLE);
12017375Sjkh    mvaddstr(StatusLine, 0, errstr);
1218262Sjkh    attrset(attrs);
1228262Sjkh    refresh();
1238837Sjkh    if (OnVTY && isDebug())
1248628Sjkh	msgDebug("Warning message `%s'\n", errstr);
1258097Sjkh}
1268097Sjkh
1278097Sjkh/* Whack up an error on the status line */
1288097Sjkhvoid
1298097SjkhmsgError(char *fmt, ...)
1308097Sjkh{
1318097Sjkh    va_list args;
1328097Sjkh    char *errstr;
1338262Sjkh    int attrs;
1348097Sjkh
13515416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
1368097Sjkh    strcpy(errstr, "Error: ");
1378097Sjkh    va_start(args, fmt);
1388097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1398097Sjkh    va_end(args);
1408097Sjkh    beep();
1418262Sjkh    attrs = getattrs(stdscr);
14216366Sjkh    attrset(ATTR_TITLE);
14317375Sjkh    mvaddstr(StatusLine, 0, errstr);
1448262Sjkh    attrset(attrs);
1458262Sjkh    refresh();
1468837Sjkh    if (OnVTY && isDebug())
1478628Sjkh	msgDebug("Error message `%s'\n", errstr);
1488097Sjkh}
1498097Sjkh
1508097Sjkh/* Whack up a fatal error on the status line */
1518097Sjkhvoid
1528097SjkhmsgFatal(char *fmt, ...)
1538097Sjkh{
1548097Sjkh    va_list args;
1558097Sjkh    char *errstr;
1568262Sjkh    int attrs;
1578097Sjkh
15815416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
1598097Sjkh    strcpy(errstr, "Fatal Error: ");
1608097Sjkh    va_start(args, fmt);
1618097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1628097Sjkh    va_end(args);
1638097Sjkh    beep();
1648262Sjkh    attrs = getattrs(stdscr);
16516366Sjkh    attrset(ATTR_TITLE);
16617375Sjkh    mvaddstr(StatusLine, 0, errstr);
1678097Sjkh    addstr(" - ");
1688097Sjkh    addstr("PRESS ANY KEY TO ");
1698097Sjkh    if (getpid() == 1)
1708097Sjkh	addstr("REBOOT");
1718097Sjkh    else
1728097Sjkh	addstr("QUIT");
1738262Sjkh    attrset(attrs);
1748262Sjkh    refresh();
1758628Sjkh    if (OnVTY)
1768628Sjkh	msgDebug("Fatal error `%s'!\n", errstr);
1778097Sjkh    getch();
17815788Sjkh    systemShutdown(1);
1798097Sjkh}
1808097Sjkh
1818208Sjkh/* Put up a message in a popup confirmation box */
1828208Sjkhvoid
1838208SjkhmsgConfirm(char *fmt, ...)
1848208Sjkh{
1858208Sjkh    va_list args;
1868208Sjkh    char *errstr;
1878208Sjkh
18815416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
1898208Sjkh    va_start(args, fmt);
1908208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
1918208Sjkh    va_end(args);
1928208Sjkh    use_helpline(NULL);
1938208Sjkh    use_helpfile(NULL);
1948640Sjkh    if (OnVTY) {
1959202Srgrimes	ioctl(0, VT_ACTIVATE, 1);
1968641Sjkh	msgInfo(NULL);
1978640Sjkh    }
1988556Sjkh    dialog_notify(errstr);
1998208Sjkh}
2008208Sjkh
2018302Sjkh/* Put up a message in a popup information box */
2028302Sjkhvoid
2038302SjkhmsgNotify(char *fmt, ...)
2048302Sjkh{
2058302Sjkh    va_list args;
2068302Sjkh    char *errstr;
2078302Sjkh
20815416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
2098302Sjkh    va_start(args, fmt);
2108302Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2118302Sjkh    va_end(args);
2128302Sjkh    use_helpline(NULL);
2138302Sjkh    use_helpfile(NULL);
2148837Sjkh    if (isDebug())
2158837Sjkh	msgDebug("Notify: %s\n", errstr);
21617404Sjkh    dialog_clear_norefresh();
21729628Sjkh    dialog_msgbox(NULL, errstr, -1, -1, 0);
2188302Sjkh}
2198302Sjkh
2208208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */
2218208Sjkhint
2228208SjkhmsgYesNo(char *fmt, ...)
2238208Sjkh{
2248208Sjkh    va_list args;
2258208Sjkh    char *errstr;
2268208Sjkh    int ret;
2278208Sjkh
22815416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
2298208Sjkh    va_start(args, fmt);
2308208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2318208Sjkh    va_end(args);
2328208Sjkh    use_helpline(NULL);
2338208Sjkh    use_helpfile(NULL);
2348640Sjkh    if (OnVTY) {
2359202Srgrimes	ioctl(0, VT_ACTIVATE, 1);	/* Switch back */
2368641Sjkh	msgInfo(NULL);
2378640Sjkh    }
2388281Sjkh    ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1);
2398208Sjkh    return ret;
2408208Sjkh}
2418262Sjkh
2428262Sjkh/* Put up a message in an input box and return the value */
2438262Sjkhchar *
2448262SjkhmsgGetInput(char *buf, char *fmt, ...)
2458262Sjkh{
2468262Sjkh    va_list args;
2478262Sjkh    char *errstr;
2488278Sjkh    static char input_buffer[256];
2498262Sjkh    int rval;
2508262Sjkh
25115416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
2528262Sjkh    va_start(args, fmt);
2538262Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2548262Sjkh    va_end(args);
2558262Sjkh    use_helpline(NULL);
2568262Sjkh    use_helpfile(NULL);
2578302Sjkh    if (buf)
25820247Sjkh	SAFE_STRCPY(input_buffer, buf);
2598302Sjkh    else
2608302Sjkh	input_buffer[0] = '\0';
2618640Sjkh    if (OnVTY) {
2629202Srgrimes	ioctl(0, VT_ACTIVATE, 1);	/* Switch back */
2638641Sjkh	msgInfo(NULL);
2648640Sjkh    }
2658262Sjkh    rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer);
2668262Sjkh    if (!rval)
2678262Sjkh	return input_buffer;
2688262Sjkh    else
2698262Sjkh	return NULL;
2708262Sjkh}
2718262Sjkh
2728347Sjkh/* Write something to the debugging port */
2738347Sjkhvoid
2748347SjkhmsgDebug(char *fmt, ...)
2758347Sjkh{
2768347Sjkh    va_list args;
2778347Sjkh    char *dbg;
2788347Sjkh
2798594Sjkh    if (DebugFD == -1)
2808594Sjkh	return;
28115416Sjkh    dbg = (char *)alloca(FILENAME_MAX);
2828347Sjkh    strcpy(dbg, "DEBUG: ");
2838347Sjkh    va_start(args, fmt);
2848347Sjkh    vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args);
2858347Sjkh    va_end(args);
2868347Sjkh    write(DebugFD, dbg, strlen(dbg));
2878347Sjkh}
2888705Sjkh
2898705Sjkh/* Tell the user there's some output to go look at */
2908705Sjkhvoid
2918705SjkhmsgWeHaveOutput(char *fmt, ...)
2928705Sjkh{
2938705Sjkh    va_list args;
2948705Sjkh    char *errstr;
2958705Sjkh
29615416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
2978705Sjkh    va_start(args, fmt);
2988705Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2998705Sjkh    va_end(args);
3008705Sjkh    use_helpline(NULL);
3018705Sjkh    use_helpfile(NULL);
3028705Sjkh    msgDebug("Notify: %s\n", errstr);
30317404Sjkh    dialog_clear_norefresh();
30429628Sjkh    dialog_msgbox(NULL, errstr, -1, -1, 0);
3058705Sjkh}
30612661Speter
30712661Speter/* Simple versions of msgConfirm() and msgNotify() for calling from scripts */
30812661Speterint
30912661SpetermsgSimpleConfirm(char *str)
31012661Speter{
31112661Speter    msgConfirm(str);
31215242Sjkh    return DITEM_SUCCESS;
31312661Speter}
31412661Speter
31512661Speterint
31612661SpetermsgSimpleNotify(char *str)
31712661Speter{
31812661Speter    msgNotify(str);
31915242Sjkh    return DITEM_SUCCESS;
32012661Speter}
321