From owner-p4-projects@FreeBSD.ORG Tue Sep 4 22:13:59 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4972616A41A; Tue, 4 Sep 2007 22:13:59 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0539716A417 for ; Tue, 4 Sep 2007 22:13:59 +0000 (UTC) (envelope-from cnst@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id EA76213C46E for ; Tue, 4 Sep 2007 22:13:58 +0000 (UTC) (envelope-from cnst@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l84MDwVp029199 for ; Tue, 4 Sep 2007 22:13:58 GMT (envelope-from cnst@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l84MDw2L029196 for perforce@freebsd.org; Tue, 4 Sep 2007 22:13:58 GMT (envelope-from cnst@FreeBSD.org) Date: Tue, 4 Sep 2007 22:13:58 GMT Message-Id: <200709042213.l84MDw2L029196@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to cnst@FreeBSD.org using -f From: "Constantine A. Murenin" To: Perforce Change Reviews Cc: Subject: PERFORCE change 126078 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 Sep 2007 22:13:59 -0000 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");