*
*/
+#ifdef DLL_EXPORT
+#define IN_LIBCIT
+#endif
+
#include "sysdep.h"
#include <errno.h>
#include <stdlib.h>
#include "server.h"
#include "database.h"
#include "user_ops.h"
+#include "dynloader.h"
#include "sysdep_decls.h"
#include "support.h"
#include "room_ops.h"
#include "control.h"
#include "msgbase.h"
#include "config.h"
-#include "dynloader.h"
#include "tools.h"
#include "citserver.h"
{
struct cdbdata *cdbus;
- cdb_begin_transaction();
cdb_rewind(CDB_USERSUPP);
while (cdbus = cdb_next_item(CDB_USERSUPP), cdbus != NULL) {
sizeof(struct usersupp) : cdbus->len));
cdb_free(cdbus);
if (usbuf->usernum == number) {
- cdb_end_transaction();
+ cdb_close_cursor(CDB_USERSUPP);
return (0);
}
}
- cdb_end_transaction();
return (-1);
}
}
lputuser(&CC->usersupp);
- /* Run any cleanup routines registered by loadable modules */
+ /* Run any startup routines registered by loadable modules */
PerformSessionHooks(EVT_LOGIN);
- usergoto(BASEROOM, 0, NULL, NULL); /* Enter the lobby */
+ /* Create any personal rooms required by the system */
+ create_room(SENTITEMS, 4, "", 0, 1);
+
+ /* Enter the lobby */
+ usergoto(BASEROOM, 0, NULL, NULL);
+
+ /* Record this login in the Citadel log */
rec_log(CL_LOGIN, CC->curr_user);
}
void logged_in_response(void)
{
- cprintf("%d %s|%d|%d|%d|%u|%ld\n",
+ cprintf("%d %s|%d|%ld|%ld|%u|%ld\n",
OK, CC->usersupp.fullname, CC->usersupp.axlevel,
CC->usersupp.timescalled, CC->usersupp.posted,
CC->usersupp.flags,
void logout(struct CitContext *who)
{
who->logged_in = 0;
+
+ /*
+ * If there is a download in progress, abort it.
+ */
if (who->download_fp != NULL) {
fclose(who->download_fp);
who->download_fp = NULL;
}
+
+ /*
+ * If there is an upload in progress, abort it.
+ */
if (who->upload_fp != NULL) {
abort_upl(who);
}
+
+ /*
+ * If we were talking to a network node, we're not anymore...
+ */
+ if (strlen(who->net_node) > 0) {
+ network_talking_to(who->net_node, NTT_REMOVE);
+ }
+
/* Do modular stuff... */
PerformSessionHooks(EVT_LOGOUT);
}
if ((!strcasecmp(username, "bbs")) ||
(!strcasecmp(username, "new")) ||
(!strcasecmp(username, "."))) {
- cprintf("%d '%s' is an invalid login name.\n", ERROR);
+ cprintf("%d '%s' is an invalid login name.\n", ERROR, username);
return;
}
if (a == ERROR + ALREADY_EXISTS) {
/* There are unvalidated users. Traverse the usersupp database,
* and return the first user we find that needs validation.
*/
- cdb_begin_transaction();
cdb_rewind(CDB_USERSUPP);
while (cdbus = cdb_next_item(CDB_USERSUPP), cdbus != NULL) {
memset(&usbuf, 0, sizeof(struct usersupp));
if ((usbuf.flags & US_NEEDVALID)
&& (usbuf.axlevel > 0)) {
cprintf("%d %s\n", MORE_DATA, usbuf.fullname);
- cdb_end_transaction();
+ cdb_close_cursor(CDB_USERSUPP);
return;
}
}
- cdb_end_transaction();
/* If we get to this point, there are no more unvalidated users.
* Therefore we clear the "users need validation" flag.
struct usersupp usbuf;
struct cdbdata *cdbus;
- cdb_begin_transaction();
cdb_rewind(CDB_USERSUPP);
while (cdbus = cdb_next_item(CDB_USERSUPP), cdbus != NULL) {
cdb_free(cdbus);
(*CallBack) (&usbuf, in_data);
}
- cdb_end_transaction();
}
if ((CC->usersupp.axlevel >= 6)
|| ((usbuf->flags & US_UNLISTED) == 0)
|| ((CC->internal_pgm))) {
- cprintf("%s|%d|%ld|%ld|%d|%d|",
+ cprintf("%s|%d|%ld|%ld|%ld|%ld|",
usbuf->fullname,
usbuf->axlevel,
usbuf->usernum,
- usbuf->lastcall,
+ (long)usbuf->lastcall,
usbuf->timescalled,
usbuf->posted);
if (CC->usersupp.axlevel >= 6)
cprintf("%d No such user.\n", ERROR + NO_SUCH_USER);
return;
}
- cprintf("%d %s|%s|%u|%d|%d|%d|%ld|%ld|%d\n",
+ cprintf("%d %s|%s|%u|%ld|%ld|%d|%ld|%ld|%d\n",
OK,
usbuf.fullname,
usbuf.password,
usbuf.posted,
(int) usbuf.axlevel,
usbuf.usernum,
- usbuf.lastcall,
+ (long)usbuf.lastcall,
usbuf.USuserpurge);
}