cpufreq - move to use the new e_system cpufreq support from own suid exe

This commit is contained in:
Carsten Haitzler 2020-01-14 15:31:00 +00:00
parent f277ab71e7
commit 7aaf8f4feb
4 changed files with 67 additions and 313 deletions

View File

@ -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<br>"
"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<ps/>"
"cpu frequency governor via the module's<ps/>"
"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<ps/>"
"cpu frequency setting via the module's<ps/>"
"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<ps/>"
"cpu power state setting via the module's<ps/>"
"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<ps/>"
"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<ps/>"
"is not owned by root or does not have the<ps/>"
"setuid bit set. Please ensure this is the<ps/>"
"case. For example:<ps/>"
"<ps/>"
"sudo chown root %s<ps/>"
"sudo chmod u+s,a+x %s<ps/>"),
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);

View File

@ -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;

View File

@ -1,207 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#ifdef __FreeBSD__
# include <sys/sysctl.h>
#endif
#ifdef __OpenBSD__
# include <sys/param.h>
# include <sys/resource.h>
# include <sys/sysctl.h>
#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 <frequency|governor> <freq-level|governor-name>\n");
fprintf(stderr, "\tfreqset <pstate> <min> <max> <turbo>\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;
}

View File

@ -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