PERFORCE change 49419 for review

Peter Wemm peter at FreeBSD.org
Sat Mar 20 17:31:09 PST 2004


http://perforce.freebsd.org/chv.cgi?CH=49419

Change 49419 by peter at peter_overcee on 2004/03/20 17:30:37

	IFC @49416

Affected files ...

.. //depot/projects/hammer/contrib/sort/Makefile#2 delete
.. //depot/projects/hammer/contrib/sort/append.c#2 delete
.. //depot/projects/hammer/contrib/sort/extern.h#2 delete
.. //depot/projects/hammer/contrib/sort/fields.c#2 delete
.. //depot/projects/hammer/contrib/sort/files.c#2 delete
.. //depot/projects/hammer/contrib/sort/fsort.c#2 delete
.. //depot/projects/hammer/contrib/sort/fsort.h#2 delete
.. //depot/projects/hammer/contrib/sort/init.c#2 delete
.. //depot/projects/hammer/contrib/sort/msort.c#2 delete
.. //depot/projects/hammer/contrib/sort/pathnames.h#2 delete
.. //depot/projects/hammer/contrib/sort/regress/Makefile#2 delete
.. //depot/projects/hammer/contrib/sort/regress/stests#2 delete
.. //depot/projects/hammer/contrib/sort/sort.1#2 delete
.. //depot/projects/hammer/contrib/sort/sort.c#2 delete
.. //depot/projects/hammer/contrib/sort/sort.h#2 delete
.. //depot/projects/hammer/contrib/sort/tmp.c#2 delete
.. //depot/projects/hammer/etc/ftpusers#3 integrate
.. //depot/projects/hammer/etc/mail/aliases#5 integrate
.. //depot/projects/hammer/etc/rc.d/devfs#8 integrate
.. //depot/projects/hammer/include/stdio.h#7 integrate
.. //depot/projects/hammer/lib/libarchive/Makefile#3 integrate
.. //depot/projects/hammer/lib/libarchive/archive.h#4 integrate
.. //depot/projects/hammer/lib/libarchive/archive_entry.3#2 integrate
.. //depot/projects/hammer/lib/libarchive/archive_entry.c#3 integrate
.. //depot/projects/hammer/lib/libarchive/archive_entry.h#2 integrate
.. //depot/projects/hammer/lib/libarchive/archive_platform.h#2 integrate
.. //depot/projects/hammer/lib/libarchive/archive_private.h#3 integrate
.. //depot/projects/hammer/lib/libarchive/archive_read.c#3 integrate
.. //depot/projects/hammer/lib/libarchive/archive_read_data_into_fd.c#3 integrate
.. //depot/projects/hammer/lib/libarchive/archive_read_support_compression_gzip.c#3 integrate
.. //depot/projects/hammer/lib/libarchive/archive_read_support_format_cpio.c#4 integrate
.. //depot/projects/hammer/lib/libarchive/archive_read_support_format_gnutar.c#3 integrate
.. //depot/projects/hammer/lib/libarchive/archive_read_support_format_tar.c#4 integrate
.. //depot/projects/hammer/lib/libarchive/archive_string.c#3 integrate
.. //depot/projects/hammer/lib/libarchive/archive_string.h#2 integrate
.. //depot/projects/hammer/lib/libarchive/archive_util.c#3 integrate
.. //depot/projects/hammer/lib/libarchive/archive_write.c#3 integrate
.. //depot/projects/hammer/lib/libarchive/archive_write_open_file.c#3 integrate
.. //depot/projects/hammer/lib/libarchive/archive_write_set_format_pax.c#4 integrate
.. //depot/projects/hammer/lib/libarchive/libarchive.3#2 integrate
.. //depot/projects/hammer/lib/libarchive/tar.5#2 integrate
.. //depot/projects/hammer/lib/libc/stdio/fseek.3#4 integrate
.. //depot/projects/hammer/lib/libc/stdio/funopen.3#3 integrate
.. //depot/projects/hammer/libexec/rtld-elf/Makefile#10 integrate
.. //depot/projects/hammer/libexec/rtld-elf/debug.h#3 integrate
.. //depot/projects/hammer/libexec/rtld-elf/libmap.c#12 integrate
.. //depot/projects/hammer/libexec/rtld-elf/libmap.h#4 integrate
.. //depot/projects/hammer/libexec/rtld-elf/rtld.c#18 integrate
.. //depot/projects/hammer/libexec/rtld-elf/rtld.h#7 integrate
.. //depot/projects/hammer/release/doc/en_US.ISO8859-1/relnotes/common/new.sgml#61 integrate
.. //depot/projects/hammer/sbin/ldconfig/ldconfig.c#5 integrate
.. //depot/projects/hammer/share/examples/pppd/ppp.deny.sample#3 integrate
.. //depot/projects/hammer/share/man/man4/man4.i386/acpi_toshiba.4#2 integrate
.. //depot/projects/hammer/share/termcap/termcap.src#11 integrate
.. //depot/projects/hammer/sys/alpha/alpha/uio_machdep.c#1 branch
.. //depot/projects/hammer/sys/alpha/include/_types.h#4 integrate
.. //depot/projects/hammer/sys/amd64/amd64/uio_machdep.c#1 branch
.. //depot/projects/hammer/sys/amd64/include/_types.h#8 integrate
.. //depot/projects/hammer/sys/arm/include/_types.h#3 integrate
.. //depot/projects/hammer/sys/compat/ia32/ia32_sysvec.c#12 integrate
.. //depot/projects/hammer/sys/compat/ndis/kern_ndis.c#10 integrate
.. //depot/projects/hammer/sys/compat/ndis/ndis_var.h#7 integrate
.. //depot/projects/hammer/sys/compat/ndis/ntoskrnl_var.h#6 integrate
.. //depot/projects/hammer/sys/compat/ndis/subr_ndis.c#9 integrate
.. //depot/projects/hammer/sys/compat/ndis/subr_ntoskrnl.c#10 integrate
.. //depot/projects/hammer/sys/conf/files#51 integrate
.. //depot/projects/hammer/sys/conf/files.alpha#12 integrate
.. //depot/projects/hammer/sys/conf/files.amd64#40 integrate
.. //depot/projects/hammer/sys/conf/files.ia64#16 integrate
.. //depot/projects/hammer/sys/conf/kern.post.mk#20 integrate
.. //depot/projects/hammer/sys/dev/aac/aac_pci.c#12 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi_pcib.c#14 integrate
.. //depot/projects/hammer/sys/dev/ath/if_ath.c#17 integrate
.. //depot/projects/hammer/sys/dev/awi/awi.c#9 integrate
.. //depot/projects/hammer/sys/dev/gem/if_gem.c#9 integrate
.. //depot/projects/hammer/sys/dev/hme/if_hme.c#7 integrate
.. //depot/projects/hammer/sys/dev/if_ndis/if_ndis.c#10 integrate
.. //depot/projects/hammer/sys/dev/iir/iir.h#6 integrate
.. //depot/projects/hammer/sys/dev/sound/pci/vibes.c#6 integrate
.. //depot/projects/hammer/sys/dev/uart/uart_cpu.h#3 integrate
.. //depot/projects/hammer/sys/dev/uart/uart_cpu_alpha.c#4 integrate
.. //depot/projects/hammer/sys/dev/uart/uart_cpu_amd64.c#4 integrate
.. //depot/projects/hammer/sys/dev/uart/uart_cpu_i386.c#4 integrate
.. //depot/projects/hammer/sys/dev/uart/uart_cpu_ia64.c#4 integrate
.. //depot/projects/hammer/sys/dev/uart/uart_cpu_pc98.c#4 integrate
.. //depot/projects/hammer/sys/dev/uart/uart_cpu_sparc64.c#6 integrate
.. //depot/projects/hammer/sys/dev/uart/uart_subr.c#1 branch
.. //depot/projects/hammer/sys/dev/usb/usb_subr.c#8 integrate
.. //depot/projects/hammer/sys/dev/wi/if_wi.c#26 integrate
.. //depot/projects/hammer/sys/i386/include/_types.h#6 integrate
.. //depot/projects/hammer/sys/ia64/conf/GENERIC.hints#5 integrate
.. //depot/projects/hammer/sys/ia64/ia64/uio_machdep.c#1 branch
.. //depot/projects/hammer/sys/ia64/include/_types.h#6 integrate
.. //depot/projects/hammer/sys/ia64/include/reg.h#5 integrate
.. //depot/projects/hammer/sys/modules/uart/Makefile#3 integrate
.. //depot/projects/hammer/sys/pci/if_xl.c#34 integrate
.. //depot/projects/hammer/sys/powerpc/include/_types.h#4 integrate
.. //depot/projects/hammer/sys/sparc64/include/_types.h#5 integrate
.. //depot/projects/hammer/sys/sys/types.h#12 integrate
.. //depot/projects/hammer/sys/sys/uio.h#7 integrate

