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