| 501 closedir(sys_dir); |
501 closedir(sys_dir); |
| 502 return NULL; |
502 return NULL; |
| 503 } |
503 } |
| 504 long maxfilelen = fpathconf(dir_fd, _PC_NAME_MAX); |
504 long maxfilelen = fpathconf(dir_fd, _PC_NAME_MAX); |
| 505 size_t entry_len = offsetof(struct dirent, d_name) + maxfilelen + 1; |
505 size_t entry_len = offsetof(struct dirent, d_name) + maxfilelen + 1; |
| 506 dir_data->cur = VFS_MALLOC(pool, entry_len); |
|
| 507 if(!dir_data->cur) { |
|
| 508 closedir(sys_dir); |
|
| 509 VFS_FREE(pool, dir_data); |
|
| 510 return NULL; |
|
| 511 } |
|
| 512 dir_data->dir = sys_dir; |
506 dir_data->dir = sys_dir; |
| 513 |
507 |
| 514 VFSDir *dir = VFS_MALLOC(pool, sizeof(VFSDir)); |
508 VFSDir *dir = VFS_MALLOC(pool, sizeof(VFSDir)); |
| 515 if(!dir) { |
509 if(!dir) { |
| 516 closedir(sys_dir); |
510 closedir(sys_dir); |
| 517 VFS_FREE(pool, dir_data->cur); |
|
| 518 VFS_FREE(pool, dir_data); |
511 VFS_FREE(pool, dir_data); |
| 519 return NULL; |
512 return NULL; |
| 520 } |
513 } |
| 521 dir->ctx = ctx; |
514 dir->ctx = ctx; |
| 522 dir->data = dir_data; |
515 dir->data = dir_data; |
| 557 closedir(sys_dir); |
550 closedir(sys_dir); |
| 558 return NULL; |
551 return NULL; |
| 559 } |
552 } |
| 560 long maxfilelen = fpathconf(fd->fd, _PC_NAME_MAX); |
553 long maxfilelen = fpathconf(fd->fd, _PC_NAME_MAX); |
| 561 size_t entry_len = offsetof(struct dirent, d_name) + maxfilelen + 1; |
554 size_t entry_len = offsetof(struct dirent, d_name) + maxfilelen + 1; |
| 562 dir_data->cur = VFS_MALLOC(pool, entry_len); |
|
| 563 if(!dir_data->cur) { |
|
| 564 closedir(sys_dir); |
|
| 565 VFS_FREE(pool, dir_data); |
|
| 566 return NULL; |
|
| 567 } |
|
| 568 dir_data->dir = sys_dir; |
555 dir_data->dir = sys_dir; |
| 569 |
556 |
| 570 VFSDir *dir = VFS_MALLOC(pool, sizeof(VFSDir)); |
557 VFSDir *dir = VFS_MALLOC(pool, sizeof(VFSDir)); |
| 571 if(!dir) { |
558 if(!dir) { |
| 572 closedir(sys_dir); |
559 closedir(sys_dir); |
| 573 VFS_FREE(pool, dir_data->cur); |
|
| 574 VFS_FREE(pool, dir_data); |
560 VFS_FREE(pool, dir_data); |
| 575 return NULL; |
561 return NULL; |
| 576 } |
562 } |
| 577 dir->ctx = ctx; |
563 dir->ctx = ctx; |
| 578 dir->data = dir_data; |
564 dir->data = dir_data; |
| 691 } |
677 } |
| 692 |
678 |
| 693 |
679 |
| 694 int sys_dir_read(VFS_DIR dir, VFS_ENTRY *entry, int getstat) { |
680 int sys_dir_read(VFS_DIR dir, VFS_ENTRY *entry, int getstat) { |
| 695 SysVFSDir *dirdata = dir->data; |
681 SysVFSDir *dirdata = dir->data; |
| 696 struct dirent *result = NULL; |
682 struct dirent *result = readdir(dirdata->dir); |
| 697 int s = readdir_r(dirdata->dir, dirdata->cur, &result); |
683 if(result) { |
| 698 if(!s && result) { |
|
| 699 char *name = result->d_name; |
684 char *name = result->d_name; |
| 700 if(!strcmp(name, ".") || !strcmp(name, "..")) { |
685 if(!strcmp(name, ".") || !strcmp(name, "..")) { |
| 701 return sys_dir_read(dir, entry, getstat); |
686 return sys_dir_read(dir, entry, getstat); |
| 702 } else { |
687 } else { |
| 703 entry->name = name; |
688 entry->name = name; |
| 720 SysVFSDir *dirdata = dir->data; |
705 SysVFSDir *dirdata = dir->data; |
| 721 closedir(dirdata->dir); |
706 closedir(dirdata->dir); |
| 722 |
707 |
| 723 pool_handle_t *pool = dir->ctx->pool; |
708 pool_handle_t *pool = dir->ctx->pool; |
| 724 if(pool) { |
709 if(pool) { |
| 725 pool_free(pool, dirdata->cur); |
|
| 726 pool_free(pool, dirdata); |
710 pool_free(pool, dirdata); |
| 727 pool_free(pool, dir); |
711 pool_free(pool, dir); |
| 728 } else { |
712 } else { |
| 729 free(dirdata->cur); |
|
| 730 free(dirdata); |
713 free(dirdata); |
| 731 free(dir); |
714 free(dir); |
| 732 } |
715 } |
| 733 } |
716 } |
| 734 |
717 |