Differences ...

==== //depot/projects/hammer/etc/ftpusers#3 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/etc/ftpusers,v 1.11 2003/04/27 05:49:53 imp Exp $
+# $FreeBSD: src/etc/ftpusers,v 1.12 2004/03/20 19:13:06 maxim Exp $
 #
 # list of users disallowed any ftp access.
 # read by ftpd(8).
@@ -14,6 +14,7 @@
 man
 sshd
 bind
+proxy
 uucp
 pop
 www

==== //depot/projects/hammer/etc/mail/aliases#5 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/etc/mail/aliases,v 1.18 2003/04/27 05:49:53 imp Exp $
+# $FreeBSD: src/etc/mail/aliases,v 1.19 2004/03/20 19:13:06 maxim Exp $
 #	@(#)aliases	5.3 (Berkeley) 5/24/90
 #
 #  Aliases in this file will NOT be expanded in the header from
@@ -34,6 +34,7 @@
 nobody:	root
 operator: root
 pop:	root
+proxy:	root
 smmsp:	postmaster
 sshd:	root
 system:	root

==== //depot/projects/hammer/etc/rc.d/devfs#8 (text+ko) ====

@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# $FreeBSD: src/etc/rc.d/devfs,v 1.7 2004/03/08 12:25:05 pjd Exp $
+# $FreeBSD: src/etc/rc.d/devfs,v 1.8 2004/03/20 07:10:16 green Exp $
 #
 
 # PROVIDE: devfs
