tar: support for tar --numeric-owner. By Natanael Copa.
No binary (build failed)
—
(log yok)
| @@ -114,22 +114,24 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle) | |
| } | |
| if (!(archive_handle->ah_flags & ARCHIVE_NOPRESERVE_OWN)) { | |
| - | #if ENABLE_FEATURE_TAR_UNAME_GNAME |
| - | uid_t uid = file_header->uid; |
| - | gid_t gid = file_header->gid; |
| + | if (ENABLE_FEATURE_TAR_UNAME_GNAME |
| + | && !(archive_handle->ah_flags & ARCHIVE_NUMERIC_OWNER) |
| + | ) { |
| + | uid_t uid = file_header->uid; |
| + | gid_t gid = file_header->gid; |
| - | if (file_header->uname) { |
| - | struct passwd *pwd = getpwnam(file_header->uname); |
| - | if (pwd) uid = pwd->pw_uid; |
| - | } |
| - | if (file_header->gname) { |
| - | struct group *grp = getgrnam(file_header->gname); |
| - | if (grp) gid = grp->gr_gid; |
| + | if (file_header->uname) { |
| + | struct passwd *pwd = getpwnam(file_header->uname); |
| + | if (pwd) uid = pwd->pw_uid; |
| + | } |
| + | if (file_header->gname) { |
| + | struct group *grp = getgrnam(file_header->gname); |
| + | if (grp) gid = grp->gr_gid; |
| + | } |
| + | lchown(file_header->name, uid, gid); |
| + | } else { |
| + | lchown(file_header->name, file_header->uid, file_header->gid); |
| } | |
| - | lchown(file_header->name, uid, gid); |
| - | #else |
| - | lchown(file_header->name, file_header->uid, file_header->gid); |
| - | #endif |
| } | |
| if ((file_header->mode & S_IFMT) != S_IFLNK) { | |
| /* uclibc has no lchmod, glibc is even stranger - | |
| @@ -738,6 +738,7 @@ enum { | |
| USE_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) | |
| OPTBIT_NOPRESERVE_OWN, | |
| OPTBIT_NOPRESERVE_PERM, | |
| + | OPTBIT_NUMERIC_OWNER, |
| OPT_TEST = 1 << 0, // t | |
| OPT_EXTRACT = 1 << 1, // x | |
| OPT_BASEDIR = 1 << 2, // C | |
| @@ -756,6 +757,7 @@ enum { | |
| OPT_COMPRESS = USE_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z | |
| OPT_NOPRESERVE_OWN = 1 << OPTBIT_NOPRESERVE_OWN , // no-same-owner | |
| OPT_NOPRESERVE_PERM = 1 << OPTBIT_NOPRESERVE_PERM, // no-same-permissions | |
| + | OPT_NUMERIC_OWNER = 1 << OPTBIT_NUMERIC_OWNER, |
| }; | |
| #if ENABLE_FEATURE_TAR_LONG_OPTIONS | |
| static const char tar_longopts[] ALIGN1 = | |
| @@ -787,6 +789,7 @@ static const char tar_longopts[] ALIGN1 = | |
| # if ENABLE_FEATURE_SEAMLESS_Z | |
| "compress\0" No_argument "Z" | |
| # endif | |
| + | "numeric-owner\0" No_argument "\xfc" |
| "no-same-owner\0" No_argument "\xfd" | |
| "no-same-permissions\0" No_argument "\xfe" | |
| /* --exclude takes next bit position in option mask, */ | |
| @@ -873,6 +876,9 @@ int tar_main(int argc UNUSED_PARAM, char **argv) | |
| if (opt & OPT_NOPRESERVE_PERM) | |
| tar_handle->ah_flags |= ARCHIVE_NOPRESERVE_PERM; | |
| + | if (opt & OPT_NUMERIC_OWNER) |
| + | tar_handle->ah_flags |= ARCHIVE_NUMERIC_OWNER; |
| + | |
| if (opt & OPT_GZIP) | |
| get_header_ptr = get_header_tar_gz; | |
| @@ -11,6 +11,7 @@ PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN | |
| #define ARCHIVE_EXTRACT_NEWER 16 | |
| #define ARCHIVE_NOPRESERVE_OWN 32 | |
| #define ARCHIVE_NOPRESERVE_PERM 64 | |
| + | #define ARCHIVE_NUMERIC_OWNER 128 |
| typedef struct file_header_t { | |
| char *name; | |