Date: Sat, 27 Aug 2016 09:40:30 +0000 (UTC) From: Dimitry Andric <dim@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: 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... Message-ID: <201608270940.u7R9eULY075209@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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 ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201608270940.u7R9eULY075209>