18097Sjkh/*
250479Speter * $FreeBSD$
38097Sjkh *
48097Sjkh * Copyright (c) 1995
58097Sjkh *	Jordan Hubbard.  All rights reserved.
68097Sjkh *
78097Sjkh * Redistribution and use in source and binary forms, with or without
88097Sjkh * modification, are permitted provided that the following conditions
98097Sjkh * are met:
108097Sjkh * 1. Redistributions of source code must retain the above copyright
118881Srgrimes *    notice, this list of conditions and the following disclaimer,
128881Srgrimes *    verbatim and that no modifications are made prior to this
138097Sjkh *    point in the file.
148097Sjkh * 2. Redistributions in binary form must reproduce the above copyright
158097Sjkh *    notice, this list of conditions and the following disclaimer in the
168097Sjkh *    documentation and/or other materials provided with the distribution.
178097Sjkh *
188097Sjkh * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND
198097Sjkh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
208097Sjkh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
218097Sjkh * ARE DISCLAIMED.  IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE
228097Sjkh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
238097Sjkh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
248097Sjkh * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION)
258097Sjkh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
268097Sjkh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
278097Sjkh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
288097Sjkh * SUCH DAMAGE.
298097Sjkh *
308097Sjkh */
318097Sjkh
32161060Snetchild#include "sade.h"
338097Sjkh#include <stdarg.h>
348825Sjkh#include <sys/ioctl.h>
3566834Sphk#include <sys/consio.h>
368097Sjkh
378837SjkhBoolean
388837SjkhisDebug(void)
398837Sjkh{
4012661Speter    char *cp;
4112661Speter
4212661Speter    return (cp = variable_get(VAR_DEBUG)) && strcmp(cp, "no");
438837Sjkh}
448837Sjkh
458262Sjkh/* Whack up an informational message on the status line, in stand-out */
468262Sjkhvoid
47161099SdelphijmsgYap(const char *fmt, ...)
488262Sjkh{
498262Sjkh    va_list args;
508262Sjkh    char *errstr;
518262Sjkh    int attrs;
528262Sjkh
5315416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
548262Sjkh    va_start(args, fmt);
558347Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
568262Sjkh    va_end(args);
578262Sjkh    attrs = getattrs(stdscr);
588314Sjkh    attrset(A_REVERSE);
5917375Sjkh    mvaddstr(StatusLine, 0, errstr);
608262Sjkh    attrset(attrs);
618262Sjkh    refresh();
628262Sjkh}
638262Sjkh
648097Sjkh/* Whack up an informational message on the status line */
658097Sjkhvoid
66161099SdelphijmsgInfo(const char *fmt, ...)
678097Sjkh{
688097Sjkh    va_list args;
698097Sjkh    char *errstr;
708705Sjkh    int i, attrs;
718705Sjkh    char line[81];
728097Sjkh
738705Sjkh    attrs = getattrs(stdscr);
748641Sjkh    /* NULL is a special convention meaning "erase the old stuff" */
758641Sjkh    if (!fmt) {
7617375Sjkh	move(StatusLine, 0);
778641Sjkh	clrtoeol();
788641Sjkh	return;
798641Sjkh    }
8015416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
818097Sjkh    va_start(args, fmt);
828347Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
838097Sjkh    va_end(args);
848705Sjkh    memset(line, ' ', 80);
858705Sjkh    for (i = 0; i < 80; i++) {
868705Sjkh	if (errstr[i])
878705Sjkh	    line[i] = errstr[i];
888705Sjkh	else
898705Sjkh	    break;
908705Sjkh    }
918705Sjkh    line[80] = '\0';
9216366Sjkh    attrset(ATTR_TITLE);
9317375Sjkh    mvaddstr(StatusLine, 0, line);
948262Sjkh    attrset(attrs);
9517375Sjkh    move(StatusLine, 79);
968262Sjkh    refresh();
978097Sjkh}
988097Sjkh
998097Sjkh/* Whack up a warning on the status line */
1008097Sjkhvoid
101161099SdelphijmsgWarn(const char *fmt, ...)
1028097Sjkh{
1038097Sjkh    va_list args;
1048097Sjkh    char *errstr;
1058262Sjkh    int attrs;
1068097Sjkh
10715416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
1088097Sjkh    strcpy(errstr, "Warning: ");
1098097Sjkh    va_start(args, fmt);
1108097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1118097Sjkh    va_end(args);
1128262Sjkh    attrs = getattrs(stdscr);
1138097Sjkh    beep();
11416366Sjkh    attrset(ATTR_TITLE);
11517375Sjkh    mvaddstr(StatusLine, 0, errstr);
1168262Sjkh    attrset(attrs);
1178262Sjkh    refresh();
1188837Sjkh    if (OnVTY && isDebug())
1198628Sjkh	msgDebug("Warning message `%s'\n", errstr);
1208097Sjkh}
1218097Sjkh
1228097Sjkh/* Whack up an error on the status line */
1238097Sjkhvoid
124161099SdelphijmsgError(const char *fmt, ...)
1258097Sjkh{
1268097Sjkh    va_list args;
1278097Sjkh    char *errstr;
1288262Sjkh    int attrs;
1298097Sjkh
13015416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
1318097Sjkh    strcpy(errstr, "Error: ");
1328097Sjkh    va_start(args, fmt);
1338097Sjkh    vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
1348097Sjkh    va_end(args);
1358097Sjkh    beep();
1368262Sjkh    attrs = getattrs(stdscr);
13716366Sjkh    attrset(ATTR_TITLE);
13817375Sjkh    mvaddstr(StatusLine, 0, errstr);
1398262Sjkh    attrset(attrs);
1408262Sjkh    refresh();
1418837Sjkh    if (OnVTY && isDebug())
1428628Sjkh	msgDebug("Error message `%s'\n", errstr);
1438097Sjkh}
1448097Sjkh
1458097Sjkh/* Whack up a fatal error on the status line */
1468097Sjkhvoid
147161099SdelphijmsgFatal(const char *fmt, ...)
1488097Sjkh{
1498097Sjkh    va_list args;
1508097Sjkh    char *errstr;
1518262Sjkh    int attrs;
1528097Sjkh
15315416Sjkh    errstr = (char *)alloca(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);
16016366Sjkh    attrset(ATTR_TITLE);
16117375Sjkh    mvaddstr(StatusLine, 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    getch();
1738097Sjkh}
1748097Sjkh
1758208Sjkh/* Put up a message in a popup confirmation box */
1768208Sjkhvoid
177161099SdelphijmsgConfirm(const char *fmt, ...)
1788208Sjkh{
1798208Sjkh    va_list args;
1808208Sjkh    char *errstr;
18154587Sjkh    WINDOW *w = savescr();
1828208Sjkh
18315416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
1848208Sjkh    va_start(args, fmt);
1858208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
1868208Sjkh    va_end(args);
1878208Sjkh    use_helpline(NULL);
1888208Sjkh    use_helpfile(NULL);
1898640Sjkh    if (OnVTY) {
1909202Srgrimes	ioctl(0, VT_ACTIVATE, 1);
1918641Sjkh	msgInfo(NULL);
1928640Sjkh    }
1938556Sjkh    dialog_notify(errstr);
19454587Sjkh    restorescr(w);
1958208Sjkh}
1968208Sjkh
1978302Sjkh/* Put up a message in a popup information box */
1988302Sjkhvoid
199161099SdelphijmsgNotify(const char *fmt, ...)
2008302Sjkh{
2018302Sjkh    va_list args;
2028302Sjkh    char *errstr;
2038302Sjkh
20415416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
2058302Sjkh    va_start(args, fmt);
2068302Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2078302Sjkh    va_end(args);
2088302Sjkh    use_helpline(NULL);
2098302Sjkh    use_helpfile(NULL);
2108837Sjkh    if (isDebug())
2118837Sjkh	msgDebug("Notify: %s\n", errstr);
21229628Sjkh    dialog_msgbox(NULL, errstr, -1, -1, 0);
2138302Sjkh}
2148302Sjkh
21583351Sjkh/* Put up a message in a popup yes/no box and return 0 for YES, 1 for NO */
2168208Sjkhint
217161099SdelphijmsgYesNo(const char *fmt, ...)
2188208Sjkh{
2198208Sjkh    va_list args;
2208208Sjkh    char *errstr;
2218208Sjkh    int ret;
22254587Sjkh    WINDOW *w = savescr();
22354587Sjkh
22415416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
2258208Sjkh    va_start(args, fmt);
2268208Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2278208Sjkh    va_end(args);
2288208Sjkh    use_helpline(NULL);
2298208Sjkh    use_helpfile(NULL);
2308640Sjkh    if (OnVTY) {
2319202Srgrimes	ioctl(0, VT_ACTIVATE, 1);	/* Switch back */
2328641Sjkh	msgInfo(NULL);
2338640Sjkh    }
23480674Sjkh    if (variable_get(VAR_NONINTERACTIVE))
23583351Sjkh	return 0;	/* If non-interactive, return YES all the time */
2368281Sjkh    ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1);
23754587Sjkh    restorescr(w);
2388208Sjkh    return ret;
2398208Sjkh}
2408262Sjkh
24183351Sjkh/* Put up a message in a popup no/yes box and return 0 for YES, 1 for NO */
24270005Sjkhint
243161099SdelphijmsgNoYes(const char *fmt, ...)
24470005Sjkh{
24570005Sjkh    va_list args;
24670005Sjkh    char *errstr;
24770005Sjkh    int ret;
24870005Sjkh    WINDOW *w = savescr();
24970005Sjkh
25070005Sjkh    errstr = (char *)alloca(FILENAME_MAX);
25170005Sjkh    va_start(args, fmt);
25270005Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
25370005Sjkh    va_end(args);
25470005Sjkh    use_helpline(NULL);
25570005Sjkh    use_helpfile(NULL);
25670005Sjkh    if (OnVTY) {
25770005Sjkh	ioctl(0, VT_ACTIVATE, 1);	/* Switch back */
25870005Sjkh	msgInfo(NULL);
25970005Sjkh    }
26080674Sjkh    if (variable_get(VAR_NONINTERACTIVE))
26183351Sjkh	return 1;	/* If non-interactive, return NO all the time */
26270005Sjkh    ret = dialog_noyes("User Confirmation Requested", errstr, -1, -1);
26370005Sjkh    restorescr(w);
26470005Sjkh    return ret;
26570005Sjkh}
26670005Sjkh
2678262Sjkh/* Put up a message in an input box and return the value */
2688262Sjkhchar *
269161099SdelphijmsgGetInput(char *buf, const char *fmt, ...)
2708262Sjkh{
2718262Sjkh    va_list args;
2728262Sjkh    char *errstr;
2738278Sjkh    static char input_buffer[256];
2748262Sjkh    int rval;
27554587Sjkh    WINDOW *w = savescr();
2768262Sjkh
27715416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
2788262Sjkh    va_start(args, fmt);
2798262Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
2808262Sjkh    va_end(args);
2818262Sjkh    use_helpline(NULL);
2828262Sjkh    use_helpfile(NULL);
2838302Sjkh    if (buf)
28420247Sjkh	SAFE_STRCPY(input_buffer, buf);
2858302Sjkh    else
2868302Sjkh	input_buffer[0] = '\0';
2878640Sjkh    if (OnVTY) {
2889202Srgrimes	ioctl(0, VT_ACTIVATE, 1);	/* Switch back */
2898641Sjkh	msgInfo(NULL);
2908640Sjkh    }
2918262Sjkh    rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer);
29254587Sjkh    restorescr(w);
2938262Sjkh    if (!rval)
2948262Sjkh	return input_buffer;
2958262Sjkh    else
2968262Sjkh	return NULL;
2978262Sjkh}
2988262Sjkh
2998347Sjkh/* Write something to the debugging port */
3008347Sjkhvoid
301161099SdelphijmsgDebug(const char *fmt, ...)
3028347Sjkh{
3038347Sjkh    va_list args;
3048347Sjkh    char *dbg;
3058347Sjkh
3068594Sjkh    if (DebugFD == -1)
3078594Sjkh	return;
30815416Sjkh    dbg = (char *)alloca(FILENAME_MAX);
3098347Sjkh    strcpy(dbg, "DEBUG: ");
3108347Sjkh    va_start(args, fmt);
3118347Sjkh    vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args);
3128347Sjkh    va_end(args);
3138347Sjkh    write(DebugFD, dbg, strlen(dbg));
3148347Sjkh}
3158705Sjkh
3168705Sjkh/* Tell the user there's some output to go look at */
3178705Sjkhvoid
318161099SdelphijmsgWeHaveOutput(const char *fmt, ...)
3198705Sjkh{
3208705Sjkh    va_list args;
3218705Sjkh    char *errstr;
32254587Sjkh    WINDOW *w = savescr();
32354587Sjkh
32415416Sjkh    errstr = (char *)alloca(FILENAME_MAX);
3258705Sjkh    va_start(args, fmt);
3268705Sjkh    vsnprintf(errstr, FILENAME_MAX, fmt, args);
3278705Sjkh    va_end(args);
3288705Sjkh    use_helpline(NULL);
3298705Sjkh    use_helpfile(NULL);
3308705Sjkh    msgDebug("Notify: %s\n", errstr);
33117404Sjkh    dialog_clear_norefresh();
33254722Sjkh    sleep(2);
33329628Sjkh    dialog_msgbox(NULL, errstr, -1, -1, 0);
33454587Sjkh    restorescr(w);
3358705Sjkh}
33612661Speter
33712661Speter/* Simple versions of msgConfirm() and msgNotify() for calling from scripts */
33812661Speterint
339161099SdelphijmsgSimpleConfirm(const char *str)
34012661Speter{
34179304Skris    msgConfirm("%s", str);
34215242Sjkh    return DITEM_SUCCESS;
34312661Speter}
34412661Speter
34512661Speterint
346161099SdelphijmsgSimpleNotify(const char *str)
34712661Speter{
34879304Skris    msgNotify("%s", str);
34915242Sjkh    return DITEM_SUCCESS;
35012661Speter}
351