@@ -16,10 +16,23 @@
 
 devfs_start()
 {
-	if [ -n "$devfs_system_ruleset" ]; then
+	if [ -n "$devfs_system_ruleset" -o -n "$devfs_set_rulesets" ]; then
 		devfs_init_rulesets
-		devfs_set_ruleset $devfs_system_ruleset /dev
-		devfs_apply_ruleset $devfs_system_ruleset /dev
+		if [ -n "$devfs_system_ruleset" ]; then
+			devfs_set_ruleset $devfs_system_ruleset /dev
+			devfs_apply_ruleset $devfs_system_ruleset /dev
+		fi
+		if [ -n "$devfs_set_rulesets" ]; then
+			local _dir_set
+			local _dir
+			local _set
+			for _dir_set in $devfs_set_rulesets; do
+				_dir=${_dir_set%=*}
+				_set=${_dir_set#*=}
+				devfs_set_ruleset $_set $_dir
+				devfs_apply_ruleset $_set $_dir
+			done
+		fi
 	fi
 	read_devfs_conf
 }

==== //depot/projects/hammer/include/stdio.h#7 (text+ko) ====

@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)stdio.h	8.5 (Berkeley) 4/29/95
- * $FreeBSD: src/include/stdio.h,v 1.53 2004/03/17 01:43:07 tjr Exp $
+ * $FreeBSD: src/include/stdio.h,v 1.54 2004/03/20 11:45:52 tjr Exp $
  */
 
 #ifndef	_STDIO_H_
@@ -418,16 +418,16 @@
 
 extern int __isthreaded;
 
-#define	feof(p)		(!__isthreaded ? __sfeof(p) : feof(p))
-#define	ferror(p)	(!__isthreaded ? __sferror(p) : ferror(p))
-#define	clearerr(p)	(!__isthreaded ? __sclearerr(p) : clearerr(p))
+#define	feof(p)		(!__isthreaded ? __sfeof(p) : (feof)(p))
+#define	ferror(p)	(!__isthreaded ? __sferror(p) : (ferror)(p))
+#define	clearerr(p)	(!__isthreaded ? __sclearerr(p) : (clearerr)(p))
 
 #if __POSIX_VISIBLE
-#define	fileno(p)	(!__isthreaded ? __sfileno(p) : fileno(p))
+#define	fileno(p)	(!__isthreaded ? __sfileno(p) : (fileno)(p))
 #endif
 
-#define	getc(fp)	(!__isthreaded ? __sgetc(fp) : getc(fp))
-#define	putc(x, fp)	(!__isthreaded ? __sputc(x, fp) : putc(x, fp))
+#define	getc(fp)	(!__isthreaded ? __sgetc(fp) : (getc)(fp))
+#define	putc(x, fp)	(!__isthreaded ? __sputc(x, fp) : (putc)(x, fp))
 
 #define	getchar()	getc(stdin)
 #define	putchar(x)	putc(x, stdout)

==== //depot/projects/hammer/lib/libarchive/Makefile#3 (text+ko) ====

@@ -1,8 +1,14 @@
 # Makefile for libarchive.
 #
-# $FreeBSD: src/lib/libarchive/Makefile,v 1.3 2004/03/09 19:50:41 kientzle Exp $
-#
+# $FreeBSD: src/lib/libarchive/Makefile,v 1.4 2004/03/19 22:37:06 kientzle Exp $
+
 LIB=	archive
+SHLIB_MAJOR=	1
+
+# I'm not yet ready for a shared version of this library, as
+# there are still a couple of API changes still in the works.
+NOSHLIBS=	1
+
 SRCS=	archive_check_magic.c				\
 	archive_entry.c					\
 	archive_read.c					\
@@ -114,8 +120,8 @@
 CFLAGS+= -DHAVE_DMALLOC -I/usr/local/include
 LDFLAGS+= -L/usr/local/lib -ldmalloc
 .endif
+CFLAGS+= -O3
 
-# Should be WARNS=6, except that zlib.h is borked. <sigh>
-WARNS?=	3
+WARNS?=	6
 
 .include <bsd.lib.mk>

==== //depot/projects/hammer/lib/libarchive/archive.h#4 (text+ko) ====

