Mercurial > hg > nginx-vendor-0-6
diff src/core/ngx_file.c @ 16:74b1868dd3cd NGINX_0_1_8
nginx 0.1.8
*) Bugfix: in the ngx_http_autoindex_module if the long file names were
in the listing.
*) Feature: the "^~" modifier in the location directive.
*) Feature: the proxy_max_temp_file_size directive.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Sat, 20 Nov 2004 00:00:00 +0300 |
parents | 46833bd150cb |
children | 7ca9bdc82b3f |
line wrap: on
line diff
--- a/src/core/ngx_file.c +++ b/src/core/ngx_file.c @@ -12,9 +12,9 @@ static ngx_uint_t ngx_temp_number; static ngx_uint_t ngx_random; -int ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain) +ssize_t ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain) { - int rc; + ngx_int_t rc; if (tf->file.fd == NGX_INVALID_FILE) { rc = ngx_create_temp_file(&tf->file, tf->path, tf->pool, @@ -33,16 +33,17 @@ int ngx_write_chain_to_temp_file(ngx_tem } -int ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, - ngx_pool_t *pool, int persistent) +ngx_int_t ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, + ngx_pool_t *pool, int persistent) { - int num; - ngx_err_t err; + ngx_err_t err; + uint32_t num; file->name.len = path->name.len + 1 + path->len + 10; - ngx_test_null(file->name.data, ngx_palloc(pool, file->name.len + 1), - NGX_ERROR); + if (!(file->name.data = ngx_palloc(pool, file->name.len + 1))) { + return NGX_ERROR; + } #if 0 for (i = 0; i < file->name.len; i++) { @@ -52,11 +53,11 @@ int ngx_create_temp_file(ngx_file_t *fil ngx_memcpy(file->name.data, path->name.data, path->name.len); - num = ngx_next_temp_number(0); + num = (uint32_t) ngx_next_temp_number(0); for ( ;; ) { ngx_sprintf(file->name.data + path->name.len + 1 + path->len, - "%010ud%Z", num); + "%010ui%Z", num); ngx_create_hashed_filename(file, path); @@ -85,7 +86,8 @@ int ngx_create_temp_file(ngx_file_t *fil #if (NGX_WIN32) && err != NGX_ENOTDIR #endif - )) { + )) + { ngx_log_error(NGX_LOG_CRIT, file->log, err, ngx_open_tempfile_n " \"%s\" failed", file->name.data); @@ -101,8 +103,7 @@ int ngx_create_temp_file(ngx_file_t *fil void ngx_create_hashed_filename(ngx_file_t *file, ngx_path_t *path) { - int i, name, pos; - size_t level; + ngx_uint_t i, name, pos, level; name = file->name.len; pos = path->name.len + 1; @@ -127,7 +128,7 @@ void ngx_create_hashed_filename(ngx_file } -int ngx_create_path(ngx_file_t *file, ngx_path_t *path) +ngx_int_t ngx_create_path(ngx_file_t *file, ngx_path_t *path) { int i, pos; ngx_err_t err; @@ -189,32 +190,28 @@ char *ngx_conf_set_path_slot(ngx_conf_t { char *p = conf; - ngx_int_t level; + ssize_t level; ngx_uint_t i, n; ngx_str_t *value; - ngx_path_t *path, **pp; + ngx_path_t *path, **pp, **slot; - pp = (ngx_path_t **) (p + cmd->offset); + slot = (ngx_path_t **) (p + cmd->offset); - if (*pp) { + if (*slot) { return "is duplicate"; } - /* TODO: check duplicate in cf->cycle->pathes */ - - ngx_test_null(path, ngx_pcalloc(cf->pool, sizeof(ngx_path_t)), - NGX_CONF_ERROR); + if (!(path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t)))) { + return NGX_CONF_ERROR; + } - *pp = path; - - ngx_test_null(pp, ngx_push_array(&cf->cycle->pathes), NGX_CONF_ERROR); - *pp = path; - - value = (ngx_str_t *) cf->args->elts; + value = cf->args->elts; path->name = value[1]; - path->len = 0; + path->gc_handler = (ngx_gc_handler_pt) cmd->post; + path->conf_file = cf->conf_file->file.name.data; + path->line = cf->conf_file->line; for (i = 0, n = 2; n < cf->args->nelts; i++, n++) { level = ngx_atoi(value[n].data, value[n].len); @@ -230,7 +227,102 @@ char *ngx_conf_set_path_slot(ngx_conf_t path->level[i++] = 0; } - path->gc_handler = (ngx_gc_handler_pt) cmd->post; + + pp = cf->cycle->pathes.elts; + for (i = 0; i < cf->cycle->pathes.nelts; i++) { + if (pp[i]->name.len == path->name.len + && ngx_strcmp(pp[i]->name.data, path->name.data) == 0) + { + for (n = 0; n < 3; n++) { + if (pp[i]->level[n] != path->level[n]) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "the same \"%V\" path name in %s:%ui " + "has the different levels than", + &pp[i]->name, pp[i]->conf_file, pp[i]->line); + return NGX_CONF_ERROR; + } + + if (pp[i]->level[n] == 0) { + break; + } + } + + *slot = pp[i]; + + return NGX_CONF_OK; + } + } + + *slot = path; + + + if (!(pp = ngx_array_push(&cf->cycle->pathes))) { + return NGX_CONF_ERROR; + } + + *pp = path; return NGX_CONF_OK; } + + +ngx_int_t ngx_create_pathes(ngx_cycle_t *cycle, ngx_uid_t user) +{ + ngx_err_t err; + ngx_uint_t i; + ngx_path_t **path; +#if !(NGX_WIN32) + ngx_file_info_t fi; +#endif + + path = cycle->pathes.elts; + for (i = 0; i < cycle->pathes.nelts; i++) { + + if (ngx_create_dir(path[i]->name.data) == NGX_FILE_ERROR) { + err = ngx_errno; + if (err != NGX_EEXIST) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, err, + ngx_create_dir_n " \"%s\" failed", + path[i]->name.data); + return NGX_ERROR; + } + } + + if (user == (ngx_uid_t) -1) { + continue; + } + +#if !(NGX_WIN32) + + if (ngx_file_info((const char *) path[i]->name.data, &fi) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + ngx_file_info_n " \"%s\" failed", path[i]->name.data); + return NGX_ERROR; + } + + if (fi.st_uid != user) { + if (chown((const char *) path[i]->name.data, user, -1) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "chown(\"%s\", %d) failed", + path[i]->name.data, user); + return NGX_ERROR; + } + } + + if ((fi.st_mode & (S_IRUSR|S_IWUSR|S_IXUSR)) + != (S_IRUSR|S_IWUSR|S_IXUSR)) + { + fi.st_mode |= (S_IRUSR|S_IWUSR|S_IXUSR); + + if (chmod((const char *) path[i]->name.data, fi.st_mode) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "chmod() \"%s\" failed", path[i]->name.data); + return NGX_ERROR; + } + } + +#endif + } + + return NGX_OK; +}