Date: Sat, 6 Sep 2008 10:26:16 GMT From: Ed Schouten <ed@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 149307 for review Message-ID: <200809061026.m86AQGip003937@repoman.freebsd.org>
index | next in thread | raw e-mail
http://perforce.freebsd.org/chv.cgi?CH=149307 Change 149307 by ed@ed_dull on 2008/09/06 10:25:45 IFC. Maybe this will remove the $P4$ expansion in sys/contrib/dev/ath/public/mipsisa32-be-elf.hal.o.uu. Affected files ... .. //depot/projects/mpsafetty/lib/libarchive/archive_entry_link_resolver.c#2 integrate .. //depot/projects/mpsafetty/lib/libarchive/archive_write_disk.c#5 integrate .. //depot/projects/mpsafetty/lib/libarchive/test/test_write_disk.c#5 integrate .. //depot/projects/mpsafetty/lib/libarchive/test/test_write_disk_hardlink.c#4 integrate .. //depot/projects/mpsafetty/lib/libc/regex/re_format.7#2 integrate .. //depot/projects/mpsafetty/lib/libc/stdlib/malloc.c#6 integrate .. //depot/projects/mpsafetty/share/man/man4/Makefile#11 integrate .. //depot/projects/mpsafetty/share/man/man9/CTASSERT.9#2 integrate .. //depot/projects/mpsafetty/sys/arm/at91/at91.c#3 integrate .. //depot/projects/mpsafetty/sys/arm/at91/at91_mci.c#2 integrate .. //depot/projects/mpsafetty/sys/arm/at91/at91_ssc.c#2 integrate .. //depot/projects/mpsafetty/sys/arm/at91/kb920x_machdep.c#2 integrate .. //depot/projects/mpsafetty/sys/boot/sparc64/loader/main.c#5 integrate .. //depot/projects/mpsafetty/sys/cddl/contrib/opensolaris/uts/common/fs/gfs.c#2 integrate .. //depot/projects/mpsafetty/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c#3 integrate .. //depot/projects/mpsafetty/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c#2 integrate .. //depot/projects/mpsafetty/sys/contrib/dev/ath/public/mipsisa32-be-elf.hal.o.uu#4 integrate .. //depot/projects/mpsafetty/sys/contrib/dev/ath/public/wisoc.hal.o.uu#1 branch .. //depot/projects/mpsafetty/sys/contrib/dev/ath/public/wisoc.inc#1 branch .. //depot/projects/mpsafetty/sys/contrib/dev/ath/public/wisoc.opt_ah.h#1 branch .. //depot/projects/mpsafetty/sys/dev/re/if_re.c#5 integrate .. //depot/projects/mpsafetty/sys/dev/usb/if_zyd.c#2 integrate .. //depot/projects/mpsafetty/sys/dev/usb/ucom.c#6 integrate .. //depot/projects/mpsafetty/sys/dev/usb/ucomvar.h#3 integrate .. //depot/projects/mpsafetty/sys/dev/usb/usbdevs#8 integrate .. //depot/projects/mpsafetty/sys/geom/part/g_part.c#3 integrate .. //depot/projects/mpsafetty/sys/geom/part/g_part.h#2 integrate .. //depot/projects/mpsafetty/sys/geom/part/g_part_gpt.c#2 integrate .. //depot/projects/mpsafetty/sys/i386/include/pmc_mdep.h#2 integrate .. //depot/projects/mpsafetty/sys/kern/kern_resource.c#4 integrate .. //depot/projects/mpsafetty/sys/kern/uipc_mbuf.c#2 integrate .. //depot/projects/mpsafetty/sys/kern/uipc_mqueue.c#3 integrate .. //depot/projects/mpsafetty/sys/net/route.h#2 integrate .. //depot/projects/mpsafetty/sys/netinet/if_ether.c#5 integrate .. //depot/projects/mpsafetty/sys/sparc64/include/cpu.h#2 integrate .. //depot/projects/mpsafetty/sys/sparc64/include/dcr.h#1 branch .. //depot/projects/mpsafetty/sys/sparc64/include/trap.h#2 integrate .. //depot/projects/mpsafetty/sys/sparc64/include/tte.h#3 integrate .. //depot/projects/mpsafetty/sys/sparc64/sparc64/cheetah.c#4 integrate .. //depot/projects/mpsafetty/sys/sparc64/sparc64/exception.S#5 integrate .. //depot/projects/mpsafetty/sys/sparc64/sparc64/genassym.c#3 integrate .. //depot/projects/mpsafetty/sys/sparc64/sparc64/machdep.c#4 integrate .. //depot/projects/mpsafetty/sys/sparc64/sparc64/mp_machdep.c#5 integrate .. //depot/projects/mpsafetty/sys/sparc64/sparc64/pmap.c#3 integrate .. //depot/projects/mpsafetty/sys/sparc64/sparc64/trap.c#4 integrate .. //depot/projects/mpsafetty/sys/sys/gpt.h#2 integrate Differences ... ==== //depot/projects/mpsafetty/lib/libarchive/archive_entry_link_resolver.c#2 (text+ko) ==== @@ -24,7 +24,7 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_entry_link_resolver.c,v 1.3 2008/06/15 04:31:43 kientzle Exp $"); +__FBSDID("$FreeBSD: src/lib/libarchive/archive_entry_link_resolver.c,v 1.4 2008/09/05 06:15:25 kientzle Exp $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> @@ -189,7 +189,7 @@ case ARCHIVE_ENTRY_LINKIFY_LIKE_TAR: le = find_entry(res, *e); if (le != NULL) { - archive_entry_set_size(*e, 0); + archive_entry_unset_size(*e); archive_entry_copy_hardlink(*e, archive_entry_pathname(le->canonical)); } else @@ -217,7 +217,7 @@ *e = le->entry; le->entry = t; /* Make the old entry into a hardlink. */ - archive_entry_set_size(*e, 0); + archive_entry_unset_size(*e); archive_entry_copy_hardlink(*e, archive_entry_pathname(le->canonical)); /* If we ran out of links, return the ==== //depot/projects/mpsafetty/lib/libarchive/archive_write_disk.c#5 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_disk.c,v 1.33 2008/09/01 02:50:24 kientzle Exp $"); +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_disk.c,v 1.35 2008/09/05 06:13:11 kientzle Exp $"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> @@ -176,7 +176,7 @@ int fd; /* Current offset for writing data to the file. */ off_t offset; - /* Maximum size of file. */ + /* Maximum size of file, -1 if unknown. */ off_t filesize; /* Dir we were in before this restore; only for deep paths. */ int restore_pwd; @@ -231,8 +231,9 @@ static struct fixup_entry *sort_dir_list(struct fixup_entry *p); static gid_t trivial_lookup_gid(void *, const char *, gid_t); static uid_t trivial_lookup_uid(void *, const char *, uid_t); +static ssize_t write_data_block(struct archive_write_disk *, + const char *, size_t, off_t); - static struct archive_vtable *archive_write_disk_vtable(void); static int _archive_write_close(struct archive *); @@ -337,7 +338,10 @@ a->offset = 0; a->uid = a->user_uid; a->mode = archive_entry_mode(a->entry); - a->filesize = archive_entry_size(a->entry); + if (archive_entry_size_is_set(a->entry)) + a->filesize = archive_entry_size(a->entry); + else + a->filesize = -1; archive_strcpy(&(a->_name_data), archive_entry_pathname(a->entry)); a->name = a->_name_data.s; archive_clear_error(&a->archive); @@ -439,15 +443,25 @@ fe->mode = a->mode; } - if (a->deferred & TODO_TIMES) { + if ((a->deferred & TODO_TIMES) + && (archive_entry_mtime_is_set(entry) + || archive_entry_atime_is_set(entry))) { fe = current_fixup(a, archive_entry_pathname(entry)); fe->fixup |= TODO_TIMES; - fe->mtime = archive_entry_mtime(entry); - fe->mtime_nanos = archive_entry_mtime_nsec(entry); - fe->atime = archive_entry_atime(entry); - fe->atime_nanos = archive_entry_atime_nsec(entry); - if (fe->atime == 0 && fe->atime_nanos == 0) + if (archive_entry_mtime_is_set(entry)) { + fe->mtime = archive_entry_mtime(entry); + fe->mtime_nanos = archive_entry_mtime_nsec(entry); + } else { + fe->mtime = a->start_time; + fe->mtime_nanos = 0; + } + if (archive_entry_atime_is_set(entry)) { + fe->atime = archive_entry_atime(entry); + fe->atime_nanos = archive_entry_atime_nsec(entry); + } else { fe->atime = a->start_time; + fe->atime_nanos = 0; + } } if (a->deferred & TODO_FFLAGS) { @@ -486,89 +500,113 @@ } static ssize_t -_archive_write_data_block(struct archive *_a, - const void *buff, size_t size, off_t offset) +write_data_block(struct archive_write_disk *a, + const char *buff, size_t size, off_t offset) { - struct archive_write_disk *a = (struct archive_write_disk *)_a; ssize_t bytes_written = 0; - ssize_t block_size, bytes_to_write; - int r = ARCHIVE_OK; + ssize_t block_size = 0, bytes_to_write; + int r; - __archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, - ARCHIVE_STATE_DATA, "archive_write_disk_block"); - if (a->fd < 0) { - archive_set_error(&a->archive, 0, "File not open"); + if (a->filesize == 0 || a->fd < 0) { + archive_set_error(&a->archive, 0, + "Attempt to write to an empty file"); return (ARCHIVE_WARN); } - archive_clear_error(&a->archive); if (a->flags & ARCHIVE_EXTRACT_SPARSE) { if ((r = _archive_write_disk_lazy_stat(a)) != ARCHIVE_OK) return (r); block_size = a->pst->st_blksize; - } else - block_size = -1; + } - if ((off_t)(offset + size) > a->filesize) { - size = (size_t)(a->filesize - a->offset); - archive_set_error(&a->archive, 0, - "Write request too large"); - r = ARCHIVE_WARN; - } + if (a->filesize >= 0 && (off_t)(offset + size) > a->filesize) + size = (size_t)(a->filesize - offset); /* Write the data. */ while (size > 0) { - if (block_size != -1) { - const char *buf; + if (block_size == 0) { + bytes_to_write = size; + } else { + /* We're sparsifying the file. */ + const char *p, *end; + off_t block_end; - for (buf = buff; size; ++buf, --size, ++offset) { - if (*buf != '\0') + /* Skip leading zero bytes. */ + for (p = buff, end = buff + size; p < end; ++p) { + if (*p != '\0') break; } + offset += p - buff; + size -= p - buff; + buff = p; if (size == 0) break; - bytes_to_write = block_size - offset % block_size; - buff = buf; - } else + + /* Calculate next block boundary after offset. */ + block_end + = (offset / block_size) * block_size + block_size; + + /* If the adjusted write would cross block boundary, + * truncate it to the block boundary. */ bytes_to_write = size; + if (offset + bytes_to_write > block_end) + bytes_to_write = block_end - offset; + } + /* Seek if necessary to the specified offset. */ if (offset != a->last_offset) { if (lseek(a->fd, offset, SEEK_SET) < 0) { - archive_set_error(&a->archive, errno, "Seek failed"); + archive_set_error(&a->archive, errno, + "Seek failed"); return (ARCHIVE_FATAL); } } - bytes_written = write(a->fd, buff, size); + bytes_written = write(a->fd, buff, bytes_to_write); if (bytes_written < 0) { archive_set_error(&a->archive, errno, "Write failed"); return (ARCHIVE_WARN); } - buff = (const char *)buff + bytes_written; + buff += bytes_written; size -= bytes_written; offset += bytes_written; a->archive.file_position += bytes_written; a->archive.raw_position += bytes_written; a->last_offset = a->offset = offset; } - a->offset = offset; - return (r); + return (bytes_written); +} + +static ssize_t +_archive_write_data_block(struct archive *_a, + const void *buff, size_t size, off_t offset) +{ + struct archive_write_disk *a = (struct archive_write_disk *)_a; + ssize_t r; + + __archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, + ARCHIVE_STATE_DATA, "archive_write_disk_block"); + + r = write_data_block(a, buff, size, offset); + + if (r < 0) + return (r); + if ((size_t)r < size) { + archive_set_error(&a->archive, 0, + "Write request too large"); + return (ARCHIVE_WARN); + } + return (ARCHIVE_OK); } static ssize_t _archive_write_data(struct archive *_a, const void *buff, size_t size) { struct archive_write_disk *a = (struct archive_write_disk *)_a; - int r; __archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, ARCHIVE_STATE_DATA, "archive_write_data"); - if (a->fd < 0) - return (ARCHIVE_OK); - r = _archive_write_data_block(_a, buff, size, a->offset); - if (r < ARCHIVE_OK) - return (r); - return size; + return (write_data_block(a, buff, size, a->offset)); } static int @@ -584,7 +622,15 @@ return (ARCHIVE_OK); archive_clear_error(&a->archive); - if (a->last_offset != a->filesize && a->fd >= 0) { + /* Pad or truncate file to the right size. */ + if (a->fd < 0) { + /* There's no file. */ + } else if (a->filesize < 0) { + /* File size is unknown, so we can't set the size. */ + } else if (a->last_offset == a->filesize) { + /* Last write ended at exactly the filesize; we're done. */ + /* Hopefully, this is the common case. */ + } else { if (ftruncate(a->fd, a->filesize) == -1 && a->filesize == 0) { archive_set_error(&a->archive, errno, @@ -601,7 +647,8 @@ if (a->st.st_size != a->filesize) { const char nul = '\0'; if (lseek(a->fd, a->st.st_size - 1, SEEK_SET) < 0) { - archive_set_error(&a->archive, errno, "Seek failed"); + archive_set_error(&a->archive, errno, + "Seek failed"); return (ARCHIVE_FATAL); } if (write(a->fd, &nul, 1) < 0) { @@ -609,6 +656,7 @@ "Write to restore size failed"); return (ARCHIVE_FATAL); } + a->pst = NULL; } } @@ -963,7 +1011,7 @@ * If the hardlink does carry data, let the last * archive entry decide ownership. */ - if (r == 0 && a->filesize == 0) { + if (r == 0 && a->filesize <= 0) { a->todo = 0; a->deferred = 0; } if (r == 0 && a->filesize > 0) { @@ -1623,18 +1671,31 @@ { struct timeval times[2]; - times[1].tv_sec = archive_entry_mtime(a->entry); - times[1].tv_usec = archive_entry_mtime_nsec(a->entry) / 1000; + /* If no time was provided, we're done. */ + if (!archive_entry_atime_is_set(a->entry) + && !archive_entry_mtime_is_set(a->entry)) + return (ARCHIVE_OK); - times[0].tv_sec = archive_entry_atime(a->entry); - times[0].tv_usec = archive_entry_atime_nsec(a->entry) / 1000; + /* We know at least one is set, so... */ + if (archive_entry_mtime_is_set(a->entry)) { + times[1].tv_sec = archive_entry_mtime(a->entry); + times[1].tv_usec = archive_entry_mtime_nsec(a->entry) / 1000; + } else { + times[1].tv_sec = a->start_time; + times[1].tv_usec = 0; + } /* If no atime was specified, use start time instead. */ /* In theory, it would be marginally more correct to use * time(NULL) here, but that would cost us an extra syscall * for little gain. */ - if (times[0].tv_sec == 0 && times[0].tv_usec == 0) + if (archive_entry_atime_is_set(a->entry)) { + times[0].tv_sec = archive_entry_atime(a->entry); + times[0].tv_usec = archive_entry_atime_nsec(a->entry) / 1000; + } else { times[0].tv_sec = a->start_time; + times[0].tv_usec = 0; + } #ifdef HAVE_FUTIMES if (a->fd >= 0 && futimes(a->fd, times) == 0) { @@ -1672,10 +1733,24 @@ { struct utimbuf times; - times.modtime = archive_entry_mtime(a->entry); - times.actime = archive_entry_atime(a->entry); - if (times.actime == 0) + /* If no time was provided, we're done. */ + if (!archive_entry_atime_is_set(a->entry) + && !archive_entry_mtime_is_set(a->entry)) + return (ARCHIVE_OK); + + /* We know at least one is set, so... */ + /* Set mtime from mtime if set, else start time. */ + if (archive_entry_mtime_is_set(a->entry)) + times.modtime = archive_entry_mtime(a->entry); + else + times.modtime = a->start_time; + + /* Set atime from provided atime, else mtime. */ + if (archive_entry_atime_is_set(a->entry)) + times.actime = archive_entry_atime(a->entry); + else times.actime = a->start_time; + if (!S_ISLNK(a->mode) && utime(a->name, ×) != 0) { archive_set_error(&a->archive, errno, "Can't update time for %s", a->name); ==== //depot/projects/mpsafetty/lib/libarchive/test/test_write_disk.c#5 (text+ko) ==== @@ -23,7 +23,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_disk.c,v 1.13 2008/09/01 05:38:33 kientzle Exp $"); +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_disk.c,v 1.14 2008/09/05 06:13:11 kientzle Exp $"); #if ARCHIVE_VERSION_NUMBER >= 1009000 @@ -84,7 +84,7 @@ * the entry being a maximum size. */ archive_entry_set_size(ae, sizeof(data)); - archive_entry_set_mtime(ae, 123456789, 0); + archive_entry_set_mtime(ae, 123456789, 0); assertEqualIntA(ad, 0, archive_write_header(ad, ae)); assertEqualInt(sizeof(data), archive_write_data(ad, data, sizeof(data))); assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); @@ -152,8 +152,63 @@ free(compare); free(data); } + +static void create_reg_file3(struct archive_entry *ae, const char *msg) +{ + static const char data[]="abcdefghijklmnopqrstuvwxyz"; + struct archive *ad; + struct stat st; + + /* Write the entry to disk. */ + assert((ad = archive_write_disk_new()) != NULL); + failure("%s", msg); + /* Set the size smaller than the data and verify the truncation. */ + archive_entry_set_size(ae, 5); + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + assertEqualInt(5, archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(ad); +#else + assertEqualInt(0, archive_write_finish(ad)); #endif + /* Test the entry on disk. */ + assert(0 == stat(archive_entry_pathname(ae), &st)); + failure("st.st_mode=%o archive_entry_mode(ae)=%o", + st.st_mode, archive_entry_mode(ae)); + assertEqualInt(st.st_mode, (archive_entry_mode(ae) & ~UMASK)); + assertEqualInt(st.st_size, 5); +} + + +static void create_reg_file4(struct archive_entry *ae, const char *msg) +{ + static const char data[]="abcdefghijklmnopqrstuvwxyz"; + struct archive *ad; + struct stat st; + /* Write the entry to disk. */ + assert((ad = archive_write_disk_new()) != NULL); + /* Leave the size unset. The data should not be truncated. */ + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + assertEqualInt(ARCHIVE_OK, + archive_write_data_block(ad, data, sizeof(data), 0)); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(ad); +#else + assertEqualInt(0, archive_write_finish(ad)); +#endif + /* Test the entry on disk. */ + assert(0 == stat(archive_entry_pathname(ae), &st)); + failure("st.st_mode=%o archive_entry_mode(ae)=%o", + st.st_mode, archive_entry_mode(ae)); + assertEqualInt(st.st_mode, (archive_entry_mode(ae) & ~UMASK)); + failure(msg); + assertEqualInt(st.st_size, sizeof(data)); +} +#endif + DEFINE_TEST(test_write_disk) { #if ARCHIVE_VERSION_NUMBER < 1009000 @@ -178,6 +233,20 @@ create_reg_file2(ae, "Test creating another regular file"); archive_entry_free(ae); + /* A regular file with a size restriction */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file3"); + archive_entry_set_mode(ae, S_IFREG | 0755); + create_reg_file3(ae, "Regular file with size restriction"); + archive_entry_free(ae); + + /* A regular file with an unspecified size */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file3"); + archive_entry_set_mode(ae, S_IFREG | 0755); + create_reg_file4(ae, "Regular file with unspecified size"); + archive_entry_free(ae); + /* A regular file over an existing file */ assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, "file"); ==== //depot/projects/mpsafetty/lib/libarchive/test/test_write_disk_hardlink.c#4 (text+ko) ==== @@ -23,7 +23,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_disk_hardlink.c,v 1.4 2008/09/01 05:38:33 kientzle Exp $"); +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_disk_hardlink.c,v 1.5 2008/09/05 06:13:11 kientzle Exp $"); #define UMASK 022 @@ -61,18 +61,48 @@ archive_entry_set_mode(ae, S_IFREG | 0755); archive_entry_set_size(ae, sizeof(data)); assertEqualIntA(ad, 0, archive_write_header(ad, ae)); - assertEqualInt(sizeof(data), archive_write_data(ad, data, sizeof(data))); + assertEqualInt(sizeof(data), + archive_write_data(ad, data, sizeof(data))); assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); archive_entry_free(ae); - /* Link. */ + /* Link. Size of zero means this doesn't carry data. */ assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, "link1b"); - archive_entry_set_mode(ae, S_IFREG | 0600); + archive_entry_set_mode(ae, S_IFREG | 0642); archive_entry_set_size(ae, 0); archive_entry_copy_hardlink(ae, "link1a"); assertEqualIntA(ad, 0, archive_write_header(ad, ae)); - assertEqualInt(0, archive_write_data(ad, data, sizeof(data))); + assertEqualInt(ARCHIVE_WARN, + archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + archive_entry_free(ae); + + /* + * Repeat tar approach test, but use unset to mark the + * hardlink as having no data. + */ + + /* Regular file. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link2a"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, sizeof(data)); + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + assertEqualInt(sizeof(data), + archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + archive_entry_free(ae); + + /* Link. Unset size means this doesn't carry data. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link2b"); + archive_entry_set_mode(ae, S_IFREG | 0642); + archive_entry_unset_size(ae); + archive_entry_copy_hardlink(ae, "link2a"); + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + assertEqualInt(ARCHIVE_WARN, + archive_write_data(ad, data, sizeof(data))); assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); archive_entry_free(ae); @@ -83,7 +113,7 @@ /* Regular file. */ assert((ae = archive_entry_new()) != NULL); - archive_entry_copy_pathname(ae, "link2a"); + archive_entry_copy_pathname(ae, "link3a"); archive_entry_set_mode(ae, S_IFREG | 0600); archive_entry_set_size(ae, sizeof(data)); assertEqualIntA(ad, 0, archive_write_header(ad, ae)); @@ -93,10 +123,10 @@ /* Link. */ assert((ae = archive_entry_new()) != NULL); - archive_entry_copy_pathname(ae, "link2b"); + archive_entry_copy_pathname(ae, "link3b"); archive_entry_set_mode(ae, S_IFREG | 0755); archive_entry_set_size(ae, sizeof(data)); - archive_entry_copy_hardlink(ae, "link2a"); + archive_entry_copy_hardlink(ae, "link3a"); assertEqualIntA(ad, 0, archive_write_header(ad, ae)); assertEqualInt(sizeof(data), archive_write_data(ad, data, sizeof(data))); assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); @@ -109,7 +139,7 @@ /* Regular file. */ assert((ae = archive_entry_new()) != NULL); - archive_entry_copy_pathname(ae, "link3a"); + archive_entry_copy_pathname(ae, "link4a"); archive_entry_set_mode(ae, S_IFREG | 0600); archive_entry_set_size(ae, 0); assertEqualIntA(ad, 0, archive_write_header(ad, ae)); @@ -123,10 +153,10 @@ /* Link. */ assert((ae = archive_entry_new()) != NULL); - archive_entry_copy_pathname(ae, "link3b"); + archive_entry_copy_pathname(ae, "link4b"); archive_entry_set_mode(ae, S_IFREG | 0755); archive_entry_set_size(ae, sizeof(data)); - archive_entry_copy_hardlink(ae, "link3a"); + archive_entry_copy_hardlink(ae, "link4a"); assertEqualIntA(ad, 0, archive_write_header(ad, ae)); assertEqualInt(sizeof(data), archive_write_data(ad, data, sizeof(data))); assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); @@ -138,36 +168,63 @@ #endif /* Test the entries on disk. */ + + /* Test #1 */ assert(0 == stat("link1a", &st)); + /* If the hardlink was successfully created and the archive + * doesn't carry data for it, we consider it to be + * non-authoritive for meta data as well. This is consistent + * with GNU tar and BSD pax. */ assertEqualInt(st.st_mode, (S_IFREG | 0755) & ~UMASK); assertEqualInt(st.st_size, sizeof(data)); assertEqualInt(st.st_nlink, 2); assert(0 == stat("link1b", &st2)); - assertEqualInt(st2.st_mode, (S_IFREG | 0755) & ~UMASK); - assertEqualInt(st2.st_size, sizeof(data)); - assertEqualInt(st2.st_nlink, 2); + assertEqualInt(st.st_mode, st2.st_mode); + assertEqualInt(st.st_size, st2.st_size); + assertEqualInt(st.st_nlink, st2.st_nlink); assertEqualInt(st.st_ino, st2.st_ino); assertEqualInt(st.st_dev, st2.st_dev); + /* Test #2: Should produce identical results to test #1 */ + /* Note that marking a hardlink with size = 0 is treated the + * same as having an unset size. This is partly for backwards + * compatibility (we used to not have unset tracking, so + * relied on size == 0) and partly to match the model used by + * common file formats that store a size of zero for + * hardlinks. */ assert(0 == stat("link2a", &st)); assertEqualInt(st.st_mode, (S_IFREG | 0755) & ~UMASK); assertEqualInt(st.st_size, sizeof(data)); assertEqualInt(st.st_nlink, 2); assert(0 == stat("link2b", &st2)); + assertEqualInt(st.st_mode, st2.st_mode); + assertEqualInt(st.st_size, st2.st_size); + assertEqualInt(st.st_nlink, st2.st_nlink); + assertEqualInt(st.st_ino, st2.st_ino); + assertEqualInt(st.st_dev, st2.st_dev); + + /* Test #3 */ + assert(0 == stat("link3a", &st)); + assertEqualInt(st.st_mode, (S_IFREG | 0755) & ~UMASK); + assertEqualInt(st.st_size, sizeof(data)); + assertEqualInt(st.st_nlink, 2); + + assert(0 == stat("link3b", &st2)); assertEqualInt(st2.st_mode, (S_IFREG | 0755) & ~UMASK); assertEqualInt(st2.st_size, sizeof(data)); assertEqualInt(st2.st_nlink, 2); assertEqualInt(st.st_ino, st2.st_ino); assertEqualInt(st.st_dev, st2.st_dev); - assert(0 == stat("link3a", &st)); + /* Test #4 */ + assert(0 == stat("link4a", &st)); assertEqualInt(st.st_mode, (S_IFREG | 0755) & ~UMASK); assertEqualInt(st.st_size, sizeof(data)); assertEqualInt(st.st_nlink, 2); - assert(0 == stat("link3b", &st2)); + assert(0 == stat("link4b", &st2)); assertEqualInt(st2.st_mode, (S_IFREG | 0755) & ~UMASK); assertEqualInt(st2.st_size, sizeof(data)); assertEqualInt(st2.st_nlink, 2); ==== //depot/projects/mpsafetty/lib/libc/regex/re_format.7#2 (text+ko) ==== @@ -34,7 +34,7 @@ .\" SUCH DAMAGE. .\" .\" @(#)re_format.7 8.3 (Berkeley) 3/20/94 -.\" $FreeBSD: src/lib/libc/regex/re_format.7,v 1.11 2004/07/02 23:52:12 ru Exp $ +.\" $FreeBSD: src/lib/libc/regex/re_format.7,v 1.12 2008/09/05 17:41:20 keramida Exp $ .\" .Dd March 20, 1994 .Dt RE_FORMAT 7 @@ -288,6 +288,14 @@ A locale may provide others. A character class may not be used as an endpoint of a range. .Pp +A bracketed expression like +.Ql [[:class:]] +can be used to match a single character that belongs to a character +class. +The reverse, matching any character that does not belong to a specific +class, the negation operator of bracket expressions may be used: +.Ql [^[:class:]] . +.Pp There are two special cases\(dd of bracket expressions: the bracket expressions .Ql [[:<:]] ==== //depot/projects/mpsafetty/lib/libc/stdlib/malloc.c#6 (text+ko) ==== @@ -156,7 +156,7 @@ #define MALLOC_DSS #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/lib/libc/stdlib/malloc.c,v 1.177 2008/08/27 02:00:53 jasone Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/stdlib/malloc.c,v 1.178 2008/09/06 05:26:31 marcel Exp $"); #include "libc_private.h" #ifdef MALLOC_DEBUG @@ -226,7 +226,7 @@ # define CPU_SPINWAIT __asm__ volatile("pause") #endif #ifdef __ia64__ -# define PAGESIZE_2POW 12 +# define PAGESIZE_2POW 13 # define QUANTUM_2POW 4 # define SIZEOF_PTR_2POW 3 #endif ==== //depot/projects/mpsafetty/share/man/man4/Makefile#11 (text+ko) ==== @@ -1,5 +1,5 @@ # @(#)Makefile 8.1 (Berkeley) 6/18/93 -# $FreeBSD: src/share/man/man4/Makefile,v 1.430 2008/08/25 02:05:04 imp Exp $ +# $FreeBSD: src/share/man/man4/Makefile,v 1.431 2008/09/04 20:45:36 brueffer Exp $ MAN= aac.4 \ acpi.4 \ @@ -148,6 +148,7 @@ iwi.4 \ iwn.4 \ ixgb.4 \ + ixgbe.4 \ jme.4 \ joy.4 \ ${_k8temp.4} \ @@ -492,6 +493,7 @@ MLINKS+=ipw.4 if_ipw.4 MLINKS+=iwi.4 if_iwi.4 MLINKS+=ixgb.4 if_ixgb.4 +MLINKS+=ixgbe.4 if_ixgbe.4 MLINKS+=kue.4 if_kue.4 MLINKS+=lagg.4 trunk.4 MLINKS+=le.4 if_le.4 ==== //depot/projects/mpsafetty/share/man/man9/CTASSERT.9#2 (text+ko) ==== @@ -24,9 +24,9 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $FreeBSD: src/share/man/man9/CTASSERT.9,v 1.2 2003/05/30 21:13:32 ru Exp $ +.\" $FreeBSD: src/share/man/man9/CTASSERT.9,v 1.3 2008/09/05 15:24:54 emaste Exp $ .\" -.Dd May 15, 2003 +.Dd September 5, 2008 .Os .Dt CTASSERT 9 .Sh NAME @@ -48,6 +48,14 @@ macro is useful for asserting the size or alignment of important data structures and variables during compilation, which would otherwise cause the code to fail at run time. +.Sh IMPLEMENTATION NOTES +The +.Fn CTASSERT +macro should not be used in a header file. +It is implemented using a dummy typedef, with a name (based on line number) +that may conflict with a +.Fn CTASSERT +in a source file including that header. .Sh EXAMPLES Assert that the size of the .Vt uuid ==== //depot/projects/mpsafetty/sys/arm/at91/at91.c#3 (text) ==== @@ -23,7 +23,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/arm/at91/at91.c,v 1.17 2008/08/19 22:15:14 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/at91/at91.c,v 1.18 2008/09/05 22:27:10 imp Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -458,10 +458,6 @@ sc->sc_irq_rman.rm_descr = "AT91 IRQs"; sc->sc_mem_rman.rm_type = RMAN_ARRAY; sc->sc_mem_rman.rm_descr = "AT91 Memory"; -#if 0 - sc->sc_usbmem_rman.rm_type = RMAN_ARRAY; - sc->sc_usbmem_rman.rm_descr = "AT91RM9200 USB Memory-mapped regs"; -#endif if (rman_init(&sc->sc_irq_rman) != 0 || rman_manage_region(&sc->sc_irq_rman, 1, 31) != 0) panic("at91_attach: failed to set up IRQ rman"); @@ -536,14 +532,8 @@ start, end, count, flags, child); break; case SYS_RES_MEMORY: -#if 0 - if (start >= 0x00300000 && start <= 0x003fffff) - rle->res = rman_reserve_resource(&sc->sc_usbmem_rman, - start, end, count, flags, child); - else -#endif - rle->res = rman_reserve_resource(&sc->sc_mem_rman, - start, end, count, flags, child); + rle->res = rman_reserve_resource(&sc->sc_mem_rman, + start, end, count, flags, child); rman_set_bustag(rle->res, &at91_bs_tag); rman_set_bushandle(rle->res, start); break; ==== //depot/projects/mpsafetty/sys/arm/at91/at91_mci.c#2 (text+ko) ==== @@ -24,7 +24,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/arm/at91/at91_mci.c,v 1.4 2007/09/16 07:48:58 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/at91/at91_mci.c,v 1.5 2008/09/05 22:30:59 imp Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -298,14 +298,7 @@ else WR4(sc, MCI_SDCR, RD4(sc, MCI_SDCR) & ~MCI_SDCR_SDCBUS); WR4(sc, MCI_MR, (RD4(sc, MCI_MR) & ~MCI_MR_CLKDIV) | clkdiv); -#if 0 - if (sc->vcc_pin) { - if (sc->power_mode == MMC_POWER_OFF) - gpio_set(sc->vcc_pin, 0); - else - gpio_set(sc->vcc_pin, 1); - } -#endif + /* XXX We need to turn the device on/off here with a GPIO pin */ return (0); } ==== //depot/projects/mpsafetty/sys/arm/at91/at91_ssc.c#2 (text) ==== @@ -23,7 +23,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/arm/at91/at91_ssc.c,v 1.4 2007/02/23 12:18:27 piso Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/at91/at91_ssc.c,v 1.5 2008/09/05 22:29:50 imp Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -209,16 +209,6 @@ at91_ssc_intr(void *xsc) { struct at91_ssc_softc *sc = xsc; -#if 0 - uint32_t status; - - /* Reading the status also clears the interrupt */ - status = RD4(sc, SSC_SR); - if (status == 0) - return; - AT91_SSC_LOCK(sc); - AT91_SSC_UNLOCK(sc); -#endif wakeup(sc); return; } @@ -232,9 +222,6 @@ AT91_SSC_LOCK(sc); if (!(sc->flags & OPENED)) { sc->flags |= OPENED; -#if 0 - // Enable interrupts -#endif } AT91_SSC_UNLOCK(sc); return (0); @@ -248,9 +235,6 @@ sc = CDEV2SOFTC(dev); AT91_SSC_LOCK(sc); sc->flags &= ~OPENED; -#if 0 - // Disable interrupts -#endif AT91_SSC_UNLOCK(sc); return (0); } ==== //depot/projects/mpsafetty/sys/arm/at91/kb920x_machdep.c#2 (text) ==== @@ -47,7 +47,7 @@ #include "opt_at91.h" #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/arm/at91/kb920x_machdep.c,v 1.30 2008/04/03 16:44:49 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/at91/kb920x_machdep.c,v 1.31 2008/09/05 22:23:41 imp Exp $"); #define _ARM32_BUS_DMA_PRIVATE #include <sys/param.h> @@ -164,7 +164,6 @@ * initialization is done. However, the AT91 resource allocation * system doesn't know how to use pmap_mapdev() yet. */ -#if 1 { /* * Add the ohci controller, and anything else that might be @@ -176,7 +175,6 @@ VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE, }, -#endif { 0, 0, ==== //depot/projects/mpsafetty/sys/boot/sparc64/loader/main.c#5 (text+ko) ==== @@ -8,7 +8,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/boot/sparc64/loader/main.c,v 1.35 2008/08/30 16:03:22 marius Exp $"); +__FBSDID("$FreeBSD: src/sys/boot/sparc64/loader/main.c,v 1.36 2008/09/04 19:41:54 marius Exp $"); /* * FreeBSD/sparc64 kernel loader - machine dependent part @@ -396,36 +396,44 @@ static vm_offset_t dtlb_va_to_pa_sun4u(vm_offset_t va) { - u_long reg; + u_long pstate, reg; int i; + pstate = rdpr(pstate); + wrpr(pstate, pstate & ~PSTATE_IE, 0); for (i = 0; i < dtlb_slot_max; i++) { reg = ldxa(TLB_DAR_SLOT(i), ASI_DTLB_TAG_READ_REG); if (TLB_TAR_VA(reg) != va) continue; reg = dtlb_get_data_sun4u(i); + wrpr(pstate, pstate, 0); if (cpu_impl >= CPU_IMPL_ULTRASPARCIII) return ((reg & TD_PA_CH_MASK) >> TD_PA_SHIFT); return ((reg & TD_PA_SF_MASK) >> TD_PA_SHIFT); } + wrpr(pstate, pstate, 0); return (-1); } static vm_offset_t itlb_va_to_pa_sun4u(vm_offset_t va) { - u_long reg; + u_long pstate, reg; int i; + pstate = rdpr(pstate); >>> TRUNCATED FOR MAIL (1000 lines) <<<help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200809061026.m86AQGip003937>