@@ -23,15 +23,14 @@
  * (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/lib/libarchive/archive.h,v 1.4 2004/03/09 19:50:41 kientzle Exp $
+ * $FreeBSD: src/lib/libarchive/archive.h,v 1.5 2004/03/19 22:37:06 kientzle Exp $
  */
 
 #ifndef ARCHIVE_H_INCLUDED
 #define	ARCHIVE_H_INCLUDED
 
-#include <stdarg.h>
-#include <stdint.h>
-#include <unistd.h>
+#include <inttypes.h>  /* For int64_t */
+#include <unistd.h>  /* For ssize_t and size_t */
 
 #define	ARCHIVE_BYTES_PER_RECORD	  512
 #define	ARCHIVE_DEFAULT_BYTES_PER_BLOCK	10240

==== //depot/projects/hammer/lib/libarchive/archive_entry.3#2 (text+ko) ====

@@ -22,7 +22,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.\" $FreeBSD: src/lib/libarchive/archive_entry.3,v 1.1 2004/02/09 23:22:53 kientzle Exp $
+.\" $FreeBSD: src/lib/libarchive/archive_entry.3,v 1.2 2004/03/19 22:37:06 kientzle Exp $
 .\"
 .Dd December 15, 2003
 .Dt archive_entry 3
@@ -30,13 +30,20 @@
 .Sh NAME
 .Nm archive_entry_clear
 .Nm archive_entry_clone
+.Nm archive_entry_copy_gname_w
+.Nm archive_entry_copy_hardlink_w
+.Nm archive_entry_copy_pathname_w
 .Nm archive_entry_copy_stat
-.Nm archive_entry_dup
+.Nm archive_entry_copy_symlink_w
+.Nm archive_entry_copy_uname_w
 .Nm archive_entry_free
 .Nm archive_entry_gname
+.Nm archive_entry_gname_w
 .Nm archive_entry_hardlink
+.Nm archive_entry_hardlink_w
 .Nm archive_entry_new
 .Nm archive_entry_pathname
+.Nm archive_entry_pathname_w
 .Nm archive_entry_set_devmajor
 .Nm archive_entry_set_devminor
 .Nm archive_entry_set_gid
@@ -51,8 +58,10 @@
 .Nm archive_entry_size
 .Nm archive_entry_stat
 .Nm archive_entry_symlink
+.Nm archive_entry_symlink_w
 .Nm archive_entry_tartype
 .Nm archive_entry_uname
+.Nm archive_entry_uname_w
 .Nd functions for manipulating archive entry descriptions
 .Sh SYNOPSIS
 .In archive_entry.h
@@ -61,19 +70,33 @@
 .Ft struct archive_entry *
 .Fn archive_entry_clone "struct archive_entry *"
 .Ft void
+.Fn archive_entry_copy_gname_w "struct archive_entry *" "const wchar_t *"
+.Ft void
+.Fn archive_entry_copy_hardlink_w "struct archive_entry *" "const wchar_t *"
+.Ft void
+.Fn archive_entry_copy_pathname_w "struct archive_entry *" "const wchar_t *"
+.Ft void
 .Fn archive_entry_copy_stat "struct archive_entry *" "struct stat *"
-.Ft struct archive_entry *
-.Fn archive_entry_dup "struct archive_entry *"
+.Ft void
+.Fn archive_entry_copy_symlink_w "struct archive_entry *" "const wchar_t *"
+.Ft void
+.Fn archive_entry_copy_uname_w "struct archive_entry *" "const wchar_t *"
 .Ft void
 .Fn archive_entry_free "struct archive_entry *"
 .Ft const char *
 .Fn archive_entry_gname "struct archive_entry *"
+.Ft const wchar_t *
+.Fn archive_entry_gname_w "struct archive_entry *"
 .Ft const char *
 .Fn archive_entry_hardlink "struct archive_entry *"
+.Ft const wchar_t *
+.Fn archive_entry_hardlink_w "struct archive_entry *"
 .Ft struct archive_entry *
 .Fn archive_entry_new "void"
 .Ft const char *
 .Fn archive_entry_pathname "struct archive_entry *"
+.Ft const wchar_t *
+.Fn archive_entry_pathname_w "struct archive_entry *"
 .Ft void
 .Fn archive_entry_set_devmajor "struct archive_entry *" "dev_t"
 .Ft void
@@ -102,25 +125,65 @@
 .Fn archive_entry_stat "struct archive_entry *"
 .Ft const char *
 .Fn archive_entry_symlink "struct archive_entry *"
+.Ft const wchar_t *
+.Fn archive_entry_symlink_w "struct archive_entry *"
 .Ft int
 .Fn archive_entry_tartype "struct archive_entry *"
 .Ft const char *
 .Fn archive_entry_uname "struct archive_entry *"
+.Ft const wchar_t *
+.Fn archive_entry_uname_w "struct archive_entry *"
 .Sh DESCRIPTION
 These functions create and manipulate data objects that
 represent entries within an archive.
 You can think of a
 .Tn struct archive_entry
-as a
+as a heavy-duty version of
+.Tn struct stat :
+it includes everything from
 .Tn struct stat
-on steroids:  it includes everything from
-.Tn struct stat
 plus associated pathname, textual group and user names, etc.
 These objects are used by
 .Xr libarchive 3
 to represent the metadata associated with a particular
 entry in an archive.
+.Pp
+Most of the functions here set or read entries
+in an object.  Such functions have one of the
+following forms:
 .Bl -tag -compact -width indent
+.It Fn archive_entry_set_XXXX
+Stores the provided data in the object.
+In particular, for strings, the pointer is stored,
+not the referenced string.
+.It Fn archive_entry_copy_XXXX
+As above, except that the referenced data is copied
+into the object.
+.It Fn archive_entry_XXXX
+Returns the specified data.
+In the case of strings, a const-qualified pointer to
+the string is returned.
+.El
+The string data can be accessed as wide character strings
+(which are suffixed with
+.Cm _w )
+or normal
+.Va char
+strings.
+Note that these are different representations of the same
+data:
+For example, if you store a narrow string and read the corresponding
+wide string, the object will transparently convert formats
+using the current locale.
+Similarly, if you store a wide string and then store a
+narrow string for the same data, the previously-set wide string will
+be discarded in favor of the new data.
+.Pp
+The remaining functions allocate, destroy, clear, and copy
+.Va archive_entry
+objects.
+These functions are described below:
+.Bl -tag -compact -width indent
 .It Fn archive_entry_clear
 Erases the object, resetting all internal fields to the
 same state as a newly-created object.
@@ -128,76 +191,20 @@
 without thrashing the heap.
 .It Fn archive_entry_clone
 A deep copy operation; all text fields are duplicated.
-.It Fn archive_entry_copy_stat
-Copies the contents of the provided
-.Tn struct stat
-into the
-.Tn struct archive_entry
-object.
-.It Fn archive_entry_dup
-A shallow copy; text fields are not duplicated.
 .It Fn archive_entry_free
 Releases the
 .Tn struct archive_entry
 object.
-.It Fn archive_entry_gname
-Returns a pointer to the textual group name.
-.It Fn archive_entry_hardlink
-If this function returns non-NULL, then this object represents
-a hardlink to another filesystem object.
-The contents contain the pathname of the object.
 .It Fn archive_entry_new
 Allocate and return a blank
 .Tn struct archive_entry
 object.
-.It Fn archive_entry_pathname
-Returns a pointer to the pathname.
-.It Fn archive_entry_set_devmajor
-Sets the device major number (only valid for objects representing
-block and character devices).
-.It Fn archive_entry_set_devminor
-Sets the device minor number (only valid for objects representing
-block and character devices).
-.It Fn archive_entry_set_gid
-Sets the group ID for the object.
-.It Fn archive_entry_set_gname
-Sets a pointer to the textual group name.
-Note that the name itself is not copied.
-.It Fn archive_entry_set_hardlink
-Sets the hardlink property; see
-.Fn archive_entry_hardlink
-above.
-.It Fn archive_entry_set_mode
-Sets the file mode.
-.It Fn archive_entry_set_pathname
-Sets a pointer to the pathname.
-Note that the pathname text is not copied.
-.It Fn archive_entry_set_symlink
-Sets a pointer to the contents of a symbolic link.
-Note that the pathname text is not copied.
 .It Fn archive_entry_set_tartype
 Sets the value to be used in a tar-format header
 for this entry.
 Client code should generally not set this; if it
 is left unset, the library will automatically determine
 an appropriate value.
-.It Fn archive_entry_set_uid
-Set the user ID for the object.
-.It Fn archive_entry_set_uname
-Sets a pointer to the textual user name.
-Note that the name itself is not copied.
-.It Fn archive_entry_size
-Returns the size of the object on disk in bytes.
-.It Fn archive_entry_stat
-Returns a pointer to a populated
-.Tn struct stat .
-.It Fn archive_entry_symlink
-Returns a pointer to the symlink contents.
-.It Fn archive_entry_tartype
-Returns the value used in a tar-format header.
-Not generally useful to clients.
-.It Fn archive_entry_uname
-Returns a pointer to the textual user name.
 .El
 .\" .Sh EXAMPLE
 .\" .Sh RETURN VALUES
@@ -215,4 +222,4 @@
 .Nm libarchive
 library was written by
 .An Tim Kientzle Aq kientzle at acm.org .
-.Sh BUGS
+.\" .Sh BUGS

==== //depot/projects/hammer/lib/libarchive/archive_entry.c#3 (text+ko) ====

@@ -25,19 +25,42 @@
  */
 
 #include "archive_platform.h"
-__FBSDID("$FreeBSD: src/lib/libarchive/archive_entry.c,v 1.2 2004/03/09 19:50:41 kientzle Exp $");
+__FBSDID("$FreeBSD: src/lib/libarchive/archive_entry.c,v 1.3 2004/03/19 22:37:06 kientzle Exp $");
 
 #include <sys/stat.h>
 #include <sys/types.h>
 #ifdef HAVE_DMALLOC
 #include <dmalloc.h>
 #endif
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <wchar.h>
 
 #include "archive_entry.h"
 
 /*
+ * Handle wide character (i.e., Unicode) and non-wide character
+ * strings transparently.
+ *
+ */
+
+struct aes {
+	const char *aes_mbs;
+	char *aes_mbs_alloc;
+	const wchar_t *aes_wcs;
+	wchar_t *aes_wcs_alloc;
+};
+
+void		aes_clean(struct aes *);
+void		aes_copy(struct aes *dest, struct aes *src);
+const char *	aes_get_mbs(struct aes *);
+const wchar_t *	aes_get_wcs(struct aes *);
+void		aes_set_mbs(struct aes *, const char *mbs);
+void		aes_set_wcs(struct aes *, const wchar_t *wcs);
+void		aes_copy_wcs(struct aes *, const wchar_t *wcs);
+
+/*
  * Description of an archive entry.
  *
  * Basically, this is a "struct stat" with a few text fields added in.
@@ -70,124 +93,175 @@
 	int ae_tartype;
 
 	/*
-	 * Note: If you add any more string fields, update
-	 * archive_entry_clone accordingly.
+	 * Use aes here so that we get transparent mbs<->wcs conversions.
 	 */
-	const char *ae_acl;		/* ACL text */
-	const char *ae_acl_default;	/* default ACL */
-	const char *ae_fflags;		/* Text fflags per fflagstostr(3) */
-	const char *ae_gname;		/* Name of owning group */
-	const char *ae_hardlink;	/* Name of target for hardlink */
-	const char *ae_pathname;	/* Name of entry */
-	const char *ae_symlink;		/* symlink contents */
-	const char *ae_uname;		/* Name of owner */
-
-	char buff[1]; /* MUST BE AT END OF STRUCT!!! */
+	struct aes ae_acl;		/* ACL text */
+	struct aes ae_acl_default;	/* default ACL */
+	struct aes ae_fflags;		/* Text fflags per fflagstostr(3) */
+	struct aes ae_gname;		/* Name of owning group */
+	struct aes ae_hardlink;	/* Name of target for hardlink */
+	struct aes ae_pathname;	/* Name of entry */
+	struct aes ae_symlink;		/* symlink contents */
+	struct aes ae_uname;		/* Name of owner */
 };
 
