Esempio n. 1
0
static int 
lxl_conf_read_token(lxl_conf_t *cf)
{
	char ch, *dst, *src, *start;
	off_t file_size;
	size_t len;
	ssize_t n, size;
	lxl_str_t *word;
	lxl_buf_t *b;
	lxl_uint_t found, start_line, last_space, sharp_comment;

	found = 0;
	last_space = 1;
	sharp_comment = 0;

	lxl_array_clear(cf->args);
	b = cf->conf_file->buffer;
	start = b->pos;
	start_line = cf->conf_file->line;

	file_size = lxl_file_size(&cf->conf_file->file.info);

	for (; ;) {
		if (b->pos >= b->last) {
			if (cf->conf_file->file.offset >= file_size) {
				if (cf->args->nelts > 0 || !last_space) {
					lxl_conf_log_error(LXL_LOG_EMERG, cf, 0, "unexpected end file, \";\" or \"}\"");
					return LXL_ERROR;
				}

				return LXL_CONF_FILE_DONE;
			}		

			len = b->pos - start;
			if (len == LXL_CONF_BUFFER) {
				cf->conf_file->line = start_line;
				lxl_conf_log_error(LXL_LOG_EMERG, cf, 0, "too long paraments \"%*s...\" started", start);
				return LXL_ERROR;
			}

			if (len) {
				memmove(b->start, start, len);
			}

			size = (ssize_t) (file_size - cf->conf_file->file.offset);
			if (size > b->end - (b->start + len)) {
				size = b->end - (b->start + len);
			}

			n = lxl_read_file(&cf->conf_file->file, b->start + len, size, cf->conf_file->file.offset);
			if (n == -1) {
				return -1;
			}

			if (n != size) {
				lxl_conf_log_error(LXL_LOG_EMERG, cf, 0, lxl_read_file_n " returned only %ld bytes instead of %ld", n, size);
				return -1;
			}

			b->pos = b->start + len;
			b->last = b->pos + n;
			start = b->start;
		}
	
		ch = *b->pos++;
		if (ch == '\n') {
			cf->conf_file->line++;
			if (sharp_comment) {
				sharp_comment = 0;
			}
		}

		if (sharp_comment) {
			continue;
		}

		if (last_space) {
			if (ch == ' ' || ch == '\t' || ch == CR || ch == LF) {
				continue;
			}

			start = b->pos - 1;
			start_line = cf->conf_file->line;

			switch (ch) {
				case ';':
					if (lxl_array_nelts(cf->args) == 0) {
						lxl_conf_log_error(LXL_LOG_EMERG, cf, 0,  "unexpected \";\"");
						return LXL_ERROR;
					}

					return LXL_OK;
				
				case '{':
					if (lxl_array_nelts(cf->args) == 0) {
						lxl_conf_log_error(LXL_LOG_EMERG, cf, 0,  "unexpected \"{\"");
						return LXL_ERROR;
					}

					return LXL_CONF_BLOCK_START;

				case '}':
					if (lxl_array_nelts(cf->args) != 0) {
						lxl_conf_log_error(LXL_LOG_EMERG, cf, 0,  "unexpected \"}\"");
						return LXL_ERROR;
					}

					return LXL_CONF_BLOCK_DONE;
					
				case '#':
					sharp_comment = 1;
					continue;

				default:
					last_space = 0;
			}
		} else {
			if (ch == ' ' || ch == '\t' || ch == CR || ch == LF || ch == ';' || ch == '{') {
				last_space = 1;
				found = 1;
			}

			if (found) {
				word = lxl_array_push(cf->args);
				if (word == NULL) {
					return LXL_ERROR;
				}

				word->data = lxl_pnalloc(cf->pool, b->pos - start + 1);
				if (word == NULL) {
					return LXL_ERROR;
				}

				for (dst = word->data, src = start, len = 0; src < b->pos - 1; ++len) {
					*dst++ = *src++;
				}
				*dst = '\0';
				word->len = len;

				if (ch == ';') {
					return LXL_OK;
				}

				if (ch == '{') {
					return LXL_CONF_BLOCK_START;
				}

				found = 0;
			}
		}
	}
}
Esempio n. 2
0
static int 	 
lxl_process_options(lxl_cycle_t *cycle)
{
	char path[LXL_MAX_CONF_PATH];
	char *p;
	size_t len;

	if (lxl_prefix) {
		len = strlen(lxl_prefix);
		if (!lxl_file_separator(lxl_prefix[len - 1])) {
			p = lxl_pnalloc(cycle->pool, len + 2);
			if (p == NULL) {
				return -1;
			}

			memcpy(p, lxl_prefix, len + 1);
			p[len] = '/';
			++len;
			p[len] = '\0';
		} else {
			p = lxl_prefix;
		}
	} else {
		if (getcwd(path, LXL_MAX_CONF_PATH) == NULL) {
			lxl_log_stderr(errno, "[emerg]: getcwd failed");
			return -1;
		}

		len = strlen(path);
		if (!lxl_file_separator(path[len - 1])) {
			if (len + 1 >= LXL_MAX_CONF_PATH) {
				lxl_log_stderr(0, "[emerg]: prefix path %lu to long", len);
				return -1;
			}

			p = lxl_pnalloc(cycle->pool, len + 2);
			if (p == NULL) {
				return -1;
			}

			memcpy(p, path, len);
			p[len] = '/';
			++len;
			p[len] = '\0';
		} else {
			p = lxl_pnalloc(cycle->pool, len + 1);
			if (p == NULL) {
				return -1;
			}

			memcpy(p, path, len + 1);
		}
	}
	cycle->prefix.len = len;
	cycle->prefix.data = p;

	if (lxl_conf_file) {
		len = strlen(lxl_conf_file);
		p =  lxl_pnalloc(cycle->pool, len + 1);
		if (p == NULL) {
			return -1;
		}
		
		memcpy(p, lxl_conf_file, len + 1);
	} else {
		len = strlen(LXL_CONF_PATH);
		p =  lxl_pnalloc(cycle->pool, len + 1);
		if (p == NULL) {
			return -1;
		}
		
		memcpy(p, LXL_CONF_PATH, len + 1);
	}
	cycle->conf_file.len = len;
	cycle->conf_file.data = p;

	return 0;
}
Esempio n. 3
0
static void 	
lxl_dfss_download_handle_request(lxl_dfss_request_t *r)
{
	char 					   *p;
	size_t 						n;
	lxl_int_t 				    rc, body_n;
	lxl_str_t				   *fid;
	lxl_buf_t 				   *b;
	lxl_file_t 				   *file;
	lxl_event_t 			   *rev;
	lxl_connection_t 		   *c;
	lxl_dfs_response_header_t  *header;
	lxl_dfss_fid_value_t	   *value;
	//lxl_dfss_request_body_t    *rb;
	
	c = r->connection;
	if (r->complete) {
		r->complete = 0;
		rev = c->read;
		rev->handler = lxl_dfss_process_request_header;
		if (lxl_handle_read_event(rev) != 0) {
			// 
			return;
		}
	
		lxl_add_timer(rev, 10 * 1000);
		return;
	}

	//rb = r->body;
	fid = &r->body->fid;
	file = &r->body->file;

	value = lxl_hash1_find(&lxl_dfss_fid_hash, fid->data, fid->len);
	if (value == NULL) {
		rc = LXL_DFS_NOT_FIND_FID;
		//lxl_dfss_finalize_request(r, LXL_DFS_NOT_FIND_FID);
		//return;
		goto failed;
	}

	file->name.data = lxl_pnalloc(r->pool, value->name.len + 1);
	if (file->name.data == NULL) {
		rc = LXL_DFS_SERVER_ERROR;
		goto failed;
	}

	lxl_str_memcpy(&file->name, value->name.data, value->name.len);
	//file->info.st_size = value->size;

	lxl_log_debug(LXL_LOG_DEBUG_DFS, 0, "dfss download %s => %s, %lu", fid->data, file->name.data, file->info.st_size);

	file->fd = open(file->name.data, O_RDONLY);
	if (file->fd == -1) {
		lxl_log_error(LXL_LOG_ALERT, errno, "open(O_RDONLY) %s failed", file->name.data);
		rc = LXL_DFS_SERVER_ERROR;
		goto failed;
	}

	/* p = strrchr(file->name.data, '/');
	if (p == NULL) {
		return ;
	}

	hout->rcode = 1;
	p += 17;
	body_n = lxl_hextoi(p, 8);
	if (body_n == -1) {
		lxl_log_error(LXL_LOG_ERROR, 0, "dfss paring body_n lxl_hextoi(%s) failed", p);
		return;
	}

	hout->body_n = (uint32_t) body_n;
	hout->flen = 0;
	lxl_log_debug(LXL_LOG_DEBUG_DFS, 0, "dfss download file body_n %ld", hout->body_n);*/
	// fen kai you li yu zheng kuai du or zheng kuai xie
	
	//header->body_n = file->info.st_size;
	b = r->out = r->header_buf;
	header = &r->response_header;
	header->body_n = value->size;
	b->pos = b->start;
	b->last = b->start;
	*((uint32_t *) b->last) = htonl(header->body_n);
	b->last += 4;
	*((uint16_t *) b->last) = htons(header->flen);
	b->last += 2;
	*((uint16_t *) b->last) = htons(header->rcode);
	b->last += 2;

	n = c->send(c, b->pos, b->last - b->pos);
	if (n == -1) {
		lxl_dfss_finalize_request(r, LXL_DFS_SERVER_ERROR);
		return;
	}

	b->pos += n;
	if (b->pos < b->last) {
		//c->read->handler
		c->write->handler = lxl_dfss_request_handler;
		//r->read_evnet_handle
		r->write_event_handler = lxl_dfss_writer;
		lxl_add_timer(c->write, 10 * 1000);
		if (lxl_handle_write_event(c->write, 0) != 0) {
			lxl_dfss_finalize_request(r, LXL_DFS_SERVER_ERROR);
			return;
		}
	}

//	b->pos = b->start;
//	b->last = b->start;
	rc = lxl_dfss_send_body(r, lxl_dfss_download_done_handle_request);
	if (rc > LXL_DFS_OK) {
		//
		return;
	}
	/*if (lxl_dfss_send_body(r, lxl_dfss_download_done_handle_request) > LXL_DFS_OK) {
		// lxl_finalize
		return;
	}*/

	return;

failed:

	lxl_dfss_finalize_request(r, rc);

	return;
}