/*
- * Citadel/UX
- *
- * citadel.c - Main source file.
* $Id$
+ *
+ * Main source module for the client program.
*/
#include "sysdep.h"
#include "commands.h"
#include "ipc.h"
#include "client_chat.h"
+#include "client_passwords.h"
#include "citadel_decls.h"
#include "tools.h"
#ifndef HAVE_SNPRINTF
struct march {
struct march *next;
- char march_name[32];
+ char march_name[ROOMNAMELEN];
char march_floor;
char march_order;
};
char have_xterm = 0; /* are we running on an xterm? */
char rc_username[32];
char rc_password[32];
+char hostbuf[256];
+char portbuf[256];
char rc_floor_mode;
char floor_mode;
char curr_floor = 0; /* number of current floor */
char floorlist[128][256]; /* names of floors */
char express_msgs = 0; /* express messages waiting! */
-jmp_buf jmp_reconnect; /* for server reconnects */
-char re_username[32];
-char re_password[32];
-
-void sigpipehandler(int nothing)
-{
- longjmp(jmp_reconnect, nothing);
-}
-
/*
* here is our 'clean up gracefully and exit' routine
*/
}
-void userlist(void)
+void userlist(char *patn)
{
char buf[256];
char fl[256];
struct tm *tmbuf;
time_t lc;
- int linecount = 2;
serv_puts("LIST");
serv_gets(buf);
if (buf[0] != '1') {
- printf("%s\n", &buf[4]);
+ pprintf("%s\n", &buf[4]);
return;
}
sigcaught = 0;
sttybbs(SB_YES_INTR);
- printf(" User Name Num L LastCall Calls Posts\n");
- printf("------------------------- ----- - ---------- ----- -----\n");
+ pprintf(" User Name Num L LastCall Calls Posts\n");
+ pprintf("------------------------- ----- - ---------- ----- -----\n");
while (serv_gets(buf), strcmp(buf, "000")) {
if (sigcaught == 0) {
- extract(fl, buf, 0);
- printf("%-25s ", fl);
- printf("%5ld %d ", extract_long(buf, 2),
+ extract(fl, buf, 0);
+ if (pattern(fl, patn) >= 0) {
+ pprintf("%-25s ", fl);
+ pprintf("%5ld %d ", extract_long(buf, 2),
extract_int(buf, 1));
lc = extract_long(buf, 3);
tmbuf = (struct tm *) localtime(&lc);
- printf("%02d/%02d/%04d ",
+ pprintf("%02d/%02d/%04d ",
(tmbuf->tm_mon + 1),
tmbuf->tm_mday,
(tmbuf->tm_year + 1900));
- printf("%5ld %5ld\n", extract_long(buf, 4), extract_long(buf, 5));
-
- ++linecount;
- linecount = checkpagin(linecount,
- ((userflags & US_PAGINATOR) ? 1 : 0),
- screenheight);
+ pprintf("%5ld %5ld\n", extract_long(buf, 4), extract_long(buf, 5));
+ }
}
}
sttybbs(SB_NO_INTR);
- printf("\n");
+ pprintf("\n");
}
if (march == NULL)
return;
- if ((!strucmp(march->march_name, roomname))
- || ((!strucmp(roomname, "_FLOOR_")) && (march->march_floor == floornum))) {
+ if ((!strcasecmp(march->march_name, roomname))
+ || ((!strcasecmp(roomname, "_FLOOR_")) && (march->march_floor == floornum))) {
mptr = march->next;
free(march);
march = mptr;
mptr2 = march;
for (mptr = march; mptr != NULL; mptr = mptr->next) {
- if ((!strucmp(mptr->march_name, roomname))
- || ((!strucmp(roomname, "_FLOOR_"))
+ if ((!strcasecmp(mptr->march_name, roomname))
+ || ((!strcasecmp(roomname, "_FLOOR_"))
&& (mptr->march_floor == floornum))) {
mptr2->next = mptr->next;
if (pattern(psearch, towhere) >= 0) {
partial_match = 1;
}
- if (!struncmp(towhere, psearch, strlen(towhere))) {
+ if (!strncasecmp(towhere, psearch, strlen(towhere))) {
partial_match = 2;
}
if (partial_match > best_match) {
curr_floor = extract_int(&aaa[4], 10);
remove_march(room_name, 0);
- if (!strucmp(towhere, "_BASEROOM_"))
+ if (!strcasecmp(towhere, "_BASEROOM_"))
remove_march(towhere, 0);
if ((from_floor != curr_floor) && (display_name > 0) && (floor_mode == 1)) {
if (floorlist[(int) curr_floor][0] == 0)
{
char buf[256];
struct march *mptr, *mptr2;
- char next_room[32];
+ char next_room[ROOMNAMELEN];
/* Check to see if the march-mode list is already allocated.
* If it is, pop the first room off the list and go there.
load_floorlist();
tofloor = (-1);
for (a = 0; a < 128; ++a)
- if (!strucmp(&floorlist[a][0], towhere))
+ if (!strcasecmp(&floorlist[a][0], towhere))
tofloor = a;
if (tofloor < 0) {
for (a = 0; a < 128; ++a) {
- if (!struncmp(&floorlist[a][0], towhere, strlen(towhere))) {
+ if (!strncasecmp(&floorlist[a][0], towhere, strlen(towhere))) {
tofloor = a;
}
}
newprompt("Enter a new password: ", pass1, -19);
newprompt("Enter it again to confirm: ", pass2, -19);
}
- if (!strucmp(pass1, pass2)) {
+ strproc(pass1);
+ strproc(pass2);
+ if (!strcasecmp(pass1, pass2)) {
snprintf(buf, sizeof buf, "SETP %s", pass1);
serv_puts(buf);
serv_gets(buf);
printf("%s\n", &buf[4]);
- strcpy(re_password, pass1);
+ offer_to_remember_password(hostbuf, portbuf, fullname, pass1);
return (0);
} else {
printf("*** They don't match... try again.\n");
}
} else {
color(BRIGHT_WHITE);
- printf("FLG ### User Name Room From host\n");
+ pprintf("FLG ### User Name Room From host\n");
color(DIM_WHITE);
- printf("--- --- ------------------------- -------------------- ------------------------\n");
+ pprintf("--- --- ------------------------- -------------------- ------------------------\n");
}
serv_puts("RWHO");
serv_gets(buf);
idlehours = idletime / 3600;
idlemins = (idletime - (idlehours * 3600)) / 60;
idlesecs = (idletime - (idlehours * 3600) - (idlemins * 60));
- printf("\nFlags: %-3s Sess# %-3d Name: %-25s Room: %s\n",
+ pprintf("\nFlags: %-3s Sess# %-3d Name: %-25s Room: %s\n",
flags, extract_int(buf, 0), username, roomname);
- printf("from <%s> using <%s>, idle %ld:%02ld:%02ld\n",
+ pprintf("from <%s> using <%s>, idle %ld:%02ld:%02ld\n",
fromhost, clientsoft,
(long) idlehours, (long) idlemins, (long) idlesecs);
} else {
if (extract_int(buf, 0) == last_session) {
- printf(" ");
+ pprintf(" ");
} else {
color(BRIGHT_MAGENTA);
- printf("%-3s ", flags);
+ pprintf("%-3s ", flags);
color(DIM_WHITE);
- printf("%-3d ", extract_int(buf, 0));
+ pprintf("%-3d ", extract_int(buf, 0));
}
last_session = extract_int(buf, 0);
color(BRIGHT_CYAN);
- printf("%-25s ", username);
+ pprintf("%-25s ", username);
color(BRIGHT_MAGENTA);
- printf("%-20s ", roomname);
+ roomname[20] = 0;
+ pprintf("%-20s ", roomname);
color(BRIGHT_CYAN);
- printf("%-24s\n", fromhost);
+ pprintf("%-24s\n", fromhost);
color(DIM_WHITE);
}
}
int main(int argc, char **argv)
{
int a, b, mcmd;
- char aaa[100], bbb[100], eee[100]; /* general purpose variables */
+ char aaa[100], bbb[100];/* general purpose variables */
char argbuf[32]; /* command line buf */
volatile int termn8 = 0;
-
+ int stored_password = 0;
+ char password[256];
sttybbs(SB_SAVE); /* Store the old terminal parameters */
load_command_set(); /* parse the citadel.rc file */
signal(SIGTERM, dropcarr); /* Cleanup gracefully if terminated */
signal(SIGCONT, catch_sigcont); /* Catch SIGCONT so we can reset terminal */
- printf("Attaching to server...\r");
+ printf("Attaching to server... \r");
fflush(stdout);
- attach_to_server(argc, argv);
+ attach_to_server(argc, argv, hostbuf, portbuf);
send_ansi_detect();
cls(0);
color(7);
- printf("%-22s\n%s\n%s\n", serv_info.serv_software, serv_info.serv_humannode,
+ printf("%-23s\n%s\n%s\n", serv_info.serv_software, serv_info.serv_humannode,
serv_info.serv_bbs_city);
screenwidth = 80; /* default screen dimensions */
screenheight = 24;
formout("hello"); /* print the opening greeting */
printf("\n");
- GSTA:termn8 = 0;
+GSTA: /* See if we have a username and password on disk */
+ if (rc_remember_passwords) {
+ get_stored_password(hostbuf, portbuf, fullname, password);
+ if (strlen(fullname) > 0) {
+ sprintf(aaa, "USER %s", fullname);
+ serv_puts(aaa);
+ serv_gets(aaa);
+ sprintf(aaa, "PASS %s", password);
+ serv_puts(aaa);
+ serv_gets(aaa);
+ if (aaa[0] == '2') {
+ load_user_info(&aaa[4]);
+ stored_password = 1;
+ goto PWOK;
+ }
+ else {
+ set_stored_password(hostbuf, portbuf, "", "");
+ }
+ }
+ }
+
+ termn8 = 0;
newnow = 0;
do {
if (strlen(rc_username) > 0) {
newprompt("Enter your name: ", fullname, 29);
}
strproc(fullname);
- if (!strucmp(fullname, "new")) { /* just in case */
+ if (!strcasecmp(fullname, "new")) { /* just in case */
printf("Please enter the name you wish to log in with.\n");
}
} while (
- (!strucmp(fullname, "bbs"))
- || (!strucmp(fullname, "new"))
+ (!strcasecmp(fullname, "bbs"))
+ || (!strcasecmp(fullname, "new"))
|| (strlen(fullname) == 0));
- if (!strucmp(fullname, "off")) {
+ if (!strcasecmp(fullname, "off")) {
mcmd = 29;
goto TERMN8;
}
/* sign on to the server */
- strcpy(re_username, fullname);
snprintf(aaa, sizeof aaa, "USER %s", fullname);
serv_puts(aaa);
serv_gets(aaa);
/* password authentication */
if (strlen(rc_password) > 0) {
- strcpy(eee, rc_password);
+ strcpy(password, rc_password);
} else {
- newprompt("\rPlease enter your password: ", eee, -19);
+ newprompt("\rPlease enter your password: ", password, -19);
}
- strproc(eee);
- snprintf(aaa, sizeof aaa, "PASS %s", eee);
+ strproc(password);
+ snprintf(aaa, sizeof aaa, "PASS %s", password);
serv_puts(aaa);
serv_gets(aaa);
if (aaa[0] == '2') {
- strcpy(re_password, eee);
load_user_info(&aaa[4]);
+ offer_to_remember_password(hostbuf, portbuf,
+ fullname, password);
goto PWOK;
}
printf("<< wrong password >>\n");
logoff(0);
goto GSTA;
- NEWUSR:if (strlen(rc_password) == 0) {
+NEWUSR: if (strlen(rc_password) == 0) {
printf("No record. Enter as new user? ");
if (yesno() == 0)
goto GSTA;
enter_config(1);
- PWOK:printf("%s\nAccess level: %d (%s)\nUser #%ld / Call #%d\n",
+PWOK: printf("%s\nAccess level: %d (%s)\nUser #%ld / Call #%d\n",
fullname, axlevel, axdefs[(int) axlevel],
usernum, timescalled);
do { /* MAIN LOOP OF PROGRAM */
- /* Reconnect to the server if the connection was broken */
- if (setjmp(jmp_reconnect)) {
- printf("\rServer connection broken; reconnecting...\r");
- fflush(stdout);
- attach_to_server(argc, argv);
- printf(" \r");
- fflush(stdout);
- serv_gets(aaa);
- if (aaa[0] != '2') {
- printf("%s\n", &aaa[4]);
- exit(0);
- }
- get_serv_info();
- sprintf(aaa, "USER %s", re_username);
- serv_puts(aaa);
- serv_gets(aaa);
- if (aaa[0] != '3') {
- printf("%s\n", &aaa[4]);
- exit(0);
- }
- sprintf(aaa, "PASS %s", re_password);
- serv_puts(aaa);
- serv_gets(aaa);
- if (aaa[0] != '2') {
- printf("%s\n", &aaa[4]);
- exit(0);
- }
- load_user_info(&aaa[4]);
- sprintf(aaa, "GOTO %s", room_name);
- serv_puts(aaa);
- serv_gets(aaa);
- }
- signal(SIGPIPE, sigpipehandler);
-
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
mcmd = getcmd(argbuf);
killroom();
break;
case 32:
- userlist();
+ userlist(argbuf);
break;
case 27:
invite();
do_system_configuration();
break;
+ case 82:
+ do_internet_configuration();
+ break;
+
+ case 83:
+ check_message_base();
+ break;
+
+ case 84:
+ quiet_mode();
+ break;
+
case 50:
enter_config(2);
break;