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