diff --git a/ChangeLog b/ChangeLog index d01f2a39..4115c87b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,16 @@ $Id$ v0.83.9 23-Jan-2006 + mbtask: + In IBC refuse to add a user when there is no known server for + that user. + Added setup checks for two main configuration settings for IBC + and fail to start if they are missing. + Don't start connections with IBC servers that miss settings in + the chatserver setup. + Added some code to trap mbtask crashing during chat and start + mail processing. + v0.83.8 22-Jan-2006 - 23-Jan-2006 diff --git a/mbtask/mbtask.c b/mbtask/mbtask.c index e6adf98a..1508fc31 100644 --- a/mbtask/mbtask.c +++ b/mbtask/mbtask.c @@ -4,7 +4,7 @@ * Purpose ...............: MBSE BBS Task Manager * ***************************************************************************** - * Copyright (C) 1997-2005 + * Copyright (C) 1997-2006 * * Michiel Broek FIDO: 2:280/2802 * Beekmansbos 10 @@ -116,6 +116,8 @@ extern int ping_run; /* Ping running */ int sched_run = FALSE; /* Scheduler running */ extern int disk_run; /* Disk watch running */ extern int ibc_run; /* IBC thread running */ +extern pthread_mutex_t b_mutex; /* IBC mutex lock */ + /* @@ -442,6 +444,7 @@ pid_t launch(char *cmd, char *opts, char *name, int tasktype) int i, rc = 0; pid_t pid = 0; + Syslog('r', "launch() entered"); if (checktasks(0) >= MAXTASKS) { Syslog('?', "Launch: can't execute %s, maximum tasks reached", cmd); return 0; @@ -463,6 +466,13 @@ pid_t launch(char *cmd, char *opts, char *name, int tasktype) return 0; } + rc = pthread_mutex_lock(&b_mutex); + if (rc) { + WriteError("$launch mutex lock"); + return 0; + } + Syslog('r', "launch() mutex locked"); + pid = fork(); switch (pid) { case -1: @@ -513,6 +523,12 @@ pid_t launch(char *cmd, char *opts, char *name, int tasktype) } } + rc = pthread_mutex_unlock(&b_mutex); + if (rc) { + WriteError("$launch mutex unlock"); + } + Syslog('r', "launch() mutex unlocked"); + ptimer = PAUSETIME; if (opts) diff --git a/mbtask/taskibc.c b/mbtask/taskibc.c index b9993ace..0881b19d 100644 --- a/mbtask/taskibc.c +++ b/mbtask/taskibc.c @@ -4,7 +4,7 @@ * Purpose ...............: mbtask - Internet BBS Chat (but it looks like...) * ***************************************************************************** - * Copyright (C) 1997-2005 + * Copyright (C) 1997-2006 * * Michiel Broek FIDO: 2:280/2802 * Beekmansbos 10 @@ -251,16 +251,28 @@ int add_user(usr_list **fap, char *server, char *name, char *realname) { usr_list *tmp, *ta; srv_list *sl; + int Found = FALSE; - Syslog('r', "add_user %s %s %s", server, name, realname); + Syslog('r', "IBC: add_user (%s, %s, %s)", server, name, realname); for (ta = *fap; ta; ta = ta->next) { if ((strcmp(ta->server, server) == 0) && (strcmp(ta->realname, realname) == 0)) { - Syslog('-', "IBC: add_user(%s %s %s), already registered", server, name, realname); + Syslog('-', "IBC: add_user(%s, %s, %s), already registered", server, name, realname); return 1; } } + for (sl = servers; sl; sl = sl->next) { + if (strcmp(sl->server, server) == 0) { + Found = TRUE; + break; + } + } + if (!Found) { + Syslog('-', "IBC: add_user(%s, %s, %s), unknown server", server, name, realname); + return 1; + } + pthread_mutex_lock(&b_mutex); tmp = (usr_list *)malloc(sizeof(usr_list)); @@ -305,28 +317,31 @@ void del_user(usr_list **fap, char *server, char *name) { usr_list **tmp, *tmpa; srv_list *sl; + int count = 0; - Syslog('r', "IBC: deluser %s %s", server, printable(name, 0)); + Syslog('r', "IBC: deluser (%s, %s)", server, printable(name, 0)); if (*fap == NULL) return; - if (name) - pthread_mutex_lock(&b_mutex); + pthread_mutex_lock(&b_mutex); tmp = fap; while (*tmp) { if (name && (strcmp((*tmp)->server, server) == 0) && (strcmp((*tmp)->name, name) == 0)) { + Syslog('r', "IBC: removed user %s from %s", (*tmp)->name, (*tmp)->server); tmpa = *tmp; *tmp=(*tmp)->next; free(tmpa); usrchg = TRUE; + count++; } else if ((name == NULL) && (strcmp((*tmp)->server, server) == 0)) { Syslog('r', "IBC: removed user %s from %s", (*tmp)->name, (*tmp)->server); tmpa = *tmp; *tmp=(*tmp)->next; free(tmpa); usrchg = TRUE; + count++; } else { tmp = &((*tmp)->next); } @@ -334,13 +349,14 @@ void del_user(usr_list **fap, char *server, char *name) for (sl = servers; sl; sl = sl->next) { if ((strcmp(sl->server, server) == 0) && sl->users) { - sl->users--; + sl->users -= count; + if (sl->users < 0) + sl->users = 0; /* Just in case, nothing is perfect */ srvchg = TRUE; } } - if (name) - pthread_mutex_unlock(&b_mutex); + pthread_mutex_unlock(&b_mutex); } @@ -352,11 +368,11 @@ int add_channel(chn_list **fap, char *name, char *owner, char *server) { chn_list *tmp, *ta; - Syslog('r', "IBC: add_channel %s %s %s", name, owner, server); + Syslog('r', "IBC: add_channel (%s, %s, %s)", name, owner, server); for (ta = *fap; ta; ta = ta->next) { if ((strcmp(ta->name, name) == 0) && (strcmp(ta->owner, owner) == 0) && (strcmp(ta->server, server) == 0)) { - Syslog('-', "IBC: add_channel(%s %s %s), already registered", name, owner, server); + Syslog('-', "IBC: add_channel(%s, %s, %s), already registered", name, owner, server); return 1; } } @@ -655,13 +671,13 @@ void check_servers(void) /* * Local reset, make all crc's invalid so the connections will restart. */ - pthread_mutex_lock(&b_mutex); - if (local_reset) + if (local_reset) { + pthread_mutex_lock(&b_mutex); for (tnsl = ncsl; tnsl; tnsl = tnsl->next) tnsl->crc--; - pthread_mutex_unlock(&b_mutex); + pthread_mutex_unlock(&b_mutex); + } - if ((fp = fopen(scfgfn, "r"))) { fread(&ibcsrvhdr, sizeof(ibcsrvhdr), 1, fp); @@ -754,7 +770,7 @@ void check_servers(void) /* * Check for new configured servers */ - if (ibcsrv.Active) { + if (ibcsrv.Active && strlen(ibcsrv.myname) && strlen(ibcsrv.server) && strlen(ibcsrv.passwd)) { inlist = FALSE; for (tnsl = ncsl; tnsl; tnsl = tnsl->next) { if (strcmp(tnsl->server, ibcsrv.server) == 0) { @@ -1745,6 +1761,16 @@ void *ibc_thread(void *dummy) goto exit; } + if (strlen(CFG.bbs_name) == 0) { + Syslog('!', "IBC: mbsetup 1.2.1 is empty, cannot start Internet BBS Chat"); + goto exit; + } + + if (strlen(CFG.myfqdn) == 0) { + Syslog('!', "IBC: mbsetup 1.2.10 is empty, cannot start Internet BBS Chat"); + goto exit; + } + myaddr_in.sin_family = AF_INET; myaddr_in.sin_addr.s_addr = INADDR_ANY; myaddr_in.sin_port = se->s_port;