-struct archive_entry *
-archive_entry_clear(struct archive_entry *entry)
+void
+aes_clean(struct aes *aes)
 {
-	memset(entry, 0, sizeof(*entry));
-	entry->ae_tartype = -1;
-	return entry;
+	if (aes->aes_mbs_alloc) {
+		free(aes->aes_mbs_alloc);
+		aes->aes_mbs_alloc = NULL;
+	}
+	if (aes->aes_wcs_alloc) {
+		free(aes->aes_wcs_alloc);
+		aes->aes_wcs_alloc = NULL;
+	}
+	memset(aes, 0, sizeof(*aes));
 }
 
-struct archive_entry *
-archive_entry_clone(struct archive_entry *entry)
+void
+aes_copy(struct aes *dest, struct aes *src)
 {
-	int size;
-	struct archive_entry *entry2;
-	char *p;
+	*dest = *src;
+	if (src->aes_mbs_alloc != NULL) {
+		dest->aes_mbs_alloc = strdup(src->aes_mbs_alloc);
+		dest->aes_mbs = dest->aes_mbs_alloc;
+	}
 
-	size = sizeof(*entry2);
-	if (entry->ae_acl)
-		size += strlen(entry->ae_acl) + 1;
-	if (entry->ae_acl_default)
-		size += strlen(entry->ae_acl_default) + 1;
-	if (entry->ae_fflags)
-		size += strlen(entry->ae_fflags) + 1;
-	if (entry->ae_gname)
-		size += strlen(entry->ae_gname) + 1;
-	if (entry->ae_hardlink)
-		size += strlen(entry->ae_hardlink) + 1;
-	if (entry->ae_pathname)
-		size += strlen(entry->ae_pathname) + 1;
-	if (entry->ae_symlink)
-		size += strlen(entry->ae_symlink) + 1;
-	if (entry->ae_uname)
-		size += strlen(entry->ae_uname) + 1;
+	if (src->aes_wcs_alloc != NULL) {
+		dest->aes_wcs_alloc = malloc((wcslen(src->aes_wcs_alloc) + 1)
+		    * sizeof(wchar_t));
+		dest->aes_wcs = dest->aes_wcs_alloc;
+		wcscpy(dest->aes_wcs_alloc, src->aes_wcs);
+	}
+}
 
