summaryrefslogtreecommitdiffstats
path: root/daemon/innbbsd/daemon.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/innbbsd/daemon.c')
-rw-r--r--daemon/innbbsd/daemon.c177
1 files changed, 177 insertions, 0 deletions
diff --git a/daemon/innbbsd/daemon.c b/daemon/innbbsd/daemon.c
new file mode 100644
index 00000000..b764fda1
--- /dev/null
+++ b/daemon/innbbsd/daemon.c
@@ -0,0 +1,177 @@
+#include <string.h>
+#include "daemon.h"
+/*
+ * typedef struct daemoncmd { char *cmdname; char *usage; int argc; int
+ * (*main) ARG((FILE*,FILE*,int,char**,char*)); } daemoncmd_t;
+ *
+ */
+
+void deargify ARG((char ***));
+static daemoncmd_t *dcmdp = NULL;
+static char *startupmessage = NULL;
+static int startupcode = 100;
+static FILE *DIN, *DOUT, *DIO;
+typedef int (*F) ();
+
+void
+installdaemon(cmds, code, startupmsg)
+ daemoncmd_t *cmds;
+ int code;
+ char *startupmsg;
+{
+ dcmdp = cmds;
+ startupcode = code;
+ startupmessage = startupmsg;
+}
+
+daemoncmd_t *
+searchcmd(cmd)
+ char *cmd;
+{
+ daemoncmd_t *p;
+ for (p = dcmdp; p->name != NULL; p++) {
+#ifdef DEBUGCMD
+ printf("searching name %s for cmd %s\n", p->name, cmd);
+#endif
+ if (!strncasecmp(p->name, cmd, 1024))
+ return p;
+ }
+ return NULL;
+}
+
+#if 0
+int
+daemon(dfd)
+ int dfd;
+{
+ static char BUF[1024];
+ /* hash_init(); */
+ if (dfd > 0) {
+ DIO = fdopen(dfd, "rw");
+ DIN = fdopen(dfd, "r");
+ DOUT = fdopen(dfd, "w");
+ if (DIO == NULL || DIN == NULL || DOUT == NULL) {
+ perror("fdopen");
+ return -1;
+ }
+ }
+ if (startupmessage) {
+ fprintf(DOUT, "%d %s\n", startupcode, startupmessage);
+ fflush(DOUT);
+ }
+ while (fgets(BUF, 1024, DIN) != NULL) {
+ int i;
+ int (*Main) ();
+ daemoncmd_t *dp;
+ argv_t Argv;
+
+ char *p = (char *)strchr(BUF, '\r');
+ if (p == NULL)
+ p = (char *)strchr(BUF, '\n');
+ if (p == NULL)
+ continue;
+ *p = '\0';
+ if (p == BUF)
+ continue;
+
+ Argv.argc = 0, Argv.argv = NULL, Argv.inputline = BUF;
+ Argv.in = DIN, Argv.out = DOUT;
+ printf("command entered: %s\n", BUF);
+#ifdef DEBUGSERVER
+ fprintf(DOUT, "BUF in client %s\n", BUF);
+ fprintf(stdout, "BUF in server %s\n", BUF);
+ fflush(DOUT);
+#endif
+ Argv.argc = argify(BUF, &Argv.argv);
+#ifdef DEBUGSERVER
+ fprintf(stdout, "argc %d argv ", Argv.argc);
+ for (i = 0; i < Argv.argc; ++i)
+ fprintf(stdout, "%s ", Argv.argv[i]);
+ fprintf(stdout, "\n");
+#endif
+ dp = searchcmd(Argv.argv[0]);
+ Argv.dc = dp;
+ if (dp) {
+#ifdef DEBUGSERVER
+ printf("find cmd %s by %s\n", dp->name, dp->usage);
+#endif
+ if (Argv.argc < dp->argc) {
+ fprintf(DOUT, "%d Usage: %s\n", dp->errorcode, dp->usage);
+ fflush(DOUT);
+ goto cont;
+ }
+ if (dp->argno != 0 && Argv.argc > dp->argno) {
+ fprintf(DOUT, "%d Usage: %s\n", dp->errorcode, dp->usage);
+ fflush(DOUT);
+ goto cont;
+ }
+ Main = dp->main;
+ if (Main) {
+ fflush(stdout);
+ (*Main) (&Argv);
+ }
+ } else {
+ fprintf(DOUT, "99 command %s not available\n", Argv.argv[0]);
+ fflush(DOUT);
+ }
+cont:
+ deargify(&Argv.argv);
+ }
+ /* hash_reclaim(); */
+}
+#endif
+
+#define MAX_ARG 32
+#define MAX_ARG_SIZE 16384
+
+int
+argify(line, argvp)
+ char *line, ***argvp;
+{
+ static char *argvbuffer[MAX_ARG + 2];
+ char **argv = argvbuffer;
+ int i;
+ static char argifybuffer[MAX_ARG_SIZE];
+ char *p;
+ while (strchr("\t\n\r ", *line))
+ line++;
+ i = strlen(line);
+ /* p=(char*) mymalloc(i+1); */
+ p = argifybuffer;
+ strncpy(p, line, sizeof argifybuffer);
+ for (*argvp = argv, i = 0; *p && i < MAX_ARG;) {
+ for (*argv++ = p; *p && !strchr("\t\r\n ", *p); p++);
+ if (*p == '\0')
+ break;
+ for (*p++ = '\0'; strchr("\t\r\n ", *p) && *p; p++);
+ }
+ *argv = NULL;
+ return argv - *argvp;
+}
+
+void
+deargify(argv)
+ char ***argv;
+{
+ return;
+ /*
+ * if (*argv != NULL) { if (*argv[0] != NULL){ free(*argv[0]); argv[0] =
+ * NULL; } free(*argv); argv = NULL; }
+ */
+}
+
+int
+daemonprintf(format)
+ char *format;
+{
+ fprintf(DOUT, format);
+ fflush(DOUT);
+}
+
+int
+daemonputs(output)
+ char *output;
+{
+ fputs(output, DOUT);
+ fflush(DOUT);
+}