aboutsummaryrefslogtreecommitdiffstats
path: root/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'config.c')
-rw-r--r--config.c117
1 files changed, 117 insertions, 0 deletions
diff --git a/config.c b/config.c
new file mode 100644
index 0000000..2913a4e
--- /dev/null
+++ b/config.c
@@ -0,0 +1,117 @@
+#include <sys/types.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <limits.h>
+#include <pwd.h>
+#include <stdlib.h>
+
+#include "config.h"
+
+void fix_config_file_owner(const char *config_path) {
+ char *sudo_uid_str = getenv("SUDO_UID");
+ char *sudo_gid_str = getenv("SUDO_GID");
+
+ if (sudo_uid_str && sudo_gid_str) {
+ uid_t original_uid = atoi(sudo_uid_str);
+ gid_t original_gid = atoi(sudo_gid_str);
+
+ chown(config_path, original_uid, original_gid);
+ }
+}
+
+struct config* prepare_config_file() {
+ struct config* cfg = malloc(sizeof(struct config));
+ if (!cfg) {
+ return NULL;
+ }
+
+ char* sudo_user = getenv("SUDO_USER");
+ cfg->home = malloc(PATH_MAX);
+ if (!cfg->home) {
+ return NULL;
+ }
+
+ snprintf(cfg->home, PATH_MAX, "/home/%s", sudo_user);
+
+ cfg->config_file_path = malloc(strlen(cfg->home) + strlen("/.klrc"));
+
+ snprintf(cfg->config_file_path, PATH_MAX, "%s/.klrc", cfg->home);
+
+ if (access(cfg->config_file_path, F_OK) == -1) {
+ FILE* fp = fopen(cfg->config_file_path, "a");
+ if (!fp) {
+ return NULL;
+ }
+ fputs(CONFIG_FILE_COMMENT, fp);
+ fix_config_file_owner(cfg->config_file_path);
+ printf("%s\n", cfg->config_file_path);
+ fclose(fp);
+ }
+ return cfg;
+}
+
+struct config* parese_config(struct config* cfg) {
+ if (!cfg) {
+ return NULL;
+ }
+
+ FILE* fp = fopen(cfg->config_file_path, "r");
+ if (!fp) {
+ return NULL;
+ }
+
+
+ int line_count = 0;
+ char line[128];
+ char key[64] = {0};
+ char val[64] = {0};
+
+ while (fgets(line, sizeof(line), fp)) {
+ line_count++;
+ /* Skip comment and blank lines */
+ if (line[0] == '#' || line[0] == '\n' || line[0] == '\r') {
+ continue;
+ }
+
+ int count = sscanf(line, "%s = %s", key, val);
+ if (count != 2) {
+ printf("Error at %s:%d\n invalid token: %s", cfg->config_file_path, line_count, line);
+ return NULL;
+ }
+
+ if (CFG_COMPLETE(key, "device")) {
+ strncpy(cfg->device, val, sizeof(cfg->device) - 1);
+ cfg->device[sizeof(cfg->device) - 1] = '\0';
+ } else if (CFG_COMPLETE(key, "enable_time")) {
+ if (CFG_COMPLETE(val, "true")) {
+ cfg->enable_time = true;
+ } else {
+ cfg->enable_time = false;
+ }
+ } else if (CFG_COMPLETE(key, "enable_key_counter")) {
+ if (CFG_COMPLETE(val, "true")) {
+ cfg->enable_keys_counter = true;
+ } else {
+ cfg->enable_keys_counter = false;
+ }
+ }
+ }
+
+ fclose(fp);
+
+ return cfg;
+}
+
+struct config* config_init() {
+ struct config *cfg = prepare_config_file();
+ if (!cfg) {
+ return NULL;
+ }
+
+ if (parese_config(cfg) == NULL) {
+ return NULL;
+ }
+
+
+ return cfg;
+}