svn commit: r304885 - in projects/clang390-import: . bin/dd bin/ls/tests cddl/lib/libdtrace contrib/binutils/bfd contrib/libarchive/libarchive contrib/libarchive/tar contrib/ofed/libcxgb4/src contr...
Dimitry Andric
dim at FreeBSD.org
Sat Aug 27 09:40:32 UTC 2016
Author: dim
Date: Sat Aug 27 09:40:29 2016
New Revision: 304885
URL: https://svnweb.freebsd.org/changeset/base/304885
Log:
Merge ^/head r304700 through r304884.
Added:
projects/clang390-import/contrib/sqlite3/Makefile.msc
- copied unchanged from r304884, head/contrib/sqlite3/Makefile.msc
projects/clang390-import/contrib/sqlite3/Replace.cs
- copied unchanged from r304884, head/contrib/sqlite3/Replace.cs
projects/clang390-import/contrib/sqlite3/compile
- copied unchanged from r304884, head/contrib/sqlite3/compile
projects/clang390-import/contrib/sqlite3/sqlite3.rc
- copied unchanged from r304884, head/contrib/sqlite3/sqlite3.rc
projects/clang390-import/contrib/sqlite3/tea/
- copied from r304884, head/contrib/sqlite3/tea/
projects/clang390-import/lib/libifc/
- copied from r304884, head/lib/libifc/
projects/clang390-import/share/examples/libifc/
- copied from r304884, head/share/examples/libifc/
projects/clang390-import/sys/amd64/cloudabi32/
- copied from r304884, head/sys/amd64/cloudabi32/
projects/clang390-import/sys/arm/allwinner/aw_ts.c
- copied unchanged from r304884, head/sys/arm/allwinner/aw_ts.c
projects/clang390-import/sys/contrib/cloudabi/cloudabi_vdso_i686_on_64bit.S
- copied unchanged from r304884, head/sys/contrib/cloudabi/cloudabi_vdso_i686_on_64bit.S
projects/clang390-import/sys/dev/bhnd/cores/chipc/bhnd_pmu_chipc.c
- copied unchanged from r304884, head/sys/dev/bhnd/cores/chipc/bhnd_pmu_chipc.c
projects/clang390-import/sys/dev/bhnd/cores/chipc/pwrctl/
- copied from r304884, head/sys/dev/bhnd/cores/chipc/pwrctl/
projects/clang390-import/sys/dev/bhnd/cores/pmu/
- copied from r304884, head/sys/dev/bhnd/cores/pmu/
projects/clang390-import/sys/dev/bhnd/pmu/
- copied from r304884, head/sys/dev/bhnd/pmu/
projects/clang390-import/sys/dev/hyperv/netvsc/ndis.h
- copied unchanged from r304884, head/sys/dev/hyperv/netvsc/ndis.h
projects/clang390-import/sys/dev/hyperv/utilities/vmbus_icreg.h
- copied unchanged from r304884, head/sys/dev/hyperv/utilities/vmbus_icreg.h
projects/clang390-import/sys/mips/broadcom/bcm_bcma.c
- copied unchanged from r304884, head/sys/mips/broadcom/bcm_bcma.c
projects/clang390-import/sys/mips/broadcom/bcm_machdep.h
- copied unchanged from r304884, head/sys/mips/broadcom/bcm_machdep.h
projects/clang390-import/sys/mips/broadcom/bcm_mips_exts.h
- copied unchanged from r304884, head/sys/mips/broadcom/bcm_mips_exts.h
projects/clang390-import/sys/mips/broadcom/bcm_pmu.c
- copied unchanged from r304884, head/sys/mips/broadcom/bcm_pmu.c
projects/clang390-import/sys/mips/broadcom/bcm_siba.c
- copied unchanged from r304884, head/sys/mips/broadcom/bcm_siba.c
projects/clang390-import/sys/modules/cloudabi32/
- copied from r304884, head/sys/modules/cloudabi32/
Deleted:
projects/clang390-import/sys/contrib/cloudabi/cloudabi_types.h
projects/clang390-import/sys/mips/broadcom/bcm_socinfo.c
projects/clang390-import/sys/mips/broadcom/bcm_socinfo.h
projects/clang390-import/sys/modules/bhnd/cores/bhnd_chipc/
Modified:
projects/clang390-import/UPDATING
projects/clang390-import/bin/dd/dd.1
projects/clang390-import/bin/ls/tests/ls_tests.sh
projects/clang390-import/cddl/lib/libdtrace/psinfo.d
projects/clang390-import/contrib/binutils/bfd/config.bfd
projects/clang390-import/contrib/libarchive/libarchive/archive_acl.c
projects/clang390-import/contrib/libarchive/libarchive/archive_entry.h
projects/clang390-import/contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c
projects/clang390-import/contrib/libarchive/libarchive/archive_read_support_format_tar.c
projects/clang390-import/contrib/libarchive/libarchive/archive_read_support_format_zip.c
projects/clang390-import/contrib/libarchive/libarchive/archive_write_disk_acl.c
projects/clang390-import/contrib/libarchive/libarchive/archive_write_disk_posix.c
projects/clang390-import/contrib/libarchive/libarchive/archive_write_set_format_pax.c
projects/clang390-import/contrib/libarchive/tar/util.c
projects/clang390-import/contrib/ofed/libcxgb4/src/qp.c
projects/clang390-import/contrib/sqlite3/Makefile.am
projects/clang390-import/contrib/sqlite3/Makefile.in
projects/clang390-import/contrib/sqlite3/configure
projects/clang390-import/contrib/sqlite3/configure.ac
projects/clang390-import/contrib/sqlite3/shell.c
projects/clang390-import/contrib/sqlite3/sqlite3.c
projects/clang390-import/contrib/sqlite3/sqlite3.h
projects/clang390-import/contrib/sqlite3/sqlite3ext.h
projects/clang390-import/etc/newsyslog.conf
projects/clang390-import/etc/ntp/leap-seconds (contents, props changed)
projects/clang390-import/etc/rc.d/ntpd
projects/clang390-import/include/libgen.h
projects/clang390-import/include/xlocale/_locale.h
projects/clang390-import/lib/Makefile
projects/clang390-import/lib/libarchive/tests/Makefile
projects/clang390-import/lib/libc/gen/__getosreldate.c
projects/clang390-import/lib/libc/gen/dirname.c
projects/clang390-import/lib/libc/nls/msgcat.c
projects/clang390-import/lib/libc/stdio/fgetln.c
projects/clang390-import/lib/libc/stdio/fgetwln.c
projects/clang390-import/lib/libc/stdio/fputwc.c
projects/clang390-import/lib/libc/stdio/getdelim.c
projects/clang390-import/lib/libc/stdio/vfprintf.c
projects/clang390-import/lib/libc/stdio/vfwprintf.c
projects/clang390-import/lib/libstand/dosfs.c
projects/clang390-import/libexec/rtld-elf/mips/reloc.c
projects/clang390-import/sbin/camcontrol/camcontrol.c
projects/clang390-import/sbin/ggate/ggatec/ggatec.8
projects/clang390-import/sbin/ggate/ggated/ggated.8
projects/clang390-import/share/man/man4/cloudabi.4
projects/clang390-import/share/mk/bsd.libnames.mk
projects/clang390-import/share/mk/bsd.sys.mk
projects/clang390-import/share/mk/src.libnames.mk
projects/clang390-import/share/mk/src.sys.env.mk
projects/clang390-import/sys/amd64/cloudabi64/cloudabi64_sysvec.c
projects/clang390-import/sys/amd64/conf/NOTES
projects/clang390-import/sys/amd64/vmm/io/iommu.c
projects/clang390-import/sys/amd64/vmm/io/iommu.h
projects/clang390-import/sys/amd64/vmm/vmm.c
projects/clang390-import/sys/arm/allwinner/aw_rtc.c
projects/clang390-import/sys/arm/allwinner/axp81x.c
projects/clang390-import/sys/arm/allwinner/clk/aw_gate.c
projects/clang390-import/sys/arm/allwinner/clk/aw_modclk.c
projects/clang390-import/sys/arm/allwinner/clk/aw_pll.c
projects/clang390-import/sys/arm/allwinner/files.allwinner
projects/clang390-import/sys/arm64/arm64/busdma_bounce.c
projects/clang390-import/sys/arm64/arm64/pmap.c
projects/clang390-import/sys/arm64/cloudabi64/cloudabi64_sysvec.c
projects/clang390-import/sys/arm64/conf/GENERIC
projects/clang390-import/sys/arm64/include/pmap.h
projects/clang390-import/sys/boot/efi/loader/devicename.c
projects/clang390-import/sys/boot/userboot/userboot/main.c
projects/clang390-import/sys/cam/ctl/ctl_frontend_iscsi.c
projects/clang390-import/sys/cam/ctl/ctl_frontend_iscsi.h
projects/clang390-import/sys/cam/ctl/ctl_ioctl.h
projects/clang390-import/sys/cddl/boot/zfs/zfssubr.c
projects/clang390-import/sys/compat/ia32/ia32_signal.h
projects/clang390-import/sys/conf/files
projects/clang390-import/sys/conf/files.amd64
projects/clang390-import/sys/conf/files.arm64
projects/clang390-import/sys/ddb/db_command.c
projects/clang390-import/sys/dev/bhnd/bcma/bcma.c
projects/clang390-import/sys/dev/bhnd/bcma/bcma_bhndb.c
projects/clang390-import/sys/dev/bhnd/bcma/bcma_dmp.h
projects/clang390-import/sys/dev/bhnd/bcma/bcma_erom.c
projects/clang390-import/sys/dev/bhnd/bcma/bcma_eromvar.h
projects/clang390-import/sys/dev/bhnd/bcma/bcma_nexus.c
projects/clang390-import/sys/dev/bhnd/bhnd.c
projects/clang390-import/sys/dev/bhnd/bhnd.h
projects/clang390-import/sys/dev/bhnd/bhnd_bus_if.m
projects/clang390-import/sys/dev/bhnd/bhnd_core.h
projects/clang390-import/sys/dev/bhnd/bhnd_ids.h
projects/clang390-import/sys/dev/bhnd/bhnd_subr.c
projects/clang390-import/sys/dev/bhnd/bhnd_types.h
projects/clang390-import/sys/dev/bhnd/bhndb/bhnd_bhndb.c
projects/clang390-import/sys/dev/bhnd/bhndb/bhndb.c
projects/clang390-import/sys/dev/bhnd/bhndb/bhndb_pci.c
projects/clang390-import/sys/dev/bhnd/bhndvar.h
projects/clang390-import/sys/dev/bhnd/cores/chipc/bhnd_chipc_if.m
projects/clang390-import/sys/dev/bhnd/cores/chipc/bhnd_sprom_chipc.c
projects/clang390-import/sys/dev/bhnd/cores/chipc/chipc.c
projects/clang390-import/sys/dev/bhnd/cores/chipc/chipc.h
projects/clang390-import/sys/dev/bhnd/cores/chipc/chipc_subr.c
projects/clang390-import/sys/dev/bhnd/cores/chipc/chipcreg.h
projects/clang390-import/sys/dev/bhnd/cores/chipc/chipcvar.h
projects/clang390-import/sys/dev/bhnd/nvram/nvram_map
projects/clang390-import/sys/dev/bhnd/siba/siba.c
projects/clang390-import/sys/dev/bhnd/siba/siba_bhndb.c
projects/clang390-import/sys/dev/bhnd/siba/siba_nexus.c
projects/clang390-import/sys/dev/cxgbe/adapter.h
projects/clang390-import/sys/dev/cxgbe/common/common.h
projects/clang390-import/sys/dev/cxgbe/common/t4_hw.c
projects/clang390-import/sys/dev/cxgbe/cxgbei/cxgbei.c
projects/clang390-import/sys/dev/cxgbe/cxgbei/cxgbei.h
projects/clang390-import/sys/dev/cxgbe/cxgbei/icl_cxgbei.c
projects/clang390-import/sys/dev/cxgbe/firmware/t4fw_interface.h
projects/clang390-import/sys/dev/cxgbe/iw_cxgbe/cm.c
projects/clang390-import/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h
projects/clang390-import/sys/dev/cxgbe/iw_cxgbe/qp.c
projects/clang390-import/sys/dev/cxgbe/iw_cxgbe/t4.h
projects/clang390-import/sys/dev/cxgbe/t4_main.c
projects/clang390-import/sys/dev/hyperv/include/vmbus.h
projects/clang390-import/sys/dev/hyperv/netvsc/hv_net_vsc.c
projects/clang390-import/sys/dev/hyperv/netvsc/hv_net_vsc.h
projects/clang390-import/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
projects/clang390-import/sys/dev/hyperv/netvsc/hv_rndis.h
projects/clang390-import/sys/dev/hyperv/netvsc/hv_rndis_filter.c
projects/clang390-import/sys/dev/hyperv/netvsc/if_hnvar.h
projects/clang390-import/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
projects/clang390-import/sys/dev/hyperv/storvsc/hv_vstorage.h
projects/clang390-import/sys/dev/hyperv/utilities/hv_heartbeat.c
projects/clang390-import/sys/dev/hyperv/utilities/hv_shutdown.c
projects/clang390-import/sys/dev/hyperv/utilities/hv_timesync.c
projects/clang390-import/sys/dev/hyperv/utilities/hv_util.c
projects/clang390-import/sys/dev/hyperv/utilities/hv_util.h
projects/clang390-import/sys/dev/hyperv/vmbus/vmbus_brvar.h
projects/clang390-import/sys/dev/hyperv/vmbus/vmbus_chan.c
projects/clang390-import/sys/dev/iscsi/icl.c
projects/clang390-import/sys/dev/iscsi/icl.h
projects/clang390-import/sys/dev/iscsi/icl_soft.c
projects/clang390-import/sys/dev/iscsi/iscsi.c
projects/clang390-import/sys/dev/iscsi/iscsi.h
projects/clang390-import/sys/dev/iscsi/iscsi_ioctl.h
projects/clang390-import/sys/dev/iser/icl_iser.c
projects/clang390-import/sys/dev/iwm/if_iwm.c
projects/clang390-import/sys/dev/syscons/syscons.c
projects/clang390-import/sys/dev/syscons/syscons.h
projects/clang390-import/sys/dev/usb/input/uep.c
projects/clang390-import/sys/dev/usb/input/ukbd.c
projects/clang390-import/sys/dev/usb/net/if_urndis.c
projects/clang390-import/sys/i386/cloudabi32/cloudabi32_sysvec.c
projects/clang390-import/sys/kern/kern_umtx.c
projects/clang390-import/sys/kern/subr_witness.c
projects/clang390-import/sys/mips/broadcom/bcm_machdep.c
projects/clang390-import/sys/mips/broadcom/files.broadcom
projects/clang390-import/sys/mips/broadcom/uart_bus_chipc.c
projects/clang390-import/sys/mips/broadcom/uart_cpu_chipc.c
projects/clang390-import/sys/modules/Makefile
projects/clang390-import/sys/modules/bhnd/Makefile
projects/clang390-import/sys/modules/bhnd/cores/Makefile
projects/clang390-import/sys/net/rndis.h
projects/clang390-import/sys/netinet/cc/cc.h
projects/clang390-import/sys/netinet/cc/cc_newreno.c
projects/clang390-import/sys/netinet/sctp_input.c
projects/clang390-import/sys/netinet/sctputil.c
projects/clang390-import/sys/netinet/tcp_fsm.h
projects/clang390-import/sys/netinet/tcp_input.c
projects/clang390-import/sys/netinet/tcp_lro.c
projects/clang390-import/sys/netinet/tcp_stacks/fastpath.c
projects/clang390-import/sys/netinet/tcp_var.h
projects/clang390-import/sys/netinet6/ip6_output.c
projects/clang390-import/sys/netinet6/udp6_usrreq.c
projects/clang390-import/sys/ofed/drivers/infiniband/core/iwcm.c
projects/clang390-import/sys/powerpc/booke/booke_machdep.c
projects/clang390-import/sys/powerpc/booke/pmap.c
projects/clang390-import/sys/powerpc/include/pmap.h
projects/clang390-import/sys/powerpc/powerpc/machdep.c
projects/clang390-import/sys/powerpc/pseries/platform_chrp.c
projects/clang390-import/sys/sys/mbuf.h
projects/clang390-import/sys/sys/param.h
projects/clang390-import/tests/sys/kqueue/kqueue_test.sh
projects/clang390-import/tests/sys/kqueue/vnode.c
projects/clang390-import/tools/tools/nanobsd/defaults.sh
projects/clang390-import/usr.bin/bsdiff/bspatch/bspatch.c
projects/clang390-import/usr.bin/getconf/pathconf.gperf
projects/clang390-import/usr.bin/gzip/gzip.c
projects/clang390-import/usr.bin/iscsictl/iscsictl.c
projects/clang390-import/usr.sbin/cdcontrol/cdcontrol.1
projects/clang390-import/usr.sbin/cdcontrol/cdcontrol.c
projects/clang390-import/usr.sbin/ctladm/ctladm.c
projects/clang390-import/usr.sbin/ctld/ctld.c
projects/clang390-import/usr.sbin/ctld/ctld.h
projects/clang390-import/usr.sbin/ctld/kernel.c
projects/clang390-import/usr.sbin/ctld/login.c
projects/clang390-import/usr.sbin/ctld/pdu.c
projects/clang390-import/usr.sbin/iscsid/iscsid.c
projects/clang390-import/usr.sbin/iscsid/iscsid.h
projects/clang390-import/usr.sbin/iscsid/login.c
projects/clang390-import/usr.sbin/ntp/doc/sntp.8
projects/clang390-import/usr.sbin/pc-sysinstall/backend/functions-mountoptical.sh
Directory Properties:
projects/clang390-import/ (props changed)
projects/clang390-import/cddl/ (props changed)
projects/clang390-import/contrib/binutils/ (props changed)
projects/clang390-import/contrib/libarchive/ (props changed)
projects/clang390-import/contrib/libarchive/libarchive/ (props changed)
projects/clang390-import/contrib/libarchive/tar/ (props changed)
projects/clang390-import/contrib/sqlite3/ (props changed)
Modified: projects/clang390-import/UPDATING
==============================================================================
--- projects/clang390-import/UPDATING Sat Aug 27 09:29:39 2016 (r304884)
+++ projects/clang390-import/UPDATING Sat Aug 27 09:40:29 2016 (r304885)
@@ -31,6 +31,12 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 12
disable the most expensive debugging functionality run
"ln -s 'abort:false,junk:false' /etc/malloc.conf".)
+20160824:
+ r304787 changed some ioctl interfaces between the iSCSI userspace
+ programs and the kernel. ctladm, ctld, iscsictl, and iscsid must be
+ rebuilt to work with new kernels. __FreeBSD_version has been bumped
+ to 1200005.
+
20160818:
The UDP receive code has been updated to only treat incoming UDP
packets that were addressed to an L2 broadcast address as L3
Modified: projects/clang390-import/bin/dd/dd.1
==============================================================================
--- projects/clang390-import/bin/dd/dd.1 Sat Aug 27 09:29:39 2016 (r304884)
+++ projects/clang390-import/bin/dd/dd.1 Sat Aug 27 09:40:29 2016 (r304885)
@@ -32,7 +32,7 @@
.\" @(#)dd.1 8.2 (Berkeley) 1/13/94
.\" $FreeBSD$
.\"
-.Dd February 28, 2016
+.Dd August 25, 2016
.Dt DD 1
.Os
.Sh NAME
@@ -414,7 +414,7 @@ Check for (even) parity errors on a file
To create an image of a Mode-1 CD-ROM, which is a commonly used format
for data CD-ROM disks, use a block size of 2048 bytes:
.Pp
-.Dl "dd if=/dev/acd0 of=filename.iso bs=2048"
+.Dl "dd if=/dev/cd0 of=filename.iso bs=2048"
.Pp
Write a filesystem image to a memory stick, padding the end with zeros,
if necessary, to a 1MiB boundary:
Modified: projects/clang390-import/bin/ls/tests/ls_tests.sh
==============================================================================
--- projects/clang390-import/bin/ls/tests/ls_tests.sh Sat Aug 27 09:29:39 2016 (r304884)
+++ projects/clang390-import/bin/ls/tests/ls_tests.sh Sat Aug 27 09:40:29 2016 (r304885)
@@ -84,6 +84,14 @@ create_test_inputs2()
{
create_test_dir
+ if ! getconf MIN_HOLE_SIZE "$(pwd)"; then
+ echo "getconf MIN_HOLE_SIZE $(pwd) failed; sparse files probably" \
+ "not supported by file system"
+ mount
+ atf_skip "Test's work directory does not support sparse files;" \
+ "try with a different TMPDIR?"
+ fi
+
for filesize in 1 512 $(( 2 * $KB )) $(( 10 * $KB )) $(( 512 * $KB )); \
do
atf_check -e ignore -o empty -s exit:0 \
Modified: projects/clang390-import/cddl/lib/libdtrace/psinfo.d
==============================================================================
--- projects/clang390-import/cddl/lib/libdtrace/psinfo.d Sat Aug 27 09:29:39 2016 (r304884)
+++ projects/clang390-import/cddl/lib/libdtrace/psinfo.d Sat Aug 27 09:40:29 2016 (r304885)
@@ -59,7 +59,7 @@ translator psinfo_t < struct proc *T > {
pr_gid = T->p_ucred->cr_rgid;
pr_egid = T->p_ucred->cr_groups[0];
pr_addr = 0;
- pr_psargs = (T->p_args->ar_args == 0) ? "" :
+ pr_psargs = (T->p_args == 0) ? "" :
memstr(T->p_args->ar_args, ' ', T->p_args->ar_length);
pr_arglen = T->p_args->ar_length;
pr_jailid = T->p_ucred->cr_prison->pr_id;
Modified: projects/clang390-import/contrib/binutils/bfd/config.bfd
==============================================================================
--- projects/clang390-import/contrib/binutils/bfd/config.bfd Sat Aug 27 09:29:39 2016 (r304884)
+++ projects/clang390-import/contrib/binutils/bfd/config.bfd Sat Aug 27 09:40:29 2016 (r304885)
@@ -875,11 +875,11 @@ case "${targ}" in
;;
mips*el-*-freebsd*)
targ_defvec=bfd_elf32_tradlittlemips_vec
- targ_selvecs="bfd_elf32_tradbigmips_vec bfd_elf32_ntradbigmisp_vec bfd_elf32_ntradlittlemips_vec bfd_elf64_tradbigmips_vec bfd_elf64_tradlittlemips_vec ecoff_big_vec ecoff_little_vec"
+ targ_selvecs="bfd_elf32_tradbigmips_vec bfd_elf32_ntradbigmips_vec bfd_elf32_ntradlittlemips_vec bfd_elf64_tradbigmips_vec bfd_elf64_tradlittlemips_vec ecoff_big_vec ecoff_little_vec"
;;
mips*-*-freebsd*)
targ_defvec=bfd_elf32_tradbigmips_vec
- targ_selvecs="bfd_elf32_tradlittlemips_vec bfd_elf32_ntradbigmisp_vec bfd_elf32_ntradlittlemips_vec bfd_elf64_tradbigmips_vec bfd_elf64_tradlittlemips_vec ecoff_big_vec ecoff_little_vec"
+ targ_selvecs="bfd_elf32_tradlittlemips_vec bfd_elf32_ntradbigmips_vec bfd_elf32_ntradlittlemips_vec bfd_elf64_tradbigmips_vec bfd_elf64_tradlittlemips_vec ecoff_big_vec ecoff_little_vec"
;;
mips*-dec-* | mips*el-*-ecoff*)
targ_defvec=ecoff_little_vec
Modified: projects/clang390-import/contrib/libarchive/libarchive/archive_acl.c
==============================================================================
--- projects/clang390-import/contrib/libarchive/libarchive/archive_acl.c Sat Aug 27 09:29:39 2016 (r304884)
+++ projects/clang390-import/contrib/libarchive/libarchive/archive_acl.c Sat Aug 27 09:40:29 2016 (r304885)
@@ -57,21 +57,27 @@ static int archive_acl_add_entry_len_l(s
size_t len, struct archive_string_conv *sc);
static int isint_w(const wchar_t *start, const wchar_t *end, int *result);
static int ismode_w(const wchar_t *start, const wchar_t *end, int *result);
+static int parse_nfs4_flags_w(const wchar_t *start, const wchar_t *end,
+ int *result);
+static int parse_nfs4_perms_w(const wchar_t *start, const wchar_t *end,
+ int *result);
static void next_field_w(const wchar_t **wp, const wchar_t **start,
const wchar_t **end, wchar_t *sep);
static int prefix_w(const wchar_t *start, const wchar_t *end,
const wchar_t *test);
-static void append_entry_w(wchar_t **wp, const wchar_t *prefix, int tag,
- const wchar_t *wname, int perm, int id);
+static void append_entry_w(wchar_t **wp, const wchar_t *prefix, int type,
+ int tag, const wchar_t *wname, int perm, int id);
static void append_id_w(wchar_t **wp, int id);
static int isint(const char *start, const char *end, int *result);
static int ismode(const char *start, const char *end, int *result);
+static int parse_nfs4_flags(const char *start, const char *end, int *result);
+static int parse_nfs4_perms(const char *start, const char *end, int *result);
static void next_field(const char **p, const char **start,
const char **end, char *sep);
static int prefix_c(const char *start, const char *end,
const char *test);
-static void append_entry(char **p, const char *prefix, int tag,
- const char *name, int perm, int id);
+static void append_entry(char **p, const char *prefix, int type,
+ int tag, const char *name, int perm, int id);
static void append_id(char **p, int id);
void
@@ -447,6 +453,16 @@ archive_acl_text_w(struct archive *a, st
int id, r;
wchar_t *wp;
+ if ((flags & ARCHIVE_ENTRY_ACL_TYPE_NFS4) &&
+ (flags & (ARCHIVE_ENTRY_ACL_TYPE_ACCESS | ARCHIVE_ENTRY_ACL_TYPE_DEFAULT))) {
+ /* cannot convert NFSv4 ACLs and POSIX1e ACLs at the same time */
+ return (NULL);
+ }
+ if ((flags & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) && (flags & ARCHIVE_ENTRY_ACL_TYPE_DEFAULT)) {
+ /* cannot have access and default at the same time */
+ return (NULL);
+ }
+
if (acl->acl_text_w != NULL) {
free (acl->acl_text_w);
acl->acl_text_w = NULL;
@@ -462,17 +478,57 @@ archive_acl_text_w(struct archive *a, st
if ((flags & ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT) &&
(ap->type & ARCHIVE_ENTRY_ACL_TYPE_DEFAULT))
length += 8; /* "default:" */
- length += 5; /* tag name */
+ switch (ap->tag) {
+ case ARCHIVE_ENTRY_ACL_USER_OBJ:
+ if ((flags & ARCHIVE_ENTRY_ACL_TYPE_NFS4) != 0) {
+ length += 6; /* "owner@" */
+ break;
+ }
+ /* FALLTHROUGH */
+ case ARCHIVE_ENTRY_ACL_USER:
+ length += 4; /* "user" */
+ break;
+ case ARCHIVE_ENTRY_ACL_GROUP_OBJ:
+ if ((flags & ARCHIVE_ENTRY_ACL_TYPE_NFS4) != 0) {
+ length += 6; /* "group@" */
+ break;
+ }
+ /* FALLTHROUGH */
+ case ARCHIVE_ENTRY_ACL_GROUP:
+ case ARCHIVE_ENTRY_ACL_OTHER:
+ length += 5; /* "group", "other" */
+ break;
+ case ARCHIVE_ENTRY_ACL_EVERYONE:
+ length += 9; /* "everyone@" */
+ break;
+ }
length += 1; /* colon */
- r = archive_mstring_get_wcs(a, &ap->name, &wname);
- if (r == 0 && wname != NULL)
- length += wcslen(wname);
- else if (r < 0 && errno == ENOMEM)
- return (NULL);
+ if (((flags & ARCHIVE_ENTRY_ACL_TYPE_NFS4) == 0) ||
+ ap->tag == ARCHIVE_ENTRY_ACL_USER ||
+ ap->tag == ARCHIVE_ENTRY_ACL_GROUP) {
+ r = archive_mstring_get_wcs(a, &ap->name, &wname);
+ if (r == 0 && wname != NULL)
+ length += wcslen(wname);
+ else if (r < 0 && errno == ENOMEM)
+ return (NULL);
+ else
+ length += sizeof(uid_t) * 3 + 1;
+ length += 1; /* colon */
+ }
+ if ((flags & ARCHIVE_ENTRY_ACL_TYPE_NFS4) != 0)
+ length += 14; /* rwxpdDaARWcCos */
else
- length += sizeof(uid_t) * 3 + 1;
- length ++; /* colon */
- length += 3; /* rwx */
+ length += 3; /* rwx */
+ length += 1; /* colon */
+ if ((flags & ARCHIVE_ENTRY_ACL_TYPE_NFS4) != 0) {
+ length += 7; /* fdinSFI */
+ length += 1; /* colon */
+ if ((ap->type & ARCHIVE_ENTRY_ACL_TYPE_DENY) != 0)
+ length += 4; /* deny */
+ else
+ length += 5; /* allow, alarm, audit */
+ length += 1; /* colon */
+ }
length += 1; /* colon */
length += max(sizeof(uid_t), sizeof(gid_t)) * 3 + 1;
length ++; /* newline */
@@ -480,34 +536,39 @@ archive_acl_text_w(struct archive *a, st
ap = ap->next;
}
- if (count > 0 && ((flags & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0)) {
+ if (count == 0)
+ return (NULL);
+
+ if ((flags & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0) {
length += 10; /* "user::rwx\n" */
length += 11; /* "group::rwx\n" */
length += 11; /* "other::rwx\n" */
}
- if (count == 0)
- return (NULL);
-
/* Now, allocate the string and actually populate it. */
wp = acl->acl_text_w = (wchar_t *)malloc(length * sizeof(wchar_t));
if (wp == NULL)
return (NULL);
count = 0;
+
if ((flags & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0) {
- append_entry_w(&wp, NULL, ARCHIVE_ENTRY_ACL_USER_OBJ, NULL,
- acl->mode & 0700, -1);
+ append_entry_w(&wp, NULL, ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
+ ARCHIVE_ENTRY_ACL_USER_OBJ, NULL, acl->mode & 0700, -1);
*wp++ = ',';
- append_entry_w(&wp, NULL, ARCHIVE_ENTRY_ACL_GROUP_OBJ, NULL,
- acl->mode & 0070, -1);
+ append_entry_w(&wp, NULL, ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
+ ARCHIVE_ENTRY_ACL_GROUP_OBJ, NULL, acl->mode & 0070, -1);
*wp++ = ',';
- append_entry_w(&wp, NULL, ARCHIVE_ENTRY_ACL_OTHER, NULL,
- acl->mode & 0007, -1);
+ append_entry_w(&wp, NULL, ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
+ ARCHIVE_ENTRY_ACL_OTHER, NULL, acl->mode & 0007, -1);
count += 3;
+ }
+ if ((flags & (ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
+ ARCHIVE_ENTRY_ACL_TYPE_NFS4)) != 0) {
ap = acl->acl_head;
while (ap != NULL) {
- if ((ap->type & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0) {
+ if ((ap->type & (ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
+ ARCHIVE_ENTRY_ACL_TYPE_NFS4)) != 0) {
r = archive_mstring_get_wcs(a, &ap->name, &wname);
if (r == 0) {
*wp++ = separator;
@@ -515,8 +576,8 @@ archive_acl_text_w(struct archive *a, st
id = ap->id;
else
id = -1;
- append_entry_w(&wp, NULL, ap->tag, wname,
- ap->permset, id);
+ append_entry_w(&wp, NULL, ap->type, ap->tag,
+ wname, ap->permset, id);
count++;
} else if (r < 0 && errno == ENOMEM)
return (NULL);
@@ -525,7 +586,6 @@ archive_acl_text_w(struct archive *a, st
}
}
-
if ((flags & ARCHIVE_ENTRY_ACL_TYPE_DEFAULT) != 0) {
if (flags & ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT)
prefix = L"default:";
@@ -543,8 +603,8 @@ archive_acl_text_w(struct archive *a, st
id = ap->id;
else
id = -1;
- append_entry_w(&wp, prefix, ap->tag,
- wname, ap->permset, id);
+ append_entry_w(&wp, prefix, ap->type,
+ ap->tag, wname, ap->permset, id);
count ++;
} else if (r < 0 && errno == ENOMEM)
return (NULL);
@@ -568,8 +628,8 @@ append_id_w(wchar_t **wp, int id)
}
static void
-append_entry_w(wchar_t **wp, const wchar_t *prefix, int tag,
- const wchar_t *wname, int perm, int id)
+append_entry_w(wchar_t **wp, const wchar_t *prefix, int type,
+ int tag, const wchar_t *wname, int perm, int id)
{
if (prefix != NULL) {
wcscpy(*wp, prefix);
@@ -579,6 +639,11 @@ append_entry_w(wchar_t **wp, const wchar
case ARCHIVE_ENTRY_ACL_USER_OBJ:
wname = NULL;
id = -1;
+ if (type & ARCHIVE_ENTRY_ACL_TYPE_NFS4) {
+ wcscpy(*wp, L"owner@");
+ break;
+ }
+ /* FALLTHROUGH */
/* FALLTHROUGH */
case ARCHIVE_ENTRY_ACL_USER:
wcscpy(*wp, L"user");
@@ -603,18 +668,57 @@ append_entry_w(wchar_t **wp, const wchar
}
*wp += wcslen(*wp);
*(*wp)++ = L':';
- if (wname != NULL) {
- wcscpy(*wp, wname);
+ if ((type & ARCHIVE_ENTRY_ACL_TYPE_NFS4) == 0 ||
+ tag == ARCHIVE_ENTRY_ACL_USER ||
+ tag == ARCHIVE_ENTRY_ACL_GROUP) {
+ if (wname != NULL) {
+ wcscpy(*wp, wname);
+ *wp += wcslen(*wp);
+ } else if (tag == ARCHIVE_ENTRY_ACL_USER
+ || tag == ARCHIVE_ENTRY_ACL_GROUP) {
+ append_id_w(wp, id);
+ id = -1;
+ }
+ *(*wp)++ = L':';
+ }
+ *(*wp)++ = (perm & (ARCHIVE_ENTRY_ACL_READ |
+ ARCHIVE_ENTRY_ACL_READ_DATA |
+ ARCHIVE_ENTRY_ACL_LIST_DIRECTORY)) ? L'r' : L'-';
+ *(*wp)++ = (perm & (ARCHIVE_ENTRY_ACL_WRITE |
+ ARCHIVE_ENTRY_ACL_WRITE_DATA |
+ ARCHIVE_ENTRY_ACL_ADD_FILE)) ? L'w' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_EXECUTE) ? L'x' : L'-';
+ if (type & ARCHIVE_ENTRY_ACL_TYPE_NFS4) {
+ *(*wp)++ = (perm & (ARCHIVE_ENTRY_ACL_APPEND_DATA | ARCHIVE_ENTRY_ACL_ADD_SUBDIRECTORY)) ? L'p' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_DELETE) ? L'd' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_DELETE_CHILD) ? L'D' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES) ? L'a' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES) ? L'A' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS) ? L'R' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS) ? L'W' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_READ_ACL) ? L'c' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_WRITE_ACL) ? L'C' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_WRITE_OWNER) ? L'o' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_SYNCHRONIZE) ? L's' : L'-';
+ *(*wp)++ = L':';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT) ? L'f' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT) ? L'd' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY) ? L'i' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT) ? L'n' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS) ? L'S' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS) ? L'F' : L'-';
+ *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_ENTRY_INHERITED) ? L'I' : L'-';
+ *(*wp)++ = L':';
+ if (type & ARCHIVE_ENTRY_ACL_TYPE_ALLOW)
+ wcscpy(*wp, L"allow");
+ else if (type & ARCHIVE_ENTRY_ACL_TYPE_DENY)
+ wcscpy(*wp, L"deny");
+ else if (type & ARCHIVE_ENTRY_ACL_TYPE_AUDIT)
+ wcscpy(*wp, L"audit");
+ else if (type & ARCHIVE_ENTRY_ACL_TYPE_ALARM)
+ wcscpy(*wp, L"alarm");
*wp += wcslen(*wp);
- } else if (tag == ARCHIVE_ENTRY_ACL_USER
- || tag == ARCHIVE_ENTRY_ACL_GROUP) {
- append_id_w(wp, id);
- id = -1;
}
- *(*wp)++ = L':';
- *(*wp)++ = (perm & 0444) ? L'r' : L'-';
- *(*wp)++ = (perm & 0222) ? L'w' : L'-';
- *(*wp)++ = (perm & 0111) ? L'x' : L'-';
if (id != -1) {
*(*wp)++ = L':';
append_id_w(wp, id);
@@ -637,6 +741,16 @@ archive_acl_text_l(struct archive_acl *a
int id, r;
char *p;
+ if ((flags & ARCHIVE_ENTRY_ACL_TYPE_NFS4) &&
+ (flags & (ARCHIVE_ENTRY_ACL_TYPE_ACCESS | ARCHIVE_ENTRY_ACL_TYPE_DEFAULT))) {
+ /* cannot convert NFSv4 ACLs and POSIX1e ACLs at the same time */
+ return (-1);
+ }
+ if ((flags & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) && (flags & ARCHIVE_ENTRY_ACL_TYPE_DEFAULT)) {
+ /* cannot have access and default at the same time */
+ return (-1);
+ }
+
if (acl->acl_text != NULL) {
free (acl->acl_text);
acl->acl_text = NULL;
@@ -655,63 +769,109 @@ archive_acl_text_l(struct archive_acl *a
if ((flags & ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT) &&
(ap->type & ARCHIVE_ENTRY_ACL_TYPE_DEFAULT))
length += 8; /* "default:" */
- length += 5; /* tag name */
+ switch (ap->tag) {
+ case ARCHIVE_ENTRY_ACL_USER_OBJ:
+ if ((flags & ARCHIVE_ENTRY_ACL_TYPE_NFS4) != 0) {
+ length += 6; /* "owner@" */
+ break;
+ }
+ /* FALLTHROUGH */
+ case ARCHIVE_ENTRY_ACL_USER:
+ length += 4; /* "user" */
+ break;
+ case ARCHIVE_ENTRY_ACL_GROUP_OBJ:
+ if ((flags & ARCHIVE_ENTRY_ACL_TYPE_NFS4) != 0) {
+ length += 6; /* "group@" */
+ break;
+ }
+ /* FALLTHROUGH */
+ case ARCHIVE_ENTRY_ACL_GROUP:
+ case ARCHIVE_ENTRY_ACL_OTHER:
+ length += 5; /* "group", "other" */
+ break;
+ case ARCHIVE_ENTRY_ACL_EVERYONE:
+ length += 9; /* "everyone@" */
+ break;
+ }
+
length += 1; /* colon */
- r = archive_mstring_get_mbs_l(
- &ap->name, &name, &len, sc);
- if (r != 0)
- return (-1);
- if (len > 0 && name != NULL)
- length += len;
+ if (((flags & ARCHIVE_ENTRY_ACL_TYPE_NFS4) == 0) ||
+ ap->tag == ARCHIVE_ENTRY_ACL_USER ||
+ ap->tag == ARCHIVE_ENTRY_ACL_GROUP) {
+ r = archive_mstring_get_mbs_l(
+ &ap->name, &name, &len, sc);
+ if (r != 0)
+ return (-1);
+ if (len > 0 && name != NULL)
+ length += len;
+ else
+ length += sizeof(uid_t) * 3 + 1;
+ length += 1; /* colon */
+ }
+ if ((flags & ARCHIVE_ENTRY_ACL_TYPE_NFS4) != 0)
+ length += 14; /* rwxpdDaARWcCos */
else
- length += sizeof(uid_t) * 3 + 1;
- length ++; /* colon */
- length += 3; /* rwx */
+ length += 3; /* rwx */
length += 1; /* colon */
+ if ((flags & ARCHIVE_ENTRY_ACL_TYPE_NFS4) != 0) {
+ length += 7; /* fdinSFI */
+ length += 1; /* colon */
+ if ((flags & ARCHIVE_ENTRY_ACL_TYPE_DENY) != 0)
+ length += 4; /* deny */
+ else
+ length += 5; /* allow, alarm, audit */
+ length += 1; /* colon */
+ }
+
length += max(sizeof(uid_t), sizeof(gid_t)) * 3 + 1;
length ++; /* newline */
}
ap = ap->next;
}
- if (count > 0 && ((flags & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0)) {
+ if (count == 0)
+ return (0);
+
+ if ((flags & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0) {
length += 10; /* "user::rwx\n" */
length += 11; /* "group::rwx\n" */
length += 11; /* "other::rwx\n" */
}
- if (count == 0)
- return (0);
-
/* Now, allocate the string and actually populate it. */
p = acl->acl_text = (char *)malloc(length);
if (p == NULL)
return (-1);
count = 0;
if ((flags & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0) {
- append_entry(&p, NULL, ARCHIVE_ENTRY_ACL_USER_OBJ, NULL,
- acl->mode & 0700, -1);
+ append_entry(&p, NULL, ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
+ ARCHIVE_ENTRY_ACL_USER_OBJ, NULL, acl->mode & 0700, -1);
*p++ = ',';
- append_entry(&p, NULL, ARCHIVE_ENTRY_ACL_GROUP_OBJ, NULL,
- acl->mode & 0070, -1);
+ append_entry(&p, NULL, ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
+ ARCHIVE_ENTRY_ACL_GROUP_OBJ, NULL, acl->mode & 0070, -1);
*p++ = ',';
- append_entry(&p, NULL, ARCHIVE_ENTRY_ACL_OTHER, NULL,
- acl->mode & 0007, -1);
+ append_entry(&p, NULL, ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
+ ARCHIVE_ENTRY_ACL_OTHER, NULL, acl->mode & 0007, -1);
count += 3;
+ }
+ if ((flags & (ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
+ ARCHIVE_ENTRY_ACL_TYPE_NFS4)) != 0) {
for (ap = acl->acl_head; ap != NULL; ap = ap->next) {
- if ((ap->type & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) == 0)
+ if ((ap->type & (ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
+ ARCHIVE_ENTRY_ACL_TYPE_NFS4)) == 0)
continue;
r = archive_mstring_get_mbs_l(
&ap->name, &name, &len, sc);
if (r != 0)
return (-1);
- *p++ = separator;
+ if (count > 0)
+ *p++ = separator;
if (flags & ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID)
id = ap->id;
else
id = -1;
- append_entry(&p, NULL, ap->tag, name,
+ append_entry(&p, NULL, ap->type, ap->tag, name,
ap->permset, id);
count++;
}
@@ -737,7 +897,7 @@ archive_acl_text_l(struct archive_acl *a
id = ap->id;
else
id = -1;
- append_entry(&p, prefix, ap->tag,
+ append_entry(&p, prefix, ap->type, ap->tag,
name, ap->permset, id);
count ++;
}
@@ -760,8 +920,8 @@ append_id(char **p, int id)
}
static void
-append_entry(char **p, const char *prefix, int tag,
- const char *name, int perm, int id)
+append_entry(char **p, const char *prefix, int type,
+ int tag, const char *name, int perm, int id)
{
if (prefix != NULL) {
strcpy(*p, prefix);
@@ -771,6 +931,10 @@ append_entry(char **p, const char *prefi
case ARCHIVE_ENTRY_ACL_USER_OBJ:
name = NULL;
id = -1;
+ if (type & ARCHIVE_ENTRY_ACL_TYPE_NFS4) {
+ strcpy(*p, "owner@");
+ break;
+ }
/* FALLTHROUGH */
case ARCHIVE_ENTRY_ACL_USER:
strcpy(*p, "user");
@@ -778,6 +942,10 @@ append_entry(char **p, const char *prefi
case ARCHIVE_ENTRY_ACL_GROUP_OBJ:
name = NULL;
id = -1;
+ if (type & ARCHIVE_ENTRY_ACL_TYPE_NFS4) {
+ strcpy(*p, "group@");
+ break;
+ }
/* FALLTHROUGH */
case ARCHIVE_ENTRY_ACL_GROUP:
strcpy(*p, "group");
@@ -792,21 +960,65 @@ append_entry(char **p, const char *prefi
name = NULL;
id = -1;
break;
+ case ARCHIVE_ENTRY_ACL_EVERYONE:
+ strcpy(*p, "everyone@");
+ name = NULL;
+ id = -1;
+ break;
}
*p += strlen(*p);
*(*p)++ = ':';
- if (name != NULL) {
- strcpy(*p, name);
+ if ((type & ARCHIVE_ENTRY_ACL_TYPE_NFS4) == 0 ||
+ tag == ARCHIVE_ENTRY_ACL_USER ||
+ tag == ARCHIVE_ENTRY_ACL_GROUP) {
+ if (name != NULL) {
+ strcpy(*p, name);
+ *p += strlen(*p);
+ } else if (tag == ARCHIVE_ENTRY_ACL_USER
+ || tag == ARCHIVE_ENTRY_ACL_GROUP) {
+ append_id(p, id);
+ id = -1;
+ }
+ *(*p)++ = ':';
+ }
+ *(*p)++ = (perm & (ARCHIVE_ENTRY_ACL_READ |
+ ARCHIVE_ENTRY_ACL_READ_DATA |
+ ARCHIVE_ENTRY_ACL_LIST_DIRECTORY)) ? 'r' : '-';
+ *(*p)++ = (perm & (ARCHIVE_ENTRY_ACL_WRITE |
+ ARCHIVE_ENTRY_ACL_WRITE_DATA |
+ ARCHIVE_ENTRY_ACL_ADD_FILE)) ? 'w' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_EXECUTE) ? 'x' : '-';
+ if (type & ARCHIVE_ENTRY_ACL_TYPE_NFS4) {
+ *(*p)++ = (perm & (ARCHIVE_ENTRY_ACL_APPEND_DATA | ARCHIVE_ENTRY_ACL_ADD_SUBDIRECTORY)) ? 'p' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_DELETE) ? 'd' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_DELETE_CHILD) ? 'D' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES) ? 'a' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES) ? 'A' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS) ? 'R' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS) ? 'W' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_READ_ACL) ? 'c' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_WRITE_ACL) ? 'C' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_WRITE_OWNER) ? 'o' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_SYNCHRONIZE) ? 's' : '-';
+ *(*p)++ = ':';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT) ? 'f' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT) ? 'd' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY) ? 'i' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT) ? 'n' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS) ? 'S' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS) ? 'F' : '-';
+ *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_ENTRY_INHERITED) ? 'I' : '-';
+ *(*p)++ = ':';
+ if (type & ARCHIVE_ENTRY_ACL_TYPE_ALLOW)
+ strcpy(*p, "allow");
+ else if (type & ARCHIVE_ENTRY_ACL_TYPE_DENY)
+ strcpy(*p, "deny");
+ else if (type & ARCHIVE_ENTRY_ACL_TYPE_AUDIT)
+ strcpy(*p, "audit");
+ else if (type & ARCHIVE_ENTRY_ACL_TYPE_ALARM)
+ strcpy(*p, "alarm");
*p += strlen(*p);
- } else if (tag == ARCHIVE_ENTRY_ACL_USER
- || tag == ARCHIVE_ENTRY_ACL_GROUP) {
- append_id(p, id);
- id = -1;
}
- *(*p)++ = ':';
- *(*p)++ = (perm & 0444) ? 'r' : '-';
- *(*p)++ = (perm & 0222) ? 'w' : '-';
- *(*p)++ = (perm & 0111) ? 'x' : '-';
if (id != -1) {
*(*p)++ = ':';
append_id(p, id);
@@ -827,12 +1039,19 @@ archive_acl_parse_w(struct archive_acl *
struct {
const wchar_t *start;
const wchar_t *end;
- } field[4], name;
+ } field[6], name;
- int fields, n;
+ int numfields, fields, n;
int type, tag, permset, id;
+ int offset;
wchar_t sep;
+ if (default_type == ARCHIVE_ENTRY_ACL_TYPE_NFS4)
+ numfields = 6;
+ else
+ numfields = 4;
+
+
while (text != NULL && *text != L'\0') {
/*
* Parse the fields out of the next entry,
@@ -842,7 +1061,7 @@ archive_acl_parse_w(struct archive_acl *
do {
const wchar_t *start, *end;
next_field_w(&text, &start, &end, &sep);
- if (fields < 4) {
+ if (fields < numfields) {
field[fields].start = start;
field[fields].end = end;
}
@@ -850,72 +1069,148 @@ archive_acl_parse_w(struct archive_acl *
} while (sep == L':');
/* Set remaining fields to blank. */
- for (n = fields; n < 4; ++n)
+ for (n = fields; n < numfields; ++n)
field[n].start = field[n].end = NULL;
- /* Check for a numeric ID in field 1 or 3. */
- id = -1;
- isint_w(field[1].start, field[1].end, &id);
- /* Field 3 is optional. */
- if (id == -1 && fields > 3)
- isint_w(field[3].start, field[3].end, &id);
+ if (default_type != ARCHIVE_ENTRY_ACL_TYPE_NFS4) {
+ /* POSIX.1e ACLs */
+ /* Check for a numeric ID in field 1 or 3. */
+ id = -1;
+ isint_w(field[1].start, field[1].end, &id);
+ /* Field 3 is optional. */
+ if (id == -1 && fields > 3)
+ isint_w(field[3].start, field[3].end, &id);
+
+ /*
+ * Solaris extension: "defaultuser::rwx" is the
+ * default ACL corresponding to "user::rwx", etc.
+ */
+ if (field[0].end - field[0].start > 7
+ && wmemcmp(field[0].start, L"default", 7) == 0) {
+ type = ARCHIVE_ENTRY_ACL_TYPE_DEFAULT;
+ field[0].start += 7;
+ } else
+ type = default_type;
- /*
- * Solaris extension: "defaultuser::rwx" is the
- * default ACL corresponding to "user::rwx", etc.
- */
- if (field[0].end - field[0].start > 7
- && wmemcmp(field[0].start, L"default", 7) == 0) {
- type = ARCHIVE_ENTRY_ACL_TYPE_DEFAULT;
- field[0].start += 7;
- } else
- type = default_type;
-
- name.start = name.end = NULL;
- if (prefix_w(field[0].start, field[0].end, L"user")) {
- if (!ismode_w(field[2].start, field[2].end, &permset))
+ name.start = name.end = NULL;
+ if (prefix_w(field[0].start, field[0].end, L"user")) {
+ if (!ismode_w(field[2].start, field[2].end,
+ &permset))
return (ARCHIVE_WARN);
- if (id != -1 || field[1].start < field[1].end) {
- tag = ARCHIVE_ENTRY_ACL_USER;
- name = field[1];
+ if (id != -1 || field[1].start < field[1].end) {
+ tag = ARCHIVE_ENTRY_ACL_USER;
+ name = field[1];
+ } else
+ tag = ARCHIVE_ENTRY_ACL_USER_OBJ;
+ } else if (prefix_w(field[0].start, field[0].end,
+ L"group")) {
+ if (!ismode_w(field[2].start, field[2].end,
+ &permset))
+ return (ARCHIVE_WARN);
+ if (id != -1 || field[1].start < field[1].end) {
+ tag = ARCHIVE_ENTRY_ACL_GROUP;
+ name = field[1];
+ } else
+ tag = ARCHIVE_ENTRY_ACL_GROUP_OBJ;
+ } else if (prefix_w(field[0].start, field[0].end,
+ L"other")) {
+ if (fields == 2
+ && field[1].start < field[1].end
+ && ismode_w(field[1].start, field[1].end,
+ &permset)) {
+ /* This is Solaris-style "other:rwx" */
+ } else if (fields == 3
+ && field[1].start == field[1].end
+ && field[2].start < field[2].end
+ && ismode_w(field[2].start, field[2].end,
+ &permset)) {
+ /* This is FreeBSD-style "other::rwx" */
+ } else
+ return (ARCHIVE_WARN);
+ tag = ARCHIVE_ENTRY_ACL_OTHER;
+ } else if (prefix_w(field[0].start, field[0].end,
+ L"mask")) {
+ if (fields == 2
+ && field[1].start < field[1].end
+ && ismode_w(field[1].start, field[1].end,
+ &permset)) {
+ /* This is Solaris-style "mask:rwx" */
+ } else if (fields == 3
+ && field[1].start == field[1].end
+ && field[2].start < field[2].end
+ && ismode_w(field[2].start, field[2].end,
+ &permset)) {
+ /* This is FreeBSD-style "mask::rwx" */
+ } else
+ return (ARCHIVE_WARN);
+ tag = ARCHIVE_ENTRY_ACL_MASK;
} else
- tag = ARCHIVE_ENTRY_ACL_USER_OBJ;
- } else if (prefix_w(field[0].start, field[0].end, L"group")) {
- if (!ismode_w(field[2].start, field[2].end, &permset))
return (ARCHIVE_WARN);
- if (id != -1 || field[1].start < field[1].end) {
+ } else {
+ /* NFSv4 ACLs */
+ if (wcsncmp(field[0].start, L"user",
+ field[0].end - field[0].start) == 0)
+ tag = ARCHIVE_ENTRY_ACL_USER;
+ else if (wcsncmp(field[0].start, L"group",
+ field[0].end - field[0].start) == 0)
tag = ARCHIVE_ENTRY_ACL_GROUP;
- name = field[1];
- } else
+ else if (wcsncmp(field[0].start, L"owner@",
+ field[0].end - field[0].start) == 0)
+ tag = ARCHIVE_ENTRY_ACL_USER_OBJ;
+ else if (wcsncmp(field[0].start, L"group@",
+ field[0].end - field[0].start) == 0)
tag = ARCHIVE_ENTRY_ACL_GROUP_OBJ;
- } else if (prefix_w(field[0].start, field[0].end, L"other")) {
- if (fields == 2
- && field[1].start < field[1].end
- && ismode_w(field[1].start, field[1].end, &permset)) {
- /* This is Solaris-style "other:rwx" */
- } else if (fields == 3
- && field[1].start == field[1].end
- && field[2].start < field[2].end
- && ismode_w(field[2].start, field[2].end, &permset)) {
- /* This is FreeBSD-style "other::rwx" */
- } else
+ else if (wcsncmp(field[0].start, L"everyone@",
+ field[0].end - field[0].start) == 0)
+ tag = ARCHIVE_ENTRY_ACL_EVERYONE;
+ else {
+ /* Unknown entry */
return (ARCHIVE_WARN);
- tag = ARCHIVE_ENTRY_ACL_OTHER;
- } else if (prefix_w(field[0].start, field[0].end, L"mask")) {
- if (fields == 2
- && field[1].start < field[1].end
- && ismode_w(field[1].start, field[1].end, &permset)) {
- /* This is Solaris-style "mask:rwx" */
- } else if (fields == 3
- && field[1].start == field[1].end
- && field[2].start < field[2].end
- && ismode_w(field[2].start, field[2].end, &permset)) {
- /* This is FreeBSD-style "mask::rwx" */
+ }
+
+ permset = 0;
+ name.start = name.end = NULL;
+
+ if (tag == ARCHIVE_ENTRY_ACL_USER ||
+ tag == ARCHIVE_ENTRY_ACL_GROUP) {
+ offset = 1;
+ name = field[1];
} else
+ offset = 0;
+
+ if (parse_nfs4_perms_w(field[1 + offset].start,
+ field[1 + offset].end, &permset) != 0) {
+ /* NFS4 perms are invalid */
+ return (ARCHIVE_WARN);
+ }
+ if (parse_nfs4_flags_w(field[2 + offset].start,
+ field[2 + offset].end, &permset) != 0) {
+ /* NFS4 flags are invalid */
+ return (ARCHIVE_WARN);
+ }
+ if (wcsncmp(field[3 + offset].start, L"allow",
+ field[3 + offset].end - field[3 + offset].start)
+ == 0)
+ type = ARCHIVE_ENTRY_ACL_TYPE_ALLOW;
+ else if (wcsncmp(field[3 + offset].start, L"deny",
+ field[3 + offset].end - field[3 + offset].start)
+ == 0)
+ type = ARCHIVE_ENTRY_ACL_TYPE_DENY;
+ else if (wcsncmp(field[3 + offset].start, L"audit",
+ field[3 + offset].end - field[3 + offset].start)
+ == 0)
+ type = ARCHIVE_ENTRY_ACL_TYPE_AUDIT;
+ else if (wcsncmp(field[3 + offset].start, L"alarm",
+ field[3 + offset].end - field[3 + offset].start)
+ == 0)
+ type = ARCHIVE_ENTRY_ACL_TYPE_ALARM;
+ else {
+ /* Unknown type */
return (ARCHIVE_WARN);
- tag = ARCHIVE_ENTRY_ACL_MASK;
- } else
- return (ARCHIVE_WARN);
+ }
+ isint_w(field[4 + offset].start, field[4 + offset].end,
+ &id);
+ }
/* Add entry to the internal list. */
archive_acl_add_entry_w_len(acl, type, permset,
@@ -985,6 +1280,78 @@ ismode_w(const wchar_t *start, const wch
return (1);
}
+/* Parse a wstring as a strict NFSv4 ACL permission field. */
+static int
+parse_nfs4_perms_w(const wchar_t *start, const wchar_t *end, int *permset)
+{
+ const wchar_t *p;
+ int pos;
+ const wchar_t *letter = L"rwxpdDaARWcCos";
+ const int perms[14] = {
+ ARCHIVE_ENTRY_ACL_READ_DATA,
+ ARCHIVE_ENTRY_ACL_WRITE_DATA,
+ ARCHIVE_ENTRY_ACL_EXECUTE,
+ ARCHIVE_ENTRY_ACL_APPEND_DATA,
+ ARCHIVE_ENTRY_ACL_DELETE,
+ ARCHIVE_ENTRY_ACL_DELETE_CHILD,
+ ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES,
+ ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES,
+ ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS,
+ ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS,
+ ARCHIVE_ENTRY_ACL_READ_ACL,
+ ARCHIVE_ENTRY_ACL_WRITE_ACL,
+ ARCHIVE_ENTRY_ACL_WRITE_OWNER,
+ ARCHIVE_ENTRY_ACL_SYNCHRONIZE
+ };
+
+ if (start >= end)
+ return (0);
+ p = start;
+ pos = 0;
+ while (p < end && pos < 14) {
+ if (*p == letter[pos])
+ *permset |= perms[pos];
+ else if (*p != '-')
+ return (-1);
+ p = p + sizeof(wchar_t);
+ pos++;
+ }
+ return (0);
+}
+
+/* Parse a string as a strict NFSv4 ACL flags field. */
+static int
+parse_nfs4_flags_w(const wchar_t *start, const wchar_t *end, int *permset)
+{
+ const wchar_t *p;
+ int pos;
+ const wchar_t *letter = L"fdinSFI";
+ const int perms[7] = {
+ ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT,
+ ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT,
+ ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY,
+ ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT,
+ ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS,
+ ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS,
+ ARCHIVE_ENTRY_ACL_ENTRY_INHERITED
+ };
+
+ if (start >= end)
+ return (0);
+ p = start;
+ pos = 0;
+ while (p < end && pos < 7) {
+ if (*p == letter[pos])
+ *permset |= perms[pos];
+ else if (*p != '-')
+ return (-1);
+ p = p + sizeof(wchar_t);
+ pos++;
+ }
+ return (0);
+}
+
+
/*
* Match "[:whitespace:]*(.*)[:whitespace:]*[:,\n]". *wp is updated
* to point to just after the separator. *start points to the first
@@ -1057,12 +1424,18 @@ archive_acl_parse_l(struct archive_acl *
struct {
const char *start;
const char *end;
- } field[4], name;
+ } field[6], name;
- int fields, n, r, ret = ARCHIVE_OK;
+ int numfields, fields, n, r, ret = ARCHIVE_OK;
int type, tag, permset, id;
+ int offset;
char sep;
+ if (default_type == ARCHIVE_ENTRY_ACL_TYPE_NFS4)
+ numfields = 6;
+ else
+ numfields = 4;
+
while (text != NULL && *text != '\0') {
/*
* Parse the fields out of the next entry,
@@ -1072,7 +1445,7 @@ archive_acl_parse_l(struct archive_acl *
do {
const char *start, *end;
next_field(&text, &start, &end, &sep);
- if (fields < 4) {
+ if (fields < numfields) {
field[fields].start = start;
field[fields].end = end;
}
@@ -1080,72 +1453,148 @@ archive_acl_parse_l(struct archive_acl *
} while (sep == ':');
/* Set remaining fields to blank. */
- for (n = fields; n < 4; ++n)
+ for (n = fields; n < numfields; ++n)
field[n].start = field[n].end = NULL;
- /* Check for a numeric ID in field 1 or 3. */
- id = -1;
- isint(field[1].start, field[1].end, &id);
- /* Field 3 is optional. */
- if (id == -1 && fields > 3)
- isint(field[3].start, field[3].end, &id);
+ if (default_type != ARCHIVE_ENTRY_ACL_TYPE_NFS4) {
+ /* POSIX.1e ACLs */
+ /* Check for a numeric ID in field 1 or 3. */
+ id = -1;
+ isint(field[1].start, field[1].end, &id);
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-projects
mailing list