⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lmsensors.c

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 C
📖 第 1 页 / 共 3 页
字号:
    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 + -