diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/logic/tpax_archive_append.c | 86 |
1 files changed, 33 insertions, 53 deletions
diff --git a/src/logic/tpax_archive_append.c b/src/logic/tpax_archive_append.c index 1ff71bc..f467c4a 100644 --- a/src/logic/tpax_archive_append.c +++ b/src/logic/tpax_archive_append.c @@ -188,7 +188,6 @@ static int tpax_archive_append_queue_item( const struct dirent * dirent, const struct tpax_dirent * parent, const char * prefix, - struct tpax_unit_ctx * unit, int depth, int flags, int fd, @@ -205,7 +204,7 @@ static int tpax_archive_append_queue_item( if (!(dentbuf = tpax_dirent_buf_first_alloc(dctx))) return tpax_archive_append_ret( TPAX_SYSTEM_ERROR(dctx), - unit); + 0); needed = dirent->d_reclen; needed += offsetof(struct tpax_dirent,dirent); @@ -220,7 +219,7 @@ static int tpax_archive_append_queue_item( if (!(dentbuf = tpax_dirent_buf_next_alloc(dentbuf))) return tpax_archive_append_ret( TPAX_SYSTEM_ERROR(dctx), - unit); + 0); *fkeep = true; cdent = dentbuf->cdent; @@ -467,48 +466,37 @@ static int tpax_archive_append_one( unit); } -static int tpax_archive_append_dir( +static int tpax_archive_append_dir_entries( const struct tpax_driver_ctx * dctx, - const struct tpax_unit_ctx * uctx, - struct tpax_dirent * dent, - int fdat, - int depth, - const char * prefix, - const struct tpax_dirent * parent) + struct tpax_dirent * dent) { int fd; + int fdat; + int depth; bool fkeep; long nbytes; struct dirent * dirent; struct dirent * dirents; - struct tpax_unit_ctx * unit; + struct tpax_unit_ctx * uctx; struct stat st; uintptr_t addr; - /* fake uctx for recursion items */ - unit = 0; + /* init */ + fdat = dent->fdat; + depth = dent->depth; - if (dent && tpax_get_unit_ctx( - dctx,dent->fdat,dent->dirent.d_name, - &unit) < 0) + /* uctx on the fly */ + if (tpax_get_unit_ctx( + dctx,fdat, + dent->dirent.d_name, + &uctx) < 0) return TPAX_NESTED_ERROR(dctx); - uctx = dent ? unit : uctx; - /* verify that recursion item is still a directory */ - if (unit && !S_ISDIR(unit->st->st_mode)) + if (!S_ISDIR(uctx->st->st_mode)) return tpax_archive_append_ret( TPAX_CUSTOM_ERROR(dctx,TPAX_ERR_FLOW_ERROR), - unit); - - /* append directory entry to archive */ - if (tpax_archive_append_one( - dctx,uctx,0, - tpax_driver_fdcwd(dctx), - prefix,0,0) < 0) - return tpax_archive_append_ret( - TPAX_NESTED_ERROR(dctx), - unit); + uctx); /* obtain buffer for file-system directory entries */ dirents = tpax_get_driver_getdents_buffer(dctx); @@ -518,10 +506,10 @@ static int tpax_archive_append_dir( depth++; /* open directory and obtain first directory entries */ - if ((fd = openat(fdat,*uctx->path,O_RDONLY|O_DIRECTORY|O_CLOEXEC,0)) < 0) + if ((fd = openat(fdat,dent->dirent.d_name,O_RDONLY|O_DIRECTORY|O_CLOEXEC,0)) < 0) return tpax_archive_append_ret( TPAX_SYSTEM_ERROR(dctx), - unit); + uctx); nbytes = tpax_getdents(fd,dirents,TPAX_DIRENT_BUFLEN); @@ -531,7 +519,7 @@ static int tpax_archive_append_dir( if (nbytes < 0) return tpax_archive_append_ret( TPAX_SYSTEM_ERROR(dctx), - unit); + uctx); /* iterate */ for (; nbytes>0; ) { @@ -546,30 +534,21 @@ static int tpax_archive_append_dir( if (fstatat(fd,dirent->d_name,&st,AT_SYMLINK_NOFOLLOW)) return tpax_archive_append_ret( TPAX_SYSTEM_ERROR(dctx), - unit); + uctx); if (S_ISDIR(st.st_mode)) { dirent->d_type = DT_DIR; } } - if (dirent->d_type == DT_DIR) { - if (tpax_archive_append_queue_item( - dctx,dirent, - parent,0,unit,depth, - TPAX_ITEM_IMPLICIT, - fd,&fkeep) < 0) - return tpax_archive_append_ret( - TPAX_NESTED_ERROR(dctx), - unit); - } else { - if (tpax_archive_append_one( - dctx,0,dirent,fd,prefix, - 0,*uctx->path) < 0) - return tpax_archive_append_ret( - TPAX_NESTED_ERROR(dctx), - unit); - } + if (tpax_archive_append_queue_item( + dctx,dirent, + dent,0,depth, + TPAX_ITEM_IMPLICIT, + fd,&fkeep) < 0) + return tpax_archive_append_ret( + TPAX_NESTED_ERROR(dctx), + uctx); } addr = (uintptr_t)dirent; @@ -586,7 +565,7 @@ static int tpax_archive_append_dir( if (nbytes < 0) tpax_archive_append_ret( TPAX_SYSTEM_ERROR(dctx), - unit); + uctx); dirent = dirents; } @@ -595,7 +574,7 @@ static int tpax_archive_append_dir( /* all done */ return tpax_archive_append_ret( fkeep ? 0 : close(fd), - unit); + uctx); } int tpax_archive_append_item( @@ -605,7 +584,8 @@ int tpax_archive_append_item( (void)dctx; (void)uctx; - (void)tpax_archive_append_dir; + (void)tpax_archive_append_dir_entries; + (void)tpax_archive_append_one; (void)tpax_append_prefix_item; return 0; |