From 0ba5519937dc815976437aacb87ebfc3a54c9d05 Mon Sep 17 00:00:00 2001 From: javalsai Date: Wed, 25 Dec 2024 19:25:09 +0100 Subject: [PATCH] feat: add behavior.{source,user_source} for custom env --- include/auth.h | 3 +- include/config.h | 3 ++ src/auth.c | 72 +++++++++++++++++++++++++++++++++++++++++++++--- src/config.c | 7 +++++ src/ui.c | 3 +- 5 files changed, 82 insertions(+), 6 deletions(-) diff --git a/include/auth.h b/include/auth.h index d0d075a..f3912ee 100644 --- a/include/auth.h +++ b/include/auth.h @@ -3,8 +3,9 @@ #include +#include #include -bool launch(char *user, char *passwd, struct session session, void (*cb)(void)); +bool launch(char *user, char *passwd, struct session session, void (*cb)(void), struct behavior* behavior); #endif diff --git a/include/config.h b/include/config.h index 833fb46..1ae2bcf 100644 --- a/include/config.h +++ b/include/config.h @@ -1,6 +1,7 @@ #ifndef _CONFIGH_ #define _CONFIGH_ +#include "util.h" #include #include @@ -63,6 +64,8 @@ struct strings { struct behavior { bool include_defshell; + struct Vector source; + struct Vector user_source; }; struct config { diff --git a/src/auth.c b/src/auth.c index 4038c72..2af0cc3 100644 --- a/src/auth.c +++ b/src/auth.c @@ -1,8 +1,11 @@ +#include "config.h" #include #include #include +#include #include #include +#include #include #include @@ -59,7 +62,40 @@ void *shmalloc(size_t size) { -1, 0); } -void moarEnv(char *user, struct session session, struct passwd *pw) { +void sourceFileTry(char *file) { + FILE *file2source = fopen(file, "r"); + if (file2source == NULL) + return; + + char *line = NULL; + size_t len = 0; + ssize_t read; + + while ((read = getline(&line, &len, file2source)) != -1) { + if (read == 0 || (read > 0 && *line == '#')) + continue; + if (line[read - 1] == '\n') + line[read - 1] = '\0'; + + /* printf("Retrieved line of length %zu:\n", read); */ + /* printf("%s\n", line); */ + for (uint i = 1; i < read; i++) { + if (line[i] == '=') { + /* printf("FOUND '='!\n"); */ + line[i] = '\0'; + setenv(line, &line[i + 1], 1); + break; + } + } + } + + if (line) + free(line); + fclose(file2source); +} + +void moarEnv(char *user, struct session session, struct passwd *pw, + struct behavior *behavior) { if (chdir(pw->pw_dir) == -1) print_errno("can't chdir to user home"); @@ -81,6 +117,31 @@ void moarEnv(char *user, struct session session, struct passwd *pw) { xdg_session_type = "wayland"; setenv("XDG_SESSION_TYPE", xdg_session_type, true); + printf("\n\n\n\n\x1b[1m"); + for (uint32_t i = 0; i < behavior->source.length; i++) { + /* printf("DEBUG(source)!!!! %d %s\n", i, (char*)vec_get(&behavior->source, + * i)); */ + sourceFileTry((char *)vec_get(&behavior->source, i)); + } + /* printf("\n"); */ + if (pw->pw_dir) { + uint home_len = strlen(pw->pw_dir); + for (uint32_t i = 0; i < behavior->user_source.length; i++) { + char *file2sourcepath = (char *)vec_get(&behavior->user_source, i); + char *newbuf = + malloc(home_len + strlen(file2sourcepath) + 2); // nullbyte and slash + if (newbuf == NULL) + continue; // cant bother + strcpy(newbuf, pw->pw_dir); + newbuf[home_len] = '/'; // assume pw_dir doesnt start with '/' :P + strcpy(&newbuf[home_len + 1], file2sourcepath); + + /* printf("DEBUG(user_source)!!!! %d %s\n", i, newbuf); */ + sourceFileTry(newbuf); + free(newbuf); + } + } + /*char *buf;*/ /*size_t bsize = snprintf(NULL, 0, "/run/user/%d", pw->pw_uid) + 1;*/ /*buf = malloc(bsize);*/ @@ -92,8 +153,8 @@ void moarEnv(char *user, struct session session, struct passwd *pw) { /*setenv("XDG_SEAT", "seat0", true);*/ } -bool launch(char *user, char *passwd, struct session session, - void (*cb)(void)) { +bool launch(char *user, char *passwd, struct session session, void (*cb)(void), + struct behavior *behavior) { struct passwd *pw = getpwnam(user); if (pw == NULL) { print_err("could not get user info"); @@ -140,7 +201,7 @@ bool launch(char *user, char *passwd, struct session session, } free(envlist); - moarEnv(user, session, pw); + moarEnv(user, session, pw, behavior); // TODO: chown stdin to user // does it inherit stdin from parent and @@ -168,11 +229,14 @@ bool launch(char *user, char *passwd, struct session session, // TODO: these will be different due to TryExec // and, Exec/TryExec might contain spaces as args + printf("\x1b[0m"); if (session.type == SHELL) { clear_screen(); + fflush(stdout); execlp(session.exec, session.exec, NULL); } else if (session.type == XORG || session.type == WAYLAND) { clear_screen(); + fflush(stdout); execlp(session.exec, session.exec, NULL); } perror("execl error"); diff --git a/src/config.c b/src/config.c index c0788df..143d3d4 100644 --- a/src/config.c +++ b/src/config.c @@ -109,6 +109,10 @@ u_char config_line_handler(char *k, char *v) { __config->strings.s_shell = v; else if (strcmp(k, "behavior.include_defshell") == 0) __config->behavior.include_defshell = strcmp(v, "true") == 0; + else if (strcmp(k, "behavior.source") == 0) + vec_push(&__config->behavior.source, v); + else if (strcmp(k, "behavior.user_source") == 0) + vec_push(&__config->behavior.user_source, v); else return 0b1111; @@ -124,6 +128,9 @@ struct config *parse_config(char *path) { } __config = malloc(sizeof(struct config)); + __config->behavior.source = vec_new(); + __config->behavior.user_source = vec_new(); + if (__config == NULL) return NULL; bool ret = line_parser(fd, (ssize_t *)&sb.st_blksize, config_line_handler); diff --git a/src/ui.c b/src/ui.c index f6bcdff..a7e1275 100644 --- a/src/ui.c +++ b/src/ui.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -394,7 +395,7 @@ int load(struct Vector *users, struct Vector *sessions) { } else { if (len == 1 && *seq == '\n') { if (!launch(get_current_user().username, of_passwd.efield.content, - get_current_session(), &restore_all)) { + get_current_session(), &restore_all, &behavior)) { print_passwd(box_start(), of_passwd.efield.length, true); ffield_cursor_focus(); }