-	entry2 = malloc(size);
-	*entry2 = *entry;
-
-	/* Copy all of the strings from the original. */
-	p = entry2->buff;
-
-	if (entry->ae_acl) {
-		entry2->ae_acl = p;
-		strcpy(p, entry->ae_acl);
-		p += strlen(p) + 1;
+const char *
+aes_get_mbs(struct aes *aes)
+{
+	if (aes->aes_mbs == NULL && aes->aes_wcs != NULL) {
+		/*
+		 * XXX Need to estimate the number of byte in the
+		 * multi-byte form.  Assume that, on average, wcs
+		 * chars encode to no more than 3 bytes.  There must
+		 * be a better way... XXX
+		 */
+		int mbs_length = wcslen(aes->aes_wcs) * 3 + 64;
+		aes->aes_mbs_alloc = malloc(mbs_length);
+		aes->aes_mbs = aes->aes_mbs_alloc;
+		wcstombs(aes->aes_mbs_alloc, aes->aes_wcs, mbs_length - 1);
+		aes->aes_mbs_alloc[mbs_length - 1] = 0;
 	}
+	return (aes->aes_mbs);
+}
 
-	if (entry->ae_acl_default) {
-		entry2->ae_acl_default = p;
-		strcpy(p, entry->ae_acl_default);
-		p += strlen(p) + 1;
+const wchar_t *
+aes_get_wcs(struct aes *aes)
+{
+	if (aes->aes_wcs == NULL && aes->aes_mbs != NULL) {
+		/*
+		 * No single byte will be more than one wide character,
+		 * so this length estimate will always be big enough.
+		 */
+		int wcs_length = strlen(aes->aes_mbs);
+		aes->aes_wcs_alloc
+		    = malloc((wcs_length + 1) * sizeof(wchar_t));
+		aes->aes_wcs = aes->aes_wcs_alloc;
+		mbstowcs(aes->aes_wcs_alloc, aes->aes_mbs, wcs_length);
+		aes->aes_wcs_alloc[wcs_length] = 0;
 	}
+	return (aes->aes_wcs);
+}
 
-	if (entry->ae_fflags) {
-		entry2->ae_fflags = p;
-		strcpy(p, entry->ae_fflags);
-		p += strlen(p) + 1;
+void
+aes_set_mbs(struct aes *aes, const char *mbs)
+{
+	if (aes->aes_mbs_alloc) {
+		free(aes->aes_mbs_alloc);
+		aes->aes_mbs_alloc = NULL;
 	}
-
-	if (entry->ae_gname) {
-		entry2->ae_gname = p;
-		strcpy(p, entry->ae_gname);
-		p += strlen(p) + 1;
+	if (aes->aes_wcs_alloc) {
+		free(aes->aes_wcs_alloc);
+		aes->aes_wcs_alloc = NULL;
 	}
+	aes->aes_mbs = mbs;
+	aes->aes_wcs = NULL;
+}
 
-	if (entry->ae_hardlink) {
-		entry2->ae_hardlink = p;
-		strcpy(p, entry->ae_hardlink);
-		p += strlen(p) + 1;
+void
+aes_set_wcs(struct aes *aes, const wchar_t *wcs)
+{
+	if (aes->aes_mbs_alloc) {
+		free(aes->aes_mbs_alloc);
+		aes->aes_mbs_alloc = NULL;
 	}
-
-	if (entry->ae_pathname) {
-		entry2->ae_pathname = p;
-		strcpy(p, entry->ae_pathname);
-		p += strlen(p) + 1;
+	if (aes->aes_wcs_alloc) {
+		free(aes->aes_wcs_alloc);
+		aes->aes_wcs_alloc = NULL;
 	}
+	aes->aes_mbs = NULL;
+	aes->aes_wcs = wcs;
+}
 
-	if (entry->ae_symlink) {
-		entry2->ae_symlink = p;
-		strcpy(p, entry->ae_symlink);
-		p += strlen(p) + 1;
+void
+aes_copy_wcs(struct aes *aes, const wchar_t *wcs)
+{
+	if (aes->aes_mbs_alloc) {
+		free(aes->aes_mbs_alloc);
+		aes->aes_mbs_alloc = NULL;
 	}
-
-	if (entry->ae_uname) {
-		entry2->ae_uname = p;
-		strcpy(p, entry->ae_uname);
-		p += strlen(p) + 1;
+	if (aes->aes_wcs_alloc) {
+		free(aes->aes_wcs_alloc);
+		aes->aes_wcs_alloc = NULL;
 	}
+	aes->aes_mbs = NULL;
+	aes->aes_wcs_alloc = malloc((wcslen(wcs) + 1) * sizeof(wchar_t));
+	wcscpy(aes->aes_wcs_alloc, wcs);
+	aes->aes_wcs = aes->aes_wcs_alloc;
+}
 
-	return (entry2);
+struct archive_entry *
+archive_entry_clear(struct archive_entry *entry)
+{
+	aes_clean(&entry->ae_acl);
+	aes_clean(&entry->ae_acl_default);
+	aes_clean(&entry->ae_fflags);
+	aes_clean(&entry->ae_gname);
+	aes_clean(&entry->ae_hardlink);
+	aes_clean(&entry->ae_pathname);
+	aes_clean(&entry->ae_symlink);
+	aes_clean(&entry->ae_uname);
+	memset(entry, 0, sizeof(*entry));
+	entry->ae_tartype = -1;
+	return entry;
 }
 
 struct archive_entry *
-archive_entry_dup(struct archive_entry *entry)
+archive_entry_clone(struct archive_entry *entry)
 {
 	struct archive_entry *entry2;
 
+	/* Allocate new structure and copy over all of the fields. */
 	entry2 = malloc(sizeof(*entry2));
-	*entry2 = *entry;
+	entry2->ae_stat = entry->ae_stat;
+	entry2->ae_tartype = entry->ae_tartype;
+
+	aes_copy(&entry2->ae_acl ,&entry->ae_acl);
+	aes_copy(&entry2->ae_acl_default ,&entry->ae_acl_default);
+	aes_copy(&entry2->ae_fflags ,&entry->ae_fflags);
+	aes_copy(&entry2->ae_gname ,&entry->ae_gname);
+	aes_copy(&entry2->ae_hardlink ,&entry->ae_hardlink);
+	aes_copy(&entry2->ae_pathname, &entry->ae_pathname);
+	aes_copy(&entry2->ae_symlink ,&entry->ae_symlink);
+	aes_copy(&entry2->ae_uname ,&entry->ae_uname);
+
 	return (entry2);
 }
 
 void
 archive_entry_free(struct archive_entry *entry)
 {
+	archive_entry_clear(entry);
 	free(entry);
 }
 
@@ -199,11 +273,11 @@
 	entry = malloc(sizeof(*entry));
 	if(entry == NULL)
 		return (NULL);
-	archive_entry_clear(entry);
+	memset(entry, 0, sizeof(*entry));
+	entry->ae_tartype = -1;
 	return (entry);
 }
 
-
 /*
  * Functions for reading fields from an archive_entry.
  */
@@ -211,14 +285,14 @@
 const char *
 archive_entry_acl(struct archive_entry *entry)
 {
-	return (entry->ae_acl);
+	return (aes_get_mbs(&entry->ae_acl));
 }
 
 
 const char *
 archive_entry_acl_default(struct archive_entry *entry)
 {
-	return (entry->ae_acl_default);
+	return (aes_get_mbs(&entry->ae_acl_default));
 }
 
 dev_t
@@ -237,19 +311,19 @@
 const char *
 archive_entry_fflags(struct archive_entry *entry)
 {
-	return (entry->ae_fflags);
+	return (aes_get_mbs(&entry->ae_fflags));
 }
 
 const char *
 archive_entry_gname(struct archive_entry *entry)
 {
-	return (entry->ae_gname);
+	return (aes_get_mbs(&entry->ae_gname));
 }
 
 const char *
 archive_entry_hardlink(struct archive_entry *entry)
 {
-	return (entry->ae_hardlink);
+	return (aes_get_mbs(&entry->ae_hardlink));
 }
 
 mode_t
@@ -261,7 +335,13 @@
 const char *
 archive_entry_pathname(struct archive_entry *entry)
 {
-	return (entry->ae_pathname);
+	return (aes_get_mbs(&entry->ae_pathname));
+}
+
+const wchar_t *
+archive_entry_pathname_w(struct archive_entry *entry)
+{
+	return (aes_get_wcs(&entry->ae_pathname));
 }
 
 int64_t
@@ -279,7 +359,7 @@
 const char *
 archive_entry_symlink(struct archive_entry *entry)
 {
-	return (entry->ae_symlink);
+	return (aes_get_mbs(&entry->ae_symlink));
 }
 
 int
@@ -291,7 +371,7 @@
 const char *
 archive_entry_uname(struct archive_entry *entry)
 {
-	return (entry->ae_uname);
+	return (aes_get_mbs(&entry->ae_uname));
 }
 
 /*
@@ -311,14 +391,25 @@
 void
 archive_entry_set_acl(struct archive_entry *entry, const char *acl)
 {
-	entry->ae_acl = acl;
+	aes_set_mbs(&entry->ae_acl, acl);
 }
 
+void
+archive_entry_copy_acl_w(struct archive_entry *entry, const wchar_t *acl)
+{
+	aes_copy_wcs(&entry->ae_acl, acl);
+}
 
 void
 archive_entry_set_acl_default(struct archive_entry *entry, const char *acl)
 {
-	entry->ae_acl_default = acl;
+	aes_set_mbs(&entry->ae_acl_default, acl);
+}
+
+void
+archive_entry_copy_acl_default_w(struct archive_entry *entry, const wchar_t *acl)
+{
+	aes_copy_wcs(&entry->ae_acl_default, acl);
 }
 
 void
@@ -342,7 +433,13 @@
 void
 archive_entry_set_fflags(struct archive_entry *entry, const char *flags)
 {
-	entry->ae_fflags = flags;
+	aes_set_mbs(&entry->ae_fflags, flags);
+}
+
+void
+archive_entry_copy_fflags_w(struct archive_entry *entry, const wchar_t *flags)
+{
+	aes_copy_wcs(&entry->ae_fflags, flags);
 }
 
 void
@@ -354,13 +451,25 @@
 void
 archive_entry_set_gname(struct archive_entry *entry, const char *name)
 {
-	entry->ae_gname = name;
+	aes_set_mbs(&entry->ae_gname, name);
+}
+
+void
+archive_entry_copy_gname_w(struct archive_entry *entry, const wchar_t *name)
+{
+	aes_copy_wcs(&entry->ae_gname, name);
 }
 
 void
 archive_entry_set_hardlink(struct archive_entry *entry, const char *target)
 {
-	entry->ae_hardlink = target;
+	aes_set_mbs(&entry->ae_hardlink, target);
+}
+
+void
+archive_entry_copy_hardlink_w(struct archive_entry *entry, const wchar_t *target)
+{
+	aes_copy_wcs(&entry->ae_hardlink, target);
 }
 
 void
@@ -372,7 +481,13 @@
 void
 archive_entry_set_pathname(struct archive_entry *entry, const char *name)
 {
-	entry->ae_pathname = name;
+	aes_set_mbs(&entry->ae_pathname, name);
+}
+
+void
+archive_entry_copy_pathname_w(struct archive_entry *entry, const wchar_t *name)
+{
+	aes_copy_wcs(&entry->ae_pathname, name);
 }
 
 void
@@ -382,9 +497,15 @@
 }
 
 void
-archive_entry_set_symlink(struct archive_entry *entry, const char *link)
+archive_entry_set_symlink(struct archive_entry *entry, const char *linkname)
+{
+	aes_set_mbs(&entry->ae_symlink, linkname);
+}
+
+void
+archive_entry_copy_symlink_w(struct archive_entry *entry, const wchar_t *linkname)
 {
-	entry->ae_symlink = link;
+	aes_copy_wcs(&entry->ae_symlink, linkname);
 }
 
 void
@@ -402,6 +523,26 @@
 void

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list