Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Code quality & Fixes #24

Merged
merged 11 commits into from
Nov 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions .github/workflows/check-and-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,9 @@ jobs:

- uses: uraimo/run-on-arch-action@v2
with:
arch: aarch64
distro: ubuntu22.04
arch: none
distro: none
base_image: '--platform=linux/aarch64 ubuntu:22.04'
githubToken: ${{ github.token }}
install: |
apt-get update && \
Expand Down Expand Up @@ -180,8 +181,9 @@ jobs:

- uses: uraimo/run-on-arch-action@v2
with:
arch: armv7
distro: ubuntu22.04
arch: none
distro: none
base_image: '--platform=linux/arm/v7 ubuntu:22.04'
githubToken: ${{ github.token }}
install: |
apt-get update && \
Expand Down Expand Up @@ -224,8 +226,9 @@ jobs:

- uses: uraimo/run-on-arch-action@v2
with:
arch: riscv64
distro: ubuntu22.04
arch: none
distro: none
base_image: '--platform=linux/riscv64 riscv64/ubuntu:22.04'
githubToken: ${{ github.token }}
install: |
apt-get update && \
Expand Down
9 changes: 3 additions & 6 deletions include/sessions.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

#include <sys/types.h>

#include <util.h>

enum session_type {
XORG,
WAYLAND,
Expand All @@ -16,11 +18,6 @@ struct session {
enum session_type type;
};

struct sessions_list {
u_int16_t length;
struct session *sessions;
};

struct sessions_list *get_avaliable_sessions();
struct Vector get_avaliable_sessions();

#endif
3 changes: 2 additions & 1 deletion include/ui.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@
#define _UIH_

#include <config.h>
#include <util.h>

void setup(struct config);
int load(struct users_list *, struct sessions_list *);
int load(struct Vector * users, struct Vector * sessions);
void print_err(const char *);
void print_errno(const char *);

Expand Down
9 changes: 3 additions & 6 deletions include/users.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,14 @@

#include <sys/types.h>

#include <util.h>

struct user {
char *shell;
char *username;
char *display_name;
};

struct users_list {
u_int16_t length;
struct user *users;
};

struct users_list *get_human_users();
struct Vector get_human_users();

#endif
16 changes: 16 additions & 0 deletions include/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,27 @@

#include <keys.h>
#include <stdbool.h>
#include <stdint.h>
#include <sys/types.h>

enum keys find_keyname(char *);
enum keys find_ansi(char *);
void read_press(u_char *, char *);
void strcln(char **dest, const char *source);

struct Vector {
uint32_t length;
uint32_t alloc_len;
uint16_t alloc_size;
void** pages;
};

struct Vector vec_new();
int vec_push(struct Vector*, void* item);
void vec_free(struct Vector*);
void vec_clear(struct Vector*);
void vec_reset(struct Vector*);
void* vec_pop(struct Vector*); // won't free it, nor shrink vec list space
void* vec_get(struct Vector*, uint32_t index);

#endif
7 changes: 4 additions & 3 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <sessions.h>
#include <ui.h>
#include <users.h>
#include <util.h>

int main(int argc, char *argv[]) {
if (argc == 2)
Expand All @@ -23,10 +24,10 @@ int main(int argc, char *argv[]) {
}
setup(*config);

struct users_list *users = get_human_users();
struct sessions_list *sessions = get_avaliable_sessions();
struct Vector users = get_human_users();
struct Vector sessions = get_avaliable_sessions();

int ret = load(users, sessions);
int ret = load(&users, &sessions);
if (ret == 0)
execl(argv[0], argv[0], NULL);
}
54 changes: 14 additions & 40 deletions src/sessions.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ static const struct source_dir sources[] = {
{XORG, "/usr/share/xsessions"},
{WAYLAND, "/usr/share/wayland-sessions"},
};
static const size_t sources_size = sizeof(sources) / sizeof(sources[0]);

static struct session __new_session(enum session_type type, char *name,
const char *exec, const char *tryexec) {
Expand All @@ -31,32 +30,20 @@ static struct session __new_session(enum session_type type, char *name,
return __session;
}

static const u_int8_t bs = 16;
static const u_int8_t unit_size = sizeof(struct session);

static u_int16_t alloc_size = bs;
static u_int16_t used_size = 0;

static struct session *sessions = NULL;
static struct sessions_list *__sessions_list = NULL;
static struct Vector *cb_sessions = NULL;

// NOTE: commented printf's here would be nice to have debug logs if I ever
// implement it
static enum session_type session_type;
static int fn(const char *fpath, const struct stat *sb, int typeflag) {
// practically impossible to reach this
// but will prevent break
if (used_size == 0xffff)
return 0;

if (sb == NULL || !S_ISREG(sb->st_mode))
return 0;

/*printf("gonna open %s\n", fpath);*/
FILE *fd = fopen(fpath, "r");
if (fd == NULL) {
perror("fopen");
fprintf(stderr, "error opening file (r) %s\n", fpath);
fprintf(stderr, "error opening file (r) '%s'\n", fpath);
return 0;
}

Expand All @@ -66,8 +53,8 @@ static int fn(const char *fpath, const struct stat *sb, int typeflag) {
char *name_buf = NULL;
char *exec_buf = NULL;
char *tryexec_buf = NULL;
// This should be made a specific function
while (true) {
/*printf(".");*/
char *buf = malloc(sb->st_blksize);
ssize_t read_size = getline(&buf, &alloc_size, fd);
if (read_size == -1) {
Expand Down Expand Up @@ -102,17 +89,10 @@ static int fn(const char *fpath, const struct stat *sb, int typeflag) {

// just add this to the list
if (name_buf != NULL && exec_buf != NULL) {
/*printf("gonna add to session list\n");*/
if (used_size >= alloc_size) {
alloc_size += bs;
sessions = realloc(sessions, alloc_size * unit_size);
}

/*printf("n %s\ne %s\nte %s\n", name_buf, exec_buf, tryexec_buf);*/
sessions[used_size] = __new_session(session_type, name_buf, exec_buf,
tryexec_buf == NULL ? "" : tryexec_buf);

used_size++;
struct session *session_i = malloc(sizeof (struct session));
*session_i = __new_session(session_type, name_buf, exec_buf,
tryexec_buf == NULL ? "" : tryexec_buf);
vec_push(cb_sessions, session_i);
}

if (name_buf != NULL)
Expand All @@ -125,23 +105,17 @@ static int fn(const char *fpath, const struct stat *sb, int typeflag) {
return 0;
}

static struct sessions_list __list;
// This code is designed to be run purely single threaded
struct sessions_list *get_avaliable_sessions() {
if (sessions != NULL)
return __sessions_list;
else
sessions = malloc(alloc_size * unit_size);
struct Vector get_avaliable_sessions() {
struct Vector sessions = vec_new();

for (uint i = 0; i < sources_size; i++) {
session_type = sources[i].type;
cb_sessions = &sessions;
for (uint i = 0; i < (sizeof(sources) / sizeof(sources[0])); i++) {
/*printf("recurring into %s\n", sources[i].dir);*/
session_type = sources[i].type;
ftw(sources[i].dir, &fn, 1);
}
cb_sessions = NULL;

sessions = realloc(sessions, used_size * unit_size);

__list.length = used_size;
__list.sessions = sessions;
return __sessions_list = &__list;
return sessions;
}
10 changes: 5 additions & 5 deletions src/ui.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,8 +179,8 @@ struct opt_field of_session;
struct opt_field of_user;
struct opt_field of_passwd;

struct users_list *gusers;
struct sessions_list *gsessions;
struct Vector *gusers;
struct Vector *gsessions;

// not *that* OF tho
struct opt_field *get_of(enum input from) {
Expand Down Expand Up @@ -217,7 +217,7 @@ void ffield_cursor_focus() {

struct user get_current_user() {
if (of_user.current_opt != 0)
return gusers->users[of_user.current_opt - 1];
return *(struct user*)vec_get(gusers, of_user.current_opt - 1);
else {
struct user custom_user;
custom_user.shell = "/usr/bin/bash";
Expand All @@ -237,7 +237,7 @@ struct session get_current_session() {
shell_session.exec = shell_session.name = get_current_user().shell;
return shell_session;
} else
return gsessions->sessions[of_session.current_opt - 1];
return *(struct session*)vec_get(gsessions, of_session.current_opt - 1);
} else {
struct session custom_session;
custom_session.type = SHELL;
Expand Down Expand Up @@ -320,7 +320,7 @@ void ffield_type(char *text) {
print_ffield();
}

int load(struct users_list *users, struct sessions_list *sessions) {
int load(struct Vector *users, struct Vector *sessions) {
/// SETUP
gusers = users;
gsessions = sessions;
Expand Down
38 changes: 7 additions & 31 deletions src/users.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,43 +20,19 @@ static struct user __new_user(struct passwd *p) {
return __user;
}

static const u_int8_t bs = 16;
static const u_int8_t unit_size = sizeof(struct user);

static u_int16_t alloc_size = bs;
static u_int16_t used_size = 0;

static struct user *users = NULL;
static struct users_list *__users_list = NULL;

struct users_list __list;
// This code is designed to be run purely single threaded
struct users_list *get_human_users() {
if (users != NULL)
return __users_list;
else
users = malloc(alloc_size * unit_size);
struct Vector get_human_users() {
struct Vector users = vec_new();

struct passwd *pwd;
while ((pwd = getpwent()) != NULL) {
// practically impossible to reach this (== 0xffff)
// but will prevent break
if (used_size == 0xffff ||
!(pwd->pw_dir && strncmp(pwd->pw_dir, "/home/", 6) == 0))
if (!(pwd->pw_dir && strncmp(pwd->pw_dir, "/home/", 6) == 0))
continue;

if (used_size >= alloc_size) {
alloc_size += bs;
users = realloc(users, alloc_size * unit_size);
}

users[used_size] = __new_user(pwd);
used_size++;
struct user *user_i = malloc(sizeof(struct user));
*user_i = __new_user(pwd);
vec_push(&users, user_i);
}

users = realloc(users, used_size * unit_size);

__list.length = used_size;
__list.users = users;
return __users_list = &__list;
return users;
}
Loading