summaryrefslogblamecommitdiffstats
path: root/innbbsd/daemon.c
blob: 973a96c83047be067855e88b68c82289ba7aecd6 (plain) (tree)












































































































































































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