msg.c revision 54587
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 *
750479Speter * $FreeBSD: head/usr.sbin/sade/msg.c 54587 1999-12-14 04:25:29Z jkh $
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;
18754587Sjkh    WINDOW *w = savescr();
1888208Sjkh
18915416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
1908208Sjkh    va_start(args, fmt);
1918208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
1928208Sjkh    va_end(args);
1938208Sjkh    use_helpline(NULL);
1948208Sjkh    use_helpfile(NULL);
1958640Sjkh    if (OnVTY) {
1969202Srgrimes	ioctl(0, VT_ACTIVATE, 1);
1978641Sjkh	msgInfo(NULL);
1988640Sjkh    }
1998556Sjkh    dialog_notify(errstr);
20054587Sjkh    restorescr(w);
2018208Sjkh}
2028208Sjkh
2038302Sjkh/* Put up a message in a popup information box */
2048302Sjkhvoid
2058302SjkhmsgNotify(char *fmt, ...)
2068302Sjkh{
2078302Sjkh    va_list args;
2088302Sjkh    char *errstr;
20954587Sjkh    WINDOW *w = savescr();
2108302Sjkh
21115416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
2128302Sjkh    va_start(args, fmt);
2138302Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2148302Sjkh    va_end(args);
2158302Sjkh    use_helpline(NULL);
2168302Sjkh    use_helpfile(NULL);
2178837Sjkh    if (isDebug())
2188837Sjkh	msgDebug("Notify: %s\n", errstr);
21929628Sjkh    dialog_msgbox(NULL, errstr, -1, -1, 0);
22054587Sjkh    sleep(1);
22154587Sjkh    restorescr(w);
2228302Sjkh}
2238302Sjkh
2248208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */
2258208Sjkhint
2268208SjkhmsgYesNo(char *fmt, ...)
2278208Sjkh{
2288208Sjkh    va_list args;
2298208Sjkh    char *errstr;
2308208Sjkh    int ret;
23154587Sjkh    WINDOW *w = savescr();
23254587Sjkh
23315416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
2348208Sjkh    va_start(args, fmt);
2358208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2368208Sjkh    va_end(args);
2378208Sjkh    use_helpline(NULL);
2388208Sjkh    use_helpfile(NULL);
2398640Sjkh    if (OnVTY) {
2409202Srgrimes	ioctl(0, VT_ACTIVATE, 1);	/* Switch back */
2418641Sjkh	msgInfo(NULL);
2428640Sjkh    }
2438281Sjkh    ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1);
24454587Sjkh    restorescr(w);
2458208Sjkh    return ret;
2468208Sjkh}
2478262Sjkh
2488262Sjkh/* Put up a message in an input box and return the value */
2498262Sjkhchar *
2508262SjkhmsgGetInput(char *buf, char *fmt, ...)
2518262Sjkh{
2528262Sjkh    va_list args;
2538262Sjkh    char *errstr;
2548278Sjkh    static char input_buffer[256];
2558262Sjkh    int rval;
25654587Sjkh    WINDOW *w = savescr();
2578262Sjkh
25815416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
2598262Sjkh    va_start(args, fmt);
2608262Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2618262Sjkh    va_end(args);
2628262Sjkh    use_helpline(NULL);
2638262Sjkh    use_helpfile(NULL);
2648302Sjkh    if (buf)
26520247Sjkh	SAFE_STRCPY(input_buffer, buf);
2668302Sjkh    else
2678302Sjkh	input_buffer[0] = '\0';
2688640Sjkh    if (OnVTY) {
2699202Srgrimes	ioctl(0, VT_ACTIVATE, 1);	/* Switch back */
2708641Sjkh	msgInfo(NULL);
2718640Sjkh    }
2728262Sjkh    rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer);
27354587Sjkh    restorescr(w);
2748262Sjkh    if (!rval)
2758262Sjkh	return input_buffer;
2768262Sjkh    else
2778262Sjkh	return NULL;
2788262Sjkh}
2798262Sjkh
2808347Sjkh/* Write something to the debugging port */
2818347Sjkhvoid
2828347SjkhmsgDebug(char *fmt, ...)
2838347Sjkh{
2848347Sjkh    va_list args;
2858347Sjkh    char *dbg;
2868347Sjkh
2878594Sjkh    if (DebugFD == -1)
2888594Sjkh	return;
28915416Sjkh    dbg = (char *)alloca(FILENAME_MAX);
2908347Sjkh    strcpy(dbg, "DEBUG: ");
2918347Sjkh    va_start(args, fmt);
2928347Sjkh    vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args);
2938347Sjkh    va_end(args);
2948347Sjkh    write(DebugFD, dbg, strlen(dbg));
2958347Sjkh}
2968705Sjkh
2978705Sjkh/* Tell the user there's some output to go look at */
2988705Sjkhvoid
2998705SjkhmsgWeHaveOutput(char *fmt, ...)
3008705Sjkh{
3018705Sjkh    va_list args;
3028705Sjkh    char *errstr;
30354587Sjkh    WINDOW *w = savescr();
30454587Sjkh
30515416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
3068705Sjkh    va_start(args, fmt);
3078705Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
3088705Sjkh    va_end(args);
3098705Sjkh    use_helpline(NULL);
3108705Sjkh    use_helpfile(NULL);
3118705Sjkh    msgDebug("Notify: %s\n", errstr);
31217404Sjkh    dialog_clear_norefresh();
31329628Sjkh    dialog_msgbox(NULL, errstr, -1, -1, 0);
31454587Sjkh    restorescr(w);
3158705Sjkh}
31612661Speter
31712661Speter/* Simple versions of msgConfirm() and msgNotify() for calling from scripts */
31812661Speterint
31912661SpetermsgSimpleConfirm(char *str)
32012661Speter{
32112661Speter    msgConfirm(str);
32215242Sjkh    return DITEM_SUCCESS;
32312661Speter}
32412661Speter
32512661Speterint
32612661SpetermsgSimpleNotify(char *str)
32712661Speter{
32812661Speter    msgNotify(str);
32915242Sjkh    return DITEM_SUCCESS;
33012661Speter}
331