/[smecontribs]/rpms/libarchive/contribs9/libarchive-2.8.3-testsuite.patch
ViewVC logotype

Annotation of /rpms/libarchive/contribs9/libarchive-2.8.3-testsuite.patch

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (hide annotations) (download)
Sun Apr 8 03:27:37 2018 UTC (6 years, 1 month ago) by jpp
Branch: MAIN
CVS Tags: libarchive-2_8_5-1_el6_sme, libarchive-2_8_5-0_el6_sme, HEAD
sources

1 jpp 1.1 diff --git a/Makefile.am b/Makefile.am
2     index 9b0632b..a22ea43 100644
3     --- a/Makefile.am
4     +++ b/Makefile.am
5     @@ -277,7 +277,6 @@ libarchive_test_SOURCES= \
6     libarchive/test/test_read_format_isorr_bz2.c \
7     libarchive/test/test_read_format_isorr_ce.c \
8     libarchive/test/test_read_format_isorr_new_bz2.c \
9     - libarchive/test/test_read_format_isorr_rr_moved.c \
10     libarchive/test/test_read_format_isozisofs_bz2.c \
11     libarchive/test/test_read_format_mtree.c \
12     libarchive/test/test_read_format_pax_bz2.c \
13     @@ -288,7 +287,6 @@ libarchive_test_SOURCES= \
14     libarchive/test/test_read_format_tgz.c \
15     libarchive/test/test_read_format_tlz.c \
16     libarchive/test/test_read_format_txz.c \
17     - libarchive/test/test_read_format_tz.c \
18     libarchive/test/test_read_format_xar.c \
19     libarchive/test/test_read_format_zip.c \
20     libarchive/test/test_read_large.c \
21     @@ -305,14 +303,12 @@ libarchive_test_SOURCES= \
22     libarchive/test/test_write_compress_lzma.c \
23     libarchive/test/test_write_compress_program.c \
24     libarchive/test/test_write_compress_xz.c \
25     - libarchive/test/test_write_disk.c \
26     libarchive/test/test_write_disk_failures.c \
27     libarchive/test/test_write_disk_hardlink.c \
28     libarchive/test/test_write_disk_perms.c \
29     libarchive/test/test_write_disk_secure.c \
30     libarchive/test/test_write_disk_sparse.c \
31     libarchive/test/test_write_disk_symlink.c \
32     - libarchive/test/test_write_disk_times.c \
33     libarchive/test/test_write_format_ar.c \
34     libarchive/test/test_write_format_cpio.c \
35     libarchive/test/test_write_format_cpio_empty.c \
36     diff --git a/libarchive/test/test_read_format_isorr_rr_moved.c b/libarchive/test/test_read_format_isorr_rr_moved.c
37     deleted file mode 100644
38     index d59b346..0000000
39     --- a/libarchive/test/test_read_format_isorr_rr_moved.c
40     +++ /dev/null
41     @@ -1,270 +0,0 @@
42     -/*-
43     - * Copyright (c) 2003-2007 Tim Kientzle
44     - * Copyright (c) 2009 Michihiro NAKAJIMA
45     - * All rights reserved.
46     - *
47     - * Redistribution and use in source and binary forms, with or without
48     - * modification, are permitted provided that the following conditions
49     - * are met:
50     - * 1. Redistributions of source code must retain the above copyright
51     - * notice, this list of conditions and the following disclaimer.
52     - * 2. Redistributions in binary form must reproduce the above copyright
53     - * notice, this list of conditions and the following disclaimer in the
54     - * documentation and/or other materials provided with the distribution.
55     - *
56     - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
57     - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
58     - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
59     - * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
60     - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
61     - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
62     - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
63     - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
64     - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
65     - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
66     - */
67     -#include "test.h"
68     -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isorr_rr_moved.c 201247 2009-12-30 05:59:21Z kientzle $");
69     -
70     -/*
71     -Execute the following command to rebuild the data for this program:
72     - tail -n +32 test_read_format_isorr_rr_moved.c | /bin/sh
73     -
74     -dirname=/tmp/iso
75     -rm -rf $dirname
76     -mkdir -p $dirname/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dir10
77     -echo "hello" >$dirname/file
78     -dd if=/dev/zero count=1 bs=12345678 >>$dirname/file
79     -deepfile=$dirname/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dir10/deep
80     -echo "hello" >$deepfile
81     -dd if=/dev/zero count=1 bs=12345678 >>$deepfile
82     -time="197001020000.01"
83     -TZ=utc touch -afhm -t $time $deepfile
84     -TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dir10
85     -TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9
86     -TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8
87     -TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3/dir4/dir5/dir6/dir7
88     -TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3/dir4/dir5/dir6
89     -TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3/dir4/dir5
90     -TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3/dir4
91     -TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3
92     -TZ=utc touch -afhm -t $time $dirname/dir1/dir2
93     -TZ=utc touch -afhm -t $time $dirname/dir1
94     -TZ=utc touch -afhm -t $time $dirname/file
95     -TZ=utc touch -afhm -t $time $dirname
96     -F=test_read_format_isorr_rockridge_moved.iso.Z
97     -mkhybrid -R -uid 1 -gid 2 $dirname | compress > $F
98     -uuencode $F $F > $F.uu
99     -exit 1
100     - */
101     -
102     -DEFINE_TEST(test_read_format_isorr_rr_moved)
103     -{
104     - const char *refname = "test_read_format_iso_rockridge_rr_moved.iso.Z";
105     - struct archive_entry *ae;
106     - struct archive *a;
107     - const void *p;
108     - size_t size;
109     - off_t offset;
110     - int i;
111     -
112     - extract_reference_file(refname);
113     - assert((a = archive_read_new()) != NULL);
114     - assertEqualInt(0, archive_read_support_compression_all(a));
115     - assertEqualInt(0, archive_read_support_format_all(a));
116     - assertEqualInt(ARCHIVE_OK,
117     - archive_read_open_filename(a, refname, 10240));
118     -
119     - /* Retrieve each of the 8 files on the ISO image and
120     - * verify that each one is what we expect. */
121     - for (i = 0; i < 13; ++i) {
122     - assertEqualInt(0, archive_read_next_header(a, &ae));
123     -
124     - if (strcmp(".", archive_entry_pathname(ae)) == 0) {
125     - /* '.' root directory. */
126     - assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
127     - assertEqualInt(2048, archive_entry_size(ae));
128     - /* Now, we read timestamp recorded by RRIP "TF". */
129     - assertEqualInt(86401, archive_entry_mtime(ae));
130     - assertEqualInt(0, archive_entry_mtime_nsec(ae));
131     - /* Now, we read links recorded by RRIP "PX". */
132     - assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
133     - assertEqualInt(1, archive_entry_uid(ae));
134     - assertEqualIntA(a, ARCHIVE_EOF,
135     - archive_read_data_block(a, &p, &size, &offset));
136     - assertEqualInt((int)size, 0);
137     - } else if (strcmp("dir1", archive_entry_pathname(ae)) == 0) {
138     - /* A directory. */
139     - assertEqualString("dir1", archive_entry_pathname(ae));
140     - assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
141     - assertEqualInt(2048, archive_entry_size(ae));
142     - assertEqualInt(86401, archive_entry_mtime(ae));
143     - assertEqualInt(86401, archive_entry_atime(ae));
144     - assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
145     - assertEqualInt(1, archive_entry_uid(ae));
146     - assertEqualInt(2, archive_entry_gid(ae));
147     - } else if (strcmp("dir1/dir2",
148     - archive_entry_pathname(ae)) == 0) {
149     - /* A directory. */
150     - assertEqualString("dir1/dir2",
151     - archive_entry_pathname(ae));
152     - assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
153     - assertEqualInt(2048, archive_entry_size(ae));
154     - assertEqualInt(86401, archive_entry_mtime(ae));
155     - assertEqualInt(86401, archive_entry_atime(ae));
156     - assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
157     - assertEqualInt(1, archive_entry_uid(ae));
158     - assertEqualInt(2, archive_entry_gid(ae));
159     - } else if (strcmp("dir1/dir2/dir3",
160     - archive_entry_pathname(ae)) == 0) {
161     - /* A directory. */
162     - assertEqualString("dir1/dir2/dir3",
163     - archive_entry_pathname(ae));
164     - assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
165     - assertEqualInt(2048, archive_entry_size(ae));
166     - assertEqualInt(86401, archive_entry_mtime(ae));
167     - assertEqualInt(86401, archive_entry_atime(ae));
168     - assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
169     - assertEqualInt(1, archive_entry_uid(ae));
170     - assertEqualInt(2, archive_entry_gid(ae));
171     - } else if (strcmp("dir1/dir2/dir3/dir4",
172     - archive_entry_pathname(ae)) == 0) {
173     - /* A directory. */
174     - assertEqualString("dir1/dir2/dir3/dir4",
175     - archive_entry_pathname(ae));
176     - assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
177     - assertEqualInt(2048, archive_entry_size(ae));
178     - assertEqualInt(86401, archive_entry_mtime(ae));
179     - assertEqualInt(86401, archive_entry_atime(ae));
180     - assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
181     - assertEqualInt(1, archive_entry_uid(ae));
182     - assertEqualInt(2, archive_entry_gid(ae));
183     - } else if (strcmp("dir1/dir2/dir3/dir4/dir5",
184     - archive_entry_pathname(ae)) == 0) {
185     - /* A directory. */
186     - assertEqualString("dir1/dir2/dir3/dir4/dir5",
187     - archive_entry_pathname(ae));
188     - assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
189     - assertEqualInt(2048, archive_entry_size(ae));
190     - assertEqualInt(86401, archive_entry_mtime(ae));
191     - assertEqualInt(86401, archive_entry_atime(ae));
192     - assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
193     - assertEqualInt(1, archive_entry_uid(ae));
194     - assertEqualInt(2, archive_entry_gid(ae));
195     - } else if (strcmp("dir1/dir2/dir3/dir4/dir5/dir6",
196     - archive_entry_pathname(ae)) == 0) {
197     - /* A directory. */
198     - assertEqualString("dir1/dir2/dir3/dir4/dir5/dir6",
199     - archive_entry_pathname(ae));
200     - assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
201     - assertEqualInt(2048, archive_entry_size(ae));
202     - assertEqualInt(86401, archive_entry_mtime(ae));
203     - assertEqualInt(86401, archive_entry_atime(ae));
204     - assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
205     - assertEqualInt(1, archive_entry_uid(ae));
206     - assertEqualInt(2, archive_entry_gid(ae));
207     - } else if (strcmp("dir1/dir2/dir3/dir4/dir5/dir6/dir7",
208     - archive_entry_pathname(ae)) == 0) {
209     - /* A directory. */
210     - assertEqualString("dir1/dir2/dir3/dir4/dir5/dir6/dir7",
211     - archive_entry_pathname(ae));
212     - assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
213     - assertEqualInt(2048, archive_entry_size(ae));
214     - assertEqualInt(86401, archive_entry_mtime(ae));
215     - assertEqualInt(86401, archive_entry_atime(ae));
216     - assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
217     - assertEqualInt(1, archive_entry_uid(ae));
218     - assertEqualInt(2, archive_entry_gid(ae));
219     - } else if (strcmp("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
220     - "/dir8",
221     - archive_entry_pathname(ae)) == 0) {
222     - /* A directory. */
223     - assertEqualString("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
224     - "/dir8",
225     - archive_entry_pathname(ae));
226     - assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
227     - assertEqualInt(2048, archive_entry_size(ae));
228     - assertEqualInt(86401, archive_entry_mtime(ae));
229     - assertEqualInt(86401, archive_entry_atime(ae));
230     - assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
231     - assertEqualInt(1, archive_entry_uid(ae));
232     - assertEqualInt(2, archive_entry_gid(ae));
233     - } else if (strcmp("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
234     - "/dir8/dir9",
235     - archive_entry_pathname(ae)) == 0) {
236     - /* A directory. */
237     - assertEqualString("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
238     - "/dir8/dir9",
239     - archive_entry_pathname(ae));
240     - assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
241     - assertEqualInt(2048, archive_entry_size(ae));
242     - assertEqualInt(86401, archive_entry_mtime(ae));
243     - assertEqualInt(86401, archive_entry_atime(ae));
244     - assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
245     - assertEqualInt(1, archive_entry_uid(ae));
246     - assertEqualInt(2, archive_entry_gid(ae));
247     - } else if (strcmp("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
248     - "/dir8/dir9/dir10",
249     - archive_entry_pathname(ae)) == 0) {
250     - /* A directory. */
251     - assertEqualString("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
252     - "/dir8/dir9/dir10",
253     - archive_entry_pathname(ae));
254     - assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
255     - assertEqualInt(2048, archive_entry_size(ae));
256     - assertEqualInt(86401, archive_entry_mtime(ae));
257     - assertEqualInt(86401, archive_entry_atime(ae));
258     - assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
259     - assertEqualInt(1, archive_entry_uid(ae));
260     - assertEqualInt(2, archive_entry_gid(ae));
261     - } else if (strcmp("file", archive_entry_pathname(ae)) == 0) {
262     - /* A regular file. */
263     - assertEqualString("file", archive_entry_pathname(ae));
264     - assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
265     - assertEqualInt(12345684, archive_entry_size(ae));
266     - assertEqualInt(0,
267     - archive_read_data_block(a, &p, &size, &offset));
268     - assertEqualInt(0, offset);
269     - assertEqualMem(p, "hello\n", 6);
270     - assertEqualInt(86401, archive_entry_mtime(ae));
271     - assertEqualInt(86401, archive_entry_atime(ae));
272     - assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
273     - assertEqualInt(1, archive_entry_uid(ae));
274     - assertEqualInt(2, archive_entry_gid(ae));
275     - } else if (strcmp("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
276     - "/dir8/dir9/dir10/deep",
277     - archive_entry_pathname(ae)) == 0) {
278     - /* A regular file. */
279     - assertEqualString("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
280     - "/dir8/dir9/dir10/deep",
281     - archive_entry_pathname(ae));
282     - assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
283     - assertEqualInt(12345684, archive_entry_size(ae));
284     - assertEqualInt(0,
285     - archive_read_data_block(a, &p, &size, &offset));
286     - assertEqualInt(0, offset);
287     - assertEqualMem(p, "hello\n", 6);
288     - assertEqualInt(86401, archive_entry_mtime(ae));
289     - assertEqualInt(86401, archive_entry_atime(ae));
290     - assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
291     - assertEqualInt(1, archive_entry_uid(ae));
292     - assertEqualInt(2, archive_entry_gid(ae));
293     - } else {
294     - failure("Saw a file that shouldn't have been there");
295     - assertEqualString(archive_entry_pathname(ae), "");
296     - }
297     - }
298     -
299     - /* End of archive. */
300     - assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
301     -
302     - /* Verify archive format. */
303     - assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS);
304     - assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE);
305     -
306     - /* Close the archive. */
307     - assertEqualInt(0, archive_read_close(a));
308     - assertEqualInt(0, archive_read_finish(a));
309     -}
310     -
311     -
312     diff --git a/libarchive/test/test_read_format_tz.c b/libarchive/test/test_read_format_tz.c
313     deleted file mode 100644
314     index eb06601..0000000
315     --- a/libarchive/test/test_read_format_tz.c
316     +++ /dev/null
317     @@ -1,61 +0,0 @@
318     -/*-
319     - * Copyright (c) 2003-2007 Tim Kientzle
320     - * All rights reserved.
321     - *
322     - * Redistribution and use in source and binary forms, with or without
323     - * modification, are permitted provided that the following conditions
324     - * are met:
325     - * 1. Redistributions of source code must retain the above copyright
326     - * notice, this list of conditions and the following disclaimer.
327     - * 2. Redistributions in binary form must reproduce the above copyright
328     - * notice, this list of conditions and the following disclaimer in the
329     - * documentation and/or other materials provided with the distribution.
330     - *
331     - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
332     - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
333     - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
334     - * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
335     - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
336     - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
337     - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
338     - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
339     - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
340     - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
341     - */
342     -#include "test.h"
343     -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_tz.c 189381 2009-03-05 00:31:48Z kientzle $");
344     -
345     -static unsigned char archive[] = {
346     -31,157,144,'.',0,8,28,'H',176,160,193,131,8,19,'*','\\',200,176,'!','B',24,
347     -16,'o',212,168,1,2,0,196,24,18,'a','T',188,152,'q','#',196,143,' ','5',198,
348     -128,'1','c',6,13,24,'4','0',206,176,1,2,198,200,26,'6','b',0,0,'Q',195,161,
349     -205,155,'8','s',234,4,'P','g',14,157,'0','r',',',194,160,147,166,205,206,
350     -132,'D',141,30,'=',24,'R',163,'P',144,21,151,'J',157,'J',181,170,213,171,
351     -'X',179,'j',221,202,181,171,215,175,'`',195,138,29,'K',182,172,217,179,'h',
352     -211,170,']',203,182,173,219,183,'g',1};
353     -
354     -DEFINE_TEST(test_read_format_tz)
355     -{
356     - struct archive_entry *ae;
357     - struct archive *a;
358     - assert((a = archive_read_new()) != NULL);
359     - assertEqualIntA(a, ARCHIVE_OK,
360     - archive_read_support_compression_all(a));
361     - assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
362     - assertEqualIntA(a, ARCHIVE_OK,
363     - archive_read_open_memory(a, archive, sizeof(archive)));
364     - assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
365     - failure("archive_compression_name(a)=\"%s\"",
366     - archive_compression_name(a));
367     - assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS);
368     - failure("archive_format_name(a)=\"%s\"", archive_format_name(a));
369     - assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR);
370     - assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
371     -#if ARCHIVE_VERSION_NUMBER < 2000000
372     - archive_read_finish(a);
373     -#else
374     - assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
375     -#endif
376     -}
377     -
378     -
379     diff --git a/libarchive/test/test_write_disk.c b/libarchive/test/test_write_disk.c
380     deleted file mode 100644
381     index 169f4f2..0000000
382     --- a/libarchive/test/test_write_disk.c
383     +++ /dev/null
384     @@ -1,332 +0,0 @@
385     -/*-
386     - * Copyright (c) 2003-2007 Tim Kientzle
387     - * All rights reserved.
388     - *
389     - * Redistribution and use in source and binary forms, with or without
390     - * modification, are permitted provided that the following conditions
391     - * are met:
392     - * 1. Redistributions of source code must retain the above copyright
393     - * notice, this list of conditions and the following disclaimer.
394     - * 2. Redistributions in binary form must reproduce the above copyright
395     - * notice, this list of conditions and the following disclaimer in the
396     - * documentation and/or other materials provided with the distribution.
397     - *
398     - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
399     - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
400     - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
401     - * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
402     - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
403     - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
404     - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
405     - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
406     - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
407     - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
408     - */
409     -#include "test.h"
410     -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk.c 201247 2009-12-30 05:59:21Z kientzle $");
411     -
412     -#if ARCHIVE_VERSION_NUMBER >= 1009000
413     -
414     -#define UMASK 022
415     -/*
416     - * When comparing mode values, ignore high-order bits
417     - * that are set on some OSes. This should cover the bits
418     - * we're interested in (standard mode bits + file type bits)
419     - * while ignoring extra markers such as Haiku/BeOS index
420     - * flags.
421     - */
422     -#define MODE_MASK 0777777
423     -
424     -static void create(struct archive_entry *ae, const char *msg)
425     -{
426     - struct archive *ad;
427     - struct stat st;
428     -
429     - /* Write the entry to disk. */
430     - assert((ad = archive_write_disk_new()) != NULL);
431     - failure("%s", msg);
432     - assertEqualIntA(ad, 0, archive_write_header(ad, ae));
433     - assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
434     -#if ARCHIVE_VERSION_NUMBER < 2000000
435     - archive_write_finish(ad);
436     -#else
437     - assertEqualInt(0, archive_write_finish(ad));
438     -#endif
439     - /* Test the entries on disk. */
440     - assert(0 == stat(archive_entry_pathname(ae), &st));
441     - failure("%s", msg);
442     -
443     -#if !defined(_WIN32) || defined(__CYGWIN__)
444     - /* When verifying a dir, ignore the S_ISGID bit, as some systems set
445     - * that automatically. */
446     - if (archive_entry_filetype(ae) == AE_IFDIR)
447     - st.st_mode &= ~S_ISGID;
448     - assertEqualInt(st.st_mode & MODE_MASK,
449     - archive_entry_mode(ae) & ~UMASK & MODE_MASK);
450     -#endif
451     -}
452     -
453     -static void create_reg_file(struct archive_entry *ae, const char *msg)
454     -{
455     - static const char data[]="abcdefghijklmnopqrstuvwxyz";
456     - struct archive *ad;
457     -
458     - /* Write the entry to disk. */
459     - assert((ad = archive_write_disk_new()) != NULL);
460     - archive_write_disk_set_options(ad, ARCHIVE_EXTRACT_TIME);
461     - failure("%s", msg);
462     - /*
463     - * A touchy API design issue: archive_write_data() does (as of
464     - * 2.4.12) enforce the entry size as a limit on the data
465     - * written to the file. This was not enforced prior to
466     - * 2.4.12. The change was prompted by the refined
467     - * hardlink-restore semantics introduced at that time. In
468     - * short, libarchive needs to know whether a "hardlink entry"
469     - * is going to overwrite the contents so that it can know
470     - * whether or not to open the file for writing. This implies
471     - * that there is a fundamental semantic difference between an
472     - * entry with a zero size and one with a non-zero size in the
473     - * case of hardlinks and treating the hardlink case
474     - * differently from the regular file case is just asking for
475     - * trouble. So, a zero size must always mean that no data
476     - * will be accepted, which is consistent with the file size in
477     - * the entry being a maximum size.
478     - */
479     - archive_entry_set_size(ae, sizeof(data));
480     - archive_entry_set_mtime(ae, 123456789, 0);
481     - assertEqualIntA(ad, 0, archive_write_header(ad, ae));
482     - assertEqualInt(sizeof(data), archive_write_data(ad, data, sizeof(data)));
483     - assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
484     -#if ARCHIVE_VERSION_NUMBER < 2000000
485     - archive_write_finish(ad);
486     -#else
487     - assertEqualInt(0, archive_write_finish(ad));
488     -#endif
489     - /* Test the entries on disk. */
490     - assertIsReg(archive_entry_pathname(ae), archive_entry_mode(ae) & 0777);
491     - assertFileSize(archive_entry_pathname(ae), sizeof(data));
492     - /* test_write_disk_times has more detailed tests of this area. */
493     - assertFileMtime(archive_entry_pathname(ae), 123456789, 0);
494     - failure("No atime given, so atime should get set to current time");
495     - assertFileAtimeRecent(archive_entry_pathname(ae));
496     -}
497     -
498     -static void create_reg_file2(struct archive_entry *ae, const char *msg)
499     -{
500     - const int datasize = 100000;
501     - char *data;
502     - struct archive *ad;
503     - int i;
504     -
505     - data = malloc(datasize);
506     - for (i = 0; i < datasize; i++)
507     - data[i] = (char)(i % 256);
508     -
509     - /* Write the entry to disk. */
510     - assert((ad = archive_write_disk_new()) != NULL);
511     - failure("%s", msg);
512     - /*
513     - * See above for an explanation why this next call
514     - * is necessary.
515     - */
516     - archive_entry_set_size(ae, datasize);
517     - assertEqualIntA(ad, 0, archive_write_header(ad, ae));
518     - for (i = 0; i < datasize - 999; i += 1000) {
519     - assertEqualIntA(ad, ARCHIVE_OK,
520     - archive_write_data_block(ad, data + i, 1000, i));
521     - }
522     - assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
523     - assertEqualInt(0, archive_write_finish(ad));
524     -
525     - /* Test the entries on disk. */
526     - assertIsReg(archive_entry_pathname(ae), archive_entry_mode(ae) & 0777);
527     - assertFileSize(archive_entry_pathname(ae), i);
528     - assertFileContents(data, datasize, archive_entry_pathname(ae));
529     - free(data);
530     -}
531     -
532     -static void create_reg_file3(struct archive_entry *ae, const char *msg)
533     -{
534     - static const char data[]="abcdefghijklmnopqrstuvwxyz";
535     - struct archive *ad;
536     - struct stat st;
537     -
538     - /* Write the entry to disk. */
539     - assert((ad = archive_write_disk_new()) != NULL);
540     - failure("%s", msg);
541     - /* Set the size smaller than the data and verify the truncation. */
542     - archive_entry_set_size(ae, 5);
543     - assertEqualIntA(ad, 0, archive_write_header(ad, ae));
544     - assertEqualInt(5, archive_write_data(ad, data, sizeof(data)));
545     - assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
546     -#if ARCHIVE_VERSION_NUMBER < 2000000
547     - archive_write_finish(ad);
548     -#else
549     - assertEqualInt(0, archive_write_finish(ad));
550     -#endif
551     - /* Test the entry on disk. */
552     - assert(0 == stat(archive_entry_pathname(ae), &st));
553     - failure("st.st_mode=%o archive_entry_mode(ae)=%o",
554     - st.st_mode, archive_entry_mode(ae));
555     -#if !defined(_WIN32) || defined(__CYGWIN__)
556     - assertEqualInt(st.st_mode, (archive_entry_mode(ae) & ~UMASK));
557     -#endif
558     - assertEqualInt(st.st_size, 5);
559     -}
560     -
561     -
562     -static void create_reg_file4(struct archive_entry *ae, const char *msg)
563     -{
564     - static const char data[]="abcdefghijklmnopqrstuvwxyz";
565     - struct archive *ad;
566     - struct stat st;
567     -
568     - /* Write the entry to disk. */
569     - assert((ad = archive_write_disk_new()) != NULL);
570     - /* Leave the size unset. The data should not be truncated. */
571     - assertEqualIntA(ad, 0, archive_write_header(ad, ae));
572     - assertEqualInt(ARCHIVE_OK,
573     - archive_write_data_block(ad, data, sizeof(data), 0));
574     - assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
575     -#if ARCHIVE_VERSION_NUMBER < 2000000
576     - archive_write_finish(ad);
577     -#else
578     - assertEqualInt(0, archive_write_finish(ad));
579     -#endif
580     - /* Test the entry on disk. */
581     - assert(0 == stat(archive_entry_pathname(ae), &st));
582     - failure("st.st_mode=%o archive_entry_mode(ae)=%o",
583     - st.st_mode, archive_entry_mode(ae));
584     -#if !defined(_WIN32) || defined(__CYGWIN__)
585     - assertEqualInt(st.st_mode, (archive_entry_mode(ae) & ~UMASK));
586     -#endif
587     - failure(msg);
588     - assertEqualInt(st.st_size, sizeof(data));
589     -}
590     -
591     -#if defined(_WIN32) && !defined(__CYGWIN__)
592     -static void create_reg_file_win(struct archive_entry *ae, const char *msg)
593     -{
594     - static const char data[]="abcdefghijklmnopqrstuvwxyz";
595     - struct archive *ad;
596     - struct stat st;
597     - char *p, *fname;
598     - size_t l;
599     -
600     - /* Write the entry to disk. */
601     - assert((ad = archive_write_disk_new()) != NULL);
602     - archive_write_disk_set_options(ad, ARCHIVE_EXTRACT_TIME);
603     - failure("%s", msg);
604     - archive_entry_set_size(ae, sizeof(data));
605     - archive_entry_set_mtime(ae, 123456789, 0);
606     - assertEqualIntA(ad, 0, archive_write_header(ad, ae));
607     - assertEqualInt(sizeof(data), archive_write_data(ad, data, sizeof(data)));
608     - assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
609     -#if ARCHIVE_VERSION_NUMBER < 2000000
610     - archive_write_finish(ad);
611     -#else
612     - assertEqualInt(0, archive_write_finish(ad));
613     -#endif
614     - /* Test the entries on disk. */
615     - l = strlen(archive_entry_pathname(ae));
616     - fname = malloc(l + 1);
617     - assert(NULL != fname);
618     - strcpy(fname, archive_entry_pathname(ae));
619     - /* Replace unusable characters in Windows to '_' */
620     - for (p = fname; *p != '\0'; p++)
621     - if (*p == ':' || *p == '*' || *p == '?' ||
622     - *p == '"' || *p == '<' || *p == '>' || *p == '|')
623     - *p = '_';
624     - assert(0 == stat(fname, &st));
625     - failure("st.st_mode=%o archive_entry_mode(ae)=%o",
626     - st.st_mode, archive_entry_mode(ae));
627     - assertEqualInt(st.st_size, sizeof(data));
628     -}
629     -#endif /* _WIN32 && !__CYGWIN__ */
630     -#endif
631     -
632     -DEFINE_TEST(test_write_disk)
633     -{
634     -#if ARCHIVE_VERSION_NUMBER < 1009000
635     - skipping("archive_write_disk interface");
636     -#else
637     - struct archive_entry *ae;
638     -
639     - /* Force the umask to something predictable. */
640     - assertUmask(UMASK);
641     -
642     - /* A regular file. */
643     - assert((ae = archive_entry_new()) != NULL);
644     - archive_entry_copy_pathname(ae, "file");
645     - archive_entry_set_mode(ae, S_IFREG | 0755);
646     - create_reg_file(ae, "Test creating a regular file");
647     - archive_entry_free(ae);
648     -
649     - /* Another regular file. */
650     - assert((ae = archive_entry_new()) != NULL);
651     - archive_entry_copy_pathname(ae, "file2");
652     - archive_entry_set_mode(ae, S_IFREG | 0755);
653     - create_reg_file2(ae, "Test creating another regular file");
654     - archive_entry_free(ae);
655     -
656     - /* A regular file with a size restriction */
657     - assert((ae = archive_entry_new()) != NULL);
658     - archive_entry_copy_pathname(ae, "file3");
659     - archive_entry_set_mode(ae, S_IFREG | 0755);
660     - create_reg_file3(ae, "Regular file with size restriction");
661     - archive_entry_free(ae);
662     -
663     - /* A regular file with an unspecified size */
664     - assert((ae = archive_entry_new()) != NULL);
665     - archive_entry_copy_pathname(ae, "file3");
666     - archive_entry_set_mode(ae, S_IFREG | 0755);
667     - create_reg_file4(ae, "Regular file with unspecified size");
668     - archive_entry_free(ae);
669     -
670     - /* A regular file over an existing file */
671     - assert((ae = archive_entry_new()) != NULL);
672     - archive_entry_copy_pathname(ae, "file");
673     - archive_entry_set_mode(ae, S_IFREG | 0724);
674     - create(ae, "Test creating a file over an existing file.");
675     - archive_entry_free(ae);
676     -
677     - /* A directory. */
678     - assert((ae = archive_entry_new()) != NULL);
679     - archive_entry_copy_pathname(ae, "dir");
680     - archive_entry_set_mode(ae, S_IFDIR | 0555);
681     - create(ae, "Test creating a regular dir.");
682     - archive_entry_free(ae);
683     -
684     - /* A directory over an existing file. */
685     - assert((ae = archive_entry_new()) != NULL);
686     - archive_entry_copy_pathname(ae, "file");
687     - archive_entry_set_mode(ae, S_IFDIR | 0742);
688     - create(ae, "Test creating a dir over an existing file.");
689     - archive_entry_free(ae);
690     -
691     - /* A file over an existing dir. */
692     - assert((ae = archive_entry_new()) != NULL);
693     - archive_entry_copy_pathname(ae, "file");
694     - archive_entry_set_mode(ae, S_IFREG | 0744);
695     - create(ae, "Test creating a file over an existing dir.");
696     - archive_entry_free(ae);
697     -
698     -#if defined(_WIN32) && !defined(__CYGWIN__)
699     - /* A file with unusable characters in its file name. */
700     - assert((ae = archive_entry_new()) != NULL);
701     - archive_entry_copy_pathname(ae, "f:i*l?e\"f<i>l|e");
702     - archive_entry_set_mode(ae, S_IFREG | 0755);
703     - create_reg_file_win(ae, "Test creating a regular file"
704     - " with unusable characters in its file name");
705     - archive_entry_free(ae);
706     -
707     - /* A file with unusable characters in its directory name. */
708     - assert((ae = archive_entry_new()) != NULL);
709     - archive_entry_copy_pathname(ae, "d:i*r?e\"c<t>o|ry/file1");
710     - archive_entry_set_mode(ae, S_IFREG | 0755);
711     - create_reg_file_win(ae, "Test creating a regular file"
712     - " with unusable characters in its file name");
713     - archive_entry_free(ae);
714     -#endif /* _WIN32 && !__CYGWIN__ */
715     -#endif
716     -}
717     diff --git a/libarchive/test/test_write_disk_times.c b/libarchive/test/test_write_disk_times.c
718     deleted file mode 100644
719     index 9ecbff6..0000000
720     --- a/libarchive/test/test_write_disk_times.c
721     +++ /dev/null
722     @@ -1,167 +0,0 @@
723     -/*-
724     - * Copyright (c) 2003-2008 Tim Kientzle
725     - * All rights reserved.
726     - *
727     - * Redistribution and use in source and binary forms, with or without
728     - * modification, are permitted provided that the following conditions
729     - * are met:
730     - * 1. Redistributions of source code must retain the above copyright
731     - * notice, this list of conditions and the following disclaimer.
732     - * 2. Redistributions in binary form must reproduce the above copyright
733     - * notice, this list of conditions and the following disclaimer in the
734     - * documentation and/or other materials provided with the distribution.
735     - *
736     - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
737     - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
738     - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
739     - * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
740     - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
741     - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
742     - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
743     - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
744     - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
745     - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
746     - */
747     -#include "test.h"
748     -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk_times.c 201247 2009-12-30 05:59:21Z kientzle $");
749     -
750     -/*
751     - * Exercise time restores in archive_write_disk(), including
752     - * correct handling of omitted time values.
753     - * On FreeBSD, we also test birthtime and high-res time restores.
754     - */
755     -
756     -DEFINE_TEST(test_write_disk_times)
757     -{
758     - struct archive *a;
759     - struct archive_entry *ae;
760     -
761     - /* Create an archive_write_disk object. */
762     - assert((a = archive_write_disk_new()) != NULL);
763     - assertEqualInt(ARCHIVE_OK,
764     - archive_write_disk_set_options(a, ARCHIVE_EXTRACT_TIME));
765     -
766     - /*
767     - * Easy case: mtime and atime both specified.
768     - */
769     - assert((ae = archive_entry_new()) != NULL);
770     - archive_entry_copy_pathname(ae, "file1");
771     - archive_entry_set_mode(ae, S_IFREG | 0777);
772     - archive_entry_set_atime(ae, 123456, 0);
773     - archive_entry_set_mtime(ae, 234567, 0);
774     - assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
775     - assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
776     - archive_entry_free(ae);
777     - /* Verify */
778     - assertFileAtime("file1", 123456, 0);
779     - assertFileMtime("file1", 234567, 0);
780     -
781     - /*
782     - * mtime specified, but not atime
783     - */
784     - assert((ae = archive_entry_new()) != NULL);
785     - archive_entry_copy_pathname(ae, "file2");
786     - archive_entry_set_mode(ae, S_IFREG | 0777);
787     - archive_entry_set_mtime(ae, 234567, 0);
788     - assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
789     - assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
790     - archive_entry_free(ae);
791     - assertFileMtime("file2", 234567, 0);
792     - assertFileAtimeRecent("file2");
793     -
794     - /*
795     - * atime specified, but not mtime
796     - */
797     - assert((ae = archive_entry_new()) != NULL);
798     - archive_entry_copy_pathname(ae, "file3");
799     - archive_entry_set_mode(ae, S_IFREG | 0777);
800     - archive_entry_set_atime(ae, 345678, 0);
801     - assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
802     - assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
803     - archive_entry_free(ae);
804     - /* Verify: Current mtime and atime as specified. */
805     - assertFileAtime("file3", 345678, 0);
806     - assertFileMtimeRecent("file3");
807     -
808     - /*
809     - * Neither atime nor mtime specified.
810     - */
811     - assert((ae = archive_entry_new()) != NULL);
812     - archive_entry_copy_pathname(ae, "file4");
813     - archive_entry_set_mode(ae, S_IFREG | 0777);
814     - assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
815     - assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
816     - archive_entry_free(ae);
817     - /* Verify: Current mtime and atime. */
818     - assertFileAtimeRecent("file4");
819     - assertFileMtimeRecent("file4");
820     -
821     -#if defined(__FreeBSD__)
822     - /*
823     - * High-res mtime and atime on FreeBSD.
824     - */
825     - assert((ae = archive_entry_new()) != NULL);
826     - archive_entry_copy_pathname(ae, "file10");
827     - archive_entry_set_mode(ae, S_IFREG | 0777);
828     - archive_entry_set_atime(ae, 1234567, 23456);
829     - archive_entry_set_mtime(ae, 2345678, 4567);
830     - assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
831     - assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
832     - archive_entry_free(ae);
833     - /* Verify */
834     - assertFileMtime("file10", 2345678, 4567);
835     - assertFileAtime("file10", 1234567, 23456);
836     -
837     - /*
838     - * Birthtime, mtime and atime on FreeBSD
839     - */
840     - assert((ae = archive_entry_new()) != NULL);
841     - archive_entry_copy_pathname(ae, "file11");
842     - archive_entry_set_mode(ae, S_IFREG | 0777);
843     - archive_entry_set_atime(ae, 1234567, 23456);
844     - archive_entry_set_birthtime(ae, 3456789, 12345);
845     - /* mtime must be later than birthtime! */
846     - archive_entry_set_mtime(ae, 12345678, 4567);
847     - assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
848     - assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
849     - archive_entry_free(ae);
850     - /* Verify */
851     - assertFileAtime("file11", 1234567, 23456);
852     - assertFileBirthtime("file11", 3456789, 12345);
853     - assertFileMtime("file11", 12345678, 4567);
854     -
855     - /*
856     - * Birthtime only on FreeBSD.
857     - */
858     - assert((ae = archive_entry_new()) != NULL);
859     - archive_entry_copy_pathname(ae, "file12");
860     - archive_entry_set_mode(ae, S_IFREG | 0777);
861     - archive_entry_set_birthtime(ae, 3456789, 12345);
862     - assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
863     - assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
864     - archive_entry_free(ae);
865     - /* Verify */
866     - assertFileAtimeRecent("file12");
867     - assertFileBirthtime("file12", 3456789, 12345);
868     - assertFileMtimeRecent("file12");
869     -
870     - /*
871     - * mtime only on FreeBSD.
872     - */
873     - assert((ae = archive_entry_new()) != NULL);
874     - archive_entry_copy_pathname(ae, "file13");
875     - archive_entry_set_mode(ae, S_IFREG | 0777);
876     - archive_entry_set_mtime(ae, 4567890, 23456);
877     - assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
878     - assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
879     - archive_entry_free(ae);
880     - /* Verify */
881     - assertFileAtimeRecent("file13");
882     - assertFileBirthtime("file13", 4567890, 23456);
883     - assertFileMtime("file13", 4567890, 23456);
884     -#else
885     - skipping("Platform-specific time restore tests");
886     -#endif
887     -
888     - archive_write_finish(a);
889     -}

admin@koozali.org
ViewVC Help
Powered by ViewVC 1.2.1 RSS 2.0 feed