comparison src/os/win32/ngx_files.c @ 1632:2142e5cf62da

fix win32 glob
author Igor Sysoev <igor@sysoev.ru>
date Sun, 11 Nov 2007 17:50:47 +0000
parents 81da6273fb04
children d3cbb96818f1
comparison
equal deleted inserted replaced
1631:b67b75bb09b7 1632:2142e5cf62da
325 325
326 326
327 ngx_int_t 327 ngx_int_t
328 ngx_open_glob(ngx_glob_t *gl) 328 ngx_open_glob(ngx_glob_t *gl)
329 { 329 {
330 u_char *p;
331 size_t len;
332
330 gl->dir = FindFirstFile((const char *) gl->pattern, &gl->finddata); 333 gl->dir = FindFirstFile((const char *) gl->pattern, &gl->finddata);
331 334
332 if (gl->dir == INVALID_HANDLE_VALUE) { 335 if (gl->dir == INVALID_HANDLE_VALUE) {
333 return NGX_ERROR; 336 return NGX_ERROR;
334 } 337 }
335 338
339 for (p = gl->pattern; *p; p++) {
340 if (*p == '/') {
341 gl->last = p + 1 - gl->pattern;
342 }
343 }
344
345 len = ngx_strlen(gl->finddata.cFileName);
346 gl->name.len = gl->last + len;
347
348 gl->name.data = ngx_alloc(gl->name.len + 1, gl->log);
349 if (gl->name.data == NULL) {
350 return NGX_ERROR;
351 }
352
353 ngx_memcpy(gl->name.data, gl->pattern, gl->last);
354 ngx_cpystrn(gl->name.data + gl->last, (u_char *) gl->finddata.cFileName,
355 len + 1);
356
336 gl->ready = 1; 357 gl->ready = 1;
337 358
338 return NGX_OK; 359 return NGX_OK;
339 } 360 }
340 361
341 362
342 ngx_int_t 363 ngx_int_t
343 ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name) 364 ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name)
344 { 365 {
366 size_t len;
345 ngx_err_t err; 367 ngx_err_t err;
346 368
347 if (gl->ready) { 369 if (gl->ready) {
348 name->len = ngx_strlen(gl->finddata.cFileName); 370 *name = gl->name;
349 name->data = (u_char *) gl->finddata.cFileName;
350 371
351 gl->ready = 0; 372 gl->ready = 0;
352 return NGX_OK; 373 return NGX_OK;
353 } 374 }
354 375
376 ngx_free(gl->name.data);
377 gl->name.data = NULL;
378
355 if (FindNextFile(gl->dir, &gl->finddata) != 0) { 379 if (FindNextFile(gl->dir, &gl->finddata) != 0) {
356 name->len = ngx_strlen(gl->finddata.cFileName); 380
357 name->data = (u_char *) gl->finddata.cFileName; 381 len = ngx_strlen(gl->finddata.cFileName);
382 gl->name.len = gl->last + len;
383
384 gl->name.data = ngx_alloc(gl->name.len + 1, gl->log);
385 if (gl->name.data == NULL) {
386 return NGX_ERROR;
387 }
388
389 ngx_memcpy(gl->name.data, gl->pattern, gl->last);
390 ngx_cpystrn(gl->name.data + gl->last, (u_char *) gl->finddata.cFileName,
391 len + 1);
392
393 *name = gl->name;
358 394
359 return NGX_OK; 395 return NGX_OK;
360 } 396 }
361 397
362 err = ngx_errno; 398 err = ngx_errno;
373 409
374 410
375 void 411 void
376 ngx_close_glob(ngx_glob_t *gl) 412 ngx_close_glob(ngx_glob_t *gl)
377 { 413 {
378 if (FindClose(gl->dir) != 0) { 414 if (gl->name.data) {
415 ngx_free(gl->name.data);
416 }
417
418 if (FindClose(gl->dir) == 0) {
379 ngx_log_error(NGX_LOG_ALERT, gl->log, ngx_errno, 419 ngx_log_error(NGX_LOG_ALERT, gl->log, ngx_errno,
380 "FindClose(%s) failed", gl->pattern); 420 "FindClose(%s) failed", gl->pattern);
381 } 421 }
382 } 422 }
383 423