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