summaryrefslogblamecommitdiffstats
path: root/innbbsd/daemon.c
blob: b764fda14310bf6e5cefc82285ace46cc246a6f6 (plain) (tree)
1
2
3
4
5
6
7
8
                   

                   



                                                                       
 





                                      
 




                                     
 


                                

 


                        
 

                                           
               
                                                               
      



                                             


     


                        
 








                                                         
         









                                                              
 







                                                      
 


                                                              
                  


                                                   
      
                                            
                  



                                                    
      


                                     
                  
                                                               
      

















                                                                          
         



                             





                          


                                   
 


















                                                             

 


                         
 




                                                                            

 


                           
 

                          

 


                           
 

                        
 
#include <string.h>
#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);
}