diff --git a/src/modules/cpufreq/e_mod_main.c b/src/modules/cpufreq/e_mod_main.c index b66b365d8..f594ba8f3 100644 --- a/src/modules/cpufreq/e_mod_main.c +++ b/src/modules/cpufreq/e_mod_main.c @@ -486,41 +486,74 @@ _menu_cb_post(void *data, E_Menu *m EINA_UNUSED) cpufreq_config->menu_powersave = NULL; } +static Eina_Bool _response = EINA_FALSE; + +static void +_cpufreq_error(const char *params) +{ + E_Dialog *dia; + + if (!((params) && (!strcmp(params, "err")))) return; + + if (!(dia = e_dialog_new(NULL, "E", "_e_mod_cpufreq_error_setfreq"))) + return; + e_dialog_title_set(dia, "Enlightenment Cpufreq Module"); + e_dialog_icon_set(dia, "enlightenment", 64); + e_dialog_text_set(dia, _("There was an error trying to modify CPU
" + "frequency control parameters.")); + e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL); + elm_win_center(dia->win, 1, 1); + e_dialog_show(dia); +} + +static void +_cb_cpufreq_governor(void *data EINA_UNUSED, const char *params) +{ + _cpufreq_error(params); +} + +static void +_cb_cpufreq_freq(void *data EINA_UNUSED, const char *params) +{ + _cpufreq_error(params); +} + +static void +_cb_cpufreq_pstate(void *data EINA_UNUSED, const char *params) +{ + _cpufreq_error(params); +} + +static void +_cpufreq_response_init(void) +{ + if (_response) return; + _response = EINA_TRUE; + e_system_handler_add("cpufreq-governor", _cb_cpufreq_governor, NULL); + e_system_handler_add("cpufreq-freq", _cb_cpufreq_freq, NULL); + e_system_handler_add("pstate", _cb_cpufreq_pstate, NULL); +} + +static void +_cpufreq_response_shutdown(void) +{ + if (!_response) return; + _response = EINA_FALSE; + e_system_handler_add("cpufreq-governor", _cb_cpufreq_governor, NULL); + e_system_handler_add("cpufreq-freq", _cb_cpufreq_freq, NULL); + e_system_handler_add("pstate", _cb_cpufreq_pstate, NULL); +} + void _cpufreq_set_governor(const char *governor) { - char buf[4096]; - int ret; - struct stat st; - - if (stat(cpufreq_config->set_exe_path, &st) < 0) return; - - snprintf(buf, sizeof(buf), - "%s %s %s", cpufreq_config->set_exe_path, "governor", governor); - ret = system(buf); - if (ret != 0) - { - E_Dialog *dia; - - if (!(dia = e_dialog_new(NULL, "E", "_e_mod_cpufreq_error_setfreq"))) - return; - e_dialog_title_set(dia, "Enlightenment Cpufreq Module"); - e_dialog_icon_set(dia, "enlightenment", 64); - e_dialog_text_set(dia, _("There was an error trying to set the" - "cpu frequency governor via the module's" - "setfreq utility.")); - e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL); - elm_win_center(dia->win, 1, 1); - e_dialog_show(dia); - } + _cpufreq_response_init(); + e_system_send("cpufreq-governor", "%s", governor); } static void _cpufreq_set_frequency(int frequency) { - char buf[4096]; - int ret; - #if defined(__FreeBSD__) || defined(__DragonFly__) frequency /= 1000; #endif @@ -546,25 +579,8 @@ _cpufreq_set_frequency(int frequency) /* OpenBSD doesn't have governors */ _cpufreq_set_governor("userspace"); #endif - - snprintf(buf, sizeof(buf), - "%s %s %i", cpufreq_config->set_exe_path, "frequency", frequency); - ret = system(buf); - if (ret != 0) - { - E_Dialog *dia; - - if (!(dia = e_dialog_new(NULL, "E", "_e_mod_cpufreq_error_setfreq"))) - return; - e_dialog_title_set(dia, "Enlightenment Cpufreq Module"); - e_dialog_icon_set(dia, "enlightenment", 64); - e_dialog_text_set(dia, _("There was an error trying to set the" - "cpu frequency setting via the module's" - "setfreq utility.")); - e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL); - elm_win_center(dia->win, 1, 1); - e_dialog_show(dia); - } + _cpufreq_response_init(); + e_system_send("cpufreq-freq", "%i", frequency); } void @@ -574,25 +590,8 @@ _cpufreq_set_pstate(int min, int max) (void) min; (void) max; #else - char buf[4096]; - snprintf(buf, sizeof(buf), - "%s %s %i %i %i", cpufreq_config->set_exe_path, "pstate", min, max, cpufreq_config->status->pstate_turbo); - int ret = system(buf); - if (ret != 0) - { - E_Dialog *dia; - - if (!(dia = e_dialog_new(NULL, "E", "_e_mod_cpufreq_error_setfreq"))) - return; - e_dialog_title_set(dia, "Enlightenment Cpufreq Module"); - e_dialog_icon_set(dia, "enlightenment", 64); - e_dialog_text_set(dia, _("There was an error trying to set the" - "cpu power state setting via the module's" - "setfreq utility.")); - e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL); - elm_win_center(dia->win, 1, 1); - e_dialog_show(dia); - } + _cpufreq_response_init(); + e_system_send("cpufreq-pstate", "%i %i %i", min, max, cpufreq_config->status->pstate_turbo); #endif } @@ -1410,7 +1409,6 @@ E_API E_Module_Api e_modapi = E_API void * e_modapi_init(E_Module *m) { - struct stat st; char buf[PATH_MAX]; Eina_List *l; @@ -1452,30 +1450,6 @@ e_modapi_init(E_Module *m) } E_CONFIG_LIMIT(cpufreq_config->poll_interval, 1, 1024); - snprintf(buf, sizeof(buf), "%s/%s/freqset", - e_module_dir_get(m), MODULE_ARCH); - cpufreq_config->set_exe_path = strdup(buf); - - if (stat(buf, &st) < 0) - { - e_util_dialog_show(_("Cpufreq Error"), - _("The freqset binary in the cpufreq module" - "directory cannot be found (stat failed)")); - } - else if ((st.st_uid != 0) || - ((st.st_mode & (S_ISUID)) != (S_ISUID)) || - ((st.st_mode & (S_IXOTH)) != (S_IXOTH))) - { - e_util_dialog_show(_("Cpufreq Permissions Error"), - _("The freqset binary in the cpufreq module" - "is not owned by root or does not have the" - "setuid bit set. Please ensure this is the" - "case. For example:" - "" - "sudo chown root %s" - "sudo chmod u+s,a+x %s"), - buf, buf); - } cpufreq_config->status = _cpufreq_status_new(); _cpufreq_status_check_available(cpufreq_config->status); @@ -1508,6 +1482,7 @@ e_modapi_init(E_Module *m) E_API int e_modapi_shutdown(E_Module *m EINA_UNUSED) { + _cpufreq_response_shutdown(); e_configure_registry_item_del("advanced/cpufreq"); e_configure_registry_category_del("advanced"); @@ -1551,11 +1526,10 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED) if (cpufreq_config->governor) eina_stringshare_del(cpufreq_config->governor); if (cpufreq_config->status) _cpufreq_status_free(cpufreq_config->status); - E_FREE(cpufreq_config->set_exe_path); - + if (cpufreq_config->config_dialog) e_object_del(E_OBJECT(cpufreq_config->config_dialog)); - + free(cpufreq_config); cpufreq_config = NULL; E_CONFIG_DD_FREE(conf_edd); diff --git a/src/modules/cpufreq/e_mod_main.h b/src/modules/cpufreq/e_mod_main.h index 453cf5e0f..209819445 100644 --- a/src/modules/cpufreq/e_mod_main.h +++ b/src/modules/cpufreq/e_mod_main.h @@ -48,7 +48,6 @@ struct _Config E_Menu *menu_pstate1; E_Menu *menu_pstate2; Cpu_Status *status; - char *set_exe_path; Ecore_Thread *frequency_check_thread; Ecore_Event_Handler *handler; E_Config_Dialog *config_dialog; diff --git a/src/modules/cpufreq/freqset.c b/src/modules/cpufreq/freqset.c deleted file mode 100644 index 5c848be51..000000000 --- a/src/modules/cpufreq/freqset.c +++ /dev/null @@ -1,207 +0,0 @@ -#include -#include -#include -#include -#include - -#ifdef __FreeBSD__ -# include -#endif - -#ifdef __OpenBSD__ -# include -# include -# include -#endif - -static int sys_cpu_setall(const char *control, const char *value); -static int sys_cpufreq_set(const char *control, const char *value); -static int sys_cpu_pstate(int min, int max, int turbo); - -int -main(int argc, char *argv[]) -{ - if (argc < 3) - { - fprintf(stderr, "Invalid command. Syntax:\n"); - fprintf(stderr, "\tfreqset \n"); - fprintf(stderr, "\tfreqset \n"); - return 1; - } - - if (seteuid(0)) - { - fprintf(stderr, "Unable to assume root privileges\n"); - return 1; - } - -#if defined __OpenBSD__ - if (!strcmp(argv[1], "frequency")) - { - int mib[] = {CTL_HW, HW_SETPERF}; - int new_perf = atoi(argv[2]); - size_t len = sizeof(new_perf); - - if (sysctl(mib, 2, NULL, 0, &new_perf, len) == -1) - { - return 1; - } - - return 0; - } - else - { - fprintf(stderr, "Unknown command (%s %s).\n", argv[1], argv[2]); - return 1; - } -#elif defined __FreeBSD__ - if (!strcmp(argv[1], "frequency")) - { - int newfreq = atoi(argv[2]); - if (sysctlbyname("dev.cpu.0.freq", NULL, NULL, &newfreq, sizeof(newfreq)) == -1) - { - fprintf(stderr, "Unable to open frequency interface for writing.\n"); - return 1; - } - - return 0; - } - else if (!strcmp(argv[1], "governor")) - { - fprintf(stderr, "Governors not (yet) implemented on FreeBSD.\n"); - return 0; - } - else if (!strcmp(argv[1], "pstate")) - { - fprintf(stderr, "Pstates not (yet) implemented on FreeBSD.\n"); - return 0; - } - else - { - fprintf(stderr, "Unknown command.\n"); - return 1; - } -#else - if (!strcmp(argv[1], "frequency")) - { - if (sys_cpu_setall("scaling_setspeed", argv[2]) == 0) - { - fprintf(stderr, "Unable to open frequency interface for writing.\n"); - return 1; - } - - return 0; - } - else if (!strcmp(argv[1], "governor")) - { - if (sys_cpu_setall("scaling_governor", argv[2]) == 0) - { - fprintf(stderr, "Unable to open governor interface for writing.\n"); - return 1; - } - if (!strcmp(argv[2], "ondemand")) - sys_cpufreq_set("ondemand/ignore_nice_load", "0"); - else if (!strcmp(argv[2], "conservative")) - sys_cpufreq_set("conservative/ignore_nice_load", "0"); - return 0; - } - else if (!strcmp(argv[1], "pstate")) - { - int min, max, turbo; - - if (argc < 5) - { - fprintf(stderr, "Invalid number of arguments.\n"); - return 1; - } - min = atoi(argv[2]); - max = atoi(argv[3]); - turbo = atoi(argv[4]); - if ((min < 0) || (min > 100) || - (max < 0) || (max > 100) || - (turbo < 0) || (turbo > 1)) - { - fprintf(stderr, "Invalid pstate values.\n"); - return 1; - } - sys_cpu_pstate(min, max, turbo); - return 0; - } - else - { - fprintf(stderr, "Unknown command.\n"); - return 1; - } -#endif - - return -1; -} - -static int -sys_cpu_setall(const char *control, const char *value) -{ - int num = 0; - char filename[4096]; - FILE *f; - - while (1) - { - snprintf(filename, sizeof(filename), "/sys/devices/system/cpu/cpu%i/cpufreq/%s", num, control); - f = fopen(filename, "w"); - - if (!f) - { - return num; - } - fprintf(f, "%s\n", value); - fclose(f); - num++; - } - return -1; -} - -static int -sys_cpufreq_set(const char *control, const char *value) -{ - char filename[4096]; - FILE *f; - - snprintf(filename, sizeof(filename), "/sys/devices/system/cpu/cpufreq/%s", control); - f = fopen(filename, "w"); - - if (!f) - { - if (sys_cpu_setall(control, value) > 0) - return 1; - else - return -1; - } - - fprintf(f, "%s\n", value); - fclose(f); - - return 1; -} - -static int -sys_cpu_pstate(int min, int max, int turbo) -{ - FILE *f; - - f = fopen("/sys/devices/system/cpu/intel_pstate/min_perf_pct", "w"); - if (!f) return 0; - fprintf(f, "%i\n", min); - fclose(f); - - f = fopen("/sys/devices/system/cpu/intel_pstate/max_perf_pct", "w"); - if (!f) return 0; - fprintf(f, "%i\n", max); - fclose(f); - - f = fopen("/sys/devices/system/cpu/intel_pstate/no_turbo", "w"); - if (!f) return 0; - fprintf(f, "%i\n", turbo ? 0 : 1); - fclose(f); - - return 1; -} diff --git a/src/modules/cpufreq/meson.build b/src/modules/cpufreq/meson.build index adf5bae23..b42668d41 100644 --- a/src/modules/cpufreq/meson.build +++ b/src/modules/cpufreq/meson.build @@ -3,15 +3,3 @@ src = files( 'e_mod_config.c', 'e_mod_main.h' ) - -if get_option(m) == true - executable('freqset', - 'freqset.c', - c_args : suid_cflags, - link_args : suid_ldflags, - install_dir: _dir_bin, - install : true - ) - suid_exes += join_paths(_dir_bin, 'freqset') -endif -