From: Dave West Date: Tue, 3 Nov 2009 12:15:17 +0000 (+0000) Subject: Increased the load average before strangling the server. Its now 10.00 X-Git-Tag: v7.86~666 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=2a557d1e1aeee5b4bb8d829a1cff40c37f8d4d2c Increased the load average before strangling the server. Its now 10.00 we will make this configureable later. Also some cleanups in the CitContext stuff to make it a bit more readable though I thought I had already committed those :-( --- diff --git a/citadel/citserver.c b/citadel/citserver.c index e8e310f0d..a0ef13419 100644 --- a/citadel/citserver.c +++ b/citadel/citserver.c @@ -640,8 +640,8 @@ void cmd_emsg(char *mname) * user also knows the rooms. */ void GenerateRoomDisplay(char *real_room, - struct CitContext *viewed, - struct CitContext *viewer) { + CitContext *viewed, + CitContext *viewer) { int ra; @@ -708,7 +708,7 @@ int CtdlAccessCheck(int required_level) { void cmd_term(char *cmdbuf) { int session_num; - struct CitContext *ccptr; + CitContext *ccptr; int found_it = 0; int allowed = 0; @@ -901,7 +901,7 @@ void cmd_asyn(char *argbuf) * RFC 1725 et al specify a PID to be placed in front of the nonce. * Quoth BTX: That would be stupid. */ -void generate_nonce(struct CitContext *con) { +void generate_nonce(CitContext *con) { struct timeval tv; memset(con->cs_nonce, NONCE_SIZE, 0); @@ -917,7 +917,7 @@ void generate_nonce(struct CitContext *con) { /* * Back-end function for starting a session */ -void begin_session(struct CitContext *con) +void begin_session(CitContext *con) { socklen_t len; struct sockaddr_in sin; diff --git a/citadel/citserver.h b/citadel/citserver.h index 1eb8cd804..0e2308313 100644 --- a/citadel/citserver.h +++ b/citadel/citserver.h @@ -18,6 +18,7 @@ */ #include "serv_extensions.h" +#include "context.h" /* Simple linked list structures ... used in a bunch of different places. */ struct RoomProcList { @@ -40,8 +41,8 @@ void do_async_loop(void); void begin_session(struct CitContext *con); void citproto_begin_session(void); void GenerateRoomDisplay(char *real_room, - struct CitContext *viewed, - struct CitContext *viewer); + CitContext *viewed, + CitContext *viewer); extern int panic_fd; char CtdlCheckExpress(void); diff --git a/citadel/context.c b/citadel/context.c index 4985de9e1..cc8885483 100644 --- a/citadel/context.c +++ b/citadel/context.c @@ -75,9 +75,8 @@ citthread_key_t MyConKey; /* TSD key for MyContext() */ -struct CitContext masterCC; -struct CitContext *ContextList = NULL; -// struct CitContext* next_session = NULL; +CitContext masterCC; +CitContext *ContextList = NULL; time_t last_purge = 0; /* Last dead session purge */ int num_sessions = 0; /* Current number of sessions */ @@ -135,11 +134,11 @@ int CtdlIsSingleUser(void) * * This function is used *VERY* frequently and must be kept small. */ -struct CitContext *MyContext(void) { +CitContext *MyContext(void) { - register struct CitContext *c; + register CitContext *c; - return ((c = (struct CitContext *) citthread_getspecific(MyConKey), + return ((c = (CitContext *) citthread_getspecific(MyConKey), c == NULL) ? &masterCC : c ); } @@ -150,7 +149,7 @@ struct CitContext *MyContext(void) { /* * Terminate a session. */ -void RemoveContext (struct CitContext *con) +void RemoveContext (CitContext *con) { if (con==NULL) { CtdlLogPrintf(CTDL_ERR, @@ -186,24 +185,22 @@ void RemoveContext (struct CitContext *con) - /* * Initialize a new context and place it in the list. The session number * used to be the PID (which is why it's called cs_pid), but that was when we * had one process per session. Now we just assign them sequentially, starting * at 1 (don't change it to 0 because masterCC uses 0). */ -struct CitContext *CreateNewContext(void) { - struct CitContext *me; +CitContext *CreateNewContext(void) { + CitContext *me; static int next_pid = 0; - me = (struct CitContext *) malloc(sizeof(struct CitContext)); + me = (CitContext *) malloc(sizeof(CitContext)); if (me == NULL) { CtdlLogPrintf(CTDL_ALERT, "citserver: can't allocate memory!!\n"); return NULL; } - - memset(me, 0, sizeof(struct CitContext)); + memset(me, 0, sizeof(CitContext)); /* Give the contaxt a name. Hopefully makes it easier to track */ strcpy (me->user.fullname, "SYS_notauth"); @@ -231,18 +228,18 @@ struct CitContext *CreateNewContext(void) { } -struct CitContext *CtdlGetContextArray(int *count) +CitContext *CtdlGetContextArray(int *count) { int nContexts, i; - struct CitContext *nptr, *cptr; + CitContext *nptr, *cptr; nContexts = num_sessions; - nptr = malloc(sizeof(struct CitContext) * nContexts); + nptr = malloc(sizeof(CitContext) * nContexts); if (!nptr) return NULL; begin_critical_section(S_SESSION_TABLE); for (cptr = ContextList, i=0; cptr != NULL && i < nContexts; cptr = cptr->next, i++) - memcpy(&nptr[i], cptr, sizeof (struct CitContext)); + memcpy(&nptr[i], cptr, sizeof (CitContext)); end_critical_section (S_SESSION_TABLE); *count = i; @@ -255,11 +252,11 @@ struct CitContext *CtdlGetContextArray(int *count) * This function fills in a context and its user field correctly * Then creates/loads that user */ -void CtdlFillSystemContext(struct CitContext *context, char *name) +void CtdlFillSystemContext(CitContext *context, char *name) { char sysname[USERNAME_SIZE]; - memset(context, 0, sizeof(struct CitContext)); + memset(context, 0, sizeof(CitContext)); context->internal_pgm = 1; context->cs_pid = 0; strcpy (sysname, "SYS_"); @@ -285,8 +282,8 @@ void CtdlFillSystemContext(struct CitContext *context, char *name) */ void context_cleanup(void) { - struct CitContext *ptr = NULL; - struct CitContext *rem = NULL; + CitContext *ptr = NULL; + CitContext *rem = NULL; /* * Clean up the contexts. @@ -321,7 +318,7 @@ void context_cleanup(void) * no longer does anything that is system-dependent.) */ void kill_session(int session_to_kill) { - struct CitContext *ptr; + CitContext *ptr; begin_critical_section(S_SESSION_TABLE); for (ptr = ContextList; ptr != NULL; ptr = ptr->next) { @@ -340,8 +337,8 @@ void kill_session(int session_to_kill) { * anyway, set "force" to nonzero. */ void dead_session_purge(int force) { - struct CitContext *ptr, *ptr2; /* general-purpose utility pointer */ - struct CitContext *rem = NULL; /* list of sessions to be destroyed */ + CitContext *ptr, *ptr2; /* general-purpose utility pointer */ + CitContext *rem = NULL; /* list of sessions to be destroyed */ if (force == 0) { if ( (time(NULL) - last_purge) < 5 ) { @@ -400,7 +397,7 @@ void dead_session_purge(int force) { * function initializes it. */ void InitializeMasterCC(void) { - memset(&masterCC, 0, sizeof(struct CitContext)); + memset(&masterCC, 0, sizeof( CitContext)); masterCC.internal_pgm = 1; masterCC.cs_pid = 0; } @@ -411,7 +408,7 @@ void InitializeMasterCC(void) { /* * Bind a thread to a context. (It's inline merely to speed things up.) */ -INLINE void become_session(struct CitContext *which_con) { +INLINE void become_session(CitContext *which_con) { citthread_setspecific(MyConKey, (void *)which_con ); } diff --git a/citadel/context.h b/citadel/context.h index b136f5334..17034271e 100644 --- a/citadel/context.h +++ b/citadel/context.h @@ -10,13 +10,136 @@ #include "threads.h" +/* + * Here's the big one... the Citadel context structure. + * + * This structure keeps track of all information relating to a running + * session on the server. We keep one of these for each session thread. + * + */ +struct CitContext { + struct CitContext *prev; /* Link to previous session in list */ + struct CitContext *next; /* Link to next session in the list */ + + int state; /* thread state (see CON_ values below) */ + int kill_me; /* Set to nonzero to flag for termination */ + int client_socket; + int cs_pid; /* session ID */ + int dont_term; /* for special activities like artv so we don't get killed */ + time_t lastcmd; /* time of last command executed */ + time_t lastidle; /* For computing idle time */ + + char curr_user[USERNAME_SIZE]; /* name of current user */ + int logged_in; /* logged in */ + int internal_pgm; /* authenticated as internal program */ + int nologin; /* not allowed to log in */ + int is_local_socket; /* set to 1 if client is on unix domain sock */ + int curr_view; /* The view type for the current user/room */ + int is_master; /* Is this session logged in using the master user? */ + + char net_node[32] ;/* Is the client another Citadel server? */ + time_t previous_login; /* Date/time of previous login */ + char lastcmdname[5]; /* name of last command executed */ + unsigned cs_flags; /* miscellaneous flags */ + void (*h_command_function) (void) ; /* service command function */ + void (*h_async_function) (void) ; /* do async msgs function */ + int is_async; /* Nonzero if client accepts async msgs */ + int async_waiting; /* Nonzero if there are async msgs waiting */ + int input_waiting; /* Nonzero if there is client input waiting */ + int can_receive_im; /* Session is capable of receiving instant messages */ + + /* Client information */ + int cs_clientdev; /* client developer ID */ + int cs_clienttyp; /* client type code */ + int cs_clientver; /* client version number */ + uid_t cs_UDSclientUID; /* the uid of the client when talking via UDS */ + char cs_clientname[32]; /* name of client software */ + char cs_host[64]; /* host logged in from */ + char cs_addr[64]; /* address logged in from */ + + /* The Internet type of thing */ + char cs_inet_email[128]; /* Return address of outbound Internet mail */ + char cs_inet_other_emails[1024]; /* User's other valid Internet email addresses */ + char cs_inet_fn[128]; /* Friendly-name of outbound Internet mail */ + + FILE *download_fp; /* Fields relating to file transfer */ + char download_desired_section[128]; + FILE *upload_fp; + char upl_file[256]; + char upl_path[PATH_MAX]; + char upl_comment[256]; + char upl_filedir[PATH_MAX]; + char upl_mimetype[64]; + char dl_is_net; + char upload_type; + + struct ctdluser user; /* Database record buffers */ + struct ctdlroom room; + + /* Beginning of cryptography - session nonce */ + char cs_nonce[NONCE_SIZE]; /* The nonce for this session's next auth transaction */ + + /* Redirect this session's output to a memory buffer? */ + char *redirect_buffer; /* the buffer */ + size_t redirect_len; /* length of data in buffer */ + size_t redirect_alloc; /* length of allocated buffer */ +#ifdef HAVE_OPENSSL + SSL *ssl; + int redirect_ssl; +#endif + + /* A linked list of all instant messages sent to us. */ + struct ExpressMessage *FirstExpressMessage; + int disable_exp; /* Set to 1 to disable incoming pages */ + int newmail; /* Other sessions increment this */ + + /* Masqueraded values in the 'who is online' list */ + char fake_username[USERNAME_SIZE]; + char fake_hostname[64]; + char fake_roomname[ROOMNAMELEN]; + + /* Preferred MIME formats */ + char preferred_formats[256]; + int msg4_dont_decode; + + /* Dynamically allocated session data */ + char *session_specific_data; /* Used by individual protocol modules */ + struct cit_ical *CIT_ICAL; /* calendaring data */ + struct ma_info *ma; /* multipart/alternative data */ + const char *ServiceName; /* readable purpose of this session */ + void *openid_data; /* Data stored by the OpenID module */ + char *ldap_dn; /* DN of user when using AUTHMODE_LDAP */ +}; + +typedef struct CitContext CitContext; + +/* + * Values for CitContext.state + * + * A session that is doing nothing is in CON_IDLE state. When activity + * is detected on the socket, it goes to CON_READY, indicating that it + * needs to have a worker thread bound to it. When a thread binds to + * the session, it goes to CON_EXECUTING and does its thing. When the + * transaction is finished, the thread sets it back to CON_IDLE and lets + * it go. + */ +enum { + CON_IDLE, /* This context is doing nothing */ + CON_READY, /* This context needs attention */ + CON_EXECUTING /* This context is bound to a thread */ +}; + +#define CC MyContext() + + extern citthread_key_t MyConKey; /* TSD key for MyContext() */ extern int num_sessions; -extern struct CitContext masterCC; +extern CitContext masterCC; +extern CitContext *ContextList; -struct CitContext *MyContext (void); +CitContext *MyContext (void); void RemoveContext (struct CitContext *); -struct CitContext *CreateNewContext (void); +CitContext *CreateNewContext (void); void context_cleanup(void); void kill_session (int session_to_kill); INLINE void become_session(struct CitContext *which_con); diff --git a/citadel/file_ops.c b/citadel/file_ops.c index 21b7dfe83..b81ba6bed 100644 --- a/citadel/file_ops.c +++ b/citadel/file_ops.c @@ -549,7 +549,7 @@ void cmd_clos(char *cmdbuf) /* * abort an upload */ -void abort_upl(struct CitContext *who) +void abort_upl(CitContext *who) { if (who->upload_fp != NULL) { fclose(who->upload_fp); diff --git a/citadel/file_ops.h b/citadel/file_ops.h index 6f95c1374..1126a7695 100644 --- a/citadel/file_ops.h +++ b/citadel/file_ops.h @@ -1,6 +1,11 @@ /* $Id$ */ +#ifndef FILE_OPS_H +#define FILE_OPS_H + +#include "context.h" + void OpenCmdResult (char *, const char *); -void abort_upl (struct CitContext *who); +void abort_upl (CitContext *who); int network_talking_to(char *nodename, int operation); @@ -12,3 +17,5 @@ enum { NTT_REMOVE, NTT_CHECK }; + +#endif /* FILE_OPS_H */ \ No newline at end of file diff --git a/citadel/housekeeping.c b/citadel/housekeeping.c index 742291c5a..78e0da5f2 100644 --- a/citadel/housekeeping.c +++ b/citadel/housekeeping.c @@ -53,7 +53,7 @@ * beginning because the pointer to our place in the list becomes invalid. */ void terminate_idle_sessions(void) { - struct CitContext *ccptr; + CitContext *ccptr; time_t now; int session_to_kill; int killed = 0; diff --git a/citadel/locate_host.c b/citadel/locate_host.c index 2bf9f2de4..7f8e068d4 100644 --- a/citadel/locate_host.c +++ b/citadel/locate_host.c @@ -26,6 +26,7 @@ #include "sysdep_decls.h" #include "config.h" #include "domain.h" +#include "context.h" #include "ctdl_module.h" #ifdef HAVE_RESOLV_H diff --git a/citadel/msgbase.c b/citadel/msgbase.c index 11a3c30c2..2c0daada2 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -2742,7 +2742,7 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ struct addresses_to_be_filed *aptr = NULL; char *saved_rfc822_version = NULL; int qualified_for_journaling = 0; - struct CitContext *CCC = CC; /* CachedCitContext - performance boost */ + CitContext *CCC = CC; /* CachedCitContext - performance boost */ char bounce_to[1024] = ""; size_t tmp = 0; int rv = 0; diff --git a/citadel/server.h b/citadel/server.h index ce874e472..d8161faea 100644 --- a/citadel/server.h +++ b/citadel/server.h @@ -49,132 +49,10 @@ struct CtdlMessage { -/* - * Here's the big one... the Citadel context structure. - * - * This structure keeps track of all information relating to a running - * session on the server. We keep one of these for each session thread. - * - */ -struct CitContext { - struct CitContext *prev; /* Link to previous session in list */ - struct CitContext *next; /* Link to next session in the list */ - - int state; /* thread state (see CON_ values below) */ - int kill_me; /* Set to nonzero to flag for termination */ - int client_socket; - int cs_pid; /* session ID */ - int dont_term; /* for special activities like artv so we don't get killed */ - time_t lastcmd; /* time of last command executed */ - time_t lastidle; /* For computing idle time */ - - char curr_user[USERNAME_SIZE]; /* name of current user */ - int logged_in; /* logged in */ - int internal_pgm; /* authenticated as internal program */ - int nologin; /* not allowed to log in */ - int is_local_socket; /* set to 1 if client is on unix domain sock */ - int curr_view; /* The view type for the current user/room */ - int is_master; /* Is this session logged in using the master user? */ - - char net_node[32] ;/* Is the client another Citadel server? */ - time_t previous_login; /* Date/time of previous login */ - char lastcmdname[5]; /* name of last command executed */ - unsigned cs_flags; /* miscellaneous flags */ - void (*h_command_function) (void) ; /* service command function */ - void (*h_async_function) (void) ; /* do async msgs function */ - int is_async; /* Nonzero if client accepts async msgs */ - int async_waiting; /* Nonzero if there are async msgs waiting */ - int input_waiting; /* Nonzero if there is client input waiting */ - int can_receive_im; /* Session is capable of receiving instant messages */ - - /* Client information */ - int cs_clientdev; /* client developer ID */ - int cs_clienttyp; /* client type code */ - int cs_clientver; /* client version number */ - uid_t cs_UDSclientUID; /* the uid of the client when talking via UDS */ - char cs_clientname[32]; /* name of client software */ - char cs_host[64]; /* host logged in from */ - char cs_addr[64]; /* address logged in from */ - - /* The Internet type of thing */ - char cs_inet_email[128]; /* Return address of outbound Internet mail */ - char cs_inet_other_emails[1024]; /* User's other valid Internet email addresses */ - char cs_inet_fn[128]; /* Friendly-name of outbound Internet mail */ - - FILE *download_fp; /* Fields relating to file transfer */ - char download_desired_section[128]; - FILE *upload_fp; - char upl_file[256]; - char upl_path[PATH_MAX]; - char upl_comment[256]; - char upl_filedir[PATH_MAX]; - char upl_mimetype[64]; - char dl_is_net; - char upload_type; - - struct ctdluser user; /* Database record buffers */ - struct ctdlroom room; - - /* Beginning of cryptography - session nonce */ - char cs_nonce[NONCE_SIZE]; /* The nonce for this session's next auth transaction */ - - /* Redirect this session's output to a memory buffer? */ - char *redirect_buffer; /* the buffer */ - size_t redirect_len; /* length of data in buffer */ - size_t redirect_alloc; /* length of allocated buffer */ -#ifdef HAVE_OPENSSL - SSL *ssl; - int redirect_ssl; -#endif - - /* A linked list of all instant messages sent to us. */ - struct ExpressMessage *FirstExpressMessage; - int disable_exp; /* Set to 1 to disable incoming pages */ - int newmail; /* Other sessions increment this */ - - /* Masqueraded values in the 'who is online' list */ - char fake_username[USERNAME_SIZE]; - char fake_hostname[64]; - char fake_roomname[ROOMNAMELEN]; - - /* Preferred MIME formats */ - char preferred_formats[256]; - int msg4_dont_decode; - - /* Dynamically allocated session data */ - char *session_specific_data; /* Used by individual protocol modules */ - struct cit_ical *CIT_ICAL; /* calendaring data */ - struct ma_info *ma; /* multipart/alternative data */ - const char *ServiceName; /* readable purpose of this session */ - void *openid_data; /* Data stored by the OpenID module */ - char *ldap_dn; /* DN of user when using AUTHMODE_LDAP */ -}; - -typedef struct CitContext t_context; - -/* - * Values for CitContext.state - * - * A session that is doing nothing is in CON_IDLE state. When activity - * is detected on the socket, it goes to CON_READY, indicating that it - * needs to have a worker thread bound to it. When a thread binds to - * the session, it goes to CON_EXECUTING and does its thing. When the - * transaction is finished, the thread sets it back to CON_IDLE and lets - * it go. - */ -enum { - CON_IDLE, /* This context is doing nothing */ - CON_READY, /* This context needs attention */ - CON_EXECUTING /* This context is bound to a thread */ -}; - - #define CS_STEALTH 1 /* stealth mode */ #define CS_CHAT 2 /* chat mode */ #define CS_POSTING 4 /* Posting */ -struct CitContext *MyContext(void); -#define CC MyContext() /* * This is the control record for the message base... @@ -190,7 +68,6 @@ struct CitControl { int MMdbversion; /* Version of Berkeley DB used on previous server run */ }; -extern struct CitContext *ContextList; extern int ScheduledShutdown; extern struct CitControl CitControl; diff --git a/citadel/sysdep.c b/citadel/sysdep.c index 3ddc662aa..14ddb62e6 100644 --- a/citadel/sysdep.c +++ b/citadel/sysdep.c @@ -120,7 +120,7 @@ void vCtdlLogPrintf(enum LogLevel loglevel, const char *format, va_list arg_ptr) struct timeval tv; struct tm tim; time_t unixtime; - struct CitContext *CCC = CC; + CitContext *CCC = CC; gettimeofday(&tv, NULL); /* Promote to time_t; types differ on some OSes (like darwin) */ @@ -450,7 +450,7 @@ int client_write(char *buf, int nbytes) int old_buffer_len = 0; #endif fd_set wset; - t_context *Ctx; + CitContext *Ctx; int fdflags; Ctx = CC; @@ -868,11 +868,11 @@ int convert_login(char NameToConvert[]) { void *worker_thread(void *arg) { int i; int highest; - struct CitContext *ptr; - struct CitContext *bind_me = NULL; + CitContext *ptr; + CitContext *bind_me = NULL; fd_set readfds; int retval = 0; - struct CitContext *con= NULL; /* Temporary context pointer */ + CitContext *con= NULL; /* Temporary context pointer */ struct ServiceFunctionHook *serviceptr; int ssock; /* Descriptor for client socket */ struct timeval tv; diff --git a/citadel/threads.c b/citadel/threads.c index 5f4de7bbd..c13a2aed5 100644 --- a/citadel/threads.c +++ b/citadel/threads.c @@ -1267,7 +1267,7 @@ void go_threading(void) CtdlThreadNode *last_worker; struct timeval start, now, result; double last_duration; - + /* * Initialise the thread system */ @@ -1359,7 +1359,9 @@ void go_threading(void) #endif /* NEW_WORKER */ { /* Only start new threads if we are not going to overload the machine */ - if (CtdlThreadGetLoadAvg() < ((double)1.00)) { + /* Temporarily set to 10 should be enough to make sure we don't stranglew the server + * at least until we make this a config option */ + if (CtdlThreadGetLoadAvg() < ((double)10.00)) { for (i=0; i<5 ; i++) { #ifdef NEW_WORKER CtdlThreadCreate("Worker Thread (new)", @@ -1433,7 +1435,7 @@ void select_on_master(void) int m, i; int retval = 0; struct timeval tv; - struct CitContext *con; + CitContext *con; const char *old_name; @@ -1519,7 +1521,7 @@ void select_on_master(void) * If the select succeeds the thread goes off to handle the client request. * If the list of client connections is empty the threads all sleep for one second */ -struct CitContext *select_on_client(void) +CitContext *select_on_client(void) { fd_set readfds; struct timeval tv; @@ -1586,7 +1588,7 @@ struct CitContext *select_on_client(void) /* * Do the worker threads work when needed */ -int execute_session(struct CitContext *bind_me) +int execute_session(CitContext *bind_me) { int force_purge; @@ -1623,7 +1625,7 @@ int execute_session(struct CitContext *bind_me) void *new_worker_thread(void *arg) { - struct CitContext *bind_me; + CitContext *bind_me; int force_purge; while (!CtdlThreadCheckStop()) { diff --git a/citadel/user_ops.c b/citadel/user_ops.c index efa5d241a..7c9ed32b3 100644 --- a/citadel/user_ops.c +++ b/citadel/user_ops.c @@ -51,6 +51,7 @@ #include "genstamp.h" #include "threads.h" #include "citadel_ldap.h" +#include "context.h" #include "ctdl_module.h" @@ -196,7 +197,7 @@ void lputuser(struct ctdluser *usbuf) * */ int rename_user(char *oldname, char *newname) { - struct CitContext *cptr; + CitContext *cptr; int retcode = RENAMEUSER_OK; struct ctdluser usbuf; @@ -204,6 +205,11 @@ int rename_user(char *oldname, char *newname) { char newnamekey[USERNAME_SIZE]; /* We cannot rename a user who is currently logged in */ +/* FIXME: This is very broken!!!! + * We check that the user is not already logged in because we can't rename them + * if they are logged in. + * BUT THEN WE LEAVE A HUGE WINDOW FOR THEM TO LOG IN BEFORE WE LOCK TO RENAME THEM!!!!! + */ for (cptr = ContextList; cptr != NULL; cptr = cptr->next) { if (!strcasecmp(cptr->user.fullname, oldname)) { return(RENAMEUSER_LOGGED_IN); @@ -775,7 +781,7 @@ void logged_in_response(void) */ void logout(void) { - struct CitContext *CCC = CC; /* CachedCitContext - performance boost */ + CitContext *CCC = CC; /* CachedCitContext - performance boost */ /* * If there is a download in progress, abort it. */ @@ -1022,7 +1028,7 @@ int purge_user(char pname[]) char filename[64]; struct ctdluser usbuf; char usernamekey[USERNAME_SIZE]; - struct CitContext *ccptr; + CitContext *ccptr; int user_is_logged_in = 0; makeuserkey(usernamekey, pname); @@ -1934,7 +1940,7 @@ void cmd_asup(char *cmdbuf) * receive a new mail notification without having to hit the database. */ void BumpNewMailCounter(long which_user) { - struct CitContext *ptr; + CitContext *ptr; begin_critical_section(S_SESSION_TABLE);