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; } } } }
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; }
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; }