[PATCH] tar: Implement --no-recursion
Natanael Copa
natanael.copa at gmail.com
Fri May 18 06:27:55 UTC 2012
Denys,
Whats the status on this patch?
On Tue, Apr 24, 2012 at 5:06 PM, Natanael Copa <natanael.copa at gmail.com> wrote:
> bloatcheck on x86_64:
>
> function old new delta
> tar_longopts 259 274 +15
> .rodata 5757 5772 +15
> tar_main 1038 1052 +14
> writeTarFile 362 353 -9
> ------------------------------------------------------------------------------
> (add/remove: 0/0 grow/shrink: 3/1 up/down: 44/-9) Total: 35 bytes
> text data bss dec hex filename
> 81457 1706 8344 91507 16573 busybox_old
> 81477 1706 8344 91527 16587 busybox_unstripped
>
> Signed-off-by: Natanael Copa <ncopa at alpinelinux.org>
> ---
> archival/tar.c | 19 ++++++++++++-------
> 1 file changed, 12 insertions(+), 7 deletions(-)
>
> diff --git a/archival/tar.c b/archival/tar.c
> index cf972c2..a64d651 100644
> --- a/archival/tar.c
> +++ b/archival/tar.c
> @@ -60,8 +60,8 @@
>
> #if !ENABLE_FEATURE_SEAMLESS_GZ && !ENABLE_FEATURE_SEAMLESS_BZ2
> /* Do not pass gzip flag to writeTarFile() */
> -#define writeTarFile(tar_fd, verboseFlag, dereferenceFlag, include, exclude, gzip) \
> - writeTarFile(tar_fd, verboseFlag, dereferenceFlag, include, exclude)
> +#define writeTarFile(tar_fd, verboseFlag, recurseFlags, include, exclude, gzip) \
> + writeTarFile(tar_fd, verboseFlag, recurseFlags, include, exclude)
> #endif
>
>
> @@ -598,7 +598,7 @@ static void NOINLINE vfork_compressor(int tar_fd, int gzip)
>
> /* gcc 4.2.1 inlines it, making code bigger */
> static NOINLINE int writeTarFile(int tar_fd, int verboseFlag,
> - int dereferenceFlag, const llist_t *include,
> + int recurseFlags, const llist_t *include,
> const llist_t *exclude, int gzip)
> {
> int errorFlag = FALSE;
> @@ -621,8 +621,7 @@ static NOINLINE int writeTarFile(int tar_fd, int verboseFlag,
>
> /* Read the directory/files and iterate over them one at a time */
> while (include) {
> - if (!recursive_action(include->data, ACTION_RECURSE |
> - (dereferenceFlag ? ACTION_FOLLOWLINKS : 0),
> + if (!recursive_action(include->data, recurseFlags,
> writeFileToTarball, writeFileToTarball, &tbInfo, 0)
> ) {
> errorFlag = TRUE;
> @@ -662,7 +661,7 @@ static NOINLINE int writeTarFile(int tar_fd, int verboseFlag,
> }
> #else
> int writeTarFile(int tar_fd, int verboseFlag,
> - int dereferenceFlag, const llist_t *include,
> + int recurseFlags, const llist_t *include,
> const llist_t *exclude, int gzip);
> #endif /* FEATURE_TAR_CREATE */
>
> @@ -749,6 +748,7 @@ static llist_t *append_file_list_to_list(llist_t *list)
> // o no-same-owner
> // p same-permissions
> // k keep-old
> +// no-recursion
> // numeric-owner
> // no-same-permissions
> // overwrite
> @@ -768,6 +768,7 @@ enum {
> IF_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) // 16th bit
> IF_FEATURE_TAR_NOPRESERVE_TIME(OPTBIT_NOPRESERVE_TIME,)
> #if ENABLE_FEATURE_TAR_LONG_OPTIONS
> + OPTBIT_NORECURSION,
> IF_FEATURE_TAR_TO_COMMAND(OPTBIT_2COMMAND ,)
> OPTBIT_NUMERIC_OWNER,
> OPTBIT_NOPRESERVE_PERM,
> @@ -791,6 +792,7 @@ enum {
> OPT_GZIP = IF_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z
> OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z
> OPT_NOPRESERVE_TIME = IF_FEATURE_TAR_NOPRESERVE_TIME((1 << OPTBIT_NOPRESERVE_TIME)) + 0, // m
> + OPT_NORECURSION = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NORECURSION )) + 0, // no-recursion
> OPT_2COMMAND = IF_FEATURE_TAR_TO_COMMAND( (1 << OPTBIT_2COMMAND )) + 0, // to-command
> OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NUMERIC_OWNER )) + 0, // numeric-owner
> OPT_NOPRESERVE_PERM = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NOPRESERVE_PERM)) + 0, // no-same-permissions
> @@ -835,6 +837,7 @@ static const char tar_longopts[] ALIGN1 =
> # if ENABLE_FEATURE_TAR_NOPRESERVE_TIME
> "touch\0" No_argument "m"
> # endif
> + "no-recursion\0" No_argument "\xfa"
> # if ENABLE_FEATURE_TAR_TO_COMMAND
> "to-command\0" Required_argument "\xfb"
> # endif
> @@ -1050,7 +1053,9 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
> zipMode = 2;
> #endif
> /* NB: writeTarFile() closes tar_handle->src_fd */
> - return writeTarFile(tar_handle->src_fd, verboseFlag, opt & OPT_DEREFERENCE,
> + return writeTarFile(tar_handle->src_fd, verboseFlag,
> + (opt & OPT_DEREFERENCE ? ACTION_FOLLOWLINKS : 0)
> + | (opt & OPT_NORECURSION ? 0 : ACTION_RECURSE),
> tar_handle->accept,
> tar_handle->reject, zipMode);
> }
> --
> 1.7.10
>
--
Natanael Copa
More information about the busybox
mailing list