diff options
| author | 2010-04-20 20:49:33 +0000 | |
|---|---|---|
| committer | 2010-04-20 20:49:33 +0000 | |
| commit | f7811f45036d4e86ef9646e0c131d73f1e274855 (patch) | |
| tree | 37f57e76894fe8843c2456c360cadcbae16b54fc /sys/kern/kern_sensors.c | |
| parent | - Fix a calculation bug with the RX ring buffer memory address which (diff) | |
| download | wireguard-openbsd-f7811f45036d4e86ef9646e0c131d73f1e274855.tar.xz wireguard-openbsd-f7811f45036d4e86ef9646e0c131d73f1e274855.zip | |
Get rid of MAXSENSORDEVICES. Gaps in sensordev lists are now handled
by returning ENXIO instead of ENOENT, to essentially indicate hotplug
sensor that has gone away. Accessing beyond the end of the sensordev
list still returns ENOENT, so that you can see there are no further devices.
ok kettenis oga
Diffstat (limited to 'sys/kern/kern_sensors.c')
| -rw-r--r-- | sys/kern/kern_sensors.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/sys/kern/kern_sensors.c b/sys/kern/kern_sensors.c index a1d0453bf94..224e3c3b2f4 100644 --- a/sys/kern/kern_sensors.c +++ b/sys/kern/kern_sensors.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_sensors.c,v 1.23 2009/08/03 07:08:33 blambert Exp $ */ +/* $OpenBSD: kern_sensors.c,v 1.24 2010/04/20 20:49:33 deraadt Exp $ */ /* * Copyright (c) 2005 David Gwynne <dlg@openbsd.org> @@ -32,7 +32,7 @@ #include <sys/sensors.h> #include "hotplug.h" -int sensordev_count = 0; +int sensordev_count; SLIST_HEAD(, ksensordev) sensordev_list = SLIST_HEAD_INITIALIZER(sensordev_list); @@ -131,35 +131,42 @@ sensor_detach(struct ksensordev *sensdev, struct ksensor *sens) splx(s); } -struct ksensordev * -sensordev_get(int num) +int +sensordev_get(int num, struct ksensordev **sensdev) { struct ksensordev *sd; - SLIST_FOREACH(sd, &sensordev_list, list) - if (sd->num == num) - return (sd); - - return (NULL); + SLIST_FOREACH(sd, &sensordev_list, list) { + if (sd->num == num) { + *sensdev = sd; + return (0); + } + if (sd->num > num) + return (ENXIO); + } + return (ENOENT); } -struct ksensor * -sensor_find(int dev, enum sensor_type type, int numt) +int +sensor_find(int dev, enum sensor_type type, int numt, struct ksensor **ksensorp) { struct ksensor *s; struct ksensordev *sensdev; struct ksensors_head *sh; + int ret; - sensdev = sensordev_get(dev); - if (sensdev == NULL) - return (NULL); + ret = sensordev_get(dev, &sensdev); + if (ret) + return (ret); sh = &sensdev->sensors_list; SLIST_FOREACH(s, sh, list) - if (s->type == type && s->numt == numt) - return (s); + if (s->type == type && s->numt == numt) { + *ksensorp = s; + return (0); + } - return (NULL); + return (ENOENT); } struct sensor_task { |
