$Log$
+Revision 1.443 2000/01/15 18:29:15 ajc
+* Added a generic (void *) parameter to the ForEachUser() and ForEachRoom()
+ callback mechanisms, to allow callers and callbacks to pass arbitrary data
+ between each other without requiring TSD variables.
+* room_ops.c: eliminated the need for 'FloorBeingSearched' TSD variable
+* internet_addressing.c: eliminated 'buffer1' and 'buffer2' TSD variables
+
Revision 1.442 2000/01/15 04:31:44 ajc
* Removed UI_DIALOG mode in setup. Can't count on 'dialog' to be consistent.
Fri Jul 10 1998 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
* Initial CVS import
+
/* $Id$ */
void DLoader_Init(char *pathname);
int DLoader_Exec_Cmd(char *cmdbuf);
+char *Dynamic_Module_Init(void);
+
void CtdlRegisterLogHook(void (*fcn_ptr)(char *), int loglevel);
-void CtdlRegisterCleanupHook(void (*fcn_ptr)(void));
-void CtdlRegisterSessionHook(void (*fcn_ptr)(void), int EventType);
void PerformLogHooks(int loglevel, char *logmsg);
+
+
+void CtdlRegisterSessionHook(void (*fcn_ptr)(void), int EventType);
void PerformSessionHooks(int EventType);
-void PerformUserHooks(char *username, long usernum, int EventType);
-int PerformXmsgHooks(char *, char *, char *);
-void CtdlRegisterProtoHook(void (*handler)(char *), char *cmd, char *desc);
+
void CtdlRegisterUserHook(void (*fcn_ptr)(char*, long), int EventType);
+void PerformUserHooks(char *username, long usernum, int EventType);
+
void CtdlRegisterXmsgHook(int (*fcn_ptr)(char *, char *, char *), int order);
+int PerformXmsgHooks(char *, char *, char *);
+
void CtdlRegisterMessageHook(int (*handler)(struct CtdlMessage *), int EventType);
+int PerformMessageHooks(struct CtdlMessage *, int EventType);
+
+void CtdlRegisterCleanupHook(void (*fcn_ptr)(void));
+void CtdlRegisterProtoHook(void (*handler)(char *), char *cmd, char *desc);
void CtdlRegisterServiceHook(int tcp_port,
void (*h_greeting_function) (void),
void (*h_command_function) (void) ) ;
-int PerformMessageHooks(struct CtdlMessage *, int EventType);
-char *Dynamic_Module_Init(void);
+
* NOTE: this function pair should ONLY be called during startup. It is NOT
* thread safe.
*/
-void check_ref_counts_backend(struct quickroom *qrbuf) {
+void check_ref_counts_backend(struct quickroom *qrbuf, void *data) {
struct floor flbuf;
getfloor(&flbuf, qrbuf->QRfloor);
putfloor(&flbuf, a);
}
- ForEachRoom(check_ref_counts_backend);
+ ForEachRoom(check_ref_counts_backend, NULL);
}
#include "parsedate.h"
+struct trynamebuf {
+ char buffer1[256];
+ char buffer2[256];
+};
+
/*
* Return 0 if a given string fuzzy-matches a Citadel user account
* Back end for convert_internet_address()
* (Compares an internet name [buffer1] and stores in [buffer2] if found)
*/
-void try_name(struct usersupp *us) {
+void try_name(struct usersupp *us, void *data) {
+ struct trynamebuf *tnb;
+ tnb = (struct trynamebuf *)data;
- if (!strncasecmp(CC->buffer1, "cit", 3))
- if (atol(&CC->buffer1[3]) == us->usernum)
- strcpy(CC->buffer2, us->fullname);
+ if (!strncasecmp(tnb->buffer1, "cit", 3))
+ if (atol(&tnb->buffer1[3]) == us->usernum)
+ strcpy(tnb->buffer2, us->fullname);
- if (!collapsed_strcmp(CC->buffer1, us->fullname))
- strcpy(CC->buffer2, us->fullname);
+ if (!collapsed_strcmp(tnb->buffer1, us->fullname))
+ strcpy(tnb->buffer2, us->fullname);
if (us->uid != BBSUID)
- if (!strcasecmp(CC->buffer1, getpwuid(us->uid)->pw_name))
- strcpy(CC->buffer2, us->fullname);
+ if (!strcasecmp(tnb->buffer1, getpwuid(us->uid)->pw_name))
+ strcpy(tnb->buffer2, us->fullname);
}
char name[256];
struct quickroom qrbuf;
int i;
+ struct trynamebuf tnb;
/* Split it up */
process_rfc822_addr(source, user, node, name);
/* Try all local users */
strcpy(destuser, user);
strcpy(desthost, config.c_nodename);
- strcpy(CC->buffer1, user);
- strcpy(CC->buffer2, "");
- ForEachUser(try_name);
- if (strlen(CC->buffer2) == 0) return(rfc822_no_such_user);
- strcpy(destuser, CC->buffer2);
+ strcpy(tnb.buffer1, user);
+ strcpy(tnb.buffer2, "");
+ ForEachUser(try_name, &tnb);
+ if (strlen(tnb.buffer2) == 0) return(rfc822_no_such_user);
+ strcpy(destuser, tnb.buffer2);
return(rfc822_address_locally_validated);
}
/*
* Traverse the room file...
*/
-void ForEachRoom(void (*CallBack) (struct quickroom * EachRoom))
+void ForEachRoom(void (*CallBack) (struct quickroom *EachRoom, void *out_data),
+ void *in_data)
{
struct quickroom qrbuf;
struct cdbdata *cdbqr;
cdb_free(cdbqr);
room_sanity_check(&qrbuf);
if (qrbuf.QRflags & QR_INUSE)
- (*CallBack) (&qrbuf);
+ (*CallBack)(&qrbuf, in_data);
}
}
/*
* cmd_lrms() - List all accessible rooms, known or forgotten
*/
-void cmd_lrms_backend(struct quickroom *qrbuf)
+void cmd_lrms_backend(struct quickroom *qrbuf, void *data)
{
+ int FloorBeingSearched = (-1);
+ FloorBeingSearched = *(int *)data;
+
if (((CtdlRoomAccess(qrbuf, &CC->usersupp)
& (UA_KNOWN | UA_ZAPPED)))
- && ((qrbuf->QRfloor == (CC->FloorBeingSearched))
- || ((CC->FloorBeingSearched) < 0)))
+ && ((qrbuf->QRfloor == (FloorBeingSearched))
+ || ((FloorBeingSearched) < 0)))
list_roomname(qrbuf);
}
void cmd_lrms(char *argbuf)
{
- CC->FloorBeingSearched = (-1);
+ int FloorBeingSearched = (-1);
if (strlen(argbuf) > 0)
- CC->FloorBeingSearched = extract_int(argbuf, 0);
+ FloorBeingSearched = extract_int(argbuf, 0);
if (!(CC->logged_in)) {
cprintf("%d Not logged in.\n", ERROR + NOT_LOGGED_IN);
}
cprintf("%d Accessible rooms:\n", LISTING_FOLLOWS);
- ForEachRoom(cmd_lrms_backend);
+ ForEachRoom(cmd_lrms_backend, &FloorBeingSearched);
cprintf("000\n");
}
/*
* cmd_lkra() - List all known rooms
*/
-void cmd_lkra_backend(struct quickroom *qrbuf)
+void cmd_lkra_backend(struct quickroom *qrbuf, void *data)
{
+ int FloorBeingSearched = (-1);
+ FloorBeingSearched = *(int *)data;
+
if (((CtdlRoomAccess(qrbuf, &CC->usersupp)
& (UA_KNOWN)))
- && ((qrbuf->QRfloor == (CC->FloorBeingSearched))
- || ((CC->FloorBeingSearched) < 0)))
+ && ((qrbuf->QRfloor == (FloorBeingSearched))
+ || ((FloorBeingSearched) < 0)))
list_roomname(qrbuf);
}
void cmd_lkra(char *argbuf)
{
- CC->FloorBeingSearched = (-1);
+ int FloorBeingSearched = (-1);
if (strlen(argbuf) > 0)
- CC->FloorBeingSearched = extract_int(argbuf, 0);
+ FloorBeingSearched = extract_int(argbuf, 0);
if (!(CC->logged_in)) {
cprintf("%d Not logged in.\n", ERROR + NOT_LOGGED_IN);
}
cprintf("%d Known rooms:\n", LISTING_FOLLOWS);
- ForEachRoom(cmd_lkra_backend);
+ ForEachRoom(cmd_lkra_backend, &FloorBeingSearched);
cprintf("000\n");
}
/*
* cmd_lkrn() - List all known rooms with new messages
*/
-void cmd_lkrn_backend(struct quickroom *qrbuf)
+void cmd_lkrn_backend(struct quickroom *qrbuf, void *data)
{
int ra;
+ int FloorBeingSearched = (-1);
+ FloorBeingSearched = *(int *)data;
ra = CtdlRoomAccess(qrbuf, &CC->usersupp);
if ((ra & UA_KNOWN)
&& (ra & UA_HASNEWMSGS)
- && ((qrbuf->QRfloor == (CC->FloorBeingSearched))
- || ((CC->FloorBeingSearched) < 0)))
+ && ((qrbuf->QRfloor == (FloorBeingSearched))
+ || ((FloorBeingSearched) < 0)))
list_roomname(qrbuf);
}
void cmd_lkrn(char *argbuf)
{
- CC->FloorBeingSearched = (-1);
+ int FloorBeingSearched = (-1);
if (strlen(argbuf) > 0)
- CC->FloorBeingSearched = extract_int(argbuf, 0);
+ FloorBeingSearched = extract_int(argbuf, 0);
if (!(CC->logged_in)) {
cprintf("%d Not logged in.\n", ERROR + NOT_LOGGED_IN);
}
cprintf("%d Rooms w/ new msgs:\n", LISTING_FOLLOWS);
- ForEachRoom(cmd_lkrn_backend);
+ ForEachRoom(cmd_lkrn_backend, &FloorBeingSearched);
cprintf("000\n");
}
/*
* cmd_lkro() - List all known rooms
*/
-void cmd_lkro_backend(struct quickroom *qrbuf)
+void cmd_lkro_backend(struct quickroom *qrbuf, void *data)
{
int ra;
+ int FloorBeingSearched = (-1);
+ FloorBeingSearched = *(int *)data;
ra = CtdlRoomAccess(qrbuf, &CC->usersupp);
if ((ra & UA_KNOWN)
&& ((ra & UA_HASNEWMSGS) == 0)
- && ((qrbuf->QRfloor == (CC->FloorBeingSearched))
- || ((CC->FloorBeingSearched) < 0)))
+ && ((qrbuf->QRfloor == (FloorBeingSearched))
+ || ((FloorBeingSearched) < 0)))
list_roomname(qrbuf);
}
void cmd_lkro(char *argbuf)
{
- CC->FloorBeingSearched = (-1);
+ int FloorBeingSearched = (-1);
if (strlen(argbuf) > 0)
- CC->FloorBeingSearched = extract_int(argbuf, 0);
+ FloorBeingSearched = extract_int(argbuf, 0);
if (!(CC->logged_in)) {
cprintf("%d Not logged in.\n", ERROR + NOT_LOGGED_IN);
}
cprintf("%d Rooms w/o new msgs:\n", LISTING_FOLLOWS);
- ForEachRoom(cmd_lkro_backend);
+ ForEachRoom(cmd_lkro_backend, &FloorBeingSearched);
cprintf("000\n");
}
/*
* cmd_lzrm() - List all forgotten rooms
*/
-void cmd_lzrm_backend(struct quickroom *qrbuf)
+void cmd_lzrm_backend(struct quickroom *qrbuf, void *data)
{
int ra;
+ int FloorBeingSearched = (-1);
+ FloorBeingSearched = *(int *)data;
ra = CtdlRoomAccess(qrbuf, &CC->usersupp);
if ((ra & UA_GOTOALLOWED)
&& (ra & UA_ZAPPED)
- && ((qrbuf->QRfloor == (CC->FloorBeingSearched))
- || ((CC->FloorBeingSearched) < 0)))
+ && ((qrbuf->QRfloor == (FloorBeingSearched))
+ || ((FloorBeingSearched) < 0)))
list_roomname(qrbuf);
}
void cmd_lzrm(char *argbuf)
{
- CC->FloorBeingSearched = (-1);
+ int FloorBeingSearched = (-1);
if (strlen(argbuf) > 0)
- CC->FloorBeingSearched = extract_int(argbuf, 0);
+ FloorBeingSearched = extract_int(argbuf, 0);
if (!(CC->logged_in)) {
cprintf("%d Not logged in.\n", ERROR + NOT_LOGGED_IN);
}
cprintf("%d Zapped rooms:\n", LISTING_FOLLOWS);
- ForEachRoom(cmd_lzrm_backend);
+ ForEachRoom(cmd_lzrm_backend, &FloorBeingSearched);
cprintf("000\n");
}
void cmd_cflr (char *argbuf);
void cmd_kflr (char *argbuf);
void cmd_eflr (char *argbuf);
-void ForEachRoom(void (*CallBack)(struct quickroom *EachRoom));
+void ForEachRoom(void (*CallBack)(struct quickroom *EachRoom, void *out_data),
+ void *in_data);
void assoc_file_name(char *buf, struct quickroom *qrbuf, char *prefix);
void delete_room(struct quickroom *qrbuf);
void list_roomname(struct quickroom *qrbuf);
extern struct CitContext *ContextList;
-void DoPurgeMessages(struct quickroom *qrbuf) {
+void DoPurgeMessages(struct quickroom *qrbuf, void *data) {
struct ExpirePolicy epbuf;
long delnum;
time_t xtime, now;
void PurgeMessages(void) {
lprintf(5, "PurgeMessages() called\n");
messages_purged = 0;
- ForEachRoom(DoPurgeMessages);
+ ForEachRoom(DoPurgeMessages, NULL);
}
-void AddValidUser(struct usersupp *usbuf) {
+void AddValidUser(struct usersupp *usbuf, void *data) {
struct ValidUser *vuptr;
vuptr = (struct ValidUser *)mallok(sizeof(struct ValidUser));
ValidUserList = vuptr;
}
-void AddValidRoom(struct quickroom *qrbuf) {
+void AddValidRoom(struct quickroom *qrbuf, void *data) {
struct ValidRoom *vrptr;
vrptr = (struct ValidRoom *)mallok(sizeof(struct ValidRoom));
ValidRoomList = vrptr;
}
-void DoPurgeRooms(struct quickroom *qrbuf) {
+void DoPurgeRooms(struct quickroom *qrbuf, void *data) {
time_t age, purge_secs;
struct PurgeList *pptr;
struct ValidUser *vuptr;
/* Load up a table full of valid user numbers so we can delete
* user-owned rooms for users who no longer exist */
- ForEachUser(AddValidUser);
+ ForEachUser(AddValidUser, NULL);
/* Then cycle through the room file */
- ForEachRoom(DoPurgeRooms);
+ ForEachRoom(DoPurgeRooms, NULL);
/* Free the valid user list */
while (ValidUserList != NULL) {
}
-void do_user_purge(struct usersupp *us) {
+void do_user_purge(struct usersupp *us, void *data) {
int purge;
time_t now;
time_t purge_time;
lprintf(5, "PurgeUsers() called\n");
if (config.c_userpurge > 0) {
- ForEachUser(do_user_purge);
+ ForEachUser(do_user_purge, NULL);
}
transcript = mallok(256);
int RoomIsValid, UserIsValid;
/* First, load up a table full of valid room/gen combinations */
- ForEachRoom(AddValidRoom);
+ ForEachRoom(AddValidRoom, NULL);
/* Then load up a table full of valid user numbers */
- ForEachUser(AddValidUser);
+ ForEachUser(AddValidUser, NULL);
/* Now traverse through the visits, purging irrelevant records... */
cdb_rewind(CDB_VISIT);
/*
* Back end for smtp_vrfy() command
*/
-void smtp_vrfy_backend(struct usersupp *us) {
+void smtp_vrfy_backend(struct usersupp *us, void *data) {
if (!fuzzy_match(us, SMTP->vrfy_match)) {
++SMTP->vrfy_count;
void smtp_vrfy(char *argbuf) {
SMTP->vrfy_count = 0;
strcpy(SMTP->vrfy_match, argbuf);
- ForEachUser(smtp_vrfy_backend);
+ ForEachUser(smtp_vrfy_backend, NULL);
if (SMTP->vrfy_count < 1) {
cprintf("550 String does not match anything.\r\n");
/*
* Back end for smtp_expn() command
*/
-void smtp_expn_backend(struct usersupp *us) {
+void smtp_expn_backend(struct usersupp *us, void *data) {
if (!fuzzy_match(us, SMTP->vrfy_match)) {
void smtp_expn(char *argbuf) {
SMTP->vrfy_count = 0;
strcpy(SMTP->vrfy_match, argbuf);
- ForEachUser(smtp_expn_backend);
+ ForEachUser(smtp_expn_backend, NULL);
if (SMTP->vrfy_count < 1) {
cprintf("550 String does not match anything.\r\n");
char fake_hostname[25]; /* Name of the fake hostname <bc> */
char fake_roomname[ROOMNAMELEN]; /* Name of the fake room <bc> */
- int FloorBeingSearched; /* This is used by cmd_lrms() etc. */
-
struct CtdlSessData *FirstSessData; /* Allocated session data */
- char buffer1[256]; /* General-purpose workspace */
- char buffer2[256]; /* General-purpose workspace */
};
typedef struct CitContext t_context;
/*
* Traverse the user file...
*/
-void ForEachUser(void (*CallBack)(struct usersupp *EachUser)) {
+void ForEachUser(void (*CallBack)(struct usersupp *EachUser, void *out_data),
+ void *in_data) {
struct usersupp usbuf;
struct cdbdata *cdbus;
( (cdbus->len > sizeof(struct usersupp)) ?
sizeof(struct usersupp) : cdbus->len) );
cdb_free(cdbus);
- (*CallBack)(&usbuf);
+ (*CallBack)(&usbuf, in_data);
}
}
/*
* List one user (this works with cmd_list)
*/
-void ListThisUser(struct usersupp *usbuf) {
+void ListThisUser(struct usersupp *usbuf, void *data) {
if (usbuf->axlevel > 0) {
if ((CC->usersupp.axlevel>=6)
||((usbuf->flags&US_UNLISTED)==0)
*/
void cmd_list(void) {
cprintf("%d \n",LISTING_FOLLOWS);
- ForEachUser(ListThisUser);
+ ForEachUser(ListThisUser, NULL);
cprintf("000\n");
}
void cmd_forg (void);
void cmd_gnur (void);
void cmd_vali (char *v_args);
-void ForEachUser(void (*CallBack)(struct usersupp *EachUser));
-void ListThisUser(struct usersupp *usbuf);
+void ForEachUser(void (*CallBack)(struct usersupp *EachUser, void *out_data),
+ void *in_data);
+void ListThisUser(struct usersupp *usbuf, void *data);
void cmd_list (void);
void cmd_chek (void);
void cmd_qusr (char *who);