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