#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); }