Created
November 21, 2013 19:58
-
-
Save kaworu/7588502 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/libc/gen/sysctl.3 b/lib/libc/gen/sysctl.3 | |
index 61e3d31..f33288d 100644 | |
--- a/lib/libc/gen/sysctl.3 | |
+++ b/lib/libc/gen/sysctl.3 | |
@@ -26,10 +26,10 @@ | |
.\" SUCH DAMAGE. | |
.\" | |
.\" @(#)sysctl.3 8.4 (Berkeley) 5/9/95 | |
-.\" $FreeBSD: src/lib/libc/gen/sysctl.3,v 1.33.2.13 2002/04/07 04:57:14 dd Exp $ | |
+.\" $FreeBSD: head/lib/libc/gen/sysctl.3 204170 2010-02-21 13:57:02Z ed $ | |
.\" $DragonFly: src/lib/libc/gen/sysctl.3,v 1.10 2008/05/02 02:05:03 swildner Exp $ | |
.\" | |
-.Dd January 23, 2001 | |
+.Dd November 21, 2013 | |
.Dt SYSCTL 3 | |
.Os | |
.Sh NAME | |
@@ -43,9 +43,9 @@ | |
.In sys/types.h | |
.In sys/sysctl.h | |
.Ft int | |
-.Fn sysctl "int *name" "u_int namelen" "void *oldp" "size_t *oldlenp" "void *newp" "size_t newlen" | |
+.Fn sysctl "const int *name" "u_int namelen" "void *oldp" "size_t *oldlenp" "const void *newp" "size_t newlen" | |
.Ft int | |
-.Fn sysctlbyname "const char *name" "void *oldp" "size_t *oldlenp" "void *newp" "size_t newlen" | |
+.Fn sysctlbyname "const char *name" "void *oldp" "size_t *oldlenp" "const void *newp" "size_t newlen" | |
.Ft int | |
.Fn sysctlnametomib "const char *name" "int *mibp" "size_t *sizep" | |
.Sh DESCRIPTION | |
diff --git a/lib/libc/gen/sysctl.c b/lib/libc/gen/sysctl.c | |
index b9fc0ef..fe56b48 100644 | |
--- a/lib/libc/gen/sysctl.c | |
+++ b/lib/libc/gen/sysctl.c | |
@@ -27,7 +27,7 @@ | |
* SUCH DAMAGE. | |
* | |
* @(#)sysctl.c 8.2 (Berkeley) 1/4/94 | |
- * $FreeBSD: src/lib/libc/gen/sysctl.c,v 1.6 2007/01/09 00:27:55 imp Exp $ | |
+ * $FreeBSD: head/lib/libc/gen/sysctl.c 240176 2012-09-06 20:15:44Z trhodes $ | |
* $DragonFly: src/lib/libc/gen/sysctl.c,v 1.3 2005/11/13 00:07:42 swildner Exp $ | |
*/ | |
@@ -41,15 +41,18 @@ | |
#include <unistd.h> | |
#include <string.h> | |
-extern int __sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, | |
- void *newp, size_t newlen); | |
+extern int __sysctl(const int *name, u_int namelen, void *oldp, | |
+ size_t *oldlenp, const void *newp, size_t newlen); | |
int | |
-sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, | |
- size_t newlen) | |
+sysctl(const int *name, u_int namelen, void *oldp, size_t *oldlenp, | |
+ const void *newp, size_t newlen) | |
{ | |
- if (name[0] != CTL_USER) | |
- return (__sysctl(name, namelen, oldp, oldlenp, newp, newlen)); | |
+ int retval; | |
+ | |
+ retval = __sysctl(name, namelen, oldp, oldlenp, newp, newlen); | |
+ if (retval != -1 || errno != ENOENT || name[0] != CTL_USER) | |
+ return (retval); | |
if (newp != NULL) { | |
errno = EPERM; | |
diff --git a/lib/libc/gen/sysctlbyname.c b/lib/libc/gen/sysctlbyname.c | |
index 74de709..b2fcd67 100644 | |
--- a/lib/libc/gen/sysctlbyname.c | |
+++ b/lib/libc/gen/sysctlbyname.c | |
@@ -6,33 +6,22 @@ | |
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp | |
* ---------------------------------------------------------------------------- | |
* | |
- * $FreeBSD: src/lib/libc/gen/sysctlbyname.c,v 1.4 1999/08/27 23:59:01 peter Exp $ | |
+ * $FreeBSD: head/lib/libc/gen/sysctlbyname.c 244153 2012-12-12 15:27:33Z pjd $ | |
* $DragonFly: src/lib/libc/gen/sysctlbyname.c,v 1.2 2003/06/17 04:26:42 dillon Exp $ | |
* | |
*/ | |
#include <sys/types.h> | |
#include <sys/sysctl.h> | |
-#include <string.h> | |
int | |
-sysctlbyname(const char *name, void *oldp, size_t *oldlenp, void *newp, | |
- size_t newlen) | |
+sysctlbyname(const char *name, void *oldp, size_t *oldlenp, | |
+ const void *newp, size_t newlen) | |
{ | |
- int name2oid_oid[2]; | |
int real_oid[CTL_MAXNAME+2]; | |
- int error; | |
size_t oidlen; | |
- name2oid_oid[0] = 0; /* This is magic & undocumented! */ | |
- name2oid_oid[1] = 3; | |
- | |
- oidlen = sizeof(real_oid); | |
- error = sysctl(name2oid_oid, 2, real_oid, &oidlen, (void *)name, | |
- strlen(name)); | |
- if (error < 0) | |
- return error; | |
- oidlen /= sizeof (int); | |
- error = sysctl(real_oid, oidlen, oldp, oldlenp, newp, newlen); | |
- return (error); | |
+ oidlen = sizeof(real_oid) / sizeof(int); | |
+ if (sysctlnametomib(name, real_oid, &oidlen) < 0) | |
+ return (-1); | |
+ return (sysctl(real_oid, oidlen, oldp, oldlenp, newp, newlen)); | |
} | |
- | |
diff --git a/lib/libc/gen/sysctlnametomib.c b/lib/libc/gen/sysctlnametomib.c | |
index a863b33..708cd86 100644 | |
--- a/lib/libc/gen/sysctlnametomib.c | |
+++ b/lib/libc/gen/sysctlnametomib.c | |
@@ -23,7 +23,7 @@ | |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
* SUCH DAMAGE. | |
* | |
- * $FreeBSD: src/lib/libc/gen/sysctlnametomib.c,v 1.4 2003/01/04 00:11:11 tjr Exp $ | |
+ * $FreeBSD: head/lib/libc/gen/sysctlnametomib.c 204170 2010-02-21 13:57:02Z ed $ | |
* $DragonFly: src/lib/libc/gen/sysctlnametomib.c,v 1.3 2005/11/19 22:32:53 swildner Exp $ | |
*/ | |
@@ -48,8 +48,8 @@ sysctlnametomib(const char *name, int *mibp, size_t *sizep) | |
oid[0] = 0; | |
oid[1] = 3; | |
- *sizep *= sizeof (int); | |
- error = sysctl(oid, 2, mibp, sizep, (void *)name, strlen(name)); | |
- *sizep /= sizeof (int); | |
+ *sizep *= sizeof(int); | |
+ error = sysctl(oid, 2, mibp, sizep, name, strlen(name)); | |
+ *sizep /= sizeof(int); | |
return (error); | |
} | |
diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h | |
index 6659977..baddeab 100644 | |
--- a/sys/sys/sysctl.h | |
+++ b/sys/sys/sysctl.h | |
@@ -34,7 +34,7 @@ | |
* SUCH DAMAGE. | |
* | |
* @(#)sysctl.h 8.1 (Berkeley) 6/2/93 | |
- * $FreeBSD: src/sys/sys/sysctl.h,v 1.81.2.10 2003/05/01 22:48:09 trhodes Exp $ | |
+ * $FreeBSD: head/sys/sys/sysctl.h 204170 2010-02-21 13:57:02Z ed $ | |
* $DragonFly: src/sys/sys/sysctl.h,v 1.29 2008/09/30 12:20:29 hasso Exp $ | |
*/ | |
@@ -660,8 +660,8 @@ int sysctl_int_range(SYSCTL_HANDLER_ARGS, int low, int high); | |
#include <sys/cdefs.h> | |
__BEGIN_DECLS | |
-int sysctl (int *, u_int, void *, size_t *, void *, size_t); | |
-int sysctlbyname (const char *, void *, size_t *, void *, size_t); | |
+int sysctl(const int *, u_int, void *, size_t *, const void *, size_t); | |
+int sysctlbyname(const char *, void *, size_t *, const void *, size_t); | |
int sysctlnametomib (const char *, int *, size_t *); | |
__END_DECLS | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
const & segfault fix
r204170 freebsd/freebsd-src@1fdea92
r240176 freebsd/freebsd-src@b483b4b
cosmetics
r204172 freebsd/freebsd-src@2235c1c
r244153 freebsd/freebsd-src@dddecfb