Пример #1
0
ngx_int_t
ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, ngx_pool_t *pool,
    ngx_uint_t persistent, ngx_uint_t clean, ngx_uint_t access)
{
    uint32_t                  n;
    ngx_err_t                 err;
    ngx_pool_cleanup_t       *cln;
    ngx_pool_cleanup_file_t  *clnf;

    file->name.len = path->name.len + 1 + path->len + 10;

    file->name.data = ngx_pnalloc(pool, file->name.len + 1);
    if (file->name.data == NULL) {
        return NGX_ERROR;
    }

#if 0
    for (i = 0; i < file->name.len; i++) {
         file->name.data[i] = 'X';
    }
#endif

    ngx_memcpy(file->name.data, path->name.data, path->name.len);

    n = (uint32_t) ngx_next_temp_number(0);

    cln = ngx_pool_cleanup_add(pool, sizeof(ngx_pool_cleanup_file_t));
    if (cln == NULL) {
        return NGX_ERROR;
    }

    for ( ;; ) {
        (void) ngx_sprintf(file->name.data + path->name.len + 1 + path->len,
                           "%010uD%Z", n);

        ngx_create_hashed_filename(path, file->name.data, file->name.len);

        ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,
                       "hashed path: %s", file->name.data);

        file->fd = ngx_open_tempfile(file->name.data, persistent, access);

        ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,
                       "temp fd:%d", file->fd);

        if (file->fd != NGX_INVALID_FILE) {

            cln->handler = clean ? ngx_pool_delete_file : ngx_pool_cleanup_file;
            clnf = cln->data;

            clnf->fd = file->fd;
            clnf->name = file->name.data;
            clnf->log = pool->log;

            return NGX_OK;
        }

        err = ngx_errno;

        if (err == NGX_EEXIST) {
            n = (uint32_t) ngx_next_temp_number(1);
            continue;
        }

        if ((path->level[0] == 0) || (err != NGX_ENOPATH)) {
            ngx_log_error(NGX_LOG_CRIT, file->log, err,
                          ngx_open_tempfile_n " \"%s\" failed",
                          file->name.data);
            return NGX_ERROR;
        }

        if (ngx_create_path(file, path) == NGX_ERROR) {
            return NGX_ERROR;
        }
    }
}
Пример #2
0
int ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path,
             ngx_pool_t *pool, int persistent)
{
  int        num;
  ngx_err_t  err;

  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 0
  for (i = 0; i < file->name.len; i++) {
     file->name.data[i] = 'X';
  }
#endif

  ngx_memcpy(file->name.data, path->name.data, path->name.len);

  num = ngx_next_temp_number(0);

  for ( ;; ) {
    ngx_snprintf((char *)
              (file->name.data + path->name.len + 1 + path->len),
           11, "%010u", num);

    ngx_create_hashed_filename(file, path);

#if 1
    file->fd = ngx_open_tempfile(file->name.data, persistent);
#else
    file->fd = ngx_open_tempfile(file->name.data, 1);
#endif

    ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,
             "temp fd:%d", file->fd);

    if (file->fd != NGX_INVALID_FILE) {
      return NGX_OK;
    }

    err = ngx_errno;

    if (err == NGX_EEXIST) {
      num = ngx_next_temp_number(1);
      continue;
    }

    if ((path->level[0] == 0)
      || (err != NGX_ENOENT
#if (WIN32)
        && err != NGX_ENOTDIR
#endif
    )) {
      ngx_log_error(NGX_LOG_CRIT, file->log, err,
              ngx_open_tempfile_n " \"%s\" failed",
              file->name.data);
      return NGX_ERROR;
    }

    if (ngx_create_path(file, path) == NGX_ERROR) {
      return NGX_ERROR;
    }
  }
}