Several changes and protections for the chatserver

This commit is contained in:
Michiel Broek 2006-01-24 21:43:17 +00:00
parent 3ee82f5eed
commit 06c53cab6d
3 changed files with 69 additions and 17 deletions

View File

@ -2,6 +2,16 @@ $Id$
v0.83.9 23-Jan-2006 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 v0.83.8 22-Jan-2006 - 23-Jan-2006

View File

@ -4,7 +4,7 @@
* Purpose ...............: MBSE BBS Task Manager * Purpose ...............: MBSE BBS Task Manager
* *
***************************************************************************** *****************************************************************************
* Copyright (C) 1997-2005 * Copyright (C) 1997-2006
* *
* Michiel Broek FIDO: 2:280/2802 * Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10 * Beekmansbos 10
@ -116,6 +116,8 @@ extern int ping_run; /* Ping running */
int sched_run = FALSE; /* Scheduler running */ int sched_run = FALSE; /* Scheduler running */
extern int disk_run; /* Disk watch running */ extern int disk_run; /* Disk watch running */
extern int ibc_run; /* IBC thread 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; int i, rc = 0;
pid_t pid = 0; pid_t pid = 0;
Syslog('r', "launch() entered");
if (checktasks(0) >= MAXTASKS) { if (checktasks(0) >= MAXTASKS) {
Syslog('?', "Launch: can't execute %s, maximum tasks reached", cmd); Syslog('?', "Launch: can't execute %s, maximum tasks reached", cmd);
return 0; return 0;
@ -463,6 +466,13 @@ pid_t launch(char *cmd, char *opts, char *name, int tasktype)
return 0; return 0;
} }
rc = pthread_mutex_lock(&b_mutex);
if (rc) {
WriteError("$launch mutex lock");
return 0;
}
Syslog('r', "launch() mutex locked");
pid = fork(); pid = fork();
switch (pid) { switch (pid) {
case -1: 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; ptimer = PAUSETIME;
if (opts) if (opts)

View File

@ -4,7 +4,7 @@
* Purpose ...............: mbtask - Internet BBS Chat (but it looks like...) * Purpose ...............: mbtask - Internet BBS Chat (but it looks like...)
* *
***************************************************************************** *****************************************************************************
* Copyright (C) 1997-2005 * Copyright (C) 1997-2006
* *
* Michiel Broek FIDO: 2:280/2802 * Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10 * Beekmansbos 10
@ -251,16 +251,28 @@ int add_user(usr_list **fap, char *server, char *name, char *realname)
{ {
usr_list *tmp, *ta; usr_list *tmp, *ta;
srv_list *sl; 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) { for (ta = *fap; ta; ta = ta->next) {
if ((strcmp(ta->server, server) == 0) && (strcmp(ta->realname, realname) == 0)) { 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; 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); pthread_mutex_lock(&b_mutex);
tmp = (usr_list *)malloc(sizeof(usr_list)); 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; usr_list **tmp, *tmpa;
srv_list *sl; 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) if (*fap == NULL)
return; return;
if (name) pthread_mutex_lock(&b_mutex);
pthread_mutex_lock(&b_mutex);
tmp = fap; tmp = fap;
while (*tmp) { while (*tmp) {
if (name && (strcmp((*tmp)->server, server) == 0) && (strcmp((*tmp)->name, name) == 0)) { 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; tmpa = *tmp;
*tmp=(*tmp)->next; *tmp=(*tmp)->next;
free(tmpa); free(tmpa);
usrchg = TRUE; usrchg = TRUE;
count++;
} else if ((name == NULL) && (strcmp((*tmp)->server, server) == 0)) { } else if ((name == NULL) && (strcmp((*tmp)->server, server) == 0)) {
Syslog('r', "IBC: removed user %s from %s", (*tmp)->name, (*tmp)->server); Syslog('r', "IBC: removed user %s from %s", (*tmp)->name, (*tmp)->server);
tmpa = *tmp; tmpa = *tmp;
*tmp=(*tmp)->next; *tmp=(*tmp)->next;
free(tmpa); free(tmpa);
usrchg = TRUE; usrchg = TRUE;
count++;
} else { } else {
tmp = &((*tmp)->next); tmp = &((*tmp)->next);
} }
@ -334,13 +349,14 @@ void del_user(usr_list **fap, char *server, char *name)
for (sl = servers; sl; sl = sl->next) { for (sl = servers; sl; sl = sl->next) {
if ((strcmp(sl->server, server) == 0) && sl->users) { 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; 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; 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) { for (ta = *fap; ta; ta = ta->next) {
if ((strcmp(ta->name, name) == 0) && (strcmp(ta->owner, owner) == 0) && (strcmp(ta->server, server) == 0)) { 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; return 1;
} }
} }
@ -655,13 +671,13 @@ void check_servers(void)
/* /*
* Local reset, make all crc's invalid so the connections will restart. * 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) for (tnsl = ncsl; tnsl; tnsl = tnsl->next)
tnsl->crc--; tnsl->crc--;
pthread_mutex_unlock(&b_mutex); pthread_mutex_unlock(&b_mutex);
}
if ((fp = fopen(scfgfn, "r"))) { if ((fp = fopen(scfgfn, "r"))) {
fread(&ibcsrvhdr, sizeof(ibcsrvhdr), 1, fp); fread(&ibcsrvhdr, sizeof(ibcsrvhdr), 1, fp);
@ -754,7 +770,7 @@ void check_servers(void)
/* /*
* Check for new configured servers * Check for new configured servers
*/ */
if (ibcsrv.Active) { if (ibcsrv.Active && strlen(ibcsrv.myname) && strlen(ibcsrv.server) && strlen(ibcsrv.passwd)) {
inlist = FALSE; inlist = FALSE;
for (tnsl = ncsl; tnsl; tnsl = tnsl->next) { for (tnsl = ncsl; tnsl; tnsl = tnsl->next) {
if (strcmp(tnsl->server, ibcsrv.server) == 0) { if (strcmp(tnsl->server, ibcsrv.server) == 0) {
@ -1745,6 +1761,16 @@ void *ibc_thread(void *dummy)
goto exit; 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_family = AF_INET;
myaddr_in.sin_addr.s_addr = INADDR_ANY; myaddr_in.sin_addr.s_addr = INADDR_ANY;
myaddr_in.sin_port = se->s_port; myaddr_in.sin_port = se->s_port;