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

@@ -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)

View File

@@ -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;