Author: mm
Date: Wed Jun 12 13:34:12 2019
New Revision: 348993
URL: https://svnweb.freebsd.org/changeset/base/348993

Log:
  MFV r348971,r348977:
  Sync libarchive with vendor.
  
  Relevant vendor changes:
    - check_symlinks_fsobj() without chdir() and fchdir()
    - bsdtar.1 manpage fixes
    - patches from OpenBSD to libarchive_fe/passphrase.c
    - version bumped to 3.4.0
  
  MFC after:    2 weeks

Modified:
  head/contrib/libarchive/NEWS
  head/contrib/libarchive/README.md
  head/contrib/libarchive/libarchive/archive.h
  head/contrib/libarchive/libarchive/archive_entry.h
  head/contrib/libarchive/libarchive/archive_write_add_filter_b64encode.c
  head/contrib/libarchive/libarchive/archive_write_disk_posix.c
  head/contrib/libarchive/libarchive_fe/line_reader.c
  head/contrib/libarchive/libarchive_fe/passphrase.c
  head/contrib/libarchive/tar/bsdtar.1
  head/lib/libarchive/config_freebsd.h
  head/usr.bin/bsdcat/Makefile
  head/usr.bin/cpio/Makefile
  head/usr.bin/tar/Makefile
Directory Properties:
  head/contrib/libarchive/   (props changed)

Modified: head/contrib/libarchive/NEWS
==============================================================================
--- head/contrib/libarchive/NEWS        Wed Jun 12 12:19:34 2019        
(r348992)
+++ head/contrib/libarchive/NEWS        Wed Jun 12 13:34:12 2019        
(r348993)
@@ -1,3 +1,7 @@
+Jun 11, 2019: libarchive 3.4.0 released
+
+May 18, 2019: Fixes for reading Android APK and JAR archives
+
 Apr 16, 2019: Support for non-recursive list and extract
 
 Apr 14, 2019: New tar option: --exclude-vcs
@@ -6,7 +10,7 @@ Mar 27, 2019: Support for file and directory symlinks 
 
 Mar 12, 2019: Important fixes for storing file attributes and flags
 
-Jan 20, 2019: Support for xz, lzma, ppmd8 and bzip2 compression in zip archives
+Jan 20, 2019: Support for xz, lzma, ppmd8 and bzip2 decompression in ZIP files
 
 Oct 06, 2018: RAR 5.0 reader
 

Modified: head/contrib/libarchive/README.md
==============================================================================
--- head/contrib/libarchive/README.md   Wed Jun 12 12:19:34 2019        
(r348992)
+++ head/contrib/libarchive/README.md   Wed Jun 12 13:34:12 2019        
(r348993)
@@ -81,6 +81,7 @@ Currently, the library automatically detects and reads
   * Binary cpio (big-endian or little-endian)
   * ISO9660 CD-ROM images (with optional Rockridge or Joliet extensions)
   * ZIP archives (with uncompressed or "deflate" compressed entries, including 
support for encrypted Zip archives)
+  * ZIPX archives (with support for bzip2, ppmd8, lzma and xz compressed 
entries)
   * GNU and BSD 'ar' archives
   * 'mtree' format
   * 7-Zip archives

Modified: head/contrib/libarchive/libarchive/archive.h
==============================================================================
--- head/contrib/libarchive/libarchive/archive.h        Wed Jun 12 12:19:34 
2019        (r348992)
+++ head/contrib/libarchive/libarchive/archive.h        Wed Jun 12 13:34:12 
2019        (r348993)
@@ -36,7 +36,7 @@
  * assert that ARCHIVE_VERSION_NUMBER >= 2012108.
  */
 /* Note: Compiler will complain if this does not match archive_entry.h! */
-#define        ARCHIVE_VERSION_NUMBER 3003003
+#define        ARCHIVE_VERSION_NUMBER 3004000
 
 #include <sys/stat.h>
 #include <stddef.h>  /* for wchar_t */
@@ -155,7 +155,7 @@ __LA_DECL int               archive_version_number(void);
 /*
  * Textual name/version of the library, useful for version displays.
  */
-#define        ARCHIVE_VERSION_ONLY_STRING "3.3.3"
+#define        ARCHIVE_VERSION_ONLY_STRING "3.4.0"
 #define        ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING
 __LA_DECL const char * archive_version_string(void);
 

