#include <sys/ioctl.h>
#include <signal.h>
#include <pwd.h>
-#include <setjmp.h>
#include <stdarg.h>
#include <errno.h>
#include "snprintf.h"
#endif
#include "screen.h"
+#include "citadel_dirs.h"
#include "md5.h"
struct march *march = NULL;
/* globals associated with the client program */
-char temp[PATH_MAX]; /* Name of general temp file */
-char temp2[PATH_MAX]; /* Name of general temp file */
-char tempdir[PATH_MAX]; /* Name of general temp dir */
-char editor_path[SIZ]; /* path to external editor */
+char temp[PATH_MAX]; /* Name of general-purpose temp file */
+char temp2[PATH_MAX]; /* Name of general-purpose temp file */
+char tempdir[PATH_MAX]; /* Name of general-purpose temp directory */
+char editor_paths[MAX_EDITORS][SIZ]; /* paths to external editors */
char printcmd[SIZ]; /* print command */
int editor_pid = (-1);
char fullname[USERNAME_SIZE];
-jmp_buf nextbuf;
-struct CtdlServInfo serv_info; /* Info on the server connected */
int screenwidth;
int screenheight;
unsigned room_flags;
int secure; /* Set to nonzero when wire is encrypted */
int can_do_msg4 = 0; /* Set to nonzero if the server can handle MSG4 commands */
-extern char express_msgs; /* express messages waiting! */
+extern char instant_msgs; /* instant messages waiting! */
extern int rc_ansi_color; /* ansi color value from citadel.rc */
extern int next_lazy_cmd;
/*
* here is our 'clean up gracefully and exit' routine
*/
-void logoff(CtdlIPC *ipc, int code)
+void ctdl_logoff(char *file, int line, CtdlIPC *ipc, int code)
{
- int lp;
+ 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]);
+ /* 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
+/* Shut down the server connection ... but not if the logoff code is 3,
+ * because that means we're exiting because we already lost the server.
*/
- if (code != 3)
+ if (code != 3) {
CtdlIPCQuit(ipc);
+ }
/*
* now clean up various things
*/
-
screen_delete();
unlink(temp);
kill(0 - getpgrp(), SIGKILL);
}
color(ORIGINAL_PAIR); /* Restore the old color settings */
- sttybbs(SB_RESTORE); /* return the old terminal settings */
+ stty_ctdl(SB_RESTORE); /* return the old terminal settings */
+ /*
+ * uncomment the following if you need to know why Citadel exited
+ printf("*** Exit code %d at %s:%d\n", code, file, line);
+ sleep(2);
+ */
exit(code); /* exit with the proper exit code */
}
*/
void catch_sigcont(int signum)
{
- sttybbs(SB_LAST);
+ stty_ctdl(SB_LAST);
signal(SIGCONT, catch_sigcont);
}
-
/* general purpose routines */
+
/* display a file */
void formout(CtdlIPC *ipc, char *name)
{
{
char buf[SIZ];
char fl[SIZ];
- struct tm *tmbuf;
+ struct tm tmbuf;
time_t lc;
int r; /* IPC response code */
char *listing = NULL;
- r = CtdlIPCUserListing(ipc, &listing, buf);
+ r = CtdlIPCUserListing(ipc, patn, &listing, buf);
if (r / 100 != 1) {
pprintf("%s\n", buf);
return;
pprintf(" User Name Num L LastCall Calls Posts\n");
pprintf("------------------------- ----- - ---------- ----- -----\n");
- while (strlen(listing) > 0) {
- extract_token(buf, listing, 0, '\n');
+ if (listing != NULL) while (strlen(listing) > 0) {
+ extract_token(buf, listing, 0, '\n', sizeof buf);
remove_token(listing, 0, '\n');
if (sigcaught == 0) {
- extract(fl, buf, 0);
+ extract_token(fl, buf, 0, '|', sizeof fl);
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);
+ localtime_r(&lc, &tmbuf);
pprintf("%02d/%02d/%04d ",
- (tmbuf->tm_mon + 1),
- tmbuf->tm_mday,
- (tmbuf->tm_year + 1900));
+ (tmbuf.tm_mon + 1),
+ tmbuf.tm_mday,
+ (tmbuf.tm_year + 1900));
pprintf("%5ld %5ld\n", extract_long(buf, 4), extract_long(buf, 5));
}
*/
void load_user_info(char *params)
{
- extract(fullname, params, 0);
+ extract_token(fullname, params, 0, '|', sizeof fullname);
axlevel = extract_int(params, 1);
timescalled = extract_int(params, 2);
posted = extract_int(params, 3);
char from_floor;
int ugpos = uglistsize;
int r; /* IPC result code */
- struct ctdlipcroom *roomrec = NULL;
+ struct ctdlipcroom *room = NULL;
/* store ungoto information */
if (fromungoto == 0) {
uglistlsn[lp] = uglistlsn[lp+1];
}
ugpos--;
- } else
+ } else {
uglistsize++;
+ }
uglist[ugpos] = malloc(strlen(room_name)+1);
strcpy(uglist[ugpos], room_name);
}
/* first try an exact match */
- r = CtdlIPCGotoRoom(ipc, towhere, "", &roomrec, aaa);
+ r = CtdlIPCGotoRoom(ipc, towhere, "", &room, aaa);
if (r / 10 == 54) {
newprompt("Enter room password: ", bbb, 9);
- r = CtdlIPCGotoRoom(ipc, towhere, bbb, &roomrec, aaa);
+ r = CtdlIPCGotoRoom(ipc, towhere, bbb, &room, aaa);
if (r / 10 == 54) {
scr_printf("Wrong password.\n");
return;
* If a match is not found, try a partial match.
* Partial matches anywhere in the string carry a weight of 1,
* left-aligned matches carry a weight of 2. Pick the room that
- * has the highest-weighted match.
+ * has the highest-weighted match. Do not match on forgotten
+ * rooms.
*/
if (r / 100 != 2) {
struct march *march = NULL;
best_match = 0;
strcpy(bbb, "");
- r = CtdlIPCKnownRooms(ipc, AllAccessibleRooms, -1, &march, aaa);
+ r = CtdlIPCKnownRooms(ipc, SubscribedRooms, AllFloors, &march, aaa);
if (r / 100 == 1) {
/* Run the roomlist; free the data as we go */
struct march *mp = march; /* Current */
scr_printf("No room '%s'.\n", towhere);
return;
}
- roomrec = NULL;
- r = CtdlIPCGotoRoom(ipc, bbb, "", &roomrec, aaa);
+ room = NULL;
+ r = CtdlIPCGotoRoom(ipc, bbb, "", &room, aaa);
}
if (r / 100 != 1 && r / 100 != 2) {
scr_printf("%s\n", aaa);
return;
}
- safestrncpy(room_name, roomrec->RRname, ROOMNAMELEN);
- room_flags = roomrec->RRflags;
+ safestrncpy(room_name, room->RRname, ROOMNAMELEN);
+ room_flags = room->RRflags;
from_floor = curr_floor;
- curr_floor = roomrec->RRfloor;
+ curr_floor = room->RRfloor;
remove_march(room_name, 0);
if (!strcasecmp(towhere, "_BASEROOM_"))
remove_march(towhere, 0);
- if (!roomrec->RRunread)
+ if (!room->RRunread)
next_lazy_cmd = 5; /* Don't read new if no new msgs */
if ((from_floor != curr_floor) && (display_name > 0) && (floor_mode == 1)) {
if (floorlist[(int) curr_floor][0] == 0)
}
if (display_name != 2) {
color(BRIGHT_YELLOW);
- scr_printf("%d ", roomrec->RRunread);
+ scr_printf("%d ", room->RRunread);
color(DIM_WHITE);
scr_printf("new of ");
color(BRIGHT_YELLOW);
- scr_printf("%d ", roomrec->RRtotal);
+ scr_printf("%d ", room->RRtotal);
color(DIM_WHITE);
scr_printf("messages.\n");
}
- highest_msg_read = roomrec->RRlastread;
- maxmsgnum = roomrec->RRhighest;
- is_mail = roomrec->RRismailbox;
- is_room_aide = roomrec->RRaide;
- ls = roomrec->RRlastread;
+ highest_msg_read = room->RRlastread;
+ maxmsgnum = room->RRhighest;
+ is_mail = room->RRismailbox;
+ is_room_aide = room->RRaide;
+ ls = room->RRlastread;
/* read info file if necessary */
- if (roomrec->RRinfoupdated > 0)
+ if (room->RRinfoupdated > 0)
readinfo(ipc);
/* check for newly arrived mail if we can */
- newmailcount = roomrec->RRnewmail;
+ newmailcount = room->RRnewmail;
if (newmailcount > 0) {
color(BRIGHT_RED);
if (newmailcount == 1) {
system(rc_gotmail_cmd);
}
}
- status_line(serv_info.serv_humannode, serv_info.serv_bbs_city,
+ status_line(ipc->ServInfo.humannode, ipc->ServInfo.site_location,
room_name, secure, newmailcount);
}
* If it is, pop the first room off the list and go there.
*/
if (march == NULL) {
- r = CtdlIPCKnownRooms(ipc, SubscribedRoomsWithNewMessages, -1, &march, buf);
+ r = CtdlIPCKnownRooms(ipc, SubscribedRoomsWithNewMessages,
+ AllFloors, &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
*/
void forget_all_rooms_on(CtdlIPC *ipc, int ffloor)
{
char buf[SIZ];
- struct march *flist, *fptr;
- struct ctdlipcroom *roomrec; /* Ignored */
+ struct march *flist = NULL;
+ struct march *fptr = NULL;
+ struct ctdlipcroom *room = NULL;
int r; /* IPC response code */
- scr_printf("Forgetting all rooms on %s...\r", &floorlist[ffloor][0]);
+ scr_printf("Forgetting all rooms on %s...\n", &floorlist[ffloor][0]);
scr_flush();
+ remove_march("_FLOOR_", ffloor);
r = CtdlIPCKnownRooms(ipc, AllAccessibleRooms, ffloor, &flist, buf);
if (r / 100 != 1) {
- scr_printf("%-72s\n", buf);
+ scr_printf("Error %d: %s\n", r, buf);
return;
}
while (flist) {
- r = CtdlIPCGotoRoom(ipc, flist->march_name, "", &roomrec, buf);
+ r = CtdlIPCGotoRoom(ipc, flist->march_name, "", &room, buf);
if (r / 100 == 2) {
r = CtdlIPCForgetRoom(ipc, buf);
+ if (r / 100 != 2) {
+ scr_printf("Error %d: %s\n", r, buf);
+ }
+
}
fptr = flist;
flist = flist->next;
free(fptr);
}
- scr_printf("%-72s\r", "");
}
floor_being_left = curr_floor;
- if (mode == GF_GOTO) { /* <;G>oto mode */
+ if (mode == GF_GOTO) { /* <;G>oto mode */
updatels(ipc);
dotgoto(ipc, towhere, 1, 0);
}
- if (mode == GF_SKIP) { /* <;S>kip mode */
+ else if (mode == GF_SKIP) { /* <;S>kip mode */
dotgoto(ipc, towhere, 1, 0);
remove_march("_FLOOR_", floor_being_left);
}
- if (mode == GF_ZAP) { /* <;Z>ap mode */
+ else if (mode == GF_ZAP) { /* <;Z>ap mode */
dotgoto(ipc, towhere, 1, 0);
remove_march("_FLOOR_", floor_being_left);
forget_all_rooms_on(ipc, floor_being_left);
return;
}
for (mptr = march; mptr != NULL; mptr = mptr->next) {
- if ((mptr->march_floor) == tofloor)
+ if ((mptr->march_floor) == tofloor) {
gf_toroom(ipc, mptr->march_name, mode);
+ return;
+ }
+ }
+
+ /* Find first known room on the floor */
+
+ strcpy(targ, "");
+ mptr = NULL;
+ r = CtdlIPCKnownRooms(ipc, SubscribedRooms, 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);
return;
}
+ /* No known rooms on the floor; unzap the first one then */
+
strcpy(targ, "");
mptr = NULL;
r = CtdlIPCKnownRooms(ipc, AllAccessibleRooms, tofloor, &mptr, buf);
*/
void forget_this_floor(CtdlIPC *ipc)
{
-
if (curr_floor == 0) {
scr_printf("Can't forget this floor.\n");
return;
}
- if (floorlist[0][0] == 0)
+ if (floorlist[0][0] == 0) {
load_floorlist(ipc);
+ }
scr_printf("Are you sure you want to forget all rooms on %s? ",
&floorlist[(int) curr_floor][0]);
- if (yesno() == 0)
+ if (yesno() == 0) {
return;
+ }
gf_toroom(ipc, "_BASEROOM_", GF_ZAP);
}
/*
* set floor mode depending on client, server, and user settings
*/
-void set_floor_mode(void)
+void set_floor_mode(CtdlIPC* ipc)
{
- if (serv_info.serv_ok_floors == 0) {
+ if (ipc->ServInfo.ok_floors == 0) {
floor_mode = 0; /* Don't use floors if the server */
}
/* doesn't support them! */
{
char buf[SIZ];
- CtdlIPCServerInfo(ipc, &serv_info, buf);
+ CtdlIPCServerInfo(ipc, buf);
/* be nice and identify ourself to the server */
CtdlIPCIdentifySoftware(ipc, SERVER_TYPE, 0, REV_LEVEL,
(ipc->isLocal ? "local" : CITADEL),
- (supplied_hostname) ? supplied_hostname : "", buf);
- /* (locate_host(buf), buf)); */
+ (supplied_hostname) ? supplied_hostname :
+ /* Look up the , in the bible if you're confused */
+ (locate_host(ipc, buf), buf), buf);
/* Tell the server what our preferred content formats are */
if ((CtdlIPCSpecifyPreferredFormats(ipc, buf, "text/html|text/plain") / 100 )== 2) {
+/*
+ * Record compare function for SortOnlineUsers()
+ */
+int idlecmp(const void *rec1, const void *rec2) {
+ time_t i1, i2;
+
+ i1 = extract_long(rec1, 5);
+ i2 = extract_long(rec2, 5);
+
+ if (i1 < i2) return(1);
+ if (i1 > i2) return(-1);
+ return(0);
+}
+
+
+/*
+ * Sort the list of online users by idle time.
+ * This function frees the supplied buffer, and returns a new one
+ * to the caller. The caller is responsible for freeing the returned buffer.
+ */
+char *SortOnlineUsers(char *listing) {
+ int rows;
+ char *sortbuf;
+ char *retbuf;
+ char buf[SIZ];
+ int i;
+
+ rows = num_tokens(listing, '\n');
+ sortbuf = malloc(rows * SIZ);
+ if (sortbuf == NULL) return(listing);
+ retbuf = malloc(rows * SIZ);
+ if (retbuf == NULL) {
+ free(sortbuf);
+ return(listing);
+ }
+
+ /* Copy the list into a fixed-record-size array for sorting */
+ for (i=0; i<rows; ++i) {
+ memset(buf, 0, SIZ);
+ extract_token(buf, listing, i, '\n', sizeof buf);
+ memcpy(&sortbuf[i*SIZ], buf, (size_t)SIZ);
+ }
+
+ /* Do the sort */
+ qsort(sortbuf, rows, SIZ, idlecmp);
+
+ /* Copy back to a \n delimited list */
+ strcpy(retbuf, "");
+ for (i=0; i<rows; ++i) {
+ strcat(retbuf, &sortbuf[i*SIZ]);
+ if (i<(rows-1)) strcat(retbuf, "\n");
+ }
+ return(retbuf);
+}
+
/*
if (!longlist) {
color(BRIGHT_WHITE);
- pprintf("FLG ### User Name Room From host\n");
+ pprintf(" User Name Room Idle From host\n");
color(DIM_WHITE);
- pprintf("--- --- ------------------------- -------------------- ------------------------\n");
+ pprintf(" ------------------------- -------------------- ---- ------------------------\n");
}
r = CtdlIPCOnlineUsers(ipc, &listing, &timenow, buf);
+ listing = SortOnlineUsers(listing);
if (r / 100 == 1) {
while (strlen(listing) > 0) {
int isidle = 0;
/* Get another line */
- extract_token(buf, listing, 0, '\n');
+ extract_token(buf, listing, 0, '\n', sizeof buf);
remove_token(listing, 0, '\n');
- extract(username, buf, 1);
- extract(roomname, buf, 2);
- extract(fromhost, buf, 3);
- extract(clientsoft, buf, 4);
- extract(flags, buf, 7);
+ extract_token(username, buf, 1, '|', sizeof username);
+ extract_token(roomname, buf, 2, '|', sizeof roomname);
+ extract_token(fromhost, buf, 3, '|', sizeof fromhost);
+ extract_token(clientsoft, buf, 4, '|', sizeof clientsoft);
+ extract_token(flags, buf, 7, '|', sizeof flags);
idletime = timenow - extract_long(buf, 5);
idlehours = idletime / 3600;
idlesecs = (idletime - (idlehours * 3600) - (idlemins * 60));
if (idletime > rc_idle_threshold) {
+ /*
while (strlen(roomname) < 20) {
strcat(roomname, " ");
}
strcpy(&roomname[14], "[idle]");
+ */
if (skipidle)
isidle = 1;
}
if (longlist) {
- extract(actual_user, buf, 8);
- extract(actual_room, buf, 9);
- extract(actual_host, buf, 10);
+ extract_token(actual_user, buf, 8, '|', sizeof actual_user);
+ extract_token(actual_room, buf, 9, '|', sizeof actual_room);
+ extract_token(actual_host, buf, 10, '|', sizeof actual_host);
pprintf(" Flags: %s\n", flags);
pprintf("Session: %d\n", extract_int(buf, 0));
pprintf(" ");
} else {
color(BRIGHT_MAGENTA);
- pprintf("%-3s ", flags);
- color(DIM_WHITE);
- pprintf("%-3d ", extract_int(buf, 0));
+ pprintf("%-3s", flags);
}
last_session = extract_int(buf, 0);
color(BRIGHT_CYAN);
color(BRIGHT_MAGENTA);
roomname[20] = 0;
pprintf("%-20s ", roomname);
+ if (idletime > rc_idle_threshold) {
+ /* over 1000d, must be gone fishing */
+ if (idlehours > 23999) {
+ pprintf("fish");
+ /* over 10 days */
+ } else if (idlehours > 239) {
+ pprintf("%3ldd",
+ idlehours / 24);
+ /* over 10 hours */
+ } else if (idlehours > 9) {
+ pprintf("%1ldd%02ld",
+ idlehours / 24,
+ idlehours % 24);
+ /* less than 10 hours */
+ } else {
+ pprintf("%1ld:%02ld",
+ idlehours, idlemins);
+ }
+ }
+ else {
+ pprintf(" ");
+ }
+ pprintf(" ");
color(BRIGHT_CYAN);
fromhost[24] = '\0';
pprintf("%-24s\n", fromhost);
int stored_password = 0;
char password[SIZ];
struct ctdlipcmisc chek;
- struct usersupp *myself = NULL;
+ struct ctdluser *myself = NULL;
CtdlIPC* ipc; /* Our server connection */
int r; /* IPC result code */
logoff(NULL, 3);
}
- sttybbs(SB_SAVE); /* Store the old terminal parameters */
+ stty_ctdl(SB_SAVE); /* Store the old terminal parameters */
load_command_set(); /* parse the citadel.rc file */
- sttybbs(SB_NO_INTR); /* Install the new ones */
- signal(SIGHUP, dropcarr); /* Cleanup gracefully if carrier is dropped */
+ stty_ctdl(SB_NO_INTR); /* Install the new ones */
+ /* signal(SIGHUP, dropcarr);FIXME */ /* Cleanup gracefully if carrier is dropped */
+ signal(SIGPIPE, dropcarr); /* Cleanup gracefully if local conn. dropped */
signal(SIGTERM, dropcarr); /* Cleanup gracefully if terminated */
signal(SIGCONT, catch_sigcont); /* Catch SIGCONT so we can reset terminal */
#ifdef SIGWINCH
if (!strcmp(argv[a], "-p")) {
struct stat st;
- if (chdir(BBSDIR) < 0) {
- perror("can't change to " BBSDIR);
+ if (chdir(CTDLDIR) < 0) {
+ perror("can't change to " CTDLDIR);
logoff(NULL, 3);
}
* guaranteed to have the uid/gid we want.
*/
if (!getuid() || !getgid()) {
- if (stat(BBSDIR "/citadel.config", &st) < 0) {
+ if (stat(file_citadel_config, &st) < 0) {
perror("couldn't stat citadel.config");
logoff(NULL, 3);
}
screen_new();
+#ifdef __CYGWIN__
+ newprompt("Connect to (return for local server): ", hostbuf, 64);
+#endif
+
sln_printf("Attaching to server... \r");
sln_flush();
ipc = CtdlIPC_new(argc, argv, hostbuf, portbuf);
#endif
ipc_for_signal_handlers = ipc; /* KLUDGE cover your eyes */
- CtdlIPC_getline(ipc, aaa);
+ CtdlIPC_chat_recv(ipc, aaa);
if (aaa[0] != '2') {
scr_printf("%s\n", &aaa[4]);
logoff(ipc, atoi(aaa));
{
sptr2++;
*sptr2 = '\0';
- strncpy(nonce, sptr, NONCE_SIZE);
+ strncpy(nonce, sptr, (size_t)NONCE_SIZE);
}
}
#endif
get_serv_info(ipc, telnet_client_host);
- scr_printf("%-24s\n%s\n%s\n", serv_info.serv_software, serv_info.serv_humannode,
- serv_info.serv_bbs_city);
+ scr_printf("%-24s\n%s\n%s\n", ipc->ServInfo.software, ipc->ServInfo.humannode,
+ ipc->ServInfo.site_location);
scr_flush();
- status_line(serv_info.serv_humannode, serv_info.serv_bbs_city, NULL,
+ status_line(ipc->ServInfo.humannode, ipc->ServInfo.site_location, NULL,
secure, -1);
screenwidth = 80; /* default screen dimensions */
}
scr_printf("<< wrong password >>\n");
if (strlen(rc_password) > 0)
- logoff(ipc, 0);
+ logoff(ipc, 2);
goto GSTA;
NEWUSR: if (strlen(rc_password) == 0) {
- scr_printf("No record. Enter as new user? ");
+ scr_printf("'%s' not found.\n"
+ "Do you want to create a new account with this name? ",
+ fullname);
if (yesno() == 0)
goto GSTA;
}
* program. Don't mess with these once they've been set, because we
* will be unlinking them later on in the program and we don't
* want to delete something that we didn't create. */
- snprintf(temp, sizeof temp, tmpnam(NULL));
- snprintf(temp2, sizeof temp2, tmpnam(NULL));
- snprintf(tempdir, sizeof tempdir, tmpnam(NULL));
+ CtdlMakeTempFileName(temp, sizeof temp);
+ CtdlMakeTempFileName(temp2, sizeof temp2);
+ CtdlMakeTempFileName(tempdir, sizeof tempdir);
/* Get screen dimensions. First we go to a default of 80x24. Then
* we try to get the user's actual screen dimensions off the server.
check_screen_dims();
#endif
- set_floor_mode();
-
+ set_floor_mode(ipc);
/* Enter the lobby */
dotgoto(ipc, "_BASEROOM_", 1, 0);
uglistsize = 0;
if (newnow == 1)
- readmsgs(ipc, 3, 1, 5);
+ readmsgs(ipc, LastMessages, ReadForward, 5);
else
- readmsgs(ipc, 1, 1, 0);
+ readmsgs(ipc, NewMessages, ReadForward, 0);
/* MAIN COMMAND LOOP */
do {
formout(ipc, "help");
break;
case 4:
- entmsg(ipc, 0, 0);
+ entmsg(ipc, 0, ((userflags & US_EXTEDIT) ? 2 : 0));
break;
case 36:
entmsg(ipc, 0, 1);
entmsg(ipc, 0, 2);
break;
case 78:
- newprompt("What do you want your username to be? ", aaa, 32);
- snprintf(bbb, sizeof bbb, "ENT0 2|0|0|0|%s", aaa);
- CtdlIPC_putline(ipc, bbb);
- CtdlIPC_getline(ipc, aaa);
- if (strncmp("200", aaa, 3))
- scr_printf("\n%s\n", aaa);
- else
- entmsg(ipc, 0, 0);
- break;
- case 5:
+ {
+ /* Only m.author is used */
+ struct ctdlipcmessage m;
+ newprompt("What do you want your username to be? ",
+ m.author, USERNAME_SIZE - 1);
+ m.text = "";
+ r = CtdlIPCPostMessage(ipc, 2, &m, aaa);
+ if (r / 100 != 2)
+ scr_printf("%s\n", aaa);
+ else
+ entmsg(ipc, 0, 0);
+ }
+ break;
+ case 5: /* <G>oto */
updatels(ipc);
gotonext(ipc);
break;
- case 47:
- if (!rc_alt_semantics)
+ case 47: /* <A>bandon */
+ if (!rc_alt_semantics) {
updatelsa(ipc);
+ }
gotonext(ipc);
break;
- case 90:
+ case 90: /* <.A>bandon */
if (!rc_alt_semantics)
updatelsa(ipc);
dotgoto(ipc, argbuf, 0, 0);
break;
- case 58:
+ case 58: /* <M>ail */
updatelsa(ipc);
dotgoto(ipc, "_MAIL_", 1, 0);
break;
case 20:
- updatels(ipc);
- dotgoto(ipc, argbuf, 0, 0);
+ if (strlen(argbuf) > 0) {
+ updatels(ipc);
+ dotgoto(ipc, argbuf, 0, 0);
+ }
break;
case 52:
- if (rc_alt_semantics)
- updatelsa(ipc);
- dotgoto(ipc, argbuf, 0, 0);
+ if (strlen(argbuf) > 0) {
+ if (rc_alt_semantics) {
+ updatelsa(ipc);
+ }
+ dotgoto(ipc, argbuf, 0, 0);
+ }
break;
- case 95: /* what exactly is the numbering scheme supposed to be anyway? */
+ case 95: /* what exactly is the numbering scheme supposed to be anyway? --Ford, there isn't one. -IO */
dotungoto(ipc, argbuf);
break;
case 10:
- readmsgs(ipc, 0, 1, 0);
+ readmsgs(ipc, AllMessages, ReadForward, 0);
break;
case 9:
- readmsgs(ipc, 3, 1, 5);
+ readmsgs(ipc, LastMessages, ReadForward, 5);
break;
case 13:
- readmsgs(ipc, 1, 1, 0);
+ readmsgs(ipc, NewMessages, ReadForward, 0);
break;
case 11:
- readmsgs(ipc, 0, (-1), 0);
+ readmsgs(ipc, AllMessages, ReadReverse, 0);
break;
case 12:
- readmsgs(ipc, 2, (-1), 0);
+ readmsgs(ipc, OldMessages, ReadReverse, 0);
break;
case 71:
- readmsgs(ipc, 3, 1, atoi(argbuf));
+ readmsgs(ipc, LastMessages, ReadForward,
+ atoi(argbuf));
break;
case 7:
forget(ipc);
break;
case 29:
case 30:
- if (!rc_alt_semantics)
+ if (!rc_alt_semantics) {
updatels(ipc);
+ }
termn8 = 1;
break;
case 48:
enternew(ipc, "roomname", aaa, 20);
r = CtdlIPCChangeRoomname(ipc, aaa, bbb);
if (r / 100 != 2)
- scr_printf("\n%s\n", aaa);
+ scr_printf("\n%s\n", bbb);
break;
case 76:
enternew(ipc, "hostname", aaa, 25);
r = CtdlIPCChangeHostname(ipc, aaa, bbb);
if (r / 100 != 2)
- scr_printf("\n%s\n", aaa);
+ scr_printf("\n%s\n", bbb);
break;
case 77:
enternew(ipc, "username", aaa, 32);
r = CtdlIPCChangeUsername(ipc, aaa, bbb);
if (r / 100 != 2)
- scr_printf("\n%s\n", aaa);
+ scr_printf("\n%s\n", bbb);
break;
case 35:
break;
case 6:
- if (rc_alt_semantics)
+ if (rc_alt_semantics) {
updatelsa(ipc);
+ }
gotonext(ipc);
break;
case 2:
if (ipc->isLocal) {
screen_reset();
- sttybbs(SB_RESTORE);
+ stty_ctdl(SB_RESTORE);
snprintf(aaa, sizeof aaa, "USERNAME=\042%s\042; export USERNAME;"
"exec ./subsystem %ld %d %d", fullname,
usernum, screenwidth, axlevel);
ka_system(aaa);
- sttybbs(SB_NO_INTR);
+ stty_ctdl(SB_NO_INTR);
screen_set();
} else {
scr_printf("*** Can't run doors when server is not local.\n");
case 37:
enter_config(ipc, 0);
- set_floor_mode();
+ set_floor_mode(ipc);
break;
case 59:
enter_config(ipc, 3);
- set_floor_mode();
+ set_floor_mode(ipc);
break;
case 60:
break;
case 25:
- edituser(ipc);
+ edituser(ipc, 25);
+ break;
+
+ case 96:
+ edituser(ipc, 96);
break;
case 8:
page_user(ipc);
break;
+ default: /* allow some math on the command */
+ /* commands 100... to 100+MAX_EDITORS-1 will
+ call the appropriate editor... in other
+ words, command numbers 100+ will match
+ the citadel.rc keys editor0, editor1, etc.*/
+ if (mcmd >= 100 && mcmd < (100+MAX_EDITORS))
+ {
+ /* entmsg mode >=2 select editor */
+ entmsg(ipc, 0, mcmd - 100 + 2);
+ break;
+ }
} /* end switch */
} while (termn8 == 0);
TERMN8: scr_printf("%s logged out.", fullname);
+ termn8 = 0;
color(ORIGINAL_PAIR);
scr_printf("\n");
while (march != NULL) {
CtdlIPCLogout(ipc);
if ((mcmd == 29) || (mcmd == 15)) {
screen_delete();
- sttybbs(SB_RESTORE);
+ stty_ctdl(SB_RESTORE);
formout(ipc, "goodbye");
logoff(ipc, 0);
}