Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1 | /* |
Arjan van der Ven | ee42d81 | 2007-05-18 18:33:19 +0000 | [diff] [blame] | 2 | * Copyright 2007, Intel Corporation |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 3 | * |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 4 | * This file is part of PowerTOP |
| 5 | * |
| 6 | * This program file is free software; you can redistribute it and/or modify it |
| 7 | * under the terms of the GNU General Public License as published by the |
| 8 | * Free Software Foundation; version 2 of the License. |
Arjan van der Ven | 0eb44da | 2007-05-13 03:39:32 +0000 | [diff] [blame] | 9 | * |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 10 | * This program is distributed in the hope that it will be useful, but WITHOUT |
| 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| 13 | * for more details. |
Arjan van der Ven | 0eb44da | 2007-05-13 03:39:32 +0000 | [diff] [blame] | 14 | * |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 15 | * You should have received a copy of the GNU General Public License |
Arjan van der Ven | 0eb44da | 2007-05-13 03:39:32 +0000 | [diff] [blame] | 16 | * along with this program in a file named COPYING; if not, write to the |
| 17 | * Free Software Foundation, Inc., |
| 18 | * 51 Franklin Street, Fifth Floor, |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 19 | * Boston, MA 02110-1301 USA |
| 20 | * |
| 21 | * Authors: |
| 22 | * Arjan van de Ven <arjan@linux.intel.com> |
| 23 | */ |
| 24 | |
| 25 | #include <unistd.h> |
| 26 | #include <stdio.h> |
| 27 | #include <stdlib.h> |
| 28 | #include <string.h> |
| 29 | #include <stdint.h> |
| 30 | #include <sys/types.h> |
| 31 | #include <dirent.h> |
| 32 | |
Arjan van der Ven | cc85752 | 2007-05-13 17:28:15 +0000 | [diff] [blame] | 33 | #include "powertop.h" |
| 34 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 35 | /* static arrays are not nice programming.. but they're easy */ |
| 36 | static char configlines[5000][100]; |
| 37 | static int configcount; |
| 38 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 39 | static void read_kernel_config(void) |
| 40 | { |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 41 | FILE *file; |
| 42 | char version[100], *c; |
| 43 | char filename[100]; |
| 44 | if (configcount) |
| 45 | return; |
| 46 | if (access("/proc/config.gz", R_OK) == 0) { |
Arjan van der Ven | 95521af | 2007-05-27 17:49:39 +0000 | [diff] [blame] | 47 | file = popen("zcat /proc/config.gz 2> /dev/null", "r"); |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 48 | while (file && !feof(file)) { |
| 49 | char line[100]; |
Arjan van der Ven | ef08f1c | 2007-05-16 18:28:57 +0000 | [diff] [blame] | 50 | if (fgets(line, 100, file) == NULL) |
| 51 | break; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 52 | strcpy(configlines[configcount++], line); |
| 53 | } |
| 54 | pclose(file); |
| 55 | return; |
| 56 | } |
| 57 | file = fopen("/proc/sys/kernel/osrelease", "r"); |
| 58 | if (!file) |
| 59 | return; |
Arjan van der Ven | ef08f1c | 2007-05-16 18:28:57 +0000 | [diff] [blame] | 60 | if (fgets(version, 100, file) == NULL) { |
| 61 | fclose(file); |
| 62 | return; |
| 63 | } |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 64 | fclose(file); |
| 65 | c = strchr(version, '\n'); |
| 66 | if (c) |
| 67 | *c = 0; |
| 68 | sprintf(filename, "/boot/config-%s", version); |
| 69 | file = fopen(filename, "r"); |
Arjan van der Ven | edad70e | 2007-05-11 20:36:43 +0000 | [diff] [blame] | 70 | if (!file) { |
| 71 | sprintf(filename, "/lib/modules/%s/build/.config", version); |
| 72 | file = fopen(filename, "r"); |
| 73 | } |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 74 | if (!file) |
| 75 | return; |
| 76 | while (!feof(file)) { |
| 77 | char line[100]; |
Arjan van der Ven | ef08f1c | 2007-05-16 18:28:57 +0000 | [diff] [blame] | 78 | if (fgets(line, 100, file) == NULL) |
| 79 | break; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 80 | strcpy(configlines[configcount++], line); |
| 81 | } |
| 82 | fclose(file); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 83 | } |
| 84 | |
| 85 | /* |
| 86 | * Suggest the user to turn on/off a kernel config option. |
| 87 | * "comment" gets displayed if it's not already set to the right value |
| 88 | */ |
Arjan van der Ven | 825ec69 | 2007-05-24 17:41:06 +0000 | [diff] [blame] | 89 | void suggest_kernel_config(char *string, int onoff, char *comment, int weight) |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 90 | { |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 91 | int i; |
Arjan van der Ven | 5582c6a | 2007-05-12 22:58:07 +0000 | [diff] [blame] | 92 | char searchon[100]; |
| 93 | char searchoff[100]; |
| 94 | int found = 0; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 95 | |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 96 | read_kernel_config(); |
Arjan van der Ven | 5582c6a | 2007-05-12 22:58:07 +0000 | [diff] [blame] | 97 | |
| 98 | sprintf(searchon, "%s=", string); |
| 99 | sprintf(searchoff, "# %s is not set", string); |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 100 | |
| 101 | for (i = 0; i < configcount; i++) { |
Arjan van der Ven | 5582c6a | 2007-05-12 22:58:07 +0000 | [diff] [blame] | 102 | if (onoff && strstr(configlines[i], searchon)) |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 103 | return; |
Arjan van der Ven | 5582c6a | 2007-05-12 22:58:07 +0000 | [diff] [blame] | 104 | if (onoff==0 && strstr(configlines[i], searchoff)) |
| 105 | return; |
| 106 | if (onoff==0 && strstr(configlines[i], searchon)) |
| 107 | found = 1; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 108 | } |
Arjan van der Ven | 5582c6a | 2007-05-12 22:58:07 +0000 | [diff] [blame] | 109 | if (onoff || found) |
Arjan van der Ven | b43056b | 2007-05-24 20:47:42 +0000 | [diff] [blame] | 110 | add_suggestion(comment, weight, 0, NULL, NULL); |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 111 | fflush(stdout); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 112 | } |