PERFORCE change 126078 for review
Constantine A. Murenin
cnst at FreeBSD.org
Tue Sep 4 15:13:59 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=126078
Change 126078 by cnst at dale on 2007/09/04 22:13:29
make the hw.sensors handler use FreeBSD's standard SYSCTL_OUT() macro,
instead of bringing sysctl_rdstruct() from OpenBSD.
This also fixes a bug where previously FreeBSD's kern_sysctl.c
would assume that we returned a structure of size 0, because we
didn't increment req->oldidx when we did our own copyout() call.
Because of the above req->oldidx bug, some kern_sysctl.c logic
would always set oldlenp to 0, so we had to modify OpenBSD's
systat(1) and sensorsd(8) to always reinitialise oldlenp.
Since now it's no longer necessary, let's revert to original
OpenBSD's sysctl usage in systat(1) and sensorsd(8).
I.e. now you can simply bring sensorsd(8) directly from OpenBSD,
and it's going to work here -- no modification is required! :)
Affected files ...
.. //depot/projects/soc2007/cnst-sensors/sys.kern/kern_sensors.c#10 edit
.. //depot/projects/soc2007/cnst-sensors/usr.bin.systat/sensors.c#3 edit
.. //depot/projects/soc2007/cnst-sensors/usr.sbin.sensorsd/sensorsd.c#5 edit
Differences ...
==== //depot/projects/soc2007/cnst-sensors/sys.kern/kern_sensors.c#10 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $P4: //depot/projects/soc2007/cnst-sensors/sys.kern/kern_sensors.c#9 $ */
+/* $P4: //depot/projects/soc2007/cnst-sensors/sys.kern/kern_sensors.c#10 $ */
/* $FreeBSD$ */
/* $OpenBSD: kern_sensors.c,v 1.19 2007/06/04 18:42:05 deraadt Exp $ */
/* $OpenBSD: kern_sysctl.c,v 1.154 2007/06/01 17:29:10 beck Exp $ */
@@ -266,47 +266,29 @@
/*
* sysctl glue code
*/
-int sysctl_rdstruct(void *, size_t *, void *, const void *, int);
-int sysctl_sensors(int *, u_int, void *, size_t *, void *, size_t);
int sysctl_sensors_handler(SYSCTL_HANDLER_ARGS);
SYSCTL_NODE(_hw, HW_SENSORS, sensors, CTLFLAG_RD, sysctl_sensors_handler,
"Hardware Sensors");
-/*
- * Validate parameters and get old parameters
- * for a structure oriented sysctl function.
- */
int
-sysctl_rdstruct(void *oldp, size_t *oldlenp, void *newp, const void *sp,
- int len)
+sysctl_sensors_handler(SYSCTL_HANDLER_ARGS)
{
- int error = 0;
-
- if (oldp && *oldlenp < len)
- return (ENOMEM);
- if (newp)
- return (EPERM);
- *oldlenp = len;
- if (oldp)
- error = copyout(sp, oldp, len);
- return (error);
-}
-
-int
-sysctl_sensors(int *name, u_int namelen, void *oldp, size_t *oldlenp,
- void *newp, size_t newlen)
-{
+ int *name = arg1;
+ u_int namelen = arg2;
struct ksensor *ks;
struct sensor *us;
struct ksensordev *ksd;
struct sensordev *usd;
- int dev, numt, ret;
+ int dev, numt, error;
enum sensor_type type;
if (namelen != 1 && namelen != 3)
return (ENOTDIR);
+ if (req->newptr)
+ return (EPERM);
+
dev = name[0];
ksd = sensordev_get(dev);
@@ -322,11 +304,10 @@
memcpy(usd->maxnumt, ksd->maxnumt, sizeof(usd->maxnumt));
usd->sensors_count = ksd->sensors_count;
- ret = sysctl_rdstruct(oldp, oldlenp, newp, usd,
- sizeof(struct sensordev));
+ error = SYSCTL_OUT(req, usd, sizeof(struct sensordev));
free(usd, M_TEMP);
- return (ret);
+ return (error);
}
type = name[1];
@@ -347,18 +328,8 @@
us->numt = ks->numt;
us->flags = ks->flags;
- ret = sysctl_rdstruct(oldp, oldlenp, newp, us,
- sizeof(struct sensor));
+ error = SYSCTL_OUT(req, us, sizeof(struct sensor));
+
free(us, M_TEMP);
- return (ret);
-}
-
-int
-sysctl_sensors_handler(SYSCTL_HANDLER_ARGS)
-{
- int rv;
-
- rv = sysctl_sensors(arg1, arg2, req->oldptr, &req->oldlen,
- req->newptr, req->newlen);
- return (rv);
+ return (error);
}
==== //depot/projects/soc2007/cnst-sensors/usr.bin.systat/sensors.c#3 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $P4: //depot/projects/soc2007/cnst-sensors/usr.bin.systat/sensors.c#2 $ */
+/* $P4: //depot/projects/soc2007/cnst-sensors/usr.bin.systat/sensors.c#3 $ */
/* $FreeBSD$ */
/* $OpenBSD: sensors.c,v 1.11 2007/03/23 14:48:22 ckuethe Exp $ */
@@ -78,6 +78,8 @@
mib[0] = CTL_HW;
mib[1] = HW_SENSORS;
+ slen = sizeof(struct sensor);
+ sdlen = sizeof(struct sensordev);
row = 1;
sensor_cnt = 0;
@@ -87,7 +89,6 @@
for (dev = 0; dev < MAXSENSORDEVICES; dev++) {
mib[2] = dev;
- sdlen = sizeof(struct sensordev);
if (sysctl(mib, 3, &sensordev, &sdlen, NULL, 0) == -1) {
if (errno != ENOENT)
warn("sysctl");
@@ -97,7 +98,6 @@
mib[3] = type;
for (numt = 0; numt < sensordev.maxnumt[type]; numt++) {
mib[4] = numt;
- slen = sizeof(struct sensor);
if (sysctl(mib, 5, &sensor, &slen, NULL, 0)
== -1) {
if (errno != ENOENT)
==== //depot/projects/soc2007/cnst-sensors/usr.sbin.sensorsd/sensorsd.c#5 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $P4: //depot/projects/soc2007/cnst-sensors/usr.sbin.sensorsd/sensorsd.c#4 $ */
+/* $P4: //depot/projects/soc2007/cnst-sensors/usr.sbin.sensorsd/sensorsd.c#5 $ */
/* $FreeBSD$ */
/* $OpenBSD: sensorsd.c,v 1.34 2007/08/14 17:10:02 cnst Exp $ */
@@ -110,7 +110,7 @@
{
struct sensordev sensordev;
struct sdlim_t *sdlim;
- size_t sdlen;
+ size_t sdlen = sizeof(sensordev);
time_t next_report, last_report = 0, next_check;
int mib[3], dev;
int sleeptime, sensor_cnt = 0, ch;
@@ -130,7 +130,6 @@
for (dev = 0; dev < MAXSENSORDEVICES; dev++) {
mib[2] = dev;
- sdlen = sizeof(sensordev);
if (sysctl(mib, 3, &sensordev, &sdlen, NULL, 0) == -1) {
if (errno != ENOENT)
warn("sysctl");
@@ -191,7 +190,7 @@
struct sensor sensor;
struct sdlim_t *sdlim;
struct limits_t *limit;
- size_t slen;
+ size_t slen = sizeof(sensor);
int mib[5], numt;
enum sensor_type type;
@@ -210,7 +209,6 @@
mib[3] = type;
for (numt = 0; numt < snsrdev->maxnumt[type]; numt++) {
mib[4] = numt;
- slen = sizeof(sensor);
if (sysctl(mib, 5, &sensor, &slen, NULL, 0) == -1) {
if (errno != ENOENT)
warn("sysctl");
@@ -249,6 +247,7 @@
mib[0] = CTL_HW;
mib[1] = HW_SENSORS;
mib[2] = sdlim->dev;
+ len = sizeof(sensor);
TAILQ_FOREACH(limit, &sdlim->limits, entries) {
if ((limit->flags & SENSORSD_L_ISTATUS) &&
@@ -257,7 +256,6 @@
mib[3] = limit->type;
mib[4] = limit->numt;
- len = sizeof(sensor);
if (sysctl(mib, 5, &sensor, &len, NULL, 0) == -1)
err(1, "sysctl");
More information about the p4-projects
mailing list