summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--util/Makefile7
-rw-r--r--util/killdeadbbs.c56
2 files changed, 61 insertions, 2 deletions
diff --git a/util/Makefile b/util/Makefile
index 443ac6eb..d1dd93e1 100644
--- a/util/Makefile
+++ b/util/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.9 2002/04/05 14:36:44 in2 Exp $
+# $Id: Makefile,v 1.10 2002/04/14 14:08:56 in2 Exp $
BBSHOME?=$(HOME)
OSTYPE?=linux
@@ -30,7 +30,7 @@ CPROGS= bbsmail BM_money post account birth deluserfile expire mandex\
poststat showboard antispam countalldice webgrep bbsrf\
initbbs outmail xchatd userlist tunepasswd buildir reaper shmsweep\
merge_passwd merge_board inndBM buildAnnounce rmuid \
- toplazyBM jungo toplazyBBM shmctl
+ toplazyBM jungo toplazyBBM shmctl killdeadbbs
PROGS= $(CPROGS) BM_money.sh backpasswd.sh mailog.sh opendice.sh\
openticket.sh stock.sh topsong.sh weather.sh stock.perl weather.perl\
@@ -156,6 +156,9 @@ bbsctl: bbsctl.c
shmctl: shmctl.c $(OBJS)
$(CC) $(CFLAGS) -o $@ $@.c $(OBJS)
+killdeadbbs: killdeadbbs.c
+ $(CC) $(CFLAGS) -lkvm -o $@ $@.c
+
install: $(PROGS)
install -d $(BBSHOME)/bin/
install -c -m 755 $(PROGS) $(BBSHOME)/bin/
diff --git a/util/killdeadbbs.c b/util/killdeadbbs.c
new file mode 100644
index 00000000..0c83fe29
--- /dev/null
+++ b/util/killdeadbbs.c
@@ -0,0 +1,56 @@
+#ifndef FreeBSD
+int main(int argc, char **argv)
+{
+ puts("this program is only for FreeBSD");
+}
+#else
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+#include <kvm.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/user.h>
+#include "config.h" // for BBSUID
+
+int main(int argc, char **argv)
+{
+ kvm_t *kd;
+ struct kinfo_proc *kp;
+ char errbuf[_POSIX2_LINE_MAX];
+ int nentries, i, npids;
+ pid_t pids[8192];
+ kd = kvm_openfiles("/dev/null", "/dev/null", NULL, O_RDONLY, errbuf);
+ if( kd == NULL )
+ errx(1, "%s", errbuf);
+
+ if ((kp = kvm_getprocs(kd, KERN_PROC_UID, BBSUID, &nentries)) == 0 ||
+ nentries < 0)
+ errx(1, "%s", kvm_geterr(kd));
+
+ for( npids = 0, i = nentries ; --i >= 0 ; ++kp ){
+ if( strncmp(kp->ki_comm, "mbbsd", 5) == 0 ){
+ if( kp->ki_runtime > (60 * 1000000) ){ // 60 secs
+ kill(kp->ki_pid, 1);
+ pids[npids++] = kp->ki_pid;
+ printf("%d\n", kp->ki_pid);
+ }
+ }
+ }
+
+ if( npids != 0 ){
+ sleep(2);
+ while( --npids >= 0 )
+ kill(pids[npids], 9);
+ }
+
+ kvm_close(kd);
+ return 0;
+}
+
+#endif