📄 linux.c
字号:
fclose(f); } return result; } if (interface == HDDTEMP_INTERFACE) { gkrellm_sys_sensors_hddtemp_check(); return gkrellm_sys_sensors_hddtemp_get_value(sensor_path, temp); } if (interface == MBMON_INTERFACE) { gkrellm_sys_sensors_mbmon_check(FALSE); return gkrellm_sys_sensors_mbmon_get_value(sensor_path, temp); } if (interface == NVIDIA_SETTINGS_INTERFACE) {#if GLIB_CHECK_VERSION(2,0,0) char *args[] = { "nvidia-settings", "-q", sensor_path, NULL }; char *output = NULL; result = g_spawn_sync(NULL, args, NULL, G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL, NULL, NULL, &output, NULL, NULL, NULL); if(result && output) { gfloat dummy; if(!temp) temp = &dummy; result = (sscanf(output, " Attribute %*s %*s %f", temp) == 1); } g_free(output); return result;#else return FALSE;#endif } if (interface == UNINORTH_INTERFACE) { if ((f = fopen(sensor_path, "r"))) { fscanf(f, "%f", temp); fclose(f); return TRUE; } } if ((f = fopen(sensor_path, "r")) == NULL) return FALSE; fgets(buf, sizeof(buf), f); fclose(f); if (!have_sysfs_sensors && need_locale_fix) locale_fix(buf); n = sscanf(buf, "%f %f %f %f %f", &t[0], &t[1], &t[2], &t[3], &t[4]); if (n < 1) return FALSE; T = t[n - 1]; if (have_sysfs_sensors) T /= 1000.0; else if (T > 254.0) /* Bogus read from BIOS if CHAR_MAX */ return FALSE; if (temp) *temp = T; return TRUE; }gbooleangkrellm_sys_sensors_get_fan(gchar *sensor_path, gint id, gint iodev, gint interface, gfloat *fan) { FILE *f; gchar buf[64]; gint n; gfloat t[4], T; gboolean result = FALSE; if (interface == IBM_ACPI_INTERFACE) { f = fopen(sensor_path, "r"); if (f) { fgets(buf, sizeof(buf), f); fgets(buf, sizeof(buf), f); sscanf(buf, "speed: %f", &T); fclose(f); *fan = T; result = TRUE; } return result; } if (interface == MBMON_INTERFACE) { gkrellm_sys_sensors_mbmon_check(FALSE); return gkrellm_sys_sensors_mbmon_get_value(sensor_path, fan); } if ((f = fopen(sensor_path, "r")) == NULL) return FALSE; fgets(buf, sizeof(buf), f); fclose(f); if (!have_sysfs_sensors && need_locale_fix) locale_fix(buf); n = sscanf(buf, "%f %f %f %f", &t[0], &t[1], &t[2], &t[3]); if (n < 1) return FALSE; if (fan) *fan = t[n - 1]; return TRUE; }gbooleangkrellm_sys_sensors_get_voltage(gchar *sensor_path, gint id, gint iodev, gint interface, gfloat *volt) { FILE *f; gchar buf[64]; gfloat V, t[3]; gint n; if (interface == MBMON_INTERFACE) { gkrellm_sys_sensors_mbmon_check(FALSE); return gkrellm_sys_sensors_mbmon_get_value(sensor_path, volt); } if ((f = fopen(sensor_path, "r")) == NULL) return FALSE; fgets(buf, sizeof(buf), f); fclose(f); if (!have_sysfs_sensors && need_locale_fix) locale_fix(buf); n = sscanf(buf, "%f %f %f", &t[0], &t[1], &t[2]); if (n < 1) return FALSE; V = t[n - 1]; if (have_sysfs_sensors) V /= 1000.0; else if (V > 254.0) /* Bogus read from BIOS if CHAR_MAX */ return FALSE; if (volt) *volt = V; return TRUE; }static voidget_volt_default(gchar *chip_name, VoltDefault **vdf, gint *vdfsize) { if (!strncmp(chip_name, "it87", 4)) { *vdf = &voltdefault8[0]; *vdfsize = sizeof (voltdefault8) / sizeof (VoltDefault); } else if ( !strncmp(chip_name, "adm1025", 7) || !strncmp(chip_name, "adm9240", 7) || !strncmp(chip_name, "lm87", 4) || !strncmp(chip_name, "lm81", 4) || !strncmp(chip_name, "ds1780", 6) ) { *vdf = &voltdefault7[0]; *vdfsize = sizeof (voltdefault7) / sizeof (VoltDefault); } else if (!strncmp(chip_name, "mtp008", 6)) { *vdf = &voltdefault6[0]; *vdfsize = sizeof (voltdefault6) / sizeof (VoltDefault); } else if (!strncmp(chip_name, "via686", 6)) { *vdf = &voltdefault5[0]; *vdfsize = sizeof (voltdefault5) / sizeof (VoltDefault); } else if (!strncmp(chip_name, "gl520", 5)) { *vdf = &voltdefault4[0]; *vdfsize = sizeof (voltdefault4) / sizeof (VoltDefault); } else if (!strncmp(chip_name, "gl518", 5)) { *vdf = &voltdefault3[0]; *vdfsize = sizeof (voltdefault3) / sizeof (VoltDefault); } else if (!strncmp(chip_name, "lm80", 4)) { *vdf = &voltdefault2[0]; *vdfsize = sizeof (voltdefault2) / sizeof (VoltDefault); } else if (!strncmp(chip_name, "w83", 3) && strncmp(chip_name, "w83781", 6)) { *vdf = &voltdefault1[0]; *vdfsize = sizeof (voltdefault1) / sizeof (VoltDefault); } else if (!strncmp(chip_name, "fscpos", 6)) { *vdf = &voltdefault9[0]; *vdfsize = sizeof (voltdefault9) / sizeof (VoltDefault); } else { *vdf = &voltdefault0[0]; *vdfsize = sizeof (voltdefault0) / sizeof (VoltDefault); } }static gchar *sysfs_get_chip_name(gchar *dir) { gchar *name, buf[256], *p, *chip; FILE *f; name = g_strdup_printf("%s/%s", dir, "name"); f = fopen(name, "r"); g_free(name); if (!f) return NULL; buf[0] = '\0'; fscanf(f, "%255[^\n]", buf); fclose(f); if (buf[0] == '\0') return NULL; if ((p = strchr(buf, ' ')) != NULL) /* Remove when 2.6.0 is out */ { /* "w83627hf chip" -> "w83627hf" */ *p++ = '\0'; if (strcmp(p, "chip") && strcmp(p, "subclient")) return NULL; } chip = g_strdup(buf); for (p = chip; *p; p++) *p = tolower(*p); return chip; }static voidsysfs_sensors_init(void) { GDir *dir, *chip_dir; VoltDefault *voltdefault; gint id = 0; gint type, voltdefaultsize; gfloat factor, offset; gchar *name, *bus_name, *default_label, *vref, *id_name, *chip_name, *s, *d, *sensor_path; gchar path[256], buf[256]; if (!have_sysfs) return; if ((dir = g_dir_open(SYSFS_I2C_DIR, 0, NULL)) == NULL) return; while ((bus_name = (gchar *) g_dir_read_name(dir)) != NULL) { snprintf(path, sizeof(path), "%s/%s", SYSFS_I2C_DIR, bus_name); if ((chip_dir = g_dir_open(path, 0, NULL)) == NULL) continue; if ((chip_name = sysfs_get_chip_name(path)) == NULL) { g_dir_close(chip_dir); continue; } have_sysfs_sensors = TRUE; if (_GK.debug_level & DEBUG_SENSORS) printf("sysfs sensors dir: %s\n", path); get_volt_default(chip_name, &voltdefault, &voltdefaultsize); while ((name = (gchar *) g_dir_read_name(chip_dir)) != NULL) { snprintf(buf, sizeof(buf), "%s", name); if ((s = strstr(buf, "_input")) == NULL || s - buf > 6) continue; d = s + 6; /* Can have xxxN_input, xxx_inputN, or xxx_input */ while (isdigit(*d)) *s++ = *d++; *s = '\0'; while (isdigit(*(s-1))) --s; id = atoi(s); if (!strncmp(buf, "temp", 4)) type = SENSOR_TEMPERATURE; else if (!strncmp(buf, "fan", 3)) type = SENSOR_FAN; else if (!strncmp(buf, "in", 2)) type = SENSOR_VOLTAGE; else continue; factor = 1.0; offset = 0; default_label = vref = NULL; if (type == SENSOR_VOLTAGE) { if (id < voltdefaultsize) { default_label = voltdefault[id].name; factor = voltdefault[id].factor; offset = voltdefault[id].offset; vref = voltdefault[id].vref; } else default_label = buf; } id_name = g_strdup_printf("%s-%s/%s", chip_name, bus_name, buf); sensor_path = g_strdup_printf("%s/%s", path, name); gkrellm_sensors_add_sensor(type, sensor_path, id_name, id, 0, 0, factor, offset, vref, default_label); if (_GK.debug_level & DEBUG_SENSORS) printf("%s %s %d %d\n", sensor_path, id_name, id, type); g_free(id_name); g_free(sensor_path); } g_free(chip_name); g_dir_close(chip_dir); } g_dir_close(dir); } /* Eventually, move this function from sensors.c to here where | it belongs. */extern void gkrellm_sensors_linux_name_fix(gchar *chip_name); /* lm_sensors can have "-isa-" or "-i2c-" embedded in /proc chip names so | they are of form w83627hf-isa-0290. Sensors from sysfs are derived from | a bus directory "0-0290" and "name" file with content like "w83627hf" | which leads to chip names like "w83627hf-0-0290" without the i2c or | isa. To have a chance at config compatibility between the two, | remove the "i2c" and replace the "isa" with "0" in lm_sensors name | when generating the id_name. I don't want to do any munging on the | sysfs names because I can't guess if the lm_sensors names had "i2c" or | "isa", and besides, probably sysfs will eventually be more common | so I'll just make its names the standard now (gkrellm 2.1.20). */gbooleangkrellm_sys_sensors_init(void) { FILE *f; GDir *dir, *chip_dir; VoltDefault *voltdefault; gint id = 0; gint type, voltdefaultsize; gfloat factor, offset; gchar *name, *chip_name, *fixed_chip_name, *path, *default_label; gchar *vref, *sensor_path, *sensor_name, id_name[128]; struct lconv *lc; lc = localeconv(); locale_decimal_point = *lc->decimal_point; if (locale_decimal_point != '.') need_locale_fix = TRUE; if ((dir = g_dir_open(THERMAL_ZONE_DIR, 0, NULL)) != NULL) { while ((name = (gchar *) g_dir_read_name(dir)) != NULL) { path = g_build_filename(THERMAL_ZONE_DIR, name, "temperature", NULL); if (g_file_test(path, G_FILE_TEST_IS_REGULAR)) { snprintf(id_name, sizeof(id_name), "thermal_zone/%s", name); gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, path, id_name, id, 0, THERMAL_ZONE_INTERFACE, 1.0, 0.0, NULL, name); } g_free(path); } g_dir_close(dir); } if ((dir = g_dir_open(THERMAL_DIR, 0, NULL)) != NULL) { while ((name = (gchar *) g_dir_read_name(dir)) != NULL) { path = g_build_filename(THERMAL_DIR, name, "status", NULL); if (g_file_test(path, G_FILE_TEST_IS_REGULAR)) { snprintf(id_name, sizeof(id_name), "thermal/%s", name); gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, path, id_name, id, 0, THERMAL_INTERFACE, 1.0, 0.0, NULL, name); } g_free(path); } g_dir_close(dir); } /* Do intial daemon reads to get sensors loaded into sensors.c */ gkrellm_sys_sensors_hddtemp_check(); gkrellm_sys_sensors_mbmon_check(TRUE); /* * IBM ACPI Temperature Sensors */ if ((f = fopen(IBM_ACPI_THERMAL, "r")) != NULL) { gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, IBM_ACPI_THERMAL, "IBM ACPI CPU", id, IBM_ACPI_CPU_TEMP, IBM_ACPI_INTERFACE, 1.0, 0.0, NULL, "CPU"); gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, IBM_ACPI_THERMAL, "IBM ACPI Mini PCI Module", id, IBM_ACPI_PCI_TEMP, IBM_ACPI_INTERFACE, 1.0, 0.0, NULL, "PCI"); gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, IBM_ACPI_THERMAL, "IBM ACPI HDD", id, IBM_ACPI_HDD_TEMP, IBM_ACPI_INTERFACE, 1.0, 0.0, NULL, "HDD"); gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, IBM_ACPI_THERMAL, "IBM ACPI GPU", id, IBM_ACPI_GPU_TEMP, IBM_ACPI_INTERFACE, 1.0, 0.0, NULL, "GPU"); gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, IBM_ACPI_THERMAL, "IBM ACPI Battery 1", id, IBM_ACPI_BAT1_TEMP, IBM_ACPI_INTERFACE, 1.0, 0.0, NULL, "BAT1"); gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, IBM_ACPI_THERMAL, "IBM ACPI Battery 2", id, IBM_ACPI_BAT2_TEMP, IBM_ACPI_INTERFACE, 1.0, 0.0, NULL, "BAT2"); fclose(f); } /* * IBM ACPI Cooling Fan Sensor */ if ((f = fopen(IBM_ACPI_FAN_FILE, "r")) != NULL) { gkrellm_sensors_add_sensor(SENSOR_FAN, IBM_ACPI_FAN_FILE, "IBM ACPI Fan Sensor", id, IBM_ACPI_FAN, IBM_ACPI_INTERFACE, 1.0, 0.0, NULL, "Fan"); fclose(f); } if (gkrellm_sys_sensors_get_temperature("GPUCoreTemp", id, 0, NVIDIA_SETTINGS_INTERFACE, NULL)) { gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, "GPUCoreTemp", "nVidia GPU Core", id, 0, NVIDIA_SETTINGS_INTERFACE, 1.0, 0.0, NULL, "GPU C"); } if (gkrellm_sys_sensors_get_temperature("GPUAmbientTemp", id, 0, NVIDIA_SETTINGS_INTERFACE, NULL)) { gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, "GPUAmbientTemp", "nVidia GPU Ambient", id, 0, NVIDIA_SETTINGS_INTERFACE, 1.0, 0.0, NULL, "GPU A"); } if ((dir = g_dir_open(UNINORTH_DIR, 0, NULL)) != NULL) { while (( sensor_name = (gchar *) g_dir_read_name(dir)) != NULL ) { if (strncmp(sensor_name, "sensor", 6) == 0) { sensor_path = g_build_filename(UNINORTH_DIR, sensor_name, NULL); if (strncmp(sensor_name + 8, "temperature", 11) == 0) { // linux <= 2.6.12 had [cg]pu_temperature instead of // sensor[12]_temperature // TODO: read sensorN_location instead of fixed positions if (sensor_name[6] == '1' || (strncmp(sensor_name, "cpu", 3)) == 0) gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, sensor_path, "cpu topside", id, 0, UNINORTH_INTERFACE, 1.0, 0.0, NULL, "CPU"); else if (sensor_name[6] == '2' || (strncmp(sensor_name, "gpu", 3)) == 0) gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, sensor_path, "gpu on die", id, 0, UNINORTH_INTERFACE, 1.0, 0.0, NULL, "GPU"); } g_free(sensor_path); } } g_dir_close(dir); } if ((dir = g_dir_open(SENSORS_DIR, 0, NULL)) == NULL) { sysfs_sensors_init(); return TRUE; } while ((chip_name = (gchar *) g_dir_read_name(dir)) != NULL) { fixed_chip_name = g_strdup(chip_name); gkrellm_sensors_linux_name_fix(fixed_chip_name); path = g_build_filename(SENSORS_DIR, chip_name, NULL); chip_dir = g_dir_open(path, 0, NULL); if (!chip_dir) { g_free(p
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -