1eb3a3472SHasso Tepper /* $OpenBSD: sensors.c,v 1.11 2007/03/23 14:48:22 ckuethe Exp $ */
2eb3a3472SHasso Tepper
3eb3a3472SHasso Tepper /*
4eb3a3472SHasso Tepper * Copyright (c) 2007 Deanna Phillips <deanna@openbsd.org>
5eb3a3472SHasso Tepper * Copyright (c) 2003 Henning Brauer <henning@openbsd.org>
6eb3a3472SHasso Tepper * Copyright (c) 2006 Constantine A. Murenin <cnst+openbsd@bugmail.mojo.ru>
7eb3a3472SHasso Tepper *
8eb3a3472SHasso Tepper * Permission to use, copy, modify, and distribute this software for any
9eb3a3472SHasso Tepper * purpose with or without fee is hereby granted, provided that the above
10eb3a3472SHasso Tepper * copyright notice and this permission notice appear in all copies.
11eb3a3472SHasso Tepper *
12eb3a3472SHasso Tepper * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13eb3a3472SHasso Tepper * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14eb3a3472SHasso Tepper * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15eb3a3472SHasso Tepper * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16eb3a3472SHasso Tepper * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17eb3a3472SHasso Tepper * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18eb3a3472SHasso Tepper * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19eb3a3472SHasso Tepper */
20eb3a3472SHasso Tepper
21eb3a3472SHasso Tepper #include <sys/param.h>
22eb3a3472SHasso Tepper #include <sys/sysctl.h>
23eb3a3472SHasso Tepper #include <sys/sensors.h>
24eb3a3472SHasso Tepper
25c761d8f6SSepherosa Ziehau #include <ctype.h>
26eb3a3472SHasso Tepper #include <err.h>
27eb3a3472SHasso Tepper #include <errno.h>
288b664974SSepherosa Ziehau #include <libutil.h>
29eb3a3472SHasso Tepper #include <stdio.h>
30eb3a3472SHasso Tepper #include <stdlib.h>
3187f72003SSepherosa Ziehau #include <string.h>
32eb3a3472SHasso Tepper
33eb3a3472SHasso Tepper #include "systat.h"
34eb3a3472SHasso Tepper #include "extern.h"
35eb3a3472SHasso Tepper
36eb3a3472SHasso Tepper struct sensor sensor;
37eb3a3472SHasso Tepper struct sensordev sensordev;
38eb3a3472SHasso Tepper int row, sensor_cnt;
39eb3a3472SHasso Tepper void printline(void);
40eb3a3472SHasso Tepper static char * fmttime(double);
41eb3a3472SHasso Tepper
42c761d8f6SSepherosa Ziehau struct sensordev_xname {
43c761d8f6SSepherosa Ziehau char xname[24];
44c761d8f6SSepherosa Ziehau int xname_len;
45c761d8f6SSepherosa Ziehau u_int flags; /* XNAME_FLAG_ */
46c761d8f6SSepherosa Ziehau };
47c761d8f6SSepherosa Ziehau
48c761d8f6SSepherosa Ziehau #define XNAME_FLAG_WILDCARD 0x1
49c761d8f6SSepherosa Ziehau
5087f72003SSepherosa Ziehau static int sensors_enabled[SENSOR_MAX_TYPES];
5187f72003SSepherosa Ziehau
52c761d8f6SSepherosa Ziehau #define XNAME_MAX 64
53c761d8f6SSepherosa Ziehau
54c761d8f6SSepherosa Ziehau static int sensordev_xname_cnt;
55c761d8f6SSepherosa Ziehau static struct sensordev_xname sensordev_xname[XNAME_MAX];
56c761d8f6SSepherosa Ziehau
57eb3a3472SHasso Tepper WINDOW *
opensensors(void)58eb3a3472SHasso Tepper opensensors(void)
59eb3a3472SHasso Tepper {
60eb3a3472SHasso Tepper return (subwin(stdscr, LINES-5-1, 0, 5, 0));
61eb3a3472SHasso Tepper }
62eb3a3472SHasso Tepper
63eb3a3472SHasso Tepper void
closesensors(WINDOW * w)64eb3a3472SHasso Tepper closesensors(WINDOW *w)
65eb3a3472SHasso Tepper {
66eb3a3472SHasso Tepper if (w == NULL)
67eb3a3472SHasso Tepper return;
68eb3a3472SHasso Tepper wclear(w);
69eb3a3472SHasso Tepper wrefresh(w);
70eb3a3472SHasso Tepper delwin(w);
71eb3a3472SHasso Tepper }
72eb3a3472SHasso Tepper
73eb3a3472SHasso Tepper void
labelsensors(void)74eb3a3472SHasso Tepper labelsensors(void)
75eb3a3472SHasso Tepper {
76eb3a3472SHasso Tepper wmove(wnd, 0, 0);
77eb3a3472SHasso Tepper wclrtobot(wnd);
78eb3a3472SHasso Tepper mvwaddstr(wnd, 0, 0, "Sensor");
79eb3a3472SHasso Tepper mvwaddstr(wnd, 0, 34, "Value");
80eb3a3472SHasso Tepper mvwaddstr(wnd, 0, 45, "Status");
81eb3a3472SHasso Tepper mvwaddstr(wnd, 0, 58, "Description");
82eb3a3472SHasso Tepper }
83eb3a3472SHasso Tepper
84eb3a3472SHasso Tepper void
fetchsensors(void)85eb3a3472SHasso Tepper fetchsensors(void)
86eb3a3472SHasso Tepper {
87eb3a3472SHasso Tepper enum sensor_type type;
882dc01a00SSepherosa Ziehau size_t slen, sdlen, idmax_len;
892dc01a00SSepherosa Ziehau int mib[5], dev, numt, idmax;
902dc01a00SSepherosa Ziehau int maxsensordevices;
912dc01a00SSepherosa Ziehau
922dc01a00SSepherosa Ziehau maxsensordevices = MAXSENSORDEVICES;
932dc01a00SSepherosa Ziehau idmax_len = sizeof(idmax);
942dc01a00SSepherosa Ziehau if (sysctlbyname("hw.sensors.dev_idmax", &idmax, &idmax_len,
952dc01a00SSepherosa Ziehau NULL, 0) == 0)
962dc01a00SSepherosa Ziehau maxsensordevices = idmax;
97eb3a3472SHasso Tepper
98eb3a3472SHasso Tepper mib[0] = CTL_HW;
99eb3a3472SHasso Tepper mib[1] = HW_SENSORS;
100eb3a3472SHasso Tepper slen = sizeof(struct sensor);
101eb3a3472SHasso Tepper sdlen = sizeof(struct sensordev);
102eb3a3472SHasso Tepper
103eb3a3472SHasso Tepper row = 1;
104eb3a3472SHasso Tepper sensor_cnt = 0;
105eb3a3472SHasso Tepper
106eb3a3472SHasso Tepper wmove(wnd, row, 0);
107eb3a3472SHasso Tepper wclrtobot(wnd);
108eb3a3472SHasso Tepper
1092dc01a00SSepherosa Ziehau for (dev = 0; dev < maxsensordevices; dev++) {
110eb3a3472SHasso Tepper mib[2] = dev;
111eb3a3472SHasso Tepper if (sysctl(mib, 3, &sensordev, &sdlen, NULL, 0) == -1) {
112eb3a3472SHasso Tepper if (errno != ENOENT)
113eb3a3472SHasso Tepper warn("sysctl");
114eb3a3472SHasso Tepper continue;
115eb3a3472SHasso Tepper }
116c761d8f6SSepherosa Ziehau
117c761d8f6SSepherosa Ziehau if (sensordev_xname_cnt > 0) {
118c761d8f6SSepherosa Ziehau int i, match = 0, xname_len;
119c761d8f6SSepherosa Ziehau
120c761d8f6SSepherosa Ziehau xname_len = strlen(sensordev.xname);
121c761d8f6SSepherosa Ziehau for (i = 0; i < sensordev_xname_cnt; ++i) {
122c761d8f6SSepherosa Ziehau const struct sensordev_xname *x;
123c761d8f6SSepherosa Ziehau
124c761d8f6SSepherosa Ziehau x = &sensordev_xname[i];
125c761d8f6SSepherosa Ziehau if (x->flags & XNAME_FLAG_WILDCARD) {
126c761d8f6SSepherosa Ziehau if (xname_len <= x->xname_len)
127c761d8f6SSepherosa Ziehau continue;
128c761d8f6SSepherosa Ziehau if (!isdigit(
129c761d8f6SSepherosa Ziehau sensordev.xname[x->xname_len]))
130c761d8f6SSepherosa Ziehau continue;
131c761d8f6SSepherosa Ziehau if (strncmp(x->xname, sensordev.xname,
132c761d8f6SSepherosa Ziehau x->xname_len) == 0) {
133c761d8f6SSepherosa Ziehau match = 1;
134c761d8f6SSepherosa Ziehau break;
135c761d8f6SSepherosa Ziehau }
136c761d8f6SSepherosa Ziehau } else if (xname_len == x->xname_len &&
137c761d8f6SSepherosa Ziehau strcmp(x->xname, sensordev.xname) == 0) {
138c761d8f6SSepherosa Ziehau match = 1;
139c761d8f6SSepherosa Ziehau break;
140c761d8f6SSepherosa Ziehau }
141c761d8f6SSepherosa Ziehau }
142c761d8f6SSepherosa Ziehau if (!match)
143c761d8f6SSepherosa Ziehau continue;
144c761d8f6SSepherosa Ziehau }
145c761d8f6SSepherosa Ziehau
146eb3a3472SHasso Tepper for (type = 0; type < SENSOR_MAX_TYPES; type++) {
14787f72003SSepherosa Ziehau if (!sensors_enabled[type])
14887f72003SSepherosa Ziehau continue;
14987f72003SSepherosa Ziehau
150eb3a3472SHasso Tepper mib[3] = type;
151eb3a3472SHasso Tepper for (numt = 0; numt < sensordev.maxnumt[type]; numt++) {
152eb3a3472SHasso Tepper mib[4] = numt;
153eb3a3472SHasso Tepper if (sysctl(mib, 5, &sensor, &slen, NULL, 0)
154eb3a3472SHasso Tepper == -1) {
155eb3a3472SHasso Tepper if (errno != ENOENT)
156eb3a3472SHasso Tepper warn("sysctl");
157eb3a3472SHasso Tepper continue;
158eb3a3472SHasso Tepper }
159eb3a3472SHasso Tepper if (sensor.flags & SENSOR_FINVALID)
160eb3a3472SHasso Tepper continue;
161eb3a3472SHasso Tepper sensor_cnt++;
162eb3a3472SHasso Tepper printline();
163eb3a3472SHasso Tepper }
164eb3a3472SHasso Tepper }
165eb3a3472SHasso Tepper }
166eb3a3472SHasso Tepper }
167eb3a3472SHasso Tepper
168eb3a3472SHasso Tepper const char *drvstat[] = {
169eb3a3472SHasso Tepper NULL,
170eb3a3472SHasso Tepper "empty", "ready", "powerup", "online", "idle", "active",
171eb3a3472SHasso Tepper "rebuild", "powerdown", "fail", "pfail"
172eb3a3472SHasso Tepper };
173eb3a3472SHasso Tepper
174eb3a3472SHasso Tepper void
showsensors(void)175eb3a3472SHasso Tepper showsensors(void)
176eb3a3472SHasso Tepper {
177eb3a3472SHasso Tepper if (sensor_cnt == 0)
178eb3a3472SHasso Tepper mvwaddstr(wnd, row, 0, "No sensors found.");
179eb3a3472SHasso Tepper }
180eb3a3472SHasso Tepper
181eb3a3472SHasso Tepper int
initsensors(void)182eb3a3472SHasso Tepper initsensors(void)
183eb3a3472SHasso Tepper {
18487f72003SSepherosa Ziehau int i;
18587f72003SSepherosa Ziehau
18687f72003SSepherosa Ziehau for (i = 0; i < SENSOR_MAX_TYPES; ++i)
18787f72003SSepherosa Ziehau sensors_enabled[i] = 1;
188eb3a3472SHasso Tepper return (1);
189eb3a3472SHasso Tepper }
190eb3a3472SHasso Tepper
191eb3a3472SHasso Tepper void
printline(void)192eb3a3472SHasso Tepper printline(void)
193eb3a3472SHasso Tepper {
1948b664974SSepherosa Ziehau char buf[9];
1958b664974SSepherosa Ziehau
196eb3a3472SHasso Tepper mvwprintw(wnd, row, 0, "%s.%s%d", sensordev.xname,
197eb3a3472SHasso Tepper sensor_type_s[sensor.type], sensor.numt);
198eb3a3472SHasso Tepper switch (sensor.type) {
199eb3a3472SHasso Tepper case SENSOR_TEMP:
200eb3a3472SHasso Tepper mvwprintw(wnd, row, 24, "%10.2f degC",
201eb3a3472SHasso Tepper (sensor.value - 273150000) / 1000000.0);
202eb3a3472SHasso Tepper break;
203eb3a3472SHasso Tepper case SENSOR_FANRPM:
204eb3a3472SHasso Tepper mvwprintw(wnd, row, 24, "%11lld RPM", sensor.value);
205eb3a3472SHasso Tepper break;
206eb3a3472SHasso Tepper case SENSOR_VOLTS_DC:
207eb3a3472SHasso Tepper mvwprintw(wnd, row, 24, "%10.2f V DC",
208eb3a3472SHasso Tepper sensor.value / 1000000.0);
209eb3a3472SHasso Tepper break;
21001d58e0fSImre Vadász case SENSOR_WATTS:
21101d58e0fSImre Vadász mvwprintw(wnd, row, 24, "%13.2f W", sensor.value / 1000000.0);
21201d58e0fSImre Vadász break;
213eb3a3472SHasso Tepper case SENSOR_AMPS:
214eb3a3472SHasso Tepper mvwprintw(wnd, row, 24, "%10.2f A", sensor.value / 1000000.0);
215eb3a3472SHasso Tepper break;
216eb3a3472SHasso Tepper case SENSOR_INDICATOR:
217eb3a3472SHasso Tepper mvwprintw(wnd, row, 24, "%15s", sensor.value? "On" : "Off");
218eb3a3472SHasso Tepper break;
219eb3a3472SHasso Tepper case SENSOR_INTEGER:
220eb3a3472SHasso Tepper mvwprintw(wnd, row, 24, "%11lld raw", sensor.value);
221eb3a3472SHasso Tepper break;
222eb3a3472SHasso Tepper case SENSOR_PERCENT:
223eb3a3472SHasso Tepper mvwprintw(wnd, row, 24, "%14.2f%%", sensor.value / 1000.0);
224eb3a3472SHasso Tepper break;
225eb3a3472SHasso Tepper case SENSOR_LUX:
226eb3a3472SHasso Tepper mvwprintw(wnd, row, 24, "%15.2f lx", sensor.value / 1000000.0);
227eb3a3472SHasso Tepper break;
228eb3a3472SHasso Tepper case SENSOR_DRIVE:
229eb3a3472SHasso Tepper if (0 < sensor.value &&
230*e62ef63cSSascha Wildner (size_t)sensor.value < NELEM(drvstat)) {
231eb3a3472SHasso Tepper mvwprintw(wnd, row, 24, "%15s", drvstat[sensor.value]);
232eb3a3472SHasso Tepper break;
233eb3a3472SHasso Tepper }
234eb3a3472SHasso Tepper break;
235eb3a3472SHasso Tepper case SENSOR_TIMEDELTA:
236eb3a3472SHasso Tepper mvwprintw(wnd, row, 24, "%15s", fmttime(sensor.value / 1000000000.0));
237eb3a3472SHasso Tepper break;
238eb3a3472SHasso Tepper case SENSOR_WATTHOUR:
239eb3a3472SHasso Tepper mvwprintw(wnd, row, 24, "%12.2f Wh", sensor.value / 1000000.0);
240eb3a3472SHasso Tepper break;
241eb3a3472SHasso Tepper case SENSOR_AMPHOUR:
242eb3a3472SHasso Tepper mvwprintw(wnd, row, 24, "%10.2f Ah", sensor.value / 1000000.0);
243eb3a3472SHasso Tepper break;
2448b664974SSepherosa Ziehau case SENSOR_FREQ:
2458b664974SSepherosa Ziehau humanize_number(buf, sizeof(buf), sensor.value, "Hz",
2468b664974SSepherosa Ziehau HN_AUTOSCALE, HN_DIVISOR_1000 | HN_DECIMAL);
2478b664974SSepherosa Ziehau mvwprintw(wnd, row, 24, "%15s", buf);
2488b664974SSepherosa Ziehau break;
249eb3a3472SHasso Tepper default:
250eb3a3472SHasso Tepper mvwprintw(wnd, row, 24, "%10lld", sensor.value);
251eb3a3472SHasso Tepper break;
252eb3a3472SHasso Tepper }
253eb3a3472SHasso Tepper if (sensor.desc[0] != '\0')
254eb3a3472SHasso Tepper mvwprintw(wnd, row, 58, "(%s)", sensor.desc);
255eb3a3472SHasso Tepper
256eb3a3472SHasso Tepper switch (sensor.status) {
257eb3a3472SHasso Tepper case SENSOR_S_UNSPEC:
258eb3a3472SHasso Tepper break;
259eb3a3472SHasso Tepper case SENSOR_S_UNKNOWN:
260eb3a3472SHasso Tepper mvwaddstr(wnd, row, 45, "unknown");
261eb3a3472SHasso Tepper break;
262eb3a3472SHasso Tepper case SENSOR_S_WARN:
263eb3a3472SHasso Tepper mvwaddstr(wnd, row, 45, "WARNING");
264eb3a3472SHasso Tepper break;
265eb3a3472SHasso Tepper case SENSOR_S_CRIT:
266eb3a3472SHasso Tepper mvwaddstr(wnd, row, 45, "CRITICAL");
267eb3a3472SHasso Tepper break;
268eb3a3472SHasso Tepper case SENSOR_S_OK:
269eb3a3472SHasso Tepper mvwaddstr(wnd, row, 45, "OK");
270eb3a3472SHasso Tepper break;
271eb3a3472SHasso Tepper }
272eb3a3472SHasso Tepper row++;
273eb3a3472SHasso Tepper }
274eb3a3472SHasso Tepper
275eb3a3472SHasso Tepper #define SECS_PER_DAY 86400
276eb3a3472SHasso Tepper #define SECS_PER_HOUR 3600
277eb3a3472SHasso Tepper #define SECS_PER_MIN 60
278eb3a3472SHasso Tepper
279eb3a3472SHasso Tepper static char *
fmttime(double in)280eb3a3472SHasso Tepper fmttime(double in)
281eb3a3472SHasso Tepper {
282eb3a3472SHasso Tepper int signbit = 1;
283eb3a3472SHasso Tepper int tiny = 0;
284cae49b89SSascha Wildner const char *unit;
285eb3a3472SHasso Tepper #define LEN 32
286eb3a3472SHasso Tepper static char outbuf[LEN];
287eb3a3472SHasso Tepper
288eb3a3472SHasso Tepper if (in < 0){
289eb3a3472SHasso Tepper signbit = -1;
290eb3a3472SHasso Tepper in *= -1;
291eb3a3472SHasso Tepper }
292eb3a3472SHasso Tepper
293eb3a3472SHasso Tepper if (in >= SECS_PER_DAY ){
294eb3a3472SHasso Tepper unit = "days";
295eb3a3472SHasso Tepper in /= SECS_PER_DAY;
296eb3a3472SHasso Tepper } else if (in >= SECS_PER_HOUR ){
297eb3a3472SHasso Tepper unit = "hr";
298eb3a3472SHasso Tepper in /= SECS_PER_HOUR;
299eb3a3472SHasso Tepper } else if (in >= SECS_PER_MIN ){
300eb3a3472SHasso Tepper unit = "min";
301eb3a3472SHasso Tepper in /= SECS_PER_MIN;
302eb3a3472SHasso Tepper } else if (in >= 1 ){
303eb3a3472SHasso Tepper unit = "s";
304eb3a3472SHasso Tepper /* in *= 1; */ /* no op */
305eb3a3472SHasso Tepper } else if (in == 0 ){ /* direct comparisons to floats are scary */
306eb3a3472SHasso Tepper unit = "s";
307eb3a3472SHasso Tepper } else if (in >= 1e-3 ){
308eb3a3472SHasso Tepper unit = "ms";
309eb3a3472SHasso Tepper in *= 1e3;
310eb3a3472SHasso Tepper } else if (in >= 1e-6 ){
311eb3a3472SHasso Tepper unit = "us";
312eb3a3472SHasso Tepper in *= 1e6;
313eb3a3472SHasso Tepper } else if (in >= 1e-9 ){
314eb3a3472SHasso Tepper unit = "ns";
315eb3a3472SHasso Tepper in *= 1e9;
316eb3a3472SHasso Tepper } else {
317eb3a3472SHasso Tepper unit = "ps";
318eb3a3472SHasso Tepper if (in < 1e-13)
319eb3a3472SHasso Tepper tiny = 1;
320eb3a3472SHasso Tepper in *= 1e12;
321eb3a3472SHasso Tepper }
322eb3a3472SHasso Tepper
323eb3a3472SHasso Tepper snprintf(outbuf, LEN,
324eb3a3472SHasso Tepper tiny ? "%s%lf %s" : "%s%.3lf %s",
325eb3a3472SHasso Tepper signbit == -1 ? "-" : "", in, unit);
326eb3a3472SHasso Tepper
327eb3a3472SHasso Tepper return outbuf;
328eb3a3472SHasso Tepper }
32987f72003SSepherosa Ziehau
33087f72003SSepherosa Ziehau int
cmdsensors(const char * cmd,char * args)33187f72003SSepherosa Ziehau cmdsensors(const char *cmd, char *args)
33287f72003SSepherosa Ziehau {
33387f72003SSepherosa Ziehau if (prefix(cmd, "type")) {
33487f72003SSepherosa Ziehau const char *t;
33587f72003SSepherosa Ziehau int i, has_type = 0;
33687f72003SSepherosa Ziehau
33787f72003SSepherosa Ziehau for (i = 0; i < SENSOR_MAX_TYPES; ++i)
33887f72003SSepherosa Ziehau sensors_enabled[i] = 0;
33987f72003SSepherosa Ziehau
34087f72003SSepherosa Ziehau while ((t = strsep(&args, " ")) != NULL) {
34187f72003SSepherosa Ziehau if (*t == '\0')
34287f72003SSepherosa Ziehau continue;
34387f72003SSepherosa Ziehau
34487f72003SSepherosa Ziehau has_type = 1;
34587f72003SSepherosa Ziehau for (i = 0; i < SENSOR_MAX_TYPES; ++i) {
34687f72003SSepherosa Ziehau if (strcmp(t, sensor_type_s[i]) == 0) {
34787f72003SSepherosa Ziehau sensors_enabled[i] = 1;
34887f72003SSepherosa Ziehau break;
34987f72003SSepherosa Ziehau }
35087f72003SSepherosa Ziehau }
35187f72003SSepherosa Ziehau }
35287f72003SSepherosa Ziehau
35387f72003SSepherosa Ziehau if (!has_type) {
35487f72003SSepherosa Ziehau for (i = 0; i < SENSOR_MAX_TYPES; ++i)
35587f72003SSepherosa Ziehau sensors_enabled[i] = 1;
35687f72003SSepherosa Ziehau }
357c761d8f6SSepherosa Ziehau } else if (prefix(cmd, "match")) {
358c761d8f6SSepherosa Ziehau const char *xname;
359c761d8f6SSepherosa Ziehau
360c761d8f6SSepherosa Ziehau sensordev_xname_cnt = 0;
361c761d8f6SSepherosa Ziehau while ((xname = strsep(&args, " ")) != NULL) {
362c761d8f6SSepherosa Ziehau struct sensordev_xname *x;
363c761d8f6SSepherosa Ziehau int xname_len, cp_len;
364c761d8f6SSepherosa Ziehau
365c761d8f6SSepherosa Ziehau xname_len = strlen(xname);
366c761d8f6SSepherosa Ziehau if (xname_len == 0)
367c761d8f6SSepherosa Ziehau continue;
368c761d8f6SSepherosa Ziehau
369c761d8f6SSepherosa Ziehau x = &sensordev_xname[sensordev_xname_cnt];
370c761d8f6SSepherosa Ziehau x->flags = 0;
371c761d8f6SSepherosa Ziehau
372c761d8f6SSepherosa Ziehau if (xname[xname_len - 1] == '*') {
373c761d8f6SSepherosa Ziehau --xname_len;
374c761d8f6SSepherosa Ziehau if (xname_len == 0)
375c761d8f6SSepherosa Ziehau continue;
376c761d8f6SSepherosa Ziehau x->flags |= XNAME_FLAG_WILDCARD;
377c761d8f6SSepherosa Ziehau }
378c761d8f6SSepherosa Ziehau cp_len = xname_len;
379c761d8f6SSepherosa Ziehau if (cp_len >= (int)sizeof(x->xname))
380c761d8f6SSepherosa Ziehau cp_len = sizeof(x->xname) - 1;
381c761d8f6SSepherosa Ziehau
382c761d8f6SSepherosa Ziehau memcpy(x->xname, xname, cp_len);
383c761d8f6SSepherosa Ziehau x->xname[cp_len] = '\0';
384c761d8f6SSepherosa Ziehau x->xname_len = strlen(x->xname);
385c761d8f6SSepherosa Ziehau
386c761d8f6SSepherosa Ziehau sensordev_xname_cnt++;
387c761d8f6SSepherosa Ziehau if (sensordev_xname_cnt == XNAME_MAX)
388c761d8f6SSepherosa Ziehau break;
389c761d8f6SSepherosa Ziehau }
39087f72003SSepherosa Ziehau }
39187f72003SSepherosa Ziehau
39287f72003SSepherosa Ziehau wclear(wnd);
39387f72003SSepherosa Ziehau labelsensors();
39487f72003SSepherosa Ziehau refresh();
39587f72003SSepherosa Ziehau return (1);
39687f72003SSepherosa Ziehau }
397