diff --git a/mbutils/.cvsignore b/mbutils/.cvsignore
index b9ae6188..ecf8aae9 100644
--- a/mbutils/.cvsignore
+++ b/mbutils/.cvsignore
@@ -1 +1 @@
-filelist mball mbchat mblang mbstat mbtoberep mbuser mbbw
+filelist mball mbchat mblang mbstat mbsnmp mbtoberep mbuser mbbw
diff --git a/mbutils/Makefile b/mbutils/Makefile
index 261d150a..0217e9cc 100644
--- a/mbutils/Makefile
+++ b/mbutils/Makefile
@@ -4,14 +4,16 @@
include ../Makefile.global
-SRCS = mball.c dlcount.c mblang.c mbstat.c mbtoberep.c mbuser.c mbbw.c
-HDRS = mball.h dlcount.h mbstat.h mbuser.h
+SRCS = mball.c dlcount.c mblang.c mbstat.c mbsnmp.c mbtoberep.c mbuser.c mbbw.c
+HDRS = mball.h dlcount.h mbstat.h mbsnmp.h mbuser.h
MBALL_OBJS = mball.o dlcount.o
MBALL_LIBS = ../lib/libmbse.a ../lib/libdbase.a
MBLANG_OBJS = mblang.o
MBLANG_LIBS = ../lib/libmbse.a ../lib/libdbase.a
MBSTAT_OBJS = mbstat.o
MBSTAT_LIBS = ../lib/libmbse.a ../lib/libdbase.a
+MBSNMP_OBJS = mbsnmp.o
+MBSNMP_LIBS = ../lib/libmbse.a ../lib/libdbase.a
MBTOBE_OBJS = mbtoberep.o
MBTOBE_LIBS = ../lib/libmbse.a ../lib/libdbase.a
MBUSER_OBJS = mbuser.o
@@ -19,7 +21,7 @@ MBUSER_LIBS = ../lib/libmbse.a ../lib/libdbase.a
MBBW_OBJS = mbbw.o
MBBW_LIBS = ../lib/libmbse.a ../lib/libdbase.a
OTHER = Makefile
-TARGET = mball mblang mbstat mbtoberep mbuser mbbw
+TARGET = mball mblang mbstat mbsnmp mbtoberep mbuser mbbw
#############################################################################################################
@@ -40,6 +42,9 @@ mblang: ${MBLANG_OBJS} ${MBLANG_LIBS}
mbstat: ${MBSTAT_OBJS} ${MBSTAT_LIBS}
${CC} -o mbstat ${MBSTAT_OBJS} ${LDFLAGS} ${LIBS} ${MBSTAT_LIBS}
+mbsnmp: ${MBSNMP_OBJS} ${MBSNMP_LIBS}
+ ${CC} -o mbsnmp ${MBSNMP_OBJS} ${LDFLAGS} ${LIBS} ${MBSNMP_LIBS}
+
mbtoberep: ${MBTOBE_OBJS} ${MBTOBE_LIBS}
${CC} -o mbtoberep ${MBTOBE_OBJS} ${LDFLAGS} ${LIBS} ${MBTOBE_LIBS}
@@ -56,6 +61,7 @@ install: all
${INSTALL} -c -s -o ${OWNER} -g ${GROUP} -m 0700 mball ${BINDIR}
${INSTALL} -c -s -o ${OWNER} -g ${GROUP} -m 0700 mblang ${BINDIR}
${INSTALL} -c -s -o ${OWNER} -g ${GROUP} -m 0750 mbstat ${BINDIR}
+ ${INSTALL} -c -s -o ${OWNER} -g ${GROUP} -m 4750 mbsnmp ${BINDIR}
${INSTALL} -c -s -o ${OWNER} -g ${GROUP} -m 0700 mbtoberep ${BINDIR}
${INSTALL} -c -s -o ${ROWNER} -g ${RGROUP} -m 6711 mbuser ${BINDIR}
${INSTALL} -c -s -o ${OWNER} -g ${GROUP} -m 0750 mbbw ${BINDIR}
@@ -94,6 +100,7 @@ mball.o: ../config.h ../lib/mbselib.h ../lib/mbse.h ../lib/users.h ../lib/mbsedb
dlcount.o: ../config.h ../lib/mbselib.h ../lib/users.h ../lib/mbsedb.h dlcount.h
mblang.o: ../config.h ../lib/mbselib.h
mbstat.o: ../config.h ../lib/mbselib.h ../lib/users.h ../lib/mbsedb.h mbstat.h
+mbsnmp.o: ../config.h ../lib/mbselib.h ../lib/users.h ../lib/mbsedb.h mbsnmp.h
mbtoberep.o: ../config.h ../lib/mbselib.h
mbuser.o: ../config.h ../lib/mbselib.h ../lib/users.h ../lib/mbsedb.h mbuser.h
mbbw.o: ../config.h ../lib/mbselib.h ../lib/bluewave.h
diff --git a/mbutils/mbsnmp.c b/mbutils/mbsnmp.c
new file mode 100644
index 00000000..626aace8
--- /dev/null
+++ b/mbutils/mbsnmp.c
@@ -0,0 +1,236 @@
+/*****************************************************************************
+ *
+ * $Id$
+ * Purpose ...............: SNMP passthru support.
+ *
+ *****************************************************************************
+ * Copyright (C) 1997-2008
+ *
+ * Michiel Broek FIDO: 2:280/2802
+ * Beekmansbos 10
+ * 1971 BV IJmuiden
+ * the Netherlands
+ *
+ * This file is part of MBSE BBS.
+ *
+ * This BBS is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * MBSE BBS is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MBSE BBS; see the file COPYING. If not, write to the Free
+ * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ *****************************************************************************/
+
+#include "../config.h"
+#include "../lib/mbselib.h"
+#include "../lib/users.h"
+#include "../lib/mbsedb.h"
+#include "mbsnmp.h"
+
+
+
+// mbsnmp [-n|-g] .1.3.6.1.4.1.2021.256.group.item
+// mbsnmp
+// Base oid for this tree.
+// -n for SNMP getNext, or -g for SNMP get.
+// Requested OID
+// outputs: "new oid\n" . "integer\n" . data . "\n"
+
+
+/*
+ * group command reply
+ * ----- ------- ----------------------------------------------------------------------------------------------
+ * 0 MGMS:0; 100:12,kbrcvd,kbsent,sessin,sessout,sess_sec,sess_unseq,sess_bad,ftsc,yoohoo,emsi,binkp,freqs;
+ * 1 MGTN:0; 100:3,in,out,bad;
+ * 2 MGTI:0; 100:3,in,out,bad;
+ * 3 MGTE:0; 100:4,in,out,bad,dupe;
+ * 4 MGTR:0; 100:4,in,out,bad,dupe;
+ * 5 MGTT:0; 100:4,in,out,bad,dupe;
+ * 6 MGTF:0; 100:6,in,out,bad,dupe,magics,hatched;
+ * 7 MGBB:0; 100:9,sessions,minutes,posted,uploads,kbupload,downloads,kbdownload,chats,chatminutes;
+ * 8 MGOB:0; 100:1,size;
+ */
+
+
+void usage(void);
+void die(int);
+
+
+
+void usage(void)
+{
+ fprintf(stderr, "\nMBSNMP: MBSE BBS %s SNMP subagent\n", VERSION);
+ fprintf(stderr, " %s\n", COPYRIGHT);
+ fprintf(stderr, "\nUsage: mbsnmp \n\n");
+ exit(MBERR_COMMANDLINE);
+}
+
+
+
+void die(int onsig)
+{
+ signal(onsig, SIG_IGN);
+
+ if (onsig)
+ Syslog('+', "Terminated on signal %d", onsig);
+
+ ExitClient(onsig);
+}
+
+
+
+int main(int argc, char **argv)
+{
+ int i, getnext = FALSE, group = 0, sub = 0, params, val;
+ char *cmd, *t1, *t2, *saveptr1 = NULL, *saveptr2 = NULL, *token1, *token2;
+ char *base_save, *req_save, *envptr = NULL, *req_oid, *base_oid, *resp, *type;
+ struct passwd *pw;
+
+ /*
+ * First, check the syntax and parameters.
+ */
+ if (argc != 4)
+ usage();
+ if (strcmp(argv[2],"-n") && strcmp(argv[2],"-g"))
+ usage();
+ base_oid = argv[1];
+ req_oid = argv[3];
+ getnext = strcmp(argv[2], "-g");
+ if (strncmp(base_oid, req_oid, strlen(base_oid)))
+ usage();
+
+ /*
+ * The next trick is to supply a fake environment variable
+ * MBSE_ROOT because most likely we are started from snmpd.
+ * This will setup the variable so InitConfig() will work.
+ * The /etc/passwd must point to the correct homedirectory.
+ */
+ pw = getpwnam((char *)"mbse");
+ if (getenv("MBSE_ROOT") == NULL) {
+ envptr = xstrcpy((char *)"MBSE_ROOT=");
+ envptr = xstrcat(envptr, pw->pw_dir);
+ putenv(envptr);
+ }
+
+ InitConfig();
+
+ /*
+ * Catch or ignore signals
+ */
+ for (i = 0; i < NSIG; i++) {
+ if ((i == SIGHUP) || (i == SIGINT) || (i == SIGBUS) || (i == SIGILL) || (i == SIGSEGV) || (i == SIGTERM) || (i == SIGIOT))
+ signal(i, (void (*))die);
+ else if ((i != SIGKILL) && (i != SIGSTOP))
+ signal(i, SIG_IGN);
+ }
+
+ cmd = xstrcpy((char *)"Cmd:");
+
+ for (i = 1; i < argc; i++) {
+ cmd = xstrcat(cmd, (char *)" ");
+ cmd = xstrcat(cmd, argv[i]);
+ }
+
+ pw = getpwuid(getuid());
+ InitClient(pw->pw_name, (char *)"mbsnmp", CFG.location, CFG.logfile,
+ CFG.util_loglevel, CFG.error_log, CFG.mgrlog, CFG.debuglog);
+
+ Syslog('f', cmd);
+ free(cmd);
+
+// Syslog('+', "base oid %s", base_oid);
+// Syslog('+', "req_oid %s", req_oid);
+// Syslog('+', "getnext %s", getnext ? "True":"False");
+
+ base_save = xstrcpy(base_oid);
+ req_save = xstrcpy(req_oid);
+ for (i = 1, t1 = base_oid, t2 = req_oid; ; i++, t1 = NULL, t2 = NULL) {
+ token1 = strtok_r(t1, ".", &saveptr1);
+ token2 = strtok_r(t2, ".", &saveptr2);
+ if ((token1 == NULL) || (token2 == NULL))
+ break;
+// Syslog('-', "%d %s %s", i, token1, token2);
+ }
+
+ /*
+ * Complete the requested OID if needed.
+ */
+ if (token2) {
+ group = atoi(token2);
+// Syslog('-', "%d %s %s", i, token1, token2);
+ t2 = NULL;
+ token2 = strtok_r(t2, ".", &saveptr2);
+ if (token2) {
+// Syslog('-', "%d %s %s", i, token1, token2);
+ sub = atoi(token2);
+ }
+ }
+
+// Syslog('+', "group=%d sub=%d", group, sub);
+
+ if ((group < 0) || (group > 8)) {
+ die(MBERR_OK);
+ }
+
+ switch (group) {
+ case 0: resp = SockR("MGMS:0;"); break;
+ case 1: resp = SockR("MGTN:0;"); break;
+ case 2: resp = SockR("MGTI:0;"); break;
+ case 3: resp = SockR("MGTE:0;"); break;
+ case 4: resp = SockR("MGTR:0;"); break;
+ case 5: resp = SockR("MGTT:0;"); break;
+ case 6: resp = SockR("MGTF:0;"); break;
+ case 7: resp = SockR("MGBB:0;"); break;
+ case 8: resp = SockR("MGOB:0;"); break;
+ default: resp = (char *)"200:0;";
+ }
+
+// Syslog('+', "resp %s", resp);
+
+ t1 = strtok(resp, ":");
+ t1 = strtok(NULL, ",");
+ params = atoi(t1);
+
+// Syslog('+', "params=%d", params);
+ for (i = 0; i < params; i++) {
+ t1 = strtok(NULL, ",;");
+// Syslog('+', "t1 %d %s", i, t1);
+ val = atoi(t1);
+ if (i == sub)
+ break;
+ }
+
+ /*
+ * The value type defaults to counter.
+ */
+ type = (char *)"counter";
+ if ((group == 8) && (sub == 0))
+ type = (char *)"integer";
+
+ if ((group < 9) && (sub < params)) {
+ if (getnext) {
+ sub++;
+ if ((sub >= params) && (group < 8)) {
+ sub = 0;
+ group++;
+ }
+ }
+ printf("%s.%d.%d\n", base_save, group, sub);
+ printf("%s\n", type);
+ printf("%d\n", val);
+ Syslog('f', "Rsp: %s %s => %s.%d.%d %s %d", req_save, getnext ? "N":"G", base_save, group, sub, type, val);
+ }
+
+ die(MBERR_OK);
+ return 0;
+}
+
+
+
diff --git a/mbutils/mbsnmp.h b/mbutils/mbsnmp.h
new file mode 100644
index 00000000..4171eca4
--- /dev/null
+++ b/mbutils/mbsnmp.h
@@ -0,0 +1,8 @@
+/* $Id$ */
+
+#ifndef _MBSNMP_H
+#define _MBSNMP_H
+
+
+
+#endif