int screenheight;
unsigned room_flags;
char room_name[ROOMNAMELEN];
-char ugname[ROOMNAMELEN];
-long uglsn; /* holds <u>ngoto info */
+char *uglist[UGLISTLEN]; /* size of the ungoto list */
+long uglistlsn[UGLISTLEN]; /* current read position for all the ungoto's. Not going to make any friends with this one. */
+int uglistsize = 0;
char is_mail = 0; /* nonzero when we're in a mail room */
char axlevel = 0; /* access level */
char is_room_aide = 0; /* boolean flag, 1 if room aide */
*/
void logoff(int code)
{
+ int lp;
if (editor_pid > 0) { /* kill the editor if it's running */
kill(editor_pid, SIGHUP);
}
+
+ /* Free the ungoto list */
+ for (lp = 0; lp < uglistsize; lp++)
+ free (uglist[lp]);
+
/* shut down the server... but not if the logoff code is 3, because
* that means we're exiting because we already lost the server
*/
/*
* jump directly to a room
*/
-void dotgoto(char *towhere, int display_name)
+void dotgoto(char *towhere, int display_name, int fromungoto)
{
char aaa[SIZ], bbb[SIZ], psearch[SIZ];
static long ls = 0L;
static int oldmailcount = (-1);
int partial_match, best_match;
char from_floor;
+ int ugpos = uglistsize;
/* store ungoto information */
- strcpy(ugname, room_name);
- uglsn = ls;
-
+ if (fromungoto == 0)
+ {
+ if (uglistsize >= (UGLISTLEN-1))
+ { /* sloppy slide them all down, hey it's the client, who cares. :-) */
+ int lp;
+ free (uglist[0]);
+ for (lp = 0; lp < (UGLISTLEN-1); lp++)
+ {
+ uglist[lp] = uglist[lp+1];
+ uglistlsn[lp] = uglistlsn[lp+1];
+ }
+ ugpos--;
+ }
+ else
+ uglistsize++;
+
+ uglist[ugpos] = malloc(strlen(room_name)+1);
+ strcpy(uglist[ugpos], room_name);
+ uglistlsn[ugpos] = ls;
+ }
+
/* first try an exact match */
snprintf(aaa, sizeof aaa, "GOTO %s", towhere);
serv_puts(aaa);
strcpy(next_room, "_BASEROOM_");
}
remove_march(next_room, 0);
- dotgoto(next_room, 1);
+ dotgoto(next_room, 1, 0);
}
/*
if (mode == GF_GOTO) { /* <;G>oto mode */
updatels();
- dotgoto(towhere, 1);
+ dotgoto(towhere, 1, 0);
}
if (mode == GF_SKIP) { /* <;S>kip mode */
- dotgoto(towhere, 1);
+ dotgoto(towhere, 1, 0);
remove_march("_FLOOR_", floor_being_left);
}
if (mode == GF_ZAP) { /* <;Z>ap mode */
- dotgoto(towhere, 1);
+ dotgoto(towhere, 1, 0);
remove_march("_FLOOR_", floor_being_left);
forget_all_rooms_on(floor_being_left);
}
time_t timenow = 0;
time_t idletime, idlehours, idlemins, idlesecs;
int last_session = (-1);
+ int skipidle = 0;
+
+ if (longlist == 2)
+ {
+ longlist = 0;
+ skipidle = 1;
+ }
serv_puts("TIME");
serv_gets(tbuf);
serv_gets(buf);
if (buf[0] == '1') {
while (serv_gets(buf), strcmp(buf, "000")) {
+ int isidle = 0;
extract(username, buf, 1);
extract(roomname, buf, 2);
extract(fromhost, buf, 3);
strcat(roomname, " ");
}
strcpy(&roomname[14], "[idle]");
+ if (skipidle)
+ isidle = 1;
}
if (longlist) {
pprintf("\n");
} else {
- if (extract_int(buf, 0) == last_session) {
- pprintf(" ");
- } else {
- color(BRIGHT_MAGENTA);
- pprintf("%-3s ", flags);
- color(DIM_WHITE);
- pprintf("%-3d ", extract_int(buf, 0));
- }
- last_session = extract_int(buf, 0);
- color(BRIGHT_CYAN);
- pprintf("%-25s ", username);
- color(BRIGHT_MAGENTA);
- roomname[20] = 0;
- pprintf("%-20s ", roomname);
- color(BRIGHT_CYAN);
- fromhost[24] = '\0';
- pprintf("%-24s\n", fromhost);
- color(DIM_WHITE);
+ if (isidle == 0) {
+ if (extract_int(buf, 0) == last_session) {
+ pprintf(" ");
+ } else {
+ color(BRIGHT_MAGENTA);
+ pprintf("%-3s ", flags);
+ color(DIM_WHITE);
+ pprintf("%-3d ", extract_int(buf, 0));
+ }
+ last_session = extract_int(buf, 0);
+ color(BRIGHT_CYAN);
+ pprintf("%-25s ", username);
+ color(BRIGHT_MAGENTA);
+ roomname[20] = 0;
+ pprintf("%-20s ", roomname);
+ color(BRIGHT_CYAN);
+ fromhost[24] = '\0';
+ pprintf("%-24s\n", fromhost);
+ color(DIM_WHITE);
+ }
}
}
}
signal(SIGTERM, dropcarr); /* Cleanup gracefully if terminated */
signal(SIGCONT, catch_sigcont); /* Catch SIGCONT so we can reset terminal */
+#ifdef HAVE_OPENSSL
arg_encrypt = RC_DEFAULT;
+#endif
+#ifdef HAVE_CURSES_H
arg_screen = RC_DEFAULT;
+#endif
/*
* Handle command line options as if we were called like /bin/login
argc = shift(argc, argv, a, 2);
}
if (!strcmp(argv[a], "-x")) {
+#ifdef HAVE_OPENSSL
arg_encrypt = RC_NO;
+#endif
argc = shift(argc, argv, a, 1);
}
if (!strcmp(argv[a], "-X")) {
+#ifdef HAVE_OPENSSL
arg_encrypt = RC_YES;
- argc = shift(argc, argv, a, 1);
+ argc = shift(argc, argv, a, 1);
+#else
+ fprintf(stderr, "Not compiled with encryption support");
+ return 1;
+#endif
}
if (!strcmp(argv[a], "-s")) {
+#ifdef HAVE_CURSES_H
arg_screen = RC_NO;
+#endif
argc = shift(argc, argv, a, 1);
}
if (!strcmp(argv[a], "-S")) {
+#ifdef HAVE_CURSES_H
arg_screen = RC_YES;
+#endif
argc = shift(argc, argv, a, 1);
}
if (!strcmp(argv[a], "-p")) {
serv_gets(aaa);
if (nonce[0])
{
- sprintf(aaa, "PAS2 %s", make_apop_string(password, nonce, hexstring));
+ snprintf(aaa, sizeof aaa, "PAS2 %s", make_apop_string(password, nonce, hexstring, sizeof hexstring));
}
else /* Else no APOP */
{
if (nonce[0])
{
- sprintf(aaa, "PAS2 %s", make_apop_string(password, nonce, hexstring));
+ 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);
+ snprintf(aaa, sizeof aaa, "PASS %s", password);
}
serv_puts(aaa);
/* Enter the lobby */
- dotgoto("_BASEROOM_", 1);
+ dotgoto("_BASEROOM_", 1, 0);
/* Main loop for the system... user is logged in. */
- strcpy(ugname, "");
- uglsn = 0L;
+ uglistsize = 0;
if (newnow == 1)
readmsgs(3, 1, 5);
case 90:
if (!rc_alt_semantics)
updatelsa();
- dotgoto(argbuf, 0);
+ dotgoto(argbuf, 0, 0);
break;
case 58:
updatelsa();
- dotgoto("_MAIL_", 1);
+ dotgoto("_MAIL_", 1, 0);
break;
case 20:
updatels();
- dotgoto(argbuf, 0);
+ dotgoto(argbuf, 0, 0);
break;
case 52:
if (rc_alt_semantics)
updatelsa();
- dotgoto(argbuf, 0);
+ dotgoto(argbuf, 0, 0);
break;
case 10:
readmsgs(0, 1, 0);
do_ignet_configuration();
break;
+ case 92:
+ do_filterlist_configuration();
+ break;
+
case 6:
if (rc_alt_semantics)
updatelsa();
who_is_online(1);
break;
+ case 91:
+ who_is_online(2);
+ break;
+
case 80:
do_system_configuration();
break;