Index: stable/9/contrib/libc-vis/vis.c =================================================================== --- stable/9/contrib/libc-vis/vis.c (revision 272754) +++ stable/9/contrib/libc-vis/vis.c (revision 272755) @@ -1,687 +1,694 @@ -/* $NetBSD: vis.c,v 1.60 2013/02/21 16:21:20 joerg Exp $ */ +/* $NetBSD: vis.c,v 1.62 2014/09/08 17:35:01 christos Exp $ */ /*- * Copyright (c) 1989, 1993 * The Regents of the University of California. 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. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. */ /*- * Copyright (c) 1999, 2005 The NetBSD Foundation, 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. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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. */ #include #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: vis.c,v 1.60 2013/02/21 16:21:20 joerg Exp $"); +__RCSID("$NetBSD: vis.c,v 1.62 2014/09/08 17:35:01 christos Exp $"); #endif /* LIBC_SCCS and not lint */ #ifdef __FBSDID __FBSDID("$FreeBSD$"); #define _DIAGASSERT(x) assert(x) #endif #include "namespace.h" #include #include #include #include #include #include #include #include #ifdef __weak_alias __weak_alias(strvisx,_strvisx) #endif #if !HAVE_VIS || !HAVE_SVIS #include #include #include #include /* * The reason for going through the trouble to deal with character encodings * in vis(3), is that we use this to safe encode output of commands. This * safe encoding varies depending on the character set. For example if we * display ps output in French, we don't want to display French characters * as M-foo. */ static wchar_t *do_svis(wchar_t *, wint_t, int, wint_t, const wchar_t *); #undef BELL #define BELL L'\a' #define iswoctal(c) (((u_char)(c)) >= L'0' && ((u_char)(c)) <= L'7') #define iswwhite(c) (c == L' ' || c == L'\t' || c == L'\n') #define iswsafe(c) (c == L'\b' || c == BELL || c == L'\r') #define xtoa(c) L"0123456789abcdef"[c] #define XTOA(c) L"0123456789ABCDEF"[c] #define MAXEXTRAS 10 #if !HAVE_NBTOOL_CONFIG_H #ifndef __NetBSD__ /* * On NetBSD MB_LEN_MAX is currently 32 which does not fit on any integer * integral type and it is probably wrong, since currently the maximum * number of bytes and character needs is 6. Until this is fixed, the * loops below are using sizeof(uint64_t) - 1 instead of MB_LEN_MAX, and * the assertion is commented out. */ #ifdef __FreeBSD__ /* * On FreeBSD including for CTASSERT only works in kernel * mode. */ #ifndef CTASSERT #define CTASSERT(x) _CTASSERT(x, __LINE__) #define _CTASSERT(x, y) __CTASSERT(x, y) #define __CTASSERT(x, y) typedef char __assert ## y[(x) ? 1 : -1] #endif #endif /* __FreeBSD__ */ CTASSERT(MB_LEN_MAX <= sizeof(uint64_t)); #endif /* !__NetBSD__ */ #endif /* * This is do_hvis, for HTTP style (RFC 1808) */ static wchar_t * do_hvis(wchar_t *dst, wint_t c, int flags, wint_t nextc, const wchar_t *extra) { if (iswalnum(c) /* safe */ || c == L'$' || c == L'-' || c == L'_' || c == L'.' || c == L'+' /* extra */ || c == L'!' || c == L'*' || c == L'\'' || c == L'(' || c == L')' || c == L',') dst = do_svis(dst, c, flags, nextc, extra); else { *dst++ = L'%'; *dst++ = xtoa(((unsigned int)c >> 4) & 0xf); *dst++ = xtoa((unsigned int)c & 0xf); } return dst; } /* * This is do_mvis, for Quoted-Printable MIME (RFC 2045) * NB: No handling of long lines or CRLF. */ static wchar_t * do_mvis(wchar_t *dst, wint_t c, int flags, wint_t nextc, const wchar_t *extra) { if ((c != L'\n') && /* Space at the end of the line */ ((iswspace(c) && (nextc == L'\r' || nextc == L'\n')) || /* Out of range */ (!iswspace(c) && (c < 33 || (c > 60 && c < 62) || c > 126)) || /* Specific char to be escaped */ wcschr(L"#$@[\\]^`{|}~", c) != NULL)) { *dst++ = L'='; *dst++ = XTOA(((unsigned int)c >> 4) & 0xf); *dst++ = XTOA((unsigned int)c & 0xf); } else dst = do_svis(dst, c, flags, nextc, extra); return dst; } /* * Output single byte of multibyte character. */ static wchar_t * do_mbyte(wchar_t *dst, wint_t c, int flags, wint_t nextc, int iswextra) { if (flags & VIS_CSTYLE) { switch (c) { case L'\n': *dst++ = L'\\'; *dst++ = L'n'; return dst; case L'\r': *dst++ = L'\\'; *dst++ = L'r'; return dst; case L'\b': *dst++ = L'\\'; *dst++ = L'b'; return dst; case BELL: *dst++ = L'\\'; *dst++ = L'a'; return dst; case L'\v': *dst++ = L'\\'; *dst++ = L'v'; return dst; case L'\t': *dst++ = L'\\'; *dst++ = L't'; return dst; case L'\f': *dst++ = L'\\'; *dst++ = L'f'; return dst; case L' ': *dst++ = L'\\'; *dst++ = L's'; return dst; case L'\0': *dst++ = L'\\'; *dst++ = L'0'; if (iswoctal(nextc)) { *dst++ = L'0'; *dst++ = L'0'; } return dst; default: if (iswgraph(c)) { *dst++ = L'\\'; *dst++ = c; return dst; } } } if (iswextra || ((c & 0177) == L' ') || (flags & VIS_OCTAL)) { *dst++ = L'\\'; *dst++ = (u_char)(((u_int32_t)(u_char)c >> 6) & 03) + L'0'; *dst++ = (u_char)(((u_int32_t)(u_char)c >> 3) & 07) + L'0'; *dst++ = (c & 07) + L'0'; } else { if ((flags & VIS_NOSLASH) == 0) *dst++ = L'\\'; if (c & 0200) { c &= 0177; *dst++ = L'M'; } if (iswcntrl(c)) { *dst++ = L'^'; if (c == 0177) *dst++ = L'?'; else *dst++ = c + L'@'; } else { *dst++ = L'-'; *dst++ = c; } } return dst; } /* * This is do_vis, the central code of vis. * dst: Pointer to the destination buffer * c: Character to encode * flags: Flags word * nextc: The character following 'c' * extra: Pointer to the list of extra characters to be * backslash-protected. */ static wchar_t * do_svis(wchar_t *dst, wint_t c, int flags, wint_t nextc, const wchar_t *extra) { int iswextra, i, shft; uint64_t bmsk, wmsk; iswextra = wcschr(extra, c) != NULL; if (!iswextra && (iswgraph(c) || iswwhite(c) || ((flags & VIS_SAFE) && iswsafe(c)))) { *dst++ = c; return dst; } /* See comment in istrsenvisx() output loop, below. */ wmsk = 0; for (i = sizeof(wmsk) - 1; i >= 0; i--) { shft = i * NBBY; bmsk = (uint64_t)0xffLL << shft; wmsk |= bmsk; if ((c & wmsk) || i == 0) dst = do_mbyte(dst, (wint_t)( (uint64_t)(c & bmsk) >> shft), flags, nextc, iswextra); } return dst; } typedef wchar_t *(*visfun_t)(wchar_t *, wint_t, int, wint_t, const wchar_t *); /* * Return the appropriate encoding function depending on the flags given. */ static visfun_t getvisfun(int flags) { if (flags & VIS_HTTPSTYLE) return do_hvis; if (flags & VIS_MIMESTYLE) return do_mvis; return do_svis; } /* * Expand list of extra characters to not visually encode. */ static wchar_t * makeextralist(int flags, const char *src) { wchar_t *dst, *d; size_t len; len = strlen(src); if ((dst = calloc(len + MAXEXTRAS, sizeof(*dst))) == NULL) return NULL; if (mbstowcs(dst, src, len) == (size_t)-1) { size_t i; for (i = 0; i < len; i++) dst[i] = (wint_t)(u_char)src[i]; d = dst + len; } else d = dst + wcslen(dst); if (flags & VIS_GLOB) { *d++ = L'*'; *d++ = L'?'; *d++ = L'['; *d++ = L'#'; } if (flags & VIS_SP) *d++ = L' '; if (flags & VIS_TAB) *d++ = L'\t'; if (flags & VIS_NL) *d++ = L'\n'; if ((flags & VIS_NOSLASH) == 0) *d++ = L'\\'; *d = L'\0'; return dst; } /* * istrsenvisx() * The main internal function. * All user-visible functions call this one. */ static int istrsenvisx(char *mbdst, size_t *dlen, const char *mbsrc, size_t mblength, int flags, const char *mbextra, int *cerr_ptr) { wchar_t *dst, *src, *pdst, *psrc, *start, *extra; size_t len, olen; uint64_t bmsk, wmsk; wint_t c; visfun_t f; int clen = 0, cerr = 0, error = -1, i, shft; ssize_t mbslength, maxolen; _DIAGASSERT(mbdst != NULL); - _DIAGASSERT(mbsrc != NULL); + _DIAGASSERT(mbsrc != NULL || mblength == 0); _DIAGASSERT(mbextra != NULL); /* * Input (mbsrc) is a char string considered to be multibyte * characters. The input loop will read this string pulling * one character, possibly multiple bytes, from mbsrc and * converting each to wchar_t in src. * * The vis conversion will be done using the wide char * wchar_t string. * * This will then be converted back to a multibyte string to * return to the caller. */ /* Allocate space for the wide char strings */ psrc = pdst = extra = NULL; - if (!mblength) - mblength = strlen(mbsrc); if ((psrc = calloc(mblength + 1, sizeof(*psrc))) == NULL) return -1; if ((pdst = calloc((4 * mblength) + 1, sizeof(*pdst))) == NULL) goto out; dst = pdst; src = psrc; /* Use caller's multibyte conversion error flag. */ if (cerr_ptr) cerr = *cerr_ptr; /* * Input loop. * Handle up to mblength characters (not bytes). We do not * stop at NULs because we may be processing a block of data * that includes NULs. */ mbslength = (ssize_t)mblength; /* * When inputing a single character, must also read in the * next character for nextc, the look-ahead character. */ if (mbslength == 1) mbslength++; while (mbslength > 0) { /* Convert one multibyte character to wchar_t. */ if (!cerr) clen = mbtowc(src, mbsrc, MB_LEN_MAX); if (cerr || clen < 0) { /* Conversion error, process as a byte instead. */ *src = (wint_t)(u_char)*mbsrc; clen = 1; cerr = 1; } if (clen == 0) /* * NUL in input gives 0 return value. process * as single NUL byte and keep going. */ clen = 1; /* Advance buffer character pointer. */ src++; /* Advance input pointer by number of bytes read. */ mbsrc += clen; /* Decrement input byte count. */ mbslength -= clen; } len = src - psrc; src = psrc; /* * In the single character input case, we will have actually * processed two characters, c and nextc. Reset len back to * just a single character. */ if (mblength < len) len = mblength; /* Convert extra argument to list of characters for this mode. */ extra = makeextralist(flags, mbextra); if (!extra) { if (dlen && *dlen == 0) { errno = ENOSPC; goto out; } *mbdst = '\0'; /* can't create extra, return "" */ error = 0; goto out; } /* Look up which processing function to call. */ f = getvisfun(flags); /* * Main processing loop. * Call do_Xvis processing function one character at a time * with next character available for look-ahead. */ for (start = dst; len > 0; len--) { c = *src++; dst = (*f)(dst, c, flags, len >= 1 ? *src : L'\0', extra); if (dst == NULL) { errno = ENOSPC; goto out; } } /* Terminate the string in the buffer. */ *dst = L'\0'; /* * Output loop. * Convert wchar_t string back to multibyte output string. * If we have hit a multi-byte conversion error on input, * output byte-by-byte here. Else use wctomb(). */ len = wcslen(start); maxolen = dlen ? *dlen : (wcslen(start) * MB_LEN_MAX + 1); olen = 0; for (dst = start; len > 0; len--) { if (!cerr) clen = wctomb(mbdst, *dst); if (cerr || clen < 0) { /* * Conversion error, process as a byte(s) instead. * Examine each byte and higher-order bytes for * data. E.g., * 0x000000000000a264 -> a2 64 * 0x000000001f00a264 -> 1f 00 a2 64 */ clen = 0; wmsk = 0; for (i = sizeof(wmsk) - 1; i >= 0; i--) { shft = i * NBBY; bmsk = (uint64_t)0xffLL << shft; wmsk |= bmsk; if ((*dst & wmsk) || i == 0) mbdst[clen++] = (char)( (uint64_t)(*dst & bmsk) >> shft); } cerr = 1; } /* If this character would exceed our output limit, stop. */ if (olen + clen > (size_t)maxolen) break; /* Advance output pointer by number of bytes written. */ mbdst += clen; /* Advance buffer character pointer. */ dst++; /* Incrment output character count. */ olen += clen; } /* Terminate the output string. */ *mbdst = '\0'; /* Pass conversion error flag out. */ if (cerr_ptr) *cerr_ptr = cerr; free(extra); free(pdst); free(psrc); return (int)olen; out: free(extra); free(pdst); free(psrc); return error; } + +static int +istrsenvisxl(char *mbdst, size_t *dlen, const char *mbsrc, + int flags, const char *mbextra, int *cerr_ptr) +{ + return istrsenvisx(mbdst, dlen, mbsrc, + mbsrc != NULL ? strlen(mbsrc) : 0, flags, mbextra, cerr_ptr); +} + #endif #if !HAVE_SVIS /* * The "svis" variants all take an "extra" arg that is a pointer * to a NUL-terminated list of characters to be encoded, too. * These functions are useful e. g. to encode strings in such a * way so that they are not interpreted by a shell. */ char * svis(char *mbdst, int c, int flags, int nextc, const char *mbextra) { char cc[2]; int ret; cc[0] = c; cc[1] = nextc; ret = istrsenvisx(mbdst, NULL, cc, 1, flags, mbextra, NULL); if (ret < 0) return NULL; return mbdst + ret; } char * snvis(char *mbdst, size_t dlen, int c, int flags, int nextc, const char *mbextra) { char cc[2]; int ret; cc[0] = c; cc[1] = nextc; ret = istrsenvisx(mbdst, &dlen, cc, 1, flags, mbextra, NULL); if (ret < 0) return NULL; return mbdst + ret; } int strsvis(char *mbdst, const char *mbsrc, int flags, const char *mbextra) { - return istrsenvisx(mbdst, NULL, mbsrc, 0, flags, mbextra, NULL); + return istrsenvisxl(mbdst, NULL, mbsrc, flags, mbextra, NULL); } int strsnvis(char *mbdst, size_t dlen, const char *mbsrc, int flags, const char *mbextra) { - return istrsenvisx(mbdst, &dlen, mbsrc, 0, flags, mbextra, NULL); + return istrsenvisxl(mbdst, &dlen, mbsrc, flags, mbextra, NULL); } int strsvisx(char *mbdst, const char *mbsrc, size_t len, int flags, const char *mbextra) { return istrsenvisx(mbdst, NULL, mbsrc, len, flags, mbextra, NULL); } int strsnvisx(char *mbdst, size_t dlen, const char *mbsrc, size_t len, int flags, const char *mbextra) { return istrsenvisx(mbdst, &dlen, mbsrc, len, flags, mbextra, NULL); } int strsenvisx(char *mbdst, size_t dlen, const char *mbsrc, size_t len, int flags, const char *mbextra, int *cerr_ptr) { return istrsenvisx(mbdst, &dlen, mbsrc, len, flags, mbextra, cerr_ptr); } #endif #if !HAVE_VIS /* * vis - visually encode characters */ char * vis(char *mbdst, int c, int flags, int nextc) { char cc[2]; int ret; cc[0] = c; cc[1] = nextc; ret = istrsenvisx(mbdst, NULL, cc, 1, flags, "", NULL); if (ret < 0) return NULL; return mbdst + ret; } char * nvis(char *mbdst, size_t dlen, int c, int flags, int nextc) { char cc[2]; int ret; cc[0] = c; cc[1] = nextc; ret = istrsenvisx(mbdst, &dlen, cc, 1, flags, "", NULL); if (ret < 0) return NULL; return mbdst + ret; } /* * strvis - visually encode characters from src into dst * * Dst must be 4 times the size of src to account for possible * expansion. The length of dst, not including the trailing NULL, * is returned. */ int strvis(char *mbdst, const char *mbsrc, int flags) { - return istrsenvisx(mbdst, NULL, mbsrc, 0, flags, "", NULL); + return istrsenvisxl(mbdst, NULL, mbsrc, flags, "", NULL); } int strnvis(char *mbdst, size_t dlen, const char *mbsrc, int flags) { - return istrsenvisx(mbdst, &dlen, mbsrc, 0, flags, "", NULL); + return istrsenvisxl(mbdst, &dlen, mbsrc, flags, "", NULL); } /* * strvisx - visually encode characters from src into dst * * Dst must be 4 times the size of src to account for possible * expansion. The length of dst, not including the trailing NULL, * is returned. * * Strvisx encodes exactly len characters from src into dst. * This is useful for encoding a block of data. */ int strvisx(char *mbdst, const char *mbsrc, size_t len, int flags) { return istrsenvisx(mbdst, NULL, mbsrc, len, flags, "", NULL); } int strnvisx(char *mbdst, size_t dlen, const char *mbsrc, size_t len, int flags) { return istrsenvisx(mbdst, &dlen, mbsrc, len, flags, "", NULL); } int strenvisx(char *mbdst, size_t dlen, const char *mbsrc, size_t len, int flags, int *cerr_ptr) { return istrsenvisx(mbdst, &dlen, mbsrc, len, flags, "", cerr_ptr); } #endif Index: stable/9/contrib/libc-vis =================================================================== --- stable/9/contrib/libc-vis (revision 272754) +++ stable/9/contrib/libc-vis (revision 272755) Property changes on: stable/9/contrib/libc-vis ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,2 ## Merged /vendor/NetBSD/libc-vis/dist:r247133-271281 Merged /head/contrib/libc-vis:r271287 Index: stable/9/etc/rc.d/devd =================================================================== --- stable/9/etc/rc.d/devd (revision 272754) +++ stable/9/etc/rc.d/devd (revision 272755) @@ -1,40 +1,41 @@ #!/bin/sh # # $FreeBSD$ # # PROVIDE: devd # REQUIRE: netif # BEFORE: NETWORKING mountcritremote # KEYWORD: nojail shutdown . /etc/rc.subr name="devd" rcvar="devd_enable" command="/sbin/${name}" start_precmd=${name}_prestart stop_precmd=find_pidfile find_pidfile() { if get_pidfile_from_conf pid-file /etc/devd.conf; then pidfile="$_pidfile_from_conf" else pidfile="/var/run/${name}.pid" fi } devd_prestart () { find_pidfile - # If devd is disabled, turn it off in the kernel to avoid memory leaks. + # If devd is disabled, turn it off in the kernel to avoid unnecessary + # memory usage. if ! checkyesno ${rcvar}; then - $SYSCTL hw.bus.devctl_disable=1 + $SYSCTL hw.bus.devctl_queue=0 fi } load_rc_config $name run_rc_command "$1" Index: stable/9/etc/rc.d =================================================================== --- stable/9/etc/rc.d (revision 272754) +++ stable/9/etc/rc.d (revision 272755) Property changes on: stable/9/etc/rc.d ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /head/etc/rc.d:r263758 Index: stable/9/etc =================================================================== --- stable/9/etc (revision 272754) +++ stable/9/etc (revision 272755) Property changes on: stable/9/etc ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /head/etc:r263758 Index: stable/9/sbin/devd/devd.cc =================================================================== --- stable/9/sbin/devd/devd.cc (revision 272754) +++ stable/9/sbin/devd/devd.cc (revision 272755) @@ -1,1172 +1,1172 @@ /*- * Copyright (c) 2002-2010 M. Warner Losh. * 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. * * 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. * * my_system is a variation on lib/libc/stdlib/system.c: * * Copyright (c) 1988, 1993 * The Regents of the University of California. 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. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. */ /* * DEVD control daemon. */ // TODO list: // o devd.conf and devd man pages need a lot of help: // - devd needs to document the unix domain socket // - devd.conf needs more details on the supported statements. #include __FBSDID("$FreeBSD$"); #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "devd.h" /* C compatible definitions */ #include "devd.hh" /* C++ class definitions */ #define PIPE "/var/run/devd.pipe" #define CF "/etc/devd.conf" -#define SYSCTL "hw.bus.devctl_disable" +#define SYSCTL "hw.bus.devctl_queue" /* * Since the client socket is nonblocking, we must increase its send buffer to * handle brief event storms. On FreeBSD, AF_UNIX sockets don't have a receive * buffer, so the client can't increate the buffersize by itself. * * For example, when creating a ZFS pool, devd emits one 165 character * resource.fs.zfs.statechange message for each vdev in the pool. A 64k * buffer has enough space for almost 400 drives, which would be very large but * not impossibly large pool. A 128k buffer has enough space for 794 drives, * which is more than can fit in a rack with modern technology. */ #define CLIENT_BUFSIZE 131072 using namespace std; extern FILE *yyin; extern int lineno; static const char notify = '!'; static const char nomatch = '?'; static const char attach = '+'; static const char detach = '-'; static struct pidfh *pfh; int Dflag; int dflag; int nflag; int romeo_must_die = 0; static const char *configfile = CF; static void event_loop(void); static void usage(void); template void delete_and_clear(vector &v) { typename vector::const_iterator i; for (i = v.begin(); i != v.end(); ++i) delete *i; v.clear(); } config cfg; event_proc::event_proc() : _prio(-1) { _epsvec.reserve(4); } event_proc::~event_proc() { delete_and_clear(_epsvec); } void event_proc::add(eps *eps) { _epsvec.push_back(eps); } bool event_proc::matches(config &c) const { vector::const_iterator i; for (i = _epsvec.begin(); i != _epsvec.end(); ++i) if (!(*i)->do_match(c)) return (false); return (true); } bool event_proc::run(config &c) const { vector::const_iterator i; for (i = _epsvec.begin(); i != _epsvec.end(); ++i) if (!(*i)->do_action(c)) return (false); return (true); } action::action(const char *cmd) : _cmd(cmd) { // nothing } action::~action() { // nothing } static int my_system(const char *command) { pid_t pid, savedpid; int pstat; struct sigaction ign, intact, quitact; sigset_t newsigblock, oldsigblock; if (!command) /* just checking... */ return(1); /* * Ignore SIGINT and SIGQUIT, block SIGCHLD. Remember to save * existing signal dispositions. */ ign.sa_handler = SIG_IGN; ::sigemptyset(&ign.sa_mask); ign.sa_flags = 0; ::sigaction(SIGINT, &ign, &intact); ::sigaction(SIGQUIT, &ign, &quitact); ::sigemptyset(&newsigblock); ::sigaddset(&newsigblock, SIGCHLD); ::sigprocmask(SIG_BLOCK, &newsigblock, &oldsigblock); switch (pid = ::fork()) { case -1: /* error */ break; case 0: /* child */ /* * Restore original signal dispositions and exec the command. */ ::sigaction(SIGINT, &intact, NULL); ::sigaction(SIGQUIT, &quitact, NULL); ::sigprocmask(SIG_SETMASK, &oldsigblock, NULL); /* * Close the PID file, and all other open descriptors. * Inherit std{in,out,err} only. */ cfg.close_pidfile(); ::closefrom(3); ::execl(_PATH_BSHELL, "sh", "-c", command, (char *)NULL); ::_exit(127); default: /* parent */ savedpid = pid; do { pid = ::wait4(savedpid, &pstat, 0, (struct rusage *)0); } while (pid == -1 && errno == EINTR); break; } ::sigaction(SIGINT, &intact, NULL); ::sigaction(SIGQUIT, &quitact, NULL); ::sigprocmask(SIG_SETMASK, &oldsigblock, NULL); return (pid == -1 ? -1 : pstat); } bool action::do_action(config &c) { string s = c.expand_string(_cmd.c_str()); if (Dflag) fprintf(stderr, "Executing '%s'\n", s.c_str()); my_system(s.c_str()); return (true); } match::match(config &c, const char *var, const char *re) : _inv(re[0] == '!'), _var(var), _re(c.expand_string(_inv ? re + 1 : re, "^", "$")) { regcomp(&_regex, _re.c_str(), REG_EXTENDED | REG_NOSUB | REG_ICASE); } match::~match() { regfree(&_regex); } bool match::do_match(config &c) { const string &value = c.get_variable(_var); bool retval; if (Dflag) fprintf(stderr, "Testing %s=%s against %s, invert=%d\n", _var.c_str(), value.c_str(), _re.c_str(), _inv); retval = (regexec(&_regex, value.c_str(), 0, NULL, 0) == 0); if (_inv == 1) retval = (retval == 0) ? 1 : 0; return retval; } #include #include #include media::media(config &, const char *var, const char *type) : _var(var), _type(-1) { static struct ifmedia_description media_types[] = { { IFM_ETHER, "Ethernet" }, { IFM_TOKEN, "Tokenring" }, { IFM_FDDI, "FDDI" }, { IFM_IEEE80211, "802.11" }, { IFM_ATM, "ATM" }, { IFM_CARP, "CARP" }, { -1, "unknown" }, { 0, NULL }, }; for (int i = 0; media_types[i].ifmt_string != NULL; ++i) if (strcasecmp(type, media_types[i].ifmt_string) == 0) { _type = media_types[i].ifmt_word; break; } } media::~media() { } bool media::do_match(config &c) { string value; struct ifmediareq ifmr; bool retval; int s; // Since we can be called from both a device attach/detach // context where device-name is defined and what we want, // as well as from a link status context, where subsystem is // the name of interest, first try device-name and fall back // to subsystem if none exists. value = c.get_variable("device-name"); if (value.length() == 0) value = c.get_variable("subsystem"); if (Dflag) fprintf(stderr, "Testing media type of %s against 0x%x\n", value.c_str(), _type); retval = false; s = socket(PF_INET, SOCK_DGRAM, 0); if (s >= 0) { memset(&ifmr, 0, sizeof(ifmr)); strncpy(ifmr.ifm_name, value.c_str(), sizeof(ifmr.ifm_name)); if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) >= 0 && ifmr.ifm_status & IFM_AVALID) { if (Dflag) fprintf(stderr, "%s has media type 0x%x\n", value.c_str(), IFM_TYPE(ifmr.ifm_active)); retval = (IFM_TYPE(ifmr.ifm_active) == _type); } else if (_type == -1) { if (Dflag) fprintf(stderr, "%s has unknown media type\n", value.c_str()); retval = true; } close(s); } return retval; } const string var_list::bogus = "_$_$_$_$_B_O_G_U_S_$_$_$_$_"; const string var_list::nothing = ""; const string & var_list::get_variable(const string &var) const { map::const_iterator i; i = _vars.find(var); if (i == _vars.end()) return (var_list::bogus); return (i->second); } bool var_list::is_set(const string &var) const { return (_vars.find(var) != _vars.end()); } void var_list::set_variable(const string &var, const string &val) { if (Dflag) fprintf(stderr, "setting %s=%s\n", var.c_str(), val.c_str()); _vars[var] = val; } void config::reset(void) { _dir_list.clear(); delete_and_clear(_var_list_table); delete_and_clear(_attach_list); delete_and_clear(_detach_list); delete_and_clear(_nomatch_list); delete_and_clear(_notify_list); } void config::parse_one_file(const char *fn) { if (Dflag) fprintf(stderr, "Parsing %s\n", fn); yyin = fopen(fn, "r"); if (yyin == NULL) err(1, "Cannot open config file %s", fn); lineno = 1; if (yyparse() != 0) errx(1, "Cannot parse %s at line %d", fn, lineno); fclose(yyin); } void config::parse_files_in_dir(const char *dirname) { DIR *dirp; struct dirent *dp; char path[PATH_MAX]; if (Dflag) fprintf(stderr, "Parsing files in %s\n", dirname); dirp = opendir(dirname); if (dirp == NULL) return; readdir(dirp); /* Skip . */ readdir(dirp); /* Skip .. */ while ((dp = readdir(dirp)) != NULL) { if (strcmp(dp->d_name + dp->d_namlen - 5, ".conf") == 0) { snprintf(path, sizeof(path), "%s/%s", dirname, dp->d_name); parse_one_file(path); } } closedir(dirp); } class epv_greater { public: int operator()(event_proc *const&l1, event_proc *const&l2) const { return (l1->get_priority() > l2->get_priority()); } }; void config::sort_vector(vector &v) { stable_sort(v.begin(), v.end(), epv_greater()); } void config::parse(void) { vector::const_iterator i; parse_one_file(configfile); for (i = _dir_list.begin(); i != _dir_list.end(); ++i) parse_files_in_dir((*i).c_str()); sort_vector(_attach_list); sort_vector(_detach_list); sort_vector(_nomatch_list); sort_vector(_notify_list); } void config::open_pidfile() { pid_t otherpid; if (_pidfile == "") return; pfh = pidfile_open(_pidfile.c_str(), 0600, &otherpid); if (pfh == NULL) { if (errno == EEXIST) errx(1, "devd already running, pid: %d", (int)otherpid); warn("cannot open pid file"); } } void config::write_pidfile() { pidfile_write(pfh); } void config::close_pidfile() { pidfile_close(pfh); } void config::remove_pidfile() { pidfile_remove(pfh); } void config::add_attach(int prio, event_proc *p) { p->set_priority(prio); _attach_list.push_back(p); } void config::add_detach(int prio, event_proc *p) { p->set_priority(prio); _detach_list.push_back(p); } void config::add_directory(const char *dir) { _dir_list.push_back(string(dir)); } void config::add_nomatch(int prio, event_proc *p) { p->set_priority(prio); _nomatch_list.push_back(p); } void config::add_notify(int prio, event_proc *p) { p->set_priority(prio); _notify_list.push_back(p); } void config::set_pidfile(const char *fn) { _pidfile = string(fn); } void config::push_var_table() { var_list *vl; vl = new var_list(); _var_list_table.push_back(vl); if (Dflag) fprintf(stderr, "Pushing table\n"); } void config::pop_var_table() { delete _var_list_table.back(); _var_list_table.pop_back(); if (Dflag) fprintf(stderr, "Popping table\n"); } void config::set_variable(const char *var, const char *val) { _var_list_table.back()->set_variable(var, val); } const string & config::get_variable(const string &var) { vector::reverse_iterator i; for (i = _var_list_table.rbegin(); i != _var_list_table.rend(); ++i) { if ((*i)->is_set(var)) return ((*i)->get_variable(var)); } return (var_list::nothing); } bool config::is_id_char(char ch) const { return (ch != '\0' && (isalpha(ch) || isdigit(ch) || ch == '_' || ch == '-')); } void config::expand_one(const char *&src, string &dst) { int count; string buffer; src++; // $$ -> $ if (*src == '$') { dst.append(src++, 1); return; } // $(foo) -> $(foo) // Not sure if I want to support this or not, so for now we just pass // it through. if (*src == '(') { dst.append("$"); count = 1; /* If the string ends before ) is matched , return. */ while (count > 0 && *src) { if (*src == ')') count--; else if (*src == '(') count++; dst.append(src++, 1); } return; } // ${^A-Za-z] -> $\1 if (!isalpha(*src)) { dst.append("$"); dst.append(src++, 1); return; } // $var -> replace with value do { buffer.append(src++, 1); } while (is_id_char(*src)); dst.append(get_variable(buffer.c_str())); } const string config::expand_string(const char *src, const char *prepend, const char *append) { const char *var_at; string dst; /* * 128 bytes is enough for 2427 of 2438 expansions that happen * while parsing config files, as tested on 2013-01-30. */ dst.reserve(128); if (prepend != NULL) dst = prepend; for (;;) { var_at = strchr(src, '$'); if (var_at == NULL) { dst.append(src); break; } dst.append(src, var_at - src); src = var_at; expand_one(src, dst); } if (append != NULL) dst.append(append); return (dst); } bool config::chop_var(char *&buffer, char *&lhs, char *&rhs) { char *walker; if (*buffer == '\0') return (false); walker = lhs = buffer; while (is_id_char(*walker)) walker++; if (*walker != '=') return (false); walker++; // skip = if (*walker == '"') { walker++; // skip " rhs = walker; while (*walker && *walker != '"') walker++; if (*walker != '"') return (false); rhs[-2] = '\0'; *walker++ = '\0'; } else { rhs = walker; while (*walker && !isspace(*walker)) walker++; if (*walker != '\0') *walker++ = '\0'; rhs[-1] = '\0'; } while (isspace(*walker)) walker++; buffer = walker; return (true); } char * config::set_vars(char *buffer) { char *lhs; char *rhs; while (1) { if (!chop_var(buffer, lhs, rhs)) break; set_variable(lhs, rhs); } return (buffer); } void config::find_and_execute(char type) { vector *l; vector::const_iterator i; const char *s; switch (type) { default: return; case notify: l = &_notify_list; s = "notify"; break; case nomatch: l = &_nomatch_list; s = "nomatch"; break; case attach: l = &_attach_list; s = "attach"; break; case detach: l = &_detach_list; s = "detach"; break; } if (Dflag) fprintf(stderr, "Processing %s event\n", s); for (i = l->begin(); i != l->end(); ++i) { if ((*i)->matches(*this)) { (*i)->run(*this); break; } } } static void process_event(char *buffer) { char type; char *sp; sp = buffer + 1; if (Dflag) fprintf(stderr, "Processing event '%s'\n", buffer); type = *buffer++; cfg.push_var_table(); // No match doesn't have a device, and the format is a little // different, so handle it separately. switch (type) { case notify: sp = cfg.set_vars(sp); break; case nomatch: //? at location pnp-info on bus sp = strchr(sp, ' '); if (sp == NULL) return; /* Can't happen? */ *sp++ = '\0'; while (isspace(*sp)) sp++; if (strncmp(sp, "at ", 3) == 0) sp += 3; sp = cfg.set_vars(sp); while (isspace(*sp)) sp++; if (strncmp(sp, "on ", 3) == 0) cfg.set_variable("bus", sp + 3); break; case attach: /*FALLTHROUGH*/ case detach: sp = strchr(sp, ' '); if (sp == NULL) return; /* Can't happen? */ *sp++ = '\0'; cfg.set_variable("device-name", buffer); while (isspace(*sp)) sp++; if (strncmp(sp, "at ", 3) == 0) sp += 3; sp = cfg.set_vars(sp); while (isspace(*sp)) sp++; if (strncmp(sp, "on ", 3) == 0) cfg.set_variable("bus", sp + 3); break; } cfg.find_and_execute(type); cfg.pop_var_table(); } int create_socket(const char *name) { int fd, slen; struct sockaddr_un sun; if ((fd = socket(PF_LOCAL, SOCK_STREAM, 0)) < 0) err(1, "socket"); bzero(&sun, sizeof(sun)); sun.sun_family = AF_UNIX; strlcpy(sun.sun_path, name, sizeof(sun.sun_path)); slen = SUN_LEN(&sun); unlink(name); if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) err(1, "fcntl"); if (::bind(fd, (struct sockaddr *) & sun, slen) < 0) err(1, "bind"); listen(fd, 4); chown(name, 0, 0); /* XXX - root.wheel */ chmod(name, 0666); return (fd); } unsigned int max_clients = 10; /* Default, can be overriden on cmdline. */ unsigned int num_clients; list clients; void notify_clients(const char *data, int len) { list::iterator i; /* * Deliver the data to all clients. Throw clients overboard at the * first sign of trouble. This reaps clients who've died or closed * their sockets, and also clients who are alive but failing to keep up * (or who are maliciously not reading, to consume buffer space in * kernel memory or tie up the limited number of available connections). */ for (i = clients.begin(); i != clients.end(); ) { if (write(*i, data, len) != len) { --num_clients; close(*i); i = clients.erase(i); } else ++i; } } void check_clients(void) { int s; struct pollfd pfd; list::iterator i; /* * Check all existing clients to see if any of them have disappeared. * Normally we reap clients when we get an error trying to send them an * event. This check eliminates the problem of an ever-growing list of * zombie clients because we're never writing to them on a system * without frequent device-change activity. */ pfd.events = 0; for (i = clients.begin(); i != clients.end(); ) { pfd.fd = *i; s = poll(&pfd, 1, 0); if ((s < 0 && s != EINTR ) || (s > 0 && (pfd.revents & POLLHUP))) { --num_clients; close(*i); i = clients.erase(i); } else ++i; } } void new_client(int fd) { int s; int sndbuf_size; /* * First go reap any zombie clients, then accept the connection, and * shut down the read side to stop clients from consuming kernel memory * by sending large buffers full of data we'll never read. */ check_clients(); s = accept(fd, NULL, NULL); if (s != -1) { sndbuf_size = CLIENT_BUFSIZE; if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, &sndbuf_size, sizeof(sndbuf_size))) err(1, "setsockopt"); shutdown(s, SHUT_RD); clients.push_back(s); ++num_clients; } else err(1, "accept"); } static void event_loop(void) { int rv; int fd; char buffer[DEVCTL_MAXBUF]; int once = 0; int server_fd, max_fd; int accepting; timeval tv; fd_set fds; fd = open(PATH_DEVCTL, O_RDONLY); if (fd == -1) err(1, "Can't open devctl device %s", PATH_DEVCTL); if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) err(1, "Can't set close-on-exec flag on devctl"); server_fd = create_socket(PIPE); accepting = 1; max_fd = max(fd, server_fd) + 1; while (1) { if (romeo_must_die) break; if (!once && !dflag && !nflag) { // Check to see if we have any events pending. tv.tv_sec = 0; tv.tv_usec = 0; FD_ZERO(&fds); FD_SET(fd, &fds); rv = select(fd + 1, &fds, &fds, &fds, &tv); // No events -> we've processed all pending events if (rv == 0) { if (Dflag) fprintf(stderr, "Calling daemon\n"); cfg.remove_pidfile(); cfg.open_pidfile(); daemon(0, 0); cfg.write_pidfile(); once++; } } /* * When we've already got the max number of clients, stop * accepting new connections (don't put server_fd in the set), * shrink the accept() queue to reject connections quickly, and * poll the existing clients more often, so that we notice more * quickly when any of them disappear to free up client slots. */ FD_ZERO(&fds); FD_SET(fd, &fds); if (num_clients < max_clients) { if (!accepting) { listen(server_fd, max_clients); accepting = 1; } FD_SET(server_fd, &fds); tv.tv_sec = 60; tv.tv_usec = 0; } else { if (accepting) { listen(server_fd, 0); accepting = 0; } tv.tv_sec = 2; tv.tv_usec = 0; } rv = select(max_fd, &fds, NULL, NULL, &tv); if (rv == -1) { if (errno == EINTR) continue; err(1, "select"); } else if (rv == 0) check_clients(); if (FD_ISSET(fd, &fds)) { rv = read(fd, buffer, sizeof(buffer) - 1); if (rv > 0) { notify_clients(buffer, rv); buffer[rv] = '\0'; while (buffer[--rv] == '\n') buffer[rv] = '\0'; process_event(buffer); } else if (rv < 0) { if (errno != EINTR) break; } else { /* EOF */ break; } } if (FD_ISSET(server_fd, &fds)) new_client(server_fd); } close(fd); } /* * functions that the parser uses. */ void add_attach(int prio, event_proc *p) { cfg.add_attach(prio, p); } void add_detach(int prio, event_proc *p) { cfg.add_detach(prio, p); } void add_directory(const char *dir) { cfg.add_directory(dir); free(const_cast(dir)); } void add_nomatch(int prio, event_proc *p) { cfg.add_nomatch(prio, p); } void add_notify(int prio, event_proc *p) { cfg.add_notify(prio, p); } event_proc * add_to_event_proc(event_proc *ep, eps *eps) { if (ep == NULL) ep = new event_proc(); ep->add(eps); return (ep); } eps * new_action(const char *cmd) { eps *e = new action(cmd); free(const_cast(cmd)); return (e); } eps * new_match(const char *var, const char *re) { eps *e = new match(cfg, var, re); free(const_cast(var)); free(const_cast(re)); return (e); } eps * new_media(const char *var, const char *re) { eps *e = new media(cfg, var, re); free(const_cast(var)); free(const_cast(re)); return (e); } void set_pidfile(const char *name) { cfg.set_pidfile(name); free(const_cast(name)); } void set_variable(const char *var, const char *val) { cfg.set_variable(var, val); free(const_cast(var)); free(const_cast(val)); } static void gensighand(int) { romeo_must_die++; _exit(0); } static void usage() { fprintf(stderr, "usage: %s [-Ddn] [-l connlimit] [-f file]\n", getprogname()); exit(1); } static void check_devd_enabled() { int val = 0; size_t len; len = sizeof(val); if (sysctlbyname(SYSCTL, &val, &len, NULL, 0) != 0) errx(1, "devctl sysctl missing from kernel!"); - if (val) { - warnx("Setting " SYSCTL " to 0"); - val = 0; + if (val == 0) { + warnx("Setting " SYSCTL " to 1000"); + val = 1000; sysctlbyname(SYSCTL, NULL, NULL, &val, sizeof(val)); } } /* * main */ int main(int argc, char **argv) { int ch; check_devd_enabled(); while ((ch = getopt(argc, argv, "Ddf:l:n")) != -1) { switch (ch) { case 'D': Dflag++; break; case 'd': dflag++; break; case 'f': configfile = optarg; break; case 'l': max_clients = MAX(1, strtoul(optarg, NULL, 0)); break; case 'n': nflag++; break; default: usage(); } } cfg.parse(); if (!dflag && nflag) { cfg.open_pidfile(); daemon(0, 0); cfg.write_pidfile(); } signal(SIGPIPE, SIG_IGN); signal(SIGHUP, gensighand); signal(SIGINT, gensighand); signal(SIGTERM, gensighand); event_loop(); return (0); } Index: stable/9/sbin/devd =================================================================== --- stable/9/sbin/devd (revision 272754) +++ stable/9/sbin/devd (revision 272755) Property changes on: stable/9/sbin/devd ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /head/sbin/devd:r263758 Index: stable/9/sbin =================================================================== --- stable/9/sbin (revision 272754) +++ stable/9/sbin (revision 272755) Property changes on: stable/9/sbin ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /head/sbin:r263758 Index: stable/9/share/man/man4/devctl.4 =================================================================== --- stable/9/share/man/man4/devctl.4 (revision 272754) +++ stable/9/share/man/man4/devctl.4 (revision 272755) @@ -1,128 +1,128 @@ .\" .\" Copyright (c) 2002 M. Warner Losh .\" 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. 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 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$ .\" -.Dd February 11, 2003 +.Dd March 26, 2014 .Dt DEVCTL 4 .Os .Sh NAME .Nm devctl .Nd "device event reporting and device control interface" .Sh DESCRIPTION The .Nm device is used to report device events from the kernel. Future versions will allow for some device control as well. .Sh IMPLEMENTATION NOTES This design allows only one reader for .Pa /dev/devctl . This is not desirable in the long run, but will get a lot of hair out of this implementation. Maybe we should make this device a clonable device. .Pp Also note: we specifically do not attach a device to the .Vt device_t tree to avoid potential chicken and egg problems. One could argue that all of this belongs to the root node. One could also further argue that the .Xr sysctl 3 interface that we have now might more properly be an .Xr ioctl 2 interface. .Pp .Dv SIGIO support is included in the driver. However, the author is not sure that the .Dv SIGIO support is done correctly. It was copied from a driver that had .Dv SIGIO support that likely has not been tested since .Fx 3.4 or .Fx 2.2.8 ! .Pp The read channel for this device is used to report changes to userland in realtime. We return one record at a time. If you try to read this device a character at a time, you will lose the rest of the data. Listening programs are expected to cope. .Pp -The sysctl and boot parameter -.Va hw.bus.devctl_disable -is used to disable +The sysctl +.Va hw.bus.devctl_queue +can be used to control queue length. It is set to 0 to disable .Nm when no .Xr devd 8 is running. .Sh PROTOCOL The .Nm device uses an .Tn ASCII protocol. The driver returns one record at a time to its readers. Each record is terminated with a newline. The first character of the record is the event type. .Pp .Bl -column -compact "Type" "Description" .Em "Type Description" ! A notify event, such as a link state change. + Device node in tree attached. - Device node in tree detached. ? Unknown device detected. .El .Ss Message Formats Except for the first character in the record, attach and detach messages have the same format. .Pp .D1 Ar T Ns Ar dev Li at Ar parent Li on Ar location .Pp .Bl -column -compact "location" "Description" .Em "Part Description" .It Ar T Ta "+ or -" .It Ar dev Ta "The device name that was attached/detached." .It Ar parent Ta "The device name of the parent bus that attached the device." .It Ar location Ta "Bus specific location information." .El .Pp The nomatch messages can be used to load devices driver. If you load a device driver, then one of two things can happen. If the device driver attaches to something, you will get a device attached message. If it does not, then nothing will happen. .Pp The attach and detach messages arrive after the event. This means one cannot use the attach message to load an alternate driver. The attach message driver has already claimed this device. One cannot use the detach messages to flush data to the device. The device is already gone. .Sh SEE ALSO .Xr devd 8 Index: stable/9/share/man/man4 =================================================================== --- stable/9/share/man/man4 (revision 272754) +++ stable/9/share/man/man4 (revision 272755) Property changes on: stable/9/share/man/man4 ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /head/share/man/man4:r263758 Index: stable/9/share/man =================================================================== --- stable/9/share/man (revision 272754) +++ stable/9/share/man (revision 272755) Property changes on: stable/9/share/man ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /head/share/man:r263758 Index: stable/9/share =================================================================== --- stable/9/share (revision 272754) +++ stable/9/share (revision 272755) Property changes on: stable/9/share ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /head/share:r263758 Index: stable/9/tools/tools/sysdoc/tunables.mdoc =================================================================== --- stable/9/tools/tools/sysdoc/tunables.mdoc (revision 272754) +++ stable/9/tools/tools/sysdoc/tunables.mdoc (revision 272755) @@ -1,2410 +1,2400 @@ # $FreeBSD$ --- debug.disablecwd bool Determines whether or not the .Xr getwcd 3 system call should be allowed. --- debug.disablefullpath bool Determines whether or not the .Fn vn_fullpath function may be used. --- debug.dobkgrdwrite bool Determines if background writes should be performed. --- debug.hashstat.nchash struct Displays nchash chain lengths. This is a read-only variable. --- debug.hashstat.rawnchash --- debug.ieee80211 bool This .Nm allows you to enable or disable debugging for 802.11 devices. --- debug.kdb.available variable Used to retrieve a list of currently available debugger backends. --- debug.kdb.current variable Allows for the selection of the debugger backend which is used to handle debugger requests. --- debug.kdb.enter variable When written to, the system should break to the debugger. --- debug.malloc.failure_count bool Number of times a coerced malloc failure has occurred as a result of .Va debug.malloc.failure_rate . Useful for tracking what might have happened and whether failures are being generated. --- debug.malloc.failure_rate bool Debugging feature causing .Dv M_NOWAIT allocations to fail at a specified rate. How often to generate a failure: if set to 0 (default), this feature is disabled. In other words if set to 10 (one in ten .Xr malloc 3 calls will fail). --- debug.rman_debug bool This .Nm allows you to enable or disable debugging for .Xr rman 9 , the .Fx resource manager. --- debug.sizeof.bio --- debug.sizeof.buf --- debug.sizeof.cdev --- debug.sizeof.devstat --- debug.sizeof.kinfo_proc --- debug.sizeof.proc --- debug.sizeof.vnode --- debug.vnlru_nowhere --- hw.acpi.cpu.current_speed bool Display the current CPU speed. This is adjustable, but doing so is not recommended. --- hw.acpi.cpu.max_speed int Allows you to change the stepping for processor speed on machines which support .Xr acpi 4 . --- hw.acpi.disable_on_poweroff bool Some systems using .Xr acpi 4 have problems powering off when shutting down with .Xr acpi 4 enabled. This .Nm disables .Xr acpi 4 when rebooting and shutting down. --- hw.acpi.s4bios bool This .Nm determines whether or not the S4BIOS sleep implementation should be used. --- hw.acpi.sleep_delay int Set the sleep delay for .Xr acpi 4 . --- hw.acpi.supported_sleep_state bool List supported .Tn ACPI sleep states --- hw.acpi.thermal.min_runtime --- hw.acpi.thermal.polling_rate int The interval in seconds that should be used to check the current system temperature. --- hw.acpi.thermal.tz0.temperature str Displays the current temperature. This is a read-only variable. --- hw.acpi.thermal.tz0.thermal_flags --- hw.acpi.verbose bool Determines whether or not .Xr acpi 4 should be verbose. --- hw.ata.ata_dma bool Allows the enabling and disabling of DMA for ATA devices. --- hw.ata.atapi_dma bool Allows the enabling and disabling of DMA for atapi devices, such as CD-ROM drives. --- hw.ata.tags bool An experimental feature for IDE hard drives which allows write caching to be turned on. Please read the .Xr tuning 7 manual page carefully before using this. --- hw.ata.wc bool Determines whether or not IDE write caching should be turned on or off. See .Xr tuning 7 for more information. --- -hw.bus.devctl_disable -bool - -This can be used to turn off -.Xr devctl 4 -when no -.Xr devd 8 -is running. - ---- hw.bus.devices --- hw.bus.info int This is an internally used function that returns the kernel bus interface version. --- hw.bus.rman --- hw.busdmafree_bpages --- hw.busdma.reserved_bpages --- hw.busdma.active_bpages --- hw.busdma.total_bpages --- hw.busdma.total_bounced --- hw.busdma.total_deferred --- hw.byteorder int Returns the system byte order. This is a read-only variable. --- hw.cardbus.cis_debug --- hw.cardbus.debug --- hw.cbb.debug --- hw.cbb.start_16_io --- hw.cbb.start_32_io --- hw.cbb.start_memory --- hw.floatingpoint bool Reports true if the machine has a floating point processor. This is a read-only variable. --- hw.fxp0.bundle_max int Controls the receive interrupt microcode bundle size limit for the .Xr fxp 4 device. --- hw.fxp0.int_delay int Controls the receive interrupt microcode bundling delay for the .Xr fxp 4 device. --- hw.fxp_noflow bool Disables flow control support on .Xr fxp 4 cards. When flow control is enabled, and if the operating system does not acknowledge the packet buffer filling, the card will begin to generate Ethernet quench packets, but appears to get into a feedback loop of some sort, hosing local switches. This is a workaround for this issue. --- hw.fxp_rnr int Set the amount of times that a no-resource condition may occur before the .Xr fxp 4 device may restart. --- hw.instruction_sse bool Returns true if SSE support is enabled in the kernel. This is a read-only variable. --- hw.intrcnt bool Displays a list of interrupt counters. This is a read-only variable. --- hw.intrnames str Displays a list of zero-terminated interrupt names. This is a read-only variable. --- hw.kbd.keymap_restrict_change bool This sysctl acts as a sort of secure-level, allowing control of the console keymap. Giving this a value of 1 means that only the root user can change restricted keys (like boot, panic...). A value of 2 means that only root can change restricted keys and regular keys. Regular users still can change accents and function keys. A value of 3 means only root can change restricted, regular and accent keys, while a value of 4 means that no changes to the keymap are allowed by anyone other than the root user. --- hw.machine str Displays the machine class. This is a read-only variable. --- hw.machine_arch str Displays the current architecture. This is a read-only variable. --- hw.model str Displays the model information of the current running hardware. This is a read-only variable. --- hw.ncpu bool Report the number of CPU's in the system. This is a read-only variable. --- hw.pagesize int Displays the current .Xr pagesize 1 . This is a read-only variable. --- hw.pccard.cis_debug int Allows debugging to be turned on or off for CIS. --- hw.pccard.debug bool Determines whether or not to use debugging for the PC Card bus driver. --- hw.pci.allow_unsupported_io_range bool Some machines do not detect their CardBus slots correctly because they use unsupported I/O ranges. This .Nm allows FreeBSD to use those ranges. --- hw.pci.enable_io_modes --- hw.snd.pcm0.ac97rate --- hw.snd.verbose int Control the level of verbosity for the .Pa /dev/sndstat device. See the .Xr pcm 4 man page for more information on debug levels. --- hw.snd.report_soft_formats bool Controls the internal format conversion if it is available transparently to the application software. See .Xr pcm 4 for more information. --- hw.syscons.bell bool Allows you to control whether or not to use the 'bell' while using the console. This is turned on by default. --- hw.syscons.saver.keybonly bool This variable tells the system that the screen saver may only wake up if the keyboard is used. This means that log messages that are pushed to the console will not cause the screen saver to stop, and display the log message will not display. This can be disabled to mimic the behavior of older syscons. --- hw.syscons.sc_no_suspend_vtswitch bool Disables switching between virtual terminals during suspend or resume. See .Xr syscons 4 for more information. --- hw.wi.debug bool Controls the level of debugging for .Xr wi 4 devices. --- hw.wi.txerate int This value allows controls the maximum amount of error messages per second. Giving this .Nm a value of 0 (zero) disables error messages completely. --- kern.acct_chkfreq int Specifies the frequency (in minutes) with which free disk space should be checked. This is used in conjunction with .Va kern.acct_resume and .Va kern.acct_suspend. --- kern.acct_resume int The percentage of free disk space above which process accounting will resume. --- kern.acct_suspend int The percentage of free disk space below which process accounting stops. --- kern.argmax bool The maximum number of bytes that can be used in an argument to .Xr execve 2 . This is basically the maximum number of characters which can be used in a single command line. On some rare occasions, this value needs altering. If so, please check out the .Xr xargs 1 utility. --- kern.bootfile str The kernel which was used to boot the system. --- kern.boottime str The time at which the current kernel became active after the system booted. This is a read-only variable. --- kern.chroot_allow_open_directories bool Depending on the setting of this variable, open file descriptors which reference directories will fail. If set to .Em 0 , .Xr chroot 8 will always fail with .Er EPERM if there are any directories open. If set to .Em 1 (the default), .Xr chroot 8 will fail with .Er EPERM if there are any directories open and the process is already subject to the .Xr chroot 8 system call. Any other value will bypass the check for open directories. Please see the .Xr chroot 2 man page for more information. --- kern.clockrate struct Displays information about the system clock. This is a read-only variable. --- kern.console --- kern.coredump bool Determines where the kernel should dump a core file in the event of a kernel panic. --- kern.corefile str Describes the file name that a core image should be stored to. See the .Xr core 5 man page for more information on this variable. --- kern.cp_time struct Contains CPU time statistics. This is a read-only variable. --- kern.devname struct An internally used .Nm that returns suitable device names for the .Fn devname function. See the .Xr devname 3 manual page for more information. --- kern.devstat.all struct An internally used .Nm that returns current devstat statistics as well as the current devstat generation number. See the .Xr devstat 3 man page for more information. --- kern.devstat.generation --- kern.devstat.numdevs --- kern.devstat.version int Displays the devstat list version number. This is a read-only variable. --- kern.disks str Display disk devices that the kernel is currently aware of. This is a read-only variable. --- kern.domainname str This shows the name of the current YP/NIS domain. --- kern.drainwait int The time to wait after dropping DTR to the given number. The units are measured in hundredths of a second. The default is 300 hundredths, i.e., 3 seconds. This option is needed mainly to set proper recover time after modem resets. --- kern.elf32.fallback_brand --- kern.fallback_elf_brand --- kern.file struct Returns the entire file structure. --- kern.function_list struct Returns all functions names in the kernel. --- kern.geom.confdot --- kern.geom.conftxt --- kern.geom.confxml --- kern.hostid int This .Nm may contain the IP address of the system. --- kern.hostname str Display the system hostname. This can be modified with the .Xr hostname 1 utility. --- kern.init_path string The path to search for the .Xr init 8 process. This is a read-only variable. --- kern.iov_max --- kern.ipc.clust_hiwm --- kern.ipc.clust_lowm --- kern.ipc.maxsockbuf int The maximum buffer size that may be allocated for sockets. See .Xr getsockopt 2 for more information. --- kern.ipc.maxsockets int The maximum number of sockets available. --- kern.ipc.mb_statpcpu --- kern.ipc.mbstat --- kern.ipc.mbuf_hiwm --- kern.ipc.mbuf_lowm --- kern.ipc.mbuf_wait --- kern.ipc.msqids --- kern.ipc.nmbclusters bool Maximum number of mbuf clusters available. The kernel uses a preallocated pool of .Dq mbuf clusters for the .Xr mbuf 9 allocator. The pool size is tuned by the kernel during boot. That size is set to a value which seems appropriate for the current system. --- kern.ipc.nmbcnt --- kern.ipc.nmbufs --- kern.ipc.nsfbufs --- kern.ipc.numopensockets --- kern.ipc.somaxconn int The maximum pending socket connection queue size. --- kern.ipc.zero_copy.receive bool When set to a non-zero value, zero copy is enabled for received packets. This reduces copying of data around for outgoing packets and can significantly improve throughput for network connections. --- kern.ipc.zero_copy.send bool When set to a non-zero value, zero copy is enabled for sent packets. This reduces copying of data around for outgoing packets and can significantly improve throughput for network connections. --- kern.job_control bool Reports whether or not job control is available. This is a read-only variable. --- kern.kq_calloutmax --- kern.lastpid int Displays the last PID used by a process. This is a read-only variable. --- kern.logsigexit bool Tells the kernel whether or not to log fatal signal exits. --- kern.malloc str Displays how memory is currently being allocated. This is a read-only variable. --- kern.maxfiles int The maximum number of files allowed for all the processes of the running kernel. You can override the default value which the kernel calculates by explicitly setting this to a non-zero value. Also see the .Xr tuning 7 man page for more information. --- kern.maxfilesperproc int The maximum number of files any one process can open. See the .Xr ps 1 utility for more information on monitoring processes. --- kern.maxproc int The maximum number of processes that the system can be running at any time. See the .Xr ps 1 utility for more information on monitoring processes. --- kern.maxprocperuid int The maximum number of processes one user ID can run. See the .Xr ps 1 utility for more information on monitoring processes. --- kern.maxusers int Controls the scaling of a number of static system tables, including defaults for the maximum number of open files, sizing of network memory resources, etc. See the .Xr tuning 7 man page for more information. This .Nm cannot be set using .Xr sysctl 8 . Use .Xr loader 8 instead to set this at boot time. --- kern.maxvnodes bool The maximum number of .Em vnodes (virtual file system nodes) the system can have open simultaneously. --- kern.minvnodes bool The minimun number of .Em vnodes (virtual file system nodes) the system can have open simultaneously. --- kern.module_path str This .Nm holds a colon-separated list of directories in which the kernel will search for loadable kernel modules. This path is search when using commands such as .Xr kldload 8 and .Xr kldunload 8 . --- kern.msgbuf string Contains the kernel message buffer. --- kern.msgbuf_clear bool Giving this .Nm a value of 1 (one) will cause the kernel message buffer to be cleared. It should be noted though, that the .Nm will then automatically revert back to it's original value of 0 (zero). --- kern.ngroups int Contains the maximum number of groups that a user may belong to. This is a read-only variable. --- kern.openfiles int Shows the current amount of system-wide open files. This is useful when used in conjunction with .Va kern.maxfiles for tuning your system. This is a read-only variable. --- kern.osreldate string Displays the kernel release date. This is a read-only variable. --- kern.osrelease str Displays the current version of .Fx running. This is a read-only variable. --- kern.osrevision string Displays the operating system revision. This is a read-only variable. --- kern.ostype str Alter the name of the current operating system. Changing this will change the output from the .Xr uname 1 utility. Changing the default is not recommended. --- kern.posix1version string Returns the version of .Tn POSIX that the system is attempting to comply with. This is a read-only variable. --- kern.proc.all --- kern.proc.args int Allows a process to retrieve the argument list or process title for another process without looking in the address space of another program. This is a read-only variable. --- kern.proc.pgrp --- kern.proc.pid struct This internally used .Nm may be used to extract process information. See .Xr sysctl 3 for an example. --- kern.proc.ruid --- kern.proc.tty --- kern.proc.uid --- kern.ps_argsopen bool By setting this to 0, command line arguments are hidden for processes which you are not running. This is useful on multi-user machines where things like passwords might accidentally be added to command line programs. --- kern.quantum --- kern.random.sys.burst --- kern.random.sys.harvest.ethernet --- kern.random.sys.harvest.interrupt --- kern.random.sys.harvest.point_to_point --- kern.random.sys.harvest.swi --- kern.random.sys.seeded --- kern.random.yarrow.bins --- kern.random.yarrow.fastthresh --- kern.random.yarrow.gengateinterval --- kern.random.yarrow.slowoverthresh --- kern.random.yarrow.slowthresh --- kern.randompid --- kern.rootdev string Displays the current root file system device. This is a read-only variable. --- kern.saved_ids bool Displays whether or not saved set-group/user ID is available. This is a read-only variable. --- kern.securelevel bool The current kernel security level. See the .Xr init 8 manual page for a good description about what a security level is. --- kern.sugid_coredump bool By default, a process that changes user or group credentials whether real or effective will not create a corefile. This behavior can be changed to generate a core dump by setting this variable to 1. --- kern.sync_on_panic bool In the event of a panic, this variable controls whether or not the system should try and .Xr sync 8 . In some circumstances, this could cause a double panic, and as a result, this may be turned off if needed. --- kern.threads.debug bool Determines whether to use debugging for kernel threads. This is useful for testing. --- kern.threads.max_groups_per_proc --- kern.threads.max_threads_hits --- kern.threads.max_threads_per_proc --- kern.threads.virtual_cpu int The maximum amount of virtual CPU's that be used for threading. --- kern.tty_nin --- kern.tty_nout --- kern.ttys bool Used internally by the .Xr pstat 8 command. This is a read-only variable. --- kern.version str Displays the current kernel version information. This is a read-only variable. --- machdep.acpi_root --- machdep.cpu_idle_hlt bool Halt idle CPUs. This is good for an SMP system. --- machdep.disable_mtrrs --- machdep.guessed_bootdev --- machdep.hyperthreading_allowed bool Setting this tunable to zero disables the use of additional logical processors provided by Intel HTT technology. --- machdep.panic_on_nmi --- machdep.siots --- net.inet.accf.unloadable --- net.inet.icmp.bmcastecho --- net.inet.icmp.drop_redirect --- net.inet.icmp.icmplim --- net.inet.icmp.icmplim_output --- net.inet.icmp.log_redirect --- net.inet.icmp.maskfake --- net.inet.icmp.maskrepl --- net.inet.ip.accept_sourceroute bool Controls forwarding of source-routed IP packets. --- net.inet.ip.check_interface bool This .Nm verifies that packets arrive on the correct interfaces. --- net.inet.ip.fastforwarding bool When fast forwarding is enabled, IP packets are forwarded directly to the appropriate network interface with a minimal validity checking, which greatly improves throughput. Please see the .Xr inet 4 man page for more information. --- net.inet.ip.forwarding bool Act as a gateway machine and forward packets. This can also be configured using the gateway_enable value in .Pa /etc/rc.conf --- net.inet.ip.fw.one_pass int --- net.inet.ip.intr_queue_drops --- net.inet.ip.intr_queue_maxlen --- net.inet.ip.keepfaith bool This is used in conjunction with .Xr faithd 8 to control the FAITH IPv6/v4 translator daemon. --- net.inet.ip.maxfragpackets --- net.inet.ip.maxfragsperpacket --- net.inet.ip.redirect bool Controls the sending of ICMP redirects in response to unforwardable IP packets. --- net.inet.ip.rtexpire int Lifetime in seconds of protocol-cloned IP routes after the last reference drops (default one hour). --- net.inet.ip.rtmaxcache int Trigger level of cached, unreferenced, protocol-cloned routes which initiates dynamic adaptation. --- net.inet.ip.rtminexpire int See .Xr inet 4 for more information. --- net.inet.ip.sendsourcequench bool This .Nm enables or disables the transmission of source quench packets. --- net.inet.ip.sourceroute bool Determines whether or not source routed IP packets should be forwarded. --- net.inet.ip.stats --- net.inet.ip.ttl int The TTL (time-to-live) to use for outgoing packets. --- net.inet.raw.maxdgram --- net.inet.raw.olddiverterror --- net.inet.raw.pcblist --- net.inet.raw.recvspace --- net.inet.tcp.always_keepalive bool Determines whether or not to attempt to detect dead TCP connections by sending 'keepalives' intermittently. This is enabled by default and can also be configured using the tcp_keepalive value in .Pa /etc/rc.conf --- net.inet.tcp.blackhole bool Manipulates system behavior when connection requests are received on a TCP port without a socket listening. See the .Xr blackhole 4 man page for more information. --- net.inet.tcp.delacktime --- net.inet.tcp.delayed_ack bool Historically speaking, this feature was designed to allow the acknowledgment to transmitted data to be returned along with the response. See the .Xr tuning 7 man page for more information. --- net.inet.tcp.do_tcpdrain --- net.inet.tcp.getcred --- net.inet.tcp.icmp_may_rst --- net.inet.tcp.inflight_debug bool Control debugging for the .Va net.inet.tcp.inflight_enable .Nm . Please see the .Xr tuning 7 man page for more information. --- net.inet.tcp.inflight_enable bool Turns on bandwidth delay product limiting for all TCP connections. Please see the .Xr tuning 7 man page for more information. --- net.inet.tcp.inflight_max bool .Em double check The maximum amount of data that may be queued for bandwidth delay product limiting. --- net.inet.tcp.inflight_min bool .Em double check The minimum amount of data that may be queued for bandwidth delay product limiting. --- net.inet.tcp.inflight_stab bool This parameter represents the maximal packets added to the bandwidth delay product window calculation. Changing this is not recommended. --- net.inet.tcp.isn_reseed_interval --- net.inet.tcp.local_slowstart_flightsize --- net.inet.tcp.log_in_vain bool Allows the system to log connections to TCP ports that do not have sockets listening. This variable can also be tuned by changing the value for log_in_vain in .Pa /etc/rc.conf --- net.inet.tcp.minmss bool Enable for network link optimization TCP can adjust its MSS and thus packet size according to the observed path MTU. This is done dynamically based on feedback from the remote host and network components along the packet path. This information can be abused to pretend an extremely low path MTU. --- net.inet.tcp.minmssoverload bool The PSS rate for the .Va net.inet.tcp.minmss sysctl. Setting this will force packets to be reset and dropped, this should hinder the availability of DoS attacks on WWW servers using POST attacks. --- net.inet.tcp.msl --- net.inet.tcp.mssdflt bool This is the default TCP Maximum Segment Size for TCP packets. The default setting is recommended in most cases. --- net.inet.tcp.v6mssdflt bool This is the default TCP Maximum Segment Size for TCP IPv6 packets. The default setting is recommend in most cases. --- net.inet.tcp.newreno --- net.inet.tcp.path_mtu_discovery --- net.inet.tcp.pcbcount --- net.inet.tcp.pcblist --- net.inet.tcp.recvspace bool This variables controls the amount of receive buffer space for any given TCP connection. This can be particularly useful when tuning network applications. See the .Xr tuning 7 man page for more information. --- net.inet.tcp.rexmit_min --- net.inet.tcp.rexmit_slop --- net.inet.tcp.rfc1323 bool Determines whether support for RFC1323 (TCP Extensions for High Performance) should be enabled. This variable can also be tuned by changing the value for tcp_extensions in .Pa /etc/rc.conf --- net.inet.tcp.rfc1644 --- net.inet.tcp.rfc3042 --- net.inet.tcp.rfc3390 --- net.inet.tcp.sendspace bool This variables controls the amount of send buffer space for any given TCP connection. This can be particularly useful when tuning network applications. See the .Xr tuning 7 manual page for more information. --- net.inet.tcp.slowstart_flightsize --- net.inet.tcp.stats --- net.inet.tcp.syncache.bucketlimit --- net.inet.tcp.syncache.cachelimit --- net.inet.tcp.syncache.count --- net.inet.tcp.syncache.hashsize --- net.inet.tcp.syncache.rexmtlimit --- net.inet.tcp.syncookies --- net.inet.tcp.tcbhashsize --- net.inet.tcp.v6mssdflt --- net.inet.udp.blackhole bool Manipulates system behavior when connection requests are received on a UDP port. See the .Xr blackhole 4 man page for more information. --- net.inet.udp.getcred --- net.inet.udp.log_in_vain bool Allows the system to log connections to UDP ports that do not have sockets listening. This variable can also be tuned by changing the value for log_in_vain in .Pa /etc/rc.conf --- net.inet.udp.maxdgram --- net.inet.udp.pcblist --- net.inet.udp.recvspace --- net.inet.udp.stats --- net.inet6.icmp6.errppslimit --- net.inet6.icmp6.nd6_debug --- net.inet6.icmp6.nd6_delay --- net.inet6.icmp6.nd6_maxnudhint --- net.inet6.icmp6.nd6_mmaxtries --- net.inet6.icmp6.nd6_prune --- net.inet6.icmp6.nd6_umaxtries --- net.inet6.icmp6.nd6_useloopback --- net.inet6.icmp6.nodeinfo --- net.inet6.icmp6.rediraccept --- net.inet6.icmp6.redirtimeout --- net.inet6.tcp6.getcred --- net.inet6.udp6.getcred --- net.isr.enable --- net.link.ether.inet.log_arp_movements --- net.link.ether.inet.log_arp_wrong_iface --- net.link.ether.ipfw --- net.link.generic.ifdata --- net.link.generic.system.ifcount --- net.link.gif.max_nesting bool Determines whether to allow recursive tunnels or not. --- net.link.gif.parallel_tunnels bool Determines whether to allow parallel tunnels or not. --- net.local.dgram.pcblist --- net.local.stream.pcblist --- security.bsd.see_other_uids bool Turning this option on will prevent users from viewing information about processes running under other user id numbers (UIDs). --- security.bsd.suser_enabled --- security.bsd.unprivileged_proc_debug --- security.bsd.unprivileged_read_msgbuf --- security.jail.set_hostname_allowed bool Determines whether or not the root user within the jail can set the hostname. --- security.jail.socket_unixiproute_only --- security.jail.sysvipc_allowed --- security.mac.biba.enabled bool Enables enforcement of the Biba integrity policy. --- security.mac.biba.ptys_equal bool Label .Sm off .Xr pty 4 s .Sm on as .Dq biba/equal upon creation. --- security.mac.biba.revocation_enabled bool Revoke access to objects if the label is changed to dominate the subject. --- security.mac.enforce_fs bool Enforce MAC policies for file system accesses. --- security.mac.enforce_kld bool Enforce MAC policies on .Xr kld 4 . --- security.mac.enforce_network bool Enforce MAC policies on network interfaces. --- security.mac.enforce_pipe bool Enforce MAC policies on pipes. --- security.mac.enforce_process bool Enforce MAC policies between system processes (e.g. .Xr ps 1 , .Xr ktrace 2 ). --- security.mac.enforce_socket bool Enforce MAC policies on sockets. --- security.mac.enforce_system bool Enforce MAC policies on system-related items (e.g. .Xr kenv 1 , .Xr acct 2 , .Xr reboot 2 ). --- security.mac.enforce_vm bool Enforce MAC policies on .Xr mmap 2 and .Xr mprotect 2 . --- security.mac.ifoff.lo_enabled bool Use this too disable network traffic over the loopback .Xr lo 4 interface. See .Xr mac_ifoff 4 for more information. --- security.mac.ifoff.other_enabled bool Use this to enable network traffic over other interfaces. See .Xr mac_ifoff 4 for more information. --- security.mac.ifoff.bpfrecv_enabled bool Use this too allow .Xr bpf 4 traffic to be received, even while other traffic is disabled. --- security.mac.mls.enabled bool Enables the enforcement of the MLS confidentiality policy, see .Xr mac_mls 4 for more information. --- security.mac.mls.ptys_equal bool Label .Sm off .Xr pty 4 s .Sm on as .Dq mls/equal upon creation. --- security.mac.mls.revocation_enabled bool Revoke access to objects if the label is changed to a more sensitive level than the subject. --- security.mac.portacl.rules str The port access control list is specified in the following format: .Sy idtype .Li : .Sy id .Li : .Sy protocol .Li : .Sy port .Li [, .Sy idtype .Li : .Sy id .Li : .Sy protocol .Li : .Sy port .Li ,...] .Sy idtype Describes the type of subject match to be performed. Either .Li uid for userid matching, or .Li gid for group ID matching. .Sy id The user or group ID (depending on .Sy idtype ) allowed to bind to the specified port. .Bf -emphasis NOTE: User and group names are not valid; only the actual ID numbers may be used. .Ef .Sy protocol Describes which protocol this entry applies to. Either .Li tcp or .Li udp are supported. .Sy port Describes which port this entry applies to. .Bf -emphasis NOTE: MAC security policies may not override other security system policies by allowing accesses that they may deny, such as .Va net.inet.ip.portrange.reservedlow / .Va net.inet.ip.portrange.reservedhigh . .Ef --- security.mac.seeotheruids.enabled bool Enable/disable .Va security.mac.seeotheruids See .Xr mac_seeotheruids 4 for more information. --- security.mac.seeotheruids.primarygroup_enabled bool Allow users to see processes and sockets owned by the same primary group. --- security.mac.seeotheruids.specificgid_enabled bool Allow processes with a specific group ID to be exempt from the policy, set this to .Li 1 and set .Va security.mac.seeotheruids.specificgid to the gid to be exempted. --- security.mac_test str Used for debugging. See .Xr mac_test 4 for more information. --- user.bc_base_max --- user.bc_dim_max --- user.bc_scale_max --- user.bc_string_max --- user.coll_weights_max --- user.cs_path --- user.line_max --- user.posix2_c_bind --- user.posix2_c_dev --- user.posix2_fort_dev --- user.posix2_fort_run --- user.posix2_localedef --- user.posix2_sw_dev --- user.posix2_upe --- user.posix2_version --- user.re_dup_max --- user.stream_max --- user.tzname_max --- vfs.altbufferflushes --- vfs.bufdefragcnt --- vfs.buffreekvacnt --- vfs.bufmallocspace --- vfs.bufreusecnt --- vfs.bufspace --- vfs.cache.nchstats --- vfs.conflist --- vfs.devfs.generation --- vfs.devfs.inodes --- vfs.devfs.noverflow --- vfs.devfs.topinode --- vfs.dirtybufferflushes --- vfs.dirtybufthresh --- vfs.ffs.adjblkcnt --- vfs.ffs.adjrefcnt --- vfs.ffs.freeblks --- vfs.ffs.freedirs --- vfs.ffs.freefiles --- vfs.ffs.setflags --- vfs.flushwithdeps --- vfs.getnewbufcalls --- vfs.getnewbufrestarts --- vfs.hibufspace --- vfs.hidirtybuffers --- vfs.hifreebuffers --- vfs.hirunningspace --- vfs.lobufspace --- vfs.lodirtybuffers --- vfs.lofreebuffers --- vfs.lorunningspace --- vfs.maxbufspace --- vfs.maxmallocbufspace --- vfs.numdirtybuffers --- vfs.numfreebuffers --- vfs.opv_numops --- vfs.pfs.vncache.entries --- vfs.pfs.vncache.hits --- vfs.pfs.vncache.maxentries --- vfs.pfs.vncache.misses --- vfs.read_max --- vfs.recursiveflushes --- vfs.runningbufspace --- vfs.ufs.dirhash_docheck --- vfs.ufs.dirhash_maxmem --- vfs.ufs.dirhash_mem --- vfs.ufs.dirhash_minsize --- vfs.usermount bool This .Nm allows the root user to grant access to non-root users so that they may mount floppy and CD-ROM drives. --- vfs.vmiodirenable bool Controls how directories are cached by the system. This is turned on by default. See the .Xr tuning 7 man page for a more detailed explanation on this variable. --- vfs.write_behind bool Tells the file system to issue media writes as full clusters are collected, which typically occurs when writing large sequential files. This is turned on by default, but under certain circumstances may stall processes and can therefore be turned off. --- vm.defer_swapspace_pageouts --- vm.disable_swapspace_pageouts --- vm.dmmax --- vm.kvm_free --- vm.kvm_size --- vm.loadavg struct Displays the load average history. This is a read-only variable. --- vm.max_launder --- vm.nswapdev int Displays the number of swap devices available to the system. This is a read-only variable. --- vm.pageout_algorithm --- vm.pageout_full_stats_interval --- vm.pageout_lock_miss --- vm.pageout_stats_free_max --- vm.pageout_stats_interval --- vm.pageout_stats_max --- vm.stats.sys.v_intr --- vm.stats.sys.v_soft --- vm.stats.sys.v_swtch --- vm.stats.sys.v_syscall --- vm.stats.sys.v_trap --- vm.stats.vm.v_cow_faults --- vm.stats.vm.v_cow_optim --- vm.stats.vm.v_forkpages --- vm.stats.vm.v_forks --- vm.stats.vm.v_intrans --- vm.stats.vm.v_kthreadpages --- vm.stats.vm.v_kthreads --- vm.stats.vm.v_ozfod --- vm.stats.vm.v_pdpages --- vm.stats.vm.v_pdwakeups --- vm.stats.vm.v_reactivated --- vm.stats.vm.v_rforkpages --- vm.stats.vm.v_rforks --- vm.stats.vm.v_swapin --- vm.stats.vm.v_swapout --- vm.stats.vm.v_swappgsin --- vm.stats.vm.v_swappgsout --- vm.stats.vm.v_vforkpages --- vm.stats.vm.v_vforks --- vm.stats.vm.v_vm_faults --- vm.stats.vm.v_vnodein --- vm.stats.vm.v_vnodeout --- vm.stats.vm.v_vnodepgsin --- vm.stats.vm.v_vnodepgsout --- vm.stats.vm.v_zfod --- vm.swap_async_max int The maximum number of in-progress async operations that may be performed. --- vm.swap_enabled bool Determines whether or not processes may swap. --- vm.swap_idle_enabled See .Xr tuning 7 for a detailed explanation of this .Nm . --- vm.swap_info --- vm.vmtotal string Displays virtual memory statistics which are collected at five second intervals. --- vm.zone string Shows memory used by the kernel zone allocator, by zone. This information can also be found by using the .Xr vmstat 8 command. --- Index: stable/9/tools/tools/sysdoc =================================================================== --- stable/9/tools/tools/sysdoc (revision 272754) +++ stable/9/tools/tools/sysdoc (revision 272755) Property changes on: stable/9/tools/tools/sysdoc ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /head/tools/tools/sysdoc:r263758 Index: stable/9/tools/tools =================================================================== --- stable/9/tools/tools (revision 272754) +++ stable/9/tools/tools (revision 272755) Property changes on: stable/9/tools/tools ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /head/tools/tools:r263758 Index: stable/9/tools =================================================================== --- stable/9/tools (revision 272754) +++ stable/9/tools (revision 272755) Property changes on: stable/9/tools ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /head/tools:r263758 Index: stable/9 =================================================================== --- stable/9 (revision 272754) +++ stable/9 (revision 272755) Property changes on: stable/9 ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /head:r263758