diff --git a/src/appinterface.c b/src/appinterface.c index d03b82e..334635e 100644 --- a/src/appinterface.c +++ b/src/appinterface.c @@ -250,7 +250,7 @@ static int _send_buffer(char * data, int datalen, char * buf, int buflen, return 0; } -static int _send_string(char * string, char * buf, int buflen, int * pos) +static int _send_string(char * string, char buf[], int buflen, int * pos) { int i = 0; @@ -266,3 +266,34 @@ static int _send_string(char * string, char * buf, int buflen, int * pos) } return 1; } + + +/* appinterface_receive */ +static char * _read_string(char buf[], int buflen, int * pos); +int appinterface_receive(AppInterface * appinterface, char buf[], int buflen) +{ + int pos = 0; + char * func; + int i; + +#ifdef DEBUG + fprintf(stderr, "%s", "appinterface_receive();\n"); +#endif + if((func = _read_string(buf, buflen, &pos)) == NULL) + return -1; + for(i = 0; i < appinterface->calls_cnt; i++) + if(string_compare(appinterface->calls[i].name, func) == 0) + break; + if(i == appinterface->calls_cnt) + return -1; + return pos; +} + +static char * _read_string(char buf[], int buflen, int * pos) +{ + for(; *pos < buflen && buf[*pos] != '\0'; (*pos)++); + if(*pos == buflen) + return NULL; + (*pos)++; + return buf; +} diff --git a/src/appinterface.h b/src/appinterface.h index c074e28..ac8e89b 100644 --- a/src/appinterface.h +++ b/src/appinterface.h @@ -19,5 +19,6 @@ void appinterface_delete(AppInterface * appinterface); /* useful */ int appinterface_call(AppInterface * appinterface, char * call, char buf[], int buflen, void ** args); +int appinterface_receive(AppInterface * appinterface, char buf[], int buflen); #endif /* !APP_INTERFACE_H */ diff --git a/src/appserver.c b/src/appserver.c index ee3bf6b..ab83f82 100644 --- a/src/appserver.c +++ b/src/appserver.c @@ -146,6 +146,7 @@ static int _appserver_read(int fd, AppServer * appserver) return _read_process(appserver, asc); } +static int _read_logged(AppServer * appserver, AppServerClient * asc); static int _read_process(AppServer * appserver, AppServerClient * asc) { switch(asc->state) @@ -153,47 +154,30 @@ static int _read_process(AppServer * appserver, AppServerClient * asc) case ASCS_NEW: /* FIXME authenticate */ case ASCS_LOGGED: - /* FIXME check errors */ - break; + return _read_logged(appserver, asc); } - return 0; + return 1; } - -/* static int _appserver_write(int fd, AppServer * appserver) +static int _appserver_receive(AppServer * appserver, AppServerClient * asc); +static int _read_logged(AppServer * appserver, AppServerClient * asc) { - AppServerClient * asc = NULL; - unsigned int i; - int len; + return _appserver_receive(appserver, asc); +} - for(i = 0; i < array_count(appserver->clients); i++) - { - if(!array_get(appserver->clients, i, &asc)) - break; - if(fd == asc->fd) - break; - asc = NULL; - } - if(asc == NULL) - return 1; - len = asc->buf_read_cnt; - if((len = write(fd, asc->buf_write, len)) <= 0) - { - if(asc->buf_read_cnt == ASC_BUFSIZE) - event_unregister_io_read(appserver->event, fd); - event_unregister_io_write(appserver->event, fd); - array_remove_pos(appserver->clients, i); - appserverclient_delete(asc); - return 1; - } - memmove(asc->buf_write, &asc->buf_write[len], len); - asc->buf_write_cnt-=len; -#ifdef DEBUG - fprintf(stderr, "%s%d%s%d%s", "_appserver_write(", fd, - ", appserver): ", len, " characters written\n"); -#endif +static int _appserver_receive(AppServer * appserver, AppServerClient * asc) +{ + int i; + + if((i = appinterface_receive(appserver->interface, asc->buf_read, + asc->buf_read_cnt)) == -1) + return -1; + if(i <= 0 || i > asc->buf_read_cnt) + return -1; + memmove(asc->buf_read, &asc->buf_read[i], asc->buf_read_cnt-i); + asc->buf_read_cnt-=i; return 0; -} */ +} /* public */