diff --git a/ChangeLog b/ChangeLog index 5be263e6..1e4ebd0d 100644 --- a/ChangeLog +++ b/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 diff --git a/TODO b/TODO index f15650f9..e4b4aec8 100644 --- a/TODO +++ b/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. diff --git a/configure b/configure index d64f1559..92d96fa7 100755 --- a/configure +++ b/configure @@ -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 diff --git a/configure.in b/configure.in index b1bdb08f..59890555 100644 --- a/configure.in +++ b/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 diff --git a/lib/Makefile b/lib/Makefile index ba53bdf4..343a4e79 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -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 diff --git a/lib/client.c b/lib/client.c index 7b7824c7..22d7490f 100644 --- a/lib/client.c +++ b/lib/client.c @@ -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; diff --git a/mbsebbs/Makefile b/mbsebbs/Makefile index 57ea3444..ee179b2c 100644 --- a/mbsebbs/Makefile +++ b/mbsebbs/Makefile @@ -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 diff --git a/mbtask/Makefile b/mbtask/Makefile index dc0238b2..493dc499 100644 --- a/mbtask/Makefile +++ b/mbtask/Makefile @@ -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 diff --git a/mbtask/mbtask.c b/mbtask/mbtask.c index 6c59836b..97f1911a 100644 --- a/mbtask/mbtask.c +++ b/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: /* diff --git a/mbtask/mbtask.h b/mbtask/mbtask.h index e468793d..362dcc76 100644 --- a/mbtask/mbtask.h +++ b/mbtask/mbtask.h @@ -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); diff --git a/mbtask/ping.c b/mbtask/ping.c index 62cc187a..90cb9e2f 100644 --- a/mbtask/ping.c +++ b/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); } diff --git a/mbtask/ping.h b/mbtask/ping.h index 53689c70..4cf87174 100644 --- a/mbtask/ping.h +++ b/mbtask/ping.h @@ -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 diff --git a/mbtask/taskchat.c b/mbtask/taskchat.c index 6019834f..187fc4a8 100644 --- a/mbtask/taskchat.c +++ b/mbtask/taskchat.c @@ -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); diff --git a/mbtask/taskchat.h b/mbtask/taskchat.h index e940fcf4..e529e5e5 100644 --- a/mbtask/taskchat.h +++ b/mbtask/taskchat.h @@ -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); diff --git a/mbtask/taskcomm.c b/mbtask/taskcomm.c index f2daa6a0..be2b8fdd 100644 --- a/mbtask/taskcomm.c +++ b/mbtask/taskcomm.c @@ -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); -} - - diff --git a/mbtask/taskcomm.h b/mbtask/taskcomm.h index 97d029b3..c067fe54 100644 --- a/mbtask/taskcomm.h +++ b/mbtask/taskcomm.h @@ -3,7 +3,7 @@ /* $Id$ */ -void *cmd_thread(void); +void do_cmd(char *); #endif diff --git a/mbtask/taskdisk.c b/mbtask/taskdisk.c index ed74a34e..c5ae4f9e 100644 --- a/mbtask/taskdisk.c +++ b/mbtask/taskdisk.c @@ -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); } diff --git a/mbtask/taskdisk.h b/mbtask/taskdisk.h index 065a1e62..58a3730c 100644 --- a/mbtask/taskdisk.h +++ b/mbtask/taskdisk.h @@ -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 diff --git a/mbtask/taskibc.c b/mbtask/taskibc.c index 4b0c6e8e..188acf33 100644 --- a/mbtask/taskibc.c +++ b/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); } - diff --git a/mbtask/taskibc.h b/mbtask/taskibc.h index 2ba698e3..f345e3ce 100644 --- a/mbtask/taskibc.h +++ b/mbtask/taskibc.h @@ -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 diff --git a/mbtask/taskutil.c b/mbtask/taskutil.c index c5cd2d28..7ec21aeb 100644 --- a/mbtask/taskutil.c +++ b/mbtask/taskutil.c @@ -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) {