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

📄 lmsensors.c

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 C
📖 第 1 页 / 共 3 页
字号:
        else if (strstr(propclass,"switch"))            process_switch(childh,propname);        else if (strstr(propclass,"led"))            process_led(childh,propname);        else if (strstr(propclass,"i2c"))            process_i2c(childh,propname);/*        else if (strstr(propclass,"gpio"))            process_gpio(childh,propname); */        /* look for children of children (note, this is recursive) */       if (!(strstr(propclass,"picl") &&              (strstr(propname,"frutree") || strstr(propname,"obp")))) {           error_code = process_sensors(level,childh);           DEBUGMSGTL(("ucd-snmp/lmSensors",                      "process_sensors(%s) returned %d\n",                       propname, error_code));        }         /* get next child node at this level*/        error_code = picl_get_propval_by_name(childh, PICL_PROP_PEER,                                   &nexth, sizeof (picl_nodehdl_t));        if (error_code != PICL_SUCCESS) {/* no more children - buh bye*/           DEBUGMSGTL(("ucd-snmp/lmSensors","Process sensors is out of children!  Returning...\n"));           return (error_code);        }        childh = nexth;    } /* while */    return (error_code);} /* process sensors */#endif/* ******** end of picld sensor procedures * */#endif /* solaris2 */static int_sensor_load(time_t t){#ifdef solaris2    int i,j;    int typ;    int temp=0; /* do not reset this later, more than one typ has temperatures*/    int other=0;    const char *fantypes[]={"CPU","PWR","AFB"};    kstat_ctl_t *kc;    kstat_t *kp;    envctrl_fan_t *fan_info;    envctrl_ps_t *power_info;    envctrl_encl_t *enc_info;/* DEBUGMSG(("ucd-snmp/lmSensors", "Reading the sensors\n")); *//* initialize the array */    for (i = 0; i < N_TYPES; i++){        sensor_array[i].n = 0;        for (j=0; j < MAX_SENSORS; j++){            sensor_array[i].sensor[j].name[0] = '\0';            sensor_array[i].sensor[j].value = 0;             }        } /*end for i*//* try picld (if supported), if that doesn't work, try kstat */#ifdef HAVE_PICL_H /* some more declarations */    int er_code;    picl_errno_t     error_code;    int level=0;    picl_nodehdl_t  rooth;er_code = picl_initialize();if (er_code == PICL_SUCCESS) {    error_code = picl_get_root(&rooth);    if (error_code != PICL_SUCCESS) {        DEBUGMSG(("ucd-snmp/lmSensors", "picld couldn't get root error code->%d\n",error_code));        }    else{        DEBUGMSGTL(("ucd-snmp/lmSensors", "found root\n"));        error_code = process_sensors(level,rooth);        if (error_code != 255)             if (error_code != 7)                DEBUGMSG(("ucd-snmp/lmSensors", "picld had an internal problem error code->%d\n",error_code));        } /* end else */    picl_shutdown();}  /* end if err_code for picl_initialize */else {      DEBUGMSG(("ucd-snmp/lmSensors", "picld couldn't initialize picld because error code->%d\n",er_code));} /*end else picl_initialize */#endif  /* end of picld section *//* initialize kstat */kc = kstat_open();if (kc == 0) {    DEBUGMSG(("ucd-snmp/lmSensors", "couldn't open kstat"));    } /* endif kc */else{    temp = 0;    kp = kstat_lookup(kc, ENVCTRL_MODULE_NAME, 0, ENVCTRL_KSTAT_FANSTAT);    if (kp == 0) {        DEBUGMSGTL(("ucd-snmp/lmSensors", "couldn't lookup fan kstat\n"));        } /* endif lookup fans */    else{        if (kstat_read(kc, kp, 0) == -1) {            DEBUGMSGTL(("ucd-snmp/lmSensors", "couldn't read fan kstat"));            } /* endif kstatread fan */        else{            typ = 1;            fan_info = (envctrl_fan_t *) kp->ks_data;            sensor_array[typ].n = kp->ks_ndata;            for (i=0; i < kp->ks_ndata; i++){                DEBUGMSG(("ucd-snmp/lmSensors", "found instance %d fan type %d speed %d OK %d bustedfan %d\n",                    fan_info->instance, fan_info->type,fan_info->fanspeed,fan_info->fans_ok,fan_info->fanflt_num));                sensor_array[typ].sensor[i].value = fan_info->fanspeed;                snprintf(sensor_array[typ].sensor[i].name,(MAX_NAME - 1),                   "fan type %s number %d",fantypes[fan_info->type],fan_info->instance);                sensor_array[typ].sensor[i].name[MAX_NAME - 1] = '\0';                fan_info++;                } /* end for fan_info */            } /* end else kstatread fan */        } /* end else lookup fans*/    kp = kstat_lookup(kc, ENVCTRL_MODULE_NAME, 0, ENVCTRL_KSTAT_PSNAME);    if (kp == 0) {        DEBUGMSGTL(("ucd-snmp/lmSensors", "couldn't lookup power supply kstat\n"));        } /* endif lookup power supply */    else{        if (kstat_read(kc, kp, 0) == -1) {            DEBUGMSGTL(("ucd-snmp/lmSensors", "couldn't read power supply kstat\n"));            } /* endif kstatread fan */        else{            typ = 0; /* this is a power supply temperature, not a voltage*/            power_info = (envctrl_ps_t *) kp->ks_data;            sensor_array[typ].n = kp->ks_ndata;            for (i=0; i < kp->ks_ndata; i++){                DEBUGMSG(("ucd-snmp/lmSensors", "found instance %d psupply temp mC %d %dW OK %d share %d limit %d\n",                    power_info->instance, power_info->ps_tempr*1000,power_info->ps_rating,                    power_info->ps_ok,power_info->curr_share_ok,power_info->limit_ok));                sensor_array[typ].sensor[temp].value = power_info->ps_tempr*1000;                snprintf(sensor_array[typ].sensor[temp].name,(MAX_NAME-1),                         "power supply %d",power_info->instance);                sensor_array[typ].sensor[temp].name[MAX_NAME - 1] = '\0';                power_info++; /* increment the data structure */                temp++; /* increment the temperature sensor array element */                } /* end for power_info */            } /* end else kstatread power supply */        } /* end else lookup power supplies*/    kp = kstat_lookup(kc, ENVCTRL_MODULE_NAME, 0, ENVCTRL_KSTAT_ENCL);    if (kp == 0) {        DEBUGMSGTL(("ucd-snmp/lmSensors", "couldn't lookup enclosure kstat\n"));        } /* endif lookup enclosure */    else{        if (kstat_read(kc, kp, 0) == -1) {            DEBUGMSGTL(("ucd-snmp/lmSensors", "couldn't read enclosure kstat\n"));            } /* endif kstatread enclosure */        else{            enc_info = (envctrl_encl_t *) kp->ks_data;             other = 0;            for (i=0; i < kp->ks_ndata; i++){               switch (enc_info->type){               case ENVCTRL_ENCL_FSP:                   DEBUGMSG(("ucd-snmp/lmSensors", "front panel value %d\n",enc_info->value));                   typ = 3; /* misc */                   sensor_array[typ].sensor[other].value = enc_info->value;                   strncpy(sensor_array[typ].sensor[other].name,"FSP",MAX_NAME-1);                   sensor_array[typ].sensor[other].name[MAX_NAME-1]='\0'; /* null terminate */                   other++;                   break;               case ENVCTRL_ENCL_AMBTEMPR:                   DEBUGMSG(("ucd-snmp/lmSensors", "ambient temp mC %d\n",enc_info->value*1000));                   typ = 0; /* temperature sensor */                   sensor_array[typ].sensor[temp].value = enc_info->value*1000;                   strncpy(sensor_array[typ].sensor[temp].name,"Ambient",MAX_NAME-1);                   sensor_array[typ].sensor[temp].name[MAX_NAME-1]='\0'; /* null terminate */                   temp++;                   break;               case ENVCTRL_ENCL_BACKPLANE4:                   DEBUGMSG(("ucd-snmp/lmSensors", "There is a backplane4\n"));                   typ = 3; /* misc */                   sensor_array[typ].sensor[other].value = enc_info->value;                   strncpy(sensor_array[typ].sensor[other].name,"Backplane4",MAX_NAME-1);                   sensor_array[typ].sensor[other].name[MAX_NAME-1]='\0'; /* null terminate */                   other++;                   break;               case ENVCTRL_ENCL_BACKPLANE8:                   DEBUGMSG(("ucd-snmp/lmSensors", "There is a backplane8\n"));                   typ = 3; /* misc */                   sensor_array[typ].sensor[other].value = enc_info->value;                   strncpy(sensor_array[typ].sensor[other].name,"Backplane8",MAX_NAME-1);                   sensor_array[typ].sensor[other].name[MAX_NAME-1]='\0'; /* null terminate */                   other++;                   break;               case ENVCTRL_ENCL_CPUTEMPR:                   DEBUGMSG(("ucd-snmp/lmSensors", "CPU%d temperature mC %d\n",enc_info->instance,enc_info->value*1000));                   typ = 0; /* temperature sensor */                   sensor_array[typ].sensor[temp].value = enc_info->value*1000;                   snprintf(sensor_array[typ].sensor[temp].name,MAX_NAME,"CPU%d",enc_info->instance);                   sensor_array[typ].sensor[temp].name[MAX_NAME-1]='\0'; /* null terminate */                   temp++;                   break;               default:                   DEBUGMSG(("ucd-snmp/lmSensors", "unknown element instance &d type &d value %d\n",                       enc_info->instance, enc_info->type, enc_info->value));                   break;               } /* end switch */               enc_info++;               } /* end for enc_info */               sensor_array[3].n = other;               sensor_array[0].n = temp;            } /* end else kstatread enclosure */        } /* end else lookup enclosure*/    kstat_close(kc);} /* end else kstat */#else /* end solaris2 only ie. ifdef everything else */    const sensors_chip_name *chip;    const sensors_feature_data *data;    int             chip_nr = 0;    int             rc = 0;    unsigned int    i = 0;    for (i = 0; i < N_TYPES; i++)    {        sensor_array[i].n = 0;        sensor_array[i].current_len = 0;        /* Malloc the default number of sensors. */        sensor_array[i].sensor = (_sensor*)malloc(sizeof(_sensor) * DEFAULT_SENSORS);        if (sensor_array[i].sensor == NULL)        {           /* Continuing would be unsafe */           snmp_log(LOG_ERR, "Cannot malloc sensor array!");            return (rc = 1);        } /* end if */        sensor_array[i].current_len = DEFAULT_SENSORS;    } /* end for */    while ((chip = sensors_get_detected_chips(&chip_nr))) {	int             a = 0;	int             b = 0;        while ((data = sensors_get_all_features(*chip, &a, &b))) {            char           *label = NULL;            double          val;            if ((data->mode & SENSORS_MODE_R) &&                (data->mapping == SENSORS_NO_MAPPING) &&                !sensors_get_label(*chip, data->number, &label) &&                !sensors_get_feature(*chip, data->number, &val)) {                int             type = -1;                float           mul;                _sensor_array  *array;                /* The label, as determined for a given chip in sensors.conf,                 * is used to place each sensor in the appropriate bucket.                 * Volt, Fan, Temp, and Misc.  If the text being looked for below                 * is not in the label of a given sensor (e.g., the temp1 sensor                 * has been labeled 'CPU' and not 'CPU temp') it will end up being                 * lumped in the MISC bucket. */                if (strstr(label, "V")) {                    type = VOLT_TYPE;                    mul = 1000.0;                }                if (strstr(label, "fan") || strstr(label, "Fan")) {                    type = FAN_TYPE;                    mul = 1.0;                }                if (strstr(label, "temp") || strstr(label, "Temp")) {                    type = TEMP_TYPE;                    mul = 1000.0;                }                if (type == -1) {                    type = MISC_TYPE;                    mul = 1000.0;                }                array = &sensor_array[type];                if ( array->current_len <= array->n) {                    _sensor* old_buffer = array->sensor;                    size_t new_size = (sizeof(_sensor) * array->current_len) + (sizeof(_sensor) * DEFAULT_SENSORS);                    array->sensor = (_sensor*)realloc(array->sensor, new_size);                    if (array->sensor == NULL)                    {                       /* Continuing would be unsafe */                       snmp_log(LOG_ERR, "too many sensors to fit, and failed to alloc more, failing on %s\n", label);                       free(old_buffer);                       old_buffer = NULL;                       if (label) {                           free(label);                           label = NULL;                       } /* end if label */                       return (rc=1);                    } /* end if array->sensor */                    array->current_len = new_size / sizeof(_sensor);                    DEBUGMSG(("ucd-snmp/lmSensors", "type #%d increased to %d elements\n", type, array->current_len));                } /* end if array->current */                strncpy(array->sensor[array->n].name, label, MAX_NAME);                array->sensor[array->n].value = (int) (val * mul);                DEBUGMSGTL(("sensors","sensor %d, value %d\n",                            array->sensor[array->n].name,                            array->sensor[array->n].value));                array->n++;            } /* end if data-mode */	    if (label) {		free(label);		label = NULL;	    } /* end if label */        } /* end while data */    } /* end while chip */    return rc;#endif  /* end else ie. ifdef everything else */    /* Update the timestamp after a load. */    timestamp = t;}#ifndef solaris2/* Free all the sensor arrays. */static voidfree_sensor_arrays(){   unsigned int i = 0;   DEBUGMSG(("ucd-snmp/lmSensors", "=> free_sensor_arrays\n"));   for (i = 0; i < N_TYPES; i++){       if (sensor_array[i].sensor != NULL)       {           free(sensor_array[i].sensor);           sensor_array[i].sensor = NULL;       }       /* For good measure, reset the other values. */       sensor_array[i].n = 0;       sensor_array[i].current_len = 0;   }   DEBUGMSG(("ucd-snmp/lmSensors", "<= free_sensor_arrays\n"));}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -