mirror of
https://git.savannah.gnu.org/git/tar.git
synced 2026-09-27 10:34:13 +00:00
(<time.h>): No need to include.
(time): No need to declare. (now): Remove variable. (extr_init): Don't initialize `now'. Increment same_permissions_option and same_owner_option if we_are_root is nonzero; this supports the new --no-same-owner option. (set_stat): Use start_time instead of `now'.
This commit is contained in:
+13
-27
@@ -18,11 +18,6 @@
|
|||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
|
||||||
#include <time.h>
|
|
||||||
#ifndef time
|
|
||||||
time_t time ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_UTIME_H
|
#if HAVE_UTIME_H
|
||||||
# include <utime.h>
|
# include <utime.h>
|
||||||
#else
|
#else
|
||||||
@@ -35,20 +30,10 @@ struct utimbuf
|
|||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
static time_t now; /* current time */
|
|
||||||
static int we_are_root; /* true if our effective uid == 0 */
|
static int we_are_root; /* true if our effective uid == 0 */
|
||||||
static mode_t newdir_umask; /* umask when creating new directories */
|
static mode_t newdir_umask; /* umask when creating new directories */
|
||||||
static mode_t current_umask; /* current umask (which is set to 0 if -p) */
|
static mode_t current_umask; /* current umask (which is set to 0 if -p) */
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* "Scratch" space to store the information about a sparse file before
|
|
||||||
writing the info into the header or extended header. */
|
|
||||||
struct sp_array *sparsearray;
|
|
||||||
|
|
||||||
/* Number of elts storable in the sparsearray. */
|
|
||||||
int sp_array_size = 10;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct delayed_set_stat
|
struct delayed_set_stat
|
||||||
{
|
{
|
||||||
struct delayed_set_stat *next;
|
struct delayed_set_stat *next;
|
||||||
@@ -65,15 +50,16 @@ static struct delayed_set_stat *delayed_set_stat_head;
|
|||||||
void
|
void
|
||||||
extr_init (void)
|
extr_init (void)
|
||||||
{
|
{
|
||||||
now = time (0);
|
|
||||||
we_are_root = geteuid () == 0;
|
we_are_root = geteuid () == 0;
|
||||||
|
same_permissions_option += we_are_root;
|
||||||
|
same_owner_option += we_are_root;
|
||||||
|
|
||||||
/* Option -p clears the kernel umask, so it does not affect proper
|
/* Option -p clears the kernel umask, so it does not affect proper
|
||||||
restoration of file permissions. New intermediate directories will
|
restoration of file permissions. New intermediate directories will
|
||||||
comply with umask at start of program. */
|
comply with umask at start of program. */
|
||||||
|
|
||||||
newdir_umask = umask (0);
|
newdir_umask = umask (0);
|
||||||
if (same_permissions_option)
|
if (0 < same_permissions_option)
|
||||||
current_umask = 0;
|
current_umask = 0;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -105,7 +91,7 @@ set_mode (char *file_name, struct stat *stat_info)
|
|||||||
normal, we merely skip the chmod. This works because we did umask (0)
|
normal, we merely skip the chmod. This works because we did umask (0)
|
||||||
when -p, so umask will have left the specified mode alone. */
|
when -p, so umask will have left the specified mode alone. */
|
||||||
|
|
||||||
if ((we_are_root || same_permissions_option)
|
if (0 < same_permissions_option
|
||||||
&& ((!keep_old_files_option && !unlink_first_option)
|
&& ((!keep_old_files_option && !unlink_first_option)
|
||||||
|| (stat_info->st_mode & (S_ISUID | S_ISGID | S_ISVTX))))
|
|| (stat_info->st_mode & (S_ISUID | S_ISGID | S_ISVTX))))
|
||||||
if (chmod (file_name, ~current_umask & stat_info->st_mode) < 0)
|
if (chmod (file_name, ~current_umask & stat_info->st_mode) < 0)
|
||||||
@@ -146,7 +132,7 @@ set_stat (char *file_name, struct stat *stat_info, int symlink_flag)
|
|||||||
if (incremental_option)
|
if (incremental_option)
|
||||||
utimbuf.actime = stat_info->st_atime;
|
utimbuf.actime = stat_info->st_atime;
|
||||||
else
|
else
|
||||||
utimbuf.actime = now;
|
utimbuf.actime = start_time;
|
||||||
|
|
||||||
utimbuf.modtime = stat_info->st_mtime;
|
utimbuf.modtime = stat_info->st_mtime;
|
||||||
|
|
||||||
@@ -167,7 +153,7 @@ set_stat (char *file_name, struct stat *stat_info, int symlink_flag)
|
|||||||
extract as the original owner. Or else, if we are running as a user,
|
extract as the original owner. Or else, if we are running as a user,
|
||||||
leave the owner and group as they are, so we extract as that user. */
|
leave the owner and group as they are, so we extract as that user. */
|
||||||
|
|
||||||
if (we_are_root || same_owner_option)
|
if (0 < same_owner_option)
|
||||||
{
|
{
|
||||||
#if HAVE_LCHOWN
|
#if HAVE_LCHOWN
|
||||||
|
|
||||||
@@ -493,10 +479,9 @@ extract_archive (void)
|
|||||||
|
|
||||||
for (counter = 0; counter < SPARSES_IN_OLDGNU_HEADER; counter++)
|
for (counter = 0; counter < SPARSES_IN_OLDGNU_HEADER; counter++)
|
||||||
{
|
{
|
||||||
sparsearray[counter].offset =
|
struct sparse const *s = ¤t_header->oldgnu_header.sp[counter];
|
||||||
OFF_FROM_CHARS (current_header->oldgnu_header.sp[counter].offset);
|
sparsearray[counter].offset = OFF_FROM_HEADER (s->offset);
|
||||||
sparsearray[counter].numbytes =
|
sparsearray[counter].numbytes = SIZE_FROM_HEADER (s->numbytes);
|
||||||
SIZE_FROM_CHARS (current_header->oldgnu_header.sp[counter].numbytes);
|
|
||||||
if (!sparsearray[counter].numbytes)
|
if (!sparsearray[counter].numbytes)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -519,6 +504,7 @@ extract_archive (void)
|
|||||||
}
|
}
|
||||||
for (counter = 0; counter < SPARSES_IN_SPARSE_HEADER; counter++)
|
for (counter = 0; counter < SPARSES_IN_SPARSE_HEADER; counter++)
|
||||||
{
|
{
|
||||||
|
struct sparse const *s = &exhdr->sparse_header.sp[counter];
|
||||||
if (counter + ind > sp_array_size - 1)
|
if (counter + ind > sp_array_size - 1)
|
||||||
{
|
{
|
||||||
/* Realloc the scratch area since we've run out of
|
/* Realloc the scratch area since we've run out of
|
||||||
@@ -529,12 +515,12 @@ extract_archive (void)
|
|||||||
xrealloc (sparsearray,
|
xrealloc (sparsearray,
|
||||||
sp_array_size * sizeof (struct sp_array));
|
sp_array_size * sizeof (struct sp_array));
|
||||||
}
|
}
|
||||||
if (exhdr->sparse_header.sp[counter].numbytes[0] == 0)
|
if (s->numbytes[0] == 0)
|
||||||
break;
|
break;
|
||||||
sparsearray[counter + ind].offset =
|
sparsearray[counter + ind].offset =
|
||||||
OFF_FROM_CHARS (exhdr->sparse_header.sp[counter].offset);
|
OFF_FROM_HEADER (s->offset);
|
||||||
sparsearray[counter + ind].numbytes =
|
sparsearray[counter + ind].numbytes =
|
||||||
SIZE_FROM_CHARS (exhdr->sparse_header.sp[counter].numbytes);
|
SIZE_FROM_HEADER (s->numbytes);
|
||||||
}
|
}
|
||||||
if (!exhdr->sparse_header.isextended)
|
if (!exhdr->sparse_header.isextended)
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user