#include <pwd.h>
#include <setjmp.h>
#include <stdarg.h>
+#include <errno.h>
#include "citadel.h"
#include "citadel_ipc.h"
char editor_path[SIZ]; /* path to external editor */
char printcmd[SIZ]; /* print command */
int editor_pid = (-1);
-char fullname[32];
+char fullname[USERNAME_SIZE];
jmp_buf nextbuf;
struct CtdlServInfo serv_info; /* Info on the server connected */
int screenwidth;
long maxmsgnum; /* used for <G>oto */
char sigcaught = 0;
char have_xterm = 0; /* are we running on an xterm? */
-char rc_username[32];
+char rc_username[USERNAME_SIZE];
char rc_password[32];
char hostbuf[SIZ];
char portbuf[SIZ];
*/
void dotgoto(CtdlIPC *ipc, char *towhere, int display_name, int fromungoto)
{
- char aaa[SIZ], bbb[SIZ], psearch[SIZ];
+ char aaa[SIZ], bbb[SIZ];
static long ls = 0L;
int newmailcount = 0;
int partial_match, best_match;
* has the highest-weighted match.
*/
if (r / 100 != 2) {
+ struct march *march = NULL;
+ int r; /* IPC result code; hides higher-level r */
+
best_match = 0;
strcpy(bbb, "");
- CtdlIPC_putline(ipc, "LKRA");
- CtdlIPC_getline(ipc, aaa);
- if (aaa[0] == '1')
- while (CtdlIPC_getline(ipc, aaa), strcmp(aaa, "000")) {
- extract(psearch, aaa, 0);
+
+ r = CtdlIPCKnownRooms(ipc, AllAccessibleRooms, -1, &march, aaa);
+ if (r / 100 == 1) {
+ /* Run the roomlist; free the data as we go */
+ struct march *mp = march; /* Current */
+
+ while (mp) {
partial_match = 0;
- if (pattern(psearch, towhere) >= 0) {
+ if (pattern(mp->march_name, towhere) >= 0) {
partial_match = 1;
}
- if (!strncasecmp(towhere, psearch, strlen(towhere))) {
+ if (!strncasecmp(mp->march_name, towhere, strlen(towhere))) {
partial_match = 2;
}
if (partial_match > best_match) {
- strcpy(bbb, psearch);
+ strcpy(bbb, mp->march_name);
best_match = partial_match;
}
+ /* Both pointers are NULL at end of list */
+ march = mp->next;
+ free(mp);
+ mp = march;
}
+ }
+
if (strlen(bbb) == 0) {
scr_printf("No room '%s'.\n", towhere);
return;
roomrec = NULL;
r = CtdlIPCGotoRoom(ipc, bbb, "", &roomrec, aaa);
}
- if (r / 100 != 2) {
+ if (r / 100 != 1 && r / 100 != 2) {
scr_printf("%s\n", aaa);
return;
}
* If it is, pop the first room off the list and go there.
*/
if (march == NULL) {
- r = CtdlIPCKnownRooms(ipc, 1, -1, &march, buf);
+ r = CtdlIPCKnownRooms(ipc, SubscribedRoomsWithNewMessages, -1, &march, buf);
/* add _BASEROOM_ to the end of the march list, so the user will end up
* in the system base room (usually the Lobby>) at the end of the loop
*/
scr_printf("Forgetting all rooms on %s...\r", &floorlist[ffloor][0]);
scr_flush();
- snprintf(buf, sizeof buf, "LKRA %d", ffloor);
- CtdlIPC_putline(ipc, buf);
- CtdlIPC_getline(ipc, buf);
- if (buf[0] != '1') {
- scr_printf("%-72s\n", &buf[4]);
+ r = CtdlIPCKnownRooms(ipc, AllAccessibleRooms, ffloor, &flist, buf);
+ if (r / 100 != 1) {
+ scr_printf("%-72s\n", buf);
return;
}
- flist = NULL;
- while (CtdlIPC_getline(ipc, buf), strcmp(buf, "000")) {
- fptr = (struct march *) malloc(sizeof(struct march));
- fptr->next = flist;
- flist = fptr;
- extract(fptr->march_name, buf, 0);
- }
- while (flist != NULL) {
+ while (flist) {
r = CtdlIPCGotoRoom(ipc, flist->march_name, "", &roomrec, buf);
if (r / 100 == 2) {
r = CtdlIPCForgetRoom(ipc, buf);
void gotofloor(CtdlIPC *ipc, char *towhere, int mode)
{
int a, tofloor;
+ int r; /* IPC response code */
struct march *mptr;
char buf[SIZ], targ[SIZ];
}
strcpy(targ, "");
- snprintf(buf, sizeof buf, "LKRA %d", tofloor);
- CtdlIPC_putline(ipc, buf);
- CtdlIPC_getline(ipc, buf);
- if (buf[0] == '1')
- while (CtdlIPC_getline(ipc, buf), strcmp(buf, "000")) {
- if ((extract_int(buf, 2) == tofloor) && (strlen(targ) == 0))
- extract(targ, buf, 0);
+ mptr = NULL;
+ r = CtdlIPCKnownRooms(ipc, AllAccessibleRooms, tofloor, &mptr, buf);
+ if (r / 100 == 1) {
+ struct march *tmp = mptr;
+
+ /* TODO: room order is being ignored? */
+ if (mptr)
+ strncpy(targ, mptr->march_name, ROOMNAMELEN);
+ while (mptr) {
+ tmp = mptr->next;
+ free(mptr);
+ mptr = tmp;
}
+ }
if (strlen(targ) > 0) {
gf_toroom(ipc, targ, mode);
} else {
}
}
+#ifdef HAVE_OPENSSL
/* Evaluate encryption preferences */
if (arg_encrypt != RC_NO && rc_encrypt != RC_NO) {
if (!ipc->isLocal || arg_encrypt == RC_YES || rc_encrypt == RC_YES) {
error_printf("Can't encrypt: %s\n", aaa);
}
}
+#endif
get_serv_info(ipc, telnet_client_host);
scr_printf("%-24s\n%s\n%s\n", serv_info.serv_software, serv_info.serv_humannode,
if (rc_remember_passwords) {
get_stored_password(hostbuf, portbuf, fullname, password);
if (strlen(fullname) > 0) {
- snprintf(aaa, sizeof(aaa)-1, "USER %s", fullname);
- CtdlIPC_putline(ipc, aaa);
- CtdlIPC_getline(ipc, aaa);
- if (nonce[0])
- {
- snprintf(aaa, sizeof aaa, "PAS2 %s", make_apop_string(password, nonce, hexstring, sizeof hexstring));
- }
- else /* Else no APOP */
- {
- snprintf(aaa, sizeof(aaa)-1, "PASS %s", password);
+ r = CtdlIPCTryLogin(ipc, fullname, aaa);
+ if (r / 100 == 3) {
+ if (*nonce) {
+ r = CtdlIPCTryApopPassword(ipc, make_apop_string(password, nonce, hexstring, sizeof hexstring), aaa);
+ } else {
+ r = CtdlIPCTryPassword(ipc, password, aaa);
}
-
- CtdlIPC_putline(ipc, aaa);
- CtdlIPC_getline(ipc, aaa);
- if (aaa[0] == '2') {
- load_user_info(&aaa[4]);
+ }
+
+ if (r / 100 == 2) {
+ load_user_info(aaa);
stored_password = 1;
goto PWOK;
- }
- else {
+ } else {
set_stored_password(hostbuf, portbuf, "", "");
}
}
}
strproc(password);
- if (nonce[0])
- {
- snprintf(aaa, sizeof aaa, "PAS2 %s", make_apop_string(password, nonce, hexstring, sizeof hexstring));
- }
- else /* Else no APOP */
- {
- snprintf(aaa, sizeof aaa, "PASS %s", password);
- }
+ if (*nonce) {
+ r = CtdlIPCTryApopPassword(ipc, make_apop_string(password, nonce, hexstring, sizeof hexstring), aaa);
+ } else {
+ r = CtdlIPCTryPassword(ipc, password, aaa);
+ }
- CtdlIPC_putline(ipc, aaa);
- CtdlIPC_getline(ipc, aaa);
- if (aaa[0] == '2') {
- load_user_info(&aaa[4]);
+ if (r / 100 == 2) {
+ load_user_info(aaa);
offer_to_remember_password(hostbuf, portbuf,
fullname, password);
goto PWOK;
logoff(ipc, 0);
goto GSTA;
- NEWUSR: if (strlen(rc_password) == 0) {
- scr_printf("No record. Enter as new user? ");
- if (yesno() == 0)
- goto GSTA;
- }
- snprintf(aaa, sizeof aaa, "NEWU %s", fullname);
- CtdlIPC_putline(ipc, aaa);
- CtdlIPC_getline(ipc, aaa);
- if (aaa[0] != '2') {
+NEWUSR: if (strlen(rc_password) == 0) {
+ scr_printf("No record. Enter as new user? ");
+ if (yesno() == 0)
+ goto GSTA;
+ }
+
+ r = CtdlIPCCreateUser(ipc, fullname, 0, aaa);
+ if (r / 100 != 2) {
scr_printf("%s\n", aaa);
goto GSTA;
}
- load_user_info(&aaa[4]);
+ load_user_info(aaa);
- while (set_password(ipc) != 0);;
+ while (set_password(ipc) != 0);
newnow = 1;
enter_config(ipc, 1);
usernum, timescalled);
if (lastcall > 0L) {
scr_printf(" / Last login: %s\n",
- asctime(localtime(&lastcall)) );
+ asctime(localtime(&lastcall)));
}
scr_printf("\n");