📄 lmsensors.c
字号:
time_t t = time(NULL); FILE *fp = fopen(filename, "r"); int i = 0; DEBUGMSG(("ucd-snmp/lmSensors", "=> sensor_init\n")); for (i = 0; i < N_TYPES; i++) { sensor_array[i].n = 0; sensor_array[i].current_len = 0; sensor_array[i].sensor = NULL; } if (!fp) { res = 1; goto leaving; } if (sensors_init(fp)) { res = 2; goto leaving; } _sensor_load(t); /* I'll let the linux people decide whether they want to load right away */#endif /* not solaris2 */leaving: DEBUGMSG(("ucd-snmp/lmSensors", "<= sensor_init\n")); return res;}static intsensor_load(void){ int rc = 0; time_t t = time(NULL); if (t > timestamp + 7) /* this may require some tuning - currently 7 seconds*/ {#ifndef solaris2 free_sensor_arrays();#endif rc = _sensor_load(t); } return rc;}/* This next code block includes all kstat and picld code for the Solaris platform. * If you're not compiling on a Solaris that supports picld, it won't be included. */#ifdef solaris2/* ******* picld sensor procedures * */#ifdef HAVE_PICL_H/* the following are generic modules for reading sensor information the scale variable handles miniVolts */static intread_num_sensor(picl_nodehdl_t childh, char *prop ,int scale, int *value) { picl_nodehdl_t sensorh; picl_propinfo_t sensor_info; picl_errno_t error_code; int valid = 1; union valu { char buf[PICL_PROPSIZE_MAX]; uint32_t us4; uint16_t us2; int32_t is4; int16_t is2; float f; } val; error_code = (picl_get_propinfo_by_name(childh, prop, &sensor_info, &sensorh)); if (error_code != PICL_SUCCESS) { DEBUGMSGTL(("ucd-snmp/lmSensors", "sensor info lookup failed in read_num_sensor - error code->%d\n", error_code)); return(error_code); } error_code = picl_get_propval(sensorh, &val.buf, sensor_info.size); if (error_code != PICL_SUCCESS) { DEBUGMSGTL(("ucd-snmp/lmSensors", "sensor value lookup failed in read_num_sensor - error code->%d\n", error_code)); return(error_code); } /* Can't make assumptions about the type or size of the value we get... */ if (sensor_info.type == PICL_PTYPE_FLOAT) { *value = (int)(val.f*scale); } else if (sensor_info.type == PICL_PTYPE_UNSIGNED_INT) { if (sensor_info.size == 2) { *value = (int)(val.us2 * scale); } else if (sensor_info.size == 4) { *value = (int)(val.us4 * scale); } else valid = 0; } else if (sensor_info.type == PICL_PTYPE_INT) { if (sensor_info.size == 2) { *value = (int)(val.is2 * scale); } else if (sensor_info.size == 4) { *value = (int)(val.is4 * scale); } else valid = 0; } else valid = 0; if (valid == 0) { DEBUGMSGTL(("ucd-snmp/lmSensors", "Don't know how to handle data type %d with length %d\n", sensor_info.type, sensor_info.size)); error_code = PICL_FAILURE; } else DEBUGMSGTL(("ucd-snmp/lmSensors", "read_num_sensor value is %d\n", *value)); return(error_code);} /* end of read_num_sensor() */static intread_enum_sensor(picl_nodehdl_t childh, char **options, u_int *value){ picl_nodehdl_t sensorh; picl_propinfo_t sensor_info; picl_errno_t error_code; char state[PICL_PROPSIZE_MAX]; int i; error_code = (picl_get_propinfo_by_name(childh, "State", &sensor_info, &sensorh)); if (error_code != PICL_SUCCESS) { DEBUGMSGTL(("ucd-snmp/lmSensors", "sensor info lookup failed in read_enum_sensor - error code->%d\n", error_code)); return(error_code); } error_code = picl_get_propval(sensorh, state, sensor_info.size); if (error_code != PICL_SUCCESS) { DEBUGMSGTL(("ucd-snmp/lmSensors", "sensor value lookup failed in read_enum_sensor - error code->%d\n", error_code)); return(error_code); } /* Start with error value, then try to fill in something better. Use case-insensitive match to find the right value since platforms may return either case. */ *value = 99; for (i = 0; options[i] != NULL; i++){ if (strncasecmp(state, options[i], strlen(options[i])) == 0){ *value = i; break; } } DEBUGMSGTL(("ucd-snmp/lmSensors", "read_enum_sensor value is %d\n", *value)); return(error_code);} /* end of read_enum_sensor() *//* scale variable handles miniVolts*/ static intprocess_num_sensor(picl_nodehdl_t childh, char propname[PICL_PROPNAMELEN_MAX], char propval[PICL_PROPNAMELEN_MAX], int typ, int scale){ int value = 0; picl_errno_t error_code; if (sensor_array[typ].n >= MAX_SENSORS){ DEBUGMSGTL(("ucd-snmp/lmSensors", "There are too many sensors of type %d\n",typ)); } else{ error_code = read_num_sensor(childh, propval, scale, &value); if (error_code == PICL_SUCCESS) { sensor_array[typ].sensor[sensor_array[typ].n].value = value; snprintf(sensor_array[typ].sensor[sensor_array[typ].n].name, (PICL_PROPNAMELEN_MAX - 1),"%s",propname); sensor_array[typ].sensor[sensor_array[typ].n]. name[PICL_PROPNAMELEN_MAX - 1] = '\0'; sensor_array[typ].n++; } else DEBUGMSGTL(("ucd-snmp/lmSensors", "read of %s in process_num_sensor returned error code %d\n", propname, error_code)); }} /* end process_num_sensor() */static intprocess_enum_sensor(picl_nodehdl_t childh, char propname[PICL_PROPNAMELEN_MAX], int typ, char **options){ int value = 0; picl_errno_t error_code; if (sensor_array[typ].n >= MAX_SENSORS){ DEBUGMSGTL(("ucd-snmp/lmSensors", "There are too many sensors of type %d\n",typ)); } else{ error_code = read_enum_sensor(childh, options, &value); if (error_code == PICL_SUCCESS) { sensor_array[typ].sensor[sensor_array[typ].n].value = value; snprintf(sensor_array[typ].sensor[sensor_array[typ].n].name, (PICL_PROPNAMELEN_MAX - 1),"%s",propname); sensor_array[typ].sensor[sensor_array[typ].n]. name[PICL_PROPNAMELEN_MAX - 1] = '\0'; sensor_array[typ].n++; } else DEBUGMSGTL(("ucd-snmp/lmSensors", "read of %s in process_enum_sensor returned error code %d\n", propname, error_code)); }} /* end process_enum_sensor() *//* The following are modules for dealing with individual sensors types. They call the generic modules above. */static intprocess_individual_fan(picl_nodehdl_t childh, char propname[PICL_PROPNAMELEN_MAX]){ process_num_sensor(childh, propname, "AtoDSensorValue", FAN_TYPE, 1);}static intprocess_newtype_fan(picl_nodehdl_t childh, char propname[PICL_PROPNAMELEN_MAX]){ process_num_sensor(childh, propname, "Speed", FAN_TYPE, 1);}static intprocess_temperature_sensor(picl_nodehdl_t childh, char propname[PICL_PROPNAMELEN_MAX]){ process_num_sensor(childh, propname, "Temperature", TEMP_TYPE, 1000);} /* MIB asks for mC */static intprocess_voltage_sensor(picl_nodehdl_t childh, char propname[PICL_PROPNAMELEN_MAX]){ process_num_sensor(childh, propname, "Voltage", VOLT_TYPE, 1000);} /* MIB asks for mV */static intprocess_digital_sensor(picl_nodehdl_t childh, char propname[PICL_PROPNAMELEN_MAX]){ process_num_sensor(childh, propname, "AtoDSensorValue", VOLT_TYPE, 1);}static intprocess_switch(picl_nodehdl_t childh, char propname[PICL_PROPNAMELEN_MAX]){ char *settings[]={"OFF","ON","NORMAL","LOCKED","UNKNOWN", "DIAG","SECURE",NULL}; process_enum_sensor(childh, propname, MISC_TYPE, settings);}static intprocess_led(picl_nodehdl_t childh, char propname[PICL_PROPNAMELEN_MAX]){ char *settings[]={"OFF","ON","BLINK",NULL}; process_enum_sensor(childh, propname, MISC_TYPE, settings);}static intprocess_i2c(picl_nodehdl_t childh, char propname[PICL_PROPNAMELEN_MAX]){ char *settings[]={"OK",NULL}; process_enum_sensor(childh, propname, MISC_TYPE, settings);}/* walks its way recusively through the tree of sensors */static intprocess_sensors(int level, picl_nodehdl_t nodeh){ picl_nodehdl_t childh; picl_nodehdl_t nexth; char propname[PICL_PROPNAMELEN_MAX]; char propclass[PICL_CLASSNAMELEN_MAX]; picl_errno_t error_code; level++; DEBUGMSGTL(("ucd-snmp/lmSensors","in process_sensors() level %d\n",level)); /* look up first child node */ error_code = picl_get_propval_by_name(nodeh, PICL_PROP_CHILD, &childh, sizeof (picl_nodehdl_t)); if (error_code != PICL_SUCCESS) { DEBUGMSGTL(("ucd-snmp/lmSensors", "picl_get_propval_by_name(%s) %d\n", PICL_PROP_CHILD, error_code)); return (error_code); } /* step through child nodes, get the name first */ while (error_code == PICL_SUCCESS) { error_code = picl_get_propval_by_name(childh, PICL_PROP_NAME, propname, (PICL_PROPNAMELEN_MAX - 1)); if (error_code != PICL_SUCCESS) { /*we found a node with no name. Impossible.! */ DEBUGMSGTL(("ucd-snmp/lmSensors", "picl_get_propval_by_name(%s) = %d\n", PICL_PROP_NAME, error_code)); return (error_code); } error_code = picl_get_propval_by_name(childh, PICL_PROP_CLASSNAME, propclass, sizeof (propclass)); if (error_code != PICL_SUCCESS) { /*we found a node with no class. Impossible.! */ DEBUGMSGTL(("ucd-snmp/lmSensors", "picl_get_propval_by_name(%s) = %d\n", PICL_PROP_CLASSNAME, error_code)); return (error_code); } DEBUGMSGTL(("ucd-snmp/lmSensors","found %s of class %s\n",propname,propclass)); if (strstr(propclass,"fan-tachometer")) process_individual_fan(childh,propname); else if (strstr(propclass,"fan")) process_newtype_fan(childh,propname); else if (strstr(propclass,"temperature-sensor")) process_temperature_sensor(childh,propname); else if (strstr(propclass,"voltage-sensor")) process_voltage_sensor(childh,propname); else if (strstr(propclass,"digital-sensor")) process_digital_sensor(childh,propname);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -