X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=src%2Fextract.c;h=5ca192de3a90000c73bf0db898418a5955fcb1c4;hb=e03c60da0f4907cead18d8957cd78dbeec18ab23;hp=6d703980c3235b9b4244ecb825bad70460b97486;hpb=04176c5e3a481e57b4c6b10fdb6b4a5d82f213f2;p=tar diff --git a/src/extract.c b/src/extract.c index 6d70398..5ca192d 100644 --- a/src/extract.c +++ b/src/extract.c @@ -239,43 +239,40 @@ set_stat (char const *file_name, mode_t invert_permissions, enum permstatus permstatus, char typeflag) { - if (typeflag != SYMTYPE) + /* We do the utime before the chmod because some versions of utime are + broken and trash the modes of the file. */ + + if (! touch_option && permstatus != INTERDIR_PERMSTATUS) { - /* We do the utime before the chmod because some versions of utime are - broken and trash the modes of the file. */ + /* We set the accessed time to `now', which is really the time we + started extracting files, unless incremental_option is used, in + which case .st_atime is used. */ - if (! touch_option && permstatus != INTERDIR_PERMSTATUS) - { - /* We set the accessed time to `now', which is really the time we - started extracting files, unless incremental_option is used, in - which case .st_atime is used. */ - - /* FIXME: incremental_option should set ctime too, but how? */ - - struct timespec ts[2]; - if (incremental_option) - ts[0] = st->atime; - else - ts[0] = start_time; - ts[1] = st->mtime; - - if (utimens (file_name, ts) != 0) - utime_error (file_name); - else - { - check_time (file_name, ts[0]); - check_time (file_name, ts[1]); - } - } + /* FIXME: incremental_option should set ctime too, but how? */ - /* Some systems allow non-root users to give files away. Once this - done, it is not possible anymore to change file permissions. - However, setting file permissions now would be incorrect, since - they would apply to the wrong user, and there would be a race - condition. So, don't use systems that allow non-root users to - give files away. */ + struct timespec ts[2]; + if (incremental_option) + ts[0] = st->atime; + else + ts[0] = start_time; + ts[1] = st->mtime; + + if (utimens (file_name, ts, typeflag == SYMTYPE) != 0) + utime_error (file_name); + else + { + check_time (file_name, ts[0]); + check_time (file_name, ts[1]); + } } + /* Some systems allow non-root users to give files away. Once this + done, it is not possible anymore to change file permissions. + However, setting file permissions now would be incorrect, since + they would apply to the wrong user, and there would be a race + condition. So, don't use systems that allow non-root users to + give files away. */ + if (0 < same_owner_option && permstatus != INTERDIR_PERMSTATUS) { /* When lchown exists, it should be used to change the attributes of