msg.c revision 9202
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 *
79202Srgrimes * $Id: msg.c,v 1.28.2.2 1995/06/02 15:31: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
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 * 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>
468825Sjkh#include <sys/ioctl.h>
478825Sjkh#include <machine/console.h>
488097Sjkh
498702Sjkh#define VTY_STATLINE	24
508702Sjkh#define TTY_STATLINE	23
518702Sjkh
528837SjkhBoolean
538837SjkhisDebug(void)
548837Sjkh{
559202Srgrimes    if (OptFlags & OPT_DEBUG)
568837Sjkh	return TRUE;
578837Sjkh    return FALSE;
588837Sjkh}
598837Sjkh
608262Sjkh/* Whack up an informational message on the status line, in stand-out */
618262Sjkhvoid
628262SjkhmsgYap(char *fmt, ...)
638262Sjkh{
648262Sjkh    va_list args;
658262Sjkh    char *errstr;
668262Sjkh    int attrs;
678262Sjkh
688317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
698262Sjkh    va_start(args, fmt);
708347Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
718262Sjkh    va_end(args);
728262Sjkh    attrs = getattrs(stdscr);
738314Sjkh    attrset(A_REVERSE);
748702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
758262Sjkh    attrset(attrs);
768262Sjkh    refresh();
778262Sjkh    free(errstr);
788262Sjkh}
798262Sjkh
808097Sjkh/* Whack up an informational message on the status line */
818097Sjkhvoid
828097SjkhmsgInfo(char *fmt, ...)
838097Sjkh{
848097Sjkh    va_list args;
858097Sjkh    char *errstr;
868705Sjkh    int i, attrs;
878705Sjkh    char line[81];
888097Sjkh
898705Sjkh    attrs = getattrs(stdscr);
908641Sjkh    /* NULL is a special convention meaning "erase the old stuff" */
918641Sjkh    if (!fmt) {
928702Sjkh	move(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0);
938705Sjkh	attrset(A_REVERSE);
948641Sjkh	clrtoeol();
958705Sjkh	attrset(attrs);
968641Sjkh	return;
978641Sjkh    }
988317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
998097Sjkh    va_start(args, fmt);
1008347Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
1018097Sjkh    va_end(args);
1028705Sjkh    memset(line, ' ', 80);
1038705Sjkh    for (i = 0; i < 80; i++) {
1048705Sjkh	if (errstr[i])
1058705Sjkh	    line[i] = errstr[i];
1068705Sjkh	else
1078705Sjkh	    break;
1088705Sjkh    }
1098705Sjkh    line[80] = '\0';
1108705Sjkh    attrset(A_REVERSE);
1118705Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, line);
1128262Sjkh    attrset(attrs);
1138722Sjkh    move(OnVTY ? VTY_STATLINE : TTY_STATLINE, 79);
1148262Sjkh    refresh();
1158640Sjkh    if (OnVTY) {
1168837Sjkh	if (isDebug())
1178837Sjkh	    msgDebug("Information: `%s'\n", errstr);
1188641Sjkh	msgInfo(NULL);
1198640Sjkh    }
1208097Sjkh    free(errstr);
1218097Sjkh}
1228097Sjkh
1238097Sjkh/* Whack up a warning on the status line */
1248097Sjkhvoid
1258097SjkhmsgWarn(char *fmt, ...)
1268097Sjkh{
1278097Sjkh    va_list args;
1288097Sjkh    char *errstr;
1298262Sjkh    int attrs;
1308097Sjkh
1318317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1328097Sjkh    strcpy(errstr, "Warning: ");
1338097Sjkh    va_start(args, fmt);
1348097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1358097Sjkh    va_end(args);
1368262Sjkh    attrs = getattrs(stdscr);
1378097Sjkh    beep();
1388314Sjkh    attrset(A_REVERSE);
1398702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
1408262Sjkh    attrset(attrs);
1418262Sjkh    refresh();
1428837Sjkh    if (OnVTY && isDebug())
1438628Sjkh	msgDebug("Warning message `%s'\n", errstr);
1448097Sjkh    free(errstr);
1458097Sjkh}
1468097Sjkh
1478097Sjkh/* Whack up an error on the status line */
1488097Sjkhvoid
1498097SjkhmsgError(char *fmt, ...)
1508097Sjkh{
1518097Sjkh    va_list args;
1528097Sjkh    char *errstr;
1538262Sjkh    int attrs;
1548097Sjkh
1558317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1568097Sjkh    strcpy(errstr, "Error: ");
1578097Sjkh    va_start(args, fmt);
1588097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1598097Sjkh    va_end(args);
1608097Sjkh    beep();
1618262Sjkh    attrs = getattrs(stdscr);
1628314Sjkh    attrset(A_REVERSE);
1638702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
1648262Sjkh    attrset(attrs);
1658262Sjkh    refresh();
1668837Sjkh    if (OnVTY && isDebug())
1678628Sjkh	msgDebug("Error message `%s'\n", errstr);
1688097Sjkh    free(errstr);
1698097Sjkh}
1708097Sjkh
1718097Sjkh/* Whack up a fatal error on the status line */
1728097Sjkhvoid
1738097SjkhmsgFatal(char *fmt, ...)
1748097Sjkh{
1758097Sjkh    va_list args;
1768097Sjkh    char *errstr;
1778262Sjkh    int attrs;
1788097Sjkh
1798317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
1808097Sjkh    strcpy(errstr, "Fatal Error: ");
1818097Sjkh    va_start(args, fmt);
1828097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1838097Sjkh    va_end(args);
1848097Sjkh    beep();
1858262Sjkh    attrs = getattrs(stdscr);
1868314Sjkh    attrset(A_REVERSE);
1878702Sjkh    mvaddstr(OnVTY ? VTY_STATLINE : TTY_STATLINE, 0, errstr);
1888097Sjkh    addstr(" - ");
1898097Sjkh    addstr("PRESS ANY KEY TO ");
1908097Sjkh    if (getpid() == 1)
1918097Sjkh	addstr("REBOOT");
1928097Sjkh    else
1938097Sjkh	addstr("QUIT");
1948262Sjkh    attrset(attrs);
1958262Sjkh    refresh();
1968628Sjkh    if (OnVTY)
1978628Sjkh	msgDebug("Fatal error `%s'!\n", errstr);
1988097Sjkh    free(errstr);
1998097Sjkh    getch();
2008097Sjkh    systemShutdown();
2018097Sjkh}
2028097Sjkh
2038208Sjkh/* Put up a message in a popup confirmation box */
2048208Sjkhvoid
2058208SjkhmsgConfirm(char *fmt, ...)
2068208Sjkh{
2078208Sjkh    va_list args;
2088208Sjkh    char *errstr;
2098649Sjkh    WINDOW *w;
2108208Sjkh
2118317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2128208Sjkh    va_start(args, fmt);
2138208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2148208Sjkh    va_end(args);
2158208Sjkh    use_helpline(NULL);
2168208Sjkh    use_helpfile(NULL);
2178649Sjkh    w = dupwin(newscr);
2188640Sjkh    if (OnVTY) {
2198828Sjkh	msgDebug("Switching back to VTY 0\n");
2209202Srgrimes	ioctl(0, VT_ACTIVATE, 1);
2218641Sjkh	msgInfo(NULL);
2228640Sjkh    }
2238556Sjkh    dialog_notify(errstr);
2248649Sjkh    touchwin(w);
2258649Sjkh    wrefresh(w);
2268649Sjkh    delwin(w);
2278208Sjkh    free(errstr);
2288208Sjkh}
2298208Sjkh
2308302Sjkh/* Put up a message in a popup information box */
2318302Sjkhvoid
2328302SjkhmsgNotify(char *fmt, ...)
2338302Sjkh{
2348302Sjkh    va_list args;
2358302Sjkh    char *errstr;
2368302Sjkh
2378317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2388302Sjkh    va_start(args, fmt);
2398302Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2408302Sjkh    va_end(args);
2418302Sjkh    use_helpline(NULL);
2428302Sjkh    use_helpfile(NULL);
2438837Sjkh    if (isDebug())
2448837Sjkh	msgDebug("Notify: %s\n", errstr);
2458649Sjkh    dialog_clear();
2468438Sjkh    dialog_msgbox("Information Dialog", errstr, -1, -1, 0);
2478302Sjkh    free(errstr);
2488302Sjkh}
2498302Sjkh
2508208Sjkh/* Put up a message in a popup yes/no box and return 1 for YES, 0 for NO */
2518208Sjkhint
2528208SjkhmsgYesNo(char *fmt, ...)
2538208Sjkh{
2548208Sjkh    va_list args;
2558208Sjkh    char *errstr;
2568208Sjkh    int ret;
2578556Sjkh    WINDOW *w;
2588208Sjkh
2598317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2608208Sjkh    va_start(args, fmt);
2618208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2628208Sjkh    va_end(args);
2638208Sjkh    use_helpline(NULL);
2648208Sjkh    use_helpfile(NULL);
2658556Sjkh    w = dupwin(newscr);
2668640Sjkh    if (OnVTY) {
2678837Sjkh	msgDebug("Switching back to VTY 0\n");
2689202Srgrimes	ioctl(0, VT_ACTIVATE, 1);	/* Switch back */
2698641Sjkh	msgInfo(NULL);
2708640Sjkh    }
2718281Sjkh    ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1);
2728556Sjkh    touchwin(w);
2738556Sjkh    wrefresh(w);
2748556Sjkh    delwin(w);
2758208Sjkh    free(errstr);
2768208Sjkh    return ret;
2778208Sjkh}
2788262Sjkh
2798262Sjkh/* Put up a message in an input box and return the value */
2808262Sjkhchar *
2818262SjkhmsgGetInput(char *buf, char *fmt, ...)
2828262Sjkh{
2838262Sjkh    va_list args;
2848262Sjkh    char *errstr;
2858278Sjkh    static char input_buffer[256];
2868262Sjkh    int rval;
2878556Sjkh    WINDOW *w;
2888262Sjkh
2898317Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
2908262Sjkh    va_start(args, fmt);
2918262Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2928262Sjkh    va_end(args);
2938262Sjkh    use_helpline(NULL);
2948262Sjkh    use_helpfile(NULL);
2958302Sjkh    if (buf)
2968302Sjkh	strcpy(input_buffer, buf);
2978302Sjkh    else
2988302Sjkh	input_buffer[0] = '\0';
2998556Sjkh    w = dupwin(newscr);
3008640Sjkh    if (OnVTY) {
3018828Sjkh	msgDebug("Switching back to VTY 0\n");
3029202Srgrimes	ioctl(0, VT_ACTIVATE, 1);	/* Switch back */
3038641Sjkh	msgInfo(NULL);
3048640Sjkh    }
3058262Sjkh    rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer);
3068556Sjkh    touchwin(w);
3078556Sjkh    wrefresh(w);
3088556Sjkh    delwin(w);
3098262Sjkh    free(errstr);
3108262Sjkh    if (!rval)
3118262Sjkh	return input_buffer;
3128262Sjkh    else
3138262Sjkh	return NULL;
3148262Sjkh}
3158262Sjkh
3168347Sjkh/* Write something to the debugging port */
3178347Sjkhvoid
3188347SjkhmsgDebug(char *fmt, ...)
3198347Sjkh{
3208347Sjkh    va_list args;
3218347Sjkh    char *dbg;
3228347Sjkh
3238594Sjkh    if (DebugFD == -1)
3248594Sjkh	return;
3258347Sjkh    dbg = (char *)safe_malloc(FILENAME_MAX);
3268347Sjkh    strcpy(dbg, "DEBUG: ");
3278347Sjkh    va_start(args, fmt);
3288347Sjkh    vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args);
3298347Sjkh    va_end(args);
3308347Sjkh    write(DebugFD, dbg, strlen(dbg));
3318347Sjkh    free(dbg);
3328347Sjkh}
3338705Sjkh
3348705Sjkh/* Tell the user there's some output to go look at */
3358705Sjkhvoid
3368705SjkhmsgWeHaveOutput(char *fmt, ...)
3378705Sjkh{
3388705Sjkh    va_list args;
3398705Sjkh    char *errstr;
3408705Sjkh
3418705Sjkh    errstr = (char *)safe_malloc(FILENAME_MAX);
3428705Sjkh    va_start(args, fmt);
3438705Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
3448705Sjkh    va_end(args);
3458705Sjkh    use_helpline(NULL);
3468705Sjkh    use_helpfile(NULL);
3478705Sjkh    msgDebug("Notify: %s\n", errstr);
3488705Sjkh    dialog_clear();
3498705Sjkh    dialog_msgbox("Information Dialog", errstr, -1, -1, 0);
3508705Sjkh    free(errstr);
3518705Sjkh    if (OnVTY)
3528705Sjkh	msgInfo("Command output is on debugging screen - type ALT-F2 to see it");
3538705Sjkh}
354