summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_sensors.c
diff options
context:
space:
mode:
authorderaadt <deraadt@openbsd.org>2010-04-20 20:49:33 +0000
committerderaadt <deraadt@openbsd.org>2010-04-20 20:49:33 +0000
commitf7811f45036d4e86ef9646e0c131d73f1e274855 (patch)
tree37f57e76894fe8843c2456c360cadcbae16b54fc /sys/kern/kern_sensors.c
parent- Fix a calculation bug with the RX ring buffer memory address which (diff)
downloadwireguard-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.c41
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 {