2094 lines
44 KiB
C
2094 lines
44 KiB
C
/*****************************************************************************
|
|
*
|
|
* $Id$
|
|
* Purpose ...............: Line Editor
|
|
*
|
|
*****************************************************************************
|
|
* Copyright (C) 1997-2002
|
|
*
|
|
* Michiel Broek FIDO: 2:280/2802
|
|
* Beekmansbos 10
|
|
* 1971 BV IJmuiden
|
|
* the Netherlands
|
|
*
|
|
* This file is part of MBSE BBS.
|
|
*
|
|
* This BBS is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2, or (at your option) any
|
|
* later version.
|
|
*
|
|
* MB BBS is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with MB BBS; see the file COPYING. If not, write to the Free
|
|
* Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*****************************************************************************/
|
|
|
|
#include "../config.h"
|
|
#include "../lib/libs.h"
|
|
#include "../lib/memwatch.h"
|
|
#include "../lib/structs.h"
|
|
#include "../lib/users.h"
|
|
#include "../lib/records.h"
|
|
#include "../lib/common.h"
|
|
#include "../lib/clcomm.h"
|
|
#include "../lib/msg.h"
|
|
#include "screen.h"
|
|
#include "mutil.h"
|
|
#include "ledit.h"
|
|
|
|
|
|
|
|
int sock; /* Connected socket */
|
|
extern int bbs_free;
|
|
|
|
|
|
int yes_no(char *T_)
|
|
{
|
|
char t[256];
|
|
int ch;
|
|
|
|
strcpy(t, T_);
|
|
strcat(t, " Y/n ");
|
|
set_color(LIGHTGRAY, BLACK);
|
|
locate(LINES - 3, 1);
|
|
clrtoeol();
|
|
mvprintw(LINES -3, 6, t);
|
|
do {
|
|
ch = toupper(readkey(LINES - 3, strlen(t) + 6, LIGHTGRAY, BLACK));
|
|
} while (ch != KEY_ENTER && ch != 'Y' && ch != 'N' && ch != '\012');
|
|
locate(LINES - 3, 6);
|
|
clrtoeol();
|
|
if (ch == KEY_ENTER || ch == 'Y' || ch == KEY_LINEFEED)
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
void errmsg(const char *format, ...)
|
|
{
|
|
char *t;
|
|
int ch;
|
|
va_list va_ptr;
|
|
|
|
t = calloc(256, sizeof(char));
|
|
|
|
va_start(va_ptr, format);
|
|
vsprintf(t, format, va_ptr);
|
|
va_end(va_ptr);
|
|
|
|
t = xstrcat(t, (char *)", Press any key ");
|
|
set_color(LIGHTGRAY, BLACK);
|
|
locate(LINES - 3, 1);
|
|
clrtoeol();
|
|
mvprintw(LINES - 3, 6, t);
|
|
putchar(7);
|
|
ch = readkey(LINES - 3, strlen(t) + 6, LIGHTGRAY, BLACK);
|
|
locate(LINES - 3, 6);
|
|
clrtoeol();
|
|
free(t);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Check if bbs is free, if so close it.
|
|
*/
|
|
int check_free(void)
|
|
{
|
|
char buf[81];
|
|
|
|
if (bbs_free) {
|
|
strcpy(buf, SockR("SCLO:0;"));
|
|
if (strncmp(buf, "100:0;", 6) == 0) {
|
|
Syslog('+', "The BBS is closed");
|
|
return TRUE;
|
|
} else {
|
|
errmsg("Cannon continue, failed to close the bbs");
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
errmsg("You cannot edit right now, the system is busy");
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Reopen the bbs.
|
|
*/
|
|
void open_bbs(void)
|
|
{
|
|
char buf[81];
|
|
|
|
strcpy(buf, SockR("SOPE:0;"));
|
|
if (strncmp(buf, "100:0;", 6) == 0) {
|
|
Syslog('+', "The BBS is open");
|
|
} else {
|
|
errmsg("Failed to reopen the bbs");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Safe field display, does not format % characters but displays it.
|
|
*/
|
|
void show_field(int y, int x, char *str, int length, int fill)
|
|
{
|
|
int i;
|
|
|
|
locate(y, x);
|
|
for (i = 0; i < strlen(str); i++)
|
|
putchar(str[i]);
|
|
if (strlen(str) < length)
|
|
for (i = strlen(str); i < length; i++)
|
|
putchar(fill);
|
|
}
|
|
|
|
|
|
|
|
int insertflag = 0;
|
|
|
|
void newinsert(int i, int fg, int bg)
|
|
{
|
|
insertflag = i;
|
|
set_color(YELLOW, RED);
|
|
if (insertflag != 0) {
|
|
mvprintw(2,36," INS ");
|
|
} else {
|
|
mvprintw(2,36," OVR ");
|
|
}
|
|
set_color(fg, bg);
|
|
}
|
|
|
|
|
|
|
|
|
|
char *edit_field(int y, int x, int w, int p, char *s_)
|
|
{
|
|
int i, charok, first, curpos, AllSpaces;
|
|
static char s[256];
|
|
unsigned int ch;
|
|
|
|
memset((char *)s, 0, 256);
|
|
sprintf(s, "%s", s_);
|
|
curpos = 0;
|
|
first = 1;
|
|
newinsert(1, YELLOW, BLUE);
|
|
|
|
do {
|
|
set_color(YELLOW, BLUE);
|
|
show_field(y, x, s, w, '_');
|
|
locate(y, x + curpos);
|
|
do {
|
|
ch = readkey(y, x + curpos, YELLOW, BLUE);
|
|
set_color(YELLOW, BLUE);
|
|
|
|
/*
|
|
* Test if the pressed key is a valid key.
|
|
*/
|
|
charok = 0;
|
|
if ((ch >= ' ') && (ch <= '~')) {
|
|
switch(p) {
|
|
case '!':
|
|
ch = toupper(ch);
|
|
charok = 1;
|
|
break;
|
|
case 'X':
|
|
charok = 1;
|
|
break;
|
|
case '9':
|
|
if (ch == ' ' || ch == '-' || ch == ',' || ch == '.' || isdigit(ch))
|
|
charok = 1;
|
|
break;
|
|
case 'U':
|
|
ch = toupper(ch);
|
|
if (isupper(ch))
|
|
charok = 1;
|
|
break;
|
|
default:
|
|
putchar(7);
|
|
break;
|
|
}
|
|
}
|
|
|
|
} while (charok == 0 && ch != KEY_ENTER && ch != KEY_LINEFEED && ch != KEY_DEL &&
|
|
ch != KEY_INS && ch != KEY_HOME && ch != KEY_LEFT && ch != KEY_RIGHT &&
|
|
ch != KEY_ESCAPE && ch != KEY_BACKSPACE && ch != KEY_RUBOUT && ch != KEY_END);
|
|
|
|
|
|
if (charok == 1) {
|
|
if (first == 1) {
|
|
first = 0;
|
|
memset((char *)s, 0, 256);
|
|
curpos = 0;
|
|
}
|
|
if (curpos < w) {
|
|
if (insertflag == 1) {
|
|
/*
|
|
* Insert mode
|
|
*/
|
|
if (strlen(s) < w) {
|
|
if (curpos < strlen(s)) {
|
|
for (i = strlen(s); i >= curpos; i--)
|
|
s[i+1] = s[i];
|
|
}
|
|
s[curpos] = ch;
|
|
if (curpos < w)
|
|
curpos++;
|
|
} else {
|
|
putchar(7);
|
|
}
|
|
} else {
|
|
/*
|
|
* Overwrite mode
|
|
*/
|
|
s[curpos] = ch;
|
|
if (curpos < w)
|
|
curpos++;
|
|
}
|
|
} else {
|
|
/*
|
|
* The field is full
|
|
*/
|
|
putchar(7);
|
|
}
|
|
} /* if charok */
|
|
|
|
first = 0;
|
|
switch (ch) {
|
|
case KEY_HOME:
|
|
curpos = 0;
|
|
break;
|
|
case KEY_END:
|
|
curpos = strlen(s);
|
|
break;
|
|
case KEY_LEFT:
|
|
if (curpos > 0)
|
|
curpos--;
|
|
else
|
|
putchar(7);
|
|
break;
|
|
case KEY_RIGHT:
|
|
if (curpos < strlen(s))
|
|
curpos++;
|
|
else
|
|
putchar(7);
|
|
break;
|
|
case KEY_INS:
|
|
if (insertflag == 1)
|
|
newinsert(0, YELLOW, BLUE);
|
|
else
|
|
newinsert(1, YELLOW, BLUE);
|
|
break;
|
|
case KEY_BACKSPACE:
|
|
case KEY_RUBOUT:
|
|
if (ch == KEY_RUBOUT)
|
|
Syslog('-', "Rubout pressed");
|
|
else
|
|
Syslog('-', "Backspace pressed");
|
|
if (strlen(s) > 0) {
|
|
if (curpos >= strlen(s)) {
|
|
curpos--;
|
|
s[curpos] = '\0';
|
|
} else {
|
|
for (i = curpos; i < strlen(s); i++)
|
|
s[i] = s[i+1];
|
|
s[i] = '\0';
|
|
}
|
|
} else
|
|
putchar(7);
|
|
break;
|
|
case KEY_DEL:
|
|
Syslog('-', "Delete key pressed");
|
|
if (strlen(s) > 0) {
|
|
if ((curpos) == (strlen(s) -1)) {
|
|
s[curpos] = '\0';
|
|
} else {
|
|
for (i = curpos; i < strlen(s); i++)
|
|
s[i] = s[i+1];
|
|
s[i] = '\0';
|
|
}
|
|
} else
|
|
putchar(7);
|
|
break;
|
|
}
|
|
} while ((ch != KEY_ENTER) && (ch != KEY_LINEFEED) && (ch != KEY_ESCAPE));
|
|
|
|
set_color(LIGHTGRAY, BLUE);
|
|
mvprintw(2,36, " ");
|
|
set_color(LIGHTGRAY, BLACK);
|
|
if (strlen(s)) {
|
|
AllSpaces = TRUE;
|
|
for (i = 0; i < strlen(s); i++) {
|
|
if (s[i] != ' ')
|
|
AllSpaces = FALSE;
|
|
}
|
|
if (AllSpaces)
|
|
s[0] = '\0';
|
|
}
|
|
return s;
|
|
}
|
|
|
|
|
|
|
|
char *select_show(int max)
|
|
{
|
|
static char s[12];
|
|
static char *menu=(char *)"-";
|
|
char help[81];
|
|
|
|
memset((char *)s, 0, 12);
|
|
|
|
if (max == 0)
|
|
sprintf(help, "Select ^\"-\"^ for previous level");
|
|
else
|
|
if (max > 10)
|
|
sprintf(help, "Select ^\"-\"^ for previous level, ^\"P\" or \"N\"^ to page");
|
|
else
|
|
sprintf(help, "Select ^\"-\"^ for previous level");
|
|
showhelp(help);
|
|
|
|
/*
|
|
* Loop until the answer is right
|
|
*/
|
|
for (;;) {
|
|
mvprintw(LINES - 3, 6, "Enter your choice >");
|
|
menu = (char *)"-";
|
|
menu = edit_field(LINES - 3, 26, 6, '!', menu);
|
|
locate(LINES - 3, 6);
|
|
clrtoeol();
|
|
|
|
if (strncmp(menu, "-", 1) == 0)
|
|
break;
|
|
if (max > 10) {
|
|
if (strncmp(menu, "N", 1) == 0)
|
|
break;
|
|
if (strncmp(menu, "P", 1) == 0)
|
|
break;
|
|
}
|
|
|
|
working(2, 0, 0);
|
|
working(0, 0, 0);
|
|
}
|
|
|
|
return menu;
|
|
}
|
|
|
|
|
|
|
|
char *select_record(int max, int items)
|
|
{
|
|
static char s[12];
|
|
static char *menu=(char *)"-";
|
|
char help[81];
|
|
int pick;
|
|
|
|
memset((char *)s, 0, 12);
|
|
|
|
if (max == 0)
|
|
sprintf(help, "Select ^\"-\"^ for previous level, ^\"A\"^ to append first record");
|
|
else
|
|
if (max > items)
|
|
sprintf(help, "Record (1..%d), ^\"-\"^ prev. level, ^\"A\"^ Append record, ^\"P\" or \"N\"^ to page", max);
|
|
else
|
|
sprintf(help, "Select record (1..%d), ^\"-\"^ for previous level, ^\"A\"^ to append a new record", max);
|
|
showhelp(help);
|
|
|
|
/*
|
|
* Loop until the answer is right
|
|
*/
|
|
for (;;) {
|
|
mvprintw(LINES - 3, 6, "Enter your choice >");
|
|
menu = (char *)"-";
|
|
menu = edit_field(LINES - 3, 26, 6, '!', menu);
|
|
locate(LINES - 3, 6);
|
|
clrtoeol();
|
|
|
|
if (strncmp(menu, "A", 1) == 0)
|
|
break;
|
|
if (strncmp(menu, "-", 1) == 0)
|
|
break;
|
|
if (strncmp(menu, "M", 1) == 0)
|
|
break;
|
|
if (max > items) {
|
|
if (strncmp(menu, "N", 1) == 0)
|
|
break;
|
|
if (strncmp(menu, "P", 1) == 0)
|
|
break;
|
|
}
|
|
pick = atoi(menu);
|
|
if ((pick >= 1) && (pick <= max))
|
|
break;
|
|
|
|
working(2, 0, 0);
|
|
working(0, 0, 0);
|
|
}
|
|
|
|
return menu;
|
|
}
|
|
|
|
|
|
|
|
char *select_area(int max, int items)
|
|
{
|
|
static char s[12];
|
|
static char *menu=(char *)"-";
|
|
char help[81];
|
|
int pick;
|
|
|
|
memset((char *)s, 0, 12);
|
|
|
|
if (max == 0)
|
|
sprintf(help, "^\"-\"^ back, ^A^ppend");
|
|
else
|
|
if (max > items)
|
|
sprintf(help, "Record (1..%d), ^\"-\"^ back, ^A^ppend, ^G^lobal, ^M^ove, ^N^ext, ^P^revious", max);
|
|
else
|
|
sprintf(help, "Record (1..%d), ^\"-\"^ back, ^A^ppend, ^G^lobal, ^M^ove", max);
|
|
showhelp(help);
|
|
|
|
/*
|
|
* Loop until the answer is right
|
|
*/
|
|
for (;;) {
|
|
mvprintw(LINES - 3, 6, "Enter your choice >");
|
|
menu = (char *)"-";
|
|
menu = edit_field(LINES - 3, 26, 6, '!', menu);
|
|
locate(LINES - 3, 6);
|
|
clrtoeol();
|
|
|
|
if (strncmp(menu, "A", 1) == 0)
|
|
break;
|
|
if (strncmp(menu, "-", 1) == 0)
|
|
break;
|
|
if ((strncmp(menu, "M", 1) == 0) && max)
|
|
break;
|
|
if ((strncmp(menu, "G", 1) == 0) && max)
|
|
break;
|
|
if (max > items) {
|
|
if (strncmp(menu, "N", 1) == 0)
|
|
break;
|
|
if (strncmp(menu, "P", 1) == 0)
|
|
break;
|
|
}
|
|
pick = atoi(menu);
|
|
if ((pick >= 1) && (pick <= max))
|
|
break;
|
|
}
|
|
|
|
return menu;
|
|
}
|
|
|
|
|
|
|
|
char *select_filearea(int max, int items)
|
|
{
|
|
static char s[12];
|
|
static char *menu=(char *)"-";
|
|
char help[81];
|
|
int pick;
|
|
|
|
memset((char *)s, 0, 12);
|
|
|
|
if (max == 0)
|
|
sprintf(help, "^\"-\"^ back, ^A^ppend");
|
|
else
|
|
if (max > items)
|
|
sprintf(help, "Record (1..%d), ^\"-\"^ back, ^A^ppend, ^M^ove, ^N^ext, ^P^revious", max);
|
|
else
|
|
sprintf(help, "Record (1..%d), ^\"-\"^ back, ^A^ppend, ^M^ove", max);
|
|
showhelp(help);
|
|
|
|
/*
|
|
* Loop until the answer is right
|
|
*/
|
|
for (;;) {
|
|
mvprintw(LINES - 3, 6, "Enter your choice >");
|
|
menu = (char *)"-";
|
|
menu = edit_field(LINES - 3, 26, 6, '!', menu);
|
|
locate(LINES - 3, 6);
|
|
clrtoeol();
|
|
|
|
if (strncmp(menu, "A", 1) == 0)
|
|
break;
|
|
if (strncmp(menu, "-", 1) == 0)
|
|
break;
|
|
if ((strncmp(menu, "M", 1) == 0) && max)
|
|
break;
|
|
if (max > items) {
|
|
if (strncmp(menu, "N", 1) == 0)
|
|
break;
|
|
if (strncmp(menu, "P", 1) == 0)
|
|
break;
|
|
}
|
|
pick = atoi(menu);
|
|
if ((pick >= 1) && (pick <= max))
|
|
break;
|
|
}
|
|
|
|
return menu;
|
|
}
|
|
|
|
|
|
|
|
char *select_pick(int max, int items)
|
|
{
|
|
static char s[12];
|
|
static char *menu=(char *)"-";
|
|
char help[81];
|
|
int pick;
|
|
|
|
memset((char *)s, 0, 12);
|
|
|
|
if (max == 0)
|
|
sprintf(help, "Select ^\"-\"^ for previous level");
|
|
else
|
|
if (max > items)
|
|
sprintf(help, "Record (1..%d), ^\"-\"^ prev. level, ^\"P\" or \"N\"^ to page", max);
|
|
else
|
|
sprintf(help, "Select record (1..%d), ^\"-\"^ for previous level", max);
|
|
showhelp(help);
|
|
|
|
/*
|
|
* Loop until the answer is right
|
|
*/
|
|
for (;;) {
|
|
mvprintw(LINES - 3, 6, "Enter your choice >");
|
|
menu = (char *)"-";
|
|
menu = edit_field(LINES - 3, 26, 6, '!', menu);
|
|
locate(LINES - 3, 6);
|
|
clrtoeol();
|
|
|
|
if (strncmp(menu, "-", 1) == 0)
|
|
break;
|
|
if (max > items) {
|
|
if (strncmp(menu, "N", 1) == 0)
|
|
break;
|
|
if (strncmp(menu, "P", 1) == 0)
|
|
break;
|
|
}
|
|
pick = atoi(menu);
|
|
if ((pick >= 1) && (pick <= max))
|
|
break;
|
|
|
|
working(2, 0, 0);
|
|
working(0, 0, 0);
|
|
}
|
|
|
|
return menu;
|
|
}
|
|
|
|
|
|
|
|
char *select_aka(int max, int items)
|
|
{
|
|
static char s[12];
|
|
static char *menu=(char *)"-";
|
|
char help[81];
|
|
int pick;
|
|
|
|
memset((char *)s, 0, 12);
|
|
|
|
if (max == 0)
|
|
sprintf(help, "Select ^\"-\"^ for previous level");
|
|
else
|
|
if (max > items)
|
|
sprintf(help, "Record (1..%d), ^\"-\"^ prev. level, ^\"P\" or \"N\"^ to page, ^\"M\"^ move aka", max);
|
|
else
|
|
sprintf(help, "Select record (1..%d), ^\"-\"^ for previous level ^\"M\"^ move aka", max);
|
|
showhelp(help);
|
|
|
|
/*
|
|
* Loop until the answer is right
|
|
*/
|
|
for (;;) {
|
|
mvprintw(LINES - 3, 6, "Enter your choice >");
|
|
menu = (char *)"-";
|
|
menu = edit_field(LINES - 3, 26, 6, '!', menu);
|
|
locate(LINES - 3, 6);
|
|
clrtoeol();
|
|
|
|
if (strncmp(menu, "-", 1) == 0)
|
|
break;
|
|
if (max > items) {
|
|
if (strncmp(menu, "N", 1) == 0)
|
|
break;
|
|
if (strncmp(menu, "P", 1) == 0)
|
|
break;
|
|
}
|
|
if (strncmp(menu, "M", 1) == 0)
|
|
break;
|
|
pick = atoi(menu);
|
|
if ((pick >= 1) && (pick <= max))
|
|
break;
|
|
}
|
|
|
|
return menu;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Select menu, max is the highest item to pick. Returns zero if
|
|
* "-" (previous level) is selected, -2 and -1 for the N and P keys.
|
|
*/
|
|
int select_menu_sub(int, int, char *);
|
|
|
|
int select_menu(int max)
|
|
{
|
|
return select_menu_sub(max, 50, (char *)"Select menu item");
|
|
}
|
|
|
|
int select_tag(int max)
|
|
{
|
|
return select_menu_sub(max, 40, (char *)"Toggle item");
|
|
}
|
|
|
|
|
|
int select_menu_sub(int max, int items, char *hlp)
|
|
{
|
|
static char *menu=(char *)"-";
|
|
char help[81];
|
|
int pick;
|
|
|
|
if (max == 0)
|
|
sprintf(help, "Select ^\"-\"^ for previous level");
|
|
else
|
|
if (max > items)
|
|
sprintf(help, "%s (1..%d), ^\"-\"^ prev. level, ^\"P\" or \"N\"^ to page", hlp, max);
|
|
else
|
|
sprintf(help, "%s (1..%d), ^\"-\"^ for previous level", hlp, max);
|
|
showhelp(help);
|
|
|
|
/*
|
|
* Loop forever until it's right.
|
|
*/
|
|
for (;;) {
|
|
mvprintw(LINES - 3, 6, "Enter your choice >");
|
|
menu = (char *)"-";
|
|
menu = edit_field(LINES - 3, 26, 3, '!', menu);
|
|
locate(LINES -3, 6);
|
|
clrtoeol();
|
|
|
|
if (strncmp(menu, "-", 1) == 0)
|
|
return 0;
|
|
|
|
if (max > items) {
|
|
if (strncmp(menu, "N", 1) == 0)
|
|
return -1;
|
|
if (strncmp(menu, "P", 1) == 0)
|
|
return -2;
|
|
}
|
|
|
|
pick = atoi(menu);
|
|
if ((pick >= 1) && (pick <= max))
|
|
return pick;
|
|
|
|
working(2, 0, 0);
|
|
working(0, 0, 0);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void show_str(int y, int x, int l, char *line)
|
|
{
|
|
show_field(y, x, line, l, ' ');
|
|
}
|
|
|
|
|
|
|
|
char *edit_str(int y, int x, int l, char *line, char *help)
|
|
{
|
|
static char s[256];
|
|
|
|
showhelp(help);
|
|
memset((char *)s, 0, 256);
|
|
strcpy(s, edit_field(y, x, l, 'X', line));
|
|
set_color(WHITE, BLACK);
|
|
show_str(y, x, l, s);
|
|
return s;
|
|
}
|
|
|
|
|
|
|
|
char *edit_pth(int y, int x, int l, char *line, char *help, mode_t mode)
|
|
{
|
|
static char s[256];
|
|
char *temp;
|
|
|
|
showhelp(help);
|
|
memset((char *)s, 0, 256);
|
|
strcpy(s, edit_field(y, x, l, 'X', line));
|
|
temp = xstrcpy(s);
|
|
if (strlen(temp)) {
|
|
temp = xstrcat(temp, (char *)"/foobar");
|
|
if (access(s, R_OK)) {
|
|
if (yes_no((char *)"Path doesn't exist, create"))
|
|
if (! mkdirs(temp, mode))
|
|
errmsg((char *)"Can't create path");
|
|
}
|
|
}
|
|
free(temp);
|
|
set_color(WHITE, BLACK);
|
|
show_str(y, x, l, s);
|
|
return s;
|
|
}
|
|
|
|
|
|
|
|
void test_jam(char *base)
|
|
{
|
|
char *temp;
|
|
|
|
/*
|
|
* Check if the messagebase exists, if not, create it.
|
|
*/
|
|
if (base == NULL)
|
|
return;
|
|
if (strlen(base) == 0)
|
|
return;
|
|
temp = xstrcpy(base);
|
|
temp = xstrcat(temp, (char *)".jhr");
|
|
if (access(temp, W_OK)) {
|
|
if (mkdirs(base, 0770)) {
|
|
if (yes_no((char *)"Messagebase doesn't exist, create")) {
|
|
Syslog('+', "Created JAM base %s", base);
|
|
if (Msg_Open(base))
|
|
Msg_Close();
|
|
}
|
|
} else {
|
|
errmsg((char *)"Can't create directory");
|
|
}
|
|
}
|
|
free(temp);
|
|
}
|
|
|
|
|
|
|
|
char *edit_jam(int y, int x, int l, char *line, char *help)
|
|
{
|
|
static char s[256];
|
|
char *from, *too;
|
|
int rc = 0;
|
|
|
|
showhelp(help);
|
|
memset((char *)s, 0, 256);
|
|
strcpy(s, edit_field(y, x, l, 'X', line));
|
|
if (strlen(s) && strlen(line) && strcmp(s, line)) {
|
|
/*
|
|
* Old and new paths did exist and are different.
|
|
* Test if we are doing a message base move.
|
|
*/
|
|
working(5, 0, 0);
|
|
from = calloc(PATH_MAX, sizeof(char));
|
|
too = calloc(PATH_MAX, sizeof(char));
|
|
sprintf(from, "%s.jhr", line);
|
|
if (access(from, R_OK | W_OK) == 0) {
|
|
/*
|
|
* Old message base does exist, copy message base.
|
|
*/
|
|
if (mkdirs(s, 0770)) {
|
|
sprintf(too, "%s.jhr", s);
|
|
rc = file_cp(from, too);
|
|
if (rc == 0) {
|
|
sprintf(from, "%s.jdt", line);
|
|
sprintf(too, "%s.jdt", s);
|
|
rc = file_cp(from, too);
|
|
}
|
|
if (rc == 0) {
|
|
sprintf(from, "%s.jdx", line);
|
|
sprintf(too, "%s.jdx", s);
|
|
rc = file_cp(from, too);
|
|
}
|
|
if (rc == 0) {
|
|
sprintf(from, "%s.jlr", line);
|
|
sprintf(too, "%s.jlr", s);
|
|
rc = file_cp(from, too);
|
|
}
|
|
if (rc == 0) {
|
|
/*
|
|
* All files copied successfull
|
|
*/
|
|
file_rm(from);
|
|
sprintf(from, "%s.jdx", line);
|
|
file_rm(from);
|
|
sprintf(from, "%s.jdt", line);
|
|
file_rm(from);
|
|
sprintf(from, "%s.jhr", line);
|
|
file_rm(from);
|
|
Syslog('+', "JAM message base moved to %s", s);
|
|
} else {
|
|
/*
|
|
* Copy failed
|
|
*/
|
|
file_rm(too);
|
|
sprintf(too, "%s.jdx", s);
|
|
file_rm(too);
|
|
sprintf(too, "%s.jdt", s);
|
|
file_rm(too);
|
|
sprintf(too, "%s.jhr", s);
|
|
file_rm(too);
|
|
errmsg((char *)"Can't move JAM message base");
|
|
strcpy(s, line);
|
|
}
|
|
} else {
|
|
errmsg((char *)"Can't create destination directory");
|
|
strcpy(s, line);
|
|
}
|
|
}
|
|
free(from);
|
|
free(too);
|
|
working(0, 0, 0);
|
|
} else if (strlen(s) == 0) {
|
|
/*
|
|
* If no new path, report
|
|
*/
|
|
errmsg((char *)"Empty path for JAM messagebase");
|
|
}
|
|
|
|
test_jam(s);
|
|
set_color(WHITE, BLACK);
|
|
show_str(y, x, l, s);
|
|
return s;
|
|
}
|
|
|
|
|
|
|
|
char *edit_ups(int y, int x, int l, char *line, char *help)
|
|
{
|
|
static char s[256];
|
|
|
|
showhelp(help);
|
|
memset((char *)s, 0, 256);
|
|
strcpy(s, edit_field(y, x, l, '!', line));
|
|
set_color(WHITE, BLACK);
|
|
show_str(y, x, l, s);
|
|
return s;
|
|
}
|
|
|
|
|
|
|
|
char *getboolean(int val)
|
|
{
|
|
if (val)
|
|
return (char *)"Yes";
|
|
else
|
|
return (char *)"No ";
|
|
}
|
|
|
|
|
|
|
|
void show_bool(int y, int x, int val)
|
|
{
|
|
mvprintw(y, x, getboolean(val));
|
|
}
|
|
|
|
|
|
|
|
int edit_bool(int y, int x, int val, char *help)
|
|
{
|
|
int ch;
|
|
char *temp;
|
|
|
|
temp = xstrcpy(help);
|
|
temp = xstrcat(temp, (char *)" (Spacebar = toggle)");
|
|
showhelp(temp);
|
|
free(temp);
|
|
|
|
do {
|
|
set_color(YELLOW, BLUE);
|
|
show_bool(y, x, val);
|
|
ch = readkey(y, x, YELLOW, BLUE);
|
|
if (ch == ' ')
|
|
val ^= 1;
|
|
} while (ch != KEY_ENTER && ch != '\012');
|
|
set_color(WHITE, BLACK);
|
|
show_bool(y, x, val);
|
|
fflush(stdout);
|
|
return val;
|
|
}
|
|
|
|
|
|
|
|
char *getloglevel(long val)
|
|
{
|
|
char *p;
|
|
|
|
p = xstrcpy((char *)"?");
|
|
|
|
if (val & DLOG_ATTENT) p = xstrcat(p, (char *)"!");
|
|
if (val & DLOG_NORMAL) p = xstrcat(p, (char *)"+");
|
|
if (val & DLOG_VERBOSE) p = xstrcat(p, (char *)"-");
|
|
if (val & DLOG_TCP) p = xstrcat(p, (char *)"A");
|
|
if (val & DLOG_BBS) p = xstrcat(p, (char *)"B");
|
|
if (val & DLOG_CHAT) p = xstrcat(p, (char *)"C");
|
|
if (val & DLOG_DEVIO) p = xstrcat(p, (char *)"D");
|
|
if (val & DLOG_EXEC) p = xstrcat(p, (char *)"E");
|
|
if (val & DLOG_FILEFWD) p = xstrcat(p, (char *)"F");
|
|
if (val & DLOG_HYDRA) p = xstrcat(p, (char *)"H");
|
|
if (val & DLOG_IEMSI) p = xstrcat(p, (char *)"I");
|
|
if (val & DLOG_LOCK) p = xstrcat(p, (char *)"L");
|
|
if (val & DLOG_MAIL) p = xstrcat(p, (char *)"M");
|
|
if (val & DLOG_NEWS) p = xstrcat(p, (char *)"N");
|
|
if (val & DLOG_OUTSCAN) p = xstrcat(p, (char *)"O");
|
|
if (val & DLOG_PACK) p = xstrcat(p, (char *)"P");
|
|
if (val & DLOG_ROUTE) p = xstrcat(p, (char *)"R");
|
|
if (val & DLOG_SESSION) p = xstrcat(p, (char *)"S");
|
|
if (val & DLOG_TTY) p = xstrcat(p, (char *)"T");
|
|
if (val & DLOG_XMODEM) p = xstrcat(p, (char *)"X");
|
|
if (val & DLOG_ZMODEM) p = xstrcat(p, (char *)"Z");
|
|
|
|
return p;
|
|
}
|
|
|
|
|
|
|
|
void show_logl(int y, int x, long val)
|
|
{
|
|
char *p;
|
|
|
|
p = getloglevel(val);
|
|
show_field(y, x, p, 21, ' ');
|
|
free(p);
|
|
}
|
|
|
|
|
|
|
|
long edit_logl(long val, char *txt)
|
|
{
|
|
clr_index();
|
|
set_color(WHITE, BLACK);
|
|
mvprintw(5, 5, (char *)"%s EDIT LOGLEVEL", txt);
|
|
set_color(CYAN, BLACK);
|
|
mvprintw( 5,45, "Logflags");
|
|
|
|
mvprintw( 7, 5, "1. ! Attention");
|
|
mvprintw( 8, 5, "2. + Normal");
|
|
mvprintw( 9, 5, "3. - Verbose");
|
|
mvprintw(10, 5, "4. A Debug TCP");
|
|
mvprintw(11, 5, "5. B Debug BBS/binkp");
|
|
mvprintw(12, 5, "6. C Chat modems");
|
|
mvprintw(13, 5, "7. D Device IO");
|
|
mvprintw(14, 5, "8. E Execute");
|
|
mvprintw(15, 5, "9. F File forward");
|
|
mvprintw(16, 5, "10. H Hydra debug");
|
|
mvprintw(17, 5, "11. I EMSI debug");
|
|
mvprintw( 7,45, "12. L Locking");
|
|
mvprintw( 8,45, "13. M Mail debug");
|
|
mvprintw( 9,45, "14. N News debug");
|
|
mvprintw(10,45, "15. O Outboundscan");
|
|
mvprintw(11,45, "16. P Packing");
|
|
mvprintw(12,45, "17. R Routing");
|
|
mvprintw(13,45, "18. S Session");
|
|
mvprintw(14,45, "19. T TTY debug");
|
|
mvprintw(15,45, "20. X Xmodem debug");
|
|
mvprintw(16,45, "21. Z Zmodem debug");
|
|
|
|
for (;;) {
|
|
set_color(WHITE, BLACK);
|
|
show_logl(5, 54, val);
|
|
show_lbit( 7,24, val, DLOG_ATTENT);
|
|
show_lbit( 8,24, val, DLOG_NORMAL);
|
|
show_lbit( 9,24, val, DLOG_VERBOSE);
|
|
show_lbit(10,24, val, DLOG_TCP);
|
|
show_lbit(11,24, val, DLOG_BBS);
|
|
show_lbit(12,24, val, DLOG_CHAT);
|
|
show_lbit(13,24, val, DLOG_DEVIO);
|
|
show_lbit(14,24, val, DLOG_EXEC);
|
|
show_lbit(15,24, val, DLOG_FILEFWD);
|
|
show_lbit(16,24, val, DLOG_HYDRA);
|
|
show_lbit(17,24, val, DLOG_IEMSI);
|
|
show_lbit( 7,64, val, DLOG_LOCK);
|
|
show_lbit( 8,64, val, DLOG_MAIL);
|
|
show_lbit( 9,64, val, DLOG_NEWS);
|
|
show_lbit(10,64, val, DLOG_OUTSCAN);
|
|
show_lbit(11,64, val, DLOG_PACK);
|
|
show_lbit(12,64, val, DLOG_ROUTE);
|
|
show_lbit(13,64, val, DLOG_SESSION);
|
|
show_lbit(14,64, val, DLOG_TTY);
|
|
show_lbit(15,64, val, DLOG_XMODEM);
|
|
show_lbit(16,64, val, DLOG_ZMODEM);
|
|
|
|
switch(select_menu(21)) {
|
|
case 0: return val;
|
|
case 1: val ^= DLOG_ATTENT; break;
|
|
case 2: val ^= DLOG_NORMAL; break;
|
|
case 3: val ^= DLOG_VERBOSE; break;
|
|
case 4: val ^= DLOG_TCP; break;
|
|
case 5: val ^= DLOG_BBS; break;
|
|
case 6: val ^= DLOG_CHAT; break;
|
|
case 7: val ^= DLOG_DEVIO; break;
|
|
case 8: val ^= DLOG_EXEC; break;
|
|
case 9: val ^= DLOG_FILEFWD; break;
|
|
case 10:val ^= DLOG_HYDRA; break;
|
|
case 11:val ^= DLOG_IEMSI; break;
|
|
case 12:val ^= DLOG_LOCK; break;
|
|
case 13:val ^= DLOG_MAIL; break;
|
|
case 14:val ^= DLOG_NEWS; break;
|
|
case 15:val ^= DLOG_OUTSCAN; break;
|
|
case 16:val ^= DLOG_PACK; break;
|
|
case 17:val ^= DLOG_ROUTE; break;
|
|
case 18:val ^= DLOG_SESSION; break;
|
|
case 19:val ^= DLOG_TTY; break;
|
|
case 20:val ^= DLOG_XMODEM; break;
|
|
case 21:val ^= DLOG_ZMODEM; break;
|
|
}
|
|
}
|
|
|
|
return val;
|
|
}
|
|
|
|
|
|
|
|
void show_int(int y, int x, int val)
|
|
{
|
|
mvprintw(y, x, (char *)" ");
|
|
mvprintw(y, x, (char *)"%d", val);
|
|
}
|
|
|
|
|
|
|
|
int edit_int(int y, int x, int val, char *help)
|
|
{
|
|
static char s[6];
|
|
static char line[6];
|
|
|
|
showhelp(help);
|
|
memset((char *)s, 0, 6);
|
|
sprintf(line, "%d", val);
|
|
strcpy(s, edit_field(y, x, 7, '9', line));
|
|
set_color(WHITE, BLACK);
|
|
show_int(y, x, atoi(s));
|
|
fflush(stdout);
|
|
return atoi(s);
|
|
}
|
|
|
|
|
|
|
|
void show_ushort(int y, int x, unsigned short val)
|
|
{
|
|
mvprintw(y, x, (char *)"%d", val);
|
|
}
|
|
|
|
|
|
|
|
unsigned short edit_ushort(int y, int x, unsigned short val, char *help)
|
|
{
|
|
unsigned short r;
|
|
static char s[6];
|
|
static char line[6];
|
|
|
|
showhelp(help);
|
|
memset((char *)s, 0, 6);
|
|
do {
|
|
sprintf(line, "%d", val);
|
|
strcpy(s, edit_field(y, x, 5, '9', line));
|
|
r = atoi(s);
|
|
if (r >= 65535L) {
|
|
working(2, y, x);
|
|
working(0, y, x);
|
|
}
|
|
} while (r >= 65535L);
|
|
set_color(WHITE, BLACK);
|
|
show_int(y, x, val);
|
|
fflush(stdout);
|
|
return r;
|
|
}
|
|
|
|
|
|
|
|
void show_sbit(int y, int x, unsigned short val, unsigned short mask)
|
|
{
|
|
show_bool(y, x, (val & mask) != 0);
|
|
}
|
|
|
|
|
|
|
|
unsigned short toggle_sbit(int y, int x, unsigned short val, unsigned short mask, char *help)
|
|
{
|
|
int ch;
|
|
|
|
showhelp(help);
|
|
do {
|
|
set_color(YELLOW, BLUE);
|
|
show_sbit(y, x, val, mask);
|
|
ch = readkey(y, x, YELLOW, BLUE);
|
|
if (ch == ' ')
|
|
val ^= mask;
|
|
} while (ch != KEY_ENTER && ch != '\012');
|
|
set_color(WHITE, BLACK);
|
|
show_sbit(y, x, val, mask);
|
|
fflush(stdout);
|
|
return val;
|
|
}
|
|
|
|
|
|
|
|
void show_lbit(int y, int x, long val, long mask)
|
|
{
|
|
show_bool(y, x, (val & mask) != 0);
|
|
}
|
|
|
|
|
|
|
|
long toggle_lbit(int y, int x, long val, long mask, char *help)
|
|
{
|
|
int ch;
|
|
|
|
showhelp(help);
|
|
do {
|
|
set_color(YELLOW, BLUE);
|
|
show_lbit(y, x, val, mask);
|
|
ch = readkey(y, x, YELLOW, BLUE);
|
|
if (ch == ' ')
|
|
val ^= mask;
|
|
} while (ch != KEY_ENTER && ch != '\012');
|
|
set_color(WHITE, BLACK);
|
|
show_lbit(y, x, val, mask);
|
|
fflush(stdout);
|
|
return val;
|
|
}
|
|
|
|
|
|
|
|
char *getflag(unsigned long flag, unsigned long not)
|
|
{
|
|
static char temp[33];
|
|
int i;
|
|
|
|
memset(temp, 0, 33);
|
|
memset(temp, '-', 32);
|
|
|
|
for (i = 0; i < 32; i++) {
|
|
if ((flag >> i) & 1)
|
|
temp[i] = 'X';
|
|
if ((not >> i) & 1)
|
|
temp[i] = 'O';
|
|
/*
|
|
* The next one may never show up!
|
|
*/
|
|
if (((flag >> i) & 1) && ((not >> i) & 1))
|
|
temp[i] = '!';
|
|
}
|
|
|
|
return temp;
|
|
}
|
|
|
|
|
|
|
|
void show_sec(int y, int x, securityrec sec)
|
|
{
|
|
show_int(y, x, sec.level);
|
|
mvprintw(y, x + 6, getflag(sec.flags, sec.notflags));
|
|
}
|
|
|
|
|
|
|
|
securityrec edit_sec(int y, int x, securityrec sec, char *shdr)
|
|
{
|
|
int c, i, xx, yy, s;
|
|
|
|
clr_index();
|
|
set_color(WHITE, BLACK);
|
|
mvprintw(4,3,shdr);
|
|
set_color(CYAN, BLACK);
|
|
xx = 3;
|
|
yy = 6;
|
|
|
|
for (i = 0; i < 32; i++) {
|
|
if (i == 11) {
|
|
xx = 28;
|
|
yy = 6;
|
|
}
|
|
if (i == 22) {
|
|
xx = 53;
|
|
yy = 6;
|
|
}
|
|
set_color(CYAN,BLACK);
|
|
mvprintw(yy, xx, (char *)"%2d. %-16s", i+1, CFG.fname[i]);
|
|
yy++;
|
|
}
|
|
mvprintw(16,53, "33. Security level");
|
|
|
|
for (;;) {
|
|
set_color(WHITE, BLACK);
|
|
xx = 24;
|
|
yy = 6;
|
|
|
|
for (i = 0; i < 32; i++) {
|
|
if (i == 11) {
|
|
xx = 49;
|
|
yy = 6;
|
|
}
|
|
if (i == 22) {
|
|
xx = 74;
|
|
yy = 6;
|
|
}
|
|
c = '-';
|
|
if ((sec.flags >> i) & 1)
|
|
c = 'X';
|
|
if ((sec.notflags >> i) & 1)
|
|
c = 'O';
|
|
/*
|
|
* The next one may never show up
|
|
*/
|
|
if (((sec.flags >> i) & 1) && ((sec.notflags >> i) & 1))
|
|
c = '!';
|
|
mvprintw(yy,xx,(char *)"%c", c);
|
|
yy++;
|
|
}
|
|
show_int(16,74, sec.level);
|
|
s = select_menu(33);
|
|
|
|
switch(s) {
|
|
case 0:
|
|
return sec;
|
|
case 33:
|
|
sec.level = edit_int(16,74, sec.level, (char *)"^Security level^ 0..65535");
|
|
break;
|
|
default:
|
|
if ((sec.notflags >> (s - 1)) & 1) {
|
|
sec.notflags = (sec.notflags ^ (1 << (s - 1)));
|
|
break;
|
|
}
|
|
if ((sec.flags >> (s - 1)) & 1) {
|
|
sec.flags = (sec.flags ^ (1 << (s - 1)));
|
|
sec.notflags = (sec.notflags | (1 << (s - 1)));
|
|
break;
|
|
}
|
|
sec.flags = (sec.flags | (1 << (s - 1)));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
securityrec edit_usec(int y, int x, securityrec sec, char *shdr)
|
|
{
|
|
int c, i, xx, yy, s;
|
|
|
|
clr_index();
|
|
set_color(WHITE, BLACK);
|
|
mvprintw(4,3,shdr);
|
|
set_color(CYAN, BLACK);
|
|
xx = 3;
|
|
yy = 6;
|
|
|
|
for (i = 0; i < 32; i++) {
|
|
if (i == 11) {
|
|
xx = 28;
|
|
yy = 6;
|
|
}
|
|
if (i == 22) {
|
|
xx = 53;
|
|
yy = 6;
|
|
}
|
|
set_color(CYAN,BLACK);
|
|
mvprintw(yy, xx, (char *)"%2d. %-16s", i+1, CFG.fname[i]);
|
|
yy++;
|
|
}
|
|
mvprintw(16,53, "33. Security level");
|
|
|
|
for (;;) {
|
|
set_color(WHITE, BLACK);
|
|
xx = 24;
|
|
yy = 6;
|
|
|
|
for (i = 0; i < 32; i++) {
|
|
if (i == 11) {
|
|
xx = 49;
|
|
yy = 6;
|
|
}
|
|
if (i == 22) {
|
|
xx = 74;
|
|
yy = 6;
|
|
}
|
|
c = '-';
|
|
if ((sec.flags >> i) & 1)
|
|
c = 'X';
|
|
if ((sec.notflags >> i) & 1)
|
|
c = 'O';
|
|
/*
|
|
* The next one may never show up
|
|
*/
|
|
if (((sec.flags >> i) & 1) && ((sec.notflags >> i) & 1))
|
|
c = '!';
|
|
mvprintw(yy,xx,(char *)"%c", c);
|
|
yy++;
|
|
}
|
|
show_int(16,74, sec.level);
|
|
s = select_menu(33);
|
|
|
|
switch(s) {
|
|
case 0:
|
|
return sec;
|
|
case 33:
|
|
sec.level = edit_int(16,74, sec.level, (char *)"^Security level^ 0..65535");
|
|
break;
|
|
default:
|
|
if ((sec.flags >> (s - 1)) & 1) {
|
|
sec.flags = (sec.flags ^ (1 << (s - 1)));
|
|
break;
|
|
}
|
|
sec.flags = (sec.flags | (1 << (s - 1)));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
securityrec edit_asec(securityrec sec, char *shdr)
|
|
{
|
|
int c, i, xx, yy, s;
|
|
|
|
clr_index();
|
|
set_color(WHITE, BLACK);
|
|
mvprintw(4,3,shdr);
|
|
set_color(CYAN, BLACK);
|
|
xx = 3;
|
|
yy = 6;
|
|
|
|
for (i = 0; i < 32; i++) {
|
|
if (i == 11) {
|
|
xx = 28;
|
|
yy = 6;
|
|
}
|
|
if (i == 22) {
|
|
xx = 53;
|
|
yy = 6;
|
|
}
|
|
set_color(CYAN,BLACK);
|
|
mvprintw(yy, xx, (char *)"%2d. %-16s", i+1, CFG.aname[i]);
|
|
yy++;
|
|
}
|
|
|
|
for (;;) {
|
|
set_color(WHITE, BLACK);
|
|
xx = 24;
|
|
yy = 6;
|
|
|
|
for (i = 0; i < 32; i++) {
|
|
if (i == 11) {
|
|
xx = 49;
|
|
yy = 6;
|
|
}
|
|
if (i == 22) {
|
|
xx = 74;
|
|
yy = 6;
|
|
}
|
|
c = '-';
|
|
if ((sec.flags >> i) & 1)
|
|
c = 'X';
|
|
if ((sec.notflags >> i) & 1)
|
|
c = 'O';
|
|
/*
|
|
* The next one may never show up
|
|
*/
|
|
if (((sec.flags >> i) & 1) && ((sec.notflags >> i) & 1))
|
|
c = '!';
|
|
mvprintw(yy,xx,(char *)"%c", c);
|
|
yy++;
|
|
}
|
|
|
|
s = select_menu(32);
|
|
|
|
switch(s) {
|
|
case 0: return sec;
|
|
default: if ((sec.notflags >> (s - 1)) & 1) {
|
|
sec.notflags = (sec.notflags ^ (1 << (s - 1)));
|
|
break;
|
|
}
|
|
if ((sec.flags >> (s - 1)) & 1) {
|
|
sec.flags = (sec.flags ^ (1 << (s - 1)));
|
|
sec.notflags = (sec.notflags | (1 << (s - 1)));
|
|
break;
|
|
}
|
|
sec.flags = (sec.flags | (1 << (s - 1)));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
char *get_secstr(securityrec S)
|
|
{
|
|
static char temp[45];
|
|
|
|
memset(&temp, 0, sizeof(temp));
|
|
sprintf(temp, "%-5d %s", S.level, getflag(S.flags, S.notflags));
|
|
return temp;
|
|
}
|
|
|
|
|
|
|
|
char *getmsgtype(int val)
|
|
{
|
|
switch (val) {
|
|
case LOCALMAIL: return (char *)"Local ";
|
|
case NETMAIL: return (char *)"Netmail ";
|
|
case ECHOMAIL: return (char *)"Echomail";
|
|
case NEWS: return (char *)"News ";
|
|
case LIST: return (char *)"Listserv";
|
|
default: return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void show_msgtype(int y, int x, int val)
|
|
{
|
|
mvprintw(y, x, getmsgtype(val));
|
|
}
|
|
|
|
|
|
|
|
int edit_msgtype(int y, int x, int val)
|
|
{
|
|
int ch;
|
|
|
|
showhelp((char *)"Toggle ^Message Type^ with spacebar, press <Enter> whene done.");
|
|
do {
|
|
set_color(YELLOW, BLUE);
|
|
show_msgtype(y, x, val);
|
|
|
|
ch = readkey(y, x, YELLOW, BLUE);
|
|
|
|
if (ch == ' ') {
|
|
if (val < LIST)
|
|
val++;
|
|
else
|
|
val = LOCALMAIL;
|
|
}
|
|
} while (ch != KEY_ENTER && ch != '\012');
|
|
set_color(WHITE, BLACK);
|
|
show_msgtype(y, x, val);
|
|
fflush(stdout);
|
|
return val;
|
|
}
|
|
|
|
|
|
|
|
char *getemailmode(int val)
|
|
{
|
|
switch (val) {
|
|
case E_NOISP: return (char *)"No internet ";
|
|
case E_TMPISP: return (char *)"No maildomain ";
|
|
case E_PRMISP: return (char *)"Own maildomain";
|
|
default: return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void show_emailmode(int y, int x, int val)
|
|
{
|
|
mvprintw(y, x, getemailmode(val));
|
|
}
|
|
|
|
|
|
|
|
int edit_emailmode(int y, int x, int val)
|
|
{
|
|
int ch;
|
|
|
|
showhelp((char *)"Toggle ^Internet Email Mode^ with spacebar, press <Enter> whene done.");
|
|
do {
|
|
set_color(YELLOW, BLUE);
|
|
show_emailmode(y, x, val);
|
|
|
|
ch = readkey(y, x, YELLOW, BLUE);
|
|
|
|
if (ch == ' ') {
|
|
if (val < E_PRMISP)
|
|
val++;
|
|
else
|
|
val = E_NOISP;
|
|
}
|
|
} while (ch != KEY_ENTER && ch != '\012');
|
|
set_color(WHITE, BLACK);
|
|
show_emailmode(y, x, val);
|
|
return val;
|
|
}
|
|
|
|
|
|
|
|
char *getmsgkinds(int val)
|
|
{
|
|
switch (val) {
|
|
case BOTH: return (char *)"Private/Public ";
|
|
case PRIVATE: return (char *)"Private only ";
|
|
case PUBLIC: return (char *)"Public only ";
|
|
case RONLY: return (char *)"Read Only ";
|
|
case FTNMOD: return (char *)"FTN moderated ";
|
|
case USEMOD: return (char *)"Usenet moderated";
|
|
default: return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void show_msgkinds(int y, int x, int val)
|
|
{
|
|
mvprintw(y, x, getmsgkinds(val));
|
|
}
|
|
|
|
|
|
|
|
int edit_msgkinds(int y, int x, int val)
|
|
{
|
|
int ch;
|
|
|
|
showhelp((char *)"Toggle ^Message Kinds^ with spacebar, press <Enter> whene done.");
|
|
do {
|
|
set_color(YELLOW, BLUE);
|
|
show_msgkinds(y, x, val);
|
|
|
|
ch = readkey(y, x, YELLOW, BLUE);
|
|
|
|
if (ch == ' ') {
|
|
if (val < USEMOD)
|
|
val++;
|
|
else
|
|
val = BOTH;
|
|
}
|
|
} while (ch != KEY_ENTER && ch != '\012');
|
|
set_color(WHITE, BLACK);
|
|
show_msgkinds(y, x, val);
|
|
return val;
|
|
}
|
|
|
|
|
|
|
|
char *getlinetype(int val)
|
|
{
|
|
switch (val) {
|
|
case POTS: return (char *)"POTS ";
|
|
case ISDN: return (char *)"ISDN ";
|
|
case NETWORK: return (char *)"Network";
|
|
case LOCAL: return (char *)"Local ";
|
|
default: return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void show_linetype(int y, int x, int val)
|
|
{
|
|
mvprintw(y, x, getlinetype(val));
|
|
}
|
|
|
|
|
|
|
|
int edit_linetype(int y, int x, int val)
|
|
{
|
|
int ch;
|
|
|
|
showhelp((char *)"Toggle ^Line Type^ with spacebar, press <Enter> whene done.");
|
|
do {
|
|
set_color(YELLOW, BLUE);
|
|
show_linetype(y, x, val);
|
|
|
|
ch = readkey(y, x, YELLOW, BLUE);
|
|
|
|
if (ch == ' ') {
|
|
if (val < LOCAL)
|
|
val++;
|
|
else
|
|
val = POTS;
|
|
}
|
|
} while (ch != KEY_ENTER && ch != '\012');
|
|
set_color(WHITE, BLACK);
|
|
show_linetype(y, x, val);
|
|
return val;
|
|
}
|
|
|
|
|
|
|
|
char *getservice(int val)
|
|
{
|
|
switch (val) {
|
|
case AREAMGR: return (char *)"AreaMgr";
|
|
case FILEMGR: return (char *)"FileMgr";
|
|
case EMAIL: return (char *)"Email ";
|
|
default: return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void show_service(int y, int x, int val)
|
|
{
|
|
mvprintw(y, x, getservice(val));
|
|
}
|
|
|
|
|
|
|
|
int edit_service(int y, int x, int val)
|
|
{
|
|
int ch;
|
|
|
|
showhelp((char *)"Toggle ^Service Type^ with spacebar, press <Enter> whene done.");
|
|
do {
|
|
set_color(YELLOW, BLUE);
|
|
show_service(y, x, val);
|
|
|
|
ch = readkey(y, x, YELLOW, BLUE);
|
|
|
|
if (ch == ' ') {
|
|
if (val < EMAIL)
|
|
val++;
|
|
else
|
|
val = AREAMGR;
|
|
}
|
|
} while (ch != KEY_ENTER && ch != '\012');
|
|
set_color(WHITE, BLACK);
|
|
show_service(y, x, val);
|
|
return val;
|
|
}
|
|
|
|
|
|
|
|
char *getnewsmode(int val)
|
|
{
|
|
switch (val) {
|
|
case FEEDINN: return (char *)"NNTP feed ";
|
|
case FEEDRNEWS: return (char *)"rnews feed";
|
|
case FEEDUUCP: return (char *)"UUCP feed ";
|
|
default: return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void show_newsmode(int y, int x, int val)
|
|
{
|
|
mvprintw(y, x, getnewsmode(val));
|
|
}
|
|
|
|
|
|
|
|
int edit_newsmode(int y, int x, int val)
|
|
{
|
|
int ch;
|
|
|
|
showhelp((char *)"Toggle ^Newsfeed mode^ with spacebar, press <Enter> whene done.");
|
|
do {
|
|
set_color(YELLOW, BLUE);
|
|
show_newsmode(y, x, val);
|
|
|
|
ch = readkey(y, x, YELLOW, BLUE);
|
|
|
|
if (ch == ' ') {
|
|
if (val < FEEDUUCP)
|
|
val++;
|
|
else
|
|
val = FEEDINN;
|
|
}
|
|
} while (ch != KEY_ENTER && ch != '\012');
|
|
set_color(WHITE, BLACK);
|
|
show_newsmode(y, x, val);
|
|
return val;
|
|
}
|
|
|
|
|
|
|
|
char *getmsgeditor(int val)
|
|
{
|
|
switch (val) {
|
|
case LINEEDIT: return (char *)"Line";
|
|
case FSEDIT: return (char *)"FS. ";
|
|
case EXTEDIT: return (char *)"Ext.";
|
|
default: return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void show_msgeditor(int y, int x, int val)
|
|
{
|
|
mvprintw(y, x, getmsgeditor(val));
|
|
}
|
|
|
|
|
|
|
|
int edit_msgeditor(int y, int x, int val)
|
|
{
|
|
int ch;
|
|
|
|
showhelp((char *)"Toggle ^Message editor^ with spacebar, press <Enter> whene done");
|
|
|
|
do {
|
|
set_color(YELLOW, BLUE);
|
|
show_msgeditor(y, x, val);
|
|
ch = readkey(y, x, YELLOW, BLUE);
|
|
|
|
if (ch == ' ') {
|
|
if (val < EXTEDIT)
|
|
val++;
|
|
else
|
|
val = LINEEDIT;
|
|
}
|
|
} while ((ch != KEY_ENTER) && (ch != '\012'));
|
|
|
|
set_color(WHITE, BLACK);
|
|
show_msgeditor(y, x, val);
|
|
return val;
|
|
}
|
|
|
|
|
|
|
|
void show_magictype(int y, int x, int val)
|
|
{
|
|
mvprintw(y, x, getmagictype(val));
|
|
}
|
|
|
|
|
|
|
|
int edit_magictype(int y, int x, int val)
|
|
{
|
|
int ch;
|
|
|
|
showhelp((char *)"Toggle ^Magic type^ with spacebar, press <Enter> whene done");
|
|
|
|
do {
|
|
set_color(YELLOW, BLUE);
|
|
show_magictype(y, x, val);
|
|
|
|
ch = readkey(y, x, YELLOW, BLUE);
|
|
|
|
if (ch == ' ') {
|
|
if (val < MG_DELETE)
|
|
val++;
|
|
else
|
|
val = 0;
|
|
}
|
|
|
|
} while ((ch != KEY_ENTER) && (ch != '\012'));
|
|
|
|
set_color(WHITE, BLACK);
|
|
show_magictype(y, x, val);
|
|
return val;
|
|
}
|
|
|
|
|
|
|
|
char *getmagictype(int val)
|
|
{
|
|
switch(val) {
|
|
case MG_EXEC: return (char *)"Execute ";
|
|
case MG_COPY: return (char *)"Copy file ";
|
|
case MG_UNPACK: return (char *)"Unpack file ";
|
|
case MG_KEEPNUM: return (char *)"Keep number ";
|
|
case MG_MOVE: return (char *)"Move file ";
|
|
case MG_UPDALIAS: return (char *)"Update alias";
|
|
case MG_ADOPT: return (char *)"Adopt file ";
|
|
case MG_DELETE: return (char *)"Delete file ";
|
|
default: return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
char *get_sessiontype(int val)
|
|
{
|
|
switch (val) {
|
|
case S_DIRECT: return (char *)"Direct ";
|
|
case S_DIR: return (char *)"Directory";
|
|
case S_FTP: return (char *)"FTP ";
|
|
default: return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void show_sessiontype(int y, int x, int val)
|
|
{
|
|
mvprintw(y, x, get_sessiontype(val));
|
|
}
|
|
|
|
|
|
|
|
int edit_sessiontype(int y, int x, int val)
|
|
{
|
|
int ch;
|
|
|
|
showhelp((char *)"Toggle ^Session type^ with spacebar, press <Enter> whene done.");
|
|
do {
|
|
set_color(YELLOW, BLUE);
|
|
show_sessiontype(y, x, val);
|
|
|
|
ch = readkey(y, x, YELLOW, BLUE);
|
|
|
|
if (ch == ' ') {
|
|
// if (val < S_FTP)
|
|
if (val < S_DIR)
|
|
val++;
|
|
else
|
|
val = S_DIRECT;
|
|
}
|
|
} while (ch != KEY_ENTER && ch != '\012');
|
|
set_color(WHITE, BLACK);
|
|
show_sessiontype(y, x, val);
|
|
return val;
|
|
}
|
|
|
|
|
|
|
|
char *get_routetype(int val)
|
|
{
|
|
switch (val) {
|
|
case R_NOROUTE: return (char *)"Default ";
|
|
case R_ROUTE: return (char *)"Route to ";
|
|
case R_DIRECT: return (char *)"Direct ";
|
|
case R_REDIRECT: return (char *)"New address";
|
|
case R_BOUNCE: return (char *)"Bounce ";
|
|
case R_CC: return (char *)"CarbonCopy ";
|
|
default: return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void show_routetype(int y, int x, int val)
|
|
{
|
|
mvprintw(y, x, get_routetype(val));
|
|
}
|
|
|
|
|
|
|
|
int edit_routetype(int y, int x, int val)
|
|
{
|
|
int ch;
|
|
|
|
showhelp((char *)"Toggle ^Routing mode^ with spacebar, press <Enter> whene done.");
|
|
do {
|
|
set_color(YELLOW, BLUE);
|
|
show_routetype(y, x, val);
|
|
|
|
ch = readkey(y, x, YELLOW, BLUE);
|
|
|
|
if (ch == ' ') {
|
|
// if (val < RT_CC)
|
|
if (val < R_DIRECT)
|
|
val++;
|
|
else
|
|
val = R_NOROUTE;
|
|
}
|
|
} while (ch != KEY_ENTER && ch != '\012');
|
|
set_color(WHITE, BLACK);
|
|
show_routetype(y, x, val);
|
|
return val;
|
|
}
|
|
|
|
|
|
|
|
void show_aka(int y, int x, fidoaddr aka)
|
|
{
|
|
char temp[24];
|
|
|
|
if (aka.point == 0)
|
|
sprintf(temp, "%d:%d/%d@%s", aka.zone, aka.net, aka.node, aka.domain);
|
|
else
|
|
sprintf(temp, "%d:%d/%d.%d@%s", aka.zone, aka.net, aka.node, aka.point, aka.domain);
|
|
mvprintw(y, x, temp);
|
|
}
|
|
|
|
|
|
|
|
void edit_color(int *fg, int *bg, char *title, char *help)
|
|
{
|
|
int ch, f, b;
|
|
char temp[81];
|
|
|
|
clr_index();
|
|
set_color(WHITE, BLACK);
|
|
mvprintw(5, 6, title);
|
|
sprintf(temp, "Change the ^%s^ color with arrow keys, press <Enter> whene done", help);
|
|
showhelp(temp);
|
|
|
|
for (f = 0; f < 16; f++)
|
|
for (b = 0; b < 8; b++) {
|
|
set_color(f, b);
|
|
mvprintw(b + 9, f + 33, ".");
|
|
}
|
|
|
|
f = (*fg) & 15;
|
|
b = (*bg) & 7;
|
|
|
|
for (;;) {
|
|
set_color(f, b);
|
|
mvprintw(7, 6, "This is an example...");
|
|
fflush(stdout);
|
|
mvprintw(b + 9, f + 33, "*");
|
|
ch = readkey(7,28, f, b);
|
|
mvprintw(b + 9, f + 33, ".");
|
|
switch(ch) {
|
|
case KEY_LINEFEED:
|
|
case KEY_ENTER: (* fg) = f;
|
|
(* bg) = b;
|
|
return;
|
|
case KEY_LEFT: if (f > 0)
|
|
f--;
|
|
break;
|
|
case KEY_RIGHT: if (f < 15)
|
|
f++;
|
|
break;
|
|
case KEY_UP: if (b > 0)
|
|
b--;
|
|
break;
|
|
case KEY_DOWN: if (b < 7)
|
|
b++;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
char *get_color(int c)
|
|
{
|
|
switch (c) {
|
|
case BLACK: return (char *)"black";
|
|
case BLUE: return (char *)"blue";
|
|
case GREEN: return (char *)"green";
|
|
case CYAN: return (char *)"cyan";
|
|
case RED: return (char *)"red";
|
|
case MAGENTA: return (char *)"magenta";
|
|
case BROWN: return (char *)"brown";
|
|
case LIGHTGRAY: return (char *)"lightgray";
|
|
case DARKGRAY: return (char *)"darkgray";
|
|
case LIGHTBLUE: return (char *)"lightblue";
|
|
case LIGHTGREEN: return (char *)"lightgreen";
|
|
case LIGHTCYAN: return (char *)"lightcyan";
|
|
case LIGHTRED: return (char *)"lightred";
|
|
case LIGHTMAGENTA: return (char *)"lightmagenta";
|
|
case YELLOW: return (char *)"yellow";
|
|
case WHITE: return (char *)"white";
|
|
default: return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
char *getmenutype(int val)
|
|
{
|
|
switch (val) {
|
|
case 1: return (char *)"Goto another menu";
|
|
case 2: return (char *)"Gosub another menu";
|
|
case 3: return (char *)"Return from gosub";
|
|
case 4: return (char *)"Return to top menu";
|
|
case 5: return (char *)"Display A?? file w/Ctrl codes";
|
|
case 6: return (char *)"Display menu prompt";
|
|
case 7: return (char *)"Run external program in shell";
|
|
case 8: return (char *)"Show product information";
|
|
case 9: return (char *)"Display todays callers list";
|
|
case 10: return (char *)"Display user list";
|
|
case 11: return (char *)"Display time statistics";
|
|
case 12: return (char *)"Page sysop for a chat";
|
|
case 13: return (char *)"Terminate call";
|
|
case 14: return (char *)"Make a log entry";
|
|
case 15: return (char *)"Print text to screen";
|
|
case 16: return (char *)"Who's currently on-line";
|
|
case 17: return (char *)"Comment to sysop";
|
|
case 18: return (char *)"Send an on-line message";
|
|
case 19: return (char *)"Display textfile with more";
|
|
case 20: return (char *)"Display .A?? file with Enter";
|
|
case 21: return (char *)"Display Text Only";
|
|
case 22: return (char *)"Message to nextuser door";
|
|
case 23: return (char *)"Time banking system";
|
|
|
|
case 25: return (char *)"Safe cracker door";
|
|
|
|
case 101: return (char *)"Select new file area";
|
|
case 102: return (char *)"List files in current area";
|
|
case 103: return (char *)"View a textfile";
|
|
case 104: return (char *)"Download tagged files";
|
|
case 105: return (char *)"Raw directory listing";
|
|
case 106: return (char *)"Search file on keyword";
|
|
case 107: return (char *)"Search file on filename";
|
|
case 108: return (char *)"Scan for new files";
|
|
case 109: return (char *)"Upload a file";
|
|
case 110: return (char *)"Edit the taglist";
|
|
case 111: return (char *)"View file in home directory";
|
|
case 112: return (char *)"Download a specific file";
|
|
case 113: return (char *)"Copy file to home directory";
|
|
case 114: return (char *)"List files in home directory";
|
|
case 115: return (char *)"Delete file in home directory";
|
|
case 116: return (char *)"Unpack file in home directory";
|
|
case 117: return (char *)"Pack files in home directory";
|
|
case 118: return (char *)"Download from home directory";
|
|
case 119: return (char *)"Upload to home directory";
|
|
|
|
case 201: return (char *)"Select new message area";
|
|
case 202: return (char *)"Post a new message";
|
|
case 203: return (char *)"Read messages";
|
|
case 204: return (char *)"Check for new mail";
|
|
case 205: return (char *)"Quick-scan messages";
|
|
case 206: return (char *)"Delete a specific message";
|
|
case 207: return (char *)"Show mail status";
|
|
case 208: return (char *)"OLR Tag Area";
|
|
case 209: return (char *)"OLR Remove Area";
|
|
case 210: return (char *)"OLR View Areas";
|
|
case 211: return (char *)"OLR Restrict Date";
|
|
case 212: return (char *)"OLR Upload";
|
|
case 213: return (char *)"OLR Download BlueWave";
|
|
case 214: return (char *)"OLR Download QWK";
|
|
case 215: return (char *)"OLR Download ASCII";
|
|
case 216: return (char *)"Read email";
|
|
case 217: return (char *)"Post email";
|
|
case 218: return (char *)"Trash email";
|
|
case 219: return (char *)"Choose mailbox";
|
|
case 220: return (char *)"Quick-scan email's";
|
|
|
|
case 301: return (char *)"Change transfer protocol";
|
|
case 302: return (char *)"Change password";
|
|
case 303: return (char *)"Change location";
|
|
case 304: return (char *)"Change graphics mode";
|
|
case 305: return (char *)"Change voice phone";
|
|
case 306: return (char *)"Change data phone";
|
|
case 307: return (char *)"Change show news bulletins";
|
|
case 308: return (char *)"Change screen length";
|
|
case 309: return (char *)"Change date of birth";
|
|
case 310: return (char *)"Change language";
|
|
case 311: return (char *)"Change hot-keys";
|
|
case 312: return (char *)"Change handle (alias)";
|
|
case 313: return (char *)"Change check for new mail";
|
|
case 314: return (char *)"Change do-not-disturb";
|
|
case 315: return (char *)"Change check for new files";
|
|
case 316: return (char *)"Change fullscreen editor";
|
|
case 317: return (char *)"Change FS edit shortcut keys";
|
|
case 318: return (char *)"Change address";
|
|
|
|
case 401: return (char *)"Add oneliner";
|
|
case 402: return (char *)"List oneliners";
|
|
case 403: return (char *)"Show a oneliner";
|
|
case 404: return (char *)"Mark oneliner for deletion";
|
|
case 405: return (char *)"Print a random oneliner";
|
|
|
|
case 501: return (char *)"Add a BBS";
|
|
case 502: return (char *)"List BBS's";
|
|
case 503: return (char *)"Show a BBS";
|
|
case 504: return (char *)"Mark a BBS for deletion";
|
|
case 505: return (char *)"Print a BBS";
|
|
case 506: return (char *)"Search for a BBS";
|
|
|
|
default: return (char *)"Unknown menu";
|
|
}
|
|
}
|
|
|
|
|
|
|