#include "snprintf.h"
#endif
#include "screen.h"
+#include "citadel_dirs.h"
#include "md5.h"
/*
* 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;
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);
}
{
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);
system(rc_gotmail_cmd);
}
}
- status_line(ipc->ServInfo.humannode, ipc->ServInfo.bbs_city,
+ status_line(ipc->ServInfo.humannode, ipc->ServInfo.site_location,
room_name, secure, newmailcount);
}
void forget_all_rooms_on(CtdlIPC *ipc, int ffloor)
{
char buf[SIZ];
- struct march *flist, *fptr;
- struct ctdlipcroom *room; /* 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, "", &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;
+ return;
+ }
}
/* Find first known room on the floor */
*/
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);
}
/* 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');
- memcpy(&sortbuf[i*SIZ], buf, SIZ);
+ extract_token(buf, listing, i, '\n', sizeof buf);
+ memcpy(&sortbuf[i*SIZ], buf, (size_t)SIZ);
}
/* Do the sort */
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;
}
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));
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 */
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);
}
{
sptr2++;
*sptr2 = '\0';
- strncpy(nonce, sptr, NONCE_SIZE);
+ strncpy(nonce, sptr, (size_t)NONCE_SIZE);
}
}
get_serv_info(ipc, telnet_client_host);
scr_printf("%-24s\n%s\n%s\n", ipc->ServInfo.software, ipc->ServInfo.humannode,
- ipc->ServInfo.bbs_city);
+ ipc->ServInfo.site_location);
scr_flush();
- status_line(ipc->ServInfo.humannode, ipc->ServInfo.bbs_city, NULL,
+ status_line(ipc->ServInfo.humannode, ipc->ServInfo.site_location, NULL,
secure, -1);
screenwidth = 80; /* default screen dimensions */
* 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.
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);
{
/* Only m.author is used */
struct ctdlipcmessage m;
- newprompt("What do you want your username to be? ", m.author, USERNAME_SIZE - 1);
+ 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);
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:
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");
break;
case 25:
- edituser(ipc);
+ edituser(ipc, 25);
+ break;
+
+ case 96:
+ edituser(ipc, 96);
break;
case 8:
CtdlIPCLogout(ipc);
if ((mcmd == 29) || (mcmd == 15)) {
screen_delete();
- sttybbs(SB_RESTORE);
+ stty_ctdl(SB_RESTORE);
formout(ipc, "goodbye");
logoff(ipc, 0);
}