Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 4 Sep 2007 22:13:58 GMT
From:      "Constantine A. Murenin" <cnst@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 126078 for review
Message-ID:  <200709042213.l84MDw2L029196@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=126078

Change 126078 by cnst@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");
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200709042213.l84MDw2L029196>