예제 #1
0
파일: http.c 프로젝트: whtc123/mysource
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;
}
예제 #2
0
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;
}
예제 #4
0
파일: get_next_line.c 프로젝트: aempisse/42
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);
}
예제 #5
0
파일: http.c 프로젝트: whtc123/mysource
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);
	}
	
}