static void get_device_sensors(int do_task, const char *device, const char *name, double *aggr, int *cnt) { char sensorname[MAX_STRING_LEN]; if (DO_ONE == do_task) { zbx_snprintf(sensorname, sizeof(sensorname), "%s/%s/%s", DEVICE_DIR, device, name); count_sensor(do_task, sensorname, aggr, cnt); } else { DIR *devicedir = NULL, *sensordir = NULL; struct dirent *deviceent, *sensorent; char devicename[MAX_STRING_LEN]; if (NULL == (devicedir = opendir(DEVICE_DIR))) return; while (NULL != (deviceent = readdir(devicedir))) { if (0 == strcmp(deviceent->d_name, ".") || 0 == strcmp(deviceent->d_name, "..")) continue; if (NULL == zbx_regexp_match(deviceent->d_name, device, NULL)) continue; zbx_snprintf(devicename, sizeof(devicename), "%s/%s", DEVICE_DIR, deviceent->d_name); if (NULL == (sensordir = opendir(devicename))) continue; while (NULL != (sensorent = readdir(sensordir))) { if (0 == strcmp(sensorent->d_name, ".") || 0 == strcmp(sensorent->d_name, "..")) continue; if (NULL == zbx_regexp_match(sensorent->d_name, name, NULL)) continue; zbx_snprintf(sensorname, sizeof(sensorname), "%s/%s", devicename, sensorent->d_name); count_sensor(do_task, sensorname, aggr, cnt); } closedir(sensordir); } closedir(devicedir); } }
static void get_device_sensors(int do_task, const char *device, const char *name, double *aggr, int *cnt) { char sensorname[MAX_STRING_LEN]; #if defined(KERNEL_2_4) if (DO_ONE == do_task) { zbx_snprintf(sensorname, sizeof(sensorname), "%s/%s/%s", DEVICE_DIR, device, name); count_sensor(do_task, sensorname, aggr, cnt); } else { DIR *devicedir = NULL, *sensordir = NULL; struct dirent *deviceent, *sensorent; char devicename[MAX_STRING_LEN]; if (NULL == (devicedir = opendir(DEVICE_DIR))) return; while (NULL != (deviceent = readdir(devicedir))) { if (0 == strcmp(deviceent->d_name, ".") || 0 == strcmp(deviceent->d_name, "..")) continue; if (NULL == zbx_regexp_match(deviceent->d_name, device, NULL)) continue; zbx_snprintf(devicename, sizeof(devicename), "%s/%s", DEVICE_DIR, deviceent->d_name); if (NULL == (sensordir = opendir(devicename))) continue; while (NULL != (sensorent = readdir(sensordir))) { if (0 == strcmp(sensorent->d_name, ".") || 0 == strcmp(sensorent->d_name, "..")) continue; if (NULL == zbx_regexp_match(sensorent->d_name, name, NULL)) continue; zbx_snprintf(sensorname, sizeof(sensorname), "%s/%s", devicename, sensorent->d_name); count_sensor(do_task, sensorname, aggr, cnt); } closedir(sensordir); } closedir(devicedir); } #else DIR *sensordir = NULL, *devicedir = NULL; struct dirent *sensorent, *deviceent; char hwmon_dir[MAX_STRING_LEN], devicepath[MAX_STRING_LEN], deviced[MAX_STRING_LEN], device_info[MAX_STRING_LEN], regex[MAX_STRING_LEN], *device_p; int err, dev_len; zbx_snprintf(hwmon_dir, sizeof(hwmon_dir), "%s", DEVICE_DIR); if (NULL == (devicedir = opendir(hwmon_dir))) return; while (NULL != (deviceent = readdir(devicedir))) { if (0 == strcmp(deviceent->d_name, ".") || 0 == strcmp(deviceent->d_name, "..")) continue; zbx_snprintf(devicepath, sizeof(devicepath), "%s/%s/device", DEVICE_DIR, deviceent->d_name); dev_len = readlink(devicepath, deviced, MAX_STRING_LEN - 1); if (0 > dev_len) { /* No device link? Treat device as virtual */ zbx_snprintf(devicepath, sizeof(devicepath), "%s/%s", DEVICE_DIR, deviceent->d_name); err = get_device_info(devicepath, NULL, device_info); } else { deviced[dev_len] = '\0'; device_p = strrchr(deviced, '/') + 1; if (0 == strcmp(device, device_p)) { zbx_snprintf(device_info, sizeof(device_info), "%s", device); err = SUCCEED; } else { err = get_device_info(devicepath, device_p, device_info); } } if (SUCCEED == err && 0 == strcmp(device_info, device)) { if (DO_ONE == do_task) { zbx_snprintf(sensorname, sizeof(sensorname), "%s/%s_input", devicepath, name); count_sensor(do_task, sensorname, aggr, cnt); } else { zbx_snprintf(regex, sizeof(regex), "%s[0-9]*_input", name); if (NULL == (sensordir = opendir(devicepath))) return; while (NULL != (sensorent = readdir(sensordir))) { if (0 == strcmp(sensorent->d_name, ".") || 0 == strcmp(sensorent->d_name, "..")) continue; if (NULL == zbx_regexp_match(sensorent->d_name, regex, NULL)) continue; zbx_snprintf(sensorname, sizeof(sensorname), "%s/%s", devicepath, sensorent->d_name); count_sensor(do_task, sensorname, aggr, cnt); } closedir(sensordir); } } } closedir(devicedir); #endif }