Rewrote mbtask as a single process
This commit is contained in:
parent
88453c9c55
commit
cd8c6a00db
10
ChangeLog
10
ChangeLog
@ -2,10 +2,20 @@ $Id$
|
||||
|
||||
v0.83.12 06-Feb-2006
|
||||
|
||||
mbselib.a:
|
||||
On socket send error 2, abort the client program.
|
||||
|
||||
mbsebbs:
|
||||
Added screen rows detection using ANSI sequences needed for
|
||||
some terminal programs like minicom.
|
||||
|
||||
mbtask:
|
||||
On shutdown also send PART and QUIT messages to all our links
|
||||
for our own users if they are still online so that the network
|
||||
will keep the correct state.
|
||||
Removed all thread programming so that mbtask is now a single
|
||||
process again. This should fix the crash problem during chat.
|
||||
|
||||
|
||||
v0.83.11 28-Jan-2006 - 06-Feb-2006
|
||||
|
||||
|
3
TODO
3
TODO
@ -50,6 +50,9 @@ mbsebbs:
|
||||
|
||||
N: Joe 3.3 doesn't work with mbsebbs, some locking problem.
|
||||
|
||||
N: Implement kermit protocol, external versions don't work right.
|
||||
|
||||
|
||||
mbfido:
|
||||
W: Check all .flo files for dead attachments.
|
||||
|
||||
|
81
configure
vendored
81
configure
vendored
@ -5107,89 +5107,8 @@ done
|
||||
fi
|
||||
|
||||
|
||||
if test "$SYSTEM" = "NetBSD"; then
|
||||
CFLAGS="$CFLAGS `pthread-config --cflags`"
|
||||
LDFLAGS="$LDFLAGS `pthread-config --ldflags`"
|
||||
fi
|
||||
|
||||
|
||||
if test "$SYSTEM" = "FreeBSD" || test "$SYSTEM" = "OpenBSD"; then
|
||||
CFLAGS="-pthread $CFLAGS"
|
||||
else
|
||||
echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5
|
||||
echo $ECHO_N "checking for pthread_create in -lpthread... $ECHO_C" >&6
|
||||
if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then
|
||||
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||
else
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-lpthread $LIBS"
|
||||
cat >conftest.$ac_ext <<_ACEOF
|
||||
/* confdefs.h. */
|
||||
_ACEOF
|
||||
cat confdefs.h >>conftest.$ac_ext
|
||||
cat >>conftest.$ac_ext <<_ACEOF
|
||||
/* end confdefs.h. */
|
||||
|
||||
/* Override any gcc2 internal prototype to avoid an error. */
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif
|
||||
/* We use char because int might match the return type of a gcc2
|
||||
builtin and then its argument prototype would still apply. */
|
||||
char pthread_create ();
|
||||
int
|
||||
main ()
|
||||
{
|
||||
pthread_create ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
|
||||
(eval $ac_link) 2>conftest.er1
|
||||
ac_status=$?
|
||||
grep -v '^ *+' conftest.er1 >conftest.err
|
||||
rm -f conftest.er1
|
||||
cat conftest.err >&5
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); } &&
|
||||
{ ac_try='test -z "$ac_c_werror_flag"
|
||||
|| test ! -s conftest.err'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; } &&
|
||||
{ ac_try='test -s conftest$ac_exeext'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; }; then
|
||||
ac_cv_lib_pthread_pthread_create=yes
|
||||
else
|
||||
echo "$as_me: failed program was:" >&5
|
||||
sed 's/^/| /' conftest.$ac_ext >&5
|
||||
|
||||
ac_cv_lib_pthread_pthread_create=no
|
||||
fi
|
||||
rm -f conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
fi
|
||||
echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5
|
||||
echo "${ECHO_T}$ac_cv_lib_pthread_pthread_create" >&6
|
||||
if test $ac_cv_lib_pthread_pthread_create = yes; then
|
||||
result=yes
|
||||
else
|
||||
result=no
|
||||
fi
|
||||
|
||||
if test "$result" = "yes"; then
|
||||
LIBS="$LIBS -lpthread"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
24
configure.in
24
configure.in
@ -199,23 +199,23 @@ dnl
|
||||
dnl
|
||||
dnl On NetBSD we need to add the pkg dirs for posix threads
|
||||
dnl
|
||||
if test "$SYSTEM" = "NetBSD"; then
|
||||
CFLAGS="$CFLAGS `pthread-config --cflags`"
|
||||
LDFLAGS="$LDFLAGS `pthread-config --ldflags`"
|
||||
fi
|
||||
dnl if test "$SYSTEM" = "NetBSD"; then
|
||||
dnl CFLAGS="$CFLAGS `pthread-config --cflags`"
|
||||
dnl LDFLAGS="$LDFLAGS `pthread-config --ldflags`"
|
||||
dnl fi
|
||||
|
||||
|
||||
dnl
|
||||
dnl For FreeBSD and OpenBSD we need -pthread for gcc and don't need libpthread
|
||||
dnl
|
||||
if test "$SYSTEM" = "FreeBSD" || test "$SYSTEM" = "OpenBSD"; then
|
||||
CFLAGS="-pthread $CFLAGS"
|
||||
else
|
||||
AC_CHECK_LIB(pthread,pthread_create,result=yes,result=no)
|
||||
if test "$result" = "yes"; then
|
||||
LIBS="$LIBS -lpthread"
|
||||
fi
|
||||
fi
|
||||
dnl if test "$SYSTEM" = "FreeBSD" || test "$SYSTEM" = "OpenBSD"; then
|
||||
dnl CFLAGS="-pthread $CFLAGS"
|
||||
dnl else
|
||||
dnl AC_CHECK_LIB(pthread,pthread_create,result=yes,result=no)
|
||||
dnl if test "$result" = "yes"; then
|
||||
dnl LIBS="$LIBS -lpthread"
|
||||
dnl fi
|
||||
dnl fi
|
||||
|
||||
|
||||
|
||||
|
@ -169,6 +169,7 @@ term.o: ../config.h mbselib.h users.h
|
||||
endian.o: ../config.h mbselib.h
|
||||
timers.o: ../config.h mbselib.h
|
||||
pidinfo.o: ../config.h mbselib.h
|
||||
tmpwork.o: ../config.h mbselib.h
|
||||
dbcfg.o: ../config.h mbselib.h mbse.h users.h mbsedb.h
|
||||
dbdupe.o: ../config.h mbselib.h mbse.h users.h mbsedb.h
|
||||
dbftn.o: ../config.h mbselib.h users.h mbsedb.h
|
||||
|
@ -4,7 +4,7 @@
|
||||
* Purpose ...............: MBSE Deamon Client
|
||||
*
|
||||
*****************************************************************************
|
||||
* Copyright (C) 1993-2005
|
||||
* Copyright (C) 1993-2006
|
||||
*
|
||||
* Michiel Broek FIDO: 2:280/2802
|
||||
* Beekmansbos 10
|
||||
@ -158,6 +158,9 @@ int socket_send(char *buf)
|
||||
|
||||
if (sendto(sock, buf, strlen(buf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)) != strlen(buf)) {
|
||||
printf("Socket send failed error %d\n", errno);
|
||||
if (errno == 2) {
|
||||
abort();
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
|
@ -112,7 +112,7 @@ timecheck.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h timecheck
|
||||
change.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h change.h dispfile.h funcs.h input.h language.h misc.h timeout.h exitinfo.h bye.h term.h ttyio.h
|
||||
transfer.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h transfer.h change.h whoson.h funcs.h term.h ttyio.h filesub.h language.h openport.h timeout.h zmmisc.h zmsend.h zmrecv.h ymsend.h ymrecv.h
|
||||
exitinfo.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h funcs.h input.h language.h oneline.h misc.h bye.h timeout.h timecheck.h exitinfo.h
|
||||
mbsebbs.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h ../lib/msg.h mbsebbs.h user.h dispfile.h language.h menu.h misc.h bye.h timeout.h funcs.h term.h ttyio.h openport.h
|
||||
mbsebbs.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h ../lib/msg.h mbsebbs.h user.h dispfile.h language.h menu.h misc.h bye.h timeout.h funcs.h term.h ttyio.h openport.h input.h
|
||||
menu.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h oneline.h mail.h change.h chat.h file.h funcs.h input.h misc.h timeout.h menu.h page.h pinfo.h bye.h timecheck.h whoson.h language.h offline.h email.h door.h dispfile.h userlist.h timestats.h logentry.h morefile.h lastcallers.h signature.h term.h ttyio.h
|
||||
pop3.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h ../lib/mbinet.h ../lib/msgtext.h ../lib/msg.h msgutil.h pop3.h term.h ttyio.h
|
||||
lastcallers.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h input.h language.h lastcallers.h term.h ttyio.h
|
||||
|
@ -70,7 +70,7 @@ depend:
|
||||
# Dependencies generated by make depend
|
||||
callstat.o: ../config.h ../lib/mbselib.h taskutil.h callstat.h
|
||||
scanout.o: ../config.h ../lib/mbselib.h taskutil.h scanout.h
|
||||
taskcomm.o: ../config.h ../lib/mbselib.h taskstat.h taskregs.h taskdisk.h taskinfo.h taskutil.h taskchat.h taskcomm.h
|
||||
taskcomm.o: ../config.h ../lib/mbselib.h taskstat.h taskregs.h taskdisk.h taskinfo.h taskutil.h taskchat.h taskcomm.h taskibc.h
|
||||
taskinfo.o: ../config.h ../lib/mbselib.h taskinfo.h
|
||||
taskstat.o: ../config.h ../lib/mbselib.h taskstat.h callstat.h outstat.h taskibc.h taskutil.h
|
||||
taskibc.o: ../config.h ../lib/mbselib.h taskstat.h taskutil.h taskchat.h taskibc.h
|
||||
@ -85,4 +85,5 @@ calllist.o: ../config.h ../lib/mbselib.h taskstat.h taskutil.h callstat.h outsta
|
||||
ping.o: ../config.h ../lib/mbselib.h taskstat.h taskutil.h ping.h
|
||||
taskchat.o: ../config.h ../lib/mbselib.h taskutil.h taskregs.h taskchat.h taskibc.h
|
||||
crc.o: ../config.h ../lib/mbselib.h
|
||||
pidinfo.o: ../config.h ../lib/mbselib.h
|
||||
# End of generated dependencies
|
||||
|
353
mbtask/mbtask.c
353
mbtask/mbtask.c
@ -59,6 +59,9 @@ static pid_t pgrp; /* Pids group */
|
||||
int sock = -1; /* Datagram socket */
|
||||
struct sockaddr_un servaddr; /* Server address */
|
||||
struct sockaddr_un from; /* From address */
|
||||
struct sockaddr_in myaddr_in; /* IBC local socket */
|
||||
struct sockaddr_in clientaddr_in; /* IBC remote socket */
|
||||
int ibcsock = -1; /* IBC socket */
|
||||
int fromlen;
|
||||
char waitmsg[81]; /* Waiting message */
|
||||
static char spath[PATH_MAX]; /* Socket path */
|
||||
@ -111,10 +114,7 @@ extern pid_t mypid; /* Pid of daemon */
|
||||
int G_Shutdown = FALSE; /* Global shutdown */
|
||||
int T_Shutdown = FALSE; /* Shutdown threads */
|
||||
int nodaemon = FALSE; /* Run in foreground */
|
||||
extern int cmd_run; /* Cmd running */
|
||||
extern int ping_run; /* Ping running */
|
||||
extern int disk_run; /* Disk watch running */
|
||||
extern int ibc_run; /* IBC thread running */
|
||||
extern time_t resettime; /* IBC reset time */
|
||||
|
||||
|
||||
|
||||
@ -122,10 +122,6 @@ extern int ibc_run; /* IBC thread running */
|
||||
* Global thread vaiables
|
||||
*/
|
||||
pthread_t pt_ping;
|
||||
pthread_t pt_command;
|
||||
pthread_t pt_disk;
|
||||
pthread_t pt_scheduler;
|
||||
pthread_t pt_ibc;
|
||||
|
||||
|
||||
|
||||
@ -395,38 +391,38 @@ void load_maincfg(void)
|
||||
*/
|
||||
void load_taskcfg(void)
|
||||
{
|
||||
FILE *fp;
|
||||
FILE *fp;
|
||||
|
||||
if ((fp = fopen(tcfgfn, "r")) == NULL) {
|
||||
memset(&TCFG, 0, sizeof(TCFG));
|
||||
TCFG.maxload = 1.50;
|
||||
snprintf(TCFG.zmh_start, 6, "02:30");
|
||||
snprintf(TCFG.zmh_end, 6, "03:30");
|
||||
snprintf(TCFG.cmd_mailout, 81, "%s/bin/mbfido scan web -quiet", getenv("MBSE_ROOT"));
|
||||
snprintf(TCFG.cmd_mailin, 81, "%s/bin/mbfido tic toss web -quiet", getenv("MBSE_ROOT"));
|
||||
snprintf(TCFG.cmd_newnews, 81, "%s/bin/mbfido news web -quiet", getenv("MBSE_ROOT"));
|
||||
snprintf(TCFG.cmd_mbindex1, 81, "%s/bin/mbindex -quiet", getenv("MBSE_ROOT"));
|
||||
if (strlen(_PATH_GOLDNODE))
|
||||
snprintf(TCFG.cmd_mbindex2, 81, "%s -f -q", _PATH_GOLDNODE);
|
||||
snprintf(TCFG.cmd_msglink, 81, "%s/bin/mbmsg link -quiet", getenv("MBSE_ROOT"));
|
||||
snprintf(TCFG.cmd_reqindex, 81, "%s/bin/mbfile index -quiet", getenv("MBSE_ROOT"));
|
||||
TCFG.max_tcp = 0;
|
||||
snprintf(TCFG.isp_ping1, 41, "192.168.1.1");
|
||||
snprintf(TCFG.isp_ping2, 41, "192.168.1.1");
|
||||
if ((fp = fopen(tcfgfn, "a+")) == NULL) {
|
||||
Syslog('?', "$Can't create %s", tcfgfn);
|
||||
die(MBERR_INIT_ERROR);
|
||||
}
|
||||
fwrite(&TCFG, sizeof(TCFG), 1, fp);
|
||||
fclose(fp);
|
||||
chmod(tcfgfn, 0640);
|
||||
Syslog('+', "Created new %s", tcfgfn);
|
||||
} else {
|
||||
fread(&TCFG, sizeof(TCFG), 1, fp);
|
||||
fclose(fp);
|
||||
if ((fp = fopen(tcfgfn, "r")) == NULL) {
|
||||
memset(&TCFG, 0, sizeof(TCFG));
|
||||
TCFG.maxload = 1.50;
|
||||
snprintf(TCFG.zmh_start, 6, "02:30");
|
||||
snprintf(TCFG.zmh_end, 6, "03:30");
|
||||
snprintf(TCFG.cmd_mailout, 81, "%s/bin/mbfido scan web -quiet", getenv("MBSE_ROOT"));
|
||||
snprintf(TCFG.cmd_mailin, 81, "%s/bin/mbfido tic toss web -quiet", getenv("MBSE_ROOT"));
|
||||
snprintf(TCFG.cmd_newnews, 81, "%s/bin/mbfido news web -quiet", getenv("MBSE_ROOT"));
|
||||
snprintf(TCFG.cmd_mbindex1, 81, "%s/bin/mbindex -quiet", getenv("MBSE_ROOT"));
|
||||
if (strlen(_PATH_GOLDNODE))
|
||||
snprintf(TCFG.cmd_mbindex2, 81, "%s -f -q", _PATH_GOLDNODE);
|
||||
snprintf(TCFG.cmd_msglink, 81, "%s/bin/mbmsg link -quiet", getenv("MBSE_ROOT"));
|
||||
snprintf(TCFG.cmd_reqindex, 81, "%s/bin/mbfile index -quiet", getenv("MBSE_ROOT"));
|
||||
TCFG.max_tcp = 0;
|
||||
snprintf(TCFG.isp_ping1, 41, "192.168.1.1");
|
||||
snprintf(TCFG.isp_ping2, 41, "192.168.1.1");
|
||||
if ((fp = fopen(tcfgfn, "a+")) == NULL) {
|
||||
Syslog('?', "$Can't create %s", tcfgfn);
|
||||
die(MBERR_INIT_ERROR);
|
||||
}
|
||||
fwrite(&TCFG, sizeof(TCFG), 1, fp);
|
||||
fclose(fp);
|
||||
chmod(tcfgfn, 0640);
|
||||
Syslog('+', "Created new %s", tcfgfn);
|
||||
} else {
|
||||
fread(&TCFG, sizeof(TCFG), 1, fp);
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
tcfg_time = file_time(tcfgfn);
|
||||
tcfg_time = file_time(tcfgfn);
|
||||
}
|
||||
|
||||
|
||||
@ -475,9 +471,10 @@ int msleep(int msecs)
|
||||
*/
|
||||
pid_t launch(char *cmd, char *opts, char *name, int tasktype)
|
||||
{
|
||||
char buf[PATH_MAX], *vector[16];
|
||||
int i, rc = 0;
|
||||
pid_t pid = 0, lpgrp;
|
||||
static char buf[PATH_MAX];
|
||||
char *vector[16];
|
||||
int i, rc = 0;
|
||||
pid_t pid = 0;
|
||||
|
||||
Syslog('r', "launch() entered");
|
||||
if (checktasks(0) >= MAXTASKS) {
|
||||
@ -500,26 +497,21 @@ pid_t launch(char *cmd, char *opts, char *name, int tasktype)
|
||||
Syslog('?', "Launch: can't execute %s, command not found", vector[0]);
|
||||
return 0;
|
||||
}
|
||||
Syslog('r', "launch() step 2");
|
||||
|
||||
if ((lpgrp = setpgid(0, 0)) == -1) {
|
||||
Syslog('?', "$setpgid failed");
|
||||
return 0;
|
||||
}
|
||||
Syslog('r', "launch() step 3, lpgrp=%d", lpgrp);
|
||||
Syslog('r', "launch() step 2");
|
||||
|
||||
switch (pid = fork()) {
|
||||
case -1:
|
||||
Syslog('?', "$Launch: error, can't fork grandchild");
|
||||
WriteError("$Launch: error, can't fork grandchild");
|
||||
return 0;
|
||||
case 0:
|
||||
/*
|
||||
* A delay in the child process to prevent it returns
|
||||
* before the main process sess it ever started.
|
||||
* before the main process sees it ever started.
|
||||
*/
|
||||
msleep(150);
|
||||
|
||||
Syslog('r', "launch() step 4");
|
||||
Syslog('r', "launch() step 3");
|
||||
/* From Paul Vixies cron: */
|
||||
rc = setsid(); /* It doesn't seem to help */
|
||||
if (rc == -1)
|
||||
@ -541,7 +533,7 @@ pid_t launch(char *cmd, char *opts, char *name, int tasktype)
|
||||
_exit(MBERR_EXEC_FAILED);
|
||||
}
|
||||
errno = 0;
|
||||
Syslog('r', "launch() step 5");
|
||||
Syslog('r', "launch() step 4");
|
||||
rc = execv(vector[0],vector);
|
||||
Syslog('?', "$Launch: execv \"%s\" failed, returned %d", cmd, rc);
|
||||
_exit(MBERR_EXEC_FAILED);
|
||||
@ -550,7 +542,7 @@ pid_t launch(char *cmd, char *opts, char *name, int tasktype)
|
||||
break;
|
||||
}
|
||||
|
||||
Syslog('r', "launch() step 6");
|
||||
Syslog('r', "launch() step 5");
|
||||
/*
|
||||
* Add it to the tasklist.
|
||||
*/
|
||||
@ -738,7 +730,6 @@ void die(int onsig)
|
||||
{
|
||||
int i, count;
|
||||
char temp[80];
|
||||
time_t now;
|
||||
|
||||
signal(onsig, SIG_IGN);
|
||||
|
||||
@ -803,37 +794,22 @@ void die(int onsig)
|
||||
Syslog('?', "Continue shutdown with other programs running");
|
||||
}
|
||||
|
||||
/*
|
||||
* Disconnect chatservers
|
||||
*/
|
||||
ibc_shutdown();
|
||||
|
||||
/*
|
||||
* Now stop the threads
|
||||
*/
|
||||
T_Shutdown = TRUE;
|
||||
Syslog('+', "Signal all threads to stop");
|
||||
|
||||
/*
|
||||
* Wait at most 2 seconds for the threads, internal they are
|
||||
* build to stop within a second.
|
||||
*/
|
||||
now = time(NULL) + 2;
|
||||
while ((cmd_run || ping_run || disk_run || ibc_run) && (time(NULL) < now)) {
|
||||
sleep(1);
|
||||
}
|
||||
if (cmd_run || ping_run || disk_run || ibc_run)
|
||||
Syslog('+', "Not all threads stopped! Forced shutdown");
|
||||
if (cmd_run)
|
||||
Syslog('+', "Thread cmd_run not responding");
|
||||
if (ping_run)
|
||||
Syslog('+', "Thread ping_run not responding");
|
||||
if (disk_run)
|
||||
Syslog('+', "Thread disk_run not responding");
|
||||
if (ibc_run)
|
||||
Syslog('+', "Thread ibc_run not responding");
|
||||
else
|
||||
Syslog('+', "All threads stopped");
|
||||
|
||||
/*
|
||||
* Free memory
|
||||
*/
|
||||
deinit_ping();
|
||||
deinitnl();
|
||||
deinit_diskwatch();
|
||||
unload_ports();
|
||||
ulocktask();
|
||||
printable(NULL, 0);
|
||||
@ -843,8 +819,6 @@ void die(int onsig)
|
||||
*/
|
||||
if (sock != -1)
|
||||
close(sock);
|
||||
if (ping_isocket != -1)
|
||||
close(ping_isocket);
|
||||
if (!file_exist(spath, R_OK)) {
|
||||
unlink(spath);
|
||||
}
|
||||
@ -1027,11 +1001,10 @@ void check_sema(void)
|
||||
|
||||
|
||||
|
||||
void start_scheduler(void)
|
||||
void start_scheduler(int port)
|
||||
{
|
||||
struct passwd *pw;
|
||||
char *cmd = NULL;
|
||||
int rc;
|
||||
|
||||
if (nodaemon)
|
||||
printf("init fidonet\n");
|
||||
@ -1076,6 +1049,28 @@ void start_scheduler(void)
|
||||
if (nodaemon)
|
||||
printf("sockets created\n");
|
||||
|
||||
/*
|
||||
* Setup IBC socket
|
||||
*/
|
||||
myaddr_in.sin_family = AF_INET;
|
||||
myaddr_in.sin_addr.s_addr = INADDR_ANY;
|
||||
myaddr_in.sin_port = port;
|
||||
Syslog('+', "IBC: listen on %s, port %d", inet_ntoa(myaddr_in.sin_addr), ntohs(myaddr_in.sin_port));
|
||||
|
||||
ibcsock = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (ibcsock == -1) {
|
||||
WriteError("$IBC: can't create listen socket");
|
||||
die(MBERR_INIT_ERROR);
|
||||
}
|
||||
|
||||
if (bind(ibcsock, (struct sockaddr *)&myaddr_in, sizeof(struct sockaddr_in)) == -1) {
|
||||
WriteError("$IBC: can't bind listen socket");
|
||||
die(MBERR_INIT_ERROR);
|
||||
}
|
||||
|
||||
srand(getpid());
|
||||
resettime = time(NULL) + (time_t)86400;
|
||||
|
||||
/*
|
||||
* The flag masterinit is set if a new config.data is created, this
|
||||
* is true if mbtask is started the very first time. Then we run
|
||||
@ -1100,29 +1095,6 @@ void start_scheduler(void)
|
||||
Syslog('?', "WARNING: this system cannot connect to other systems, check setup");
|
||||
}
|
||||
|
||||
if (nodaemon)
|
||||
printf("creating threads\n");
|
||||
/*
|
||||
* Install the threads that do the real work.
|
||||
*/
|
||||
if ((rc = pthread_create(&pt_ping, NULL, /* (void (*)) */ ping_thread, NULL))) {
|
||||
WriteError("$pthread_create ping_thread rc=%d", rc);
|
||||
die(SIGTERM);
|
||||
} else if ((rc = pthread_create(&pt_command, NULL, (void (*))cmd_thread, NULL))) {
|
||||
WriteError("$pthread_create cmd_thread rc=%d", rc);
|
||||
die(SIGTERM);
|
||||
} else if ((rc = pthread_create(&pt_disk, NULL, (void (*))disk_thread, NULL))) {
|
||||
WriteError("$pthread_create disk_thread rc=%d", rc);
|
||||
die(SIGTERM);
|
||||
} else if ((rc = pthread_create(&pt_ibc, NULL, (void (*))ibc_thread, NULL))) {
|
||||
WriteError("$pthread_create ibc rc=%d", rc);
|
||||
die(SIGTERM);
|
||||
} else {
|
||||
Syslog('+', "All threads installed");
|
||||
}
|
||||
if (nodaemon)
|
||||
printf("threads installed\n");
|
||||
|
||||
/*
|
||||
* Run the scheduler
|
||||
*/
|
||||
@ -1137,20 +1109,21 @@ void start_scheduler(void)
|
||||
*/
|
||||
void scheduler(void)
|
||||
{
|
||||
struct passwd *pw;
|
||||
int running = 0, i, found;
|
||||
static int LOADhi = FALSE, oldmin = 70, olddo = 70, oldsec = 70;
|
||||
char *cmd = NULL, opts[41], port[21];
|
||||
static char doing[32];
|
||||
time_t now;
|
||||
struct tm tm, utm;
|
||||
struct passwd *pw;
|
||||
int rlen, rc, running = 0, i, found, call_work = 0, len;
|
||||
static int LOADhi = FALSE, oldmin = 70, olddo = 70, oldsec = 70, call_entry = MAXTASKS;
|
||||
char *cmd = NULL, opts[41], port[21], crbuf[512];
|
||||
static char doing[32], buf[2048];
|
||||
time_t now;
|
||||
struct tm tm, utm;
|
||||
#if defined(__linux__)
|
||||
FILE *fp;
|
||||
FILE *fp;
|
||||
#endif
|
||||
int call_work = 0;
|
||||
static int call_entry = MAXTASKS;
|
||||
double loadavg[3];
|
||||
pp_list *tpl;
|
||||
double loadavg[3];
|
||||
pp_list *tpl;
|
||||
struct pollfd pfd[3];
|
||||
socklen_t sl;
|
||||
struct sockaddr_in ffrom;
|
||||
|
||||
Syslog('+', "Starting scheduler thread");
|
||||
pw = getpwuid(getuid());
|
||||
@ -1159,16 +1132,79 @@ void scheduler(void)
|
||||
* Enter the mainloop (forever)
|
||||
*/
|
||||
do {
|
||||
sleep(1);
|
||||
/*
|
||||
* Poll UNIX Datagram socket and IBC UDP socket until the defined
|
||||
* timeout of one second.
|
||||
* This means we listen of a MBSE BBS client program has something
|
||||
* to tell. Timeout is one second, after the timeout the rest of the
|
||||
* mainloop is executed.
|
||||
*/
|
||||
pfd[0].fd = sock;
|
||||
pfd[0].events = POLLIN;
|
||||
pfd[0].revents = 0;
|
||||
pfd[1].fd = ibcsock;
|
||||
pfd[1].events = POLLIN;
|
||||
pfd[1].revents = 0;
|
||||
pfd[2].fd = ping_isocket;
|
||||
pfd[2].events = POLLIN;
|
||||
pfd[2].revents = 0;
|
||||
|
||||
rc = poll(pfd, 3, 1000);
|
||||
// Syslog('s', "poll() rc=%d", rc);
|
||||
if (rc == -1) {
|
||||
/*
|
||||
* Poll can be interrupted by a finished child so that's not a real error.
|
||||
*/
|
||||
if (errno != EINTR) {
|
||||
Syslog('?', "$poll() rc=%d sock=%d, events=%04x", rc, sock, pfd[0].revents);
|
||||
Syslog('?', "$poll() rc=%d sock=%d, events=%04x", rc, ibcsock, pfd[1].revents);
|
||||
}
|
||||
} else if (rc) {
|
||||
if (pfd[0].revents & POLLIN) {
|
||||
/*
|
||||
* Process the clients request
|
||||
*/
|
||||
memset(&buf, 0, sizeof(buf));
|
||||
fromlen = sizeof(from);
|
||||
rlen = recvfrom(sock, buf, sizeof(buf) -1, 0, (struct sockaddr *)&from, &fromlen);
|
||||
if (rlen == -1) {
|
||||
Syslog('?', "$recvfrom() for command receiver");
|
||||
} else {
|
||||
do_cmd(buf);
|
||||
}
|
||||
}
|
||||
if (pfd[1].revents & POLLIN || pfd[1].revents & POLLERR || pfd[1].revents & POLLHUP || pfd[1].revents & POLLNVAL) {
|
||||
sl = sizeof(myaddr_in);
|
||||
memset(&clientaddr_in, 0, sizeof(struct sockaddr_in));
|
||||
memset(&crbuf, 0, sizeof(crbuf));
|
||||
if ((len = recvfrom(ibcsock, &crbuf, sizeof(crbuf)-1, 0,(struct sockaddr *)&clientaddr_in, &sl)) != -1) {
|
||||
ibc_receiver(crbuf);
|
||||
} else {
|
||||
WriteError("$recvfrom() for IBC receiver");
|
||||
}
|
||||
}
|
||||
if (pfd[2].revents & POLLIN || pfd[2].revents & POLLERR || pfd[2].revents & POLLHUP || pfd[2].revents & POLLNVAL) {
|
||||
sl = sizeof(ffrom);
|
||||
if ((len = recvfrom(ping_isocket, &buf, sizeof(buf)-1, 0,(struct sockaddr *)&ffrom, &sl)) != -1) {
|
||||
ping_receive(buf, len);
|
||||
} else {
|
||||
WriteError("$recvfrom() for ping receiver");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (G_Shutdown)
|
||||
break;
|
||||
|
||||
/*
|
||||
* Check all registered connections and semafore's
|
||||
*/
|
||||
check_servers();
|
||||
reg_check();
|
||||
check_sema();
|
||||
check_ports();
|
||||
diskwatch();
|
||||
check_ping();
|
||||
|
||||
/*
|
||||
* Check the systems load average.
|
||||
@ -1303,12 +1339,9 @@ void scheduler(void)
|
||||
running = checktasks(0);
|
||||
|
||||
if (s_mailout && (!ptimer) && (!runtasktype(MBFIDO))) {
|
||||
if (! lock_ibc((char *)"scheduler 1")) {
|
||||
launch(TCFG.cmd_mailout, NULL, (char *)"mailout", MBFIDO);
|
||||
unlock_ibc((char *)"scheduler 1");
|
||||
running = checktasks(0);
|
||||
s_mailout = FALSE;
|
||||
}
|
||||
launch(TCFG.cmd_mailout, NULL, (char *)"mailout", MBFIDO);
|
||||
running = checktasks(0);
|
||||
s_mailout = FALSE;
|
||||
}
|
||||
|
||||
if (s_mailin && (!ptimer) && (!runtasktype(MBFIDO))) {
|
||||
@ -1322,32 +1355,23 @@ void scheduler(void)
|
||||
if ((ipmailers + runtasktype(CM_ISDN) + runtasktype(CM_POTS)) == 0) {
|
||||
Syslog('i', "Mailin, no mailers running, start direct");
|
||||
tosswait = TOSSWAIT_TIME;
|
||||
if (! lock_ibc((char *)"scheduler 2")) {
|
||||
launch(TCFG.cmd_mailin, NULL, (char *)"mailin", MBFIDO);
|
||||
unlock_ibc((char *)"scheduler 2");
|
||||
running = checktasks(0);
|
||||
s_mailin = FALSE;
|
||||
}
|
||||
launch(TCFG.cmd_mailin, NULL, (char *)"mailin", MBFIDO);
|
||||
running = checktasks(0);
|
||||
s_mailin = FALSE;
|
||||
} else {
|
||||
Syslog('i', "Mailin, tosswait=%d", tosswait);
|
||||
if (tosswait == 0) {
|
||||
if (! lock_ibc((char *)"scheduler 3")) {
|
||||
launch(TCFG.cmd_mailin, NULL, (char *)"mailin", MBFIDO);
|
||||
unlock_ibc((char *)"scheduler 3");
|
||||
running = checktasks(0);
|
||||
s_mailin = FALSE;
|
||||
}
|
||||
launch(TCFG.cmd_mailin, NULL, (char *)"mailin", MBFIDO);
|
||||
running = checktasks(0);
|
||||
s_mailin = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (s_newnews && (!ptimer) && (!runtasktype(MBFIDO))) {
|
||||
if (! lock_ibc((char *)"scheduler 4")) {
|
||||
launch(TCFG.cmd_newnews, NULL, (char *)"newnews", MBFIDO);
|
||||
unlock_ibc((char *)"scheduler 4");
|
||||
running = checktasks(0);
|
||||
s_newnews = FALSE;
|
||||
}
|
||||
launch(TCFG.cmd_newnews, NULL, (char *)"newnews", MBFIDO);
|
||||
running = checktasks(0);
|
||||
s_newnews = FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1358,22 +1382,13 @@ void scheduler(void)
|
||||
*/
|
||||
if (s_index && (!ptimer) && (!running)) {
|
||||
if (strlen(TCFG.cmd_mbindex1)) {
|
||||
if (! lock_ibc((char *)"scheduler 5")) {
|
||||
launch(TCFG.cmd_mbindex1, NULL, (char *)"compiler 1", MBINDEX);
|
||||
unlock_ibc((char *)"scheduler 5");
|
||||
}
|
||||
launch(TCFG.cmd_mbindex1, NULL, (char *)"compiler 1", MBINDEX);
|
||||
}
|
||||
if (strlen(TCFG.cmd_mbindex2)) {
|
||||
if (! lock_ibc((char *)"scheduler 6")) {
|
||||
launch(TCFG.cmd_mbindex2, NULL, (char *)"compiler 2", MBINDEX);
|
||||
unlock_ibc((char *)"scheduler 6");
|
||||
}
|
||||
launch(TCFG.cmd_mbindex2, NULL, (char *)"compiler 2", MBINDEX);
|
||||
}
|
||||
if (strlen(TCFG.cmd_mbindex3)) {
|
||||
if (! lock_ibc((char *)"scheduler 7")) {
|
||||
launch(TCFG.cmd_mbindex3, NULL, (char *)"compiler 3", MBINDEX);
|
||||
unlock_ibc((char *)"scheduler 7");
|
||||
}
|
||||
launch(TCFG.cmd_mbindex3, NULL, (char *)"compiler 3", MBINDEX);
|
||||
}
|
||||
running = checktasks(0);
|
||||
s_index = FALSE;
|
||||
@ -1384,10 +1399,7 @@ void scheduler(void)
|
||||
* nothing else to do.
|
||||
*/
|
||||
if (s_msglink && (!ptimer) && (!running)) {
|
||||
if (! lock_ibc((char *)"scheduler 8")) {
|
||||
launch(TCFG.cmd_msglink, NULL, (char *)"msglink", MBFIDO);
|
||||
unlock_ibc((char *)"scheduler 8");
|
||||
}
|
||||
launch(TCFG.cmd_msglink, NULL, (char *)"msglink", MBFIDO);
|
||||
running = checktasks(0);
|
||||
s_msglink = FALSE;
|
||||
}
|
||||
@ -1396,10 +1408,7 @@ void scheduler(void)
|
||||
* Creating filerequest indexes, also only if nothing to do.
|
||||
*/
|
||||
if (s_reqindex && (!ptimer) && (!running)) {
|
||||
if (! lock_ibc((char *)"scheduler 9")) {
|
||||
launch(TCFG.cmd_reqindex, NULL, (char *)"reqindex", MBFILE);
|
||||
unlock_ibc((char *)"scheduler 9");
|
||||
}
|
||||
launch(TCFG.cmd_reqindex, NULL, (char *)"reqindex", MBFILE);
|
||||
running = checktasks(0);
|
||||
s_reqindex = FALSE;
|
||||
}
|
||||
@ -1503,10 +1512,7 @@ void scheduler(void)
|
||||
calllist[call_entry].addr.net,
|
||||
calllist[call_entry].addr.zone, calllist[call_entry].addr.domain);
|
||||
}
|
||||
if (! lock_ibc((char *)"scheduler 10")) {
|
||||
calllist[call_entry].taskpid = launch(cmd, opts, (char *)"mbcico", calllist[call_entry].callmode);
|
||||
unlock_ibc((char *)"scheduler 10");
|
||||
}
|
||||
calllist[call_entry].taskpid = launch(cmd, opts, (char *)"mbcico", calllist[call_entry].callmode);
|
||||
if (calllist[call_entry].taskpid)
|
||||
calllist[call_entry].calling = TRUE;
|
||||
running = checktasks(0);
|
||||
@ -1532,6 +1538,7 @@ int main(int argc, char **argv)
|
||||
int i;
|
||||
pid_t frk;
|
||||
FILE *fp;
|
||||
struct servent *se;
|
||||
|
||||
/*
|
||||
* Print copyright notices and setup logging.
|
||||
@ -1598,6 +1605,24 @@ int main(int argc, char **argv)
|
||||
if (nodaemon)
|
||||
printf("main config loaded\n");
|
||||
|
||||
if ((se = getservbyname("fido", "udp")) == NULL) {
|
||||
fprintf(stderr, "IBC: no fido udp entry in /etc/services, cannot start Internet BBS Chat\n");
|
||||
close(ping_isocket);
|
||||
exit(MBERR_INIT_ERROR);
|
||||
}
|
||||
|
||||
if (strlen(CFG.bbs_name) == 0) {
|
||||
fprintf(stderr, "IBC: mbsetup 1.2.1 is empty, cannot start Internet BBS Chat\n");
|
||||
close(ping_isocket);
|
||||
exit(MBERR_INIT_ERROR);
|
||||
}
|
||||
|
||||
if (strlen(CFG.myfqdn) == 0) {
|
||||
fprintf(stderr, "IBC: mbsetup 1.2.10 is empty, cannot start Internet BBS Chat\n");
|
||||
close(ping_isocket);
|
||||
exit(MBERR_INIT_ERROR);
|
||||
}
|
||||
|
||||
mypid = getpid();
|
||||
if (nodaemon)
|
||||
printf("my pid is %d\n", mypid);
|
||||
@ -1636,7 +1661,7 @@ int main(int argc, char **argv)
|
||||
*/
|
||||
mypid = getpid();
|
||||
printf("init complete, starting scheduler ...\n");
|
||||
start_scheduler();
|
||||
start_scheduler(se->s_port);
|
||||
} else {
|
||||
/*
|
||||
* Server initialization is complete. Now we can fork the
|
||||
@ -1677,7 +1702,7 @@ int main(int argc, char **argv)
|
||||
_exit(MBERR_EXEC_FAILED);
|
||||
}
|
||||
mypid = getpid();
|
||||
start_scheduler();
|
||||
start_scheduler(se->s_port);
|
||||
/* Not reached */
|
||||
default:
|
||||
/*
|
||||
|
@ -47,7 +47,7 @@ pid_t launch(char *, char *, char *, int);
|
||||
int runtasktype(int);
|
||||
int checktasks(int);
|
||||
void die(int);
|
||||
void start_scheduler(void);
|
||||
void start_scheduler(int);
|
||||
void scheduler(void);
|
||||
int locktask(char *);
|
||||
void ulocktask(void);
|
||||
|
258
mbtask/ping.c
258
mbtask/ping.c
@ -4,7 +4,7 @@
|
||||
* Purpose ...............: mbtask - ping functions
|
||||
*
|
||||
*****************************************************************************
|
||||
* Copyright (C) 1997-2005
|
||||
* Copyright (C) 1997-2006
|
||||
*
|
||||
* Michiel Broek FIDO: 2:280/2802
|
||||
* Beekmansbos 10
|
||||
@ -45,8 +45,12 @@ int icmp_errs = 0; /* ICMP error counter */
|
||||
extern int internet; /* Internet is down */
|
||||
extern int rescan; /* Master rescan flag */
|
||||
struct in_addr paddr; /* Current ping address */
|
||||
extern int T_Shutdown; /* Program shutdown */
|
||||
int ping_run = FALSE; /* Thread runnning */
|
||||
int pingnr = 2; /* Ping number */
|
||||
int pingresult[2]; /* Results of pings */
|
||||
time_t ping_rcvd; /* Time ping received */
|
||||
time_t ping_sent; /* Time ping sent */
|
||||
time_t ping_next; /* Time to sent next */
|
||||
char pingaddress[41]; /* Last pingaddress */
|
||||
|
||||
|
||||
|
||||
@ -56,7 +60,6 @@ int ping_run = FALSE; /* Thread runnning */
|
||||
static int icmp4_errcmp(char *, int, struct in_addr *, char *, int, int);
|
||||
unsigned short get_rand16(void);
|
||||
int ping_send(struct in_addr);
|
||||
int ping_receive(struct in_addr);
|
||||
|
||||
|
||||
/*
|
||||
@ -231,71 +234,50 @@ int ping_send(struct in_addr addr)
|
||||
|
||||
|
||||
/*
|
||||
* 0 = reply received Ok.
|
||||
* -1 = reply packet not for us, this is Ok.
|
||||
* -2 = destination unreachable.
|
||||
* -3 = poll/select error.
|
||||
* -4 = time exceeded.
|
||||
* -5 = wrong packetlen received.
|
||||
* -6 = no data received, this is Ok.
|
||||
* -7 = icmp parameter problem.
|
||||
* Process received data on ping socket
|
||||
*/
|
||||
int ping_receive(struct in_addr addr)
|
||||
void ping_receive(char *buf, int len)
|
||||
{
|
||||
char buf[1024];
|
||||
int rc, len;
|
||||
struct sockaddr_in ffrom;
|
||||
struct icmphdr icmpp;
|
||||
struct iphdr iph;
|
||||
socklen_t sl;
|
||||
struct pollfd pfd;
|
||||
int reply;
|
||||
|
||||
pfd.fd = ping_isocket;
|
||||
pfd.events = POLLIN;
|
||||
pfd.revents = 0;
|
||||
|
||||
/*
|
||||
* 100 mSec is enough, this function is called at regular intervals.
|
||||
*/
|
||||
if ((rc = poll(&pfd, 1, 100) < 0)) {
|
||||
if (icmp_errs < ICMP_MAX_ERRS)
|
||||
Syslog('?', "$poll/select failed");
|
||||
return -3;
|
||||
}
|
||||
|
||||
if (pfd.revents & POLLIN || pfd.revents & POLLERR || pfd.revents & POLLHUP || pfd.revents & POLLNVAL) {
|
||||
sl = sizeof(ffrom);
|
||||
if ((len = recvfrom(ping_isocket, &buf, sizeof(buf)-1, 0,(struct sockaddr *)&ffrom, &sl)) != -1) {
|
||||
if (len > sizeof(struct iphdr)) {
|
||||
memcpy(&iph, buf, sizeof(iph));
|
||||
if (len - iph.ip_hl * 4 >= ICMP_BASEHDR_LEN) {
|
||||
memcpy(&icmpp, ((uint32_t *)buf)+iph.ip_hl, sizeof(icmpp));
|
||||
if (iph.ip_saddr == addr.s_addr && icmpp.icmp_type == ICMP_ECHOREPLY &&
|
||||
ntohs(icmpp.icmp_id) == id && ntohs(icmpp.icmp_seq) == p_sequence) {
|
||||
return 0;
|
||||
} else {
|
||||
/* No regular echo reply. Maybe an error? */
|
||||
if (icmp4_errcmp((char *)&icmpd, ICMP4_ECHO_LEN, &to.sin_addr, buf, len, ICMP_DEST_UNREACH))
|
||||
return -2;
|
||||
if (icmp4_errcmp((char *)&icmpd, ICMP4_ECHO_LEN, &to.sin_addr, buf, len, ICMP_TIME_EXCEEDED))
|
||||
return -4;
|
||||
#ifdef __linux__
|
||||
if (icmp4_errcmp((char *)&icmpd, ICMP4_ECHO_LEN, &to.sin_addr, buf, len, ICMP_PARAMETERPROB))
|
||||
return -7;
|
||||
#endif
|
||||
/*
|
||||
* No fatal problem, the return code will be -1 caused by other
|
||||
* icmp trafic on the network (packets not for us).
|
||||
*/
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
memcpy(&iph, buf, sizeof(iph));
|
||||
if (len - iph.ip_hl * 4 >= ICMP_BASEHDR_LEN) {
|
||||
memcpy(&icmpp, ((uint32_t *)buf)+iph.ip_hl, sizeof(icmpp));
|
||||
if (iph.ip_saddr == paddr.s_addr && icmpp.icmp_type == ICMP_ECHOREPLY &&
|
||||
ntohs(icmpp.icmp_id) == id && ntohs(icmpp.icmp_seq) == p_sequence) {
|
||||
/*
|
||||
* Good reply
|
||||
*/
|
||||
ping_rcvd = time(NULL);
|
||||
pingresult[pingnr - 1] = TRUE;
|
||||
reply = ((int)ping_rcvd - (int)ping_sent);
|
||||
if (reply > 10)
|
||||
Syslog('p', "Ping: got slow reply pingnr=%d to %s in %d seconds", pingnr, pingaddress, reply);
|
||||
return;
|
||||
} else {
|
||||
return -5; /* error */
|
||||
/* No regular echo reply. Maybe an error? */
|
||||
if (icmp4_errcmp((char *)&icmpd, ICMP4_ECHO_LEN, &to.sin_addr, buf, len, ICMP_DEST_UNREACH)) {
|
||||
Syslog('p', "Ping: got destination unreachable");
|
||||
return;
|
||||
}
|
||||
if (icmp4_errcmp((char *)&icmpd, ICMP4_ECHO_LEN, &to.sin_addr, buf, len, ICMP_TIME_EXCEEDED)) {
|
||||
Syslog('p', "Ping: got time exceeded");
|
||||
return;
|
||||
}
|
||||
#ifdef __linux__
|
||||
if (icmp4_errcmp((char *)&icmpd, ICMP4_ECHO_LEN, &to.sin_addr, buf, len, ICMP_PARAMETERPROB)) {
|
||||
Syslog('p', "Ping: got parameter problem");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* Received packet was not for us.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
}
|
||||
return -6; /* no answer */
|
||||
}
|
||||
|
||||
|
||||
@ -321,28 +303,32 @@ void init_pingsocket(void)
|
||||
if (ping_isocket == STDIN_FILENO || ping_isocket == STDOUT_FILENO || ping_isocket == STDERR_FILENO) {
|
||||
exit(MBERR_GENERAL);
|
||||
}
|
||||
|
||||
pingresult[0] = pingresult[1] = FALSE;
|
||||
ping_next = ping_sent = ping_rcvd = time(NULL);
|
||||
snprintf(pingaddress, 41, "N/A");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Ping thread
|
||||
* Called regular, but at least each second
|
||||
*/
|
||||
void *ping_thread(void *dummy)
|
||||
void check_ping(void)
|
||||
{
|
||||
int rc = 0;
|
||||
static int pingnr, pingresult[2];
|
||||
static char pingaddress[41];
|
||||
static time_t pingsend;
|
||||
time_t now;
|
||||
|
||||
Syslog('+', "Starting ping thread");
|
||||
pingresult[1] = pingresult[2] = FALSE;
|
||||
pingnr = 2;
|
||||
internet = FALSE;
|
||||
ping_run = TRUE;
|
||||
|
||||
while (! T_Shutdown) {
|
||||
// Syslog('p', "Ping: 1=%s 2=%s nr=%d", pingresult[0] ? "TRUE":"FALSE", pingresult[1] ? "TRUE":"FALSE", pingnr);
|
||||
now = time(NULL);
|
||||
if ((int)now >= (int)ping_next) {
|
||||
// Syslog('p', "Ping: time for next");
|
||||
/*
|
||||
* Was previous ping received?
|
||||
*/
|
||||
if (pingresult[pingnr - 1] == FALSE) {
|
||||
Syslog('p', "Ping: timeout to %s", pingaddress);
|
||||
}
|
||||
|
||||
/*
|
||||
* Select new address to ping
|
||||
@ -352,114 +338,74 @@ void *ping_thread(void *dummy)
|
||||
if (strlen(TCFG.isp_ping2)) {
|
||||
snprintf(pingaddress, 41, "%s", TCFG.isp_ping2);
|
||||
} else {
|
||||
pingresult[2] = FALSE;
|
||||
pingresult[1] = TRUE;
|
||||
}
|
||||
} else {
|
||||
pingnr = 1;
|
||||
if (strlen(TCFG.isp_ping1)) {
|
||||
snprintf(pingaddress, 41, "%s", TCFG.isp_ping1);
|
||||
} else {
|
||||
pingresult[1] = FALSE;
|
||||
pingresult[0] = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
// Syslog('p', "Ping: 1=%s 2=%s nr=%d", pingresult[0] ? "TRUE":"FALSE", pingresult[1] ? "TRUE":"FALSE", pingnr);
|
||||
|
||||
ping_next = (time_t)(now + 20);
|
||||
|
||||
if (inet_aton(pingaddress, &paddr)) {
|
||||
pingresult[pingnr - 1] = FALSE;
|
||||
rc = ping_send(paddr);
|
||||
// Syslog('p', "Ping: %d sent to %s rc=%d", pingnr, pingaddress, rc);
|
||||
if (rc) {
|
||||
if (icmp_errs++ < ICMP_MAX_ERRS)
|
||||
Syslog('?', "ping: to %s rc=%d", pingaddress, rc);
|
||||
pingresult[pingnr] = FALSE;
|
||||
now = time(NULL) + 10;
|
||||
|
||||
while ((! T_Shutdown) && (time(NULL) < now)) {
|
||||
sleep(1);
|
||||
}
|
||||
if (T_Shutdown)
|
||||
break;
|
||||
} else {
|
||||
pingsend = time(NULL);
|
||||
|
||||
while (TRUE) {
|
||||
if (T_Shutdown)
|
||||
break;
|
||||
|
||||
if (time(NULL) >= (pingsend + 20)) {
|
||||
pingresult[pingnr] = FALSE;
|
||||
if (icmp_errs < ICMP_MAX_ERRS)
|
||||
Syslog('?', "ping: to %s timeout", pingaddress);
|
||||
break;
|
||||
} else {
|
||||
/*
|
||||
* Quickly eat all packets not for us, we only want our
|
||||
* packets and empty results (packet still underway).
|
||||
*/
|
||||
while ((rc = ping_receive(paddr)) == -1);
|
||||
if (!rc) {
|
||||
/*
|
||||
* Reply received.
|
||||
*/
|
||||
rc = time(NULL) - pingsend;
|
||||
if (rc > 10)
|
||||
Syslog('+', "Ping: slow reply after %d seconds", rc);
|
||||
pingresult[pingnr] = TRUE;
|
||||
now = time(NULL) + 20 - rc;
|
||||
while ((! T_Shutdown) && (time(NULL) < now)) {
|
||||
sleep(1);
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
if (rc != -6) {
|
||||
Syslog('p', "ping: recv %s id=%d rc=%d", pingaddress, id, rc);
|
||||
pingresult[pingnr] = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
} /* while TRUE */
|
||||
}
|
||||
} else {
|
||||
if (icmp_errs++ < ICMP_MAX_ERRS)
|
||||
Syslog('?', "Ping address %d is invalid \"%s\"", pingnr, pingaddress);
|
||||
now = time(NULL) + 10;
|
||||
while ((! T_Shutdown) && (time(NULL) < now)) {
|
||||
sleep(1);
|
||||
}
|
||||
}
|
||||
|
||||
if (T_Shutdown)
|
||||
break;
|
||||
|
||||
/*
|
||||
* Evaluate the result of the ping test
|
||||
*/
|
||||
if (pingresult[1] == FALSE && pingresult[2] == FALSE) {
|
||||
icmp_errs++;
|
||||
if (internet) {
|
||||
Syslog('!', "Internet connection is down");
|
||||
internet = FALSE;
|
||||
sem_set((char *)"scanout", TRUE);
|
||||
RemoveSema((char *)"is_inet");
|
||||
rescan = TRUE;
|
||||
}
|
||||
} else {
|
||||
icmp_errs = 0;
|
||||
if (!internet) {
|
||||
Syslog('!', "Internet connection is up");
|
||||
internet = TRUE;
|
||||
sem_set((char *)"scanout", TRUE);
|
||||
CreateSema((char *)"is_inet");
|
||||
rescan = TRUE;
|
||||
ping_sent = now;
|
||||
pingresult[pingnr - 1] = FALSE;
|
||||
// Syslog('p', "Ping: 1=%s 2=%s nr=%d", pingresult[0] ? "TRUE":"FALSE", pingresult[1] ? "TRUE":"FALSE", pingnr);
|
||||
return; // Don't check right after send
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Syslog('p', "Ping: 1=%s 2=%s nr=%d", pingresult[0] ? "TRUE":"FALSE", pingresult[1] ? "TRUE":"FALSE", pingnr);
|
||||
/*
|
||||
* Evaluate the result of the ping test
|
||||
*/
|
||||
if ((pingresult[0] == FALSE) && (pingresult[1] == FALSE)) {
|
||||
icmp_errs++;
|
||||
if (internet) {
|
||||
Syslog('!', "Internet connection is down");
|
||||
internet = FALSE;
|
||||
sem_set((char *)"scanout", TRUE);
|
||||
RemoveSema((char *)"is_inet");
|
||||
rescan = TRUE;
|
||||
}
|
||||
} else {
|
||||
icmp_errs = 0;
|
||||
if (!internet) {
|
||||
Syslog('!', "Internet connection is up");
|
||||
internet = TRUE;
|
||||
sem_set((char *)"scanout", TRUE);
|
||||
CreateSema((char *)"is_inet");
|
||||
rescan = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void deinit_ping(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if ((rc = close(ping_isocket))) {
|
||||
WriteError("$ping thread error socket close");
|
||||
}
|
||||
ping_isocket = -1;
|
||||
|
||||
ping_run = FALSE;
|
||||
Syslog('+', "Ping thread stopped");
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
|
||||
|
@ -10,7 +10,9 @@
|
||||
#define ICMP_MAX_ERRS 5
|
||||
#define SET_SOCKA_LEN4(socka)
|
||||
|
||||
void init_pingsocket(void);
|
||||
void *ping_thread(void*);
|
||||
void init_pingsocket(void);
|
||||
void ping_receive(char *, int);
|
||||
void check_ping(void);
|
||||
void deinit_ping(void);
|
||||
|
||||
#endif
|
||||
|
@ -76,6 +76,7 @@ extern int srvchg;
|
||||
/*
|
||||
* Prototypes
|
||||
*/
|
||||
void Chatlog(char *, char *, char *);
|
||||
void chat_dump(void);
|
||||
void system_msg(pid_t, char *);
|
||||
void chat_help(pid_t, int);
|
||||
@ -129,7 +130,6 @@ void system_msg(pid_t pid, char *msg)
|
||||
else
|
||||
buffer_head = 0;
|
||||
|
||||
// Syslog('c', "system_msg(%d, %s) ptr=%d", pid, msg, buffer_head);
|
||||
memset(&chat_messages[buffer_head], 0, sizeof(_chat_messages));
|
||||
chat_messages[buffer_head].topid = pid;
|
||||
snprintf(chat_messages[buffer_head].fromname, 36, "Server");
|
||||
@ -207,11 +207,8 @@ int join(pid_t pid, char *channel, int sysop)
|
||||
for (tmpu = users; tmpu; tmpu = tmpu->next) {
|
||||
if (tmpu->pid == pid) {
|
||||
|
||||
if (! lock_ibc((char *)"join 1")) {
|
||||
strncpy(tmpu->channel, channel, 20);
|
||||
tmp->users++;
|
||||
unlock_ibc((char *)"join 1");
|
||||
}
|
||||
strncpy(tmpu->channel, channel, 20);
|
||||
tmp->users++;
|
||||
Syslog('+', "IBC: user %s has joined channel %s", tmpu->nick, channel);
|
||||
usrchg = TRUE;
|
||||
srvchg = TRUE;
|
||||
@ -249,10 +246,7 @@ int join(pid_t pid, char *channel, int sysop)
|
||||
if (tmpu->pid == pid) {
|
||||
if (add_channel(&channels, channel, tmpu->nick, CFG.myfqdn) == 0) {
|
||||
|
||||
if (! lock_ibc((char *)"join 2")) {
|
||||
strncpy(tmpu->channel, channel, 20);
|
||||
unlock_ibc((char *)"join 2");
|
||||
}
|
||||
strncpy(tmpu->channel, channel, 20);
|
||||
Syslog('+', "IBC: user %s created and joined channel %s", tmpu->nick, channel);
|
||||
usrchg = TRUE;
|
||||
chnchg = TRUE;
|
||||
@ -318,11 +312,8 @@ int part(pid_t pid, char *reason)
|
||||
/*
|
||||
* Clean channel
|
||||
*/
|
||||
if (! lock_ibc((char *)"part 1")) {
|
||||
if (tmp->users > 0)
|
||||
tmp->users--;
|
||||
unlock_ibc((char *)"part 1");
|
||||
}
|
||||
if (tmp->users > 0)
|
||||
tmp->users--;
|
||||
Syslog('+', "IBC: nick %s leaves channel %s, %d user left", tmpu->nick, tmp->name, tmp->users);
|
||||
if (tmp->users == 0) {
|
||||
/*
|
||||
@ -337,10 +328,7 @@ int part(pid_t pid, char *reason)
|
||||
/*
|
||||
* Update user data
|
||||
*/
|
||||
if (! lock_ibc((char *)"part 2")) {
|
||||
tmpu->channel[0] = '\0';
|
||||
unlock_ibc((char *)"part 2");
|
||||
}
|
||||
tmpu->channel[0] = '\0';
|
||||
usrchg = TRUE;
|
||||
chnchg = TRUE;
|
||||
srvchg = TRUE;
|
||||
@ -436,12 +424,9 @@ void chat_connect_r(char *data, char *buf)
|
||||
/*
|
||||
* Oke, found
|
||||
*/
|
||||
if (! lock_ibc((char *)"chat_connect")) {
|
||||
tmpu->pid = atoi(pid);
|
||||
tmpu->pointer = buffer_head;
|
||||
tmpu->sysop = sys;
|
||||
unlock_ibc((char *)"chat_connect");
|
||||
}
|
||||
tmpu->pid = atoi(pid);
|
||||
tmpu->pointer = buffer_head;
|
||||
tmpu->sysop = sys;
|
||||
usrchg = TRUE;
|
||||
srvchg = TRUE;
|
||||
Syslog('c', "Connected user %s (%s) with chatserver, sysop %s", realname, pid, sys ? "True":"False");
|
||||
@ -500,6 +485,7 @@ void chat_close_r(char *data, char *buf)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Syslog('c', "Pid %s was not connected to chatserver");
|
||||
snprintf(buf, 81, "100:1,*** ERROR - Not connected to server;");
|
||||
return;
|
||||
@ -810,15 +796,16 @@ void chat_checksysop_r(char *data, char *buf)
|
||||
pid = strtok(data, ",");
|
||||
pid = strtok(NULL, ";");
|
||||
|
||||
|
||||
if (reg_ispaging(pid)) {
|
||||
Syslog('c', "Check sysopchat for pid %s, user has paged", pid);
|
||||
|
||||
/*
|
||||
* Now check if sysop is present in the sysop channel
|
||||
*/
|
||||
for (tmpu = users; tmpu; tmpu = tmpu->next) {
|
||||
/*
|
||||
* Now check if sysop is present in the sysop channel
|
||||
*/
|
||||
for (tmpu = users; tmpu; tmpu = tmpu->next) {
|
||||
if (atoi(pid) != tmpu->pid) {
|
||||
if (strlen(tmpu->channel) && (strcasecmp(tmpu->channel, "#sysop") == 0) && tmpu->sysop) {
|
||||
if (strlen(tmpu->channel) && (strcasecmp(tmpu->channel, "#sysop") == 0) && tmpu->sysop) {
|
||||
Syslog('c', "Sending ACK on check");
|
||||
snprintf(buf, 20, "100:1,1;");
|
||||
reg_sysoptalk(pid);
|
||||
|
@ -3,7 +3,6 @@
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
void Chatlog(char *, char *, char *);
|
||||
void chat_msg(char *, char *, char *);
|
||||
void system_shout(const char *, ...);
|
||||
void chat_init(void);
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include "taskutil.h"
|
||||
#include "taskchat.h"
|
||||
#include "taskcomm.h"
|
||||
#include "taskibc.h"
|
||||
|
||||
|
||||
extern int oserr; /* Copy of Unix error */
|
||||
@ -45,8 +46,6 @@ extern struct sockaddr_un from; /* From socket address */
|
||||
extern int fromlen; /* From address length */
|
||||
extern int logtrans; /* Log transactions */
|
||||
extern int T_Shutdown; /* Program shutdown */
|
||||
extern int ibc_run; /* Chatserver running */
|
||||
int cmd_run = FALSE;/* cmd running */
|
||||
|
||||
|
||||
|
||||
@ -288,12 +287,8 @@ char *exe_cmd(char *in)
|
||||
* 100:0; Ok
|
||||
*/
|
||||
if (strncmp(cmd, "CPAG", 4) == 0) {
|
||||
if (ibc_run) {
|
||||
if ((result = reg_page(token))) {
|
||||
snprintf(obuf, SS_BUFSIZE, "100:1,%d;", result);
|
||||
}
|
||||
} else {
|
||||
snprintf(obuf, SS_BUFSIZE, "100:1,3;");
|
||||
if ((result = reg_page(token))) {
|
||||
snprintf(obuf, SS_BUFSIZE, "100:1,%d;", result);
|
||||
}
|
||||
Syslog('+', "%s", obuf);
|
||||
return obuf;
|
||||
@ -347,15 +342,11 @@ char *exe_cmd(char *in)
|
||||
* 100:0; Ok
|
||||
*/
|
||||
if (strncmp(cmd, "CCON", 4) == 0) {
|
||||
if (ibc_run) {
|
||||
buf = calloc(SS_BUFSIZE, sizeof(char));
|
||||
chat_connect_r(token, buf);
|
||||
snprintf(obuf, SS_BUFSIZE, "%s", buf);
|
||||
free(buf);
|
||||
return obuf;
|
||||
} else {
|
||||
return ebuf;
|
||||
}
|
||||
buf = calloc(SS_BUFSIZE, sizeof(char));
|
||||
chat_connect_r(token, buf);
|
||||
snprintf(obuf, SS_BUFSIZE, "%s", buf);
|
||||
free(buf);
|
||||
return obuf;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -668,7 +659,6 @@ char *exe_cmd(char *in)
|
||||
|
||||
|
||||
|
||||
void do_cmd(char *);
|
||||
void do_cmd(char *cmd)
|
||||
{
|
||||
char buf[SS_BUFSIZE];
|
||||
@ -696,58 +686,3 @@ void do_cmd(char *cmd)
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Thread that reads the command socket for new commands.
|
||||
*/
|
||||
void *cmd_thread(void)
|
||||
{
|
||||
int rlen, rc;
|
||||
struct pollfd pfd;
|
||||
static char buf[2048];
|
||||
|
||||
Syslog('+', "Starting cmd thread");
|
||||
cmd_run = TRUE;
|
||||
|
||||
while (! T_Shutdown) {
|
||||
/*
|
||||
* Poll UNIX Datagram socket until the defined timeout of one second.
|
||||
* This means we listen of a MBSE BBS client program has something
|
||||
* to tell.
|
||||
*/
|
||||
pfd.fd = sock;
|
||||
pfd.events = POLLIN;
|
||||
pfd.revents = 0;
|
||||
rc = poll(&pfd, 1, 1000);
|
||||
if (rc == -1) {
|
||||
/*
|
||||
* Poll can be interrupted by a finished child so that's not a real error.
|
||||
*/
|
||||
if (errno != EINTR) {
|
||||
Syslog('?', "$poll() rc=%d sock=%d, events=%04x", rc, sock, pfd.revents);
|
||||
}
|
||||
} else if (rc) {
|
||||
if (pfd.revents & POLLIN) {
|
||||
/*
|
||||
* Process the clients request
|
||||
*/
|
||||
memset(&buf, 0, sizeof(buf));
|
||||
fromlen = sizeof(from);
|
||||
rlen = recvfrom(sock, buf, sizeof(buf) -1, 0, (struct sockaddr *)&from, &fromlen);
|
||||
if (rlen == -1) {
|
||||
Syslog('?', "$recvfrom()");
|
||||
} else {
|
||||
do_cmd(buf);
|
||||
}
|
||||
} else {
|
||||
Syslog('-', "Return poll rc=%d, events=%04x", rc, pfd.revents);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cmd_run = FALSE;
|
||||
Syslog('+', "Cmd thread stopped");
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
void *cmd_thread(void);
|
||||
void do_cmd(char *);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -44,14 +44,10 @@ typedef struct _mfs_list {
|
||||
} mfs_list;
|
||||
|
||||
mfs_list *mfs = NULL; /* List of filesystems */
|
||||
int disk_reread = FALSE; /* Reread tables */
|
||||
extern int T_Shutdown; /* Program shutdown */
|
||||
int disk_run = FALSE; /* Thread running */
|
||||
int disk_reread = TRUE; /* Reread tables */
|
||||
int recursecount = 0; /* Recurse counter */
|
||||
|
||||
|
||||
pthread_mutex_t a_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
|
||||
/*
|
||||
* Internal prototypes
|
||||
@ -250,7 +246,6 @@ void disk_check_r(char *token, char *buf)
|
||||
{
|
||||
mfs_list *tmp;
|
||||
unsigned int needed, lowest = 0xffffffff;
|
||||
int rc;
|
||||
|
||||
strtok(token, ",");
|
||||
needed = atol(strtok(NULL, ";"));
|
||||
@ -263,17 +258,11 @@ void disk_check_r(char *token, char *buf)
|
||||
return;
|
||||
}
|
||||
|
||||
if ((rc = pthread_mutex_lock(&a_mutex)))
|
||||
Syslog('!', "disk_check() mutex_lock failed rc=%d", rc);
|
||||
|
||||
for (tmp = mfs; tmp; tmp = tmp->next) {
|
||||
if (!tmp->ro && (tmp->avail < lowest))
|
||||
lowest = tmp->avail;
|
||||
}
|
||||
|
||||
if ((rc = pthread_mutex_unlock(&a_mutex)))
|
||||
Syslog('!', "disk_check() mutex_unlock failed rc=%d", rc);
|
||||
|
||||
if (lowest < needed) {
|
||||
snprintf(buf, SS_BUFSIZE, "100:2,0,%d;", lowest);
|
||||
} else {
|
||||
@ -292,7 +281,7 @@ void disk_getfs_r(char *buf)
|
||||
{
|
||||
char tt[80], *ans = NULL;
|
||||
mfs_list *tmp;
|
||||
int rc, i = 0;
|
||||
int i = 0;
|
||||
|
||||
buf[0] = '\0';
|
||||
if (mfs == NULL) {
|
||||
@ -300,9 +289,6 @@ void disk_getfs_r(char *buf)
|
||||
return;
|
||||
}
|
||||
|
||||
if ((rc = pthread_mutex_lock(&a_mutex)))
|
||||
Syslog('!', "disk_getfs() mutex_lock failed rc=%d", rc);
|
||||
|
||||
for (tmp = mfs; tmp; tmp = tmp->next) {
|
||||
i++;
|
||||
if (ans == NULL)
|
||||
@ -315,8 +301,6 @@ void disk_getfs_r(char *buf)
|
||||
if (i == 10) /* No more then 10 filesystems */
|
||||
break;
|
||||
}
|
||||
if ((rc = pthread_mutex_unlock(&a_mutex)))
|
||||
Syslog('!', "disk_getfs() mutex_unlock failed rc=%d", rc);
|
||||
|
||||
if (strlen(ans) > (SS_BUFSIZE - 8))
|
||||
snprintf(buf, SS_BUFSIZE, "100:0;");
|
||||
@ -333,7 +317,7 @@ void disk_getfs_r(char *buf)
|
||||
|
||||
|
||||
/*
|
||||
* Update disk useage status. The calling function must lock the mutex!
|
||||
* Update disk useage status.
|
||||
*/
|
||||
void update_diskstat(void)
|
||||
{
|
||||
@ -473,221 +457,172 @@ void add_path(char *lpath)
|
||||
|
||||
|
||||
/*
|
||||
* Diskwatch thread
|
||||
* Diskwatch
|
||||
*/
|
||||
void *disk_thread(void)
|
||||
void diskwatch(void)
|
||||
{
|
||||
FILE *fp;
|
||||
char *temp = NULL;
|
||||
mfs_list *tmp;
|
||||
int rc;
|
||||
|
||||
Syslog('+', "Start disk thread");
|
||||
disk_run = TRUE;
|
||||
disk_reread = TRUE;
|
||||
|
||||
while (! T_Shutdown) {
|
||||
if (disk_reread) {
|
||||
disk_reread = FALSE;
|
||||
Syslog('+', "Reread disk filesystems");
|
||||
|
||||
if (disk_reread) {
|
||||
disk_reread = FALSE;
|
||||
Syslog('+', "Reread disk filesystems");
|
||||
tidy_mfslist(&mfs);
|
||||
|
||||
if ((rc = pthread_mutex_lock(&a_mutex)))
|
||||
Syslog('!', "disk_thread() mutex_lock failed rc=%d", rc);
|
||||
|
||||
tidy_mfslist(&mfs);
|
||||
|
||||
add_path(getenv("MBSE_ROOT"));
|
||||
add_path(CFG.bbs_menus);
|
||||
add_path(CFG.bbs_txtfiles);
|
||||
add_path(CFG.alists_path);
|
||||
add_path(CFG.req_magic);
|
||||
add_path(CFG.bbs_usersdir);
|
||||
add_path(CFG.nodelists);
|
||||
add_path(CFG.inbound);
|
||||
add_path(CFG.pinbound);
|
||||
add_path(CFG.outbound);
|
||||
add_path(CFG.ftp_base);
|
||||
add_path(CFG.bbs_macros);
|
||||
add_path(CFG.out_queue);
|
||||
add_path(CFG.rulesdir);
|
||||
add_path(CFG.tmailshort);
|
||||
add_path(CFG.tmaillong);
|
||||
add_path(getenv("MBSE_ROOT"));
|
||||
add_path(CFG.bbs_menus);
|
||||
add_path(CFG.bbs_txtfiles);
|
||||
add_path(CFG.alists_path);
|
||||
add_path(CFG.req_magic);
|
||||
add_path(CFG.bbs_usersdir);
|
||||
add_path(CFG.nodelists);
|
||||
add_path(CFG.inbound);
|
||||
add_path(CFG.pinbound);
|
||||
add_path(CFG.outbound);
|
||||
add_path(CFG.ftp_base);
|
||||
add_path(CFG.bbs_macros);
|
||||
add_path(CFG.out_queue);
|
||||
add_path(CFG.rulesdir);
|
||||
add_path(CFG.tmailshort);
|
||||
add_path(CFG.tmaillong);
|
||||
|
||||
temp = calloc(PATH_MAX, sizeof(char ));
|
||||
snprintf(temp, PATH_MAX, "%s/etc/fareas.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&areahdr, sizeof(areahdr), 1, fp);
|
||||
fseek(fp, areahdr.hdrsize, SEEK_SET);
|
||||
temp = calloc(PATH_MAX, sizeof(char ));
|
||||
snprintf(temp, PATH_MAX, "%s/etc/fareas.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&areahdr, sizeof(areahdr), 1, fp);
|
||||
fseek(fp, areahdr.hdrsize, SEEK_SET);
|
||||
|
||||
while (fread(&area, areahdr.recsize, 1, fp)) {
|
||||
if (area.Available) {
|
||||
add_path(area.Path);
|
||||
}
|
||||
while (fread(&area, areahdr.recsize, 1, fp)) {
|
||||
if (area.Available) {
|
||||
add_path(area.Path);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
if (T_Shutdown)
|
||||
break;
|
||||
|
||||
snprintf(temp, PATH_MAX, "%s/etc/mareas.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&msgshdr, sizeof(msgshdr), 1, fp);
|
||||
fseek(fp, msgshdr.hdrsize, SEEK_SET);
|
||||
|
||||
while (fread(&msgs, msgshdr.recsize, 1, fp)) {
|
||||
if (msgs.Active)
|
||||
add_path(msgs.Base);
|
||||
fseek(fp, msgshdr.syssize, SEEK_CUR);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
if (T_Shutdown)
|
||||
break;
|
||||
|
||||
snprintf(temp, PATH_MAX, "%s/etc/language.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&langhdr, sizeof(langhdr), 1, fp);
|
||||
fseek(fp, langhdr.hdrsize, SEEK_SET);
|
||||
|
||||
while (fread(&lang, langhdr.recsize, 1, fp)) {
|
||||
if (lang.Available) {
|
||||
add_path(lang.MenuPath);
|
||||
add_path(lang.TextPath);
|
||||
add_path(lang.MacroPath);
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
if (T_Shutdown)
|
||||
break;
|
||||
|
||||
snprintf(temp, PATH_MAX, "%s/etc/nodes.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&nodeshdr, sizeof(nodeshdr), 1, fp);
|
||||
fseek(fp, nodeshdr.hdrsize, SEEK_SET);
|
||||
|
||||
while (fread(&nodes, nodeshdr.recsize, 1, fp)) {
|
||||
if (nodes.Session_in == S_DIR)
|
||||
add_path(nodes.Dir_in_path);
|
||||
if (nodes.Session_out == S_DIR)
|
||||
add_path(nodes.Dir_out_path);
|
||||
add_path(nodes.OutBox);
|
||||
fseek(fp, nodeshdr.filegrp + nodeshdr.mailgrp, SEEK_CUR);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
if (T_Shutdown)
|
||||
break;
|
||||
|
||||
snprintf(temp, PATH_MAX, "%s/etc/fgroups.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&fgrouphdr, sizeof(fgrouphdr), 1, fp);
|
||||
fseek(fp, fgrouphdr.hdrsize, SEEK_SET);
|
||||
|
||||
while (fread(&fgroup, fgrouphdr.recsize, 1, fp)) {
|
||||
if (fgroup.Active)
|
||||
add_path(fgroup.BasePath);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
if (T_Shutdown)
|
||||
break;
|
||||
|
||||
snprintf(temp, PATH_MAX, "%s/etc/mgroups.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&mgrouphdr, sizeof(mgrouphdr), 1, fp);
|
||||
fseek(fp, mgrouphdr.hdrsize, SEEK_SET);
|
||||
|
||||
while (fread(&mgroup, mgrouphdr.recsize, 1, fp)) {
|
||||
if (mgroup.Active)
|
||||
add_path(mgroup.BasePath);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
if (T_Shutdown)
|
||||
break;
|
||||
|
||||
snprintf(temp, PATH_MAX, "%s/etc/hatch.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&hatchhdr, sizeof(hatchhdr), 1, fp);
|
||||
fseek(fp, hatchhdr.hdrsize, SEEK_SET);
|
||||
|
||||
while (fread(&hatch, hatchhdr.recsize, 1, fp)) {
|
||||
if (hatch.Active)
|
||||
add_path(hatch.Spec);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
if (T_Shutdown)
|
||||
break;
|
||||
|
||||
snprintf(temp, PATH_MAX, "%s/etc/magic.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&magichdr, sizeof(magichdr), 1, fp);
|
||||
fseek(fp, magichdr.hdrsize, SEEK_SET);
|
||||
|
||||
while (fread(&magic, magichdr.recsize, 1, fp)) {
|
||||
if (magic.Active && ((magic.Attrib == MG_COPY) || (magic.Attrib == MG_UNPACK)))
|
||||
add_path(magic.Path);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
free(temp);
|
||||
temp = NULL;
|
||||
Syslog('d', "All directories added");
|
||||
|
||||
/*
|
||||
* Now update the new table with filesystems information. This must
|
||||
* be done before we unlock the mutex so that waiting clients get
|
||||
* usefull information.
|
||||
*/
|
||||
update_diskstat();
|
||||
for (tmp = mfs; tmp; tmp = tmp->next) {
|
||||
Syslog('+', "Found filesystem: %s type: %s status: %s", tmp->mountpoint, tmp->fstype, tmp->ro ?"RO":"RW");
|
||||
}
|
||||
|
||||
if ((rc = pthread_mutex_unlock(&a_mutex)))
|
||||
Syslog('!', "disk_thread() mutex_unlock failed rc=%d", rc);
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
if ((rc = pthread_mutex_lock(&a_mutex)))
|
||||
Syslog('!', "disk_thread() mutex_lock failed rc=%d", rc);
|
||||
|
||||
update_diskstat();
|
||||
snprintf(temp, PATH_MAX, "%s/etc/mareas.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&msgshdr, sizeof(msgshdr), 1, fp);
|
||||
fseek(fp, msgshdr.hdrsize, SEEK_SET);
|
||||
|
||||
if ((rc = pthread_mutex_unlock(&a_mutex)))
|
||||
Syslog('!', "disk_thread() mutex_unlock failed rc=%d", rc);
|
||||
while (fread(&msgs, msgshdr.recsize, 1, fp)) {
|
||||
if (msgs.Active)
|
||||
add_path(msgs.Base);
|
||||
fseek(fp, msgshdr.syssize, SEEK_CUR);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
sleep(1);
|
||||
snprintf(temp, PATH_MAX, "%s/etc/language.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&langhdr, sizeof(langhdr), 1, fp);
|
||||
fseek(fp, langhdr.hdrsize, SEEK_SET);
|
||||
|
||||
while (fread(&lang, langhdr.recsize, 1, fp)) {
|
||||
if (lang.Available) {
|
||||
add_path(lang.MenuPath);
|
||||
add_path(lang.TextPath);
|
||||
add_path(lang.MacroPath);
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
snprintf(temp, PATH_MAX, "%s/etc/nodes.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&nodeshdr, sizeof(nodeshdr), 1, fp);
|
||||
fseek(fp, nodeshdr.hdrsize, SEEK_SET);
|
||||
|
||||
while (fread(&nodes, nodeshdr.recsize, 1, fp)) {
|
||||
if (nodes.Session_in == S_DIR)
|
||||
add_path(nodes.Dir_in_path);
|
||||
if (nodes.Session_out == S_DIR)
|
||||
add_path(nodes.Dir_out_path);
|
||||
add_path(nodes.OutBox);
|
||||
fseek(fp, nodeshdr.filegrp + nodeshdr.mailgrp, SEEK_CUR);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
snprintf(temp, PATH_MAX, "%s/etc/fgroups.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&fgrouphdr, sizeof(fgrouphdr), 1, fp);
|
||||
fseek(fp, fgrouphdr.hdrsize, SEEK_SET);
|
||||
|
||||
while (fread(&fgroup, fgrouphdr.recsize, 1, fp)) {
|
||||
if (fgroup.Active)
|
||||
add_path(fgroup.BasePath);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
snprintf(temp, PATH_MAX, "%s/etc/mgroups.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&mgrouphdr, sizeof(mgrouphdr), 1, fp);
|
||||
fseek(fp, mgrouphdr.hdrsize, SEEK_SET);
|
||||
|
||||
while (fread(&mgroup, mgrouphdr.recsize, 1, fp)) {
|
||||
if (mgroup.Active)
|
||||
add_path(mgroup.BasePath);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
snprintf(temp, PATH_MAX, "%s/etc/hatch.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&hatchhdr, sizeof(hatchhdr), 1, fp);
|
||||
fseek(fp, hatchhdr.hdrsize, SEEK_SET);
|
||||
|
||||
while (fread(&hatch, hatchhdr.recsize, 1, fp)) {
|
||||
if (hatch.Active)
|
||||
add_path(hatch.Spec);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
snprintf(temp, PATH_MAX, "%s/etc/magic.data", getenv("MBSE_ROOT"));
|
||||
if ((fp = fopen(temp, "r"))) {
|
||||
Syslog('d', "+ %s", temp);
|
||||
fread(&magichdr, sizeof(magichdr), 1, fp);
|
||||
fseek(fp, magichdr.hdrsize, SEEK_SET);
|
||||
|
||||
while (fread(&magic, magichdr.recsize, 1, fp)) {
|
||||
if (magic.Active && ((magic.Attrib == MG_COPY) || (magic.Attrib == MG_UNPACK)))
|
||||
add_path(magic.Path);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
free(temp);
|
||||
temp = NULL;
|
||||
Syslog('d', "All directories added");
|
||||
|
||||
/*
|
||||
* Now update the new table with filesystems information.
|
||||
*/
|
||||
update_diskstat();
|
||||
for (tmp = mfs; tmp; tmp = tmp->next) {
|
||||
Syslog('+', "Found filesystem: %s type: %s status: %s", tmp->mountpoint, tmp->fstype, tmp->ro ?"RO":"RW");
|
||||
}
|
||||
}
|
||||
|
||||
tidy_mfslist(&mfs);
|
||||
if (temp)
|
||||
free(temp);
|
||||
temp = NULL;
|
||||
disk_run = FALSE;
|
||||
Syslog('+', "Disk thread stopped");
|
||||
pthread_exit(NULL);
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
return NULL;
|
||||
#endif
|
||||
update_diskstat();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void deinit_diskwatch()
|
||||
{
|
||||
Syslog('d', "De-init diskwatch done");
|
||||
tidy_mfslist(&mfs);
|
||||
}
|
||||
|
||||
|
||||
|
@ -6,6 +6,7 @@
|
||||
char *disk_reset(void); /* Reset disk tables */
|
||||
void disk_check_r(char *, char *); /* Check space in Megabytes */
|
||||
void disk_getfs_r(char *); /* Get disk status */
|
||||
void *disk_thread(void); /* Disk watch thread */
|
||||
void diskwatch(void); /* Diskwatch */
|
||||
void deinit_diskwatch(void); /* Release memory */
|
||||
|
||||
#endif
|
||||
|
436
mbtask/taskibc.c
436
mbtask/taskibc.c
@ -38,8 +38,6 @@
|
||||
|
||||
|
||||
|
||||
int ibc_run = FALSE; /* Thread running */
|
||||
extern int T_Shutdown; /* Program shutdown */
|
||||
extern int internet; /* Internet status */
|
||||
time_t scfg_time = (time_t)0; /* Servers config time */
|
||||
time_t now; /* Current time */
|
||||
@ -49,10 +47,6 @@ usr_list *users = NULL; /* Active users */
|
||||
chn_list *channels = NULL; /* Active channels */
|
||||
ban_list *banned = NULL; /* Banned users */
|
||||
nick_list *nicknames = NULL; /* Known nicknames */
|
||||
int ls; /* Listen socket */
|
||||
struct sockaddr_in myaddr_in; /* Listen socket address */
|
||||
struct sockaddr_in clientaddr_in; /* Remote socket address */
|
||||
char crbuf[512]; /* Chat receive buffer */
|
||||
int callchg = FALSE; /* Is call state changed */
|
||||
int srvchg = FALSE; /* Is serverlist changed */
|
||||
int usrchg = FALSE; /* Is userlist changed */
|
||||
@ -62,14 +56,10 @@ int nickchg = FALSE; /* Is nicknames changed */
|
||||
time_t resettime; /* Time to reset all */
|
||||
int do_reset = FALSE; /* Reset init */
|
||||
int link_reset = FALSE; /* Reset one link */
|
||||
int is_locked = FALSE; /* Is mutex locked */
|
||||
|
||||
extern struct sockaddr_in clientaddr_in; /* IBC remote socket */
|
||||
|
||||
|
||||
#define PING_PONG_LOG 1
|
||||
pthread_mutex_t b_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
|
||||
|
||||
typedef enum {NCS_INIT, NCS_CALL, NCS_WAITPWD, NCS_CONNECT, NCS_HANGUP, NCS_FAIL, NCS_DEAD} NCSTYPE;
|
||||
|
||||
@ -111,43 +101,6 @@ int command_join(char *, char *);
|
||||
int command_part(char *, char *);
|
||||
int command_topic(char *, char *);
|
||||
int command_privmsg(char *, char *);
|
||||
void receiver(struct servent *);
|
||||
|
||||
|
||||
|
||||
int lock_ibc(char *func)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (is_locked) {
|
||||
WriteError("IBC: %s() mutex lock, already locked", func);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if ((rc = pthread_mutex_lock(&b_mutex))) {
|
||||
WriteError("$IBC: %s() mutex lock", func);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
is_locked = TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void unlock_ibc(char *func)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (!is_locked) {
|
||||
WriteError("IBC: %s() mutex unlock, was not locked", func);
|
||||
return;
|
||||
}
|
||||
is_locked = FALSE;
|
||||
|
||||
if ((rc = pthread_mutex_unlock(&b_mutex)))
|
||||
WriteError("$IBC: %s() mutex unlock", func);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -158,9 +111,6 @@ void fill_ncslist(ncs_list **fdp, char *server, char *myname, char *passwd, int
|
||||
{
|
||||
ncs_list *tmp, *ta;
|
||||
|
||||
if (lock_ibc((char *)"fill_ncslist"))
|
||||
return;
|
||||
|
||||
tmp = (ncs_list *)malloc(sizeof(ncs_list));
|
||||
memset(tmp, 0, sizeof(tmp));
|
||||
tmp->next = NULL;
|
||||
@ -191,8 +141,6 @@ void fill_ncslist(ncs_list **fdp, char *server, char *myname, char *passwd, int
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unlock_ibc((char *)"fill_ncslist");
|
||||
}
|
||||
|
||||
|
||||
@ -333,10 +281,6 @@ int add_user(usr_list **fap, char *server, char *name, char *realname)
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (lock_ibc((char *)"add_user")) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
tmp = (usr_list *)malloc(sizeof(usr_list));
|
||||
memset(tmp, 0, sizeof(usr_list));
|
||||
tmp->next = NULL;
|
||||
@ -364,7 +308,6 @@ int add_user(usr_list **fap, char *server, char *name, char *realname)
|
||||
}
|
||||
}
|
||||
|
||||
unlock_ibc((char *)"add_user");
|
||||
usrchg = TRUE;
|
||||
return 0;
|
||||
}
|
||||
@ -385,12 +328,6 @@ void del_user(usr_list **fap, char *server, char *name)
|
||||
if (*fap == NULL)
|
||||
return;
|
||||
|
||||
if (name) {
|
||||
if (lock_ibc((char *)"del_user")) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
tmp = fap;
|
||||
while (*tmp) {
|
||||
if (name && (strcmp((*tmp)->server, server) == 0) && (strcmp((*tmp)->name, name) == 0)) {
|
||||
@ -420,9 +357,6 @@ void del_user(usr_list **fap, char *server, char *name)
|
||||
srvchg = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (name)
|
||||
unlock_ibc((char *)"del_user");
|
||||
}
|
||||
|
||||
|
||||
@ -443,10 +377,6 @@ int add_channel(chn_list **fap, char *name, char *owner, char *server)
|
||||
}
|
||||
}
|
||||
|
||||
if (lock_ibc((char *)"add_channel")) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
tmp = (chn_list *)malloc(sizeof(chn_list));
|
||||
memset(tmp, 0, sizeof(chn_list));
|
||||
tmp->next = NULL;
|
||||
@ -467,7 +397,6 @@ int add_channel(chn_list **fap, char *name, char *owner, char *server)
|
||||
}
|
||||
}
|
||||
|
||||
unlock_ibc((char *)"add_channel");
|
||||
chnchg = TRUE;
|
||||
return 0;
|
||||
}
|
||||
@ -483,10 +412,6 @@ void del_channel(chn_list **fap, char *name)
|
||||
if (*fap == NULL)
|
||||
return;
|
||||
|
||||
if (lock_ibc((char *)"del_channel")) {
|
||||
return;
|
||||
}
|
||||
|
||||
tmp = fap;
|
||||
while (*tmp) {
|
||||
if (strcmp((*tmp)->name, name) == 0) {
|
||||
@ -498,8 +423,6 @@ void del_channel(chn_list **fap, char *name)
|
||||
tmp = &((*tmp)->next);
|
||||
}
|
||||
}
|
||||
|
||||
unlock_ibc((char *)"del_channel");
|
||||
}
|
||||
|
||||
|
||||
@ -534,10 +457,6 @@ int add_server(srv_list **fdp, char *name, int hops, char *prod, char *vers, ch
|
||||
}
|
||||
}
|
||||
|
||||
if (lock_ibc((char *)"add_server")) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
tmp = (srv_list *)malloc(sizeof(srv_list));
|
||||
memset(tmp, 0, sizeof(tmp));
|
||||
tmp->next = NULL;
|
||||
@ -561,7 +480,6 @@ int add_server(srv_list **fdp, char *name, int hops, char *prod, char *vers, ch
|
||||
}
|
||||
}
|
||||
|
||||
unlock_ibc((char *)"add_server");
|
||||
srvchg = TRUE;
|
||||
return 1;
|
||||
}
|
||||
@ -580,10 +498,6 @@ void del_server(srv_list **fap, char *name)
|
||||
if (*fap == NULL)
|
||||
return;
|
||||
|
||||
if (lock_ibc((char *)"del_server")) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (ta = *fap; ta; ta = ta->next) {
|
||||
while ((tan = ta->next) && (strcmp(tan->server, name) == 0)) {
|
||||
ta->next = tan->next;
|
||||
@ -592,8 +506,6 @@ void del_server(srv_list **fap, char *name)
|
||||
}
|
||||
ta->next = tan;
|
||||
}
|
||||
|
||||
unlock_ibc((char *)"del_server");
|
||||
}
|
||||
|
||||
|
||||
@ -610,11 +522,6 @@ void del_router(srv_list **fap, char *name)
|
||||
if (*fap == NULL)
|
||||
return;
|
||||
|
||||
if (lock_ibc((char *)"del_router")) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
for (ta = *fap; ta; ta = ta->next) {
|
||||
while ((tan = ta->next) && (strcmp(tan->router, name) == 0)) {
|
||||
del_user(&users, tan->server, NULL);
|
||||
@ -624,8 +531,6 @@ void del_router(srv_list **fap, char *name)
|
||||
}
|
||||
ta->next = tan;
|
||||
}
|
||||
|
||||
unlock_ibc((char *)"del_router");
|
||||
}
|
||||
|
||||
|
||||
@ -745,12 +650,13 @@ void check_servers(void)
|
||||
struct servent *se;
|
||||
struct hostent *he;
|
||||
|
||||
now = time(NULL);
|
||||
snprintf(scfgfn, PATH_MAX, "%s/etc/ibcsrv.data", getenv("MBSE_ROOT"));
|
||||
|
||||
/*
|
||||
* Check if we reached the global reset time
|
||||
*/
|
||||
if (((int)time(NULL) > (int)resettime) && !do_reset) {
|
||||
if (((int)now > (int)resettime) && !do_reset) {
|
||||
resettime = time(NULL) + (time_t)86400;
|
||||
do_reset = TRUE;
|
||||
Syslog('+', "IBC: global reset time reached, preparing reset");
|
||||
@ -784,11 +690,8 @@ void check_servers(void)
|
||||
* Local reset, make all crc's invalid so the connections will restart.
|
||||
*/
|
||||
if (local_reset) {
|
||||
if (! lock_ibc((char *)"check_servers 1")) {
|
||||
for (tnsl = ncsl; tnsl; tnsl = tnsl->next)
|
||||
tnsl->crc--;
|
||||
unlock_ibc((char *)"check_servers 1");
|
||||
}
|
||||
for (tnsl = ncsl; tnsl; tnsl = tnsl->next)
|
||||
tnsl->crc--;
|
||||
}
|
||||
|
||||
if (link_reset) {
|
||||
@ -817,11 +720,8 @@ void check_servers(void)
|
||||
Syslog('+', "IBC: server %s connection reset", tnsl->server);
|
||||
else
|
||||
Syslog('+', "IBC: server %s configuration changed or removed", tnsl->server);
|
||||
if (! lock_ibc((char *)"check_servers 2")) {
|
||||
tnsl->remove = TRUE;
|
||||
tnsl->action = now;
|
||||
unlock_ibc((char *)"check_servers 2");
|
||||
}
|
||||
tnsl->remove = TRUE;
|
||||
tnsl->action = now;
|
||||
srvchg = TRUE;
|
||||
callchg = TRUE;
|
||||
}
|
||||
@ -866,20 +766,17 @@ void check_servers(void)
|
||||
*/
|
||||
if (Remove) {
|
||||
Syslog('r', "IBC: Starting remove list");
|
||||
if (! lock_ibc((char *)"check_servers 3")) {
|
||||
tmp = &ncsl;
|
||||
while (*tmp) {
|
||||
if ((*tmp)->remove) {
|
||||
Syslog('r', "do %s", (*tmp)->server);
|
||||
tnsl = *tmp;
|
||||
*tmp = (*tmp)->next;
|
||||
free(tnsl);
|
||||
callchg = TRUE;
|
||||
} else {
|
||||
tmp = &((*tmp)->next);
|
||||
}
|
||||
tmp = &ncsl;
|
||||
while (*tmp) {
|
||||
if ((*tmp)->remove) {
|
||||
Syslog('r', "do %s", (*tmp)->server);
|
||||
tnsl = *tmp;
|
||||
*tmp = (*tmp)->next;
|
||||
free(tnsl);
|
||||
callchg = TRUE;
|
||||
} else {
|
||||
tmp = &((*tmp)->next);
|
||||
}
|
||||
unlock_ibc((char *)"check_servers 3");
|
||||
}
|
||||
}
|
||||
dump_ncslist();
|
||||
@ -1038,14 +935,12 @@ void check_servers(void)
|
||||
* Reset our side of the connection.
|
||||
*/
|
||||
Syslog('+', "IBC: server %s connection is half dead", tnsl->server);
|
||||
lock_ibc((char *)"check_servers 4");
|
||||
tnsl->state = NCS_DEAD;
|
||||
tnsl->action = now + (time_t)60; // 1 minute delay before calling again.
|
||||
tnsl->gotpass = FALSE;
|
||||
tnsl->gotserver = FALSE;
|
||||
tnsl->token = 0;
|
||||
tnsl->halfdead = 0;
|
||||
unlock_ibc((char *)"check_servers 4");
|
||||
broadcast(tnsl->server, "SQUIT %s Connection died\r\n", tnsl->server);
|
||||
callchg = TRUE;
|
||||
srvchg = TRUE;
|
||||
@ -1058,14 +953,12 @@ void check_servers(void)
|
||||
* Missed 3 PING replies
|
||||
*/
|
||||
Syslog('+', "IBC: server %s connection is dead", tnsl->server);
|
||||
lock_ibc((char *)"check_servers 5");
|
||||
tnsl->state = NCS_DEAD;
|
||||
tnsl->action = now + (time_t)120; // 2 minutes delay before calling again.
|
||||
tnsl->gotpass = FALSE;
|
||||
tnsl->gotserver = FALSE;
|
||||
tnsl->token = 0;
|
||||
tnsl->halfdead = 0;
|
||||
unlock_ibc((char *)"check_servers 5");
|
||||
broadcast(tnsl->server, "SQUIT %s Connection died\r\n", tnsl->server);
|
||||
callchg = TRUE;
|
||||
srvchg = TRUE;
|
||||
@ -1205,13 +1098,11 @@ int command_server(char *hostname, char *parameters)
|
||||
if (tnsl->token == token) {
|
||||
broadcast(tnsl->server, "SERVER %s %d %s %s %s %s\r\n", name, ihops, id, prod, vers, fullname);
|
||||
system_shout("* New server: %s, %s", name, fullname);
|
||||
lock_ibc((char *)"command_server 1");
|
||||
tnsl->gotserver = TRUE;
|
||||
callchg = TRUE;
|
||||
srvchg = TRUE;
|
||||
tnsl->state = NCS_CONNECT;
|
||||
tnsl->action = now + (time_t)10;
|
||||
unlock_ibc((char *)"command_server 1");
|
||||
Syslog('+', "IBC: connected with neighbour server: %s", tnsl->server);
|
||||
/*
|
||||
* Send all already known servers
|
||||
@ -1256,11 +1147,9 @@ int command_server(char *hostname, char *parameters)
|
||||
send_msg(tnsl, "SERVER %s 0 %ld mbsebbs %s %s\r\n", tnsl->myname, token, VERSION, CFG.bbs_name);
|
||||
broadcast(tnsl->server, "SERVER %s %d %s %s %s %s\r\n", name, ihops, id, prod, vers, fullname);
|
||||
system_shout("* New server: %s, %s", name, fullname);
|
||||
lock_ibc((char *)"command_server 2");
|
||||
tnsl->gotserver = TRUE;
|
||||
tnsl->state = NCS_CONNECT;
|
||||
tnsl->action = now + (time_t)10;
|
||||
unlock_ibc((char *)"command_server 2");
|
||||
Syslog('+', "IBC: connected with neighbour server: %s", tnsl->server);
|
||||
/*
|
||||
* Send all already known servers
|
||||
@ -1326,13 +1215,11 @@ int command_squit(char *hostname, char *parameters)
|
||||
|
||||
if (strcmp(name, tnsl->server) == 0) {
|
||||
Syslog('+', "IBC: disconnect neighbour server %s: %s", name, message);
|
||||
lock_ibc((char *)"command_squit");
|
||||
tnsl->state = NCS_HANGUP;
|
||||
tnsl->action = now + (time_t)120; // 2 minutes delay before calling again.
|
||||
tnsl->gotpass = FALSE;
|
||||
tnsl->gotserver = FALSE;
|
||||
tnsl->token = 0;
|
||||
unlock_ibc((char *)"command_squit");
|
||||
del_router(&servers, name);
|
||||
} else {
|
||||
Syslog('+', "IBC: disconnect relay server %s: %s", name, message);
|
||||
@ -1452,9 +1339,7 @@ int command_nick(char *hostname, char *parameters)
|
||||
|
||||
for (tmp = users; tmp; tmp = tmp->next) {
|
||||
if ((strcmp(tmp->server, server) == 0) && (strcmp(tmp->realname, realname) == 0) && (strcmp(tmp->name, name) == 0)) {
|
||||
lock_ibc((char *)"command_nick");
|
||||
strncpy(tmp->nick, nick, 9);
|
||||
unlock_ibc((char *)"command_nick");
|
||||
found = TRUE;
|
||||
Syslog('+', "IBC: user %s set nick to %s", name, nick);
|
||||
usrchg = TRUE;
|
||||
@ -1520,9 +1405,7 @@ int command_join(char *hostname, char *parameters)
|
||||
|
||||
for (tmpu = users; tmpu; tmpu = tmpu->next) {
|
||||
if ((strcmp(tmpu->server, server) == 0) && ((strcmp(tmpu->nick, nick) == 0) || (strcmp(tmpu->name, nick) == 0))) {
|
||||
lock_ibc((char *)"command_join");
|
||||
strncpy(tmpu->channel, channel, 20);
|
||||
unlock_ibc((char *)"command_join");
|
||||
Syslog('+', "IBC: user %s joined channel %s", nick, channel);
|
||||
usrchg = TRUE;
|
||||
snprintf(msg, 81, "* %s@%s has joined %s", nick, server, channel);
|
||||
@ -1577,19 +1460,17 @@ int command_part(char *hostname, char *parameters)
|
||||
}
|
||||
}
|
||||
|
||||
Syslog('r', "IBC: part input server=%s nick=%s", server, nick);
|
||||
// Syslog('r', "IBC: part input server=%s nick=%s", server, nick);
|
||||
for (tmpu = users; tmpu; tmpu = tmpu->next) {
|
||||
Syslog('r', "IBC: part test server=%s nick=%s name=%s", tmpu->server, tmpu->nick, tmpu->name);
|
||||
// Syslog('r', "IBC: part test server=%s nick=%s name=%s", tmpu->server, tmpu->nick, tmpu->name);
|
||||
if ((strcmp(tmpu->server, server) == 0) && ((strcmp(tmpu->nick, nick) == 0) || (strcmp(tmpu->name, nick) == 0))) {
|
||||
lock_ibc((char *)"command_part");
|
||||
tmpu->channel[0] = '\0';
|
||||
unlock_ibc((char *)"command_part");
|
||||
if (message) {
|
||||
Syslog('+', "IBC: user %s left channel %s: %s", nick, channel, message);
|
||||
snprintf(msg, 81, "* %s@%s has left: %s", nick, server, message);
|
||||
snprintf(msg, 81, "* %s@%s has left channel %s: %s", nick, server, channel, message);
|
||||
} else {
|
||||
Syslog('+', "IBC: user %s left channel %s", nick, channel);
|
||||
snprintf(msg, 81, "* %s@%s has silently left this channel", nick, server);
|
||||
snprintf(msg, 81, "* %s@%s has silently left channel %s", nick, server, channel);
|
||||
}
|
||||
chat_msg(channel, NULL, msg);
|
||||
usrchg = TRUE;
|
||||
@ -1628,9 +1509,7 @@ int command_topic(char *hostname, char *parameters)
|
||||
for (tmp = channels; tmp; tmp = tmp->next) {
|
||||
if (strcmp(tmp->name, channel) == 0) {
|
||||
chnchg = TRUE;
|
||||
lock_ibc((char *)"command_topic");
|
||||
strncpy(tmp->topic, topic, 54);
|
||||
unlock_ibc((char *)"command_topic");
|
||||
Syslog('+', "IBC: channel %s topic: %s", channel, topic);
|
||||
snprintf(msg, 81, "* Channel topic is now: %s", tmp->topic);
|
||||
chat_msg(channel, NULL, msg);
|
||||
@ -1758,191 +1637,132 @@ int do_command(char *hostname, char *command, char *parameters)
|
||||
|
||||
|
||||
|
||||
void receiver(struct servent *se)
|
||||
void ibc_receiver(char *crbuf)
|
||||
{
|
||||
struct pollfd pfd;
|
||||
struct hostent *hp, *tp;
|
||||
struct in_addr in;
|
||||
int rc, len, inlist;
|
||||
socklen_t sl;
|
||||
ncs_list *tnsl;
|
||||
int inlist;
|
||||
ncs_list *tnsl;
|
||||
char *hostname, *command, *parameters, *ipaddress;
|
||||
|
||||
pfd.fd = ls;
|
||||
pfd.events = POLLIN;
|
||||
pfd.revents = 0;
|
||||
hp = gethostbyaddr((char *)&clientaddr_in.sin_addr, sizeof(struct in_addr), clientaddr_in.sin_family);
|
||||
if (hp == NULL)
|
||||
hostname = inet_ntoa(clientaddr_in.sin_addr);
|
||||
else
|
||||
hostname = hp->h_name;
|
||||
|
||||
if ((rc = poll(&pfd, 1, 1000) < 0)) {
|
||||
Syslog('r', "$IBC: poll/select failed");
|
||||
if ((crbuf[strlen(crbuf) -2] != '\r') && (crbuf[strlen(crbuf) -1] != '\n')) {
|
||||
Syslog('!', "IBC: got message not terminated with CR-LF, dropped");
|
||||
return;
|
||||
}
|
||||
|
||||
now = time(NULL);
|
||||
if (pfd.revents & POLLIN || pfd.revents & POLLERR || pfd.revents & POLLHUP || pfd.revents & POLLNVAL) {
|
||||
sl = sizeof(myaddr_in);
|
||||
memset(&clientaddr_in, 0, sizeof(struct sockaddr_in));
|
||||
memset(&crbuf, 0, sizeof(crbuf));
|
||||
if ((len = recvfrom(ls, &crbuf, sizeof(crbuf)-1, 0,(struct sockaddr *)&clientaddr_in, &sl)) != -1) {
|
||||
hp = gethostbyaddr((char *)&clientaddr_in.sin_addr, sizeof(struct in_addr), clientaddr_in.sin_family);
|
||||
if (hp == NULL)
|
||||
hostname = inet_ntoa(clientaddr_in.sin_addr);
|
||||
else
|
||||
hostname = hp->h_name;
|
||||
|
||||
if ((crbuf[strlen(crbuf) -2] != '\r') && (crbuf[strlen(crbuf) -1] != '\n')) {
|
||||
Syslog('!', "IBC: got message not terminated with CR-LF, dropped");
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* First check fr a fixed IP address.
|
||||
*/
|
||||
inlist = FALSE;
|
||||
for (tnsl = ncsl; tnsl; tnsl = tnsl->next) {
|
||||
if (strcmp(tnsl->server, hostname) == 0) {
|
||||
inlist = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!inlist) {
|
||||
/*
|
||||
* Check for dynamic dns address
|
||||
*/
|
||||
ipaddress = xstrcpy(inet_ntoa(clientaddr_in.sin_addr));
|
||||
for (tnsl = ncsl; tnsl; tnsl = tnsl->next) {
|
||||
if (tnsl->dyndns) {
|
||||
tp = gethostbyname(tnsl->server);
|
||||
if (tp != NULL) {
|
||||
memcpy(&in, tp->h_addr, tp->h_length);
|
||||
if (strcmp(inet_ntoa(in), ipaddress) == 0) {
|
||||
/*
|
||||
* Test if the backresolved dynamic DNS name is changed, but exclude the
|
||||
* initial value which is the same as the real server name.
|
||||
*/
|
||||
if (strcmp(tnsl->resolved, hostname) && strcmp(tnsl->resolved, tnsl->server)) {
|
||||
Syslog('r', "IBC: GrepThiz old resolved %s new resolved %s state %s",
|
||||
tnsl->resolved, hostname, ncsstate[tnsl->state]);
|
||||
Syslog('+', "IBC: server %s resolved FQDN changed, restarting", tnsl->server);
|
||||
tnsl->crc--;
|
||||
link_reset = TRUE;
|
||||
/*
|
||||
* This would be the moment to reset this neighbour
|
||||
* Double check state: waitpwd or call ?
|
||||
*/
|
||||
}
|
||||
/*
|
||||
* Store the back resolved IP fqdn for reference and change the
|
||||
* FQDN to the one from the setup, so we continue to use the
|
||||
* dynamic FQDN.
|
||||
*/
|
||||
if (strcmp(tnsl->resolved, hostname))
|
||||
Syslog('r', "IBC: setting '%s' to dynamic dns '%s'", hostname, tnsl->server);
|
||||
strncpy(tnsl->resolved, hostname, 63);
|
||||
inlist = TRUE;
|
||||
hostname = tnsl->server;
|
||||
break;
|
||||
}
|
||||
/*
|
||||
* First check fr a fixed IP address.
|
||||
*/
|
||||
inlist = FALSE;
|
||||
for (tnsl = ncsl; tnsl; tnsl = tnsl->next) {
|
||||
if (strcmp(tnsl->server, hostname) == 0) {
|
||||
inlist = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!inlist) {
|
||||
/*
|
||||
* Check for dynamic dns address
|
||||
*/
|
||||
ipaddress = xstrcpy(inet_ntoa(clientaddr_in.sin_addr));
|
||||
for (tnsl = ncsl; tnsl; tnsl = tnsl->next) {
|
||||
if (tnsl->dyndns) {
|
||||
tp = gethostbyname(tnsl->server);
|
||||
if (tp != NULL) {
|
||||
memcpy(&in, tp->h_addr, tp->h_length);
|
||||
if (strcmp(inet_ntoa(in), ipaddress) == 0) {
|
||||
/*
|
||||
* Test if the backresolved dynamic DNS name is changed, but exclude the
|
||||
* initial value which is the same as the real server name.
|
||||
*/
|
||||
if (strcmp(tnsl->resolved, hostname) && strcmp(tnsl->resolved, tnsl->server)) {
|
||||
Syslog('r', "IBC: GrepThiz old resolved %s new resolved %s state %s",
|
||||
tnsl->resolved, hostname, ncsstate[tnsl->state]);
|
||||
Syslog('+', "IBC: server %s resolved FQDN changed, restarting", tnsl->server);
|
||||
tnsl->crc--;
|
||||
link_reset = TRUE;
|
||||
/*
|
||||
* This would be the moment to reset this neighbour
|
||||
* Double check state: waitpwd or call ?
|
||||
*/
|
||||
}
|
||||
/*
|
||||
* Store the back resolved IP fqdn for reference and change the
|
||||
* FQDN to the one from the setup, so we continue to use the
|
||||
* dynamic FQDN.
|
||||
*/
|
||||
if (strcmp(tnsl->resolved, hostname))
|
||||
Syslog('r', "IBC: setting '%s' to dynamic dns '%s'", hostname, tnsl->server);
|
||||
strncpy(tnsl->resolved, hostname, 63);
|
||||
inlist = TRUE;
|
||||
hostname = tnsl->server;
|
||||
break;
|
||||
}
|
||||
}
|
||||
free(ipaddress);
|
||||
}
|
||||
if (!inlist) {
|
||||
Syslog('r', "IBC: message from unknown host (%s), dropped", hostname);
|
||||
return;
|
||||
}
|
||||
|
||||
if (tnsl->state == NCS_INIT) {
|
||||
Syslog('r', "IBC: message received from %s while in init state, dropped", hostname);
|
||||
return;
|
||||
}
|
||||
|
||||
tnsl->last = now;
|
||||
crbuf[strlen(crbuf) -2] = '\0';
|
||||
#ifndef PING_PONG_LOG
|
||||
if (strcmp(crbuf, (char *)"PING") && strcmp(crbuf, (char *)"PONG"))
|
||||
#endif
|
||||
Syslog('r', "IBC: < %s: \"%s\"", hostname, printable(crbuf, 0));
|
||||
|
||||
/*
|
||||
* Parse message
|
||||
*/
|
||||
command = strtok(crbuf, " \0");
|
||||
parameters = strtok(NULL, "\0");
|
||||
|
||||
if (atoi(command)) {
|
||||
Syslog('r', "IBC: Got error %d", atoi(command));
|
||||
} else {
|
||||
do_command(hostname, command, parameters);
|
||||
}
|
||||
} else {
|
||||
Syslog('r', "IBC: recvfrom returned len=%d", len);
|
||||
}
|
||||
free(ipaddress);
|
||||
}
|
||||
if (!inlist) {
|
||||
Syslog('r', "IBC: message from unknown host (%s), dropped", hostname);
|
||||
return;
|
||||
}
|
||||
|
||||
if (tnsl->state == NCS_INIT) {
|
||||
Syslog('r', "IBC: message received from %s while in init state, dropped", hostname);
|
||||
return;
|
||||
}
|
||||
|
||||
tnsl->last = now;
|
||||
crbuf[strlen(crbuf) -2] = '\0';
|
||||
#ifndef PING_PONG_LOG
|
||||
if (strcmp(crbuf, (char *)"PING") && strcmp(crbuf, (char *)"PONG"))
|
||||
#endif
|
||||
Syslog('r', "IBC: < %s: \"%s\"", hostname, printable(crbuf, 0));
|
||||
|
||||
/*
|
||||
* Parse message
|
||||
*/
|
||||
command = strtok(crbuf, " \0");
|
||||
parameters = strtok(NULL, "\0");
|
||||
|
||||
if (atoi(command)) {
|
||||
Syslog('r', "IBC: Got error %d", atoi(command));
|
||||
} else {
|
||||
do_command(hostname, command, parameters);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* IBC thread
|
||||
*/
|
||||
void *ibc_thread(void *dummy)
|
||||
void ibc_shutdown(void)
|
||||
{
|
||||
struct servent *se;
|
||||
ncs_list *tnsl;
|
||||
|
||||
Syslog('+', "Starting IBC thread");
|
||||
|
||||
if ((se = getservbyname("fido", "udp")) == NULL) {
|
||||
Syslog('!', "IBC: no fido udp entry in /etc/services, cannot start Internet BBS Chat");
|
||||
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;
|
||||
Syslog('+', "IBC: listen on %s, port %d", inet_ntoa(myaddr_in.sin_addr), ntohs(myaddr_in.sin_port));
|
||||
|
||||
ls = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (ls == -1) {
|
||||
Syslog('!', "$IBC: can't create listen socket");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (bind(ls, (struct sockaddr *)&myaddr_in, sizeof(struct sockaddr_in)) == -1) {
|
||||
Syslog('!', "$IBC: can't bind listen socket");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
ibc_run = TRUE;
|
||||
srand(getpid());
|
||||
resettime = time(NULL) + (time_t)86400;
|
||||
|
||||
while (! T_Shutdown) {
|
||||
|
||||
/*
|
||||
* Check neighbour servers state
|
||||
*/
|
||||
now = time(NULL);
|
||||
check_servers();
|
||||
|
||||
/*
|
||||
* Get any incoming messages
|
||||
*/
|
||||
receiver(se);
|
||||
}
|
||||
ncs_list *tnsl;
|
||||
usr_list *usrp;
|
||||
|
||||
Syslog('r', "IBC: start shutdown connections");
|
||||
|
||||
for (usrp = users; usrp; usrp = usrp->next) {
|
||||
if (strcmp(usrp->server, CFG.myfqdn) == 0) {
|
||||
/*
|
||||
* Our user, still connected
|
||||
*/
|
||||
if (strlen(usrp->channel) && strcmp(usrp->channel, "#sysop")) {
|
||||
/*
|
||||
* In a channel
|
||||
*/
|
||||
broadcast((char *)"foobar", "PART %s@%s %s System shutdown\r\n", usrp->nick, usrp->server, usrp->channel);
|
||||
}
|
||||
broadcast((char *)"foobar", "QUIT %s@%s System shutdown\r\n", usrp->nick, usrp->server);
|
||||
}
|
||||
}
|
||||
|
||||
for (tnsl = ncsl; tnsl; tnsl = tnsl->next) {
|
||||
if (tnsl->state == NCS_CONNECT) {
|
||||
send_msg(tnsl, "SQUIT %s System shutdown\r\n", tnsl->myname);
|
||||
@ -1950,11 +1770,5 @@ void *ibc_thread(void *dummy)
|
||||
}
|
||||
|
||||
tidy_servers(&servers);
|
||||
|
||||
exit:
|
||||
ibc_run = FALSE;
|
||||
Syslog('+', "IBC thread stopped");
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
|
||||
|
@ -106,9 +106,6 @@ typedef struct _nick_list {
|
||||
} nick_list;
|
||||
|
||||
|
||||
|
||||
int lock_ibc(char *);
|
||||
void unlock_ibc(char *);
|
||||
int add_user(usr_list **, char *, char *, char *);
|
||||
void del_user(usr_list **, char *, char *);
|
||||
int add_channel(chn_list **, char *, char *, char *);
|
||||
@ -118,7 +115,10 @@ int do_command(char *, char *, char *);
|
||||
void send_all(const char *, ...);
|
||||
void send_at(char *, char *, char *);
|
||||
void send_nick(char *, char *, char *);
|
||||
void *ibc_thread(void *);
|
||||
void check_servers(void);
|
||||
void ibc_receiver(char *);
|
||||
void ibc_shutdown(void);
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -46,6 +46,8 @@ unsigned int lcrc = 0, tcrc = 1;
|
||||
int lcnt = 0, lchr;
|
||||
static char *pbuff = NULL;
|
||||
|
||||
pthread_mutex_t l_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
|
||||
static char *mon[] = {
|
||||
(char *)"Jan",(char *)"Feb",(char *)"Mar",
|
||||
@ -62,15 +64,13 @@ static char *mon[] = {
|
||||
|
||||
void WriteError(const char *format, ...)
|
||||
{
|
||||
char *outputstr;
|
||||
char outputstr[1024];
|
||||
va_list va_ptr;
|
||||
|
||||
outputstr = calloc(10240, sizeof(char));
|
||||
va_start(va_ptr, format);
|
||||
vsnprintf(outputstr, 10240, format, va_ptr);
|
||||
vsnprintf(outputstr, 1024, format, va_ptr);
|
||||
va_end(va_ptr);
|
||||
Syslog('?', outputstr);
|
||||
free(outputstr);
|
||||
}
|
||||
|
||||
|
||||
@ -81,13 +81,18 @@ void WriteError(const char *format, ...)
|
||||
void Syslog(int grade, const char *format, ...)
|
||||
{
|
||||
va_list va_ptr;
|
||||
char outstr[1024], datestr[21];
|
||||
char outstr[1024], datestr[21], lname[PATH_MAX];
|
||||
int oldmask, debug;
|
||||
FILE *logfile = NULL, *debugfile;
|
||||
char *logname = NULL, *debugname;
|
||||
time_t now;
|
||||
struct tm ptm;
|
||||
|
||||
if (pthread_mutex_lock(&l_mutex)) {
|
||||
perror("");
|
||||
printf("Syslog mutex_lock l_nutex failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
debug = isalpha(grade);
|
||||
va_start(va_ptr, format);
|
||||
vsnprintf(outstr, 1024, format, va_ptr);
|
||||
@ -96,35 +101,33 @@ void Syslog(int grade, const char *format, ...)
|
||||
tcrc = StringCRC32(outstr);
|
||||
if (tcrc == lcrc) {
|
||||
lcnt++;
|
||||
pthread_mutex_unlock(&l_mutex);
|
||||
return;
|
||||
}
|
||||
lcrc = tcrc;
|
||||
|
||||
if (!debug) {
|
||||
logname = calloc(PATH_MAX, sizeof(char));
|
||||
oldmask=umask(066);
|
||||
snprintf(logname, PATH_MAX, "%s/log/mbtask.log", getenv("MBSE_ROOT"));
|
||||
logfile = fopen(logname, "a");
|
||||
snprintf(lname, PATH_MAX, "%s/log/mbtask.log", getenv("MBSE_ROOT"));
|
||||
logfile = fopen(lname, "a");
|
||||
umask(oldmask);
|
||||
if (logfile == NULL) {
|
||||
printf("Cannot open logfile \"%s\"\n", logname);
|
||||
free(logname);
|
||||
printf("Can't open logfile \"%s\"\n", lname);
|
||||
pthread_mutex_unlock(&l_mutex);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
debugname = calloc(PATH_MAX, sizeof(char));
|
||||
oldmask=umask(066);
|
||||
snprintf(debugname, PATH_MAX, "%s/log/%s", getenv("MBSE_ROOT"), CFG.debuglog);
|
||||
debugfile = fopen(debugname, "a");
|
||||
snprintf(lname, PATH_MAX, "%s/log/%s", getenv("MBSE_ROOT"), CFG.debuglog);
|
||||
debugfile = fopen(lname, "a");
|
||||
umask(oldmask);
|
||||
if (debugfile == NULL) {
|
||||
printf("Cannot open logfile \"%s\"\n", debugname);
|
||||
free(debugname);
|
||||
printf("Can't open logfile \"%s\"\n", lname);
|
||||
if (!debug) {
|
||||
free(logname);
|
||||
fclose(logfile);
|
||||
}
|
||||
pthread_mutex_unlock(&l_mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -150,10 +153,8 @@ void Syslog(int grade, const char *format, ...)
|
||||
fprintf(logfile, "\n");
|
||||
|
||||
fflush(logfile);
|
||||
if (fclose(logfile) != 0)
|
||||
printf("Cannot close logfile \"%s\"\n", logname);
|
||||
|
||||
free(logname);
|
||||
if (fclose(logfile) != 0)
|
||||
printf("Can't close mbtask.log");
|
||||
}
|
||||
|
||||
fprintf(debugfile, "%c %s mbtask[%d] ", grade, datestr, mypid);
|
||||
@ -165,11 +166,10 @@ void Syslog(int grade, const char *format, ...)
|
||||
|
||||
fflush(debugfile);
|
||||
if (fclose(debugfile) != 0)
|
||||
printf("Cannot close logfile \"%s\"\n", debugname);
|
||||
printf("Can't close logfile \"%s\"\n", CFG.debuglog);
|
||||
|
||||
lchr = grade;
|
||||
free(debugname);
|
||||
|
||||
pthread_mutex_unlock(&l_mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -259,14 +259,12 @@ char *xstrcat(char *src, char *add)
|
||||
|
||||
void CreateSema(char *sem)
|
||||
{
|
||||
char *temp;
|
||||
char temp[PATH_MAX];
|
||||
FILE *fp;
|
||||
int oldmask;
|
||||
|
||||
temp = calloc(PATH_MAX, sizeof(char));
|
||||
snprintf(temp, PATH_MAX, "%s/var/sema/%s", getenv("MBSE_ROOT"), sem);
|
||||
if (access(temp, F_OK) == 0) {
|
||||
free(temp);
|
||||
return;
|
||||
}
|
||||
oldmask = umask(002);
|
||||
@ -274,7 +272,6 @@ void CreateSema(char *sem)
|
||||
fclose(fp);
|
||||
else
|
||||
Syslog('?', "Can't create semafore %s", temp);
|
||||
free(temp);
|
||||
umask(oldmask);
|
||||
}
|
||||
|
||||
@ -282,18 +279,16 @@ void CreateSema(char *sem)
|
||||
|
||||
void TouchSema(char *sem)
|
||||
{
|
||||
char *temp;
|
||||
char temp[PATH_MAX];
|
||||
FILE *fp;
|
||||
int oldmask;
|
||||
|
||||
temp = calloc(PATH_MAX, sizeof(char));
|
||||
snprintf(temp, PATH_MAX, "%s/var/sema/%s", getenv("MBSE_ROOT"), sem);
|
||||
oldmask = umask(002);
|
||||
if ((fp = fopen(temp, "w"))) {
|
||||
fclose(fp);
|
||||
} else
|
||||
Syslog('?', "Can't touch semafore %s", temp);
|
||||
free(temp);
|
||||
umask(oldmask);
|
||||
}
|
||||
|
||||
@ -301,31 +296,24 @@ void TouchSema(char *sem)
|
||||
|
||||
void RemoveSema(char *sem)
|
||||
{
|
||||
char *temp;
|
||||
char temp[PATH_MAX];
|
||||
|
||||
temp = calloc(PATH_MAX, sizeof(char));
|
||||
snprintf(temp, PATH_MAX, "%s/var/sema/%s", getenv("MBSE_ROOT"), sem);
|
||||
if (access(temp, F_OK)) {
|
||||
free(temp);
|
||||
return;
|
||||
}
|
||||
if (unlink(temp) == -1)
|
||||
Syslog('?', "Can't remove semafore %s", temp);
|
||||
free(temp);
|
||||
}
|
||||
|
||||
|
||||
|
||||
int IsSema(char *sem)
|
||||
{
|
||||
char *temp;
|
||||
int rc;
|
||||
char temp[PATH_MAX];
|
||||
|
||||
temp = calloc(PATH_MAX, sizeof(temp));
|
||||
snprintf(temp, PATH_MAX, "%s/var/sema/%s", getenv("MBSE_ROOT"), sem);
|
||||
rc = (access(temp, F_OK) == 0);
|
||||
free(temp);
|
||||
return rc;
|
||||
return (access(temp, F_OK) == 0);
|
||||
}
|
||||
|
||||
|
||||
@ -348,7 +336,7 @@ int file_exist(char *path, int mode)
|
||||
|
||||
|
||||
/*
|
||||
* Make directory tree, the name must end with a /
|
||||
* Make directory tree, the name must end with a /
|
||||
*/
|
||||
int mkdirs(char *name, mode_t mode)
|
||||
{
|
||||
|
Reference in New Issue
Block a user