Modified: head/contrib/libarchive/libarchive/archive_entry.h
==============================================================================
--- head/contrib/libarchive/libarchive/archive_entry.h  Wed Jun 12 12:19:34 
2019        (r348992)
+++ head/contrib/libarchive/libarchive/archive_entry.h  Wed Jun 12 13:34:12 
2019        (r348993)
@@ -30,7 +30,7 @@
 #define        ARCHIVE_ENTRY_H_INCLUDED
 
 /* Note: Compiler will complain if this does not match archive.h! */
-#define        ARCHIVE_VERSION_NUMBER 3003003
+#define        ARCHIVE_VERSION_NUMBER 3004000
 
 /*
  * Note: archive_entry.h is for use outside of libarchive; the

Modified: 
head/contrib/libarchive/libarchive/archive_write_add_filter_b64encode.c
==============================================================================
--- head/contrib/libarchive/libarchive/archive_write_add_filter_b64encode.c     
Wed Jun 12 12:19:34 2019        (r348992)
+++ head/contrib/libarchive/libarchive/archive_write_add_filter_b64encode.c     
Wed Jun 12 13:34:12 2019        (r348993)
@@ -60,7 +60,7 @@ static int archive_filter_b64encode_write(struct archi
     const void *, size_t);
 static int archive_filter_b64encode_close(struct archive_write_filter *);
 static int archive_filter_b64encode_free(struct archive_write_filter *);
-static void b64_encode(struct archive_string *, const unsigned char *, size_t);
+static void la_b64_encode(struct archive_string *, const unsigned char *, 
size_t);
 static int64_t atol8(const char *, size_t);
 
 static const char base64[] = {
@@ -180,7 +180,7 @@ archive_filter_b64encode_open(struct archive_write_fil
 }
 
 static void
-b64_encode(struct archive_string *as, const unsigned char *p, size_t len)
+la_b64_encode(struct archive_string *as, const unsigned char *p, size_t len)
 {
        int c;
 
@@ -234,12 +234,12 @@ archive_filter_b64encode_write(struct archive_write_fi
                }
                if (state->hold_len < LBYTES)
                        return (ret);
-               b64_encode(&state->encoded_buff, state->hold, LBYTES);
+               la_b64_encode(&state->encoded_buff, state->hold, LBYTES);
                state->hold_len = 0;
        }
 
        for (; length >= LBYTES; length -= LBYTES, p += LBYTES)
-               b64_encode(&state->encoded_buff, p, LBYTES);
+               la_b64_encode(&state->encoded_buff, p, LBYTES);
 
        /* Save remaining bytes. */
        if (length > 0) {
@@ -270,7 +270,7 @@ archive_filter_b64encode_close(struct archive_write_fi
 
        /* Flush remaining bytes. */
        if (state->hold_len != 0)
-               b64_encode(&state->encoded_buff, state->hold, state->hold_len);
+               la_b64_encode(&state->encoded_buff, state->hold, 
state->hold_len);
        archive_string_sprintf(&state->encoded_buff, "====\n");
        /* Write the last block */
        archive_write_set_bytes_in_last_block(f->archive, 1);

Modified: head/contrib/libarchive/libarchive/archive_write_disk_posix.c
==============================================================================
--- head/contrib/libarchive/libarchive/archive_write_disk_posix.c       Wed Jun 
12 12:19:34 2019        (r348992)
+++ head/contrib/libarchive/libarchive/archive_write_disk_posix.c       Wed Jun 
12 13:34:12 2019        (r348993)
@@ -165,6 +165,10 @@ __FBSDID("$FreeBSD$");
 #define O_NOFOLLOW 0
 #endif
 
+#ifndef AT_FDCWD
+#define AT_FDCWD -100
+#endif
+
 struct fixup_entry {
        struct fixup_entry      *next;
        struct archive_acl       acl;
@@ -348,6 +352,8 @@ struct archive_write_disk {
 
 #define HFS_BLOCKS(s)  ((s) >> 12)
 
+
+static int     la_opendirat(int, const char *);
 static void    fsobj_error(int *, struct archive_string *, int, const char *,
                    const char *);
 static int     check_symlinks_fsobj(char *, int *, struct archive_string *,
@@ -401,6 +407,37 @@ static ssize_t     _archive_write_disk_data_block(struct a
                    size_t, int64_t);
 
 static int
+la_opendirat(int fd, const char *path) {
+       const int flags = O_CLOEXEC
+#if defined(O_BINARY)
+           | O_BINARY
+#endif
+#if defined(O_DIRECTORY)
+           | O_DIRECTORY
+#endif
+#if defined(O_PATH)
+           | O_PATH
+#elif defined(O_SEARCH)
+           | O_SEARCH
+#elif defined(O_EXEC)
+           | O_EXEC
+#else
+           | O_RDONLY
+#endif
+           ;
+
+#if !defined(HAVE_OPENAT)
+       if (fd != AT_FDCWD) {
+               errno = ENOTSUP;
+               return (-1);
+       } else
+               return (open(fd, path, flags));
+#else
+       return (openat(fd, path, flags));
+#endif
+}
+
+static int
 lazy_stat(struct archive_write_disk *a)
 {
        if (a->pst != NULL) {
@@ -1909,7 +1946,7 @@ edit_deep_directories(struct archive_write_disk *a)
                return;
 
        /* Try to record our starting dir. */
-       a->restore_pwd = open(".", O_RDONLY | O_BINARY | O_CLOEXEC);
+       a->restore_pwd = la_opendirat(AT_FDCWD, ".");
        __archive_ensure_cloexec_flag(a->restore_pwd);
        if (a->restore_pwd < 0)
                return;
@@ -2342,7 +2379,7 @@ _archive_write_disk_close(struct archive *_a)
 {
        struct archive_write_disk *a = (struct archive_write_disk *)_a;
        struct fixup_entry *next, *p;
-       int ret;
+       int fd, ret;
 
        archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC,
            ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA,
@@ -2353,21 +2390,33 @@ _archive_write_disk_close(struct archive *_a)
        p = sort_dir_list(a->fixup_list);
 
        while (p != NULL) {
+               fd = -1;
                a->pst = NULL; /* Mark stat cache as out-of-date. */
+               if (p->fixup &
+                   (TODO_TIMES | TODO_MODE_BASE | TODO_ACLS | TODO_FFLAGS)) {
+                       fd = open(p->name,
+                           O_WRONLY | O_BINARY | O_NOFOLLOW | O_CLOEXEC);
+               }
                if (p->fixup & TODO_TIMES) {
-                       set_times(a, -1, p->mode, p->name,
+                       set_times(a, fd, p->mode, p->name,
                            p->atime, p->atime_nanos,
                            p->birthtime, p->birthtime_nanos,
                            p->mtime, p->mtime_nanos,
                            p->ctime, p->ctime_nanos);
                }
-               if (p->fixup & TODO_MODE_BASE)
+               if (p->fixup & TODO_MODE_BASE) {
+#ifdef HAVE_FCHMOD
+                       if (fd >= 0)
+                               fchmod(fd, p->mode);
+                       else
+#endif
                        chmod(p->name, p->mode);
+               }
                if (p->fixup & TODO_ACLS)
-                       archive_write_disk_set_acls(&a->archive, -1, p->name,
-                           &p->acl, p->mode);
+                       archive_write_disk_set_acls(&a->archive, fd,
+                           p->name, &p->acl, p->mode);
                if (p->fixup & TODO_FFLAGS)
-                       set_fflags_platform(a, -1, p->name,
+                       set_fflags_platform(a, fd, p->name,
                            p->mode, p->fflags_set, 0);
                if (p->fixup & TODO_MAC_METADATA)
                        set_mac_metadata(a, p->name, p->mac_metadata,
@@ -2376,6 +2425,8 @@ _archive_write_disk_close(struct archive *_a)
                archive_acl_clear(&p->acl);
                free(p->mac_metadata);
                free(p->name);
+               if (fd >= 0)
+                       close(fd);
                free(p);
                p = next;
        }
@@ -2540,8 +2591,6 @@ fsobj_error(int *a_eno, struct archive_string *a_estr,
  * scan the path and both can be optimized by comparing against other
  * recent paths.
  */
-/* TODO: Extend this to support symlinks on Windows Vista and later. */
-
 /*
  * Checks the given path to see if any elements along it are symlinks.  Returns
  * ARCHIVE_OK if there are none, otherwise puts an error in errmsg.
@@ -2550,7 +2599,8 @@ static int
 check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
     int flags)
 {
-#if !defined(HAVE_LSTAT)
+#if !defined(HAVE_LSTAT) && \
+    !(defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT))
        /* Platform doesn't have lstat, so we can't look for symlinks. */
        (void)path; /* UNUSED */
        (void)error_number; /* UNUSED */
@@ -2565,7 +2615,10 @@ check_symlinks_fsobj(char *path, int *a_eno, struct ar
        char c;
        int r;
        struct stat st;
-       int restore_pwd;
+       int chdir_fd;
+#if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)
+       int fd;
+#endif
 
        /* Nothing to do here if name is empty */
        if(path[0] == '\0')
@@ -2586,9 +2639,9 @@ check_symlinks_fsobj(char *path, int *a_eno, struct ar
         *  c holds what used to be in *tail
         *  last is 1 if this is the last tail
         */
-       restore_pwd = open(".", O_RDONLY | O_BINARY | O_CLOEXEC);
-       __archive_ensure_cloexec_flag(restore_pwd);
-       if (restore_pwd < 0) {
+       chdir_fd = la_opendirat(AT_FDCWD, ".");
+       __archive_ensure_cloexec_flag(chdir_fd);
+       if (chdir_fd < 0) {
                fsobj_error(a_eno, a_estr, errno,
                    "Could not open ", path);
                return (ARCHIVE_FATAL);
@@ -2621,7 +2674,11 @@ check_symlinks_fsobj(char *path, int *a_eno, struct ar
                c = tail[0];
                tail[0] = '\0';
                /* Check that we haven't hit a symlink. */
+#if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)
+               r = fstatat(chdir_fd, head, &st, AT_SYMLINK_NOFOLLOW);
+#else
                r = lstat(head, &st);
+#endif
                if (r != 0) {
                        tail[0] = c;
                        /* We've hit a dir that doesn't exist; stop now. */
@@ -2647,7 +2704,19 @@ check_symlinks_fsobj(char *path, int *a_eno, struct ar
                        }
                } else if (S_ISDIR(st.st_mode)) {
                        if (!last) {
-                               if (chdir(head) != 0) {
+#if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)
+                               fd = la_opendirat(chdir_fd, head);
+                               if (fd < 0)
+                                       r = -1;
+                               else {
+                                       r = 0;
+                                       close(chdir_fd);
+                                       chdir_fd = fd;
+                               }
+#else
+                               r = chdir(head);
+#endif
+                               if (r != 0) {
                                        tail[0] = c;
                                        fsobj_error(a_eno, a_estr, errno,
                                            "Could not chdir ", path);
@@ -2664,7 +2733,12 @@ check_symlinks_fsobj(char *path, int *a_eno, struct ar
                                 * so we can overwrite it with the
                                 * item being extracted.
                                 */
-                               if (unlink(head)) {
+#if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)
+                               r = unlinkat(chdir_fd, head, 0);
+#else
+                               r = unlink(head);
+#endif
+                               if (r != 0) {
                                        tail[0] = c;
                                        fsobj_error(a_eno, a_estr, errno,
                                            "Could not remove symlink ",
@@ -2694,7 +2768,12 @@ check_symlinks_fsobj(char *path, int *a_eno, struct ar
                                break;
                        } else if (flags & ARCHIVE_EXTRACT_UNLINK) {
                                /* User asked us to remove problems. */
-                               if (unlink(head) != 0) {
+#if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)
+                               r = unlinkat(chdir_fd, head, 0);
+#else
+                               r = unlink(head);
+#endif
+                               if (r != 0) {
                                        tail[0] = c;
                                        fsobj_error(a_eno, a_estr, 0,
                                            "Cannot remove intervening "
@@ -2712,7 +2791,11 @@ check_symlinks_fsobj(char *path, int *a_eno, struct ar
                                 * This is needed to extract hardlinks over
                                 * symlinks.
                                 */
+#if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)
+                               r = fstatat(chdir_fd, head, &st, 0);
+#else
                                r = la_stat(head, &st);
+#endif
                                if (r != 0) {
                                        tail[0] = c;
                                        if (errno == ENOENT) {
@@ -2725,7 +2808,19 @@ check_symlinks_fsobj(char *path, int *a_eno, struct ar
                                                break;
                                        }
                                } else if (S_ISDIR(st.st_mode)) {
-                                       if (chdir(head) != 0) {
+#if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)
+                                       fd = la_opendirat(chdir_fd, head);
+                                       if (fd < 0)
+                                               r = -1;
+                                       else {
+                                               r = 0;
+                                               close(chdir_fd);
+                                               chdir_fd = fd;
+                                       }
+#else
+                                       r = chdir(head);
+#endif
+                                       if (r != 0) {
                                                tail[0] = c;
                                                fsobj_error(a_eno, a_estr,
                                                    errno,
@@ -2761,16 +2856,21 @@ check_symlinks_fsobj(char *path, int *a_eno, struct ar
        }
        /* Catches loop exits via break */
        tail[0] = c;
-#ifdef HAVE_FCHDIR
+#if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)
+       /* If we operate with openat(), fstatat() and unlinkat() there was
+        * no chdir(), so just close the fd */
+       if (chdir_fd >= 0)
+               close(chdir_fd);
+#elif HAVE_FCHDIR
        /* If we changed directory above, restore it here. */
-       if (restore_pwd >= 0) {
-               r = fchdir(restore_pwd);
+       if (chdir_fd >= 0) {
+               r = fchdir(chdir_fd);
                if (r != 0) {
                        fsobj_error(a_eno, a_estr, errno,
                            "chdir() failure", "");
                }
-               close(restore_pwd);
-               restore_pwd = -1;
+               close(chdir_fd);
+               chdir_fd = -1;
                if (r != 0) {
                        res = (ARCHIVE_FATAL);
                }
@@ -3387,6 +3487,7 @@ static int
 set_mode(struct archive_write_disk *a, int mode)
 {
        int r = ARCHIVE_OK;
+       int r2;
        mode &= 07777; /* Strip off file type bits. */
 
        if (a->todo & TODO_SGID_CHECK) {
@@ -3480,21 +3581,19 @@ set_mode(struct archive_write_disk *a, int mode)
                 * post-extract fixup, which is handled elsewhere.
                 */
 #ifdef HAVE_FCHMOD
-               if (a->fd >= 0) {
-                       if (fchmod(a->fd, mode) != 0) {
-                               archive_set_error(&a->archive, errno,
-                                   "Can't set permissions to 0%o", (int)mode);
-                               r = ARCHIVE_WARN;
-                       }
-               } else
+               if (a->fd >= 0)
+                       r2 = fchmod(a->fd, mode);
+               else
 #endif
-                       /* If this platform lacks fchmod(), then
-                        * we'll just use chmod(). */
-                       if (chmod(a->name, mode) != 0) {
-                               archive_set_error(&a->archive, errno,
-                                   "Can't set permissions to 0%o", (int)mode);
-                               r = ARCHIVE_WARN;
-                       }
+               /* If this platform lacks fchmod(), then
+                * we'll just use chmod(). */
+               r2 = chmod(a->name, mode);
+
+               if (r2 != 0) {
+                       archive_set_error(&a->archive, errno,
+                           "Can't set permissions to 0%o", (int)mode);
+                       r = ARCHIVE_WARN;
+               }
        }
        return (r);
 }

Modified: head/contrib/libarchive/libarchive_fe/line_reader.c
==============================================================================
--- head/contrib/libarchive/libarchive_fe/line_reader.c Wed Jun 12 12:19:34 
2019        (r348992)
+++ head/contrib/libarchive/libarchive_fe/line_reader.c Wed Jun 12 13:34:12 
2019        (r348993)
@@ -49,11 +49,10 @@ __FBSDID("$FreeBSD$");
  */
 struct lafe_line_reader {
        FILE *f;
-       char *buff, *buff_end, *line_start, *line_end, *p;
+       char *buff, *buff_end, *line_start, *line_end;
        char *pathname;
        size_t buff_length;
        int nullSeparator; /* Lines separated by null, not CR/CRLF/etc. */
-       int ret;
 };
 
 struct lafe_line_reader *

Modified: head/contrib/libarchive/libarchive_fe/passphrase.c
==============================================================================
--- head/contrib/libarchive/libarchive_fe/passphrase.c  Wed Jun 12 12:19:34 
2019        (r348992)
+++ head/contrib/libarchive/libarchive_fe/passphrase.c  Wed Jun 12 13:34:12 
2019        (r348993)
@@ -23,9 +23,11 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-/*     $OpenBSD: readpassphrase.c,v 1.22 2010/01/13 10:20:54 dtucker Exp $     
*/
+/*     $OpenBSD: readpassphrase.c,v 1.27 2019/01/25 00:19:25 millert Exp $     
*/
+
 /*
- * Copyright (c) 2000-2002, 2007 Todd C. Miller <todd.mil...@courtesan.com>
+ * Copyright (c) 2000-2002, 2007, 2010
+ *     Todd C. Miller <mill...@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -199,6 +201,27 @@ restart:
        }
 
        /*
+        * Turn off echo if possible.
+        * If we are using a tty but are not the foreground pgrp this will
+        * generate SIGTTOU, so do it *before* installing the signal handlers.
+        */
+       if (input != STDIN_FILENO && tcgetattr(input, &oterm) == 0) {
+               memcpy(&term, &oterm, sizeof(term));
+               if (!(flags & RPP_ECHO_ON))
+                       term.c_lflag &= ~(ECHO | ECHONL);
+#ifdef VSTATUS
+               if (term.c_cc[VSTATUS] != _POSIX_VDISABLE)
+                       term.c_cc[VSTATUS] = _POSIX_VDISABLE;
+#endif
+               (void)tcsetattr(input, _T_FLUSH, &term);
+       } else {
+               memset(&term, 0, sizeof(term));
+               term.c_lflag |= ECHO;
+               memset(&oterm, 0, sizeof(oterm));
+               oterm.c_lflag |= ECHO;
+       }
+
+       /*
         * Catch signals that would otherwise cause the user to end
         * up with echo turned off in the shell.  Don't worry about
         * things like SIGXCPU and SIGVTALRM for now.
@@ -217,57 +240,41 @@ restart:
        (void)sigaction(SIGTTIN, &sa, &savettin);
        (void)sigaction(SIGTTOU, &sa, &savettou);
 
-       /* Turn off echo if possible. */
-       if (input != STDIN_FILENO && tcgetattr(input, &oterm) == 0) {
-               memcpy(&term, &oterm, sizeof(term));
-               if (!(flags & RPP_ECHO_ON))
-                       term.c_lflag &= ~(ECHO | ECHONL);
-#ifdef VSTATUS
-               if (term.c_cc[VSTATUS] != _POSIX_VDISABLE)
-                       term.c_cc[VSTATUS] = _POSIX_VDISABLE;
-#endif
-               (void)tcsetattr(input, _T_FLUSH, &term);
-       } else {
-               memset(&term, 0, sizeof(term));
-               term.c_lflag |= ECHO;
-               memset(&oterm, 0, sizeof(oterm));
-               oterm.c_lflag |= ECHO;
+       if (!(flags & RPP_STDIN)) {
+               int r = write(output, prompt, strlen(prompt));
+               (void)r;
        }
-
-       /* No I/O if we are already backgrounded. */
-       if (signo[SIGTTOU] != 1 && signo[SIGTTIN] != 1) {
-               if (!(flags & RPP_STDIN)) {
-                       int r = write(output, prompt, strlen(prompt));
-                       (void)r;
-               }
-               end = buf + bufsiz - 1;
-               p = buf;
-               while ((nr = read(input, &ch, 1)) == 1 && ch != '\n' && ch != 
'\r') {
-                       if (p < end) {
-                               if ((flags & RPP_SEVENBIT))
-                                       ch &= 0x7f;
-                               if (isalpha((unsigned char)ch)) {
-                                       if ((flags & RPP_FORCELOWER))
-                                               ch = (char)tolower((unsigned 
char)ch);
-                                       if ((flags & RPP_FORCEUPPER))
-                                               ch = (char)toupper((unsigned 
char)ch);
-                               }
-                               *p++ = ch;
+       end = buf + bufsiz - 1;
+       p = buf;
+       while ((nr = read(input, &ch, 1)) == 1 && ch != '\n' && ch != '\r') {
+               if (p < end) {
+                       if ((flags & RPP_SEVENBIT))
+                               ch &= 0x7f;
+                       if (isalpha((unsigned char)ch)) {
+                               if ((flags & RPP_FORCELOWER))
+                                       ch = (char)tolower((unsigned char)ch);
+                               if ((flags & RPP_FORCEUPPER))
+                                       ch = (char)toupper((unsigned char)ch);
                        }
+                       *p++ = ch;
                }
-               *p = '\0';
-               save_errno = errno;
-               if (!(term.c_lflag & ECHO)) {
-                       int r = write(output, "\n", 1);
-                       (void)r;
-               }
        }
+       *p = '\0';
+       save_errno = errno;
+       if (!(term.c_lflag & ECHO)) {
+               int r = write(output, "\n", 1);
+               (void)r;
+       }
 
        /* Restore old terminal settings and signals. */
        if (memcmp(&term, &oterm, sizeof(term)) != 0) {
+               const int sigttou = signo[SIGTTOU];
+
+               /* Ignore SIGTTOU generated when we are not the fg pgrp. */
                while (tcsetattr(input, _T_FLUSH, &oterm) == -1 &&
-                   errno == EINTR)
+                   errno == EINTR && !signo[SIGTTOU])
                        continue;
+               signo[SIGTTOU] = sigttou;
        }
        (void)sigaction(SIGALRM, &savealrm, NULL);
        (void)sigaction(SIGHUP, &savehup, NULL);

Modified: head/contrib/libarchive/tar/bsdtar.1
==============================================================================
--- head/contrib/libarchive/tar/bsdtar.1        Wed Jun 12 12:19:34 2019        
(r348992)
+++ head/contrib/libarchive/tar/bsdtar.1        Wed Jun 12 13:34:12 2019        
(r348993)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd October 1, 2017
+.Dd June 3, 2019
 .Dt TAR 1
 .Os
 .Sh NAME
@@ -198,7 +198,7 @@ options and before extracting any files.
 .It Fl Fl clear-nochange-fflags
 (x mode only)
 Before removing file system objects to replace them, clear platform-specific
-file flags that might prevent removal.
+file attributes or file flags that might prevent removal.
 .It Fl Fl exclude Ar pattern
 Do not process files or directories that match the
 specified pattern.
@@ -218,7 +218,8 @@ and
 .Sq Darcs .
 .It Fl Fl fflags
 (c, r, u, x modes only)
-Archive or extract file flags. This is the reverse of
+Archive or extract platform-specific file attributes or file flags.
+This is the reverse of
 .Fl Fl no-fflags
 and the default behavior in c, r, and u modes or if
 .Nm
@@ -389,8 +390,8 @@ Do not extract modification time.
 By default, the modification time is set to the time stored in the archive.
 .It Fl Fl mac-metadata
 (c, r, u and x mode only)
-Mac OS X specific. Archive or extract extended ACLs and extended attributes
-using
+Mac OS X specific. Archive or extract extended ACLs and extended file
+attributes using
 .Xr copyfile 3
 in AppleDouble format. This is the reverse of
 .Fl Fl no-mac-metadata .
@@ -445,21 +446,21 @@ and the default behavior if
 is run as non-root in x mode (on Mac OS X as any user in c, r, u and x modes).
 .It Fl Fl no-fflags
 (c, r, u, x modes only)
-Do not archive or extract file flags. This is the reverse of
+Do not archive or extract file attributes or file flags. This is the reverse of
 .Fl Fl fflags
 and the default behavior if
 .Nm
 is run as non-root in x mode.
 .It Fl Fl no-mac-metadata
 (x mode only)
-Mac OS X specific. Do not archive or extract ACLs and extended attributes using
+Mac OS X specific. Do not archive or extract ACLs and extended file attributes
+using
 .Xr copyfile 3
 in AppleDouble format. This is the reverse of
 .Fl Fl mac-metadata .
 and the default behavior if
 .Nm
 is run as non-root in x mode.
-.It Fl n , Fl Fl norecurse , Fl Fl no-recursion
 .It Fl Fl no-same-owner
 (x mode only)
 Do not extract owner and group IDs.
@@ -470,8 +471,8 @@ and the default behavior if
 is run as non-root.
 .It Fl Fl no-same-permissions
 (x mode only)
-Do not extract full permissions (SGID, SUID, sticky bit, ACLs,
-extended attributes or extended file flags).
+Do not extract full permissions (SGID, SUID, sticky bit,
+file attributes or file flags, extended file attributes and ACLs).
 This is the reverse of
 .Fl p
 and the default behavior if
@@ -479,7 +480,7 @@ and the default behavior if
 is run as non-root.
 .It Fl Fl no-xattrs
 (c, r, u, x modes only)
-Do not archive or extract extended attributes. This is the reverse of
+Do not archive or extract extended file attributes. This is the reverse of
 .Fl Fl xattrs
 and the default behavior if
 .Nm
@@ -667,13 +668,13 @@ This option suppresses these behaviors.
 .It Fl p , Fl Fl insecure , Fl Fl preserve-permissions
 (x mode only)
 Preserve file permissions.
-Attempt to restore the full permissions, including owner, file modes, ACLs,
-extended attributes and extended file flags, if available, for each item
-extracted from the archive. This is te reverse of
+Attempt to restore the full permissions, including file modes, file attributes
+or file flags, extended file attributes and ACLs, if available, for each item
+extracted from the archive. This is the reverse of
 .Fl Fl no-same-permissions
 and the default if
 .Nm
-is being run by root and can be partially overridden by also specifying
+is being run as root. It can be partially overridden by also specifying
 .Fl Fl no-acls ,
 .Fl Fl no-fflags ,
 .Fl Fl no-mac-metadata
@@ -844,7 +845,7 @@ See
 for more information about the handling of exclusions.
 .It Fl Fl xattrs
 (c, r, u, x modes only)
-Archive or extract extended attributes. This is the reverse of
+Archive or extract extended file attributes. This is the reverse of
 .Fl Fl no-xattrs
 and the default behavior in c, r, and u modes or if
 .Nm

Modified: head/lib/libarchive/config_freebsd.h
==============================================================================
--- head/lib/libarchive/config_freebsd.h        Wed Jun 12 12:19:34 2019        
(r348992)
+++ head/lib/libarchive/config_freebsd.h        Wed Jun 12 13:34:12 2019        
(r348993)
@@ -209,6 +209,7 @@
 #define HAVE_TZSET 1
 #define HAVE_UINTMAX_T 1
 #define HAVE_UNISTD_H 1
+#define HAVE_UNLINKAT 1
 #define HAVE_UNSETENV 1
 #define HAVE_UNSIGNED_LONG_LONG 1
 #define HAVE_UNSIGNED_LONG_LONG_INT 1

Modified: head/usr.bin/bsdcat/Makefile
==============================================================================
--- head/usr.bin/bsdcat/Makefile        Wed Jun 12 12:19:34 2019        
(r348992)
+++ head/usr.bin/bsdcat/Makefile        Wed Jun 12 13:34:12 2019        
(r348993)
@@ -6,7 +6,7 @@ _LIBARCHIVEDIR= ${SRCTOP}/contrib/libarchive
 _LIBARCHIVECONFDIR=    ${SRCTOP}/lib/libarchive
 
 PROG=  bsdcat
-BSDCAT_VERSION_STRING= 3.3.3
+BSDCAT_VERSION_STRING= 3.4.0
 
 .PATH: ${_LIBARCHIVEDIR}/cat
 SRCS=  bsdcat.c cmdline.c

Modified: head/usr.bin/cpio/Makefile
==============================================================================
--- head/usr.bin/cpio/Makefile  Wed Jun 12 12:19:34 2019        (r348992)
+++ head/usr.bin/cpio/Makefile  Wed Jun 12 13:34:12 2019        (r348993)
@@ -6,7 +6,7 @@ _LIBARCHIVEDIR= ${SRCTOP}/contrib/libarchive
 _LIBARCHIVECONFDIR=    ${SRCTOP}/lib/libarchive
 
 PROG=  bsdcpio
-BSDCPIO_VERSION_STRING=        3.3.3
+BSDCPIO_VERSION_STRING=        3.4.0
 
 .PATH: ${_LIBARCHIVEDIR}/cpio
 SRCS=  cpio.c cmdline.c

Modified: head/usr.bin/tar/Makefile
==============================================================================
--- head/usr.bin/tar/Makefile   Wed Jun 12 12:19:34 2019        (r348992)
+++ head/usr.bin/tar/Makefile   Wed Jun 12 13:34:12 2019        (r348993)
@@ -4,7 +4,7 @@
 _LIBARCHIVEDIR=        ${SRCTOP}/contrib/libarchive
 
 PROG=  bsdtar
-BSDTAR_VERSION_STRING= 3.3.3
+BSDTAR_VERSION_STRING= 3.4.0
 
 .PATH: ${_LIBARCHIVEDIR}/tar
 SRCS=  bsdtar.c        \
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to