summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2009-06-13 21:09:28 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2009-06-13 21:09:28 +0800
commit043d8361706539a4aa620232e096682fc83035ab (patch)
tree59794d299825825436863c92bfc5e4b5c6dcc70a
parent7a80b6b9984876bd3ebe1b5aa41df90dc61fa892 (diff)
downloadpttbbs-043d8361706539a4aa620232e096682fc83035ab.tar
pttbbs-043d8361706539a4aa620232e096682fc83035ab.tar.gz
pttbbs-043d8361706539a4aa620232e096682fc83035ab.tar.bz2
pttbbs-043d8361706539a4aa620232e096682fc83035ab.tar.lz
pttbbs-043d8361706539a4aa620232e096682fc83035ab.tar.xz
pttbbs-043d8361706539a4aa620232e096682fc83035ab.tar.zst
pttbbs-043d8361706539a4aa620232e096682fc83035ab.zip
* support bindports.conf in bbsctl.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@4592 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r--sample/etc/bindports.conf88
-rw-r--r--util/bbsctl.c109
2 files changed, 153 insertions, 44 deletions
diff --git a/sample/etc/bindports.conf b/sample/etc/bindports.conf
index de90f73b..ed6cfe33 100644
--- a/sample/etc/bindports.conf
+++ b/sample/etc/bindports.conf
@@ -1,47 +1,65 @@
# Bind Port List
# ----------------------------------------------
-# syntax: <program> <port> <option>
+# syntax: <program> <port/service> <option>
# program: arbitary name
# port: numeric port number or special name.
-# currently supported special name(s):
-# * tunnel (tunnel mode connection)
# option: parameter to this connection.
-# * port: none
-# * tunnel: tunnel path
# ----------------------------------------------
+# mode selection for 'bbsctl start'
+# ----------------------------------------------
+# * current available modes: mbbsd, logind
+bbsctl mode mbbsd
+#bbsctl mode logind
+
# standalone mbbsd ports
+# ----------------------------------------------
+# * list all ports you want mbbsd to listen here.
mbbsd 23
-#mbbsd 443
-#mbbsd 3000
-#mbbsd 3001
-#mbbsd 3002
-#mbbsd 3003
-#mbbsd 3004
-#mbbsd 3005
-#mbbsd 3006
-#mbbsd 3007
-#mbbsd 3008
-#mbbsd 3009
-#mbbsd 3010
+mbbsd 443
+mbbsd 3000
+mbbsd 3001
+mbbsd 3002
+mbbsd 3003
+mbbsd 3004
+mbbsd 3005
+mbbsd 3006
+mbbsd 3007
+mbbsd 3008
+mbbsd 3009
+mbbsd 3010
+
+# logind ports
+# ----------------------------------------------
+# * list all ports for logind to listen here.
+#logind 23
+#logind 443
+#logind 3000
+#logind 3001
+#logind 3002
+#logind 3003
+#logind 3004
+#logind 3005
+#logind 3006
+#logind 3007
+#logind 3008
+#logind 3009
+#logind 3010
-# following settings are only required if you use logind
-# # tunnel mappings
-# mbbsd tunnel run/logind.tunnel
-# logind tunnel run/logind.tunnel
+# logind client setings
+# ----------------------------------------------
+# * if this is set, each restart logind will
+# also invoke the client.
+#
+# * example (let mbbsd listen to all tunnel+ports)
+#logind client bin/mbbsd -d -f etc/bindports.conf
#
-# # logind ports
-# logind 23
-# logind 443
-# logind 3000
-# logind 3001
-# logind 3002
-# logind 3003
-# logind 3004
-# logind 3005
-# logind 3006
-# logind 3007
-# logind 3008
-# logind 3009
-# logind 3010
+# * example (let one mbbsd listen to tunnel only)
+#logind client bin/mbbsd -n run/logind.tunnel
+
+# tunnel mappings
+# ----------------------------------------------
+# * to configure the path of tunnels
+#mbbsd tunnel run/logind.tunnel
+#logind tunnel run/logind.tunnel
diff --git a/util/bbsctl.c b/util/bbsctl.c
index 80a57dfa..e8b6e067 100644
--- a/util/bbsctl.c
+++ b/util/bbsctl.c
@@ -48,17 +48,95 @@ int HaveBBSADM(void)
return 0;
}
+enum {
+ BINDPORTS_MODE_NONE = 0,
+ BINDPORTS_MODE_MBBSD,
+ BINDPORTS_MODE_LOGIND,
+};
+
+int parse_bindports_mode(const char *fn)
+{
+ int mode = BINDPORTS_MODE_NONE;
+ char buf[PATHLEN], vprogram[STRLEN], vservice[STRLEN], vopt[STRLEN];
+ FILE *fp = fopen(fn, "rt");
+ if (!fp)
+ return mode;
+
+ while(fgets(buf, sizeof(buf), fp))
+ {
+ if (sscanf(buf, "%s%s%s", vprogram, vservice, vopt) != 3 ||
+ strcmp(vprogram, "bbsctl") != 0)
+ continue;
+
+ // the only service we understand now is 'mode'
+ if (strcmp(vservice, "mode") != 0)
+ {
+ printf("sorry, unknown service: %s", buf);
+ break;
+ }
+
+ if (strcmp(vopt, "mbbsd") == 0)
+ {
+ mode = BINDPORTS_MODE_MBBSD;
+ break;
+ }
+ else if (strcmp(vopt, "logind") == 0)
+ {
+ mode = BINDPORTS_MODE_LOGIND;
+ break;
+ }
+ }
+
+ fclose(fp);
+ return mode;
+}
+
int startbbs(int argc, char **argv)
{
+ const char *bindports_fn = BBSHOME "/" FN_CONF_BINDPORTS;
+#if 0
if( setuid(0) < 0 ){
perror("setuid(0)");
exit(1);
}
- printf("starting mbbsd at 23, 443, 3000-3010\n");
+#endif
+
+ // if there's bindports.conf, use it.
+ if (dashs(bindports_fn) > 0)
+ {
+ // rule 2, if bindports.conf exists, load it.
+ printf("starting bbs by %s\n", bindports_fn);
+
+ // load the conf and determine how should we start the services.
+ switch(parse_bindports_mode(bindports_fn))
+ {
+ case BINDPORTS_MODE_NONE:
+ printf("mode is not assigned. fallback to default ports.\n");
+ break;
+ case BINDPORTS_MODE_MBBSD:
+ execl(BBSHOME "/bin/mbbsd", "mbbsd", "-d", "-f", bindports_fn, NULL);
+ printf("mbbsd startup failed...\n");
+ break;
+ case BINDPORTS_MODE_LOGIND:
+ execl(BBSHOME "/bin/logind", "logind", "-d", "-f", bindports_fn, NULL);
+ printf("logind startup failed...\n");
+ break;
+ }
+ }
+
+ // default: start listening ports with mbbsd.
+ printf("starting mbbsd by at 23, 443, 3000-3010\n");
execl(BBSHOME "/bin/mbbsd", "mbbsd", "-d", "-p23", "-p443",
- "-p3000", "-p3001", "-p3002", "-p3003", "-p3004", "-p3005",
- "-p3006", "-p3007", "-p3008", "-p3009", "-p3010", NULL);
- printf("starting mbbsd failed\n");
+ "-p3000", "-p3001", "-p3002", "-p3003", "-p3004", "-p3005",
+ "-p3006", "-p3007", "-p3008", "-p3009", "-p3010", NULL);
+
+ if (dashs(BBSHOME "/" FN_CONF_BINDPORTS) > 0)
+ {
+ // execl(BBSHOME "/bin/mbbsd", "mbbsd", "-d", "-f", FN_CONF_BINDPORTS, NULL);
+ execl(BBSHOME "/bin/logind", "logind", "-f", BBSHOME "/" FN_CONF_BINDPORTS, NULL);
+ } else {
+ }
+ printf("starting daemons failed\n");
return 1;
}
@@ -74,12 +152,25 @@ int stopbbs(int argc, char **argv)
}
while( (de = readdir(dirp)) ){
- if( strstr(de->d_name, "mbbsd") && strstr(de->d_name, "pid")){
+ if (!strstr(de->d_name, ".pid"))
+ continue;
+ // TODO use "mbbsd." and "logind." ?
+ if( strstr(de->d_name, "mbbsd") || strstr(de->d_name, "logind")) {
sprintf(fn, BBSHOME "/run/%s", de->d_name);
if( (fp = fopen(fn, "r")) != NULL ){
if( fgets(buf, sizeof(buf), fp) != NULL ){
- printf("stopping listening-mbbsd at pid %5d\n", atoi(buf));
- kill(atoi(buf), SIGKILL);
+ int pid = atoi(buf);
+ if (pid < 2)
+ {
+ printf("invalid pid record: %s\n", fn);
+ } else {
+ char *sdot = NULL;
+ strlcpy(buf, de->d_name, sizeof(buf));
+ sdot = strchr(buf, '.');
+ if (sdot) *sdot = 0;
+ printf("stopping listening-%s at pid %5d\n", buf, pid);
+ kill(pid, SIGKILL);
+ }
}
fclose(fp);
unlink(fn);
@@ -418,8 +509,8 @@ struct {
int (*func)(int, char **);
char *cmd, *descript;
} cmds[] =
- { {startbbs, "start", "start mbbsd at port 23, 3000~3010"},
- {stopbbs, "stop", "killall listening mbbsd"},
+ { {startbbs, "start", "start mbbsd/logind daemons "},
+ {stopbbs, "stop", "killall listening daemons (mbbsd+logind)"},
{restartbbs, "restart", "stop and then start"},
{bbsadm, "bbsadm", "switch to user: bbsadm"},
{bbstest, "test", "run ./mbbsd as bbsadm"},