void httpsession_read(struct event *ev,int what, void *d) { size_t len=0; size_t conten_len=0; char *line=NULL; char *ptr=NULL; //ptr=buff_tail_ptr() HttpSession *session = (HttpSession *)d; len=buff_read(session->fd, session->request.buff, buff_tail_left(session->request.buff)); if(len<=0 ) goto fail; while( (line=buff_get_line( session->request.buff,EOL_CRLF)) !=NULL ) { if(session->request.prase_status==HPARSE_HEAD ) { if( strlen(line)==0 ) { session->request.prase_status=HPARSE_CONTENT; break; } if(http_parse_head(&session->request, line) == -1) { TraceErr("http_parse_head fail\n"); goto fail; } continue; } if(session->request.prase_status==HPARSE_FIRST_LINE) { if(http_parse_first_line(&session->request,line)==-1) goto fail; session->request.prase_status=HPARSE_HEAD; continue; } } if(session->request.prase_status== HPARSE_CONTENT ) { if(buff_len(session->request.buff) >= session->request.content_len) { session->request.prase_status = HPARSE_DONE; if(httpserver_route_request(session)!=200)goto fail; //if(session->server->request_callback(session,session->server->arg) != 0 ) // goto fail; //event_fd_setflags(session->ev,EPOLLIN|EPOLLOUT); //event_fd_setcallback(session->ev,httpsession_write); event_fd_setcallback(session->ev,httpsession_file_write); event_fd_setflags(session->ev,EPOLLOUT); } } return; fail: TraceErr("httpsession_read fail\n"); httpserver_session_free(session); return; }
void* mr_map(void* id_arg) { struct wc_cache; uint32_t tid; off_t size; char* buff; char last; int ret; last = 0; ret = -1; size = 0; tid = ((struct thread_info_s*)id_arg)->thread_num; if((ret = buff_init(tid))) goto _END; while(!(ret = buff_read(tid, &buff, &size, &last))) { /* Nothing to do */ if(!size) break; if(buff_hdl(tid, buff, size, last)) goto _END; /* If this was the last buffer */ if(last) break; } if(buff_destroy()) goto _END; /* wait for other worker before merging */ if(pthread_barrier_wait(&barrier) > 0) { perror("bar wait"); goto _END; } /* merge results (done in parrallel) */ ret = wcc_merge_results(tid, nb_thread); //wcc_print(tid); _END: return ((void*) (long) ret); }
/** * Stores string from top of global buffer into a given file * * @param file path * @return NULL */ void *thread_write_with_mutex (void *params) { FILE *fp; char *str; char *file; t_thread_parameters *p; p = (t_thread_parameters *)params; file = malloc(sizeof(strlen(p->file))); strcpy(file, p->file); fp = fopen (file, "w+"); if (fp != NULL) { while ((gl_buff.quit_flag == 0) || (!buff_empty())) { usleep (p->sleep_time); while (buff_empty()) { printf ("drain thread: no new strings in buffer\n"); } sem_wait (&lock); str = buff_read(); if ((strcmp (str, "QUIT")) == 0) { printf ("drain thread: read [QUIT] from buffer\n"); gl_buff.quit_flag = 1; } else { printf ("drain thread: read from buffer\n"); #ifdef DEBUG printf ("read '%s' size of %d\n", str, (int) strlen(str)); #endif fwrite (str, 1, strlen(str), fp); } sem_post (&lock); } } fclose (fp); printf ("drain thread: quitting\n"); return NULL; }
int get_next_line(int fd, char **line) { t_gnlfd *gnl; int len; if (fd >= 0 && line != NULL && (gnl = get_gnlfd(fd)) != NULL) while (1) { gnl->i--; while (++(gnl->i) < gnl->length) if (gnl->buff[gnl->i] == '\n' || gnl->buff[gnl->i] == -1) return (buff_cut(gnl, gnl->i, line, 1)); if ((len = buff_read(gnl)) < 0) break ; if (len == 0 && gnl->length == 0) return (*line = NULL, free(gnl->buff - gnl->offset), *gnl = (t_gnlfd){NULL, fd, 0, 0, 0, gnl->next}, 0); if (len == 0) return (buff_cut(gnl, gnl->length, line, 0)); } return (-1); }
void httpsession_file_write(struct event *ev,int what, void *d) { HttpSession *session = (HttpSession *)d; Buff *buff=session->response; int file_fd=session->file_fd; int len=0; /*here is most send http head or fail with EAGAIN*/ if(buff_len(buff)>0 ) { len=buff_write(session->fd,buff,buff_len(buff)); if(len<0) { if(errno == EAGAIN) { return; } } } while(1) { buff_set_startpos( buff,0); /*read file*/ do { len=buff_read(file_fd,buff,buff_tail_left(buff)); if(len == 0 ) { httpserver_session_free( session); return; } if(len == -1) { if(errno == EAGAIN) { continue; } TraceErr("read file fail:%s\n",strerror(errno)); httpserver_session_free( session); return ; } }while(0); session->total_read+=len; /*send out*/ len=buff_write(session->fd,buff,buff_len(buff)); if(len<0) { /*socket buff full,try again*/ if(errno == EAGAIN) { return; } /*error free session*/ TraceErr("session write:FAIL\n"); httpserver_session_free( session); break; } //printf("session write:%u\n",len); } }