diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index f7a7eab..154f798 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -70,12 +70,18 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror -Wmissing-declarations -Wformat -Werror=format-security \ -fstack-clash-protection -fcf-protection") -string(FIND "${CMAKE_CXX_FLAGS}" "-D_FORTIFY_SOURCE" FORTIFY_FOUND) + string(FIND "${CMAKE_CXX_FLAGS}" "-D_FORTIFY_SOURCE" FORTIFY_FOUND) + + if(FORTIFY_FOUND EQUAL -1) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wp,-D_FORTIFY_SOURCE=2") + endif() set(SOURCE_FILES ubl-settings-services.c ubl-settings-services.h + ubl-settings-services-systemd.c + ubl-settings-services-systemd.h ubl-strings.h ) @@ -88,7 +94,8 @@ set(LIBRARIES pthread ublsettings ublsettings-gtk3 - ublsettingsui-gtk3) + ublsettingsui-gtk3 + systemd) add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}) diff --git a/source/ubl-settings-services-systemd.c b/source/ubl-settings-services-systemd.c new file mode 100644 index 0000000..86e8b5e --- /dev/null +++ b/source/ubl-settings-services-systemd.c @@ -0,0 +1,123 @@ +#include "ubl-settings-services-systemd.h" + + +void at_exit_cleanup(); +sd_bus *global_bus=NULL; +void at_exit_cleanup(){ + if (global_bus) { + sd_bus_unref(global_bus); + } +} + +dictionary *yon_systemd_get_list() { + sd_bus *bus = NULL; + sd_bus_message *reply = NULL; + int r; + + r = sd_bus_open_system(&bus); + if (r < 0) return NULL; + + dictionary *dict = NULL; + + r = sd_bus_call_method(bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "ListUnits", + NULL, + &reply, + ""); + if (r < 0) {if (bus) sd_bus_unref(bus);return NULL;} + + sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "(ssssssouso)"); + while (sd_bus_message_enter_container(reply, SD_BUS_TYPE_STRUCT, "ssssssouso") > 0) { + const char *name, *description; + const char *load_state, *active_state, *sub_state; + const char *following, *unit_path; + unsigned int job_id; + const char *job_type, *job_path; + + sd_bus_message_read(reply, "ssssssouso", + &name, &description, + &load_state, &active_state, + &sub_state, &following, + &unit_path, &job_id, + &job_type, &job_path); + + systemd_struct *u = calloc(1, sizeof(systemd_struct)); + u->name = yon_char_new(name); + u->description = yon_char_new(description); + u->load = !strcmp(load_state,"loaded"); + u->active = !strcmp(active_state, "active"); + u->state = yon_char_new(sub_state); + u->enable = 0; + + yon_dictionary_add_or_create_if_exists_with_data(dict, (char*)name, u); + + sd_bus_message_exit_container(reply); + } + sd_bus_message_unref(reply); + reply = NULL; + + r = sd_bus_call_method(bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "ListUnitFiles", + NULL, + &reply, + ""); + if (r < 0) {if (bus) sd_bus_unref(bus); return NULL;} + + sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "(ss)"); + while (sd_bus_message_enter_container(reply, SD_BUS_TYPE_STRUCT, "ss") > 0) { + const char *name, *file_state; + sd_bus_message_read(reply, "ss", &name, &file_state); + + dictionary *found = NULL; + for (dictionary *it = dict; it; it = it->next) { + if (strcmp(it->key, name) == 0) { + found = it; + break; + } + } + if (!found) { + systemd_struct *u = calloc(1, sizeof(systemd_struct)); + u->name = yon_char_new(name); + u->description = yon_char_new(""); + u->load = 0; + u->active = 0; + u->state = yon_char_new(""); + u->enable = 0; + + yon_dictionary_add_or_create_if_exists_with_data(dict, (char*)name, u); + } + sd_bus_message_exit_container(reply); + } + sd_bus_message_unref(reply); + reply = NULL; + + dictionary *it; + for_dictionaries(it, dict) { + systemd_struct *u = (systemd_struct*)it->data; + r = sd_bus_call_method(bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "GetUnitFileState", + NULL, + &reply, + "s", u->name); + if (r >= 0) { + const char *status; + sd_bus_message_read(reply, "s", &status); + u->enable = (strcmp(status, "enabled") == 0); + } + sd_bus_message_unref(reply); + reply = NULL; + } + + if (reply) sd_bus_message_unref(reply); + if (bus) sd_bus_unref(bus); + return dict; +} \ No newline at end of file diff --git a/source/ubl-settings-services-systemd.h b/source/ubl-settings-services-systemd.h new file mode 100644 index 0000000..b2c7603 --- /dev/null +++ b/source/ubl-settings-services-systemd.h @@ -0,0 +1,8 @@ +#ifndef UBL_SETTINGS_SERVICES_SYSTEMD_H +#define UBL_SETTINGS_SERVICES_SYSTEMD_H + +#include "ubl-settings-services.h" +#include + +dictionary *yon_systemd_get_list(); +#endif \ No newline at end of file diff --git a/source/ubl-settings-services.c b/source/ubl-settings-services.c index da040f6..06810d7 100644 --- a/source/ubl-settings-services.c +++ b/source/ubl-settings-services.c @@ -1224,10 +1224,12 @@ gboolean yon_interface_update_finish(main_window *widgets){ } void* yon_interface_update(main_window *widgets){ + dictionary *dict = yon_systemd_get_list(); + if (dict){} if (widgets){ g_idle_add((GSourceFunc)yon_interface_list_models_disconnect,widgets); - int system_size; - config_str system_services = yon_config_load(load_services_command,&system_size); + // int system_size; + // config_str system_services = yon_config_load(load_services_command,&system_size); int user_size; config_str user_services = yon_config_load(load_user_services_command,&user_size); int config_size; @@ -1240,34 +1242,23 @@ void* yon_interface_update(main_window *widgets){ for (int i=0;idata)->name); struct system_services_data *data = malloc(sizeof(struct system_services_data)); { data->widgets=widgets; - data->SystemAutostart=loaded; - data->SystemLaunched=active; - data->Name=yon_char_new(parsed[0]); - data->Descr=yon_char_new(parsed[4]); + data->SystemAutostart=((systemd_struct*)dact->data)->enable; + data->SystemLaunched=((systemd_struct*)dact->data)->active; + data->Name=((systemd_struct*)dact->data)->name; + data->Descr=((systemd_struct*)dact->data)->description; data->Type = type; - data->Loaded=strcmp(parsed[1],"loaded")?0:1; - data->Active=strcmp(parsed[2],"active")?0:1; - data->State=_(parsed[3]); + data->Loaded=((systemd_struct*)dact->data)->load; + data->Active=((systemd_struct*)dact->data)->active; + data->State=((systemd_struct*)dact->data)->state; } g_idle_add((GSourceFunc)yon_system_set,data); - } - yon_char_parsed_free(parsed,size); - } for (int i=0; iwidgets=widgets; - data->SystemAutostart=loaded; - data->SystemLaunched=active; + data->SystemAutostart=0;//loaded; + data->SystemLaunched=0;//active; data->Name=yon_char_new(parsed[0]); data->Descr=yon_char_new(parsed[4]); data->Type = type; @@ -1605,7 +1596,7 @@ gboolean on_tooltip_show(GtkWidget*, gint x, gint y, gboolean, GtkTooltip* toolt int deactivated_size; config_str deactivated_parsed = yon_char_parse(target[2],&deactivated_size," "); int date_size; - config_str date_parsed = yon_char_parse(deactivated_parsed[1],&date_size,"-"); + config_str date_parsed = yon_char_parse(deactivated_parsed[0],&date_size,"-"); if (date_size>=2){ char *temp = date_parsed[0]; date_parsed[0]=date_parsed[2]; @@ -1903,8 +1894,8 @@ void yon_main_window_complete(main_window *widgets){ yon_save_window_set_postsave_function(on_save_done,widgets); } -int main(int argc, char *argv[]){ - local=setlocale(LC_ALL, ""); +int main(int argc, char *argv[]){ + setlocale(LC_ALL, ""); textdomain (LocaleName); config_init(); diff --git a/source/ubl-settings-services.h b/source/ubl-settings-services.h index 1690b8d..20638f6 100644 --- a/source/ubl-settings-services.h +++ b/source/ubl-settings-services.h @@ -1,3 +1,5 @@ +#ifndef UBL_SETTINGS_SERVICES_H +#define UBL_SETTINGS_SERVICES_H #include #include #include @@ -12,6 +14,7 @@ #include #include #include +#include "ubl-settings-services-systemd.h" #include #include #ifdef WEBKIT_FOUND @@ -127,9 +130,33 @@ #define SERVICES_MASK_PARAMETER "SERVICES_MASK" typedef char* string; + +__attribute__((unused)) static \ string version_application; -char *local; +enum YON_UNIT_TYPE { + YON_UNIT_SERVICE=0, + YON_UNIT_SWAP, + YON_UNIT_SOCKET, + YON_UNIT_DEVICE, + YON_UNIT_TARGET, + YON_UNIT_MOUNT, + YON_UNIT_TIMER, + YON_UNIT_PATH, + YON_UNIT_SLICE, + YON_UNIT_SCOPE, + YON_UNIT_UNRECOGNISED +}; + +typedef struct systemd_struct{ + char *name; + char *description; + int enable; + int active; + char *state; + int load; +}systemd_struct; + typedef struct { template_config_fields @@ -451,19 +478,6 @@ void on_root_access(GtkWidget *self, main_window *widgets); void on_save_done(main_window *widgets, config_str output, int size); -enum YON_UNIT_TYPE { - YON_UNIT_SERVICE=0, - YON_UNIT_SWAP, - YON_UNIT_SOCKET, - YON_UNIT_DEVICE, - YON_UNIT_TARGET, - YON_UNIT_MOUNT, - YON_UNIT_TIMER, - YON_UNIT_PATH, - YON_UNIT_SLICE, - YON_UNIT_SCOPE, - YON_UNIT_UNRECOGNISED -}; struct system_services_data{ main_window *widgets; @@ -516,4 +530,5 @@ gboolean yon_system_config_set(struct system_config_data *data); gboolean yon_user_set(struct system_user_data *data); gboolean yon_system_set(struct system_services_data *data); gboolean yon_interface_list_models_connect(main_window *widgets); -gboolean yon_interface_list_models_disconnect(main_window *widgets); \ No newline at end of file +gboolean yon_interface_list_models_disconnect(main_window *widgets); +#endif \ No newline at end of file