/*
 * kakumei.c
 *
 * Private group web.
 *
 * Author: Dario Rodriguez dario@softhome.net
 * This progran is licensed under the terms of the Affero GPL v1+
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include "gen_res.h"
#include "socklib.h"
#include "webkernel.h"

typedef struct kakumei {
        sselect *ssel;
        wk *web;
} kakumei;


static int signal_init(int signum, void (*fn)(int));
static void sigint(int signum);
volatile int sigint_flag=0;

wk_action callback_http(wk *web, int connid, wk_uri *uri, void *userptr);

int
main(int argc, char *argv[])
{
        int port;
        int timeout=500;
        kakumei *ka,kastore;
        memset(&kastore,0,sizeof(kastore));
        ka=&kastore;
        if(argc!=2) {
                printf("Syntax: %s port\n",argv[0]);
                return(1);
        }
        port=atoi(argv[1]);
        if((ka->ssel=sselect_init())==NULL) {
                fprintf(stderr,"ERROR: insufficient memory\n");
                return(1);
        }
        if((ka->web=wk_init(port,ka->ssel,NULL,callback_http,NULL,NULL,ka))==NULL) {
                sselect_free(ka->ssel),ka->ssel=NULL;
                fprintf(stderr,"ERROR: couldn't init web server\n");
                return(2);
        }
        sigint_flag=0;
        signal_init(SIGINT,sigint);
        while(!sigint_flag) {
                sselect_wait(ka->ssel,timeout);
                wk_service(ka->web);
        }
        wk_free(ka->web),ka->web=NULL;
        sselect_free(ka->ssel),ka->ssel=NULL;
        return(0);
}

wk_action
callback_http(wk *web, int connid, wk_uri *uri, void *userptr)
{
        kakumei *ka=(kakumei *)userptr;
        resindex *res;
        if(ka==NULL)
                return(wkact_finished);
        if((strcmp(uri->path,"/")==0 && (res=res_find(resindexdata,"index.html"))!=NULL) ||
          (uri->path[0]=='/' && (res=res_find(resindexdata,uri->path+1))!=NULL)) {
                wk_serve_buffer_as_file(web,connid,res->data,res->len,mime_getdefault(res->name,"application/octet-stream"));
                return(wkact_finished);
        }
        if(memcmp(uri->path,"/doLogin?",9)==0) {
                char u[128],p[128];
                if(wk_uri_copyvar(uri,"u",u,sizeof(u))==NULL)
                        u[0]='\0';
                if(wk_uri_copyvar(uri,"p",p,sizeof(p))==NULL)
                        p[0]='\0';
                printf("URI: %s\n",uri->path);
                printf("Login: \"%s\"\n",u);
                printf("Pass.: \"%s\"\n",p);
                wk_serve_error(web,connid,wkerr_internal);
                return(wkact_finished);
        }
        printf("URI not found: %s\n",uri->path);
        wk_serve_error(web,connid,wkerr_notfound);
        return(wkact_finished);
}

static int
signal_init(int signum, void (*fn)(int))
{
        struct sigaction sa;
        sa.sa_handler=fn;
        sigemptyset(&sa.sa_mask);
        sa.sa_flags=0;
        return(sigaction(signum,&sa,0));
}

static void
sigint(int signum)
{
        sigint_flag=1;
}