Merge ^/head r352587 through r352763.
This commit is contained in:
commit
668ee10168
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/projects/clang900-import/; revision=352764
@ -947,7 +947,8 @@ _cleanobj_fast_depend_hack: .PHONY
|
|||||||
# Syscall stubs rewritten in C and obsolete MD assembly implementations
|
# Syscall stubs rewritten in C and obsolete MD assembly implementations
|
||||||
# Date SVN Rev Syscalls
|
# Date SVN Rev Syscalls
|
||||||
# 20180604 r334626 brk sbrk
|
# 20180604 r334626 brk sbrk
|
||||||
.for f in brk sbrk
|
# 20190916 r352703 shm_open
|
||||||
|
.for f in brk sbrk shm_open
|
||||||
@if [ -e "${OBJTOP}/lib/libc/.depend.${f}.o" ] && \
|
@if [ -e "${OBJTOP}/lib/libc/.depend.${f}.o" ] && \
|
||||||
egrep -qw '${f}\.[sS]' ${OBJTOP}/lib/libc/.depend.${f}.o; then \
|
egrep -qw '${f}\.[sS]' ${OBJTOP}/lib/libc/.depend.${f}.o; then \
|
||||||
echo "Removing stale dependencies for ${f} syscall wrappers"; \
|
echo "Removing stale dependencies for ${f} syscall wrappers"; \
|
||||||
|
@ -827,6 +827,9 @@ OLD_DIRS+=usr/lib/clang/6.0.1/lib
|
|||||||
OLD_DIRS+=usr/lib/clang/6.0.1
|
OLD_DIRS+=usr/lib/clang/6.0.1
|
||||||
# 20181116: Rename test file.
|
# 20181116: Rename test file.
|
||||||
OLD_FILES+=usr/tests/sys/netinet/reuseport_lb
|
OLD_FILES+=usr/tests/sys/netinet/reuseport_lb
|
||||||
|
# 20181113: libufs version bumped to 7.
|
||||||
|
OLD_LIBS+=lib/libufs.so.6
|
||||||
|
OLD_LIBS+=usr/lib32/libufs.so.6
|
||||||
# 20181112: Cleanup old libcap_dns.
|
# 20181112: Cleanup old libcap_dns.
|
||||||
OLD_LIBS+=lib/casper/libcap_dns.so.1
|
OLD_LIBS+=lib/casper/libcap_dns.so.1
|
||||||
OLD_LIBS+=usr/lib32/libcap_dns.so.1
|
OLD_LIBS+=usr/lib32/libcap_dns.so.1
|
||||||
|
5
RELNOTES
5
RELNOTES
@ -10,6 +10,11 @@ newline. Entries should be separated by a newline.
|
|||||||
|
|
||||||
Changes to this file should not be MFCed.
|
Changes to this file should not be MFCed.
|
||||||
|
|
||||||
|
r352668:
|
||||||
|
cron(8) now supports the -n (suppress mail on succesful run) and -q
|
||||||
|
(suppress logging of command execution) options in the crontab format.
|
||||||
|
See the crontab(5) manpage for details.
|
||||||
|
|
||||||
r352304:
|
r352304:
|
||||||
ntpd is no longer by default locked in memory. rlimit memlock 32
|
ntpd is no longer by default locked in memory. rlimit memlock 32
|
||||||
or rlimit memlock 0 can be used to restore this behaviour.
|
or rlimit memlock 0 can be used to restore this behaviour.
|
||||||
|
@ -948,39 +948,32 @@ typedef struct send_dump_data {
|
|||||||
} send_dump_data_t;
|
} send_dump_data_t;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
estimate_ioctl(zfs_handle_t *zhp, uint64_t fromsnap_obj,
|
zfs_send_space(zfs_handle_t *zhp, const char *snapname, const char *from,
|
||||||
boolean_t fromorigin, enum lzc_send_flags flags, uint64_t *sizep)
|
enum lzc_send_flags flags, uint64_t *spacep)
|
||||||
{
|
{
|
||||||
zfs_cmd_t zc = { 0 };
|
|
||||||
libzfs_handle_t *hdl = zhp->zfs_hdl;
|
libzfs_handle_t *hdl = zhp->zfs_hdl;
|
||||||
|
int error;
|
||||||
|
|
||||||
assert(zhp->zfs_type == ZFS_TYPE_SNAPSHOT);
|
assert(snapname != NULL);
|
||||||
assert(fromsnap_obj == 0 || !fromorigin);
|
error = lzc_send_space(snapname, from, flags, spacep);
|
||||||
|
|
||||||
(void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name));
|
if (error != 0) {
|
||||||
zc.zc_obj = fromorigin;
|
|
||||||
zc.zc_sendobj = zfs_prop_get_int(zhp, ZFS_PROP_OBJSETID);
|
|
||||||
zc.zc_fromobj = fromsnap_obj;
|
|
||||||
zc.zc_guid = 1; /* estimate flag */
|
|
||||||
zc.zc_flags = flags;
|
|
||||||
|
|
||||||
if (zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_SEND, &zc) != 0) {
|
|
||||||
char errbuf[1024];
|
char errbuf[1024];
|
||||||
(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
|
(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
|
||||||
"warning: cannot estimate space for '%s'"), zhp->zfs_name);
|
"warning: cannot estimate space for '%s'"), snapname);
|
||||||
|
|
||||||
switch (errno) {
|
switch (error) {
|
||||||
case EXDEV:
|
case EXDEV:
|
||||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||||
"not an earlier snapshot from the same fs"));
|
"not an earlier snapshot from the same fs"));
|
||||||
return (zfs_error(hdl, EZFS_CROSSTARGET, errbuf));
|
return (zfs_error(hdl, EZFS_CROSSTARGET, errbuf));
|
||||||
|
|
||||||
case ENOENT:
|
case ENOENT:
|
||||||
if (zfs_dataset_exists(hdl, zc.zc_name,
|
if (zfs_dataset_exists(hdl, snapname,
|
||||||
ZFS_TYPE_SNAPSHOT)) {
|
ZFS_TYPE_SNAPSHOT)) {
|
||||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||||
"incremental source (@%s) does not exist"),
|
"incremental source (%s) does not exist"),
|
||||||
zc.zc_value);
|
snapname);
|
||||||
}
|
}
|
||||||
return (zfs_error(hdl, EZFS_NOENT, errbuf));
|
return (zfs_error(hdl, EZFS_NOENT, errbuf));
|
||||||
|
|
||||||
@ -994,16 +987,15 @@ estimate_ioctl(zfs_handle_t *zhp, uint64_t fromsnap_obj,
|
|||||||
case ERANGE:
|
case ERANGE:
|
||||||
case EFAULT:
|
case EFAULT:
|
||||||
case EROFS:
|
case EROFS:
|
||||||
zfs_error_aux(hdl, strerror(errno));
|
case EINVAL:
|
||||||
|
zfs_error_aux(hdl, strerror(error));
|
||||||
return (zfs_error(hdl, EZFS_BADBACKUP, errbuf));
|
return (zfs_error(hdl, EZFS_BADBACKUP, errbuf));
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return (zfs_standard_error(hdl, errno, errbuf));
|
return (zfs_standard_error(hdl, error, errbuf));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*sizep = zc.zc_objset_type;
|
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1290,14 +1282,23 @@ dump_snapshot(zfs_handle_t *zhp, void *arg)
|
|||||||
(sdd->fromorigin || sdd->replicate);
|
(sdd->fromorigin || sdd->replicate);
|
||||||
|
|
||||||
if (sdd->verbose || sdd->progress) {
|
if (sdd->verbose || sdd->progress) {
|
||||||
(void) estimate_ioctl(zhp, sdd->prevsnap_obj,
|
char fromds[ZFS_MAX_DATASET_NAME_LEN];
|
||||||
fromorigin, flags, &size);
|
|
||||||
sdd->size += size;
|
|
||||||
|
|
||||||
|
if (sdd->prevsnap[0] != '\0') {
|
||||||
|
(void) strlcpy(fromds, zhp->zfs_name, sizeof (fromds));
|
||||||
|
*(strchr(fromds, '@') + 1) = '\0';
|
||||||
|
(void) strlcat(fromds, sdd->prevsnap, sizeof (fromds));
|
||||||
|
}
|
||||||
|
if (zfs_send_space(zhp, zhp->zfs_name,
|
||||||
|
sdd->prevsnap[0] ? fromds : NULL, flags, &size) != 0) {
|
||||||
|
size = 0; /* cannot estimate send space */
|
||||||
|
} else {
|
||||||
send_print_verbose(fout, zhp->zfs_name,
|
send_print_verbose(fout, zhp->zfs_name,
|
||||||
sdd->prevsnap[0] ? sdd->prevsnap : NULL,
|
sdd->prevsnap[0] ? sdd->prevsnap : NULL,
|
||||||
size, sdd->parsable);
|
size, sdd->parsable);
|
||||||
}
|
}
|
||||||
|
sdd->size += size;
|
||||||
|
}
|
||||||
|
|
||||||
if (!sdd->dryrun) {
|
if (!sdd->dryrun) {
|
||||||
/*
|
/*
|
||||||
@ -2054,6 +2055,15 @@ zfs_send_one(zfs_handle_t *zhp, const char *from, int fd, sendflags_t flags)
|
|||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
send_print_verbose(fout, zhp->zfs_name, from, size,
|
send_print_verbose(fout, zhp->zfs_name, from, size,
|
||||||
flags.parsable);
|
flags.parsable);
|
||||||
|
if (flags.parsable) {
|
||||||
|
(void) fprintf(fout, "size\t%llu\n",
|
||||||
|
(longlong_t)size);
|
||||||
|
} else {
|
||||||
|
char buf[16];
|
||||||
|
zfs_nicenum(size, buf, sizeof (buf));
|
||||||
|
(void) fprintf(fout, dgettext(TEXT_DOMAIN,
|
||||||
|
"total estimated size is %s\n"), buf);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
(void) fprintf(stderr, "Cannot estimate send size: "
|
(void) fprintf(stderr, "Cannot estimate send size: "
|
||||||
"%s\n", strerror(errno));
|
"%s\n", strerror(errno));
|
||||||
|
@ -309,11 +309,27 @@ range: addrmask { $$ = calloc(1, sizeof(*$$));
|
|||||||
$$->ipn_info = 0;
|
$$->ipn_info = 0;
|
||||||
$$->ipn_addr = $1[0];
|
$$->ipn_addr = $1[0];
|
||||||
$$->ipn_mask = $1[1];
|
$$->ipn_mask = $1[1];
|
||||||
|
#ifdef USE_INET6
|
||||||
|
if (use_inet6)
|
||||||
|
$$->ipn_addr.adf_family =
|
||||||
|
AF_INET6;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
$$->ipn_addr.adf_family =
|
||||||
|
AF_INET;
|
||||||
}
|
}
|
||||||
| '!' addrmask { $$ = calloc(1, sizeof(*$$));
|
| '!' addrmask { $$ = calloc(1, sizeof(*$$));
|
||||||
$$->ipn_info = 1;
|
$$->ipn_info = 1;
|
||||||
$$->ipn_addr = $2[0];
|
$$->ipn_addr = $2[0];
|
||||||
$$->ipn_mask = $2[1];
|
$$->ipn_mask = $2[1];
|
||||||
|
#ifdef USE_INET6
|
||||||
|
if (use_inet6)
|
||||||
|
$$->ipn_addr.adf_family =
|
||||||
|
AF_INET6;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
$$->ipn_addr.adf_family =
|
||||||
|
AF_INET;
|
||||||
}
|
}
|
||||||
| YY_STR { $$ = add_poolhosts($1);
|
| YY_STR { $$ = add_poolhosts($1);
|
||||||
free($1);
|
free($1);
|
||||||
|
@ -34,16 +34,15 @@
|
|||||||
.Nm
|
.Nm
|
||||||
.Op options
|
.Op options
|
||||||
.Op files
|
.Op files
|
||||||
.Pp
|
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
.Nm
|
.Nm
|
||||||
expands files to standard output.
|
expands files to standard output.
|
||||||
.Sh OPTIONS
|
.Sh OPTIONS
|
||||||
.Nm
|
.Nm
|
||||||
typically takes a filename as an argument or reads standard input when used in a
|
typically takes a filename as an argument or reads standard input when used in a
|
||||||
pipe. In both cases decompressed data it written to standard output.
|
pipe.
|
||||||
|
In both cases decompressed data it written to standard output.
|
||||||
.Sh EXAMPLES
|
.Sh EXAMPLES
|
||||||
.Pp
|
|
||||||
To decompress a file:
|
To decompress a file:
|
||||||
.Pp
|
.Pp
|
||||||
.Dl bsdcat example.txt.gz > example.txt
|
.Dl bsdcat example.txt.gz > example.txt
|
||||||
@ -55,8 +54,8 @@ To decompress standard input in a pipe:
|
|||||||
Both examples achieve the same results - a decompressed file by redirecting
|
Both examples achieve the same results - a decompressed file by redirecting
|
||||||
output.
|
output.
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr uncompress 1 ,
|
|
||||||
.Xr zcat 1 ,
|
|
||||||
.Xr bzcat 1 ,
|
.Xr bzcat 1 ,
|
||||||
|
.Xr uncompress 1 ,
|
||||||
.Xr xzcat 1 ,
|
.Xr xzcat 1 ,
|
||||||
.Xr libarchive-formats 5 ,
|
.Xr zcat 1 ,
|
||||||
|
.Xr libarchive-formats 5
|
||||||
|
@ -75,7 +75,6 @@ Pass-through.
|
|||||||
Read a list of filenames from standard input and copy the files to the
|
Read a list of filenames from standard input and copy the files to the
|
||||||
specified directory.
|
specified directory.
|
||||||
.El
|
.El
|
||||||
.Pp
|
|
||||||
.Sh OPTIONS
|
.Sh OPTIONS
|
||||||
Unless specifically stated otherwise, options are applicable in
|
Unless specifically stated otherwise, options are applicable in
|
||||||
all operating modes.
|
all operating modes.
|
||||||
@ -385,10 +384,10 @@ For best compatibility, scripts should limit themselves to the
|
|||||||
standard syntax.
|
standard syntax.
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr bzip2 1 ,
|
.Xr bzip2 1 ,
|
||||||
.Xr tar 1 ,
|
|
||||||
.Xr gzip 1 ,
|
.Xr gzip 1 ,
|
||||||
.Xr mt 1 ,
|
.Xr mt 1 ,
|
||||||
.Xr pax 1 ,
|
.Xr pax 1 ,
|
||||||
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
.Xr libarchive 3 ,
|
||||||
.Xr cpio 5 ,
|
.Xr cpio 5 ,
|
||||||
.Xr libarchive-formats 5 ,
|
.Xr libarchive-formats 5 ,
|
||||||
|
@ -52,7 +52,7 @@
|
|||||||
*/
|
*/
|
||||||
#if defined(__BORLANDC__) && __BORLANDC__ >= 0x560
|
#if defined(__BORLANDC__) && __BORLANDC__ >= 0x560
|
||||||
# include <stdint.h>
|
# include <stdint.h>
|
||||||
#elif !defined(__WATCOMC__) && !defined(_MSC_VER) && !defined(__INTERIX) && !defined(__BORLANDC__) && !defined(_SCO_DS) && !defined(__osf__)
|
#elif !defined(__WATCOMC__) && !defined(_MSC_VER) && !defined(__INTERIX) && !defined(__BORLANDC__) && !defined(_SCO_DS) && !defined(__osf__) && !defined(__CLANG_INTTYPES_H)
|
||||||
# include <inttypes.h>
|
# include <inttypes.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
.Nm archive_entry_clear ,
|
.Nm archive_entry_clear ,
|
||||||
.Nm archive_entry_clone ,
|
.Nm archive_entry_clone ,
|
||||||
.Nm archive_entry_free ,
|
.Nm archive_entry_free ,
|
||||||
.Nm archive_entry_new ,
|
.Nm archive_entry_new
|
||||||
.Nd functions for managing archive entry descriptions
|
.Nd functions for managing archive entry descriptions
|
||||||
.Sh LIBRARY
|
.Sh LIBRARY
|
||||||
Streaming Archive Library (libarchive, -larchive)
|
Streaming Archive Library (libarchive, -larchive)
|
||||||
@ -126,7 +126,6 @@ using the current locale.
|
|||||||
Similarly, if you store a wide string and then store a
|
Similarly, if you store a wide string and then store a
|
||||||
narrow string for the same data, the previously-set wide string will
|
narrow string for the same data, the previously-set wide string will
|
||||||
be discarded in favor of the new data.
|
be discarded in favor of the new data.
|
||||||
.Pp
|
|
||||||
.\" .Sh EXAMPLE
|
.\" .Sh EXAMPLE
|
||||||
.\" .Sh RETURN VALUES
|
.\" .Sh RETURN VALUES
|
||||||
.\" .Sh ERRORS
|
.\" .Sh ERRORS
|
||||||
@ -134,8 +133,8 @@ be discarded in favor of the new data.
|
|||||||
.Xr archive_entry_acl 3 ,
|
.Xr archive_entry_acl 3 ,
|
||||||
.Xr archive_entry_paths 3 ,
|
.Xr archive_entry_paths 3 ,
|
||||||
.Xr archive_entry_perms 3 ,
|
.Xr archive_entry_perms 3 ,
|
||||||
.Xr archive_entry_time 3
|
.Xr archive_entry_time 3 ,
|
||||||
.Xr libarchive 3 ,
|
.Xr libarchive 3
|
||||||
.Sh HISTORY
|
.Sh HISTORY
|
||||||
The
|
The
|
||||||
.Nm libarchive
|
.Nm libarchive
|
||||||
|
@ -118,15 +118,16 @@ Streaming Archive Library (libarchive, -larchive)
|
|||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
The
|
The
|
||||||
.Dq Access Control Lists (ACLs)
|
.Dq Access Control Lists (ACLs)
|
||||||
extend the standard Unix perssion model.
|
extend the standard Unix permission model.
|
||||||
The ACL interface of
|
The ACL interface of
|
||||||
.Nm libarchive
|
.Nm libarchive
|
||||||
supports both POSIX.1e and NFSv4 style ACLs. Use of ACLs is restricted by
|
supports both POSIX.1e and NFSv4 style ACLs.
|
||||||
|
Use of ACLs is restricted by
|
||||||
various levels of ACL support in operating systems, file systems and archive
|
various levels of ACL support in operating systems, file systems and archive
|
||||||
formats.
|
formats.
|
||||||
.Ss POSIX.1e Access Control Lists
|
.Ss POSIX.1e Access Control Lists
|
||||||
A POSIX.1e ACL consists of a number of independent entries.
|
A POSIX.1e ACL consists of a number of independent entries.
|
||||||
Each entry specifies the permission set as bitmask of basic permissions.
|
Each entry specifies the permission set as a bitmask of basic permissions.
|
||||||
Valid permissions in the
|
Valid permissions in the
|
||||||
.Fa permset
|
.Fa permset
|
||||||
are:
|
are:
|
||||||
@ -147,13 +148,13 @@ The user specified by the name field.
|
|||||||
.It Dv ARCHIVE_ENTRY_ACL_USER_OBJ
|
.It Dv ARCHIVE_ENTRY_ACL_USER_OBJ
|
||||||
The owner of the file.
|
The owner of the file.
|
||||||
.It Dv ARCHIVE_ENTRY_ACL_GROUP
|
.It Dv ARCHIVE_ENTRY_ACL_GROUP
|
||||||
The group specied by the name field.
|
The group specified by the name field.
|
||||||
.It Dv ARCHIVE_ENTRY_ACL_GROUP_OBJ
|
.It Dv ARCHIVE_ENTRY_ACL_GROUP_OBJ
|
||||||
The group who owns the file.
|
The group which owns the file.
|
||||||
.It Dv ARCHIVE_ENTRY_ACL_MASK
|
.It Dv ARCHIVE_ENTRY_ACL_MASK
|
||||||
The maximum permissions to be obtained via group permissions.
|
The maximum permissions to be obtained via group permissions.
|
||||||
.It Dv ARCHIVE_ENTRY_ACL_OTHER
|
.It Dv ARCHIVE_ENTRY_ACL_OTHER
|
||||||
Any principal who is not file owner or a member of the owning group.
|
Any principal who is not the file owner or a member of the owning group.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
The principals
|
The principals
|
||||||
@ -164,12 +165,12 @@ and
|
|||||||
are equivalent to user, group and other in the classic Unix permission
|
are equivalent to user, group and other in the classic Unix permission
|
||||||
model and specify non-extended ACL entries.
|
model and specify non-extended ACL entries.
|
||||||
.Pp
|
.Pp
|
||||||
All files with have an access ACL
|
All files have an access ACL
|
||||||
.Pq Dv ARCHIVE_ENTRY_ACL_TYPE_ACCESS .
|
.Pq Dv ARCHIVE_ENTRY_ACL_TYPE_ACCESS .
|
||||||
This specifies the permissions required for access to the file itself.
|
This specifies the permissions required for access to the file itself.
|
||||||
Directories have an additional ACL
|
Directories have an additional ACL
|
||||||
.Pq Dv ARCHIVE_ENTRY_ACL_TYPE_DEFAULT ,
|
.Pq Dv ARCHIVE_ENTRY_ACL_TYPE_DEFAULT ,
|
||||||
which controls the initial access ACL for newly created directory entries.
|
which controls the initial access ACL for newly-created directory entries.
|
||||||
.Ss NFSv4 Access Control Lists
|
.Ss NFSv4 Access Control Lists
|
||||||
A NFSv4 ACL consists of multiple individual entries called Access Control
|
A NFSv4 ACL consists of multiple individual entries called Access Control
|
||||||
Entries (ACEs).
|
Entries (ACEs).
|
||||||
@ -197,11 +198,11 @@ The user specified by the name field.
|
|||||||
.It Dv ARCHIVE_ENTRY_ACL_USER_OBJ
|
.It Dv ARCHIVE_ENTRY_ACL_USER_OBJ
|
||||||
The owner of the file.
|
The owner of the file.
|
||||||
.It Dv ARCHIVE_ENTRY_ACL_GROUP
|
.It Dv ARCHIVE_ENTRY_ACL_GROUP
|
||||||
The group specied by the name field.
|
The group specified by the name field.
|
||||||
.It Dv ARCHIVE_ENTRY_ACL_GROUP_OBJ
|
.It Dv ARCHIVE_ENTRY_ACL_GROUP_OBJ
|
||||||
The group who owns the file.
|
The group which owns the file.
|
||||||
.It Dv ARCHIVE_ENTRY_ACL_EVERYONE
|
.It Dv ARCHIVE_ENTRY_ACL_EVERYONE
|
||||||
Any principal who is not file owner or a member of the owning group.
|
Any principal who is not the file owner or a member of the owning group.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
Entries with the
|
Entries with the
|
||||||
@ -216,9 +217,10 @@ integer.
|
|||||||
.Pp
|
.Pp
|
||||||
NFSv4 ACE permissions and flags are stored in the same
|
NFSv4 ACE permissions and flags are stored in the same
|
||||||
.Fa permset
|
.Fa permset
|
||||||
bitfield. Some permissions share the same constant and permission character but
|
bitfield.
|
||||||
have different effect on directories than on files. The following ACE
|
Some permissions share the same constant and permission character
|
||||||
permissions are supported:
|
but have different effect on directories than on files.
|
||||||
|
The following ACE permissions are supported:
|
||||||
.Bl -tag -offset indent -compact -width ARCHIV
|
.Bl -tag -offset indent -compact -width ARCHIV
|
||||||
.It Dv ARCHIVE_ENTRY_ACL_READ_DATA ( Sy r )
|
.It Dv ARCHIVE_ENTRY_ACL_READ_DATA ( Sy r )
|
||||||
Read data (file).
|
Read data (file).
|
||||||
@ -265,7 +267,8 @@ Inherit parent directory ACE to subdirectories.
|
|||||||
.It Dv ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY ( Sy i )
|
.It Dv ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY ( Sy i )
|
||||||
Only inherit, do not apply the permission on the directory itself.
|
Only inherit, do not apply the permission on the directory itself.
|
||||||
.It Dv ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT ( Sy n )
|
.It Dv ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT ( Sy n )
|
||||||
Do not propagate inherit flags. Only first-level entries inherit ACLs.
|
Do not propagate inherit flags.
|
||||||
|
Only first-level entries inherit ACLs.
|
||||||
.It Dv ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS ( Sy S )
|
.It Dv ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS ( Sy S )
|
||||||
Trigger alarm or audit on successful access.
|
Trigger alarm or audit on successful access.
|
||||||
.It Dv ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS ( Sy F )
|
.It Dv ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS ( Sy F )
|
||||||
@ -279,8 +282,8 @@ and
|
|||||||
.Fn archive_entry_acl_add_entry_w
|
.Fn archive_entry_acl_add_entry_w
|
||||||
add a single ACL entry.
|
add a single ACL entry.
|
||||||
For the access ACL and non-extended principals, the classic Unix permissions
|
For the access ACL and non-extended principals, the classic Unix permissions
|
||||||
are updated. An archive entry cannot contain both POSIX.1e and NFSv4 ACL
|
are updated.
|
||||||
entries.
|
An archive entry cannot contain both POSIX.1e and NFSv4 ACL entries.
|
||||||
.Pp
|
.Pp
|
||||||
.Fn archive_entry_acl_clear
|
.Fn archive_entry_acl_clear
|
||||||
removes all ACL entries and resets the enumeration pointer.
|
removes all ACL entries and resets the enumeration pointer.
|
||||||
@ -300,7 +303,8 @@ for POSIX.1e ACLs and
|
|||||||
.It Dv ARCHIVE_ENTRY_ACL_TYPE_AUDIT
|
.It Dv ARCHIVE_ENTRY_ACL_TYPE_AUDIT
|
||||||
.It Dv ARCHIVE_ENTRY_ACL_TYPE_ALARM
|
.It Dv ARCHIVE_ENTRY_ACL_TYPE_ALARM
|
||||||
.El
|
.El
|
||||||
for NFSv4 ACLs. For POSIX.1e ACLs if
|
for NFSv4 ACLs.
|
||||||
|
For POSIX.1e ACLs if
|
||||||
.Dv ARCHIVE_ENTRY_ACL_TYPE_ACCESS
|
.Dv ARCHIVE_ENTRY_ACL_TYPE_ACCESS
|
||||||
is included and at least one extended ACL entry is found,
|
is included and at least one extended ACL entry is found,
|
||||||
the three non-extended ACLs are added.
|
the three non-extended ACLs are added.
|
||||||
@ -312,7 +316,8 @@ add new
|
|||||||
.Pq or merge with existing
|
.Pq or merge with existing
|
||||||
ACL entries from
|
ACL entries from
|
||||||
.Pq wide
|
.Pq wide
|
||||||
text. The argument
|
text.
|
||||||
|
The argument
|
||||||
.Fa type
|
.Fa type
|
||||||
may take one of the following values:
|
may take one of the following values:
|
||||||
.Bl -tag -offset indent -compact -width "ARCHIVE_ENTRY_ACL_TYPE_DEFAULT"
|
.Bl -tag -offset indent -compact -width "ARCHIVE_ENTRY_ACL_TYPE_DEFAULT"
|
||||||
@ -322,11 +327,13 @@ may take one of the following values:
|
|||||||
.El
|
.El
|
||||||
Supports all formats that can be created with
|
Supports all formats that can be created with
|
||||||
.Fn archive_entry_acl_to_text
|
.Fn archive_entry_acl_to_text
|
||||||
or respective
|
or respectively
|
||||||
.Fn archive_entry_acl_to_text_w .
|
.Fn archive_entry_acl_to_text_w .
|
||||||
Existing ACL entries are preserved. To get a clean new ACL from text
|
Existing ACL entries are preserved.
|
||||||
|
To get a clean new ACL from text
|
||||||
.Fn archive_entry_acl_clear
|
.Fn archive_entry_acl_clear
|
||||||
must be called first. Entries prefixed with
|
must be called first.
|
||||||
|
Entries prefixed with
|
||||||
.Dq default:
|
.Dq default:
|
||||||
are treated as
|
are treated as
|
||||||
.Dv ARCHIVE_ENTRY_ACL_TYPE_DEFAULT
|
.Dv ARCHIVE_ENTRY_ACL_TYPE_DEFAULT
|
||||||
@ -354,7 +361,7 @@ prepare reading the list of ACL entries with
|
|||||||
.Fn archive_entry_acl_next
|
.Fn archive_entry_acl_next
|
||||||
or
|
or
|
||||||
.Fn archive_entry_acl_next_w .
|
.Fn archive_entry_acl_next_w .
|
||||||
The function returns either 0, if no non-extended ACLs are found.
|
The function returns 0 if no non-extended ACLs are found.
|
||||||
In this case, the access permissions should be obtained by
|
In this case, the access permissions should be obtained by
|
||||||
.Xr archive_entry_mode 3
|
.Xr archive_entry_mode 3
|
||||||
or set using
|
or set using
|
||||||
@ -367,7 +374,8 @@ and
|
|||||||
.Fn archive_entry_acl_to_text_w
|
.Fn archive_entry_acl_to_text_w
|
||||||
convert the ACL entries for the given type into a
|
convert the ACL entries for the given type into a
|
||||||
.Pq wide
|
.Pq wide
|
||||||
string of ACL entries separated by newline. If the pointer
|
string of ACL entries separated by newline.
|
||||||
|
If the pointer
|
||||||
.Fa len_p
|
.Fa len_p
|
||||||
is not NULL, then the function shall return the length of the string
|
is not NULL, then the function shall return the length of the string
|
||||||
.Pq not including the NULL terminator
|
.Pq not including the NULL terminator
|
||||||
@ -415,7 +423,8 @@ are prefixed with
|
|||||||
.Dq default: .
|
.Dq default: .
|
||||||
.Pp
|
.Pp
|
||||||
.Fn archive_entry_acl_types
|
.Fn archive_entry_acl_types
|
||||||
get ACL entry types contained in an archive entry's ACL. As POSIX.1e and NFSv4
|
get ACL entry types contained in an archive entry's ACL.
|
||||||
|
As POSIX.1e and NFSv4
|
||||||
ACL entries cannot be mixed, this function is a very efficient way to detect if
|
ACL entries cannot be mixed, this function is a very efficient way to detect if
|
||||||
an ACL already contains POSIX.1e or NFSv4 ACL entries.
|
an ACL already contains POSIX.1e or NFSv4 ACL entries.
|
||||||
.Sh RETURN VALUES
|
.Sh RETURN VALUES
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
.Sh NAME
|
.Sh NAME
|
||||||
.Nm archive_entry_symlink_type ,
|
.Nm archive_entry_symlink_type ,
|
||||||
.Nm archive_entry_set_symlink_type
|
.Nm archive_entry_set_symlink_type
|
||||||
.Nd miscellaneous functions for manipulating properties of archive_entry.
|
.Nd miscellaneous functions for manipulating properties of archive_entry
|
||||||
.Sh LIBRARY
|
.Sh LIBRARY
|
||||||
Streaming Archive Library (libarchive, -larchive)
|
Streaming Archive Library (libarchive, -larchive)
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
@ -42,7 +42,8 @@ The function
|
|||||||
.Fn archive_entry_symlink_type
|
.Fn archive_entry_symlink_type
|
||||||
returns and the function
|
returns and the function
|
||||||
.Fn archive_entry_set_symlink_type
|
.Fn archive_entry_set_symlink_type
|
||||||
sets the type of the symbolic link stored in an archive entry. These functions
|
sets the type of the symbolic link stored in an archive entry.
|
||||||
|
These functions
|
||||||
have special meaning on operating systems that support multiple symbolic link
|
have special meaning on operating systems that support multiple symbolic link
|
||||||
types (e.g. Microsoft Windows).
|
types (e.g. Microsoft Windows).
|
||||||
.Pp
|
.Pp
|
||||||
|
@ -133,7 +133,7 @@ The accessor functions are named
|
|||||||
.Fn XXX_w .
|
.Fn XXX_w .
|
||||||
.It UTF-8
|
.It UTF-8
|
||||||
Unicode strings encoded as UTF-8.
|
Unicode strings encoded as UTF-8.
|
||||||
This are convience functions to update both the multibyte and wide
|
These are convenience functions to update both the multibyte and wide
|
||||||
character strings at the same time.
|
character strings at the same time.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
@ -141,7 +141,7 @@ The sourcepath is a pure filesystem concept and never stored in an
|
|||||||
archive directly.
|
archive directly.
|
||||||
.Pp
|
.Pp
|
||||||
For that reason, it is only available as multibyte string.
|
For that reason, it is only available as multibyte string.
|
||||||
The link path is a convience function for conditionally setting
|
The link path is a convenience function for conditionally setting
|
||||||
hardlink or symlink destination.
|
hardlink or symlink destination.
|
||||||
It doesn't have a corresponding get accessor function.
|
It doesn't have a corresponding get accessor function.
|
||||||
.Pp
|
.Pp
|
||||||
@ -149,5 +149,5 @@ It doesn't have a corresponding get accessor function.
|
|||||||
is an alias for
|
is an alias for
|
||||||
.Fn archive_entry_copy_XXX .
|
.Fn archive_entry_copy_XXX .
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr archive_entry 3
|
.Xr archive_entry 3 ,
|
||||||
.Xr libarchive 3 ,
|
.Xr libarchive 3
|
||||||
|
@ -126,7 +126,7 @@ The corresponding functions
|
|||||||
and
|
and
|
||||||
.Fn archive_entry_set_perm
|
.Fn archive_entry_set_perm
|
||||||
store the given user id, group id and permission in the entry.
|
store the given user id, group id and permission in the entry.
|
||||||
The permission is also set as side effect of calling
|
The permission is also set as a side effect of calling
|
||||||
.Fn archive_entry_set_mode .
|
.Fn archive_entry_set_mode .
|
||||||
.Pp
|
.Pp
|
||||||
.Fn archive_entry_strmode
|
.Fn archive_entry_strmode
|
||||||
@ -143,7 +143,7 @@ The accessor functions are named
|
|||||||
.Fn XXX_w .
|
.Fn XXX_w .
|
||||||
.It UTF-8
|
.It UTF-8
|
||||||
Unicode strings encoded as UTF-8.
|
Unicode strings encoded as UTF-8.
|
||||||
This are convience functions to update both the multibyte and wide
|
These are convenience functions to update both the multibyte and wide
|
||||||
character strings at the same time.
|
character strings at the same time.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
@ -182,7 +182,7 @@ The
|
|||||||
.Fn archive_entry_copy_fflags_text
|
.Fn archive_entry_copy_fflags_text
|
||||||
and
|
and
|
||||||
.Fn archive_entry_copy_fflags_text_w
|
.Fn archive_entry_copy_fflags_text_w
|
||||||
functions parse the provided text and sets the internal bitmap values.
|
functions parse the provided text and set the internal bitmap values.
|
||||||
This is a platform-specific operation; names that are not meaningful
|
This is a platform-specific operation; names that are not meaningful
|
||||||
on the current platform will be ignored.
|
on the current platform will be ignored.
|
||||||
The function returns a pointer to the start of the first name that was not
|
The function returns a pointer to the start of the first name that was not
|
||||||
@ -197,8 +197,8 @@ which stops parsing at the first unrecognized name.)
|
|||||||
.Xr archive_entry 3 ,
|
.Xr archive_entry 3 ,
|
||||||
.Xr archive_entry_acl 3 ,
|
.Xr archive_entry_acl 3 ,
|
||||||
.Xr archive_read_disk 3 ,
|
.Xr archive_read_disk 3 ,
|
||||||
.Xr archive_write_disk 3
|
.Xr archive_write_disk 3 ,
|
||||||
.Xr libarchive 3 ,
|
.Xr libarchive 3
|
||||||
.Sh BUGS
|
.Sh BUGS
|
||||||
The platform types
|
The platform types
|
||||||
.Vt uid_t
|
.Vt uid_t
|
||||||
|
@ -54,7 +54,7 @@
|
|||||||
.Nm archive_entry_rdevmajor ,
|
.Nm archive_entry_rdevmajor ,
|
||||||
.Nm archive_entry_set_rdevmajor ,
|
.Nm archive_entry_set_rdevmajor ,
|
||||||
.Nm archive_entry_rdevminor ,
|
.Nm archive_entry_rdevminor ,
|
||||||
.Nm archive_entry_set_rdevminor ,
|
.Nm archive_entry_set_rdevminor
|
||||||
.Nd accessor functions for manipulating archive entry descriptions
|
.Nd accessor functions for manipulating archive entry descriptions
|
||||||
.Sh LIBRARY
|
.Sh LIBRARY
|
||||||
Streaming Archive Library (libarchive, -larchive)
|
Streaming Archive Library (libarchive, -larchive)
|
||||||
@ -267,8 +267,8 @@ platforms.
|
|||||||
Some archive formats use the combined form, while other formats use
|
Some archive formats use the combined form, while other formats use
|
||||||
the split form.
|
the split form.
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
|
.Xr stat 2 ,
|
||||||
.Xr archive_entry_acl 3 ,
|
.Xr archive_entry_acl 3 ,
|
||||||
.Xr archive_entry_perms 3 ,
|
.Xr archive_entry_perms 3 ,
|
||||||
.Xr archive_entry_time 3 ,
|
.Xr archive_entry_time 3 ,
|
||||||
.Xr libarchive 3 ,
|
.Xr libarchive 3
|
||||||
.Xr stat 2
|
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
.Nm archive_entry_mtime_nsec ,
|
.Nm archive_entry_mtime_nsec ,
|
||||||
.Nm archive_entry_mtime_is_set ,
|
.Nm archive_entry_mtime_is_set ,
|
||||||
.Nm archive_entry_set_mtime ,
|
.Nm archive_entry_set_mtime ,
|
||||||
.Nm archive_entry_unset_mtime ,
|
.Nm archive_entry_unset_mtime
|
||||||
.Nd functions for manipulating times in archive entry descriptions
|
.Nd functions for manipulating times in archive entry descriptions
|
||||||
.Sh LIBRARY
|
.Sh LIBRARY
|
||||||
Streaming Archive Library (libarchive, -larchive)
|
Streaming Archive Library (libarchive, -larchive)
|
||||||
@ -113,8 +113,8 @@ The current state can be queried using
|
|||||||
.Fn XXX_is_set .
|
.Fn XXX_is_set .
|
||||||
Unset time fields have a second and nanosecond field of 0.
|
Unset time fields have a second and nanosecond field of 0.
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr archive_entry 3
|
.Xr archive_entry 3 ,
|
||||||
.Xr libarchive 3 ,
|
.Xr libarchive 3
|
||||||
.Sh HISTORY
|
.Sh HISTORY
|
||||||
The
|
The
|
||||||
.Nm libarchive
|
.Nm libarchive
|
||||||
|
@ -155,7 +155,7 @@ to close the archive, then call
|
|||||||
.Fn archive_read_free
|
.Fn archive_read_free
|
||||||
to release all resources, including all memory allocated by the library.
|
to release all resources, including all memory allocated by the library.
|
||||||
.\"
|
.\"
|
||||||
.Sh EXAMPLE
|
.Sh EXAMPLES
|
||||||
The following illustrates basic usage of the library.
|
The following illustrates basic usage of the library.
|
||||||
In this example,
|
In this example,
|
||||||
the callback functions are simply wrappers around the standard
|
the callback functions are simply wrappers around the standard
|
||||||
@ -217,16 +217,16 @@ myclose(struct archive *a, void *client_data)
|
|||||||
.\" .Sh ERRORS
|
.\" .Sh ERRORS
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_read_new 3 ,
|
|
||||||
.Xr archive_read_data 3 ,
|
.Xr archive_read_data 3 ,
|
||||||
.Xr archive_read_extract 3 ,
|
.Xr archive_read_extract 3 ,
|
||||||
.Xr archive_read_filter 3 ,
|
.Xr archive_read_filter 3 ,
|
||||||
.Xr archive_read_format 3 ,
|
.Xr archive_read_format 3 ,
|
||||||
.Xr archive_read_header 3 ,
|
.Xr archive_read_header 3 ,
|
||||||
|
.Xr archive_read_new 3 ,
|
||||||
.Xr archive_read_open 3 ,
|
.Xr archive_read_open 3 ,
|
||||||
.Xr archive_read_set_options 3 ,
|
.Xr archive_read_set_options 3 ,
|
||||||
.Xr archive_util 3 ,
|
.Xr archive_util 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
.Sh HISTORY
|
.Sh HISTORY
|
||||||
The
|
The
|
||||||
|
@ -61,14 +61,14 @@ Otherwise,
|
|||||||
.Cm ARCHIVE_OK
|
.Cm ARCHIVE_OK
|
||||||
will be returned.
|
will be returned.
|
||||||
.It Fn archive_read_set_passphrase_callback
|
.It Fn archive_read_set_passphrase_callback
|
||||||
Register callback function that will be invoked to get a passphrase
|
Register a callback function that will be invoked to get a passphrase
|
||||||
for decrption after trying all passphrases registered by the
|
for decryption after trying all the passphrases registered by the
|
||||||
.Fn archive_read_add_passphrase
|
.Fn archive_read_add_passphrase
|
||||||
function failed.
|
function failed.
|
||||||
.El
|
.El
|
||||||
.\" .Sh ERRORS
|
.\" .Sh ERRORS
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_read 3 ,
|
.Xr archive_read 3 ,
|
||||||
.Xr archive_read_set_options 3
|
.Xr archive_read_set_options 3 ,
|
||||||
|
.Xr libarchive 3
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
.Dt ARCHIVE_READ_DATA 3
|
.Dt ARCHIVE_READ_DATA 3
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
.Nm archive_read_data
|
.Nm archive_read_data ,
|
||||||
.Nm archive_read_data_block ,
|
.Nm archive_read_data_block ,
|
||||||
.Nm archive_read_data_skip ,
|
.Nm archive_read_data_skip ,
|
||||||
.Nm archive_read_data_into_fd
|
.Nm archive_read_data_into_fd
|
||||||
@ -118,7 +118,6 @@ functions.
|
|||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_read 3 ,
|
.Xr archive_read 3 ,
|
||||||
.Xr archive_read_extract 3 ,
|
.Xr archive_read_extract 3 ,
|
||||||
.Xr archive_read_filter 3 ,
|
.Xr archive_read_filter 3 ,
|
||||||
@ -127,4 +126,5 @@ functions.
|
|||||||
.Xr archive_read_open 3 ,
|
.Xr archive_read_open 3 ,
|
||||||
.Xr archive_read_set_options 3 ,
|
.Xr archive_read_set_options 3 ,
|
||||||
.Xr archive_util 3 ,
|
.Xr archive_util 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
|
@ -99,9 +99,10 @@ following values:
|
|||||||
.Bl -tag -compact -width "indent"
|
.Bl -tag -compact -width "indent"
|
||||||
.It Cm ARCHIVE_READDISK_HONOR_NODUMP
|
.It Cm ARCHIVE_READDISK_HONOR_NODUMP
|
||||||
Skip files and directories with the nodump file attribute (file flag) set.
|
Skip files and directories with the nodump file attribute (file flag) set.
|
||||||
By default, the nodump file atrribute is ignored.
|
By default, the nodump file attribute is ignored.
|
||||||
.It Cm ARCHIVE_READDISK_MAC_COPYFILE
|
.It Cm ARCHIVE_READDISK_MAC_COPYFILE
|
||||||
Mac OS X specific. Read metadata (ACLs and extended attributes) with
|
Mac OS X specific.
|
||||||
|
Read metadata (ACLs and extended attributes) with
|
||||||
.Xr copyfile 3 .
|
.Xr copyfile 3 .
|
||||||
By default, metadata is read using
|
By default, metadata is read using
|
||||||
.Xr copyfile 3 .
|
.Xr copyfile 3 .
|
||||||
@ -120,7 +121,7 @@ or
|
|||||||
for more information on file attributes.
|
for more information on file attributes.
|
||||||
.It Cm ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS
|
.It Cm ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS
|
||||||
Do not traverse mount points.
|
Do not traverse mount points.
|
||||||
By defaut, moint points are traversed.
|
By default, mount points are traversed.
|
||||||
.It Cm ARCHIVE_READDISK_NO_XATTR
|
.It Cm ARCHIVE_READDISK_NO_XATTR
|
||||||
Do not read extended file attributes (xattrs).
|
Do not read extended file attributes (xattrs).
|
||||||
By default, extended file attributes are read from disk.
|
By default, extended file attributes are read from disk.
|
||||||
@ -216,7 +217,7 @@ of some other operation.
|
|||||||
(For example, directory traversal libraries often provide this information.)
|
(For example, directory traversal libraries often provide this information.)
|
||||||
.Pp
|
.Pp
|
||||||
Where necessary, user and group ids are converted to user and group names
|
Where necessary, user and group ids are converted to user and group names
|
||||||
using the currently registered lookup functions above.
|
using the currently-registered lookup functions above.
|
||||||
This affects the file ownership fields and ACL values in the
|
This affects the file ownership fields and ACL values in the
|
||||||
.Tn struct archive_entry
|
.Tn struct archive_entry
|
||||||
object.
|
object.
|
||||||
@ -226,7 +227,7 @@ More information about the
|
|||||||
object and the overall design of the library can be found in the
|
object and the overall design of the library can be found in the
|
||||||
.Xr libarchive 3
|
.Xr libarchive 3
|
||||||
overview.
|
overview.
|
||||||
.Sh EXAMPLE
|
.Sh EXAMPLES
|
||||||
The following illustrates basic usage of the library by
|
The following illustrates basic usage of the library by
|
||||||
showing how to use it to copy an item on disk into an archive.
|
showing how to use it to copy an item on disk into an archive.
|
||||||
.Bd -literal -offset indent
|
.Bd -literal -offset indent
|
||||||
@ -291,11 +292,11 @@ and
|
|||||||
functions.
|
functions.
|
||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
|
.Xr tar 1 ,
|
||||||
.Xr archive_read 3 ,
|
.Xr archive_read 3 ,
|
||||||
.Xr archive_util 3 ,
|
.Xr archive_util 3 ,
|
||||||
.Xr archive_write 3 ,
|
.Xr archive_write 3 ,
|
||||||
.Xr archive_write_disk 3 ,
|
.Xr archive_write_disk 3 ,
|
||||||
.Xr tar 1 ,
|
|
||||||
.Xr libarchive 3
|
.Xr libarchive 3
|
||||||
.Sh HISTORY
|
.Sh HISTORY
|
||||||
The
|
The
|
||||||
|
@ -126,7 +126,6 @@ and
|
|||||||
functions.
|
functions.
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_read 3 ,
|
.Xr archive_read 3 ,
|
||||||
.Xr archive_read_data 3 ,
|
.Xr archive_read_data 3 ,
|
||||||
.Xr archive_read_filter 3 ,
|
.Xr archive_read_filter 3 ,
|
||||||
@ -134,4 +133,5 @@ functions.
|
|||||||
.Xr archive_read_open 3 ,
|
.Xr archive_read_open 3 ,
|
||||||
.Xr archive_read_set_options 3 ,
|
.Xr archive_read_set_options 3 ,
|
||||||
.Xr archive_util 3 ,
|
.Xr archive_util 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
|
@ -147,8 +147,8 @@ and
|
|||||||
functions.
|
functions.
|
||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_read 3 ,
|
.Xr archive_read 3 ,
|
||||||
.Xr archive_read_data 3 ,
|
.Xr archive_read_data 3 ,
|
||||||
.Xr archive_read_format 3 ,
|
.Xr archive_read_format 3 ,
|
||||||
.Xr archive_read_format 3
|
.Xr archive_read_format 3 ,
|
||||||
|
.Xr libarchive 3
|
||||||
|
@ -153,11 +153,11 @@ functions.
|
|||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_read_data 3 ,
|
.Xr archive_read_data 3 ,
|
||||||
.Xr archive_read_filter 3 ,
|
.Xr archive_read_filter 3 ,
|
||||||
.Xr archive_read_set_options 3 ,
|
.Xr archive_read_set_options 3 ,
|
||||||
.Xr archive_util 3 ,
|
.Xr archive_util 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
.Sh BUGS
|
.Sh BUGS
|
||||||
Many traditional archiver programs treat
|
Many traditional archiver programs treat
|
||||||
|
@ -83,11 +83,11 @@ and
|
|||||||
functions.
|
functions.
|
||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_read_new 3 ,
|
|
||||||
.Xr archive_read_data 3 ,
|
.Xr archive_read_data 3 ,
|
||||||
.Xr archive_read_filter 3 ,
|
.Xr archive_read_filter 3 ,
|
||||||
.Xr archive_read_format 3 ,
|
.Xr archive_read_format 3 ,
|
||||||
|
.Xr archive_read_new 3 ,
|
||||||
.Xr archive_read_open 3 ,
|
.Xr archive_read_open 3 ,
|
||||||
.Xr archive_read_set_options 3 ,
|
.Xr archive_read_set_options 3 ,
|
||||||
.Xr archive_util 3
|
.Xr archive_util 3 ,
|
||||||
|
.Xr libarchive 3
|
||||||
|
@ -79,7 +79,6 @@ functions.
|
|||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_read 3 ,
|
.Xr archive_read 3 ,
|
||||||
.Xr archive_read_data 3 ,
|
.Xr archive_read_data 3 ,
|
||||||
.Xr archive_read_extract 3 ,
|
.Xr archive_read_extract 3 ,
|
||||||
@ -88,4 +87,5 @@ functions.
|
|||||||
.Xr archive_read_open 3 ,
|
.Xr archive_read_open 3 ,
|
||||||
.Xr archive_read_set_options 3 ,
|
.Xr archive_read_set_options 3 ,
|
||||||
.Xr archive_util 3 ,
|
.Xr archive_util 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
|
@ -50,10 +50,10 @@ object can be found in the overview manual page for
|
|||||||
.\" .Sh ERRORS
|
.\" .Sh ERRORS
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_read_data 3 ,
|
.Xr archive_read_data 3 ,
|
||||||
.Xr archive_read_filter 3 ,
|
.Xr archive_read_filter 3 ,
|
||||||
.Xr archive_read_format 3 ,
|
.Xr archive_read_format 3 ,
|
||||||
.Xr archive_read_set_options 3 ,
|
.Xr archive_read_set_options 3 ,
|
||||||
.Xr archive_util 3 ,
|
.Xr archive_util 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
|
@ -205,7 +205,7 @@ On failure, the callback should invoke
|
|||||||
.Fn archive_set_error
|
.Fn archive_set_error
|
||||||
to register an error code and message and
|
to register an error code and message and
|
||||||
return
|
return
|
||||||
.Cm ARCHIVE_FATAL.
|
.Cm ARCHIVE_FATAL .
|
||||||
.\" .Sh EXAMPLE
|
.\" .Sh EXAMPLE
|
||||||
.\"
|
.\"
|
||||||
.Sh RETURN VALUES
|
.Sh RETURN VALUES
|
||||||
@ -223,11 +223,11 @@ functions.
|
|||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_read 3 ,
|
.Xr archive_read 3 ,
|
||||||
.Xr archive_read_data 3 ,
|
.Xr archive_read_data 3 ,
|
||||||
.Xr archive_read_filter 3 ,
|
.Xr archive_read_filter 3 ,
|
||||||
.Xr archive_read_format 3 ,
|
.Xr archive_read_format 3 ,
|
||||||
.Xr archive_read_set_options 3 ,
|
.Xr archive_read_set_options 3 ,
|
||||||
.Xr archive_util 3 ,
|
.Xr archive_util 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
|
@ -212,7 +212,8 @@ Use
|
|||||||
to disable.
|
to disable.
|
||||||
.It Cm read_concatenated_archives
|
.It Cm read_concatenated_archives
|
||||||
Ignore zeroed blocks in the archive, which occurs when multiple tar archives
|
Ignore zeroed blocks in the archive, which occurs when multiple tar archives
|
||||||
have been concatenated together. Without this option, only the contents of
|
have been concatenated together.
|
||||||
|
Without this option, only the contents of
|
||||||
the first concatenated archive would be read.
|
the first concatenated archive would be read.
|
||||||
.El
|
.El
|
||||||
.El
|
.El
|
||||||
@ -226,6 +227,6 @@ functions.
|
|||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
.Xr archive_read 3 ,
|
||||||
.Xr archive_write_set_options 3 ,
|
.Xr archive_write_set_options 3 ,
|
||||||
.Xr archive_read 3
|
.Xr libarchive 3
|
||||||
|
@ -131,12 +131,20 @@ archive_read_support_filter_gzip(struct archive *_a)
|
|||||||
*/
|
*/
|
||||||
static ssize_t
|
static ssize_t
|
||||||
peek_at_header(struct archive_read_filter *filter, int *pbits,
|
peek_at_header(struct archive_read_filter *filter, int *pbits,
|
||||||
struct private_data *state)
|
#ifdef HAVE_ZLIB_H
|
||||||
|
struct private_data *state
|
||||||
|
#else
|
||||||
|
void *state
|
||||||
|
#endif
|
||||||
|
)
|
||||||
{
|
{
|
||||||
const unsigned char *p;
|
const unsigned char *p;
|
||||||
ssize_t avail, len;
|
ssize_t avail, len;
|
||||||
int bits = 0;
|
int bits = 0;
|
||||||
int header_flags;
|
int header_flags;
|
||||||
|
#ifndef HAVE_ZLIB_H
|
||||||
|
(void)state; /* UNUSED */
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Start by looking at the first ten bytes of the header, which
|
/* Start by looking at the first ten bytes of the header, which
|
||||||
* is all fixed layout. */
|
* is all fixed layout. */
|
||||||
@ -153,8 +161,10 @@ peek_at_header(struct archive_read_filter *filter, int *pbits,
|
|||||||
bits += 3;
|
bits += 3;
|
||||||
header_flags = p[3];
|
header_flags = p[3];
|
||||||
/* Bytes 4-7 are mod time in little endian. */
|
/* Bytes 4-7 are mod time in little endian. */
|
||||||
|
#ifdef HAVE_ZLIB_H
|
||||||
if (state)
|
if (state)
|
||||||
state->mtime = archive_le32dec(p + 4);
|
state->mtime = archive_le32dec(p + 4);
|
||||||
|
#endif
|
||||||
/* Byte 8 is deflate flags. */
|
/* Byte 8 is deflate flags. */
|
||||||
/* XXXX TODO: return deflate flags back to consume_header for use
|
/* XXXX TODO: return deflate flags back to consume_header for use
|
||||||
in initializing the decompressor. */
|
in initializing the decompressor. */
|
||||||
@ -171,7 +181,9 @@ peek_at_header(struct archive_read_filter *filter, int *pbits,
|
|||||||
|
|
||||||
/* Null-terminated optional filename. */
|
/* Null-terminated optional filename. */
|
||||||
if (header_flags & 8) {
|
if (header_flags & 8) {
|
||||||
|
#ifdef HAVE_ZLIB_H
|
||||||
ssize_t file_start = len;
|
ssize_t file_start = len;
|
||||||
|
#endif
|
||||||
do {
|
do {
|
||||||
++len;
|
++len;
|
||||||
if (avail < len)
|
if (avail < len)
|
||||||
@ -181,11 +193,13 @@ peek_at_header(struct archive_read_filter *filter, int *pbits,
|
|||||||
return (0);
|
return (0);
|
||||||
} while (p[len - 1] != 0);
|
} while (p[len - 1] != 0);
|
||||||
|
|
||||||
|
#ifdef HAVE_ZLIB_H
|
||||||
if (state) {
|
if (state) {
|
||||||
/* Reset the name in case of repeat header reads. */
|
/* Reset the name in case of repeat header reads. */
|
||||||
free(state->name);
|
free(state->name);
|
||||||
state->name = strdup((const char *)&p[file_start]);
|
state->name = strdup((const char *)&p[file_start]);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Null-terminated optional comment. */
|
/* Null-terminated optional comment. */
|
||||||
@ -236,24 +250,6 @@ gzip_bidder_bid(struct archive_read_filter_bidder *self,
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
gzip_read_header(struct archive_read_filter *self, struct archive_entry *entry)
|
|
||||||
{
|
|
||||||
struct private_data *state;
|
|
||||||
|
|
||||||
state = (struct private_data *)self->data;
|
|
||||||
|
|
||||||
/* A mtime of 0 is considered invalid/missing. */
|
|
||||||
if (state->mtime != 0)
|
|
||||||
archive_entry_set_mtime(entry, state->mtime, 0);
|
|
||||||
|
|
||||||
/* If the name is available, extract it. */
|
|
||||||
if (state->name)
|
|
||||||
archive_entry_set_pathname(entry, state->name);
|
|
||||||
|
|
||||||
return (ARCHIVE_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef HAVE_ZLIB_H
|
#ifndef HAVE_ZLIB_H
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -277,6 +273,24 @@ gzip_bidder_init(struct archive_read_filter *self)
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
static int
|
||||||
|
gzip_read_header(struct archive_read_filter *self, struct archive_entry *entry)
|
||||||
|
{
|
||||||
|
struct private_data *state;
|
||||||
|
|
||||||
|
state = (struct private_data *)self->data;
|
||||||
|
|
||||||
|
/* A mtime of 0 is considered invalid/missing. */
|
||||||
|
if (state->mtime != 0)
|
||||||
|
archive_entry_set_mtime(entry, state->mtime, 0);
|
||||||
|
|
||||||
|
/* If the name is available, extract it. */
|
||||||
|
if (state->name)
|
||||||
|
archive_entry_set_pathname(entry, state->name);
|
||||||
|
|
||||||
|
return (ARCHIVE_OK);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize the filter object.
|
* Initialize the filter object.
|
||||||
*/
|
*/
|
||||||
@ -306,7 +320,9 @@ gzip_bidder_init(struct archive_read_filter *self)
|
|||||||
self->read = gzip_filter_read;
|
self->read = gzip_filter_read;
|
||||||
self->skip = NULL; /* not supported */
|
self->skip = NULL; /* not supported */
|
||||||
self->close = gzip_filter_close;
|
self->close = gzip_filter_close;
|
||||||
|
#ifdef HAVE_ZLIB_H
|
||||||
self->read_header = gzip_read_header;
|
self->read_header = gzip_read_header;
|
||||||
|
#endif
|
||||||
|
|
||||||
state->in_stream = 0; /* We're not actually within a stream yet. */
|
state->in_stream = 0; /* We're not actually within a stream yet. */
|
||||||
|
|
||||||
|
@ -460,7 +460,7 @@ lz4_filter_read_descriptor(struct archive_read_filter *self)
|
|||||||
|
|
||||||
__archive_read_filter_consume(self->upstream, descriptor_bytes);
|
__archive_read_filter_consume(self->upstream, descriptor_bytes);
|
||||||
|
|
||||||
/* Make sure we have an enough buffer for uncompressed data. */
|
/* Make sure we have a large enough buffer for uncompressed data. */
|
||||||
if (lz4_allocate_out_block(self) != ARCHIVE_OK)
|
if (lz4_allocate_out_block(self) != ARCHIVE_OK)
|
||||||
return (ARCHIVE_FATAL);
|
return (ARCHIVE_FATAL);
|
||||||
if (state->flags.stream_checksum)
|
if (state->flags.stream_checksum)
|
||||||
@ -520,7 +520,7 @@ lz4_filter_read_data_block(struct archive_read_filter *self, const void **p)
|
|||||||
if (read_buf == NULL)
|
if (read_buf == NULL)
|
||||||
goto truncated_error;
|
goto truncated_error;
|
||||||
|
|
||||||
/* Optional process, checking a block sum. */
|
/* Optional processing, checking a block sum. */
|
||||||
if (checksum_size) {
|
if (checksum_size) {
|
||||||
unsigned int chsum = __archive_xxhash.XXH32(
|
unsigned int chsum = __archive_xxhash.XXH32(
|
||||||
read_buf + 4, (int)compressed_size, 0);
|
read_buf + 4, (int)compressed_size, 0);
|
||||||
@ -640,7 +640,7 @@ lz4_filter_read_default_stream(struct archive_read_filter *self, const void **p)
|
|||||||
if (ret == 0 && *p == NULL)
|
if (ret == 0 && *p == NULL)
|
||||||
state->stage = SELECT_STREAM;
|
state->stage = SELECT_STREAM;
|
||||||
|
|
||||||
/* Optional process, checking a stream sum. */
|
/* Optional processing, checking a stream sum. */
|
||||||
if (state->flags.stream_checksum) {
|
if (state->flags.stream_checksum) {
|
||||||
if (state->stage == SELECT_STREAM) {
|
if (state->stage == SELECT_STREAM) {
|
||||||
unsigned int checksum;
|
unsigned int checksum;
|
||||||
@ -660,7 +660,7 @@ lz4_filter_read_default_stream(struct archive_read_filter *self, const void **p)
|
|||||||
if (checksum != checksum_stream) {
|
if (checksum != checksum_stream) {
|
||||||
archive_set_error(&self->archive->archive,
|
archive_set_error(&self->archive->archive,
|
||||||
ARCHIVE_ERRNO_MISC,
|
ARCHIVE_ERRNO_MISC,
|
||||||
"lz4 stream cheksum error");
|
"lz4 stream checksum error");
|
||||||
return (ARCHIVE_FATAL);
|
return (ARCHIVE_FATAL);
|
||||||
}
|
}
|
||||||
} else if (ret > 0)
|
} else if (ret > 0)
|
||||||
@ -674,7 +674,7 @@ static ssize_t
|
|||||||
lz4_filter_read_legacy_stream(struct archive_read_filter *self, const void **p)
|
lz4_filter_read_legacy_stream(struct archive_read_filter *self, const void **p)
|
||||||
{
|
{
|
||||||
struct private_data *state = (struct private_data *)self->data;
|
struct private_data *state = (struct private_data *)self->data;
|
||||||
int compressed;
|
uint32_t compressed;
|
||||||
const char *read_buf;
|
const char *read_buf;
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
|
|
||||||
|
@ -487,7 +487,7 @@ process_extra(struct archive_read *a, struct archive_entry *entry,
|
|||||||
/* Some ZIP files may have trailing 0 bytes. Let's check they
|
/* Some ZIP files may have trailing 0 bytes. Let's check they
|
||||||
* are all 0 and ignore them instead of returning an error.
|
* are all 0 and ignore them instead of returning an error.
|
||||||
*
|
*
|
||||||
* This is not techincally correct, but some ZIP files look
|
* This is not technically correct, but some ZIP files look
|
||||||
* like this and other tools support those files - so let's
|
* like this and other tools support those files - so let's
|
||||||
* also support them.
|
* also support them.
|
||||||
*/
|
*/
|
||||||
@ -1053,7 +1053,7 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry,
|
|||||||
|
|
||||||
/* Make sure that entries with a trailing '/' are marked as directories
|
/* Make sure that entries with a trailing '/' are marked as directories
|
||||||
* even if the External File Attributes contains bogus values. If this
|
* even if the External File Attributes contains bogus values. If this
|
||||||
* is not a directory and there is no type, assume regularfile. */
|
* is not a directory and there is no type, assume a regular file. */
|
||||||
if ((zip_entry->mode & AE_IFMT) != AE_IFDIR) {
|
if ((zip_entry->mode & AE_IFMT) != AE_IFDIR) {
|
||||||
int has_slash;
|
int has_slash;
|
||||||
|
|
||||||
@ -1104,7 +1104,7 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (zip_entry->flags & LA_FROM_CENTRAL_DIRECTORY) {
|
if (zip_entry->flags & LA_FROM_CENTRAL_DIRECTORY) {
|
||||||
/* If this came from the central dir, it's size info
|
/* If this came from the central dir, its size info
|
||||||
* is definitive, so ignore the length-at-end flag. */
|
* is definitive, so ignore the length-at-end flag. */
|
||||||
zip_entry->zip_flags &= ~ZIP_LENGTH_AT_END;
|
zip_entry->zip_flags &= ~ZIP_LENGTH_AT_END;
|
||||||
/* If local header is missing a value, use the one from
|
/* If local header is missing a value, use the one from
|
||||||
|
@ -458,7 +458,7 @@ archive_wstring_append_from_mbs_in_codepage(struct archive_wstring *dest,
|
|||||||
|
|
||||||
if (from_cp == CP_C_LOCALE) {
|
if (from_cp == CP_C_LOCALE) {
|
||||||
/*
|
/*
|
||||||
* "C" locale special process.
|
* "C" locale special processing.
|
||||||
*/
|
*/
|
||||||
wchar_t *ws;
|
wchar_t *ws;
|
||||||
const unsigned char *mp;
|
const unsigned char *mp;
|
||||||
@ -680,7 +680,7 @@ archive_string_append_from_wcs_in_codepage(struct archive_string *as,
|
|||||||
|
|
||||||
if (to_cp == CP_C_LOCALE) {
|
if (to_cp == CP_C_LOCALE) {
|
||||||
/*
|
/*
|
||||||
* "C" locale special process.
|
* "C" locale special processing.
|
||||||
*/
|
*/
|
||||||
const wchar_t *wp = ws;
|
const wchar_t *wp = ws;
|
||||||
char *p;
|
char *p;
|
||||||
@ -889,7 +889,7 @@ add_converter(struct archive_string_conv *sc, int (*converter)
|
|||||||
struct archive_string_conv *))
|
struct archive_string_conv *))
|
||||||
{
|
{
|
||||||
if (sc == NULL || sc->nconverter >= 2)
|
if (sc == NULL || sc->nconverter >= 2)
|
||||||
__archive_errx(1, "Programing error");
|
__archive_errx(1, "Programming error");
|
||||||
sc->converter[sc->nconverter++] = converter;
|
sc->converter[sc->nconverter++] = converter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,10 +92,10 @@ Clears any error information left over from a previous call.
|
|||||||
Not generally used in client code.
|
Not generally used in client code.
|
||||||
.It Fn archive_compression
|
.It Fn archive_compression
|
||||||
Synonym for
|
Synonym for
|
||||||
.Fn archive_filter_code(a, 0) .
|
.Fn archive_filter_code a 0 .
|
||||||
.It Fn archive_compression_name
|
.It Fn archive_compression_name
|
||||||
Synonym for
|
Synonym for
|
||||||
.Fn archive_filter_name(a, 0) .
|
.Fn archive_filter_name a 0 .
|
||||||
.It Fn archive_copy_error
|
.It Fn archive_copy_error
|
||||||
Copies error information from one archive to another.
|
Copies error information from one archive to another.
|
||||||
.It Fn archive_errno
|
.It Fn archive_errno
|
||||||
@ -142,13 +142,13 @@ filter 0 is the gunzip filter,
|
|||||||
filter 1 is the uudecode filter,
|
filter 1 is the uudecode filter,
|
||||||
and filter 2 is the pseudo-filter that wraps the archive read functions.
|
and filter 2 is the pseudo-filter that wraps the archive read functions.
|
||||||
In this case, requesting
|
In this case, requesting
|
||||||
.Fn archive_position(a, -1)
|
.Fn archive_position a -1
|
||||||
would be a synonym for
|
would be a synonym for
|
||||||
.Fn archive_position(a, 2)
|
.Fn archive_position a 2
|
||||||
which would return the number of bytes currently read from the archive, while
|
which would return the number of bytes currently read from the archive, while
|
||||||
.Fn archive_position(a, 1)
|
.Fn archive_position a 1
|
||||||
would return the number of bytes after uudecoding, and
|
would return the number of bytes after uudecoding, and
|
||||||
.Fn archive_position(a, 0)
|
.Fn archive_position a 0
|
||||||
would return the number of bytes after decompression.
|
would return the number of bytes after decompression.
|
||||||
.It Fn archive_filter_name
|
.It Fn archive_filter_name
|
||||||
Returns a textual name identifying the indicated filter.
|
Returns a textual name identifying the indicated filter.
|
||||||
@ -170,9 +170,9 @@ A textual description of the format of the current entry.
|
|||||||
.It Fn archive_position
|
.It Fn archive_position
|
||||||
Returns the number of bytes read from or written to the indicated filter.
|
Returns the number of bytes read from or written to the indicated filter.
|
||||||
In particular,
|
In particular,
|
||||||
.Fn archive_position(a, 0)
|
.Fn archive_position a 0
|
||||||
returns the number of bytes read or written by the format handler, while
|
returns the number of bytes read or written by the format handler, while
|
||||||
.Fn archive_position(a, -1)
|
.Fn archive_position a -1
|
||||||
returns the number of bytes read or written to the archive.
|
returns the number of bytes read or written to the archive.
|
||||||
See
|
See
|
||||||
.Fn archive_filter_count
|
.Fn archive_filter_count
|
||||||
|
@ -118,7 +118,7 @@ After all entries have been written, use the
|
|||||||
.Fn archive_write_free
|
.Fn archive_write_free
|
||||||
function to release all resources.
|
function to release all resources.
|
||||||
.\"
|
.\"
|
||||||
.Sh EXAMPLE
|
.Sh EXAMPLES
|
||||||
The following sketch illustrates basic usage of the library.
|
The following sketch illustrates basic usage of the library.
|
||||||
In this example,
|
In this example,
|
||||||
the callback functions are simply wrappers around the standard
|
the callback functions are simply wrappers around the standard
|
||||||
@ -225,8 +225,8 @@ int main(int argc, const char **argv)
|
|||||||
.Ed
|
.Ed
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_write_set_options 3 ,
|
.Xr archive_write_set_options 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr cpio 5 ,
|
.Xr cpio 5 ,
|
||||||
.Xr mtree 5 ,
|
.Xr mtree 5 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
|
@ -107,8 +107,8 @@ functions.
|
|||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_write_set_options 3 ,
|
.Xr archive_write_set_options 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr cpio 5 ,
|
.Xr cpio 5 ,
|
||||||
.Xr mtree 5 ,
|
.Xr mtree 5 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
|
@ -82,9 +82,9 @@ and consider any non-negative value as success.
|
|||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_write_finish_entry 3 ,
|
.Xr archive_write_finish_entry 3 ,
|
||||||
.Xr archive_write_set_options 3 ,
|
.Xr archive_write_set_options 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr cpio 5 ,
|
.Xr cpio 5 ,
|
||||||
.Xr mtree 5 ,
|
.Xr mtree 5 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
|
@ -113,7 +113,8 @@ or
|
|||||||
.Pq FreeBSD, Mac OS X
|
.Pq FreeBSD, Mac OS X
|
||||||
for more information on file attributes.
|
for more information on file attributes.
|
||||||
.It Cm ARCHIVE_EXTRACT_MAC_METADATA
|
.It Cm ARCHIVE_EXTRACT_MAC_METADATA
|
||||||
Mac OS X specific. Restore metadata using
|
Mac OS X specific.
|
||||||
|
Restore metadata using
|
||||||
.Xr copyfile 3 .
|
.Xr copyfile 3 .
|
||||||
By default,
|
By default,
|
||||||
.Xr copyfile 3
|
.Xr copyfile 3
|
||||||
@ -264,9 +265,9 @@ and
|
|||||||
functions.
|
functions.
|
||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
|
.Xr tar 1 ,
|
||||||
.Xr archive_read 3 ,
|
.Xr archive_read 3 ,
|
||||||
.Xr archive_write 3 ,
|
.Xr archive_write 3 ,
|
||||||
.Xr tar 1 ,
|
|
||||||
.Xr libarchive 3
|
.Xr libarchive 3
|
||||||
.Sh HISTORY
|
.Sh HISTORY
|
||||||
The
|
The
|
||||||
|
@ -431,7 +431,7 @@ la_opendirat(int fd, const char *path) {
|
|||||||
errno = ENOTSUP;
|
errno = ENOTSUP;
|
||||||
return (-1);
|
return (-1);
|
||||||
} else
|
} else
|
||||||
return (open(fd, path, flags));
|
return (open(path, flags));
|
||||||
#else
|
#else
|
||||||
return (openat(fd, path, flags));
|
return (openat(fd, path, flags));
|
||||||
#endif
|
#endif
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
.Nm archive_write_add_filter_program ,
|
.Nm archive_write_add_filter_program ,
|
||||||
.Nm archive_write_add_filter_uuencode ,
|
.Nm archive_write_add_filter_uuencode ,
|
||||||
.Nm archive_write_add_filter_xz ,
|
.Nm archive_write_add_filter_xz ,
|
||||||
.Nm archive_write_add_filter_zstd ,
|
.Nm archive_write_add_filter_zstd
|
||||||
.Nd functions enabling output filters
|
.Nd functions enabling output filters
|
||||||
.Sh LIBRARY
|
.Sh LIBRARY
|
||||||
Streaming Archive Library (libarchive, -larchive)
|
Streaming Archive Library (libarchive, -larchive)
|
||||||
@ -125,10 +125,10 @@ functions.
|
|||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_write 3 ,
|
.Xr archive_write 3 ,
|
||||||
.Xr archive_write_format 3 ,
|
.Xr archive_write_format 3 ,
|
||||||
.Xr archive_write_set_options 3 ,
|
.Xr archive_write_set_options 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr cpio 5 ,
|
.Xr cpio 5 ,
|
||||||
.Xr mtree 5 ,
|
.Xr mtree 5 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
|
@ -71,9 +71,9 @@ functions.
|
|||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_write_data 3 ,
|
.Xr archive_write_data 3 ,
|
||||||
.Xr archive_write_set_options 3 ,
|
.Xr archive_write_set_options 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr cpio 5 ,
|
.Xr cpio 5 ,
|
||||||
.Xr mtree 5 ,
|
.Xr mtree 5 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
|
@ -52,7 +52,7 @@
|
|||||||
.Nm archive_write_set_format_v7tar ,
|
.Nm archive_write_set_format_v7tar ,
|
||||||
.Nm archive_write_set_format_warc ,
|
.Nm archive_write_set_format_warc ,
|
||||||
.Nm archive_write_set_format_xar ,
|
.Nm archive_write_set_format_xar ,
|
||||||
.Nm archive_write_set_format_zip ,
|
.Nm archive_write_set_format_zip
|
||||||
.Nd functions for creating archives
|
.Nd functions for creating archives
|
||||||
.Sh LIBRARY
|
.Sh LIBRARY
|
||||||
Streaming Archive Library (libarchive, -larchive)
|
Streaming Archive Library (libarchive, -larchive)
|
||||||
@ -166,9 +166,9 @@ functions.
|
|||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_write 3 ,
|
.Xr archive_write 3 ,
|
||||||
.Xr archive_write_set_options 3 ,
|
.Xr archive_write_set_options 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr cpio 5 ,
|
.Xr cpio 5 ,
|
||||||
.Xr libarchive-formats 5 ,
|
.Xr libarchive-formats 5 ,
|
||||||
.Xr mtree 5 ,
|
.Xr mtree 5 ,
|
||||||
|
@ -89,8 +89,8 @@ functions.
|
|||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_write_set_options 3 ,
|
.Xr archive_write_set_options 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr cpio 5 ,
|
.Xr cpio 5 ,
|
||||||
.Xr mtree 5 ,
|
.Xr mtree 5 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
|
@ -66,8 +66,8 @@ functions.
|
|||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_write_set_options 3 ,
|
.Xr archive_write_set_options 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr cpio 5 ,
|
.Xr cpio 5 ,
|
||||||
.Xr mtree 5 ,
|
.Xr mtree 5 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
|
@ -50,9 +50,9 @@ object can be found in the overview manual page for
|
|||||||
.\" .Sh ERRORS
|
.\" .Sh ERRORS
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_write 3 ,
|
.Xr archive_write 3 ,
|
||||||
.Xr archive_write_set_options 3 ,
|
.Xr archive_write_set_options 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr cpio 5 ,
|
.Xr cpio 5 ,
|
||||||
.Xr mtree 5 ,
|
.Xr mtree 5 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
|
@ -200,7 +200,7 @@ On failure, the callback should invoke
|
|||||||
.Fn archive_set_error
|
.Fn archive_set_error
|
||||||
to register an error code and message and
|
to register an error code and message and
|
||||||
return
|
return
|
||||||
.Cm ARCHIVE_FATAL.
|
.Cm ARCHIVE_FATAL .
|
||||||
.Pp
|
.Pp
|
||||||
Note that if the client-provided write callback function
|
Note that if the client-provided write callback function
|
||||||
returns a non-zero value, that error will be propagated back to the caller
|
returns a non-zero value, that error will be propagated back to the caller
|
||||||
@ -234,13 +234,13 @@ functions.
|
|||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_write 3 ,
|
.Xr archive_write 3 ,
|
||||||
.Xr archive_write_blocksize 3 ,
|
.Xr archive_write_blocksize 3 ,
|
||||||
.Xr archive_write_filter 3 ,
|
.Xr archive_write_filter 3 ,
|
||||||
.Xr archive_write_format 3 ,
|
.Xr archive_write_format 3 ,
|
||||||
.Xr archive_write_new 3 ,
|
.Xr archive_write_new 3 ,
|
||||||
.Xr archive_write_set_options 3 ,
|
.Xr archive_write_set_options 3 ,
|
||||||
|
.Xr libarchive 3 ,
|
||||||
.Xr cpio 5 ,
|
.Xr cpio 5 ,
|
||||||
.Xr mtree 5 ,
|
.Xr mtree 5 ,
|
||||||
.Xr tar 5
|
.Xr tar 5
|
||||||
|
@ -3650,7 +3650,7 @@ wb_consume(struct archive_write *a, size_t size)
|
|||||||
if (size > iso9660->wbuff_remaining ||
|
if (size > iso9660->wbuff_remaining ||
|
||||||
iso9660->wbuff_remaining == 0) {
|
iso9660->wbuff_remaining == 0) {
|
||||||
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
|
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
|
||||||
"Internal Programing error: iso9660:wb_consume()"
|
"Internal Programming error: iso9660:wb_consume()"
|
||||||
" size=%jd, wbuff_remaining=%jd",
|
" size=%jd, wbuff_remaining=%jd",
|
||||||
(intmax_t)size, (intmax_t)iso9660->wbuff_remaining);
|
(intmax_t)size, (intmax_t)iso9660->wbuff_remaining);
|
||||||
return (ARCHIVE_FATAL);
|
return (ARCHIVE_FATAL);
|
||||||
@ -3671,7 +3671,7 @@ wb_set_offset(struct archive_write *a, int64_t off)
|
|||||||
|
|
||||||
if (iso9660->wbuff_type != WB_TO_TEMP) {
|
if (iso9660->wbuff_type != WB_TO_TEMP) {
|
||||||
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
|
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
|
||||||
"Internal Programing error: iso9660:wb_set_offset()");
|
"Internal Programming error: iso9660:wb_set_offset()");
|
||||||
return (ARCHIVE_FATAL);
|
return (ARCHIVE_FATAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8128,7 +8128,7 @@ zisofs_write_to_temp(struct archive_write *a, const void *buff, size_t s)
|
|||||||
{
|
{
|
||||||
(void)buff; /* UNUSED */
|
(void)buff; /* UNUSED */
|
||||||
(void)s; /* UNUSED */
|
(void)s; /* UNUSED */
|
||||||
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Programing error");
|
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Programming error");
|
||||||
return (ARCHIVE_FATAL);
|
return (ARCHIVE_FATAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,7 +186,7 @@ struct mtree_writer {
|
|||||||
#endif
|
#endif
|
||||||
/* Keyword options */
|
/* Keyword options */
|
||||||
int keys;
|
int keys;
|
||||||
#define F_CKSUM 0x00000001 /* check sum */
|
#define F_CKSUM 0x00000001 /* checksum */
|
||||||
#define F_DEV 0x00000002 /* device type */
|
#define F_DEV 0x00000002 /* device type */
|
||||||
#define F_DONE 0x00000004 /* directory done */
|
#define F_DONE 0x00000004 /* directory done */
|
||||||
#define F_FLAGS 0x00000008 /* file flags */
|
#define F_FLAGS 0x00000008 /* file flags */
|
||||||
@ -371,7 +371,7 @@ mtree_quote(struct archive_string *s, const char *str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Indent a line as mtree utility to be readable for people.
|
* Indent a line as the mtree utility does so it is readable for people.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
mtree_indent(struct mtree_writer *mtree)
|
mtree_indent(struct mtree_writer *mtree)
|
||||||
@ -446,8 +446,8 @@ mtree_indent(struct mtree_writer *mtree)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Write /set keyword.
|
* Write /set keyword.
|
||||||
* Set most used value of uid,gid,mode and fflags, which are
|
* Set the most used value of uid, gid, mode and fflags, which are
|
||||||
* collected by attr_counter_set_collect() function.
|
* collected by the attr_counter_set_collect() function.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
write_global(struct mtree_writer *mtree)
|
write_global(struct mtree_writer *mtree)
|
||||||
@ -649,7 +649,7 @@ attr_counter_inc(struct attr_counter **top, struct attr_counter *ac,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Tabulate uid,gid,mode and fflags of a entry in order to be used for /set.
|
* Tabulate uid, gid, mode and fflags of a entry in order to be used for /set.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
attr_counter_set_collect(struct mtree_writer *mtree, struct mtree_entry *me)
|
attr_counter_set_collect(struct mtree_writer *mtree, struct mtree_entry *me)
|
||||||
@ -912,7 +912,7 @@ archive_write_mtree_header(struct archive_write *a,
|
|||||||
|
|
||||||
/* If the current file is a regular file, we have to
|
/* If the current file is a regular file, we have to
|
||||||
* compute the sum of its content.
|
* compute the sum of its content.
|
||||||
* Initialize a bunch of sum check context. */
|
* Initialize a bunch of checksum context. */
|
||||||
if (mtree_entry->reg_info)
|
if (mtree_entry->reg_info)
|
||||||
sum_init(mtree);
|
sum_init(mtree);
|
||||||
|
|
||||||
@ -1265,7 +1265,7 @@ archive_write_mtree_free(struct archive_write *a)
|
|||||||
if (mtree == NULL)
|
if (mtree == NULL)
|
||||||
return (ARCHIVE_OK);
|
return (ARCHIVE_OK);
|
||||||
|
|
||||||
/* Make sure we dot not leave any entries. */
|
/* Make sure we do not leave any entries. */
|
||||||
mtree_entry_register_free(mtree);
|
mtree_entry_register_free(mtree);
|
||||||
archive_string_free(&mtree->cur_dirstr);
|
archive_string_free(&mtree->cur_dirstr);
|
||||||
archive_string_free(&mtree->ebuf);
|
archive_string_free(&mtree->ebuf);
|
||||||
@ -2024,7 +2024,7 @@ mtree_entry_tree_add(struct archive_write *a, struct mtree_entry **filep)
|
|||||||
|
|
||||||
if (file->parentdir.length == 0) {
|
if (file->parentdir.length == 0) {
|
||||||
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
|
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
|
||||||
"Internal programing error "
|
"Internal programming error "
|
||||||
"in generating canonical name for %s",
|
"in generating canonical name for %s",
|
||||||
file->pathname.s);
|
file->pathname.s);
|
||||||
return (ARCHIVE_FAILED);
|
return (ARCHIVE_FAILED);
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd February 2, 2012
|
.Dd July 27, 2019
|
||||||
.Dt ARCHIVE_WRITE_OPTIONS 3
|
.Dt ARCHIVE_WRITE_OPTIONS 3
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -70,7 +70,7 @@ specific write modules.
|
|||||||
.Fn archive_write_set_filter_option ,
|
.Fn archive_write_set_filter_option ,
|
||||||
.Fn archive_write_set_format_option
|
.Fn archive_write_set_format_option
|
||||||
.Xc
|
.Xc
|
||||||
Specifies an option that will be passed to currently-registered
|
Specifies an option that will be passed to the currently-registered
|
||||||
filters (including decompression filters) or format readers.
|
filters (including decompression filters) or format readers.
|
||||||
.Pp
|
.Pp
|
||||||
If
|
If
|
||||||
@ -138,7 +138,7 @@ If either function returns
|
|||||||
.Cm ARCHIVE_FATAL
|
.Cm ARCHIVE_FATAL
|
||||||
will be returned
|
will be returned
|
||||||
immediately.
|
immediately.
|
||||||
Otherwise, greater of the two values will be returned.
|
Otherwise, the greater of the two values will be returned.
|
||||||
.\"
|
.\"
|
||||||
.It Fn archive_write_set_options
|
.It Fn archive_write_set_options
|
||||||
.Ar options
|
.Ar options
|
||||||
@ -203,22 +203,28 @@ These options are used to set standard ISO9660 metadata.
|
|||||||
.Bl -tag -compact -width indent
|
.Bl -tag -compact -width indent
|
||||||
.It Cm abstract-file Ns = Ns Ar filename
|
.It Cm abstract-file Ns = Ns Ar filename
|
||||||
The file with the specified name will be identified in the ISO9660 metadata
|
The file with the specified name will be identified in the ISO9660 metadata
|
||||||
as holding the abstract for this volume. Default: none.
|
as holding the abstract for this volume.
|
||||||
|
Default: none.
|
||||||
.It Cm application-id Ns = Ns Ar filename
|
.It Cm application-id Ns = Ns Ar filename
|
||||||
The file with the specified name will be identified in the ISO9660 metadata
|
The file with the specified name will be identified in the ISO9660 metadata
|
||||||
as holding the application identifier for this volume. Default: none.
|
as holding the application identifier for this volume.
|
||||||
|
Default: none.
|
||||||
.It Cm biblio-file Ns = Ns Ar filename
|
.It Cm biblio-file Ns = Ns Ar filename
|
||||||
The file with the specified name will be identified in the ISO9660 metadata
|
The file with the specified name will be identified in the ISO9660 metadata
|
||||||
as holding the bibliography for this volume. Default: none.
|
as holding the bibliography for this volume.
|
||||||
|
Default: none.
|
||||||
.It Cm copyright-file Ns = Ns Ar filename
|
.It Cm copyright-file Ns = Ns Ar filename
|
||||||
The file with the specified name will be identified in the ISO9660 metadata
|
The file with the specified name will be identified in the ISO9660 metadata
|
||||||
as holding the copyright for this volume. Default: none.
|
as holding the copyright for this volume.
|
||||||
|
Default: none.
|
||||||
.It Cm publisher Ns = Ns Ar filename
|
.It Cm publisher Ns = Ns Ar filename
|
||||||
The file with the specified name will be identified in the ISO9660 metadata
|
The file with the specified name will be identified in the ISO9660 metadata
|
||||||
as holding the publisher information for this volume. Default: none.
|
as holding the publisher information for this volume.
|
||||||
|
Default: none.
|
||||||
.It Cm volume-id Ns = Ns Ar string
|
.It Cm volume-id Ns = Ns Ar string
|
||||||
The specified string will be used as the Volume Identifier in the ISO9660 metadata.
|
The specified string will be used as the Volume Identifier in the ISO9660 metadata.
|
||||||
It is limited to 32 bytes. Default: none.
|
It is limited to 32 bytes.
|
||||||
|
Default: none.
|
||||||
.El
|
.El
|
||||||
.It Format iso9660 - boot support
|
.It Format iso9660 - boot support
|
||||||
These options are used to make an ISO9660 image that can be directly
|
These options are used to make an ISO9660 image that can be directly
|
||||||
@ -266,7 +272,7 @@ If the boot image is exactly 1.2MB, 1.44MB, or 2.88MB, then
|
|||||||
the default is
|
the default is
|
||||||
.Cm fd ,
|
.Cm fd ,
|
||||||
otherwise the default is
|
otherwise the default is
|
||||||
.Cm no-emulation.
|
.Cm no-emulation .
|
||||||
.El
|
.El
|
||||||
.It Format iso9660 - filename and size extensions
|
.It Format iso9660 - filename and size extensions
|
||||||
Various extensions to the base ISO9660 format.
|
Various extensions to the base ISO9660 format.
|
||||||
@ -290,7 +296,7 @@ This does not impact names stored in the Rockridge or Joliet extension area.
|
|||||||
Default: disabled.
|
Default: disabled.
|
||||||
.It Cm allow-period
|
.It Cm allow-period
|
||||||
If enabled, allows filenames to contain trailing period characters, in violation of the ISO9660 specification.
|
If enabled, allows filenames to contain trailing period characters, in violation of the ISO9660 specification.
|
||||||
If disabled,trailing periods will be converted to underscore characters.
|
If disabled, trailing periods will be converted to underscore characters.
|
||||||
This does not impact names stored in the Rockridge or Joliet extension area.
|
This does not impact names stored in the Rockridge or Joliet extension area.
|
||||||
Default: disabled.
|
Default: disabled.
|
||||||
.It Cm allow-pvd-lowercase
|
.It Cm allow-pvd-lowercase
|
||||||
@ -398,6 +404,27 @@ Specifies a filename that should not be compressed when using
|
|||||||
This option can be provided multiple times to suppress compression
|
This option can be provided multiple times to suppress compression
|
||||||
on many files.
|
on many files.
|
||||||
.El
|
.El
|
||||||
|
.It Format 7zip
|
||||||
|
.Bl -tag -compact -width indent
|
||||||
|
.It Cm compression
|
||||||
|
The value is one of
|
||||||
|
.Dq store ,
|
||||||
|
.Dq deflate ,
|
||||||
|
.Dq bzip2 ,
|
||||||
|
.Dq lzma1 ,
|
||||||
|
.Dq lzma2
|
||||||
|
or
|
||||||
|
.Dq ppmd
|
||||||
|
to indicate how the following entries should be compressed.
|
||||||
|
Note that this setting is ignored for directories, symbolic links,
|
||||||
|
and other special entries.
|
||||||
|
.It Cm compression-level
|
||||||
|
The value is interpreted as a decimal integer specifying the
|
||||||
|
compression level.
|
||||||
|
Values between 0 and 9 are supported.
|
||||||
|
The interpretation of the compression level depends on the chosen
|
||||||
|
compression method.
|
||||||
|
.El
|
||||||
.It Format zip
|
.It Format zip
|
||||||
.Bl -tag -compact -width indent
|
.Bl -tag -compact -width indent
|
||||||
.It Cm compression
|
.It Cm compression
|
||||||
@ -408,6 +435,15 @@ or
|
|||||||
to indicate how the following entries should be compressed.
|
to indicate how the following entries should be compressed.
|
||||||
Note that this setting is ignored for directories, symbolic links,
|
Note that this setting is ignored for directories, symbolic links,
|
||||||
and other special entries.
|
and other special entries.
|
||||||
|
.It Cm compression-level
|
||||||
|
The value is interpreted as a decimal integer specifying the
|
||||||
|
compression level.
|
||||||
|
Values between 0 and 9 are supported.
|
||||||
|
A compression level of 0 switches the compression method to
|
||||||
|
.Dq store ,
|
||||||
|
other values will enable
|
||||||
|
.Dq deflate
|
||||||
|
compression with the given level.
|
||||||
.It Cm experimental
|
.It Cm experimental
|
||||||
This boolean option enables or disables experimental Zip features
|
This boolean option enables or disables experimental Zip features
|
||||||
that may not be compatible with other Zip implementations.
|
that may not be compatible with other Zip implementations.
|
||||||
@ -465,9 +501,9 @@ functions.
|
|||||||
.\"
|
.\"
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_read_set_options 3 ,
|
.Xr archive_read_set_options 3 ,
|
||||||
.Xr archive_write 3
|
.Xr archive_write 3 ,
|
||||||
|
.Xr libarchive 3
|
||||||
.Sh HISTORY
|
.Sh HISTORY
|
||||||
The
|
The
|
||||||
.Nm libarchive
|
.Nm libarchive
|
||||||
|
@ -49,7 +49,7 @@ Streaming Archive Library (libarchive, -larchive)
|
|||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
.It Fn archive_write_set_passphrase
|
.It Fn archive_write_set_passphrase
|
||||||
Set a passphrase for writing an encryption archive.
|
Set a passphrase for writing an encrypted archive.
|
||||||
If
|
If
|
||||||
.Ar passphrase
|
.Ar passphrase
|
||||||
is
|
is
|
||||||
@ -61,14 +61,14 @@ Otherwise,
|
|||||||
.Cm ARCHIVE_OK
|
.Cm ARCHIVE_OK
|
||||||
will be returned.
|
will be returned.
|
||||||
.It Fn archive_write_set_passphrase_callback
|
.It Fn archive_write_set_passphrase_callback
|
||||||
Register callback function that will be invoked to get a passphrase
|
Register a callback function that will be invoked to get a passphrase
|
||||||
for encrption if the passphrase was not set by the
|
for encryption if the passphrase was not set by the
|
||||||
.Fn archive_write_set_passphrase
|
.Fn archive_write_set_passphrase
|
||||||
function.
|
function.
|
||||||
.El
|
.El
|
||||||
.\" .Sh ERRORS
|
.\" .Sh ERRORS
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tar 1 ,
|
.Xr tar 1 ,
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_write 3 ,
|
.Xr archive_write 3 ,
|
||||||
.Xr archive_write_set_options 3
|
.Xr archive_write_set_options 3 ,
|
||||||
|
.Xr libarchive 3
|
||||||
|
@ -35,7 +35,6 @@
|
|||||||
This page describes user-visible changes in libarchive3, and lists
|
This page describes user-visible changes in libarchive3, and lists
|
||||||
public functions and other symbols changed, deprecated or removed
|
public functions and other symbols changed, deprecated or removed
|
||||||
in libarchive3, along with their replacements if any.
|
in libarchive3, along with their replacements if any.
|
||||||
.Pp
|
|
||||||
.\"
|
.\"
|
||||||
.Ss Multiple Filters
|
.Ss Multiple Filters
|
||||||
.\"
|
.\"
|
||||||
@ -330,13 +329,13 @@ or
|
|||||||
.Li 10240
|
.Li 10240
|
||||||
.El
|
.El
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr libarchive 3 ,
|
|
||||||
.Xr archive_read 3 ,
|
.Xr archive_read 3 ,
|
||||||
.Xr archive_read_filter 3 ,
|
.Xr archive_read_filter 3 ,
|
||||||
.Xr archive_read_format 3 ,
|
.Xr archive_read_format 3 ,
|
||||||
.Xr archive_read_set_options 3 ,
|
.Xr archive_read_set_options 3 ,
|
||||||
|
.Xr archive_util 3 ,
|
||||||
.Xr archive_write 3 ,
|
.Xr archive_write 3 ,
|
||||||
.Xr archive_write_filter 3 ,
|
.Xr archive_write_filter 3 ,
|
||||||
.Xr archive_write_format 3 ,
|
.Xr archive_write_format 3 ,
|
||||||
.Xr archive_write_set_options 3 ,
|
.Xr archive_write_set_options 3 ,
|
||||||
.Xr archive_util 3
|
.Xr libarchive 3
|
||||||
|
@ -350,8 +350,8 @@ as a dedicated ZIP program.
|
|||||||
.Xr archive_entry 3 ,
|
.Xr archive_entry 3 ,
|
||||||
.Xr archive_read 3 ,
|
.Xr archive_read 3 ,
|
||||||
.Xr archive_write 3 ,
|
.Xr archive_write 3 ,
|
||||||
.Xr archive_write_disk 3
|
.Xr archive_write_disk 3 ,
|
||||||
.Xr libarchive 3 ,
|
.Xr libarchive 3
|
||||||
.Sh HISTORY
|
.Sh HISTORY
|
||||||
The
|
The
|
||||||
.Nm libarchive
|
.Nm libarchive
|
||||||
|
@ -441,7 +441,7 @@ archives to store files much larger than the historic 8GB limit.
|
|||||||
Vendor-specific attributes used by Joerg Schilling's
|
Vendor-specific attributes used by Joerg Schilling's
|
||||||
.Nm star
|
.Nm star
|
||||||
implementation.
|
implementation.
|
||||||
.It Cm SCHILY.acl.access , Cm SCHILY.acl.default, Cm SCHILY.acl.ace
|
.It Cm SCHILY.acl.access , Cm SCHILY.acl.default , Cm SCHILY.acl.ace
|
||||||
Stores the access, default and NFSv4 ACLs as textual strings in a format
|
Stores the access, default and NFSv4 ACLs as textual strings in a format
|
||||||
that is an extension of the format specified by POSIX.1e draft 17.
|
that is an extension of the format specified by POSIX.1e draft 17.
|
||||||
In particular, each user or group access specification can include
|
In particular, each user or group access specification can include
|
||||||
@ -456,7 +456,7 @@ The file flags.
|
|||||||
.It Cm SCHILY.realsize
|
.It Cm SCHILY.realsize
|
||||||
The full size of the file on disk.
|
The full size of the file on disk.
|
||||||
XXX explain? XXX
|
XXX explain? XXX
|
||||||
.It Cm SCHILY.dev, Cm SCHILY.ino , Cm SCHILY.nlinks
|
.It Cm SCHILY.dev , Cm SCHILY.ino , Cm SCHILY.nlinks
|
||||||
The device number, inode number, and link count for the entry.
|
The device number, inode number, and link count for the entry.
|
||||||
In particular, note that a pax interchange format archive using Joerg
|
In particular, note that a pax interchange format archive using Joerg
|
||||||
Schilling's
|
Schilling's
|
||||||
@ -473,7 +473,7 @@ The time when the file was created.
|
|||||||
.Dq ctime
|
.Dq ctime
|
||||||
attribute, which refers to the time when the file
|
attribute, which refers to the time when the file
|
||||||
metadata was last changed.)
|
metadata was last changed.)
|
||||||
.It Cm LIBARCHIVE.xattr. Ns Ar namespace Ns . Ns Ar key
|
.It Cm LIBARCHIVE.xattr . Ns Ar namespace . Ns Ar key
|
||||||
Libarchive stores POSIX.1e-style extended attributes using
|
Libarchive stores POSIX.1e-style extended attributes using
|
||||||
keys of this form.
|
keys of this form.
|
||||||
The
|
The
|
||||||
@ -890,7 +890,8 @@ GNU tar long pathname for the following header.
|
|||||||
.It Cm M
|
.It Cm M
|
||||||
GNU tar multivolume marker, indicating the file is a continuation of a file from the previous volume.
|
GNU tar multivolume marker, indicating the file is a continuation of a file from the previous volume.
|
||||||
.It Cm N
|
.It Cm N
|
||||||
GNU tar long filename support. Deprecated.
|
GNU tar long filename support.
|
||||||
|
Deprecated.
|
||||||
.It Cm S
|
.It Cm S
|
||||||
GNU tar sparse regular file.
|
GNU tar sparse regular file.
|
||||||
.It Cm V
|
.It Cm V
|
||||||
|
@ -48,7 +48,7 @@ test_filter_by_name(const char *filter_name, int filter_code,
|
|||||||
r = archive_write_add_filter_by_name(a, filter_name);
|
r = archive_write_add_filter_by_name(a, filter_name);
|
||||||
if (r == ARCHIVE_WARN) {
|
if (r == ARCHIVE_WARN) {
|
||||||
if (!can_filter_prog()) {
|
if (!can_filter_prog()) {
|
||||||
skipping("%s filter not suported on this platform",
|
skipping("%s filter not supported on this platform",
|
||||||
filter_name);
|
filter_name);
|
||||||
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
|
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
|
||||||
free(buff);
|
free(buff);
|
||||||
@ -59,7 +59,7 @@ test_filter_by_name(const char *filter_name, int filter_code,
|
|||||||
"lzma compression not supported on this platform") == 0 ||
|
"lzma compression not supported on this platform") == 0 ||
|
||||||
strcmp(archive_error_string(a),
|
strcmp(archive_error_string(a),
|
||||||
"xz compression not supported on this platform") == 0)) {
|
"xz compression not supported on this platform") == 0)) {
|
||||||
skipping("%s filter not suported on this platform", filter_name);
|
skipping("%s filter not supported on this platform", filter_name);
|
||||||
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
|
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
|
||||||
free(buff);
|
free(buff);
|
||||||
return;
|
return;
|
||||||
|
@ -61,7 +61,7 @@ test_format_filter_by_ext(const char *output_file,
|
|||||||
strcmp(archive_error_string(a),
|
strcmp(archive_error_string(a),
|
||||||
"xz compression not supported on this platform") == 0)) {
|
"xz compression not supported on this platform") == 0)) {
|
||||||
const char *filter_name = archive_filter_name(a, 0);
|
const char *filter_name = archive_filter_name(a, 0);
|
||||||
skipping("%s filter not suported on this platform", filter_name);
|
skipping("%s filter not supported on this platform", filter_name);
|
||||||
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
|
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
|
||||||
free(buff);
|
free(buff);
|
||||||
return;
|
return;
|
||||||
|
@ -36,7 +36,9 @@ DEFINE_TEST(test_read_format_raw)
|
|||||||
const char *reffile1 = "test_read_format_raw.data";
|
const char *reffile1 = "test_read_format_raw.data";
|
||||||
const char *reffile2 = "test_read_format_raw.data.Z";
|
const char *reffile2 = "test_read_format_raw.data.Z";
|
||||||
const char *reffile3 = "test_read_format_raw.bufr";
|
const char *reffile3 = "test_read_format_raw.bufr";
|
||||||
|
#ifdef HAVE_ZLIB_H
|
||||||
const char *reffile4 = "test_read_format_raw.data.gz";
|
const char *reffile4 = "test_read_format_raw.data.gz";
|
||||||
|
#endif
|
||||||
|
|
||||||
/* First, try pulling data out of an uninterpretable file. */
|
/* First, try pulling data out of an uninterpretable file. */
|
||||||
extract_reference_file(reffile1);
|
extract_reference_file(reffile1);
|
||||||
@ -119,6 +121,7 @@ DEFINE_TEST(test_read_format_raw)
|
|||||||
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
|
||||||
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
||||||
|
|
||||||
|
#ifdef HAVE_ZLIB_H
|
||||||
/* Fourth, try with gzip which has metadata. */
|
/* Fourth, try with gzip which has metadata. */
|
||||||
extract_reference_file(reffile4);
|
extract_reference_file(reffile4);
|
||||||
assert((a = archive_read_new()) != NULL);
|
assert((a = archive_read_new()) != NULL);
|
||||||
@ -144,4 +147,5 @@ DEFINE_TEST(test_read_format_raw)
|
|||||||
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
||||||
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
|
||||||
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -139,7 +139,7 @@ verify_basic(struct archive *a, int seek_checks)
|
|||||||
} else {
|
} else {
|
||||||
assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19));
|
assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19));
|
||||||
assertEqualString(archive_error_string(a),
|
assertEqualString(archive_error_string(a),
|
||||||
"Unsupported ZIP compression method (deflation)");
|
"Unsupported ZIP compression method (8: deflation)");
|
||||||
assert(archive_errno(a) != 0);
|
assert(archive_errno(a) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,7 +162,7 @@ verify_basic(struct archive *a, int seek_checks)
|
|||||||
} else {
|
} else {
|
||||||
assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19));
|
assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19));
|
||||||
assertEqualString(archive_error_string(a),
|
assertEqualString(archive_error_string(a),
|
||||||
"Unsupported ZIP compression method (deflation)");
|
"Unsupported ZIP compression method (8: deflation)");
|
||||||
assert(archive_errno(a) != 0);
|
assert(archive_errno(a) != 0);
|
||||||
}
|
}
|
||||||
assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
||||||
@ -231,7 +231,7 @@ verify_info_zip_ux(struct archive *a, int seek_checks)
|
|||||||
} else {
|
} else {
|
||||||
assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19));
|
assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19));
|
||||||
assertEqualString(archive_error_string(a),
|
assertEqualString(archive_error_string(a),
|
||||||
"Unsupported ZIP compression method (deflation)");
|
"Unsupported ZIP compression method (8: deflation)");
|
||||||
assert(archive_errno(a) != 0);
|
assert(archive_errno(a) != 0);
|
||||||
}
|
}
|
||||||
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
||||||
@ -302,7 +302,7 @@ verify_extract_length_at_end(struct archive *a, int seek_checks)
|
|||||||
} else {
|
} else {
|
||||||
assertEqualIntA(a, ARCHIVE_FAILED, archive_read_extract(a, ae, 0));
|
assertEqualIntA(a, ARCHIVE_FAILED, archive_read_extract(a, ae, 0));
|
||||||
assertEqualString(archive_error_string(a),
|
assertEqualString(archive_error_string(a),
|
||||||
"Unsupported ZIP compression method (deflation)");
|
"Unsupported ZIP compression method (8: deflation)");
|
||||||
assert(archive_errno(a) != 0);
|
assert(archive_errno(a) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ DEFINE_TEST(test_read_format_zip_traditional_encryption_data)
|
|||||||
assertEqualInt(ARCHIVE_FAILED,
|
assertEqualInt(ARCHIVE_FAILED,
|
||||||
archive_read_data(a, buff, sizeof(buff)));
|
archive_read_data(a, buff, sizeof(buff)));
|
||||||
assertEqualString(archive_error_string(a),
|
assertEqualString(archive_error_string(a),
|
||||||
"Unsupported ZIP compression method (deflation)");
|
"Unsupported ZIP compression method (8: deflation)");
|
||||||
assert(archive_errno(a) != 0);
|
assert(archive_errno(a) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,7 +148,7 @@ DEFINE_TEST(test_read_format_zip_traditional_encryption_data)
|
|||||||
assertEqualInt(ARCHIVE_FAILED,
|
assertEqualInt(ARCHIVE_FAILED,
|
||||||
archive_read_data(a, buff, sizeof(buff)));
|
archive_read_data(a, buff, sizeof(buff)));
|
||||||
assertEqualString(archive_error_string(a),
|
assertEqualString(archive_error_string(a),
|
||||||
"Unsupported ZIP compression method (deflation)");
|
"Unsupported ZIP compression method (8: deflation)");
|
||||||
assert(archive_errno(a) != 0);
|
assert(archive_errno(a) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ DEFINE_TEST(test_write_filter_zstd)
|
|||||||
char *buff, *data;
|
char *buff, *data;
|
||||||
size_t buffsize, datasize;
|
size_t buffsize, datasize;
|
||||||
char path[16];
|
char path[16];
|
||||||
size_t used1, used2;
|
size_t used1, used2, used3;
|
||||||
int i, r;
|
int i, r;
|
||||||
|
|
||||||
buffsize = 2000000;
|
buffsize = 2000000;
|
||||||
@ -125,7 +125,7 @@ DEFINE_TEST(test_write_filter_zstd)
|
|||||||
assertEqualIntA(a, ARCHIVE_OK,
|
assertEqualIntA(a, ARCHIVE_OK,
|
||||||
archive_write_set_filter_option(a, NULL, "compression-level", "9"));
|
archive_write_set_filter_option(a, NULL, "compression-level", "9"));
|
||||||
assertEqualIntA(a, ARCHIVE_OK,
|
assertEqualIntA(a, ARCHIVE_OK,
|
||||||
archive_write_set_filter_option(a, NULL, "compression-level", "6"));
|
archive_write_set_filter_option(a, NULL, "compression-level", "7"));
|
||||||
assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2));
|
assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2));
|
||||||
for (i = 0; i < 100; i++) {
|
for (i = 0; i < 100; i++) {
|
||||||
sprintf(path, "file%03d", i);
|
sprintf(path, "file%03d", i);
|
||||||
@ -140,10 +140,6 @@ DEFINE_TEST(test_write_filter_zstd)
|
|||||||
assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
|
assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
|
||||||
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
|
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
|
||||||
|
|
||||||
failure("compression-level=6 wrote %d bytes, default wrote %d bytes",
|
|
||||||
(int)used2, (int)used1);
|
|
||||||
assert(used2 < used1);
|
|
||||||
|
|
||||||
assert((a = archive_read_new()) != NULL);
|
assert((a = archive_read_new()) != NULL);
|
||||||
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
|
||||||
r = archive_read_support_filter_zstd(a);
|
r = archive_read_support_filter_zstd(a);
|
||||||
@ -167,6 +163,64 @@ DEFINE_TEST(test_write_filter_zstd)
|
|||||||
}
|
}
|
||||||
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* One more time at level 1
|
||||||
|
*/
|
||||||
|
assert((a = archive_write_new()) != NULL);
|
||||||
|
assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a));
|
||||||
|
assertEqualIntA(a, ARCHIVE_OK,
|
||||||
|
archive_write_set_bytes_per_block(a, 10));
|
||||||
|
assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_zstd(a));
|
||||||
|
assertEqualIntA(a, ARCHIVE_OK,
|
||||||
|
archive_write_set_filter_option(a, NULL, "compression-level", "1"));
|
||||||
|
assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used3));
|
||||||
|
assert((ae = archive_entry_new()) != NULL);
|
||||||
|
archive_entry_set_filetype(ae, AE_IFREG);
|
||||||
|
archive_entry_set_size(ae, datasize);
|
||||||
|
for (i = 0; i < 100; i++) {
|
||||||
|
sprintf(path, "file%03d", i);
|
||||||
|
archive_entry_copy_pathname(ae, path);
|
||||||
|
assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
|
||||||
|
assertA(datasize == (size_t)archive_write_data(a, data, datasize));
|
||||||
|
}
|
||||||
|
archive_entry_free(ae);
|
||||||
|
assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
|
||||||
|
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
|
||||||
|
|
||||||
|
assert((a = archive_read_new()) != NULL);
|
||||||
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
|
||||||
|
r = archive_read_support_filter_zstd(a);
|
||||||
|
if (r == ARCHIVE_WARN) {
|
||||||
|
skipping("zstd reading not fully supported on this platform");
|
||||||
|
} else {
|
||||||
|
assertEqualIntA(a, ARCHIVE_OK,
|
||||||
|
archive_read_support_filter_all(a));
|
||||||
|
assertEqualIntA(a, ARCHIVE_OK,
|
||||||
|
archive_read_open_memory(a, buff, used3));
|
||||||
|
for (i = 0; i < 100; i++) {
|
||||||
|
sprintf(path, "file%03d", i);
|
||||||
|
failure("Trying to read %s", path);
|
||||||
|
if (!assertEqualIntA(a, ARCHIVE_OK,
|
||||||
|
archive_read_next_header(a, &ae)))
|
||||||
|
break;
|
||||||
|
assertEqualString(path, archive_entry_pathname(ae));
|
||||||
|
assertEqualInt((int)datasize, archive_entry_size(ae));
|
||||||
|
}
|
||||||
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
|
||||||
|
}
|
||||||
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check output sizes for various compression levels, expectation
|
||||||
|
* is that archive size for level=7 < default < level=1
|
||||||
|
*/
|
||||||
|
failure("compression-level=7 wrote %d bytes, default wrote %d bytes",
|
||||||
|
(int)used2, (int)used1);
|
||||||
|
assert(used2 < used1);
|
||||||
|
failure("compression-level=1 wrote %d bytes, default wrote %d bytes",
|
||||||
|
(int)used3, (int)used1);
|
||||||
|
assert(used1 < used3);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Test various premature shutdown scenarios to make sure we
|
* Test various premature shutdown scenarios to make sure we
|
||||||
* don't crash or leak memory.
|
* don't crash or leak memory.
|
||||||
|
@ -167,12 +167,14 @@ if it is unknown suffix or no suffix, creates a new archive with
|
|||||||
restricted pax format and bzip2 compression.
|
restricted pax format and bzip2 compression.
|
||||||
.It Fl Fl acls
|
.It Fl Fl acls
|
||||||
(c, r, u, x modes only)
|
(c, r, u, x modes only)
|
||||||
Archive or extract POSIX.1e or NFSv4 ACLs. This is the reverse of
|
Archive or extract POSIX.1e or NFSv4 ACLs.
|
||||||
|
This is the reverse of
|
||||||
.Fl Fl no-acls
|
.Fl Fl no-acls
|
||||||
and the default behavior in c, r, and u modes (except on Mac OS X) or if
|
and the default behavior in c, r, and u modes (except on Mac OS X) or if
|
||||||
.Nm
|
.Nm
|
||||||
is run in x mode as root. On Mac OS X this option translates extended ACLs
|
is run in x mode as root.
|
||||||
to NFSv4 ACLs. To store extended ACLs the
|
On Mac OS X this option translates extended ACLs to NFSv4 ACLs.
|
||||||
|
To store extended ACLs the
|
||||||
.Fl Fl mac-metadata
|
.Fl Fl mac-metadata
|
||||||
option is preferred.
|
option is preferred.
|
||||||
.It Fl B , Fl Fl read-full-blocks
|
.It Fl B , Fl Fl read-full-blocks
|
||||||
@ -390,10 +392,12 @@ Do not extract modification time.
|
|||||||
By default, the modification time is set to the time stored in the archive.
|
By default, the modification time is set to the time stored in the archive.
|
||||||
.It Fl Fl mac-metadata
|
.It Fl Fl mac-metadata
|
||||||
(c, r, u and x mode only)
|
(c, r, u and x mode only)
|
||||||
Mac OS X specific. Archive or extract extended ACLs and extended file
|
Mac OS X specific.
|
||||||
|
Archive or extract extended ACLs and extended file
|
||||||
attributes using
|
attributes using
|
||||||
.Xr copyfile 3
|
.Xr copyfile 3
|
||||||
in AppleDouble format. This is the reverse of
|
in AppleDouble format.
|
||||||
|
This is the reverse of
|
||||||
.Fl Fl no-mac-metadata .
|
.Fl Fl no-mac-metadata .
|
||||||
and the default behavior in c, r, and u modes or if
|
and the default behavior in c, r, and u modes or if
|
||||||
.Nm
|
.Nm
|
||||||
@ -439,24 +443,28 @@ option to
|
|||||||
.Xr find 1 .
|
.Xr find 1 .
|
||||||
.It Fl Fl no-acls
|
.It Fl Fl no-acls
|
||||||
(c, r, u, x modes only)
|
(c, r, u, x modes only)
|
||||||
Do not archive or extract POSIX.1e or NFSv4 ACLs. This is the reverse of
|
Do not archive or extract POSIX.1e or NFSv4 ACLs.
|
||||||
|
This is the reverse of
|
||||||
.Fl Fl acls
|
.Fl Fl acls
|
||||||
and the default behavior if
|
and the default behavior if
|
||||||
.Nm
|
.Nm
|
||||||
is run as non-root in x mode (on Mac OS X as any user in c, r, u and x modes).
|
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
|
.It Fl Fl no-fflags
|
||||||
(c, r, u, x modes only)
|
(c, r, u, x modes only)
|
||||||
Do not archive or extract file attributes or 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
|
.Fl Fl fflags
|
||||||
and the default behavior if
|
and the default behavior if
|
||||||
.Nm
|
.Nm
|
||||||
is run as non-root in x mode.
|
is run as non-root in x mode.
|
||||||
.It Fl Fl no-mac-metadata
|
.It Fl Fl no-mac-metadata
|
||||||
(x mode only)
|
(x mode only)
|
||||||
Mac OS X specific. Do not archive or extract ACLs and extended file attributes
|
Mac OS X specific.
|
||||||
|
Do not archive or extract ACLs and extended file attributes
|
||||||
using
|
using
|
||||||
.Xr copyfile 3
|
.Xr copyfile 3
|
||||||
in AppleDouble format. This is the reverse of
|
in AppleDouble format.
|
||||||
|
This is the reverse of
|
||||||
.Fl Fl mac-metadata .
|
.Fl Fl mac-metadata .
|
||||||
and the default behavior if
|
and the default behavior if
|
||||||
.Nm
|
.Nm
|
||||||
@ -480,7 +488,8 @@ and the default behavior if
|
|||||||
is run as non-root.
|
is run as non-root.
|
||||||
.It Fl Fl no-xattrs
|
.It Fl Fl no-xattrs
|
||||||
(c, r, u, x modes only)
|
(c, r, u, x modes only)
|
||||||
Do not archive or extract extended file attributes. This is the reverse of
|
Do not archive or extract extended file attributes.
|
||||||
|
This is the reverse of
|
||||||
.Fl Fl xattrs
|
.Fl Fl xattrs
|
||||||
and the default behavior if
|
and the default behavior if
|
||||||
.Nm
|
.Nm
|
||||||
@ -577,7 +586,8 @@ to disable.
|
|||||||
.It Cm gzip:compression-level
|
.It Cm gzip:compression-level
|
||||||
A decimal integer from 1 to 9 specifying the gzip compression level.
|
A decimal integer from 1 to 9 specifying the gzip compression level.
|
||||||
.It Cm gzip:timestamp
|
.It Cm gzip:timestamp
|
||||||
Store timestamp. This is enabled by default, use
|
Store timestamp.
|
||||||
|
This is enabled by default, use
|
||||||
.Cm !timestamp
|
.Cm !timestamp
|
||||||
or
|
or
|
||||||
.Cm gzip:!timestamp
|
.Cm gzip:!timestamp
|
||||||
@ -593,7 +603,8 @@ A decimal integer from 1 to 9 specifying the lrzip compression level.
|
|||||||
.It Cm lz4:compression-level
|
.It Cm lz4:compression-level
|
||||||
A decimal integer from 1 to 9 specifying the lzop compression level.
|
A decimal integer from 1 to 9 specifying the lzop compression level.
|
||||||
.It Cm lz4:stream-checksum
|
.It Cm lz4:stream-checksum
|
||||||
Enable stream checksum. This is by default, use
|
Enable stream checksum.
|
||||||
|
This is by default, use
|
||||||
.Cm lz4:!stream-checksum
|
.Cm lz4:!stream-checksum
|
||||||
to disable.
|
to disable.
|
||||||
.It Cm lz4:block-checksum
|
.It Cm lz4:block-checksum
|
||||||
@ -646,9 +657,10 @@ Supported values are zipcrypt (traditional zip encryption),
|
|||||||
aes128 (WinZip AES-128 encryption) and aes256 (WinZip AES-256 encryption).
|
aes128 (WinZip AES-128 encryption) and aes256 (WinZip AES-256 encryption).
|
||||||
.It Cm read_concatenated_archives
|
.It Cm read_concatenated_archives
|
||||||
Ignore zeroed blocks in the archive, which occurs when multiple tar archives
|
Ignore zeroed blocks in the archive, which occurs when multiple tar archives
|
||||||
have been concatenated together. Without this option, only the contents of
|
have been concatenated together.
|
||||||
the first concatenated archive would be read. This option is comparable to
|
Without this option, only the contents of
|
||||||
the
|
the first concatenated archive would be read.
|
||||||
|
This option is comparable to the
|
||||||
.Fl i , Fl Fl ignore-zeros
|
.Fl i , Fl Fl ignore-zeros
|
||||||
option of GNU tar.
|
option of GNU tar.
|
||||||
.El
|
.El
|
||||||
@ -670,11 +682,13 @@ This option suppresses these behaviors.
|
|||||||
Preserve file permissions.
|
Preserve file permissions.
|
||||||
Attempt to restore the full permissions, including file modes, file attributes
|
Attempt to restore the full permissions, including file modes, file attributes
|
||||||
or file flags, extended file attributes and ACLs, if available, for each item
|
or file flags, extended file attributes and ACLs, if available, for each item
|
||||||
extracted from the archive. This is the reverse of
|
extracted from the archive.
|
||||||
|
This is the reverse of
|
||||||
.Fl Fl no-same-permissions
|
.Fl Fl no-same-permissions
|
||||||
and the default if
|
and the default if
|
||||||
.Nm
|
.Nm
|
||||||
is being run as root. It 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-acls ,
|
||||||
.Fl Fl no-fflags ,
|
.Fl Fl no-fflags ,
|
||||||
.Fl Fl no-mac-metadata
|
.Fl Fl no-mac-metadata
|
||||||
@ -845,7 +859,8 @@ See
|
|||||||
for more information about the handling of exclusions.
|
for more information about the handling of exclusions.
|
||||||
.It Fl Fl xattrs
|
.It Fl Fl xattrs
|
||||||
(c, r, u, x modes only)
|
(c, r, u, x modes only)
|
||||||
Archive or extract extended file attributes. This is the reverse of
|
Archive or extract extended file attributes.
|
||||||
|
This is the reverse of
|
||||||
.Fl Fl no-xattrs
|
.Fl Fl no-xattrs
|
||||||
and the default behavior in c, r, and u modes or if
|
and the default behavior in c, r, and u modes or if
|
||||||
.Nm
|
.Nm
|
||||||
@ -937,9 +952,9 @@ To examine the contents of an ISO 9660 cdrom image:
|
|||||||
To move file hierarchies, invoke
|
To move file hierarchies, invoke
|
||||||
.Nm
|
.Nm
|
||||||
as
|
as
|
||||||
.Dl Nm Fl cf Pa - Fl C Pa srcdir\ . | Nm Fl xpf Pa - Fl C Pa destdir
|
.Dl Nm Fl cf Pa - Fl C Pa srcdir \&. | Nm Fl xpf Pa - Fl C Pa destdir
|
||||||
or more traditionally
|
or more traditionally
|
||||||
.Dl cd srcdir \&; Nm Fl cf Pa -\ . | ( cd destdir \&; Nm Fl xpf Pa - )
|
.Dl cd srcdir \&; Nm Fl cf Pa - \&. | ( cd destdir \&; Nm Fl xpf Pa - )
|
||||||
.Pp
|
.Pp
|
||||||
In create mode, the list of files and directories to be archived
|
In create mode, the list of files and directories to be archived
|
||||||
can also include directory change instructions of the form
|
can also include directory change instructions of the form
|
||||||
@ -967,7 +982,6 @@ An input file in
|
|||||||
.Xr mtree 5
|
.Xr mtree 5
|
||||||
format can be used to create an output archive with arbitrary ownership,
|
format can be used to create an output archive with arbitrary ownership,
|
||||||
permissions, or names that differ from existing data on disk:
|
permissions, or names that differ from existing data on disk:
|
||||||
.Pp
|
|
||||||
.Bd -literal -offset indent
|
.Bd -literal -offset indent
|
||||||
$ cat input.mtree
|
$ cat input.mtree
|
||||||
#mtree
|
#mtree
|
||||||
|
@ -120,7 +120,7 @@ DEFINE_TEST(test_option_n)
|
|||||||
"d2/file4\n",
|
"d2/file4\n",
|
||||||
"test5.out");
|
"test5.out");
|
||||||
|
|
||||||
/* Test 6: -t without -n and non-existant directory selected */
|
/* Test 6: -t without -n and non-existent directory selected */
|
||||||
assertEqualInt(0,
|
assertEqualInt(0,
|
||||||
systemf("%s -tf partial-archive.tar d2 >test6.out 2>test6.err",
|
systemf("%s -tf partial-archive.tar d2 >test6.out 2>test6.err",
|
||||||
testprog));
|
testprog));
|
||||||
@ -128,7 +128,7 @@ DEFINE_TEST(test_option_n)
|
|||||||
assertTextFileContents("d2/file4\n",
|
assertTextFileContents("d2/file4\n",
|
||||||
"test6.out");
|
"test6.out");
|
||||||
|
|
||||||
/* Test 7: -t with -n and non-existant directory selected */
|
/* Test 7: -t with -n and non-existent directory selected */
|
||||||
status = systemf("%s -tnf partial-archive.tar d2 "
|
status = systemf("%s -tnf partial-archive.tar d2 "
|
||||||
">test7.out 2>test7.err", testprog);
|
">test7.out 2>test7.err", testprog);
|
||||||
assert(status);
|
assert(status);
|
||||||
|
@ -28,7 +28,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
DEFINE_TEST(test_option_xattrs)
|
DEFINE_TEST(test_option_xattrs)
|
||||||
{
|
{
|
||||||
#if !ARCHIVE_XATTR_SUPPORT
|
#if !ARCHIVE_XATTR_SUPPORT
|
||||||
skipping("Extended atributes are not supported on this platform");
|
skipping("Extended attributes are not supported on this platform");
|
||||||
#else /* ARCHIVE_XATTR_SUPPORT */
|
#else /* ARCHIVE_XATTR_SUPPORT */
|
||||||
|
|
||||||
const char *testattr = "user.libarchive.test";
|
const char *testattr = "user.libarchive.test";
|
||||||
|
@ -298,7 +298,7 @@ my_CreateSymbolicLinkA(const char *linkname, const char *target,
|
|||||||
ret = (*f)(src, tgt, tmpflags);
|
ret = (*f)(src, tgt, tmpflags);
|
||||||
/*
|
/*
|
||||||
* Prior to Windows 10 the SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE
|
* Prior to Windows 10 the SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE
|
||||||
* is not undestood
|
* is not understood
|
||||||
*/
|
*/
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = (*f)(src, tgt, flags);
|
ret = (*f)(src, tgt, flags);
|
||||||
|
@ -413,6 +413,60 @@ wflag_emptypat_body()
|
|||||||
atf_check -o file:test4 grep -w -e "" test4
|
atf_check -o file:test4 grep -w -e "" test4
|
||||||
}
|
}
|
||||||
|
|
||||||
|
atf_test_case xflag_emptypat
|
||||||
|
xflag_emptypat_body()
|
||||||
|
{
|
||||||
|
printf "" > test1
|
||||||
|
printf "\n" > test2
|
||||||
|
printf "qaz" > test3
|
||||||
|
printf " qaz\n" > test4
|
||||||
|
|
||||||
|
# -x is whole-line, more strict than -w.
|
||||||
|
atf_check -s exit:1 -o empty grep -x -e "" test1
|
||||||
|
|
||||||
|
atf_check -o file:test2 grep -x -e "" test2
|
||||||
|
|
||||||
|
atf_check -s exit:1 -o empty grep -x -e "" test3
|
||||||
|
|
||||||
|
atf_check -s exit:1 -o empty grep -x -e "" test4
|
||||||
|
|
||||||
|
total=$(wc -l /COPYRIGHT | sed 's/[^0-9]//g')
|
||||||
|
|
||||||
|
# Simple checks that grep -x with an empty pattern isn't matching every
|
||||||
|
# line. The exact counts aren't important, as long as they don't
|
||||||
|
# match the total line count and as long as they don't match each other.
|
||||||
|
atf_check -o save:xpositive.count grep -Fxc '' /COPYRIGHT
|
||||||
|
atf_check -o save:xnegative.count grep -Fvxc '' /COPYRIGHT
|
||||||
|
|
||||||
|
atf_check -o not-inline:"${total}" cat xpositive.count
|
||||||
|
atf_check -o not-inline:"${total}" cat xnegative.count
|
||||||
|
|
||||||
|
atf_check -o not-file:xnegative.count cat xpositive.count
|
||||||
|
}
|
||||||
|
|
||||||
|
atf_test_case xflag_emptypat_plus
|
||||||
|
xflag_emptypat_plus_body()
|
||||||
|
{
|
||||||
|
printf "foo\n\nbar\n\nbaz\n" > target
|
||||||
|
printf "foo\n \nbar\n \nbaz\n" > target_spacelines
|
||||||
|
printf "foo\nbar\nbaz\n" > matches
|
||||||
|
printf " \n \n" > spacelines
|
||||||
|
|
||||||
|
printf "foo\n\nbar\n\nbaz\n" > patlist1
|
||||||
|
printf "foo\n\nba\n\nbaz\n" > patlist2
|
||||||
|
|
||||||
|
sed -e '/bar/d' target > matches_not2
|
||||||
|
|
||||||
|
# Normal handling first
|
||||||
|
atf_check -o file:target grep -Fxf patlist1 target
|
||||||
|
atf_check -o file:matches grep -Fxf patlist1 target_spacelines
|
||||||
|
atf_check -o file:matches_not2 grep -Fxf patlist2 target
|
||||||
|
|
||||||
|
# -v handling
|
||||||
|
atf_check -s exit:1 -o empty grep -Fvxf patlist1 target
|
||||||
|
atf_check -o file:spacelines grep -Fxvf patlist1 target_spacelines
|
||||||
|
}
|
||||||
|
|
||||||
atf_test_case excessive_matches
|
atf_test_case excessive_matches
|
||||||
excessive_matches_head()
|
excessive_matches_head()
|
||||||
{
|
{
|
||||||
@ -551,6 +605,12 @@ grep_nomatch_flags_head()
|
|||||||
|
|
||||||
grep_nomatch_flags_body()
|
grep_nomatch_flags_body()
|
||||||
{
|
{
|
||||||
|
grep_type
|
||||||
|
|
||||||
|
if [ $? -eq $GREP_TYPE_GNU_FREEBSD ]; then
|
||||||
|
atf_expect_fail "this test does not pass with GNU grep in base"
|
||||||
|
fi
|
||||||
|
|
||||||
printf "A\nB\nC\n" > test1
|
printf "A\nB\nC\n" > test1
|
||||||
|
|
||||||
atf_check -o inline:"1\n" grep -c -C 1 -e "B" test1
|
atf_check -o inline:"1\n" grep -c -C 1 -e "B" test1
|
||||||
@ -563,7 +623,7 @@ grep_nomatch_flags_body()
|
|||||||
atf_check -o inline:"test1\n" grep -l -A 1 -e "B" test1
|
atf_check -o inline:"test1\n" grep -l -A 1 -e "B" test1
|
||||||
atf_check -o inline:"test1\n" grep -l -C 1 -e "B" test1
|
atf_check -o inline:"test1\n" grep -l -C 1 -e "B" test1
|
||||||
|
|
||||||
atf_check -s exit:1 -o inline:"test1\n" grep -L -e "D" test1
|
atf_check -o inline:"test1\n" grep -L -e "D" test1
|
||||||
|
|
||||||
atf_check -o empty grep -q -e "B" test1
|
atf_check -o empty grep -q -e "B" test1
|
||||||
atf_check -o empty grep -q -B 1 -e "B" test1
|
atf_check -o empty grep -q -B 1 -e "B" test1
|
||||||
@ -777,6 +837,8 @@ atf_init_test_cases()
|
|||||||
atf_add_test_case egrep_empty_invalid
|
atf_add_test_case egrep_empty_invalid
|
||||||
atf_add_test_case zerolen
|
atf_add_test_case zerolen
|
||||||
atf_add_test_case wflag_emptypat
|
atf_add_test_case wflag_emptypat
|
||||||
|
atf_add_test_case xflag_emptypat
|
||||||
|
atf_add_test_case xflag_emptypat_plus
|
||||||
atf_add_test_case excessive_matches
|
atf_add_test_case excessive_matches
|
||||||
atf_add_test_case wv_combo_break
|
atf_add_test_case wv_combo_break
|
||||||
atf_add_test_case fgrep_sanity
|
atf_add_test_case fgrep_sanity
|
||||||
|
@ -194,43 +194,115 @@ process_file_actions(const posix_spawn_file_actions_t fa)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct posix_spawn_args {
|
||||||
|
const char *path;
|
||||||
|
const posix_spawn_file_actions_t *fa;
|
||||||
|
const posix_spawnattr_t *sa;
|
||||||
|
char * const * argv;
|
||||||
|
char * const * envp;
|
||||||
|
int use_env_path;
|
||||||
|
int error;
|
||||||
|
};
|
||||||
|
|
||||||
|
#if defined(__i386__) || defined(__amd64__)
|
||||||
|
#define _RFORK_THREAD_STACK_SIZE 4096
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int
|
||||||
|
_posix_spawn_thr(void *data)
|
||||||
|
{
|
||||||
|
struct posix_spawn_args *psa;
|
||||||
|
char * const *envp;
|
||||||
|
|
||||||
|
psa = data;
|
||||||
|
if (psa->sa != NULL) {
|
||||||
|
psa->error = process_spawnattr(*psa->sa);
|
||||||
|
if (psa->error)
|
||||||
|
_exit(127);
|
||||||
|
}
|
||||||
|
if (psa->fa != NULL) {
|
||||||
|
psa->error = process_file_actions(*psa->fa);
|
||||||
|
if (psa->error)
|
||||||
|
_exit(127);
|
||||||
|
}
|
||||||
|
envp = psa->envp != NULL ? psa->envp : environ;
|
||||||
|
if (psa->use_env_path)
|
||||||
|
_execvpe(psa->path, psa->argv, envp);
|
||||||
|
else
|
||||||
|
_execve(psa->path, psa->argv, envp);
|
||||||
|
psa->error = errno;
|
||||||
|
|
||||||
|
/* This is called in such a way that it must not exit. */
|
||||||
|
_exit(127);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
do_posix_spawn(pid_t *pid, const char *path,
|
do_posix_spawn(pid_t *pid, const char *path,
|
||||||
const posix_spawn_file_actions_t *fa,
|
const posix_spawn_file_actions_t *fa,
|
||||||
const posix_spawnattr_t *sa,
|
const posix_spawnattr_t *sa,
|
||||||
char * const argv[], char * const envp[], int use_env_path)
|
char * const argv[], char * const envp[], int use_env_path)
|
||||||
{
|
{
|
||||||
|
struct posix_spawn_args psa;
|
||||||
pid_t p;
|
pid_t p;
|
||||||
volatile int error = 0;
|
#ifdef _RFORK_THREAD_STACK_SIZE
|
||||||
|
char *stack;
|
||||||
|
|
||||||
|
stack = malloc(_RFORK_THREAD_STACK_SIZE);
|
||||||
|
if (stack == NULL)
|
||||||
|
return (ENOMEM);
|
||||||
|
#endif
|
||||||
|
psa.path = path;
|
||||||
|
psa.fa = fa;
|
||||||
|
psa.sa = sa;
|
||||||
|
psa.argv = argv;
|
||||||
|
psa.envp = envp;
|
||||||
|
psa.use_env_path = use_env_path;
|
||||||
|
psa.error = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Passing RFSPAWN to rfork(2) gives us effectively a vfork that drops
|
||||||
|
* non-ignored signal handlers. We'll fall back to the slightly less
|
||||||
|
* ideal vfork(2) if we get an EINVAL from rfork -- this should only
|
||||||
|
* happen with newer libc on older kernel that doesn't accept
|
||||||
|
* RFSPAWN.
|
||||||
|
*/
|
||||||
|
#ifdef _RFORK_THREAD_STACK_SIZE
|
||||||
|
/*
|
||||||
|
* x86 stores the return address on the stack, so rfork(2) cannot work
|
||||||
|
* as-is because the child would clobber the return address om the
|
||||||
|
* parent. Because of this, we must use rfork_thread instead while
|
||||||
|
* almost every other arch stores the return address in a register.
|
||||||
|
*/
|
||||||
|
p = rfork_thread(RFSPAWN, stack + _RFORK_THREAD_STACK_SIZE,
|
||||||
|
_posix_spawn_thr, &psa);
|
||||||
|
free(stack);
|
||||||
|
#else
|
||||||
|
p = rfork(RFSPAWN);
|
||||||
|
if (p == 0)
|
||||||
|
/* _posix_spawn_thr does not return */
|
||||||
|
_posix_spawn_thr(&psa);
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* The above block should leave us in a state where we've either
|
||||||
|
* succeeded and we're ready to process the results, or we need to
|
||||||
|
* fallback to vfork() if the kernel didn't like RFSPAWN.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (p == -1 && errno == EINVAL) {
|
||||||
p = vfork();
|
p = vfork();
|
||||||
switch (p) {
|
if (p == 0)
|
||||||
case -1:
|
/* _posix_spawn_thr does not return */
|
||||||
|
_posix_spawn_thr(&psa);
|
||||||
|
}
|
||||||
|
if (p == -1)
|
||||||
return (errno);
|
return (errno);
|
||||||
case 0:
|
if (psa.error != 0)
|
||||||
if (sa != NULL) {
|
/* Failed; ready to reap */
|
||||||
error = process_spawnattr(*sa);
|
|
||||||
if (error)
|
|
||||||
_exit(127);
|
|
||||||
}
|
|
||||||
if (fa != NULL) {
|
|
||||||
error = process_file_actions(*fa);
|
|
||||||
if (error)
|
|
||||||
_exit(127);
|
|
||||||
}
|
|
||||||
if (use_env_path)
|
|
||||||
_execvpe(path, argv, envp != NULL ? envp : environ);
|
|
||||||
else
|
|
||||||
_execve(path, argv, envp != NULL ? envp : environ);
|
|
||||||
error = errno;
|
|
||||||
_exit(127);
|
|
||||||
default:
|
|
||||||
if (error != 0)
|
|
||||||
_waitpid(p, NULL, WNOHANG);
|
_waitpid(p, NULL, WNOHANG);
|
||||||
else if (pid != NULL)
|
else if (pid != NULL)
|
||||||
|
/* exec succeeded */
|
||||||
*pid = p;
|
*pid = p;
|
||||||
return (error);
|
return (psa.error);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -5,7 +5,6 @@ MDSRCS+= \
|
|||||||
bcopy.S \
|
bcopy.S \
|
||||||
bzero.S \
|
bzero.S \
|
||||||
ffs.S \
|
ffs.S \
|
||||||
memchr.S \
|
|
||||||
memcmp.S \
|
memcmp.S \
|
||||||
memcpy.S \
|
memcpy.S \
|
||||||
memmove.S \
|
memmove.S \
|
||||||
|
@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1993 Winning Strategies, Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. All advertising materials mentioning features or use of this software
|
|
||||||
* must display the following acknowledgement:
|
|
||||||
* This product includes software developed by Winning Strategies, Inc.
|
|
||||||
* 4. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <machine/asm.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* memchr (b, c, len)
|
|
||||||
* locates the first occurrence of c in string b.
|
|
||||||
*
|
|
||||||
* Written by:
|
|
||||||
* J.T. Conklin (jtc@wimsey.com), Winning Strategies, Inc.
|
|
||||||
*/
|
|
||||||
|
|
||||||
ENTRY(memchr)
|
|
||||||
pushl %edi
|
|
||||||
movl 8(%esp),%edi /* string address */
|
|
||||||
movl 12(%esp),%eax /* set character to search for */
|
|
||||||
movl 16(%esp),%ecx /* set length of search */
|
|
||||||
testl %esp,%esp /* clear Z flag, for len == 0 */
|
|
||||||
cld /* set search forward */
|
|
||||||
repne /* search! */
|
|
||||||
scasb
|
|
||||||
jnz L1 /* scan failed, return null */
|
|
||||||
leal -1(%edi),%eax /* adjust result of scan */
|
|
||||||
popl %edi
|
|
||||||
ret
|
|
||||||
.align 2,0x90
|
|
||||||
L1: xorl %eax,%eax
|
|
||||||
popl %edi
|
|
||||||
ret
|
|
||||||
END(memchr)
|
|
||||||
|
|
||||||
.section .note.GNU-stack,"",%progbits
|
|
@ -391,6 +391,7 @@ __pid_t __sys_wait6(enum idtype, __id_t, int *, int,
|
|||||||
struct __wrusage *, struct __siginfo *);
|
struct __wrusage *, struct __siginfo *);
|
||||||
__ssize_t __sys_write(int, const void *, __size_t);
|
__ssize_t __sys_write(int, const void *, __size_t);
|
||||||
__ssize_t __sys_writev(int, const struct iovec *, int);
|
__ssize_t __sys_writev(int, const struct iovec *, int);
|
||||||
|
int __sys_shm_open2(const char *, int, __mode_t, int, const char *);
|
||||||
|
|
||||||
int __libc_sigaction(int, const struct sigaction *,
|
int __libc_sigaction(int, const struct sigaction *,
|
||||||
struct sigaction *) __hidden;
|
struct sigaction *) __hidden;
|
||||||
|
@ -1068,7 +1068,7 @@ print(struct match *m,
|
|||||||
fprintf(d, " %s", pchar(ch));
|
fprintf(d, " %s", pchar(ch));
|
||||||
for (i = 0; i < g->nstates; i++)
|
for (i = 0; i < g->nstates; i++)
|
||||||
if (ISSET(st, i)) {
|
if (ISSET(st, i)) {
|
||||||
fprintf(d, "%s%d", (first) ? "\t" : ", ", i);
|
fprintf(d, "%s%lu", (first) ? "\t" : ", ", i);
|
||||||
first = 0;
|
first = 0;
|
||||||
}
|
}
|
||||||
fprintf(d, "\n");
|
fprintf(d, "\n");
|
||||||
|
@ -196,12 +196,6 @@ static char nuls[10]; /* place to point scanner in event of error */
|
|||||||
#define THERETHERE() (p->slen - 2)
|
#define THERETHERE() (p->slen - 2)
|
||||||
#define DROP(n) (p->slen -= (n))
|
#define DROP(n) (p->slen -= (n))
|
||||||
|
|
||||||
#ifndef NDEBUG
|
|
||||||
static int never = 0; /* for use in asserts; shuts lint up */
|
|
||||||
#else
|
|
||||||
#define never 0 /* some <assert.h>s have bugs too */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Macro used by computejump()/computematchjump() */
|
/* Macro used by computejump()/computematchjump() */
|
||||||
#define MIN(a,b) ((a)<(b)?(a):(b))
|
#define MIN(a,b) ((a)<(b)?(a):(b))
|
||||||
|
|
||||||
|
@ -46,6 +46,7 @@ PSEUDO+= _getdirentries.o
|
|||||||
|
|
||||||
SRCS+= brk.c
|
SRCS+= brk.c
|
||||||
SRCS+= pipe.c
|
SRCS+= pipe.c
|
||||||
|
SRCS+= shm_open.c
|
||||||
SRCS+= vadvise.c
|
SRCS+= vadvise.c
|
||||||
|
|
||||||
SRCS+= compat-stub.c
|
SRCS+= compat-stub.c
|
||||||
@ -475,7 +476,9 @@ MLINKS+=setuid.2 setegid.2 \
|
|||||||
setuid.2 seteuid.2 \
|
setuid.2 seteuid.2 \
|
||||||
setuid.2 setgid.2
|
setuid.2 setgid.2
|
||||||
MLINKS+=shmat.2 shmdt.2
|
MLINKS+=shmat.2 shmdt.2
|
||||||
MLINKS+=shm_open.2 shm_unlink.2
|
MLINKS+=shm_open.2 memfd_create.3 \
|
||||||
|
shm_open.2 shm_unlink.2 \
|
||||||
|
shm_open.2 shm_rename.2
|
||||||
MLINKS+=sigwaitinfo.2 sigtimedwait.2
|
MLINKS+=sigwaitinfo.2 sigtimedwait.2
|
||||||
MLINKS+=stat.2 fstat.2 \
|
MLINKS+=stat.2 fstat.2 \
|
||||||
stat.2 fstatat.2 \
|
stat.2 fstatat.2 \
|
||||||
|
@ -409,6 +409,8 @@ FBSD_1.6 {
|
|||||||
fhreadlink;
|
fhreadlink;
|
||||||
getfhat;
|
getfhat;
|
||||||
funlinkat;
|
funlinkat;
|
||||||
|
memfd_create;
|
||||||
|
shm_rename;
|
||||||
};
|
};
|
||||||
|
|
||||||
FBSDprivate_1.0 {
|
FBSDprivate_1.0 {
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
.\" @(#)fcntl.2 8.2 (Berkeley) 1/12/94
|
.\" @(#)fcntl.2 8.2 (Berkeley) 1/12/94
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd Nov 15, 2018
|
.Dd September 4, 2019
|
||||||
.Dt FCNTL 2
|
.Dt FCNTL 2
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -180,6 +180,11 @@ is non-zero.
|
|||||||
A zero value in
|
A zero value in
|
||||||
.Fa arg
|
.Fa arg
|
||||||
turns off read ahead.
|
turns off read ahead.
|
||||||
|
.It Dv F_ADD_SEALS
|
||||||
|
Add seals to the file as described below, if the underlying filesystem supports
|
||||||
|
seals.
|
||||||
|
.It Dv F_GET_SEALS
|
||||||
|
Get seals associated with the file, if the underlying filesystem supports seals.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
The flags for the
|
The flags for the
|
||||||
@ -217,6 +222,37 @@ when I/O is possible, e.g.,
|
|||||||
upon availability of data to be read.
|
upon availability of data to be read.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
|
The seals that may be applied with
|
||||||
|
.Dv F_ADD_SEALS
|
||||||
|
are as follows:
|
||||||
|
.Bl -tag -width F_SEAL_SHRINK
|
||||||
|
.It Dv F_SEAL_SEAL
|
||||||
|
Prevent any further seals from being applied to the file.
|
||||||
|
.It Dv F_SEAL_SHRINK
|
||||||
|
Prevent the file from being shrunk with
|
||||||
|
.Xr ftruncate 2 .
|
||||||
|
.It Dv F_SEAL_GROW
|
||||||
|
Prevent the file from being enlarged with
|
||||||
|
.Xr ftruncate 2 .
|
||||||
|
.It Dv F_SEAL_WRITE
|
||||||
|
Prevent any further
|
||||||
|
.Xr write 2
|
||||||
|
calls to the file.
|
||||||
|
Any writes in progress will finish before
|
||||||
|
.Fn fcntl
|
||||||
|
returns.
|
||||||
|
If any writeable mappings exist, F_ADD_SEALS will fail and return
|
||||||
|
.Dv EBUSY .
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
Seals are on a per-inode basis and require support by the underlying filesystem.
|
||||||
|
If the underlying filesystem does not support seals,
|
||||||
|
.Dv F_ADD_SEALS
|
||||||
|
and
|
||||||
|
.Dv F_GET_SEALS
|
||||||
|
will fail and return
|
||||||
|
.Dv EINVAL .
|
||||||
|
.Pp
|
||||||
Several commands are available for doing advisory file locking;
|
Several commands are available for doing advisory file locking;
|
||||||
they all operate on the following structure:
|
they all operate on the following structure:
|
||||||
.Bd -literal
|
.Bd -literal
|
||||||
@ -528,6 +564,14 @@ is an exclusive lock
|
|||||||
and
|
and
|
||||||
.Fa fd
|
.Fa fd
|
||||||
is not a valid file descriptor open for writing.
|
is not a valid file descriptor open for writing.
|
||||||
|
.It Bq Er EBUSY
|
||||||
|
The argument
|
||||||
|
.Fa cmd
|
||||||
|
is
|
||||||
|
.Dv F_ADD_SEALS ,
|
||||||
|
attempting to set
|
||||||
|
.Dv F_SEAL_WRITE ,
|
||||||
|
and writeable mappings of the file exist.
|
||||||
.It Bq Er EDEADLK
|
.It Bq Er EDEADLK
|
||||||
The argument
|
The argument
|
||||||
.Fa cmd
|
.Fa cmd
|
||||||
@ -565,6 +609,14 @@ points is not valid.
|
|||||||
.Pp
|
.Pp
|
||||||
The argument
|
The argument
|
||||||
.Fa cmd
|
.Fa cmd
|
||||||
|
is
|
||||||
|
.Dv F_ADD_SEALS
|
||||||
|
or
|
||||||
|
.Dv F_GET_SEALS ,
|
||||||
|
and the underlying filesystem does not support sealing.
|
||||||
|
.Pp
|
||||||
|
The argument
|
||||||
|
.Fa cmd
|
||||||
is invalid.
|
is invalid.
|
||||||
.It Bq Er EMFILE
|
.It Bq Er EMFILE
|
||||||
The argument
|
The argument
|
||||||
@ -624,6 +676,15 @@ is
|
|||||||
and
|
and
|
||||||
the process ID or process group given as an argument is in a
|
the process ID or process group given as an argument is in a
|
||||||
different session than the caller.
|
different session than the caller.
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Fa cmd
|
||||||
|
argument
|
||||||
|
is
|
||||||
|
.Dv F_ADD_SEALS
|
||||||
|
and the
|
||||||
|
.Dv F_SEAL_SEAL
|
||||||
|
seal has already been set.
|
||||||
.It Bq Er ESRCH
|
.It Bq Er ESRCH
|
||||||
The
|
The
|
||||||
.Fa cmd
|
.Fa cmd
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
.\" @(#)mount.2 8.3 (Berkeley) 5/24/95
|
.\" @(#)mount.2 8.3 (Berkeley) 5/24/95
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd December 1, 2017
|
.Dd August 28, 2019
|
||||||
.Dt MOUNT 2
|
.Dt MOUNT 2
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -157,6 +157,10 @@ mount even if some files are open for writing.
|
|||||||
Disable read clustering.
|
Disable read clustering.
|
||||||
.It Dv MNT_NOCLUSTERW
|
.It Dv MNT_NOCLUSTERW
|
||||||
Disable write clustering.
|
Disable write clustering.
|
||||||
|
.It Dv MNT_NOCOVER
|
||||||
|
Do not mount over the root of another mount point.
|
||||||
|
.It Dv MNT_EMPTYDIR
|
||||||
|
Require an empty directory for the mount point directory.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
The flag
|
The flag
|
||||||
@ -260,6 +264,11 @@ is not a directory.
|
|||||||
.It Bq Er EBUSY
|
.It Bq Er EBUSY
|
||||||
Another process currently holds a reference to
|
Another process currently holds a reference to
|
||||||
.Fa dir .
|
.Fa dir .
|
||||||
|
.It Bq Er EBUSY
|
||||||
|
The
|
||||||
|
.Dv MNT_NOCOVER
|
||||||
|
option was given, and the requested mount point
|
||||||
|
is already the root of another mount point.
|
||||||
.It Bq Er EFAULT
|
.It Bq Er EFAULT
|
||||||
The
|
The
|
||||||
.Fa dir
|
.Fa dir
|
||||||
@ -280,6 +289,11 @@ The
|
|||||||
.Fa fspec
|
.Fa fspec
|
||||||
argument
|
argument
|
||||||
is not a block device.
|
is not a block device.
|
||||||
|
.It Bq Er ENOTEMPTY
|
||||||
|
The
|
||||||
|
.Dv MNT_EMPTYDIR
|
||||||
|
option was specified, and the requested mount point
|
||||||
|
is not an empty directory.
|
||||||
.It Bq Er ENXIO
|
.It Bq Er ENXIO
|
||||||
The major device number of
|
The major device number of
|
||||||
.Fa fspec
|
.Fa fspec
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd July 12, 2011
|
.Dd September 25, 2019
|
||||||
.Dt RFORK 2
|
.Dt RFORK 2
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -34,7 +34,9 @@ and open files.
|
|||||||
The
|
The
|
||||||
.Fa flags
|
.Fa flags
|
||||||
argument
|
argument
|
||||||
is the logical OR of some subset of:
|
is either
|
||||||
|
.Dv RFSPAWN
|
||||||
|
or the logical OR of some subset of:
|
||||||
.Bl -tag -width ".Dv RFLINUXTHPN"
|
.Bl -tag -width ".Dv RFLINUXTHPN"
|
||||||
.It Dv RFPROC
|
.It Dv RFPROC
|
||||||
If set a new process is created; otherwise changes affect the
|
If set a new process is created; otherwise changes affect the
|
||||||
@ -105,6 +107,17 @@ open until either they are explicitly closed
|
|||||||
or all processes sharing the table exit.
|
or all processes sharing the table exit.
|
||||||
.Pp
|
.Pp
|
||||||
If
|
If
|
||||||
|
.Dv RFSPAWN
|
||||||
|
is passed,
|
||||||
|
.Nm
|
||||||
|
will use
|
||||||
|
.Xr vfork 2
|
||||||
|
semantics but reset all signal actions in the child to default.
|
||||||
|
This flag is used by the
|
||||||
|
.Xr posix_spawn 3
|
||||||
|
implementation in libc.
|
||||||
|
.Pp
|
||||||
|
If
|
||||||
.Dv RFPROC
|
.Dv RFPROC
|
||||||
is set, the
|
is set, the
|
||||||
value returned in the parent process
|
value returned in the parent process
|
||||||
|
@ -28,11 +28,11 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd January 20, 2017
|
.Dd September 26, 2019
|
||||||
.Dt SHM_OPEN 2
|
.Dt SHM_OPEN 2
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
.Nm shm_open , shm_unlink
|
.Nm memfd_create , shm_open , shm_rename, shm_unlink
|
||||||
.Nd "shared memory object operations"
|
.Nd "shared memory object operations"
|
||||||
.Sh LIBRARY
|
.Sh LIBRARY
|
||||||
.Lb libc
|
.Lb libc
|
||||||
@ -41,8 +41,12 @@
|
|||||||
.In sys/mman.h
|
.In sys/mman.h
|
||||||
.In fcntl.h
|
.In fcntl.h
|
||||||
.Ft int
|
.Ft int
|
||||||
|
.Fn memfd_create "const char *name" "unsigned int flags"
|
||||||
|
.Ft int
|
||||||
.Fn shm_open "const char *path" "int flags" "mode_t mode"
|
.Fn shm_open "const char *path" "int flags" "mode_t mode"
|
||||||
.Ft int
|
.Ft int
|
||||||
|
.Fn shm_rename "const char *path_from" "const char *path_to" "int flags"
|
||||||
|
.Ft int
|
||||||
.Fn shm_unlink "const char *path"
|
.Fn shm_unlink "const char *path"
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
The
|
The
|
||||||
@ -110,8 +114,9 @@ see
|
|||||||
and
|
and
|
||||||
.Xr fcntl 2 .
|
.Xr fcntl 2 .
|
||||||
.Pp
|
.Pp
|
||||||
As a FreeBSD extension,
|
As a
|
||||||
the constant
|
.Fx
|
||||||
|
extension, the constant
|
||||||
.Dv SHM_ANON
|
.Dv SHM_ANON
|
||||||
may be used for the
|
may be used for the
|
||||||
.Fa path
|
.Fa path
|
||||||
@ -120,7 +125,9 @@ argument to
|
|||||||
In this case, an anonymous, unnamed shared memory object is created.
|
In this case, an anonymous, unnamed shared memory object is created.
|
||||||
Since the object has no name,
|
Since the object has no name,
|
||||||
it cannot be removed via a subsequent call to
|
it cannot be removed via a subsequent call to
|
||||||
.Fn shm_unlink .
|
.Fn shm_unlink ,
|
||||||
|
or moved with a call to
|
||||||
|
.Fn shm_rename .
|
||||||
Instead,
|
Instead,
|
||||||
the shared memory object will be garbage collected when the last reference to
|
the shared memory object will be garbage collected when the last reference to
|
||||||
the shared memory object is removed.
|
the shared memory object is removed.
|
||||||
@ -136,23 +143,103 @@ will fail with
|
|||||||
All other flags are ignored.
|
All other flags are ignored.
|
||||||
.Pp
|
.Pp
|
||||||
The
|
The
|
||||||
|
.Fn shm_rename
|
||||||
|
system call atomically removes a shared memory object named
|
||||||
|
.Fa path_from
|
||||||
|
and relinks it at
|
||||||
|
.Fa path_to .
|
||||||
|
If another object is already linked at
|
||||||
|
.Fa path_to ,
|
||||||
|
that object will be unlinked, unless one of the following flags are provided:
|
||||||
|
.Bl -tag -offset indent -width Er
|
||||||
|
.It Er SHM_RENAME_EXCHANGE
|
||||||
|
Atomically exchange the shms at
|
||||||
|
.Fa path_from
|
||||||
|
and
|
||||||
|
.Fa path_to .
|
||||||
|
.It Er SHM_RENAME_NOREPLACE
|
||||||
|
Return an error if an shm exists at
|
||||||
|
.Fa path_to ,
|
||||||
|
rather than unlinking it.
|
||||||
|
.El
|
||||||
|
.Fn shm_rename
|
||||||
|
is also a
|
||||||
|
.Fx
|
||||||
|
extension.
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
.Fn shm_unlink
|
.Fn shm_unlink
|
||||||
system call removes a shared memory object named
|
system call removes a shared memory object named
|
||||||
.Fa path .
|
.Fa path .
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Fn memfd_create
|
||||||
|
function creates an anonymous shared memory object, identical to that created
|
||||||
|
by
|
||||||
|
.Fn shm_open
|
||||||
|
when
|
||||||
|
.Dv SHM_ANON
|
||||||
|
is specified.
|
||||||
|
Newly created objects start off with a size of zero.
|
||||||
|
The size of the new object must be adjusted via
|
||||||
|
.Xr ftruncate 2 .
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Fa name
|
||||||
|
argument must not be
|
||||||
|
.Dv NULL ,
|
||||||
|
but it may be an empty string.
|
||||||
|
The length of the
|
||||||
|
.Fa name
|
||||||
|
argument may not exceed
|
||||||
|
.Dv NAME_MAX
|
||||||
|
minus six characters for the prefix
|
||||||
|
.Dq memfd: ,
|
||||||
|
which will be prepended.
|
||||||
|
The
|
||||||
|
.Fa name
|
||||||
|
argument is intended solely for debugging purposes and will never be used by the
|
||||||
|
kernel to identify a memfd.
|
||||||
|
Names are therefore not required to be unique.
|
||||||
|
.Pp
|
||||||
|
The following
|
||||||
|
.Fa flags
|
||||||
|
may be specified to
|
||||||
|
.Fn memfd_create :
|
||||||
|
.Bl -tag -width MFD_ALLOW_SEALING
|
||||||
|
.It Dv MFD_CLOEXEC
|
||||||
|
Set
|
||||||
|
.Dv FD_CLOEXEC
|
||||||
|
on the resulting file descriptor.
|
||||||
|
.It Dv MFD_ALLOW_SEALING
|
||||||
|
Allow adding seals to the resulting file descriptor using the
|
||||||
|
.Dv F_ADD_SEALS
|
||||||
|
.Xr fcntl 2
|
||||||
|
command.
|
||||||
|
.It Dv MFD_HUGETLB
|
||||||
|
This flag is currently unsupported.
|
||||||
|
.El
|
||||||
.Sh RETURN VALUES
|
.Sh RETURN VALUES
|
||||||
If successful,
|
If successful,
|
||||||
|
.Fn memfd_create
|
||||||
|
and
|
||||||
.Fn shm_open
|
.Fn shm_open
|
||||||
returns a non-negative integer,
|
both return a non-negative integer,
|
||||||
|
and
|
||||||
|
.Fn shm_rename
|
||||||
and
|
and
|
||||||
.Fn shm_unlink
|
.Fn shm_unlink
|
||||||
returns zero.
|
return zero.
|
||||||
Both functions return -1 on failure, and set
|
All functions return -1 on failure, and set
|
||||||
.Va errno
|
.Va errno
|
||||||
to indicate the error.
|
to indicate the error.
|
||||||
.Sh COMPATIBILITY
|
.Sh COMPATIBILITY
|
||||||
The
|
The
|
||||||
.Fa path
|
.Fa path ,
|
||||||
argument does not necessarily represent a pathname (although it does in
|
.Fa path_from ,
|
||||||
|
and
|
||||||
|
.Fa path_to
|
||||||
|
arguments do not necessarily represent a pathname (although they do in
|
||||||
most other implementations).
|
most other implementations).
|
||||||
Two processes opening the same
|
Two processes opening the same
|
||||||
.Fa path
|
.Fa path
|
||||||
@ -220,6 +307,33 @@ This example fails without the call to
|
|||||||
errx(EX_IOERR, "%s: pwrite length mismatch", __func__);
|
errx(EX_IOERR, "%s: pwrite length mismatch", __func__);
|
||||||
.Ed
|
.Ed
|
||||||
.Sh ERRORS
|
.Sh ERRORS
|
||||||
|
.Fn memfd_create
|
||||||
|
fails with these error codes for these conditions:
|
||||||
|
.Bl -tag -width Er
|
||||||
|
.It Bq Er EBADF
|
||||||
|
The
|
||||||
|
.Fa name
|
||||||
|
argument was NULL.
|
||||||
|
.It Bq Er EINVAL
|
||||||
|
The
|
||||||
|
.Fa name
|
||||||
|
argument was too long.
|
||||||
|
.Pp
|
||||||
|
An invalid or unsupported flag was included in
|
||||||
|
.Fa flags .
|
||||||
|
.It Bq Er EMFILE
|
||||||
|
The process has already reached its limit for open file descriptors.
|
||||||
|
.It Bq Er ENFILE
|
||||||
|
The system file table is full.
|
||||||
|
.It Bq Er ENOSYS
|
||||||
|
In
|
||||||
|
.Fa memfd_create ,
|
||||||
|
.Dv MFD_HUGETLB
|
||||||
|
was specified in
|
||||||
|
.Fa flags ,
|
||||||
|
and this system does not support forced hugetlb mappings.
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
.Fn shm_open
|
.Fn shm_open
|
||||||
fails with these error codes for these conditions:
|
fails with these error codes for these conditions:
|
||||||
.Bl -tag -width Er
|
.Bl -tag -width Er
|
||||||
@ -246,7 +360,7 @@ The
|
|||||||
.Fa path
|
.Fa path
|
||||||
argument points outside the process' allocated address space.
|
argument points outside the process' allocated address space.
|
||||||
.It Bq Er ENAMETOOLONG
|
.It Bq Er ENAMETOOLONG
|
||||||
The entire pathname exceeded 1023 characters.
|
The entire pathname exceeds 1023 characters.
|
||||||
.It Bq Er EINVAL
|
.It Bq Er EINVAL
|
||||||
The
|
The
|
||||||
.Fa path
|
.Fa path
|
||||||
@ -265,6 +379,31 @@ are specified and the named shared memory object does exist.
|
|||||||
The required permissions (for reading or reading and writing) are denied.
|
The required permissions (for reading or reading and writing) are denied.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
|
The following errors are defined for
|
||||||
|
.Fn shm_rename :
|
||||||
|
.Bl -tag -width Er
|
||||||
|
.It Bq Er EFAULT
|
||||||
|
The
|
||||||
|
.Fa path_from
|
||||||
|
or
|
||||||
|
.Fa path_to
|
||||||
|
argument points outside the process' allocated address space.
|
||||||
|
.It Bq Er ENAMETOOLONG
|
||||||
|
The entire pathname exceeds 1023 characters.
|
||||||
|
.It Bq Er ENOENT
|
||||||
|
The shared memory object at
|
||||||
|
.Fa path_from
|
||||||
|
does not exist.
|
||||||
|
.It Bq Er EACCES
|
||||||
|
The required permissions are denied.
|
||||||
|
.It Bq Er EEXIST
|
||||||
|
An shm exists at
|
||||||
|
.Fa path_to ,
|
||||||
|
and the
|
||||||
|
.Dv SHM_RENAME_NOREPLACE
|
||||||
|
flag was provided.
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
.Fn shm_unlink
|
.Fn shm_unlink
|
||||||
fails with these error codes for these conditions:
|
fails with these error codes for these conditions:
|
||||||
.Bl -tag -width Er
|
.Bl -tag -width Er
|
||||||
@ -273,7 +412,7 @@ The
|
|||||||
.Fa path
|
.Fa path
|
||||||
argument points outside the process' allocated address space.
|
argument points outside the process' allocated address space.
|
||||||
.It Bq Er ENAMETOOLONG
|
.It Bq Er ENAMETOOLONG
|
||||||
The entire pathname exceeded 1023 characters.
|
The entire pathname exceeds 1023 characters.
|
||||||
.It Bq Er ENOENT
|
.It Bq Er ENOENT
|
||||||
The named shared memory object does not exist.
|
The named shared memory object does not exist.
|
||||||
.It Bq Er EACCES
|
.It Bq Er EACCES
|
||||||
@ -290,6 +429,11 @@ requires write permission to the shared memory object.
|
|||||||
.Xr sendfile 2
|
.Xr sendfile 2
|
||||||
.Sh STANDARDS
|
.Sh STANDARDS
|
||||||
The
|
The
|
||||||
|
.Fn memfd_create
|
||||||
|
function is expected to be compatible with the Linux system call of the same
|
||||||
|
name.
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
.Fn shm_open
|
.Fn shm_open
|
||||||
and
|
and
|
||||||
.Fn shm_unlink
|
.Fn shm_unlink
|
||||||
@ -297,6 +441,11 @@ functions are believed to conform to
|
|||||||
.St -p1003.1b-93 .
|
.St -p1003.1b-93 .
|
||||||
.Sh HISTORY
|
.Sh HISTORY
|
||||||
The
|
The
|
||||||
|
.Fn memfd_create
|
||||||
|
function appeared in
|
||||||
|
.Fx 13.0 .
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
.Fn shm_open
|
.Fn shm_open
|
||||||
and
|
and
|
||||||
.Fn shm_unlink
|
.Fn shm_unlink
|
||||||
@ -305,9 +454,19 @@ functions first appeared in
|
|||||||
The functions were reimplemented as system calls using shared memory objects
|
The functions were reimplemented as system calls using shared memory objects
|
||||||
directly rather than files in
|
directly rather than files in
|
||||||
.Fx 8.0 .
|
.Fx 8.0 .
|
||||||
|
.Pp
|
||||||
|
.Fn shm_rename
|
||||||
|
first appeared in
|
||||||
|
.Fx 13.0
|
||||||
|
as a
|
||||||
|
.Fx
|
||||||
|
extension.
|
||||||
.Sh AUTHORS
|
.Sh AUTHORS
|
||||||
.An Garrett A. Wollman Aq Mt wollman@FreeBSD.org
|
.An Garrett A. Wollman Aq Mt wollman@FreeBSD.org
|
||||||
(C library support and this manual page)
|
(C library support and this manual page)
|
||||||
.Pp
|
.Pp
|
||||||
.An Matthew Dillon Aq Mt dillon@FreeBSD.org
|
.An Matthew Dillon Aq Mt dillon@FreeBSD.org
|
||||||
.Pq Dv MAP_NOSYNC
|
.Pq Dv MAP_NOSYNC
|
||||||
|
.Pp
|
||||||
|
.An Matthew Bryan Aq Mt matthew.bryan@isilon.com
|
||||||
|
.Pq Dv shm_rename implementation
|
||||||
|
110
lib/libc/sys/shm_open.c
Normal file
110
lib/libc/sys/shm_open.c
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Kyle Evans <kevans@FreeBSD.org>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice(s), this list of conditions and the following disclaimer as
|
||||||
|
* the first lines of this file unmodified other than the possible
|
||||||
|
* addition of one or more copyright notices.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice(s), this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||||
|
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||||
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "libc_private.h"
|
||||||
|
|
||||||
|
__weak_reference(shm_open, _shm_open);
|
||||||
|
__weak_reference(shm_open, __sys_shm_open);
|
||||||
|
|
||||||
|
#define SHM_OPEN2_OSREL 1300048
|
||||||
|
|
||||||
|
#define MEMFD_NAME_PREFIX "memfd:"
|
||||||
|
|
||||||
|
int
|
||||||
|
shm_open(const char *path, int flags, mode_t mode)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (__getosreldate() >= SHM_OPEN2_OSREL)
|
||||||
|
return (__sys_shm_open2(path, flags | O_CLOEXEC, mode, 0,
|
||||||
|
NULL));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fallback to shm_open(2) on older kernels. The kernel will enforce
|
||||||
|
* O_CLOEXEC in this interface, unlike the newer shm_open2 which does
|
||||||
|
* not enforce it. The newer interface allows memfd_create(), for
|
||||||
|
* instance, to not have CLOEXEC on the returned fd.
|
||||||
|
*/
|
||||||
|
return (syscall(SYS_freebsd12_shm_open, path, flags, mode));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The path argument is passed to the kernel, but the kernel doesn't currently
|
||||||
|
* do anything with it. Linux exposes it in linprocfs for debugging purposes
|
||||||
|
* only, but our kernel currently will not do the same.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
memfd_create(const char *name, unsigned int flags)
|
||||||
|
{
|
||||||
|
char memfd_name[NAME_MAX + 1];
|
||||||
|
size_t namelen;
|
||||||
|
int oflags, shmflags;
|
||||||
|
|
||||||
|
if (name == NULL)
|
||||||
|
return (EBADF);
|
||||||
|
namelen = strlen(name);
|
||||||
|
if (namelen + sizeof(MEMFD_NAME_PREFIX) - 1 > NAME_MAX)
|
||||||
|
return (EINVAL);
|
||||||
|
if ((flags & ~(MFD_CLOEXEC | MFD_ALLOW_SEALING | MFD_HUGETLB |
|
||||||
|
MFD_HUGE_MASK)) != 0)
|
||||||
|
return (EINVAL);
|
||||||
|
/* HUGETLB set with no size specified. */
|
||||||
|
if ((flags & MFD_HUGETLB) != 0 && (flags & MFD_HUGE_MASK) == 0)
|
||||||
|
return (EINVAL);
|
||||||
|
/* Size specified but no HUGETLB. */
|
||||||
|
if ((flags & MFD_HUGE_MASK) != 0 && (flags & MFD_HUGETLB) == 0)
|
||||||
|
return (EINVAL);
|
||||||
|
/* We don't actually support HUGETLB. */
|
||||||
|
if ((flags & MFD_HUGETLB) != 0)
|
||||||
|
return (ENOSYS);
|
||||||
|
|
||||||
|
/* We've already validated that we're sufficiently sized. */
|
||||||
|
snprintf(memfd_name, NAME_MAX + 1, "%s%s", MEMFD_NAME_PREFIX, name);
|
||||||
|
oflags = O_RDWR;
|
||||||
|
shmflags = 0;
|
||||||
|
if ((flags & MFD_CLOEXEC) != 0)
|
||||||
|
oflags |= O_CLOEXEC;
|
||||||
|
if ((flags & MFD_ALLOW_SEALING) != 0)
|
||||||
|
shmflags |= SHM_ALLOW_SEALING;
|
||||||
|
return (__sys_shm_open2(SHM_ANON, oflags, 0, shmflags, memfd_name));
|
||||||
|
}
|
@ -67,6 +67,7 @@ __SCCSID("@(#)kvm_proc.c 8.3 (Berkeley) 9/23/93");
|
|||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <nlist.h>
|
#include <nlist.h>
|
||||||
#include <kvm.h>
|
#include <kvm.h>
|
||||||
@ -130,13 +131,16 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p,
|
|||||||
struct proc pproc;
|
struct proc pproc;
|
||||||
struct sysentvec sysent;
|
struct sysentvec sysent;
|
||||||
char svname[KI_EMULNAMELEN];
|
char svname[KI_EMULNAMELEN];
|
||||||
|
struct thread *td = NULL;
|
||||||
|
bool first_thread;
|
||||||
|
|
||||||
kp = &kinfo_proc;
|
kp = &kinfo_proc;
|
||||||
kp->ki_structsize = sizeof(kinfo_proc);
|
kp->ki_structsize = sizeof(kinfo_proc);
|
||||||
/*
|
/*
|
||||||
* Loop on the processes. this is completely broken because we need to be
|
* Loop on the processes, then threads within the process if requested.
|
||||||
* able to loop on the threads and merge the ones that are the same process some how.
|
|
||||||
*/
|
*/
|
||||||
|
if (what == KERN_PROC_ALL)
|
||||||
|
what |= KERN_PROC_INC_THREAD;
|
||||||
for (; cnt < maxcnt && p != NULL; p = LIST_NEXT(&proc, p_list)) {
|
for (; cnt < maxcnt && p != NULL; p = LIST_NEXT(&proc, p_list)) {
|
||||||
memset(kp, 0, sizeof *kp);
|
memset(kp, 0, sizeof *kp);
|
||||||
if (KREAD(kd, (u_long)p, &proc)) {
|
if (KREAD(kd, (u_long)p, &proc)) {
|
||||||
@ -145,15 +149,6 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p,
|
|||||||
}
|
}
|
||||||
if (proc.p_state == PRS_NEW)
|
if (proc.p_state == PRS_NEW)
|
||||||
continue;
|
continue;
|
||||||
if (proc.p_state != PRS_ZOMBIE) {
|
|
||||||
if (KREAD(kd, (u_long)TAILQ_FIRST(&proc.p_threads),
|
|
||||||
&mtd)) {
|
|
||||||
_kvm_err(kd, kd->program,
|
|
||||||
"can't read thread at %p",
|
|
||||||
TAILQ_FIRST(&proc.p_threads));
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (KREAD(kd, (u_long)proc.p_ucred, &ucred) == 0) {
|
if (KREAD(kd, (u_long)proc.p_ucred, &ucred) == 0) {
|
||||||
kp->ki_ruid = ucred.cr_ruid;
|
kp->ki_ruid = ucred.cr_ruid;
|
||||||
kp->ki_svuid = ucred.cr_svuid;
|
kp->ki_svuid = ucred.cr_svuid;
|
||||||
@ -222,6 +217,7 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p,
|
|||||||
kp->ki_addr = 0; /* XXX uarea */
|
kp->ki_addr = 0; /* XXX uarea */
|
||||||
/* kp->ki_kstack = proc.p_thread.td_kstack; XXXKSE */
|
/* kp->ki_kstack = proc.p_thread.td_kstack; XXXKSE */
|
||||||
kp->ki_args = proc.p_args;
|
kp->ki_args = proc.p_args;
|
||||||
|
kp->ki_numthreads = proc.p_numthreads;
|
||||||
kp->ki_tracep = proc.p_tracevp;
|
kp->ki_tracep = proc.p_tracevp;
|
||||||
kp->ki_textvp = proc.p_textvp;
|
kp->ki_textvp = proc.p_textvp;
|
||||||
kp->ki_fd = proc.p_fd;
|
kp->ki_fd = proc.p_fd;
|
||||||
@ -285,9 +281,6 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p,
|
|||||||
kp->ki_sid = sess.s_sid;
|
kp->ki_sid = sess.s_sid;
|
||||||
(void)memcpy(kp->ki_login, sess.s_login,
|
(void)memcpy(kp->ki_login, sess.s_login,
|
||||||
sizeof(kp->ki_login));
|
sizeof(kp->ki_login));
|
||||||
kp->ki_kiflag = sess.s_ttyvp ? KI_CTTY : 0;
|
|
||||||
if (sess.s_leader == p)
|
|
||||||
kp->ki_kiflag |= KI_SLEADER;
|
|
||||||
if ((proc.p_flag & P_CONTROLT) && sess.s_ttyp != NULL) {
|
if ((proc.p_flag & P_CONTROLT) && sess.s_ttyp != NULL) {
|
||||||
if (KREAD(kd, (u_long)sess.s_ttyp, &tty)) {
|
if (KREAD(kd, (u_long)sess.s_ttyp, &tty)) {
|
||||||
_kvm_err(kd, kd->program,
|
_kvm_err(kd, kd->program,
|
||||||
@ -330,9 +323,6 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p,
|
|||||||
nopgrp:
|
nopgrp:
|
||||||
kp->ki_tdev = NODEV;
|
kp->ki_tdev = NODEV;
|
||||||
}
|
}
|
||||||
if ((proc.p_state != PRS_ZOMBIE) && mtd.td_wmesg)
|
|
||||||
(void)kvm_read(kd, (u_long)mtd.td_wmesg,
|
|
||||||
kp->ki_wmesg, WMESGLEN);
|
|
||||||
|
|
||||||
(void)kvm_read(kd, (u_long)proc.p_vmspace,
|
(void)kvm_read(kd, (u_long)proc.p_vmspace,
|
||||||
(char *)&vmspace, sizeof(vmspace));
|
(char *)&vmspace, sizeof(vmspace));
|
||||||
@ -374,6 +364,40 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p,
|
|||||||
sizeof(svname));
|
sizeof(svname));
|
||||||
if (svname[0] != 0)
|
if (svname[0] != 0)
|
||||||
strlcpy(kp->ki_emul, svname, KI_EMULNAMELEN);
|
strlcpy(kp->ki_emul, svname, KI_EMULNAMELEN);
|
||||||
|
kp->ki_runtime = cputick2usec(proc.p_rux.rux_runtime);
|
||||||
|
kp->ki_pid = proc.p_pid;
|
||||||
|
kp->ki_xstat = KW_EXITCODE(proc.p_xexit, proc.p_xsig);
|
||||||
|
kp->ki_acflag = proc.p_acflag;
|
||||||
|
kp->ki_lock = proc.p_lock;
|
||||||
|
kp->ki_tdev_freebsd11 = kp->ki_tdev; /* truncate */
|
||||||
|
|
||||||
|
/* Per-thread items; iterate as appropriate. */
|
||||||
|
td = TAILQ_FIRST(&proc.p_threads);
|
||||||
|
for (first_thread = true; cnt < maxcnt && td != NULL &&
|
||||||
|
(first_thread || (what & KERN_PROC_INC_THREAD));
|
||||||
|
first_thread = false) {
|
||||||
|
if (proc.p_state != PRS_ZOMBIE) {
|
||||||
|
if (KREAD(kd, (u_long)td, &mtd)) {
|
||||||
|
_kvm_err(kd, kd->program,
|
||||||
|
"can't read thread at %p", td);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
if (what & KERN_PROC_INC_THREAD)
|
||||||
|
td = TAILQ_NEXT(&mtd, td_plist);
|
||||||
|
} else
|
||||||
|
td = NULL;
|
||||||
|
if ((proc.p_state != PRS_ZOMBIE) && mtd.td_wmesg)
|
||||||
|
(void)kvm_read(kd, (u_long)mtd.td_wmesg,
|
||||||
|
kp->ki_wmesg, WMESGLEN);
|
||||||
|
else
|
||||||
|
memset(kp->ki_wmesg, 0, WMESGLEN);
|
||||||
|
if (proc.p_pgrp == NULL) {
|
||||||
|
kp->ki_kiflag = 0;
|
||||||
|
} else {
|
||||||
|
kp->ki_kiflag = sess.s_ttyvp ? KI_CTTY : 0;
|
||||||
|
if (sess.s_leader == p)
|
||||||
|
kp->ki_kiflag |= KI_SLEADER;
|
||||||
|
}
|
||||||
if ((proc.p_state != PRS_ZOMBIE) &&
|
if ((proc.p_state != PRS_ZOMBIE) &&
|
||||||
(mtd.td_blocked != 0)) {
|
(mtd.td_blocked != 0)) {
|
||||||
kp->ki_kiflag |= KI_LOCKBLOCK;
|
kp->ki_kiflag |= KI_LOCKBLOCK;
|
||||||
@ -381,17 +405,16 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p,
|
|||||||
(void)kvm_read(kd,
|
(void)kvm_read(kd,
|
||||||
(u_long)mtd.td_lockname,
|
(u_long)mtd.td_lockname,
|
||||||
kp->ki_lockname, LOCKNAMELEN);
|
kp->ki_lockname, LOCKNAMELEN);
|
||||||
|
else
|
||||||
|
memset(kp->ki_lockname, 0,
|
||||||
|
LOCKNAMELEN);
|
||||||
kp->ki_lockname[LOCKNAMELEN] = 0;
|
kp->ki_lockname[LOCKNAMELEN] = 0;
|
||||||
}
|
} else
|
||||||
kp->ki_runtime = cputick2usec(proc.p_rux.rux_runtime);
|
kp->ki_kiflag &= ~KI_LOCKBLOCK;
|
||||||
kp->ki_pid = proc.p_pid;
|
|
||||||
kp->ki_siglist = proc.p_siglist;
|
kp->ki_siglist = proc.p_siglist;
|
||||||
|
if (proc.p_state != PRS_ZOMBIE) {
|
||||||
SIGSETOR(kp->ki_siglist, mtd.td_siglist);
|
SIGSETOR(kp->ki_siglist, mtd.td_siglist);
|
||||||
kp->ki_sigmask = mtd.td_sigmask;
|
kp->ki_sigmask = mtd.td_sigmask;
|
||||||
kp->ki_xstat = KW_EXITCODE(proc.p_xexit, proc.p_xsig);
|
|
||||||
kp->ki_acflag = proc.p_acflag;
|
|
||||||
kp->ki_lock = proc.p_lock;
|
|
||||||
if (proc.p_state != PRS_ZOMBIE) {
|
|
||||||
kp->ki_swtime = (ticks - proc.p_swtick) / hz;
|
kp->ki_swtime = (ticks - proc.p_swtick) / hz;
|
||||||
kp->ki_flag = proc.p_flag;
|
kp->ki_flag = proc.p_flag;
|
||||||
kp->ki_sflag = 0;
|
kp->ki_sflag = 0;
|
||||||
@ -425,13 +448,17 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p,
|
|||||||
kp->ki_wchan = mtd.td_wchan;
|
kp->ki_wchan = mtd.td_wchan;
|
||||||
kp->ki_oncpu = mtd.td_oncpu;
|
kp->ki_oncpu = mtd.td_oncpu;
|
||||||
if (mtd.td_name[0] != '\0')
|
if (mtd.td_name[0] != '\0')
|
||||||
strlcpy(kp->ki_tdname, mtd.td_name, sizeof(kp->ki_tdname));
|
strlcpy(kp->ki_tdname, mtd.td_name,
|
||||||
|
sizeof(kp->ki_tdname));
|
||||||
|
else
|
||||||
|
memset(kp->ki_tdname, 0,
|
||||||
|
sizeof(kp->ki_tdname));
|
||||||
kp->ki_pctcpu = 0;
|
kp->ki_pctcpu = 0;
|
||||||
kp->ki_rqindex = 0;
|
kp->ki_rqindex = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note: legacy fields; wraps at NO_CPU_OLD or the
|
* Note: legacy fields; wraps at NO_CPU_OLD
|
||||||
* old max CPU value as appropriate
|
* or the old max CPU value as appropriate
|
||||||
*/
|
*/
|
||||||
if (mtd.td_lastcpu == NOCPU)
|
if (mtd.td_lastcpu == NOCPU)
|
||||||
kp->ki_lastcpu_old = NOCPU_OLD;
|
kp->ki_lastcpu_old = NOCPU_OLD;
|
||||||
@ -446,14 +473,19 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p,
|
|||||||
kp->ki_oncpu_old = MAXCPU_OLD;
|
kp->ki_oncpu_old = MAXCPU_OLD;
|
||||||
else
|
else
|
||||||
kp->ki_oncpu_old = mtd.td_oncpu;
|
kp->ki_oncpu_old = mtd.td_oncpu;
|
||||||
|
kp->ki_tid = mtd.td_tid;
|
||||||
} else {
|
} else {
|
||||||
|
memset(&kp->ki_sigmask, 0,
|
||||||
|
sizeof(kp->ki_sigmask));
|
||||||
kp->ki_stat = SZOMB;
|
kp->ki_stat = SZOMB;
|
||||||
|
kp->ki_tid = 0;
|
||||||
}
|
}
|
||||||
kp->ki_tdev_freebsd11 = kp->ki_tdev; /* truncate */
|
|
||||||
bcopy(&kinfo_proc, bp, sizeof(kinfo_proc));
|
bcopy(&kinfo_proc, bp, sizeof(kinfo_proc));
|
||||||
++bp;
|
++bp;
|
||||||
++cnt;
|
++cnt;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return (cnt);
|
return (cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -466,7 +498,7 @@ kvm_deadprocs(kvm_t *kd, int what, int arg, u_long a_allproc,
|
|||||||
u_long a_zombproc, int maxcnt)
|
u_long a_zombproc, int maxcnt)
|
||||||
{
|
{
|
||||||
struct kinfo_proc *bp = kd->procbase;
|
struct kinfo_proc *bp = kd->procbase;
|
||||||
int acnt, zcnt;
|
int acnt, zcnt = 0;
|
||||||
struct proc *p;
|
struct proc *p;
|
||||||
|
|
||||||
if (KREAD(kd, a_allproc, &p)) {
|
if (KREAD(kd, a_allproc, &p)) {
|
||||||
@ -477,6 +509,7 @@ kvm_deadprocs(kvm_t *kd, int what, int arg, u_long a_allproc,
|
|||||||
if (acnt < 0)
|
if (acnt < 0)
|
||||||
return (acnt);
|
return (acnt);
|
||||||
|
|
||||||
|
if (a_zombproc != 0) {
|
||||||
if (KREAD(kd, a_zombproc, &p)) {
|
if (KREAD(kd, a_zombproc, &p)) {
|
||||||
_kvm_err(kd, kd->program, "cannot read zombproc");
|
_kvm_err(kd, kd->program, "cannot read zombproc");
|
||||||
return (-1);
|
return (-1);
|
||||||
@ -484,6 +517,7 @@ kvm_deadprocs(kvm_t *kd, int what, int arg, u_long a_allproc,
|
|||||||
zcnt = kvm_proclist(kd, what, arg, p, bp + acnt, maxcnt - acnt);
|
zcnt = kvm_proclist(kd, what, arg, p, bp + acnt, maxcnt - acnt);
|
||||||
if (zcnt < 0)
|
if (zcnt < 0)
|
||||||
zcnt = 0;
|
zcnt = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return (acnt + zcnt);
|
return (acnt + zcnt);
|
||||||
}
|
}
|
||||||
@ -568,15 +602,18 @@ kvm_getprocs(kvm_t *kd, int op, int arg, int *cnt)
|
|||||||
liveout:
|
liveout:
|
||||||
nprocs = size == 0 ? 0 : size / kd->procbase->ki_structsize;
|
nprocs = size == 0 ? 0 : size / kd->procbase->ki_structsize;
|
||||||
} else {
|
} else {
|
||||||
struct nlist nl[7], *p;
|
struct nlist nl[6], *p;
|
||||||
|
struct nlist nlz[2];
|
||||||
|
|
||||||
nl[0].n_name = "_nprocs";
|
nl[0].n_name = "_nprocs";
|
||||||
nl[1].n_name = "_allproc";
|
nl[1].n_name = "_allproc";
|
||||||
nl[2].n_name = "_zombproc";
|
nl[2].n_name = "_ticks";
|
||||||
nl[3].n_name = "_ticks";
|
nl[3].n_name = "_hz";
|
||||||
nl[4].n_name = "_hz";
|
nl[4].n_name = "_cpu_tick_frequency";
|
||||||
nl[5].n_name = "_cpu_tick_frequency";
|
nl[5].n_name = 0;
|
||||||
nl[6].n_name = 0;
|
|
||||||
|
nlz[0].n_name = "_zombproc";
|
||||||
|
nlz[1].n_name = 0;
|
||||||
|
|
||||||
if (!kd->arch->ka_native(kd)) {
|
if (!kd->arch->ka_native(kd)) {
|
||||||
_kvm_err(kd, kd->program,
|
_kvm_err(kd, kd->program,
|
||||||
@ -591,19 +628,27 @@ kvm_getprocs(kvm_t *kd, int op, int arg, int *cnt)
|
|||||||
"%s: no such symbol", p->n_name);
|
"%s: no such symbol", p->n_name);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
(void) kvm_nlist(kd, nlz); /* attempt to get zombproc */
|
||||||
if (KREAD(kd, nl[0].n_value, &nprocs)) {
|
if (KREAD(kd, nl[0].n_value, &nprocs)) {
|
||||||
_kvm_err(kd, kd->program, "can't read nprocs");
|
_kvm_err(kd, kd->program, "can't read nprocs");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (KREAD(kd, nl[3].n_value, &ticks)) {
|
/*
|
||||||
|
* If returning all threads, we don't know how many that
|
||||||
|
* might be. Presume that there are, on average, no more
|
||||||
|
* than 10 threads per process.
|
||||||
|
*/
|
||||||
|
if (op == KERN_PROC_ALL || (op & KERN_PROC_INC_THREAD))
|
||||||
|
nprocs *= 10; /* XXX */
|
||||||
|
if (KREAD(kd, nl[2].n_value, &ticks)) {
|
||||||
_kvm_err(kd, kd->program, "can't read ticks");
|
_kvm_err(kd, kd->program, "can't read ticks");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (KREAD(kd, nl[4].n_value, &hz)) {
|
if (KREAD(kd, nl[3].n_value, &hz)) {
|
||||||
_kvm_err(kd, kd->program, "can't read hz");
|
_kvm_err(kd, kd->program, "can't read hz");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (KREAD(kd, nl[5].n_value, &cpu_tick_frequency)) {
|
if (KREAD(kd, nl[4].n_value, &cpu_tick_frequency)) {
|
||||||
_kvm_err(kd, kd->program,
|
_kvm_err(kd, kd->program,
|
||||||
"can't read cpu_tick_frequency");
|
"can't read cpu_tick_frequency");
|
||||||
return (0);
|
return (0);
|
||||||
@ -614,7 +659,7 @@ kvm_getprocs(kvm_t *kd, int op, int arg, int *cnt)
|
|||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
nprocs = kvm_deadprocs(kd, op, arg, nl[1].n_value,
|
nprocs = kvm_deadprocs(kd, op, arg, nl[1].n_value,
|
||||||
nl[2].n_value, nprocs);
|
nlz[0].n_value, nprocs);
|
||||||
if (nprocs <= 0) {
|
if (nprocs <= 0) {
|
||||||
_kvm_freeprocs(kd);
|
_kvm_freeprocs(kd);
|
||||||
nprocs = 0;
|
nprocs = 0;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#
|
#
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||||
|
#
|
||||||
# Copyright (c) 2017 Kyle Evans <kevans@FreeBSD.org>
|
# Copyright (c) 2017 Kyle Evans <kevans@FreeBSD.org>
|
||||||
# All rights reserved.
|
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions
|
# modification, are permitted provided that the following conditions
|
||||||
|
@ -474,7 +474,11 @@ _thr_mutex_destroy(pthread_mutex_t *mutex)
|
|||||||
if (m == THR_PSHARED_PTR) {
|
if (m == THR_PSHARED_PTR) {
|
||||||
m1 = __thr_pshared_offpage(mutex, 0);
|
m1 = __thr_pshared_offpage(mutex, 0);
|
||||||
if (m1 != NULL) {
|
if (m1 != NULL) {
|
||||||
mutex_assert_not_owned(_get_curthread(), m1);
|
if ((uint32_t)m1->m_lock.m_owner !=
|
||||||
|
UMUTEX_RB_OWNERDEAD) {
|
||||||
|
mutex_assert_not_owned(
|
||||||
|
_get_curthread(), m1);
|
||||||
|
}
|
||||||
__thr_pshared_destroy(mutex);
|
__thr_pshared_destroy(mutex);
|
||||||
}
|
}
|
||||||
*mutex = THR_MUTEX_DESTROYED;
|
*mutex = THR_MUTEX_DESTROYED;
|
||||||
|
@ -145,9 +145,9 @@ __ieee754_exp(double x) /* default IEEE double exp */
|
|||||||
/* x is now in primary range */
|
/* x is now in primary range */
|
||||||
t = x*x;
|
t = x*x;
|
||||||
if(k >= -1021)
|
if(k >= -1021)
|
||||||
INSERT_WORDS(twopk,0x3ff00000+(k<<20), 0);
|
INSERT_WORDS(twopk,((u_int32_t)(0x3ff+k))<<20, 0);
|
||||||
else
|
else
|
||||||
INSERT_WORDS(twopk,0x3ff00000+((k+1000)<<20), 0);
|
INSERT_WORDS(twopk,((u_int32_t)(0x3ff+(k+1000)))<<20, 0);
|
||||||
c = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
|
c = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
|
||||||
if(k==0) return one-((x*c)/(c-2.0)-x);
|
if(k==0) return one-((x*c)/(c-2.0)-x);
|
||||||
else y = one-((lo-(x*c)/(2.0-c))-hi);
|
else y = one-((lo-(x*c)/(2.0-c))-hi);
|
||||||
|
@ -83,9 +83,9 @@ __ieee754_expf(float x)
|
|||||||
/* x is now in primary range */
|
/* x is now in primary range */
|
||||||
t = x*x;
|
t = x*x;
|
||||||
if(k >= -125)
|
if(k >= -125)
|
||||||
SET_FLOAT_WORD(twopk,0x3f800000+(k<<23));
|
SET_FLOAT_WORD(twopk,((u_int32_t)(0x7f+k))<<23);
|
||||||
else
|
else
|
||||||
SET_FLOAT_WORD(twopk,0x3f800000+((k+100)<<23));
|
SET_FLOAT_WORD(twopk,((u_int32_t)(0x7f+(k+100)))<<23);
|
||||||
c = x - t*(P1+t*P2);
|
c = x - t*(P1+t*P2);
|
||||||
if(k==0) return one-((x*c)/(c-(float)2.0)-x);
|
if(k==0) return one-((x*c)/(c-(float)2.0)-x);
|
||||||
else y = one-((lo-(x*c)/((float)2.0-c))-hi);
|
else y = one-((lo-(x*c)/((float)2.0-c))-hi);
|
||||||
|
@ -188,7 +188,7 @@ expm1(double x)
|
|||||||
e = hxs*((r1-t)/(6.0 - x*t));
|
e = hxs*((r1-t)/(6.0 - x*t));
|
||||||
if(k==0) return x - (x*e-hxs); /* c is 0 */
|
if(k==0) return x - (x*e-hxs); /* c is 0 */
|
||||||
else {
|
else {
|
||||||
INSERT_WORDS(twopk,0x3ff00000+(k<<20),0); /* 2^k */
|
INSERT_WORDS(twopk,((u_int32_t)(0x3ff+k))<<20,0); /* 2^k */
|
||||||
e = (x*(e-c)-c);
|
e = (x*(e-c)-c);
|
||||||
e -= hxs;
|
e -= hxs;
|
||||||
if(k== -1) return 0.5*(x-e)-0.5;
|
if(k== -1) return 0.5*(x-e)-0.5;
|
||||||
|
@ -94,7 +94,7 @@ expm1f(float x)
|
|||||||
e = hxs*((r1-t)/((float)6.0 - x*t));
|
e = hxs*((r1-t)/((float)6.0 - x*t));
|
||||||
if(k==0) return x - (x*e-hxs); /* c is 0 */
|
if(k==0) return x - (x*e-hxs); /* c is 0 */
|
||||||
else {
|
else {
|
||||||
SET_FLOAT_WORD(twopk,0x3f800000+(k<<23)); /* 2^k */
|
SET_FLOAT_WORD(twopk,((u_int32_t)(0x7f+k))<<23); /* 2^k */
|
||||||
e = (x*(e-c)-c);
|
e = (x*(e-c)-c);
|
||||||
e -= hxs;
|
e -= hxs;
|
||||||
if(k== -1) return (float)0.5*(x-e)-(float)0.5;
|
if(k== -1) return (float)0.5*(x-e)-(float)0.5;
|
||||||
|
@ -65,7 +65,8 @@ struct mntopt {
|
|||||||
#define MOPT_UPDATE { "update", 0, MNT_UPDATE, 0 }
|
#define MOPT_UPDATE { "update", 0, MNT_UPDATE, 0 }
|
||||||
#define MOPT_RO { "ro", 0, MNT_RDONLY, 0 }
|
#define MOPT_RO { "ro", 0, MNT_RDONLY, 0 }
|
||||||
#define MOPT_RW { "rw", 1, MNT_RDONLY, 0 }
|
#define MOPT_RW { "rw", 1, MNT_RDONLY, 0 }
|
||||||
|
#define MOPT_NOCOVER { "cover", 1, MNT_NOCOVER, 0 }
|
||||||
|
#define MOPT_EMPTYDIR { "emptydir", 0, MNT_EMPTYDIR, 0 }
|
||||||
/* This is parsed by mount(8), but is ignored by specific mount_*(8)s. */
|
/* This is parsed by mount(8), but is ignored by specific mount_*(8)s. */
|
||||||
#define MOPT_AUTO { "auto", 0, 0, 0 }
|
#define MOPT_AUTO { "auto", 0, 0, 0 }
|
||||||
|
|
||||||
@ -95,7 +96,9 @@ struct mntopt {
|
|||||||
MOPT_ACLS, \
|
MOPT_ACLS, \
|
||||||
MOPT_NFS4ACLS, \
|
MOPT_NFS4ACLS, \
|
||||||
MOPT_AUTOMOUNTED, \
|
MOPT_AUTOMOUNTED, \
|
||||||
MOPT_UNTRUSTED
|
MOPT_UNTRUSTED, \
|
||||||
|
MOPT_NOCOVER, \
|
||||||
|
MOPT_EMPTYDIR
|
||||||
|
|
||||||
void getmntopts(const char *, const struct mntopt *, int *, int *);
|
void getmntopts(const char *, const struct mntopt *, int *, int *);
|
||||||
void rmslashes(char *, char *);
|
void rmslashes(char *, char *);
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
.\" @(#)mount.8 8.8 (Berkeley) 6/16/94
|
.\" @(#)mount.8 8.8 (Berkeley) 6/16/94
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd March 22, 2017
|
.Dd August 28, 2019
|
||||||
.Dt MOUNT 8
|
.Dt MOUNT 8
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -162,6 +162,8 @@ When used with the
|
|||||||
.Fl u
|
.Fl u
|
||||||
flag, this is the same as specifying the options currently in effect for
|
flag, this is the same as specifying the options currently in effect for
|
||||||
the mounted file system.
|
the mounted file system.
|
||||||
|
.It Cm emptydir
|
||||||
|
Require that the mount point directory be empty.
|
||||||
.It Cm force
|
.It Cm force
|
||||||
The same as
|
The same as
|
||||||
.Fl f ;
|
.Fl f ;
|
||||||
@ -237,6 +239,9 @@ flag.
|
|||||||
Disable read clustering.
|
Disable read clustering.
|
||||||
.It Cm noclusterw
|
.It Cm noclusterw
|
||||||
Disable write clustering.
|
Disable write clustering.
|
||||||
|
.It Cm nocover
|
||||||
|
Do not mount if the requested mount point is already
|
||||||
|
the root of a mount point.
|
||||||
.It Cm noexec
|
.It Cm noexec
|
||||||
Do not allow execution of any binaries on the mounted file system.
|
Do not allow execution of any binaries on the mounted file system.
|
||||||
This option is useful for a server that has file systems containing
|
This option is useful for a server that has file systems containing
|
||||||
|
@ -119,6 +119,8 @@ static struct opt {
|
|||||||
{ MNT_AUTOMOUNTED, "automounted" },
|
{ MNT_AUTOMOUNTED, "automounted" },
|
||||||
{ MNT_VERIFIED, "verified" },
|
{ MNT_VERIFIED, "verified" },
|
||||||
{ MNT_UNTRUSTED, "untrusted" },
|
{ MNT_UNTRUSTED, "untrusted" },
|
||||||
|
{ MNT_NOCOVER, "nocover" },
|
||||||
|
{ MNT_EMPTYDIR, "emptydir" },
|
||||||
{ 0, NULL }
|
{ 0, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -975,6 +977,8 @@ flags2opts(int flags)
|
|||||||
if (flags & MNT_ACLS) res = catopt(res, "acls");
|
if (flags & MNT_ACLS) res = catopt(res, "acls");
|
||||||
if (flags & MNT_NFS4ACLS) res = catopt(res, "nfsv4acls");
|
if (flags & MNT_NFS4ACLS) res = catopt(res, "nfsv4acls");
|
||||||
if (flags & MNT_UNTRUSTED) res = catopt(res, "untrusted");
|
if (flags & MNT_UNTRUSTED) res = catopt(res, "untrusted");
|
||||||
|
if (flags & MNT_NOCOVER) res = catopt(res, "nocover");
|
||||||
|
if (flags & MNT_EMPTYDIR) res = catopt(res, "emptydir");
|
||||||
|
|
||||||
return (res);
|
return (res);
|
||||||
}
|
}
|
||||||
|
@ -143,9 +143,9 @@ perftest(const struct cmd *f, int argc, char *argv[])
|
|||||||
if (arg_parse(argc, argv, f))
|
if (arg_parse(argc, argv, f))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (opt.flags == NULL || opt.op == NULL)
|
if (opt.op == NULL)
|
||||||
arg_help(argc, argv, f);
|
arg_help(argc, argv, f);
|
||||||
if (strcmp(opt.flags, "refthread") == 0)
|
if (opt.flags != NULL && strcmp(opt.flags, "refthread") == 0)
|
||||||
io_test.flags |= NVME_TEST_FLAG_REFTHREAD;
|
io_test.flags |= NVME_TEST_FLAG_REFTHREAD;
|
||||||
if (opt.intr != NULL) {
|
if (opt.intr != NULL) {
|
||||||
if (strcmp(opt.intr, "bio") == 0 ||
|
if (strcmp(opt.intr, "bio") == 0 ||
|
||||||
@ -163,6 +163,7 @@ perftest(const struct cmd *f, int argc, char *argv[])
|
|||||||
fprintf(stderr, "Bad number of threads %d\n", opt.threads);
|
fprintf(stderr, "Bad number of threads %d\n", opt.threads);
|
||||||
arg_help(argc, argv, f);
|
arg_help(argc, argv, f);
|
||||||
}
|
}
|
||||||
|
io_test.num_threads = opt.threads;
|
||||||
if (strcasecmp(opt.op, "read") == 0)
|
if (strcasecmp(opt.op, "read") == 0)
|
||||||
io_test.opc = NVME_OPC_READ;
|
io_test.opc = NVME_OPC_READ;
|
||||||
else if (strcasecmp(opt.op, "write") == 0)
|
else if (strcasecmp(opt.op, "write") == 0)
|
||||||
@ -176,6 +177,7 @@ perftest(const struct cmd *f, int argc, char *argv[])
|
|||||||
arg_help(argc, argv, f);
|
arg_help(argc, argv, f);
|
||||||
}
|
}
|
||||||
io_test.time = opt.time;
|
io_test.time = opt.time;
|
||||||
|
io_test.size = opt.size;
|
||||||
open_dev(opt.dev, &fd, 1, 1);
|
open_dev(opt.dev, &fd, 1, 1);
|
||||||
if (ioctl(fd, ioctl_cmd, &io_test) < 0)
|
if (ioctl(fd, ioctl_cmd, &io_test) < 0)
|
||||||
err(1, "ioctl NVME_IO_TEST failed");
|
err(1, "ioctl NVME_IO_TEST failed");
|
||||||
|
@ -1028,8 +1028,8 @@ main(int argc, char *argv[])
|
|||||||
err(1, "caph_enter_casper");
|
err(1, "caph_enter_casper");
|
||||||
|
|
||||||
cap_rights_init(&rights_stdin);
|
cap_rights_init(&rights_stdin);
|
||||||
if (cap_rights_limit(STDIN_FILENO, &rights_stdin) < 0)
|
if (caph_rights_limit(STDIN_FILENO, &rights_stdin) < 0)
|
||||||
err(1, "cap_rights_limit stdin");
|
err(1, "caph_rights_limit stdin");
|
||||||
if (caph_limit_stdout() < 0)
|
if (caph_limit_stdout() < 0)
|
||||||
err(1, "caph_limit_stdout");
|
err(1, "caph_limit_stdout");
|
||||||
if (caph_limit_stderr() < 0)
|
if (caph_limit_stderr() < 0)
|
||||||
@ -1037,10 +1037,10 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
cap_rights_init(&rights_srecv, CAP_RECV, CAP_EVENT, CAP_SETSOCKOPT);
|
cap_rights_init(&rights_srecv, CAP_RECV, CAP_EVENT, CAP_SETSOCKOPT);
|
||||||
if (caph_rights_limit(srecv, &rights_srecv) < 0)
|
if (caph_rights_limit(srecv, &rights_srecv) < 0)
|
||||||
err(1, "cap_rights_limit srecv");
|
err(1, "caph_rights_limit srecv");
|
||||||
cap_rights_init(&rights_ssend, CAP_SEND, CAP_SETSOCKOPT);
|
cap_rights_init(&rights_ssend, CAP_SEND, CAP_SETSOCKOPT);
|
||||||
if (caph_rights_limit(ssend, &rights_ssend) < 0)
|
if (caph_rights_limit(ssend, &rights_ssend) < 0)
|
||||||
err(1, "cap_rights_limit ssend");
|
err(1, "caph_rights_limit ssend");
|
||||||
|
|
||||||
#if defined(SO_SNDBUF) && defined(SO_RCVBUF)
|
#if defined(SO_SNDBUF) && defined(SO_RCVBUF)
|
||||||
if (sockbufsize) {
|
if (sockbufsize) {
|
||||||
@ -1092,10 +1092,10 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
cap_rights_clear(&rights_srecv, CAP_SETSOCKOPT);
|
cap_rights_clear(&rights_srecv, CAP_SETSOCKOPT);
|
||||||
if (caph_rights_limit(srecv, &rights_srecv) < 0)
|
if (caph_rights_limit(srecv, &rights_srecv) < 0)
|
||||||
err(1, "cap_rights_limit srecv setsockopt");
|
err(1, "caph_rights_limit srecv setsockopt");
|
||||||
cap_rights_clear(&rights_ssend, CAP_SETSOCKOPT);
|
cap_rights_clear(&rights_ssend, CAP_SETSOCKOPT);
|
||||||
if (caph_rights_limit(ssend, &rights_ssend) < 0)
|
if (caph_rights_limit(ssend, &rights_ssend) < 0)
|
||||||
err(1, "cap_rights_limit ssend setsockopt");
|
err(1, "caph_rights_limit ssend setsockopt");
|
||||||
|
|
||||||
printf("PING6(%lu=40+8+%lu bytes) ", (unsigned long)(40 + pingerlen()),
|
printf("PING6(%lu=40+8+%lu bytes) ", (unsigned long)(40 + pingerlen()),
|
||||||
(unsigned long)(pingerlen() - 8));
|
(unsigned long)(pingerlen() - 8));
|
||||||
|
@ -120,7 +120,7 @@ beforecheck:
|
|||||||
# etc.
|
# etc.
|
||||||
aftercheck:
|
aftercheck:
|
||||||
@cd ${.CURDIR} && ${MAKE} clean
|
@cd ${.CURDIR} && ${MAKE} clean
|
||||||
@chflags -R 0 "${DESTDIR}"
|
@test ! -e ${DESTDIR} || chflags -R 0 "${DESTDIR}"
|
||||||
@rm -Rf "${DESTDIR}"
|
@rm -Rf "${DESTDIR}"
|
||||||
|
|
||||||
.endif
|
.endif
|
||||||
|
@ -343,6 +343,91 @@ efi_cons_probe(struct console *cp)
|
|||||||
cp->c_flags |= C_PRESENTIN | C_PRESENTOUT;
|
cp->c_flags |= C_PRESENTIN | C_PRESENTOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
color_name_to_teken(const char *name, int *val)
|
||||||
|
{
|
||||||
|
if (strcasecmp(name, "black") == 0) {
|
||||||
|
*val = TC_BLACK;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
if (strcasecmp(name, "red") == 0) {
|
||||||
|
*val = TC_RED;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
if (strcasecmp(name, "green") == 0) {
|
||||||
|
*val = TC_GREEN;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
if (strcasecmp(name, "brown") == 0) {
|
||||||
|
*val = TC_BROWN;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
if (strcasecmp(name, "blue") == 0) {
|
||||||
|
*val = TC_BLUE;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
if (strcasecmp(name, "magenta") == 0) {
|
||||||
|
*val = TC_MAGENTA;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
if (strcasecmp(name, "cyan") == 0) {
|
||||||
|
*val = TC_CYAN;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
if (strcasecmp(name, "white") == 0) {
|
||||||
|
*val = TC_WHITE;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
efi_set_colors(struct env_var *ev, int flags, const void *value)
|
||||||
|
{
|
||||||
|
int val = 0;
|
||||||
|
char buf[2];
|
||||||
|
const void *evalue;
|
||||||
|
const teken_attr_t *ap;
|
||||||
|
teken_attr_t a;
|
||||||
|
|
||||||
|
if (value == NULL)
|
||||||
|
return (CMD_OK);
|
||||||
|
|
||||||
|
if (color_name_to_teken(value, &val)) {
|
||||||
|
snprintf(buf, sizeof (buf), "%d", val);
|
||||||
|
evalue = buf;
|
||||||
|
} else {
|
||||||
|
char *end;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
val = (int)strtol(value, &end, 0);
|
||||||
|
if (errno != 0 || *end != '\0') {
|
||||||
|
printf("Allowed values are either ansi color name or "
|
||||||
|
"number from range [0-7].\n");
|
||||||
|
return (CMD_OK);
|
||||||
|
}
|
||||||
|
evalue = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
ap = teken_get_defattr(&teken);
|
||||||
|
a = *ap;
|
||||||
|
if (strcmp(ev->ev_name, "teken.fg_color") == 0) {
|
||||||
|
/* is it already set? */
|
||||||
|
if (ap->ta_fgcolor == val)
|
||||||
|
return (CMD_OK);
|
||||||
|
a.ta_fgcolor = val;
|
||||||
|
}
|
||||||
|
if (strcmp(ev->ev_name, "teken.bg_color") == 0) {
|
||||||
|
/* is it already set? */
|
||||||
|
if (ap->ta_bgcolor == val)
|
||||||
|
return (CMD_OK);
|
||||||
|
a.ta_bgcolor = val;
|
||||||
|
}
|
||||||
|
env_setenv(ev->ev_name, flags | EV_NOHOOK, evalue, NULL, NULL);
|
||||||
|
teken_set_defattr(&teken, &a);
|
||||||
|
return (CMD_OK);
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
efi_cons_update_mode(void)
|
efi_cons_update_mode(void)
|
||||||
{
|
{
|
||||||
@ -374,6 +459,13 @@ efi_cons_update_mode(void)
|
|||||||
teken_set_winsize(&teken, &tp);
|
teken_set_winsize(&teken, &tp);
|
||||||
a = teken_get_defattr(&teken);
|
a = teken_get_defattr(&teken);
|
||||||
|
|
||||||
|
snprintf(env, sizeof(env), "%d", a->ta_fgcolor);
|
||||||
|
env_setenv("teken.fg_color", EV_VOLATILE, env, efi_set_colors,
|
||||||
|
env_nounset);
|
||||||
|
snprintf(env, sizeof(env), "%d", a->ta_bgcolor);
|
||||||
|
env_setenv("teken.bg_color", EV_VOLATILE, env, efi_set_colors,
|
||||||
|
env_nounset);
|
||||||
|
|
||||||
for (int row = 0; row < rows; row++)
|
for (int row = 0; row < rows; row++)
|
||||||
for (int col = 0; col < cols; col++) {
|
for (int col = 0; col < cols; col++) {
|
||||||
buffer[col + row * tp.tp_col].c = ' ';
|
buffer[col + row * tp.tp_col].c = ' ';
|
||||||
|
@ -397,7 +397,7 @@ also menu-infrastructure definitions
|
|||||||
setenv
|
setenv
|
||||||
|
|
||||||
\ Assign third to ansi_caption[x][y]
|
\ Assign third to ansi_caption[x][y]
|
||||||
kerncapbuf 0 s" @[1mK@[37mernel: " [char] @ escc! strcat
|
kerncapbuf 0 s" @[1mK@[mernel: " [char] @ escc! strcat
|
||||||
kernmenuidx @ [char] 0 = if
|
kernmenuidx @ [char] 0 = if
|
||||||
s" default/@[32m"
|
s" default/@[32m"
|
||||||
else
|
else
|
||||||
@ -405,7 +405,7 @@ also menu-infrastructure definitions
|
|||||||
then
|
then
|
||||||
[char] @ escc! strcat
|
[char] @ escc! strcat
|
||||||
2over strcat
|
2over strcat
|
||||||
s" @[37m" [char] @ escc! strcat
|
s" @[m" [char] @ escc! strcat
|
||||||
kernidx @ kernmenuidx @ ansi_caption[x][y]
|
kernidx @ kernmenuidx @ ansi_caption[x][y]
|
||||||
setenv
|
setenv
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ s" currdev" getenv dup 0> [if] drop 4 s" zfs:" compare 0= [if]
|
|||||||
set mainmenu_caption[7]="Select Boot [E]nvironment..."
|
set mainmenu_caption[7]="Select Boot [E]nvironment..."
|
||||||
set mainmenu_command[7]="3 goto_menu"
|
set mainmenu_command[7]="3 goto_menu"
|
||||||
set mainmenu_keycode[7]=101
|
set mainmenu_keycode[7]=101
|
||||||
set mainansi_caption[7]="Select Boot ^[1mE^[37mnvironment..."
|
set mainansi_caption[7]="Select Boot ^[1mE^[mnvironment..."
|
||||||
|
|
||||||
s" chain_disk" getenv? [if]
|
s" chain_disk" getenv? [if]
|
||||||
set mainmenu_caption[8]="Chain[L]oad ${chain_disk}"
|
set mainmenu_caption[8]="Chain[L]oad ${chain_disk}"
|
||||||
|
@ -569,6 +569,96 @@ vidc_probe(struct console *cp)
|
|||||||
cp->c_flags |= C_PRESENTOUT;
|
cp->c_flags |= C_PRESENTOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
color_name_to_teken(const char *name, int *val)
|
||||||
|
{
|
||||||
|
if (strcasecmp(name, "black") == 0) {
|
||||||
|
*val = TC_BLACK;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
if (strcasecmp(name, "red") == 0) {
|
||||||
|
*val = TC_RED;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
if (strcasecmp(name, "green") == 0) {
|
||||||
|
*val = TC_GREEN;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
if (strcasecmp(name, "brown") == 0) {
|
||||||
|
*val = TC_BROWN;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
if (strcasecmp(name, "blue") == 0) {
|
||||||
|
*val = TC_BLUE;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
if (strcasecmp(name, "magenta") == 0) {
|
||||||
|
*val = TC_MAGENTA;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
if (strcasecmp(name, "cyan") == 0) {
|
||||||
|
*val = TC_CYAN;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
if (strcasecmp(name, "white") == 0) {
|
||||||
|
*val = TC_WHITE;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
vidc_set_colors(struct env_var *ev, int flags, const void *value)
|
||||||
|
{
|
||||||
|
int val = 0;
|
||||||
|
char buf[2];
|
||||||
|
const void *evalue;
|
||||||
|
const teken_attr_t *ap;
|
||||||
|
teken_attr_t a;
|
||||||
|
|
||||||
|
if (value == NULL)
|
||||||
|
return (CMD_OK);
|
||||||
|
|
||||||
|
if (color_name_to_teken(value, &val)) {
|
||||||
|
snprintf(buf, sizeof (buf), "%d", val);
|
||||||
|
evalue = buf;
|
||||||
|
} else {
|
||||||
|
char *end;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
val = (int)strtol(value, &end, 0);
|
||||||
|
if (errno != 0 || *end != '\0') {
|
||||||
|
printf("Allowed values are either ansi color name or "
|
||||||
|
"number from range [0-7].\n");
|
||||||
|
return (CMD_OK);
|
||||||
|
}
|
||||||
|
evalue = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
ap = teken_get_defattr(&teken);
|
||||||
|
a = *ap;
|
||||||
|
if (strcmp(ev->ev_name, "teken.fg_color") == 0) {
|
||||||
|
/* is it already set? */
|
||||||
|
if (ap->ta_fgcolor == val)
|
||||||
|
return (CMD_OK);
|
||||||
|
a.ta_fgcolor = val;
|
||||||
|
}
|
||||||
|
if (strcmp(ev->ev_name, "teken.bg_color") == 0) {
|
||||||
|
/* is it already set? */
|
||||||
|
if (ap->ta_bgcolor == val)
|
||||||
|
return (CMD_OK);
|
||||||
|
a.ta_bgcolor = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Improve visibility */
|
||||||
|
if (a.ta_bgcolor == TC_WHITE)
|
||||||
|
a.ta_bgcolor |= TC_LIGHT;
|
||||||
|
|
||||||
|
env_setenv(ev->ev_name, flags | EV_NOHOOK, evalue, NULL, NULL);
|
||||||
|
teken_set_defattr(&teken, &a);
|
||||||
|
return (CMD_OK);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
vidc_init(int arg)
|
vidc_init(int arg)
|
||||||
{
|
{
|
||||||
@ -603,15 +693,22 @@ vidc_init(int arg)
|
|||||||
if (buffer == NULL)
|
if (buffer == NULL)
|
||||||
return (1);
|
return (1);
|
||||||
|
|
||||||
teken_init(&teken, &tf, NULL);
|
|
||||||
teken_set_winsize(&teken, &tp);
|
|
||||||
a = teken_get_defattr(&teken);
|
|
||||||
|
|
||||||
snprintf(env, sizeof (env), "%u", tp.tp_row);
|
snprintf(env, sizeof (env), "%u", tp.tp_row);
|
||||||
setenv("LINES", env, 1);
|
setenv("LINES", env, 1);
|
||||||
snprintf(env, sizeof (env), "%u", tp.tp_col);
|
snprintf(env, sizeof (env), "%u", tp.tp_col);
|
||||||
setenv("COLUMNS", env, 1);
|
setenv("COLUMNS", env, 1);
|
||||||
|
|
||||||
|
teken_init(&teken, &tf, NULL);
|
||||||
|
teken_set_winsize(&teken, &tp);
|
||||||
|
a = teken_get_defattr(&teken);
|
||||||
|
|
||||||
|
snprintf(env, sizeof(env), "%d", a->ta_fgcolor);
|
||||||
|
env_setenv("teken.fg_color", EV_VOLATILE, env, vidc_set_colors,
|
||||||
|
env_nounset);
|
||||||
|
snprintf(env, sizeof(env), "%d", a->ta_bgcolor);
|
||||||
|
env_setenv("teken.bg_color", EV_VOLATILE, env, vidc_set_colors,
|
||||||
|
env_nounset);
|
||||||
|
|
||||||
for (int row = 0; row < tp.tp_row; row++)
|
for (int row = 0; row < tp.tp_row; row++)
|
||||||
for (int col = 0; col < tp.tp_col; col++) {
|
for (int col = 0; col < tp.tp_col; col++) {
|
||||||
buffer[col + row * tp.tp_col].c = ' ';
|
buffer[col + row * tp.tp_col].c = ' ';
|
||||||
|
@ -42,7 +42,7 @@ color.MAGENTA = 5
|
|||||||
color.CYAN = 6
|
color.CYAN = 6
|
||||||
color.WHITE = 7
|
color.WHITE = 7
|
||||||
|
|
||||||
color.DEFAULT = 0
|
color.DEFAULT = 9
|
||||||
color.BRIGHT = 1
|
color.BRIGHT = 1
|
||||||
color.DIM = 2
|
color.DIM = 2
|
||||||
|
|
||||||
@ -67,7 +67,7 @@ function color.resetfg()
|
|||||||
if color.disabled then
|
if color.disabled then
|
||||||
return ''
|
return ''
|
||||||
end
|
end
|
||||||
return color.escapefg(color.WHITE)
|
return color.escapefg(color.DEFAULT)
|
||||||
end
|
end
|
||||||
|
|
||||||
function color.escapebg(color_value)
|
function color.escapebg(color_value)
|
||||||
@ -81,7 +81,7 @@ function color.resetbg()
|
|||||||
if color.disabled then
|
if color.disabled then
|
||||||
return ''
|
return ''
|
||||||
end
|
end
|
||||||
return color.escapebg(color.BLACK)
|
return color.escapebg(color.DEFAULT)
|
||||||
end
|
end
|
||||||
|
|
||||||
function color.escape(fg_color, bg_color, attribute)
|
function color.escape(fg_color, bg_color, attribute)
|
||||||
@ -101,7 +101,7 @@ function color.default()
|
|||||||
if color.disabled then
|
if color.disabled then
|
||||||
return ""
|
return ""
|
||||||
end
|
end
|
||||||
return color.escape(color.WHITE, color.BLACK, color.DEFAULT)
|
return color.escape(color.DEFAULT, color.DEFAULT)
|
||||||
end
|
end
|
||||||
|
|
||||||
function color.highlight(str)
|
function color.highlight(str)
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
-- SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
-- SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||||
--
|
--
|
||||||
-- Copyright (c) 2015 Pedro Souza <pedrosouza@freebsd.org>
|
-- Copyright (c) 2015 Pedro Souza <pedrosouza@freebsd.org>
|
||||||
-- Copyright (C) 2018 Kyle Evans <kevans@FreeBSD.org>
|
-- Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
|
||||||
-- All rights reserved.
|
-- All rights reserved.
|
||||||
--
|
--
|
||||||
-- Redistribution and use in source and binary forms, with or without
|
-- Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -48,7 +48,7 @@ local beastie_color = {
|
|||||||
" \\ / /\\",
|
" \\ / /\\",
|
||||||
" \027[36m______\027[31m( (_ / \\______/",
|
" \027[36m______\027[31m( (_ / \\______/",
|
||||||
" \027[36m,' ,-----' |",
|
" \027[36m,' ,-----' |",
|
||||||
" `--{__________)\027[37m"
|
" `--{__________)\027[m"
|
||||||
}
|
}
|
||||||
|
|
||||||
drawer.addLogo("beastie", {
|
drawer.addLogo("beastie", {
|
||||||
|
@ -44,7 +44,7 @@ local orb_color = {
|
|||||||
" -- \027[31;1m-.\027[31m",
|
" -- \027[31;1m-.\027[31m",
|
||||||
" `:` \027[31;1m`:`",
|
" `:` \027[31;1m`:`",
|
||||||
" \027[31;1m.-- `--.",
|
" \027[31;1m.-- `--.",
|
||||||
" .---.....----.\027[37m"
|
" .---.....----.\027[m"
|
||||||
}
|
}
|
||||||
|
|
||||||
drawer.addLogo("orb", {
|
drawer.addLogo("orb", {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
-- SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
-- SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||||
--
|
--
|
||||||
-- Copyright (c) 2015 Pedro Souza <pedrosouza@freebsd.org>
|
-- Copyright (c) 2015 Pedro Souza <pedrosouza@freebsd.org>
|
||||||
-- Copyright (C) 2018 Kyle Evans <kevans@FreeBSD.org>
|
-- Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
|
||||||
-- All rights reserved.
|
-- All rights reserved.
|
||||||
--
|
--
|
||||||
-- Redistribution and use in source and binary forms, with or without
|
-- Redistribution and use in source and binary forms, with or without
|
||||||
@ -47,10 +47,10 @@ local return_menu_entry = {
|
|||||||
local function OnOff(str, value)
|
local function OnOff(str, value)
|
||||||
if value then
|
if value then
|
||||||
return str .. color.escapefg(color.GREEN) .. "On" ..
|
return str .. color.escapefg(color.GREEN) .. "On" ..
|
||||||
color.escapefg(color.WHITE)
|
color.resetfg()
|
||||||
else
|
else
|
||||||
return str .. color.escapefg(color.RED) .. "off" ..
|
return str .. color.escapefg(color.RED) .. "off" ..
|
||||||
color.escapefg(color.WHITE)
|
color.resetfg()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
-- SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
-- SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||||
--
|
--
|
||||||
-- Copyright (c) 2015 Pedro Souza <pedrosouza@freebsd.org>
|
-- Copyright (c) 2015 Pedro Souza <pedrosouza@freebsd.org>
|
||||||
-- Copyright (C) 2018 Kyle Evans <kevans@FreeBSD.org>
|
-- Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
|
||||||
-- All rights reserved.
|
-- All rights reserved.
|
||||||
--
|
--
|
||||||
-- Redistribution and use in source and binary forms, with or without
|
-- Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -74,7 +74,7 @@ efi_destroy_1t1_map(void)
|
|||||||
if (obj_1t1_pt != NULL) {
|
if (obj_1t1_pt != NULL) {
|
||||||
VM_OBJECT_RLOCK(obj_1t1_pt);
|
VM_OBJECT_RLOCK(obj_1t1_pt);
|
||||||
TAILQ_FOREACH(m, &obj_1t1_pt->memq, listq)
|
TAILQ_FOREACH(m, &obj_1t1_pt->memq, listq)
|
||||||
m->wire_count = VPRC_OBJREF;
|
m->ref_count = VPRC_OBJREF;
|
||||||
vm_wire_sub(obj_1t1_pt->resident_page_count);
|
vm_wire_sub(obj_1t1_pt->resident_page_count);
|
||||||
VM_OBJECT_RUNLOCK(obj_1t1_pt);
|
VM_OBJECT_RUNLOCK(obj_1t1_pt);
|
||||||
vm_object_deallocate(obj_1t1_pt);
|
vm_object_deallocate(obj_1t1_pt);
|
||||||
|
@ -267,7 +267,6 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
|
|||||||
*/
|
*/
|
||||||
printf("kldload: unexpected R_COPY relocation\n");
|
printf("kldload: unexpected R_COPY relocation\n");
|
||||||
return (-1);
|
return (-1);
|
||||||
break;
|
|
||||||
|
|
||||||
case R_X86_64_GLOB_DAT: /* S */
|
case R_X86_64_GLOB_DAT: /* S */
|
||||||
case R_X86_64_JMP_SLOT: /* XXX need addend + offset */
|
case R_X86_64_JMP_SLOT: /* XXX need addend + offset */
|
||||||
@ -279,7 +278,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case R_X86_64_RELATIVE: /* B + A */
|
case R_X86_64_RELATIVE: /* B + A */
|
||||||
addr = relocbase + addend;
|
addr = elf_relocaddr(lf, relocbase + addend);
|
||||||
val = addr;
|
val = addr;
|
||||||
if (*where != val)
|
if (*where != val)
|
||||||
*where = val;
|
*where = val;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user