/* * 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,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) { printf("Login: %s\n",uri->path+9); 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; }