chore: implement vectors

also seems to address several of these:
https://github.com/javalsai/lidm/issues/3#issuecomment-2423933131

not sure about the issue itself, might be permission stuff
This commit is contained in:
2024-10-19 17:48:20 +02:00
parent 01ddd62852
commit a0b68491ba
7 changed files with 38 additions and 92 deletions

View File

@@ -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) {
@@ -31,24 +30,12 @@ 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;
@@ -56,7 +43,7 @@ static int fn(const char *fpath, const struct stat *sb, int typeflag) {
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;
}
@@ -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) {
@@ -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)
@@ -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;
}