Magellan Linux

Annotation of /trunk/cpio/patches/cpio-2.9-restore-perms-owners.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 725 - (hide annotations) (download)
Mon Dec 22 23:30:56 2008 UTC (15 years, 5 months ago) by niro
File size: 3082 byte(s)
-added several cpio fixes

1 niro 725 http://bugs.gentoo.org/218040
2    
3     fix from upstream to restore owners/perms in some situations
4    
5     --- cpio-2.9/src/extern.h
6     +++ cpio-2.9/src/extern.h
7     @@ -211,7 +211,7 @@ uintmax_t from_ascii (char const *where,
8    
9     void delay_set_stat (char const *file_name, struct stat *st,
10     mode_t invert_permissions);
11     -void repair_delayed_set_stat (char const *dir,
12     +int repair_delayed_set_stat (char const *dir,
13     struct stat *dir_stat_info);
14     void apply_delayed_set_stat (void);
15    
16     --- cpio-2.9/src/copyin.c
17     +++ cpio-2.9/src/copyin.c
18     @@ -570,6 +570,7 @@ static void
19     copyin_directory (struct cpio_file_stat *file_hdr, int existing_dir)
20     {
21     int res; /* Result of various function calls. */
22     + struct stat file_stat;
23     #ifdef HPUX_CDF
24     int cdf_flag; /* True if file is a CDF. */
25     int cdf_char; /* Index of `+' char indicating a CDF. */
26     @@ -626,7 +627,6 @@ copyin_directory (struct cpio_file_stat
27     create_all_directories(), so the mkdir will fail
28     because the directory exists. If that's the case,
29     don't complain about it. */
30     - struct stat file_stat;
31     if (errno != EEXIST)
32     {
33     mkdir_error (file_hdr->c_name);
34     @@ -645,7 +645,11 @@ copyin_directory (struct cpio_file_stat
35     }
36     }
37    
38     - set_perms (-1, file_hdr);
39     + /* if the directory is queued for delayed_set_stat,
40     + fix permissions in the queue, otherwise set the permissions now */
41     + void cpio_to_stat (struct cpio_file_stat *hdr, struct stat *st); cpio_to_stat(file_hdr, &file_stat);
42     + if (repair_delayed_set_stat(file_hdr->c_name, &file_stat))
43     + set_perms (-1, file_hdr);
44     }
45    
46     static void
47     --- cpio-2.9/src/util.c
48     +++ cpio-2.9/src/util.c
49     @@ -1265,6 +1265,16 @@ stat_to_cpio (struct cpio_file_stat *hdr
50     hdr->c_tar_linkname = NULL;
51     }
52    
53     +void
54     +cpio_to_stat (struct cpio_file_stat *hdr, struct stat *st)
55     +{
56     + stat (hdr->c_name, st);
57     + st->st_mode = hdr->c_mode;
58     + st->st_uid = CPIO_UID(hdr->c_uid);
59     + st->st_gid = CPIO_GID(hdr->c_gid);
60     + st->st_mtime = hdr->c_mtime;
61     +}
62     +
63     #ifndef HAVE_FCHOWN
64     # define fchown(fd, uid, gid) (-1)
65     #endif
66     @@ -1389,7 +1399,7 @@ delay_set_stat (char const *file_name, s
67     created within the file name of DIR. The intermediate directory turned
68     out to be the same as this directory, e.g. due to ".." or symbolic
69     links. *DIR_STAT_INFO is the status of the directory. */
70     -void
71     +int
72     repair_delayed_set_stat (char const *dir,
73     struct stat *dir_stat_info)
74     {
75     @@ -1400,22 +1410,19 @@ repair_delayed_set_stat (char const *dir
76     if (stat (data->stat.c_name, &st) != 0)
77     {
78     stat_error (data->stat.c_name);
79     - return;
80     + return 0;
81     }
82    
83     if (st.st_dev == dir_stat_info->st_dev
84     && st.st_ino == dir_stat_info->st_ino)
85     {
86     stat_to_cpio (&data->stat, dir_stat_info);
87     - data->invert_permissions =
88     - ((dir_stat_info->st_mode ^ st.st_mode)
89     - & MODE_RWX & ~ newdir_umask);
90     - return;
91     + data->invert_permissions = 0;
92     + return 0;
93     }
94     }
95    
96     - ERROR ((0, 0, _("%s: Unexpected inconsistency when making directory"),
97     - quotearg_colon (dir)));
98     + return -1;
99     }
100    
101     void