src/server/daemon/vfs.c

changeset 592
2839d5e28c75
parent 490
d218607f5a7e
child 593
d83dced6dd80
equal deleted inserted replaced
591:d703055a1af7 592:2839d5e28c75
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

mercurial