Merge ^/head r363989 through r364034.
This commit is contained in:
commit
e53daa1d64
@ -2179,9 +2179,6 @@ _yacc= usr.bin/yacc
|
||||
_gensnmptree= usr.sbin/bsnmpd/gensnmptree
|
||||
.endif
|
||||
|
||||
.if ${MK_LOCALES} != "no"
|
||||
_localedef= usr.bin/localedef
|
||||
.endif
|
||||
|
||||
# We need to build tblgen when we're building clang or lld, either as
|
||||
# bootstrap tools, or as the part of the normal build.
|
||||
@ -2296,13 +2293,12 @@ ${_bt}-links: .PHONY
|
||||
|
||||
.for _tool in ${_bootstrap_tools_links}
|
||||
${_bt}-link-${_tool}: .PHONY .MAKE
|
||||
@if [ ! -e "${WORLDTMP}/legacy/bin/${_tool}" ]; then \
|
||||
source_path=`which ${_tool}`; \
|
||||
if [ ! -e "$${source_path}" ] ; then \
|
||||
echo "Cannot find host tool '${_tool}'"; false; \
|
||||
fi; \
|
||||
ln -sfnv "$${source_path}" "${WORLDTMP}/legacy/bin/${_tool}"; \
|
||||
fi
|
||||
@rm -f "${WORLDTMP}/legacy/bin/${_tool}"; \
|
||||
source_path=`which ${_tool}`; \
|
||||
if [ ! -e "$${source_path}" ] ; then \
|
||||
echo "Cannot find host tool '${_tool}'"; false; \
|
||||
fi; \
|
||||
cp -f "$${source_path}" "${WORLDTMP}/legacy/bin/${_tool}"
|
||||
${_bt}-links: ${_bt}-link-${_tool}
|
||||
.endfor
|
||||
|
||||
|
6
UPDATING
6
UPDATING
@ -32,6 +32,12 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 13.x IS SLOW:
|
||||
information about prerequisites and upgrading, if you are not already
|
||||
using clang 3.5.0 or higher.
|
||||
|
||||
20200807:
|
||||
Makefile.inc has been updated to work around the issue documented in
|
||||
20200729. It was a case where the optimization of using symbolic links
|
||||
to point to binaries created a situation where we'd run new binaries
|
||||
with old libraries starting midway through the installworld process.
|
||||
|
||||
20200729:
|
||||
r363679 has redefined some undefined behavior in regcomp(3); notably,
|
||||
extraneous escapes of most ordinary characters will no longer be
|
||||
|
@ -27,6 +27,7 @@
|
||||
#pragma ident "%Z%%M% %I% %E% SMI"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/endian.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/zmod.h>
|
||||
|
@ -665,6 +665,7 @@ wq_init(workqueue_t *wq, int nfiles)
|
||||
|
||||
for (i = 0; i < nslots; i++) {
|
||||
pthread_mutex_init(&wq->wq_wip[i].wip_lock, NULL);
|
||||
pthread_cond_init(&wq->wq_wip[i].wip_cv, NULL);
|
||||
wq->wq_wip[i].wip_batchid = wq->wq_next_batchid++;
|
||||
}
|
||||
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include <pthread.h>
|
||||
|
||||
#include <sys/ccompile.h>
|
||||
#include <sys/endian.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@ -65,6 +66,15 @@ extern "C" {
|
||||
#define MIN(a, b) ((a) > (b) ? (b) : (a))
|
||||
#endif
|
||||
|
||||
/* Sanity check for cross-build bootstrap tools */
|
||||
#if !defined(BYTE_ORDER)
|
||||
#error "Missing BYTE_ORDER defines"
|
||||
#elif !defined(_LITTLE_ENDIAN)
|
||||
#error "Missing _LITTLE_ENDIAN defines"
|
||||
#elif !defined(_BIG_ENDIAN)
|
||||
#error "Missing _BIG_ENDIAN defines"
|
||||
#endif
|
||||
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
.\" @(#)telnet.1 8.6 (Berkeley) 6/1/94
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd September 18, 2006
|
||||
.Dd August 7, 2020
|
||||
.Dt TELNET 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -47,6 +47,7 @@ protocol
|
||||
.Op Fl l Ar user
|
||||
.Op Fl n Ar tracefile
|
||||
.Op Fl s Ar src_addr
|
||||
.Op Fl P Ar policy
|
||||
.Oo
|
||||
.Ar host
|
||||
.Op Ar port
|
||||
@ -189,6 +190,13 @@ for recording trace information.
|
||||
See the
|
||||
.Ic set tracefile
|
||||
command below.
|
||||
.It Fl P Ar policy
|
||||
Use IPsec policy specification string
|
||||
.Ar policy ,
|
||||
for the connections.
|
||||
See
|
||||
.Xr ipsec_set_policy 3
|
||||
for details.
|
||||
.It Fl r
|
||||
Specifies a user interface similar to
|
||||
.Xr rlogin 1 .
|
||||
|
@ -73,10 +73,10 @@ struct regdomain {
|
||||
netband_head bands_11b; /* 11b operation */
|
||||
netband_head bands_11g; /* 11g operation */
|
||||
netband_head bands_11a; /* 11a operation */
|
||||
netband_head bands_11ng;/* 11ng operation */
|
||||
netband_head bands_11na;/* 11na operation */
|
||||
netband_head bands_11ac;/* 11ac 5GHz operation */
|
||||
netband_head bands_11acg;/* 11ac 2GHz operation */
|
||||
netband_head bands_11ng; /* 11ng operation */
|
||||
netband_head bands_11na; /* 11na operation */
|
||||
netband_head bands_11ac; /* 11ac 5GHz operation */
|
||||
netband_head bands_11acg; /* 11ac 2GHz operation */
|
||||
|
||||
LIST_ENTRY(regdomain) next;
|
||||
};
|
||||
|
@ -23,7 +23,7 @@
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.Dd July 21, 2004
|
||||
.Dd August 7, 2020
|
||||
.Dt MBSRTOWCS 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -98,15 +98,29 @@ except that conversion stops after reading at most
|
||||
bytes from the buffer pointed to by
|
||||
.Fa src .
|
||||
.Sh RETURN VALUES
|
||||
The
|
||||
If successful, and
|
||||
.Fa dst
|
||||
is not NULL, the
|
||||
.Fn mbsrtowcs
|
||||
and
|
||||
.Fn mbsnrtowcs
|
||||
functions return the number of wide characters stored in
|
||||
the array pointed to by
|
||||
.Fa dst .
|
||||
.Pp
|
||||
If
|
||||
.Fa dst
|
||||
if successful, otherwise it returns
|
||||
.Po Vt size_t Pc Ns \-1 .
|
||||
was NULL then the functions
|
||||
.Fn mbsrtowcs
|
||||
and
|
||||
.Fn mbsnrtowcs
|
||||
return the number of wide characters that would have been stored where
|
||||
.Fa dst
|
||||
points to an infinitely large array.
|
||||
.Pp
|
||||
If either one of the functions is not successful then
|
||||
.Po Vt size_t Pc Ns \-1
|
||||
is returned.
|
||||
.Sh ERRORS
|
||||
The
|
||||
.Fn mbsrtowcs
|
||||
|
@ -31,7 +31,7 @@
|
||||
.\" @(#)setlocale.3 8.1 (Berkeley) 6/9/93
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd September 9, 2019
|
||||
.Dd August 7, 2020
|
||||
.Dt SETLOCALE 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -98,6 +98,10 @@ as well as values returned by
|
||||
Set a locale for formatting dates and times using the
|
||||
.Fn strftime
|
||||
function.
|
||||
.It Dv LANG
|
||||
Sets the generic locale category for native language, local customs
|
||||
and coded character set in the absence of more specific locale
|
||||
variables.
|
||||
.El
|
||||
.Pp
|
||||
Only three locales are defined by default,
|
||||
@ -153,6 +157,25 @@ if the given combination of
|
||||
and
|
||||
.Fa locale
|
||||
makes no sense.
|
||||
.Sh EXAMPLES
|
||||
The following code illustrates how a program can initialize the
|
||||
international environment for one language, while selectively
|
||||
modifying the program's locale such that regular expressions and
|
||||
string operations can be applied to text recorded in a different
|
||||
language:
|
||||
.Bd -literal
|
||||
setlocale(LC_ALL, "de");
|
||||
setlocale(LC_COLLATE, "fr");
|
||||
.Ed
|
||||
.Pp
|
||||
When a process is started, its current locale is set to the C or POSIX
|
||||
locale.
|
||||
An internationalized program that depends on locale data not defined in
|
||||
the C or POSIX locale must invoke the setlocale subroutine in the
|
||||
following manner before using any of the locale-specific information:
|
||||
.Bd -literal
|
||||
setlocale(LC_ALL, "");
|
||||
.Ed
|
||||
.Sh FILES
|
||||
.Bl -tag -width /usr/share/locale/locale/category -compact
|
||||
.It Pa $PATH_LOCALE/ Ns Em locale/category
|
||||
|
@ -32,7 +32,7 @@
|
||||
.\" @(#)tmpnam.3 8.2 (Berkeley) 11/17/93
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd March 18, 2007
|
||||
.Dd August 7, 2020
|
||||
.Dt TMPFILE 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -156,6 +156,8 @@ on error.
|
||||
.Bl -tag -width Ds
|
||||
.It Ev TMPDIR
|
||||
.Pf [ Fn tempnam
|
||||
and
|
||||
.Fn tmpfile
|
||||
only]
|
||||
If set,
|
||||
the directory in which the temporary file is stored.
|
||||
|
@ -97,6 +97,8 @@ main() {
|
||||
|
||||
outname="${outname%%_*}"
|
||||
|
||||
pkgdeps="$(echo ${pkgdeps} | tr '_' '-')"
|
||||
|
||||
desc="$(make -C ${srctree}/release/packages -f Makefile.package -V ${outname}_DESC)"
|
||||
comment="$(make -C ${srctree}/release/packages -f Makefile.package -V ${outname}_COMMENT)"
|
||||
|
||||
|
@ -4779,6 +4779,23 @@ getid(int s, int ix, void *data, size_t len, int *plen, int mesh)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
getdevicename(int s, void *data, size_t len, int *plen)
|
||||
{
|
||||
struct ieee80211req ireq;
|
||||
|
||||
(void) memset(&ireq, 0, sizeof(ireq));
|
||||
(void) strlcpy(ireq.i_name, name, sizeof(ireq.i_name));
|
||||
ireq.i_type = IEEE80211_IOC_IC_NAME;
|
||||
ireq.i_val = -1;
|
||||
ireq.i_data = data;
|
||||
ireq.i_len = len;
|
||||
if (ioctl(s, SIOCG80211, &ireq) < 0)
|
||||
return (-1);
|
||||
*plen = ireq.i_len;
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
ieee80211_status(int s)
|
||||
{
|
||||
@ -5503,6 +5520,12 @@ ieee80211_status(int s)
|
||||
}
|
||||
|
||||
LINE_BREAK();
|
||||
|
||||
if (getdevicename(s, data, sizeof(data), &len) < 0)
|
||||
return;
|
||||
LINE_CHECK("parent interface: %s", data);
|
||||
|
||||
LINE_BREAK();
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1,6 +1,6 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PACKAGE=iscsi_legacy
|
||||
PACKAGE=iscsilegacy
|
||||
SRCS= iscontrol.c pdu.c fsm.c config.c login.c auth_subr.c misc.c
|
||||
PROG= iscontrol
|
||||
LIBADD= cam md
|
||||
|
@ -697,9 +697,9 @@ prmount(struct statfs *sfp)
|
||||
(uintmax_t)sfp->f_syncreads,
|
||||
(uintmax_t)sfp->f_asyncreads);
|
||||
if (sfp->f_fsid.val[0] != 0 || sfp->f_fsid.val[1] != 0) {
|
||||
printf(", fsid ");
|
||||
(void)printf(", fsid ");
|
||||
for (i = 0; i < sizeof(sfp->f_fsid); i++)
|
||||
printf("%02x", ((u_char *)&sfp->f_fsid)[i]);
|
||||
(void)printf("%02x", ((u_char *)&sfp->f_fsid)[i]);
|
||||
}
|
||||
}
|
||||
(void)printf(")\n");
|
||||
|
@ -28,7 +28,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd July 10, 2009
|
||||
.Dd August 7, 2020
|
||||
.Dt NET80211 4
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -393,6 +393,16 @@ Valid values are:
|
||||
and
|
||||
.Dv IEEE80211_HWMP_ROOTMODE_RANN
|
||||
(send broadcast Root Announcement (RANN) frames).
|
||||
.It Dv IEEE80211_IOC_IC_NAME
|
||||
Return the underlying hardware
|
||||
.Xr device 9
|
||||
name in the buffer pointed to by
|
||||
.Va i_data
|
||||
and the name length including terminating NUL character in
|
||||
.Va i_len .
|
||||
If the buffer length is too small to hold the full name
|
||||
.Er EINVAL
|
||||
will be returned.
|
||||
.It Dv IEEE80211_IOC_INACTIVITY
|
||||
Return whether or not the system handles inactivity processing in
|
||||
.Va i_val .
|
||||
|
@ -98,6 +98,7 @@ obj->var2 = 2;
|
||||
seqc_write_end(&obj->seqc);
|
||||
unlock_exclusive(&obj->lock);
|
||||
.Ed
|
||||
.Pp
|
||||
The following example for a reader reads the
|
||||
.Va var1
|
||||
and
|
||||
|
@ -237,6 +237,6 @@ ${_ILINKS}: .NOMETA
|
||||
esac ; \
|
||||
path=`(cd $$path && /bin/pwd)` ; \
|
||||
${ECHO} ${.TARGET} "->" $$path ; \
|
||||
ln -fhs $$path ${.TARGET}
|
||||
ln -fns $$path ${.TARGET}
|
||||
.endif # !NO_OBJ
|
||||
.endif # __BOOT_DEFS_MK__
|
||||
|
@ -48,9 +48,7 @@ void assfail3(const char *, uintmax_t, const char *, uintmax_t, const char *,
|
||||
#ifndef HAVE_ASSFAIL
|
||||
extern int aok;
|
||||
|
||||
__inline int __assfail(const char *expr, const char *file, int line);
|
||||
|
||||
__inline int
|
||||
static __inline int
|
||||
__assfail(const char *expr, const char *file, int line)
|
||||
{
|
||||
|
||||
|
@ -32,11 +32,19 @@
|
||||
|
||||
#include_next <sys/stat.h>
|
||||
|
||||
/*
|
||||
* When bootstrapping on Linux a stat64/fstat64 functions exists in both
|
||||
* glibc and musl libc. To avoid compilation errors, use those functions instead
|
||||
* of redefining them to stat/fstat.
|
||||
* Similarly, macOS provides (deprecated) stat64 functions that we can use
|
||||
* for now.
|
||||
*/
|
||||
#if !defined(__linux__) && !defined(__APPLE__)
|
||||
#define stat64 stat
|
||||
|
||||
#define MAXOFFSET_T OFF_MAX
|
||||
|
||||
#ifndef _KERNEL
|
||||
#if !defined(_KERNEL)
|
||||
#include <sys/disk.h>
|
||||
|
||||
static __inline int
|
||||
@ -51,6 +59,7 @@ fstat64(int fd, struct stat *sb)
|
||||
}
|
||||
return (ret);
|
||||
}
|
||||
#endif
|
||||
#endif /* !defined(_KERNEL) */
|
||||
#endif /* !defined(__linux__) && !defined(__APPLE__) */
|
||||
|
||||
#endif /* !_COMPAT_OPENSOLARIS_SYS_STAT_H_ */
|
||||
|
@ -29,6 +29,7 @@
|
||||
#ifndef _OPENSOLARIS_SYS_TIME_H_
|
||||
#define _OPENSOLARIS_SYS_TIME_H_
|
||||
|
||||
#include <sys/types.h>
|
||||
#include_next <sys/time.h>
|
||||
|
||||
#define SEC 1
|
||||
|
@ -175,13 +175,6 @@ static int __dbuf_hold_impl(struct dbuf_hold_impl_data *dh);
|
||||
static boolean_t dbuf_undirty(dmu_buf_impl_t *db, dmu_tx_t *tx);
|
||||
static void dbuf_write(dbuf_dirty_record_t *dr, arc_buf_t *data, dmu_tx_t *tx);
|
||||
|
||||
#ifndef __lint
|
||||
extern inline void dmu_buf_init_user(dmu_buf_user_t *dbu,
|
||||
dmu_buf_evict_func_t *evict_func_sync,
|
||||
dmu_buf_evict_func_t *evict_func_async,
|
||||
dmu_buf_t **clear_on_evict_dbufp);
|
||||
#endif /* ! __lint */
|
||||
|
||||
/*
|
||||
* Global data structures and functions for the dbuf cache.
|
||||
*/
|
||||
|
@ -610,7 +610,7 @@ typedef struct dmu_buf_user {
|
||||
* To allow enforcement of this, dbu must already be zeroed on entry.
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
inline void
|
||||
static inline void
|
||||
dmu_buf_init_user(dmu_buf_user_t *dbu, dmu_buf_evict_func_t *evict_func_sync,
|
||||
dmu_buf_evict_func_t *evict_func_async, dmu_buf_t **clear_on_evict_dbufp)
|
||||
{
|
||||
|
@ -46,8 +46,12 @@ extern "C" {
|
||||
/*
|
||||
* Disk blocks (sectors) and bytes.
|
||||
*/
|
||||
#ifndef dtob
|
||||
#define dtob(DD) ((DD) << DEV_BSHIFT)
|
||||
#endif
|
||||
#ifndef btod
|
||||
#define btod(BB) (((BB) + DEV_BSIZE - 1) >> DEV_BSHIFT)
|
||||
#endif
|
||||
#define btodt(BB) ((BB) >> DEV_BSHIFT)
|
||||
#define lbtod(BB) (((offset_t)(BB) + DEV_BSIZE - 1) >> DEV_BSHIFT)
|
||||
|
||||
@ -220,9 +224,12 @@ extern unsigned char bcd_to_byte[256];
|
||||
/*
|
||||
* Macros for counting and rounding.
|
||||
*/
|
||||
#ifndef howmany
|
||||
#define howmany(x, y) (((x)+((y)-1))/(y))
|
||||
#endif
|
||||
#ifndef roundup
|
||||
#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
|
||||
|
||||
#endif
|
||||
/*
|
||||
* Macro to determine if value is a power of 2
|
||||
*/
|
||||
|
@ -78,6 +78,7 @@ radix_tree_exception(void *arg)
|
||||
void *radix_tree_lookup(struct radix_tree_root *, unsigned long);
|
||||
void *radix_tree_delete(struct radix_tree_root *, unsigned long);
|
||||
int radix_tree_insert(struct radix_tree_root *, unsigned long, void *);
|
||||
int radix_tree_store(struct radix_tree_root *, unsigned long, void **);
|
||||
bool radix_tree_iter_find(struct radix_tree_root *, struct radix_tree_iter *, void ***);
|
||||
void radix_tree_iter_delete(struct radix_tree_root *, struct radix_tree_iter *, void **);
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
* Copyright (c) 2010 Isilon Systems, Inc.
|
||||
* Copyright (c) 2010 iX Systems, Inc.
|
||||
* Copyright (c) 2010 Panasas, Inc.
|
||||
* Copyright (c) 2013-2018 Mellanox Technologies, Ltd.
|
||||
* Copyright (c) 2013-2020 Mellanox Technologies, Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -55,6 +55,17 @@ radix_pos(long id, int height)
|
||||
return (id >> (RADIX_TREE_MAP_SHIFT * height)) & RADIX_TREE_MAP_MASK;
|
||||
}
|
||||
|
||||
static void
|
||||
radix_tree_clean_root_node(struct radix_tree_root *root)
|
||||
{
|
||||
/* Check if the root node should be freed */
|
||||
if (root->rnode->count == 0) {
|
||||
free(root->rnode, M_RADIX);
|
||||
root->rnode = NULL;
|
||||
root->height = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void *
|
||||
radix_tree_lookup(struct radix_tree_root *root, unsigned long index)
|
||||
{
|
||||
@ -197,8 +208,10 @@ radix_tree_insert(struct radix_tree_root *root, unsigned long index, void *item)
|
||||
while (radix_max(root) < index) {
|
||||
|
||||
/* check if the radix tree is getting too big */
|
||||
if (root->height == RADIX_TREE_MAX_HEIGHT)
|
||||
if (root->height == RADIX_TREE_MAX_HEIGHT) {
|
||||
radix_tree_clean_root_node(root);
|
||||
return (-E2BIG);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the root radix level is not empty, we need to
|
||||
@ -206,8 +219,16 @@ radix_tree_insert(struct radix_tree_root *root, unsigned long index, void *item)
|
||||
*/
|
||||
if (node->count != 0) {
|
||||
node = malloc(sizeof(*node), M_RADIX, root->gfp_mask | M_ZERO);
|
||||
if (node == NULL)
|
||||
if (node == NULL) {
|
||||
/*
|
||||
* Freeing the already allocated radix
|
||||
* levels, if any, will be handled by
|
||||
* the radix_tree_delete() function.
|
||||
* This code path can only happen when
|
||||
* the tree is not empty.
|
||||
*/
|
||||
return (-ENOMEM);
|
||||
}
|
||||
node->slots[0] = root->rnode;
|
||||
node->count++;
|
||||
root->rnode = node;
|
||||
@ -231,14 +252,9 @@ radix_tree_insert(struct radix_tree_root *root, unsigned long index, void *item)
|
||||
temp[idx] = malloc(sizeof(*node), M_RADIX,
|
||||
root->gfp_mask | M_ZERO);
|
||||
if (temp[idx] == NULL) {
|
||||
while(idx--)
|
||||
while (idx--)
|
||||
free(temp[idx], M_RADIX);
|
||||
/* Check if we should free the root node as well. */
|
||||
if (root->rnode->count == 0) {
|
||||
free(root->rnode, M_RADIX);
|
||||
root->rnode = NULL;
|
||||
root->height = 0;
|
||||
}
|
||||
radix_tree_clean_root_node(root);
|
||||
return (-ENOMEM);
|
||||
}
|
||||
}
|
||||
@ -262,3 +278,110 @@ radix_tree_insert(struct radix_tree_root *root, unsigned long index, void *item)
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
radix_tree_store(struct radix_tree_root *root, unsigned long index, void **ppitem)
|
||||
{
|
||||
struct radix_tree_node *node;
|
||||
struct radix_tree_node *temp[RADIX_TREE_MAX_HEIGHT - 1];
|
||||
void *pitem;
|
||||
int height;
|
||||
int idx;
|
||||
|
||||
/*
|
||||
* Inserting a NULL item means delete it. The old pointer is
|
||||
* stored at the location pointed to by "ppitem".
|
||||
*/
|
||||
if (*ppitem == NULL) {
|
||||
*ppitem = radix_tree_delete(root, index);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* get root node, if any */
|
||||
node = root->rnode;
|
||||
|
||||
/* allocate root node, if any */
|
||||
if (node == NULL) {
|
||||
node = malloc(sizeof(*node), M_RADIX, root->gfp_mask | M_ZERO);
|
||||
if (node == NULL)
|
||||
return (-ENOMEM);
|
||||
root->rnode = node;
|
||||
root->height++;
|
||||
}
|
||||
|
||||
/* expand radix tree as needed */
|
||||
while (radix_max(root) < index) {
|
||||
|
||||
/* check if the radix tree is getting too big */
|
||||
if (root->height == RADIX_TREE_MAX_HEIGHT) {
|
||||
radix_tree_clean_root_node(root);
|
||||
return (-E2BIG);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the root radix level is not empty, we need to
|
||||
* allocate a new radix level:
|
||||
*/
|
||||
if (node->count != 0) {
|
||||
node = malloc(sizeof(*node), M_RADIX, root->gfp_mask | M_ZERO);
|
||||
if (node == NULL) {
|
||||
/*
|
||||
* Freeing the already allocated radix
|
||||
* levels, if any, will be handled by
|
||||
* the radix_tree_delete() function.
|
||||
* This code path can only happen when
|
||||
* the tree is not empty.
|
||||
*/
|
||||
return (-ENOMEM);
|
||||
}
|
||||
node->slots[0] = root->rnode;
|
||||
node->count++;
|
||||
root->rnode = node;
|
||||
}
|
||||
root->height++;
|
||||
}
|
||||
|
||||
/* get radix tree height index */
|
||||
height = root->height - 1;
|
||||
|
||||
/* walk down the tree until the first missing node, if any */
|
||||
for ( ; height != 0; height--) {
|
||||
idx = radix_pos(index, height);
|
||||
if (node->slots[idx] == NULL)
|
||||
break;
|
||||
node = node->slots[idx];
|
||||
}
|
||||
|
||||
/* allocate the missing radix levels, if any */
|
||||
for (idx = 0; idx != height; idx++) {
|
||||
temp[idx] = malloc(sizeof(*node), M_RADIX,
|
||||
root->gfp_mask | M_ZERO);
|
||||
if (temp[idx] == NULL) {
|
||||
while (idx--)
|
||||
free(temp[idx], M_RADIX);
|
||||
radix_tree_clean_root_node(root);
|
||||
return (-ENOMEM);
|
||||
}
|
||||
}
|
||||
|
||||
/* setup new radix levels, if any */
|
||||
for ( ; height != 0; height--) {
|
||||
idx = radix_pos(index, height);
|
||||
node->slots[idx] = temp[height - 1];
|
||||
node->count++;
|
||||
node = node->slots[idx];
|
||||
}
|
||||
|
||||
/*
|
||||
* Insert and adjust count if the item does not already exist.
|
||||
*/
|
||||
idx = radix_pos(index, 0);
|
||||
/* swap */
|
||||
pitem = node->slots[idx];
|
||||
node->slots[idx] = *ppitem;
|
||||
*ppitem = pitem;
|
||||
|
||||
if (pitem == NULL)
|
||||
node->count++;
|
||||
return (0);
|
||||
}
|
||||
|
@ -29,6 +29,7 @@
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_acpi.h"
|
||||
#include "opt_pci.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -207,8 +208,10 @@ static int
|
||||
apei_pcie_handler(ACPI_HEST_GENERIC_DATA *ged)
|
||||
{
|
||||
struct apei_pcie_error *p = (struct apei_pcie_error *)(ged + 1);
|
||||
int h = 0, off;
|
||||
#ifdef DEV_PCI
|
||||
device_t dev;
|
||||
int h = 0, off, sev;
|
||||
int sev;
|
||||
|
||||
if ((p->ValidationBits & 0x8) == 0x8) {
|
||||
mtx_lock(&Giant);
|
||||
@ -235,6 +238,7 @@ apei_pcie_handler(ACPI_HEST_GENERIC_DATA *ged)
|
||||
}
|
||||
if (h)
|
||||
return (h);
|
||||
#endif
|
||||
|
||||
printf("APEI %s PCIe Error:\n", apei_severity(ged->ErrorSeverity));
|
||||
if (p->ValidationBits & 0x01)
|
||||
|
@ -1334,6 +1334,11 @@ em_if_init(if_ctx_t ctx)
|
||||
ctrl |= E1000_CTRL_VME;
|
||||
E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl);
|
||||
}
|
||||
} else {
|
||||
u32 ctrl;
|
||||
ctrl = E1000_READ_REG(&adapter->hw, E1000_CTRL);
|
||||
ctrl &= ~E1000_CTRL_VME;
|
||||
E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl);
|
||||
}
|
||||
|
||||
/* Don't lose promiscuous settings */
|
||||
|
@ -58,8 +58,6 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#include <ck_epoch.h>
|
||||
|
||||
static MALLOC_DEFINE(M_EPOCH, "epoch", "epoch based reclamation");
|
||||
|
||||
#ifdef __amd64__
|
||||
#define EPOCH_ALIGN CACHE_LINE_SIZE*2
|
||||
#else
|
||||
@ -79,7 +77,7 @@ typedef struct epoch_record {
|
||||
struct epoch {
|
||||
struct ck_epoch e_epoch __aligned(EPOCH_ALIGN);
|
||||
epoch_record_t e_pcpu_record;
|
||||
int e_idx;
|
||||
int e_in_use;
|
||||
int e_flags;
|
||||
struct sx e_drain_sx;
|
||||
struct mtx e_drain_mtx;
|
||||
@ -128,19 +126,23 @@ TAILQ_HEAD (threadlist, thread);
|
||||
CK_STACK_CONTAINER(struct ck_epoch_entry, stack_entry,
|
||||
ck_epoch_entry_container)
|
||||
|
||||
epoch_t allepochs[MAX_EPOCHS];
|
||||
static struct epoch epoch_array[MAX_EPOCHS];
|
||||
|
||||
DPCPU_DEFINE(struct grouptask, epoch_cb_task);
|
||||
DPCPU_DEFINE(int, epoch_cb_count);
|
||||
|
||||
static __read_mostly int inited;
|
||||
static __read_mostly int epoch_count;
|
||||
__read_mostly epoch_t global_epoch;
|
||||
__read_mostly epoch_t global_epoch_preempt;
|
||||
|
||||
static void epoch_call_task(void *context __unused);
|
||||
static uma_zone_t pcpu_zone_record;
|
||||
|
||||
static struct sx epoch_sx;
|
||||
|
||||
#define EPOCH_LOCK() sx_xlock(&epoch_sx)
|
||||
#define EPOCH_UNLOCK() sx_xunlock(&epoch_sx)
|
||||
|
||||
#ifdef EPOCH_TRACE
|
||||
struct stackentry {
|
||||
RB_ENTRY(stackentry) se_node;
|
||||
@ -281,6 +283,7 @@ epoch_init(void *arg __unused)
|
||||
#ifdef EPOCH_TRACE
|
||||
SLIST_INIT(&thread0.td_epochs);
|
||||
#endif
|
||||
sx_init(&epoch_sx, "epoch-sx");
|
||||
inited = 1;
|
||||
global_epoch = epoch_alloc("Global", 0);
|
||||
global_epoch_preempt = epoch_alloc("Global preemptible", EPOCH_PREEMPT);
|
||||
@ -326,19 +329,48 @@ epoch_t
|
||||
epoch_alloc(const char *name, int flags)
|
||||
{
|
||||
epoch_t epoch;
|
||||
int i;
|
||||
|
||||
MPASS(name != NULL);
|
||||
|
||||
if (__predict_false(!inited))
|
||||
panic("%s called too early in boot", __func__);
|
||||
epoch = malloc(sizeof(struct epoch), M_EPOCH, M_ZERO | M_WAITOK);
|
||||
|
||||
EPOCH_LOCK();
|
||||
|
||||
/*
|
||||
* Find a free index in the epoch array. If no free index is
|
||||
* found, try to use the index after the last one.
|
||||
*/
|
||||
for (i = 0;; i++) {
|
||||
/*
|
||||
* If too many epochs are currently allocated,
|
||||
* return NULL.
|
||||
*/
|
||||
if (i == MAX_EPOCHS) {
|
||||
epoch = NULL;
|
||||
goto done;
|
||||
}
|
||||
if (epoch_array[i].e_in_use == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
epoch = epoch_array + i;
|
||||
ck_epoch_init(&epoch->e_epoch);
|
||||
epoch_ctor(epoch);
|
||||
MPASS(epoch_count < MAX_EPOCHS - 2);
|
||||
epoch->e_flags = flags;
|
||||
epoch->e_idx = epoch_count;
|
||||
epoch->e_name = name;
|
||||
sx_init(&epoch->e_drain_sx, "epoch-drain-sx");
|
||||
mtx_init(&epoch->e_drain_mtx, "epoch-drain-mtx", NULL, MTX_DEF);
|
||||
allepochs[epoch_count++] = epoch;
|
||||
|
||||
/*
|
||||
* Set e_in_use last, because when this field is set the
|
||||
* epoch_call_task() function will start scanning this epoch
|
||||
* structure.
|
||||
*/
|
||||
atomic_store_rel_int(&epoch->e_in_use, 1);
|
||||
done:
|
||||
EPOCH_UNLOCK();
|
||||
return (epoch);
|
||||
}
|
||||
|
||||
@ -346,13 +378,24 @@ void
|
||||
epoch_free(epoch_t epoch)
|
||||
{
|
||||
|
||||
EPOCH_LOCK();
|
||||
|
||||
MPASS(epoch->e_in_use != 0);
|
||||
|
||||
epoch_drain_callbacks(epoch);
|
||||
allepochs[epoch->e_idx] = NULL;
|
||||
|
||||
atomic_store_rel_int(&epoch->e_in_use, 0);
|
||||
/*
|
||||
* Make sure the epoch_call_task() function see e_in_use equal
|
||||
* to zero, by calling epoch_wait() on the global_epoch:
|
||||
*/
|
||||
epoch_wait(global_epoch);
|
||||
uma_zfree_pcpu(pcpu_zone_record, epoch->e_pcpu_record);
|
||||
mtx_destroy(&epoch->e_drain_mtx);
|
||||
sx_destroy(&epoch->e_drain_sx);
|
||||
free(epoch, M_EPOCH);
|
||||
memset(epoch, 0, sizeof(*epoch));
|
||||
|
||||
EPOCH_UNLOCK();
|
||||
}
|
||||
|
||||
static epoch_record_t
|
||||
@ -705,8 +748,10 @@ epoch_call_task(void *arg __unused)
|
||||
ck_stack_init(&cb_stack);
|
||||
critical_enter();
|
||||
epoch_enter(global_epoch);
|
||||
for (total = i = 0; i < epoch_count; i++) {
|
||||
if (__predict_false((epoch = allepochs[i]) == NULL))
|
||||
for (total = i = 0; i != MAX_EPOCHS; i++) {
|
||||
epoch = epoch_array + i;
|
||||
if (__predict_false(
|
||||
atomic_load_acq_int(&epoch->e_in_use) == 0))
|
||||
continue;
|
||||
er = epoch_currecord(epoch);
|
||||
record = &er->er_record;
|
||||
|
@ -1076,28 +1076,24 @@ iflib_netmap_rxsync(struct netmap_kring *kring, int flags)
|
||||
struct netmap_adapter *na = kring->na;
|
||||
struct netmap_ring *ring = kring->ring;
|
||||
if_t ifp = na->ifp;
|
||||
iflib_fl_t fl;
|
||||
uint32_t nm_i; /* index into the netmap ring */
|
||||
uint32_t nic_i; /* index into the NIC ring */
|
||||
u_int i, n;
|
||||
u_int n;
|
||||
u_int const lim = kring->nkr_num_slots - 1;
|
||||
u_int const head = kring->rhead;
|
||||
int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR;
|
||||
struct if_rxd_info ri;
|
||||
|
||||
if_ctx_t ctx = ifp->if_softc;
|
||||
iflib_rxq_t rxq = &ctx->ifc_rxqs[kring->ring_id];
|
||||
if (head > lim)
|
||||
return netmap_ring_reinit(kring);
|
||||
iflib_fl_t fl = &rxq->ifr_fl[0];
|
||||
struct if_rxd_info ri;
|
||||
|
||||
/*
|
||||
* XXX netmap_fl_refill() only ever (re)fills free list 0 so far.
|
||||
* netmap only uses free list 0, to avoid out of order consumption
|
||||
* of receive buffers
|
||||
*/
|
||||
|
||||
for (i = 0, fl = rxq->ifr_fl; i < rxq->ifr_nfl; i++, fl++) {
|
||||
bus_dmamap_sync(fl->ifl_ifdi->idi_tag, fl->ifl_ifdi->idi_map,
|
||||
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
|
||||
}
|
||||
bus_dmamap_sync(fl->ifl_ifdi->idi_tag, fl->ifl_ifdi->idi_map,
|
||||
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
|
||||
|
||||
/*
|
||||
* First part: import newly received packets.
|
||||
@ -1119,38 +1115,35 @@ iflib_netmap_rxsync(struct netmap_kring *kring, int flags)
|
||||
int crclen = iflib_crcstrip ? 0 : 4;
|
||||
int error, avail;
|
||||
|
||||
for (i = 0; i < rxq->ifr_nfl; i++) {
|
||||
fl = &rxq->ifr_fl[i];
|
||||
nic_i = fl->ifl_cidx;
|
||||
nm_i = netmap_idx_n2k(kring, nic_i);
|
||||
avail = ctx->isc_rxd_available(ctx->ifc_softc,
|
||||
rxq->ifr_id, nic_i, USHRT_MAX);
|
||||
for (n = 0; avail > 0 && nm_i != hwtail_lim; n++, avail--) {
|
||||
rxd_info_zero(&ri);
|
||||
ri.iri_frags = rxq->ifr_frags;
|
||||
ri.iri_qsidx = kring->ring_id;
|
||||
ri.iri_ifp = ctx->ifc_ifp;
|
||||
ri.iri_cidx = nic_i;
|
||||
nic_i = fl->ifl_cidx;
|
||||
nm_i = netmap_idx_n2k(kring, nic_i);
|
||||
avail = ctx->isc_rxd_available(ctx->ifc_softc,
|
||||
rxq->ifr_id, nic_i, USHRT_MAX);
|
||||
for (n = 0; avail > 0 && nm_i != hwtail_lim; n++, avail--) {
|
||||
rxd_info_zero(&ri);
|
||||
ri.iri_frags = rxq->ifr_frags;
|
||||
ri.iri_qsidx = kring->ring_id;
|
||||
ri.iri_ifp = ctx->ifc_ifp;
|
||||
ri.iri_cidx = nic_i;
|
||||
|
||||
error = ctx->isc_rxd_pkt_get(ctx->ifc_softc, &ri);
|
||||
ring->slot[nm_i].len = error ? 0 : ri.iri_len - crclen;
|
||||
ring->slot[nm_i].flags = 0;
|
||||
bus_dmamap_sync(fl->ifl_buf_tag,
|
||||
fl->ifl_sds.ifsd_map[nic_i], BUS_DMASYNC_POSTREAD);
|
||||
nm_i = nm_next(nm_i, lim);
|
||||
nic_i = nm_next(nic_i, lim);
|
||||
}
|
||||
if (n) { /* update the state variables */
|
||||
if (netmap_no_pendintr && !force_update) {
|
||||
/* diagnostics */
|
||||
iflib_rx_miss ++;
|
||||
iflib_rx_miss_bufs += n;
|
||||
}
|
||||
fl->ifl_cidx = nic_i;
|
||||
kring->nr_hwtail = nm_i;
|
||||
}
|
||||
kring->nr_kflags &= ~NKR_PENDINTR;
|
||||
error = ctx->isc_rxd_pkt_get(ctx->ifc_softc, &ri);
|
||||
ring->slot[nm_i].len = error ? 0 : ri.iri_len - crclen;
|
||||
ring->slot[nm_i].flags = 0;
|
||||
bus_dmamap_sync(fl->ifl_buf_tag,
|
||||
fl->ifl_sds.ifsd_map[nic_i], BUS_DMASYNC_POSTREAD);
|
||||
nm_i = nm_next(nm_i, lim);
|
||||
nic_i = nm_next(nic_i, lim);
|
||||
}
|
||||
if (n) { /* update the state variables */
|
||||
if (netmap_no_pendintr && !force_update) {
|
||||
/* diagnostics */
|
||||
iflib_rx_miss ++;
|
||||
iflib_rx_miss_bufs += n;
|
||||
}
|
||||
fl->ifl_cidx = nic_i;
|
||||
kring->nr_hwtail = nm_i;
|
||||
}
|
||||
kring->nr_kflags &= ~NKR_PENDINTR;
|
||||
}
|
||||
/*
|
||||
* Second part: skip past packets that userspace has released.
|
||||
@ -1160,7 +1153,6 @@ iflib_netmap_rxsync(struct netmap_kring *kring, int flags)
|
||||
* nic_i is the index in the NIC ring, and
|
||||
* nm_i == (nic_i + kring->nkr_hwofs) % ring_size
|
||||
*/
|
||||
/* XXX not sure how this will work with multiple free lists */
|
||||
nm_i = kring->nr_hwcur;
|
||||
|
||||
return (netmap_fl_refill(rxq, kring, nm_i, false));
|
||||
|
@ -785,6 +785,13 @@ ieee80211_ioctl_get80211(struct ieee80211vap *vap, u_long cmd,
|
||||
int error = 0;
|
||||
|
||||
switch (ireq->i_type) {
|
||||
case IEEE80211_IOC_IC_NAME:
|
||||
len = strlen(ic->ic_name) + 1;
|
||||
if (len > ireq->i_len)
|
||||
return (EINVAL);
|
||||
ireq->i_len = len;
|
||||
error = copyout(ic->ic_name, ireq->i_data, ireq->i_len);
|
||||
break;
|
||||
case IEEE80211_IOC_SSID:
|
||||
switch (vap->iv_state) {
|
||||
case IEEE80211_S_INIT:
|
||||
|
@ -743,6 +743,9 @@ struct ieee80211req {
|
||||
#define IEEE80211_IOC_QUIET_OFFSET 207 /* Quiet Offset */
|
||||
#define IEEE80211_IOC_QUIET_DUR 208 /* Quiet Duration */
|
||||
#define IEEE80211_IOC_QUIET_COUNT 209 /* Quiet Count */
|
||||
|
||||
#define IEEE80211_IOC_IC_NAME 210 /* HW device name. */
|
||||
|
||||
/*
|
||||
* Parameters for controlling a scan requested with
|
||||
* IEEE80211_IOC_SCAN_REQ.
|
||||
|
@ -163,7 +163,7 @@ VNET_PCPUSTAT_SYSUNINIT(udpstat);
|
||||
#ifdef INET
|
||||
static void udp_detach(struct socket *so);
|
||||
static int udp_output(struct inpcb *, struct mbuf *, struct sockaddr *,
|
||||
struct mbuf *, struct thread *);
|
||||
struct mbuf *, struct thread *, int);
|
||||
#endif
|
||||
|
||||
static void
|
||||
@ -1083,9 +1083,65 @@ udp_ctloutput(struct socket *so, struct sockopt *sopt)
|
||||
}
|
||||
|
||||
#ifdef INET
|
||||
#ifdef INET6
|
||||
/* The logic here is derived from ip6_setpktopt(). See comments there. */
|
||||
static int
|
||||
udp_v4mapped_pktinfo(struct cmsghdr *cm, struct sockaddr_in * src,
|
||||
struct inpcb *inp, int flags)
|
||||
{
|
||||
struct ifnet *ifp;
|
||||
struct in6_pktinfo *pktinfo;
|
||||
struct in_addr ia;
|
||||
|
||||
if ((flags & PRUS_IPV6) == 0)
|
||||
return (0);
|
||||
|
||||
if (cm->cmsg_level != IPPROTO_IPV6)
|
||||
return (0);
|
||||
|
||||
if (cm->cmsg_type != IPV6_2292PKTINFO &&
|
||||
cm->cmsg_type != IPV6_PKTINFO)
|
||||
return (0);
|
||||
|
||||
if (cm->cmsg_len !=
|
||||
CMSG_LEN(sizeof(struct in6_pktinfo)))
|
||||
return (EINVAL);
|
||||
|
||||
pktinfo = (struct in6_pktinfo *)CMSG_DATA(cm);
|
||||
if (!IN6_IS_ADDR_V4MAPPED(&pktinfo->ipi6_addr) &&
|
||||
!IN6_IS_ADDR_UNSPECIFIED(&pktinfo->ipi6_addr))
|
||||
return (EINVAL);
|
||||
|
||||
/* Validate the interface index if specified. */
|
||||
if (pktinfo->ipi6_ifindex > V_if_index)
|
||||
return (ENXIO);
|
||||
|
||||
ifp = NULL;
|
||||
if (pktinfo->ipi6_ifindex) {
|
||||
ifp = ifnet_byindex(pktinfo->ipi6_ifindex);
|
||||
if (ifp == NULL)
|
||||
return (ENXIO);
|
||||
}
|
||||
if (ifp != NULL && !IN6_IS_ADDR_UNSPECIFIED(&pktinfo->ipi6_addr)) {
|
||||
|
||||
ia.s_addr = pktinfo->ipi6_addr.s6_addr32[3];
|
||||
if (in_ifhasaddr(ifp, ia) == 0)
|
||||
return (EADDRNOTAVAIL);
|
||||
}
|
||||
|
||||
bzero(src, sizeof(*src));
|
||||
src->sin_family = AF_INET;
|
||||
src->sin_len = sizeof(*src);
|
||||
src->sin_port = inp->inp_lport;
|
||||
src->sin_addr.s_addr = pktinfo->ipi6_addr.s6_addr32[3];
|
||||
|
||||
return (0);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
|
||||
struct mbuf *control, struct thread *td)
|
||||
struct mbuf *control, struct thread *td, int flags)
|
||||
{
|
||||
struct udpiphdr *ui;
|
||||
int len = m->m_pkthdr.len;
|
||||
@ -1149,6 +1205,11 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
|
||||
error = EINVAL;
|
||||
break;
|
||||
}
|
||||
#ifdef INET6
|
||||
error = udp_v4mapped_pktinfo(cm, &src, inp, flags);
|
||||
if (error != 0)
|
||||
break;
|
||||
#endif
|
||||
if (cm->cmsg_level != IPPROTO_IP)
|
||||
continue;
|
||||
|
||||
@ -1696,7 +1757,7 @@ udp_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr,
|
||||
|
||||
inp = sotoinpcb(so);
|
||||
KASSERT(inp != NULL, ("udp_send: inp == NULL"));
|
||||
return (udp_output(inp, m, addr, control, td));
|
||||
return (udp_output(inp, m, addr, control, td, flags));
|
||||
}
|
||||
#endif /* INET */
|
||||
|
||||
|
@ -784,7 +784,7 @@ udp6_output(struct socket *so, int flags_arg, struct mbuf *m,
|
||||
in6_sin6_2_sin_in_sock((struct sockaddr *)sin6);
|
||||
pru = inetsw[ip_protox[nxt]].pr_usrreqs;
|
||||
/* addr will just be freed in sendit(). */
|
||||
return ((*pru->pru_send)(so, flags_arg, m,
|
||||
return ((*pru->pru_send)(so, flags_arg | PRUS_IPV6, m,
|
||||
(struct sockaddr *)sin6, control, td));
|
||||
}
|
||||
} else
|
||||
|
@ -210,6 +210,7 @@ struct pr_usrreqs {
|
||||
#define PRUS_EOF 0x2
|
||||
#define PRUS_MORETOCOME 0x4
|
||||
#define PRUS_NOTREADY 0x8
|
||||
#define PRUS_IPV6 0x10
|
||||
int (*pru_ready)(struct socket *so, struct mbuf *m, int count);
|
||||
int (*pru_sense)(struct socket *so, struct stat *sb);
|
||||
int (*pru_shutdown)(struct socket *so);
|
||||
|
@ -119,26 +119,25 @@ _host_abs_tools_to_symlink= ${_make_abs}:make ${_make_abs}:bmake
|
||||
host-symlinks:
|
||||
@echo "Linking host tools into ${DESTDIR}/bin"
|
||||
.for _tool in ${_host_tools_to_symlink}
|
||||
@if [ ! -e "${DESTDIR}/bin/${_tool}" ]; then \
|
||||
source_path=`which ${_tool}`; \
|
||||
if [ ! -e "$${source_path}" ] ; then \
|
||||
echo "Cannot find host tool '${_tool}'"; false; \
|
||||
fi; \
|
||||
ln -sfnv "$${source_path}" "${DESTDIR}/bin/${_tool}"; \
|
||||
fi
|
||||
@source_path=`which ${_tool}`; \
|
||||
if [ ! -e "$${source_path}" ] ; then \
|
||||
echo "Cannot find host tool '${_tool}'"; false; \
|
||||
fi; \
|
||||
rm -f "${DESTDIR}/bin/${_tool}"; \
|
||||
cp -f "$${source_path}" "${DESTDIR}/bin/${_tool}"
|
||||
.endfor
|
||||
.for _tool in ${_host_abs_tools_to_symlink}
|
||||
@source_path="${_tool:S/:/ /:[1]}"; \
|
||||
target_path="${DESTDIR}/bin/${_tool:S/:/ /:[2]}"; \
|
||||
if [ ! -e "$${target_path}" ] ; then \
|
||||
if [ ! -e "$${source_path}" ] ; then \
|
||||
echo "Host tool '${src_path}' is missing"; false; \
|
||||
fi; \
|
||||
ln -sfnv "$${source_path}" "$${target_path}"; \
|
||||
fi
|
||||
if [ ! -e "$${source_path}" ] ; then \
|
||||
echo "Host tool '${src_path}' is missing"; false; \
|
||||
fi; \
|
||||
rm -f "$${target_path}"; \
|
||||
cp -f "$${source_path}" "$${target_path}"
|
||||
.endfor
|
||||
.if exists(/usr/libexec/flua)
|
||||
ln -sf /usr/libexec/flua ${DESTDIR}/usr/libexec/flua
|
||||
rm -f ${DESTDIR}/usr/libexec/flua
|
||||
cp -f /usr/libexec/flua ${DESTDIR}/usr/libexec/flua
|
||||
.endif
|
||||
|
||||
# Create all the directories that are needed during the legacy, bootstrap-tools
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
.include <src.opts.mk>
|
||||
|
||||
.if ${MK_BSD_GREP} == "yes"
|
||||
.if ${MK_BSD_GREP} == "yes" || defined(BOOTSTRAPPING)
|
||||
PROG= grep
|
||||
MAN1= grep.1 zgrep.1
|
||||
.else
|
||||
@ -50,7 +50,7 @@ MLINKS= zgrep.1 zfgrep.1 \
|
||||
|
||||
CFLAGS.gcc+= --param max-inline-insns-single=500
|
||||
|
||||
.if ${MK_BSD_GREP} == "yes"
|
||||
.if ${MK_BSD_GREP} == "yes" || defined(BOOTSTRAPPING)
|
||||
LINKS+= ${BINDIR}/grep ${BINDIR}/egrep \
|
||||
${BINDIR}/grep ${BINDIR}/fgrep \
|
||||
${BINDIR}/grep ${BINDIR}/rgrep \
|
||||
|
@ -30,7 +30,7 @@
|
||||
.\"
|
||||
.\" @(#)grep.1 8.3 (Berkeley) 4/18/94
|
||||
.\"
|
||||
.Dd August 21, 2018
|
||||
.Dd August 7, 2020
|
||||
.Dt GREP 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -209,7 +209,7 @@ Note that
|
||||
and
|
||||
.Fl Fl include
|
||||
patterns are processed in the order given.
|
||||
If a name patches multiple patterns, the latest matching rule wins.
|
||||
If a name matches multiple patterns, the latest matching rule wins.
|
||||
If no
|
||||
.Fl Fl include
|
||||
pattern is specified, all files are searched that are
|
||||
@ -228,7 +228,7 @@ Note that
|
||||
and
|
||||
.Fl Fl include-dir
|
||||
patterns are processed in the order given.
|
||||
If a name patches multiple patterns, the latest matching rule wins.
|
||||
If a name matches multiple patterns, the latest matching rule wins.
|
||||
If no
|
||||
.Fl Fl include-dir
|
||||
pattern is specified, all directories are searched that are
|
||||
@ -284,7 +284,7 @@ Note that
|
||||
and
|
||||
.Fl Fl exclude
|
||||
patterns are processed in the order given.
|
||||
If a name patches multiple patterns, the latest matching rule wins.
|
||||
If a name matches multiple patterns, the latest matching rule wins.
|
||||
Patterns are matched to the full path specified,
|
||||
not only to the filename component.
|
||||
.It Fl Fl include-dir Ar pattern
|
||||
@ -298,7 +298,7 @@ Note that
|
||||
and
|
||||
.Fl Fl exclude-dir
|
||||
patterns are processed in the order given.
|
||||
If a name patches multiple patterns, the latest matching rule wins.
|
||||
If a name matches multiple patterns, the latest matching rule wins.
|
||||
.It Fl L , Fl Fl files-without-match
|
||||
Only the names of files not containing selected lines are written to
|
||||
standard output.
|
||||
|
@ -53,7 +53,6 @@
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/clock.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/time.h>
|
||||
|
@ -9,5 +9,8 @@ MAN= pwd_mkdb.8
|
||||
SRCS= pw_scan.c pwd_mkdb.c
|
||||
|
||||
CFLAGS+= -I${SRCTOP}/lib/libc/gen # for pw_scan.h
|
||||
.if defined(BOOTSTRAPPING)
|
||||
CFLAGS+=-I${.CURDIR}
|
||||
.endif
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
66
usr.sbin/pwd_mkdb/pwd.h
Normal file
66
usr.sbin/pwd_mkdb/pwd.h
Normal file
@ -0,0 +1,66 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* Copyright 2018-2020 Alex Richardson <arichardson@FreeBSD.org>
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory (Department of Computer Science and
|
||||
* Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
|
||||
* DARPA SSITH research programme.
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* When building pwd_mkdb we need to use target systems definition of
|
||||
* struct passwd. This protects against future changes to struct passwd and
|
||||
* is essential to allow cross-building from Linux/macOS hosts since the
|
||||
* structure is not compatible there.
|
||||
*/
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
/*
|
||||
* Note: pwd_mkdb always stores uint32_t for all integer fields (including
|
||||
* time_t!) so these definitions do not need to match sys/sys/_types.h
|
||||
*/
|
||||
typedef uint32_t _bootstrap_gid_t;
|
||||
typedef uint32_t _bootstrap_uid_t;
|
||||
typedef uint64_t _bootstrap_time_t;
|
||||
#define _GID_T_DECLARED
|
||||
#define _TIME_T_DECLARED
|
||||
#define _UID_T_DECLARED
|
||||
#define _SIZE_T_DECLARED
|
||||
|
||||
#define gid_t _bootstrap_gid_t
|
||||
#define uid_t _bootstrap_uid_t
|
||||
#define time_t _bootstrap_time_t
|
||||
#define passwd _bootstrap_passwd
|
||||
#include "../../include/pwd.h"
|
||||
#undef gid_t
|
||||
#undef uid_t
|
||||
#undef time_t
|
@ -7,7 +7,7 @@ MAN= tzsetup.8
|
||||
|
||||
CFLAGS+= -I.
|
||||
|
||||
.if ${MK_DIALOG} != no
|
||||
.if ${MK_DIALOG} != no && !defined(BOOTSTRAPPING)
|
||||
WARNS?= 3
|
||||
CFLAGS+= -I${SRCTOP}/contrib/dialog -DHAVE_DIALOG
|
||||
LIBADD= dialog ncursesw
|
||||
|
Loading…
Reference in New Issue
Block a user