mirror of
https://github.com/javalsai/lidm.git
synced 2025-07-03 22:38:41 +02:00
fix: address mem issues
This commit is contained in:
parent
82e92df95c
commit
dc6424979e
23
src/config.c
23
src/config.c
@ -4,6 +4,14 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
// Alr so ima explain the bitfield returned by `cb` a bit
|
||||||
|
// 4 bits:
|
||||||
|
// 0b0001: break out of parsing (returning true)
|
||||||
|
// 0b0010: free the value
|
||||||
|
// 0b0100: free the key
|
||||||
|
// 0b1000: break out of parsing (returning false)
|
||||||
|
//
|
||||||
|
// This would return true if everything goes fine, false otherwise (malloc error, broke parsing, etc)
|
||||||
bool line_parser(FILE *fd, ssize_t *blksize,
|
bool line_parser(FILE *fd, ssize_t *blksize,
|
||||||
u_char (*cb)(char *key, char *value)) {
|
u_char (*cb)(char *key, char *value)) {
|
||||||
size_t opt_size = 4096;
|
size_t opt_size = 4096;
|
||||||
@ -54,6 +62,7 @@ bool line_parser(FILE *fd, ssize_t *blksize,
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct config *__config;
|
struct config *__config;
|
||||||
|
// Yanderedev code (wanna fix this with a table or smth)
|
||||||
u_char config_line_handler(char *k, char *v) {
|
u_char config_line_handler(char *k, char *v) {
|
||||||
if (strcmp(k, "colors.bg") == 0)
|
if (strcmp(k, "colors.bg") == 0)
|
||||||
__config->theme.colors.bg = v;
|
__config->theme.colors.bg = v;
|
||||||
@ -98,16 +107,13 @@ u_char config_line_handler(char *k, char *v) {
|
|||||||
else if (strcmp(k, "functions.poweroff") == 0) {
|
else if (strcmp(k, "functions.poweroff") == 0) {
|
||||||
__config->functions.poweroff = find_keyname(v);
|
__config->functions.poweroff = find_keyname(v);
|
||||||
return 0b0110;
|
return 0b0110;
|
||||||
}
|
} else if (strcmp(k, "functions.reboot") == 0) {
|
||||||
else if (strcmp(k, "functions.reboot") == 0) {
|
|
||||||
__config->functions.reboot = find_keyname(v);
|
__config->functions.reboot = find_keyname(v);
|
||||||
return 0b0110;
|
return 0b0110;
|
||||||
}
|
} else if (strcmp(k, "functions.refresh") == 0) {
|
||||||
else if (strcmp(k, "functions.refresh") == 0) {
|
|
||||||
__config->functions.refresh = find_keyname(v);
|
__config->functions.refresh = find_keyname(v);
|
||||||
return 0b0110;
|
return 0b0110;
|
||||||
}
|
} else if (strcmp(k, "strings.f_poweroff") == 0)
|
||||||
else if (strcmp(k, "strings.f_poweroff") == 0)
|
|
||||||
__config->strings.f_poweroff = v;
|
__config->strings.f_poweroff = v;
|
||||||
else if (strcmp(k, "strings.f_reboot") == 0)
|
else if (strcmp(k, "strings.f_reboot") == 0)
|
||||||
__config->strings.f_reboot = v;
|
__config->strings.f_reboot = v;
|
||||||
@ -126,15 +132,14 @@ u_char config_line_handler(char *k, char *v) {
|
|||||||
else if (strcmp(k, "behavior.include_defshell") == 0) {
|
else if (strcmp(k, "behavior.include_defshell") == 0) {
|
||||||
__config->behavior.include_defshell = strcmp(v, "true") == 0;
|
__config->behavior.include_defshell = strcmp(v, "true") == 0;
|
||||||
return 0b0110;
|
return 0b0110;
|
||||||
}
|
} else if (strcmp(k, "behavior.source") == 0)
|
||||||
else if (strcmp(k, "behavior.source") == 0)
|
|
||||||
vec_push(&__config->behavior.source, v);
|
vec_push(&__config->behavior.source, v);
|
||||||
else if (strcmp(k, "behavior.user_source") == 0)
|
else if (strcmp(k, "behavior.user_source") == 0)
|
||||||
vec_push(&__config->behavior.user_source, v);
|
vec_push(&__config->behavior.user_source, v);
|
||||||
else
|
else
|
||||||
return 0b1111;
|
return 0b1111;
|
||||||
|
|
||||||
return 0b100;
|
return 0b0100;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct config *parse_config(char *path) {
|
struct config *parse_config(char *path) {
|
||||||
|
@ -54,6 +54,7 @@ static int fn(const char *fpath, const struct stat *sb, int typeflag) {
|
|||||||
char *exec_buf = NULL;
|
char *exec_buf = NULL;
|
||||||
char *tryexec_buf = NULL;
|
char *tryexec_buf = NULL;
|
||||||
// This should be made a specific function
|
// This should be made a specific function
|
||||||
|
// Emm, if anything goes wrong just free the inner loop and `break;` fd and the rest is handled after
|
||||||
while (true) {
|
while (true) {
|
||||||
char *buf = malloc(sb->st_blksize);
|
char *buf = malloc(sb->st_blksize);
|
||||||
ssize_t read_size = getline(&buf, &alloc_size, fd);
|
ssize_t read_size = getline(&buf, &alloc_size, fd);
|
||||||
@ -64,7 +65,19 @@ static int fn(const char *fpath, const struct stat *sb, int typeflag) {
|
|||||||
|
|
||||||
uint read;
|
uint read;
|
||||||
char *key = malloc(read_size + sizeof(char));
|
char *key = malloc(read_size + sizeof(char));
|
||||||
|
if(key == NULL) {
|
||||||
|
free(buf);
|
||||||
|
// TODO: more sophisticated error handling??
|
||||||
|
break;
|
||||||
|
}
|
||||||
char *value = malloc(read_size + sizeof(char));
|
char *value = malloc(read_size + sizeof(char));
|
||||||
|
if(value == NULL) {
|
||||||
|
free(buf);
|
||||||
|
free(key);
|
||||||
|
// TODO: more sophisticated error handling??
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
value[0] = '\0'; // I'm not sure if sscanf would null this string out
|
||||||
if ((read = sscanf(buf, "%[^=]=%[^\n]\n", key, value)) != 0) {
|
if ((read = sscanf(buf, "%[^=]=%[^\n]\n", key, value)) != 0) {
|
||||||
if (strcmp(key, "Name") == 0) {
|
if (strcmp(key, "Name") == 0) {
|
||||||
found &= 0b001;
|
found &= 0b001;
|
||||||
@ -78,6 +91,8 @@ static int fn(const char *fpath, const struct stat *sb, int typeflag) {
|
|||||||
} else {
|
} else {
|
||||||
free(value);
|
free(value);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
free(value);
|
||||||
}
|
}
|
||||||
free(key);
|
free(key);
|
||||||
free(buf);
|
free(buf);
|
||||||
@ -85,6 +100,8 @@ static int fn(const char *fpath, const struct stat *sb, int typeflag) {
|
|||||||
}
|
}
|
||||||
/*printf("\nend parsing...\n");*/
|
/*printf("\nend parsing...\n");*/
|
||||||
|
|
||||||
|
// Generic handling of exit
|
||||||
|
|
||||||
fclose(fd);
|
fclose(fd);
|
||||||
|
|
||||||
// just add this to the list
|
// just add this to the list
|
||||||
|
15
src/util.c
15
src/util.c
@ -68,7 +68,6 @@ static int selret_magic() {
|
|||||||
return select(1, &set, NULL, NULL, &timeout);
|
return select(1, &set, NULL, NULL, &timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Vector shii
|
// Vector shii
|
||||||
struct Vector vec_new() {
|
struct Vector vec_new() {
|
||||||
struct Vector vec;
|
struct Vector vec;
|
||||||
@ -76,7 +75,7 @@ struct Vector vec_new() {
|
|||||||
return vec;
|
return vec;
|
||||||
}
|
}
|
||||||
|
|
||||||
int vec_push(struct Vector* vec, void* item) {
|
int vec_push(struct Vector *vec, void *item) {
|
||||||
if (vec->length >= vec->alloc_len) {
|
if (vec->length >= vec->alloc_len) {
|
||||||
uint32_t new_size = vec->alloc_len + vec->alloc_size;
|
uint32_t new_size = vec->alloc_len + vec->alloc_size;
|
||||||
void **new_location = realloc(vec->pages, vec->alloc_size);
|
void **new_location = realloc(vec->pages, vec->alloc_size);
|
||||||
@ -93,33 +92,33 @@ int vec_push(struct Vector* vec, void* item) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void vec_free(struct Vector* vec) {
|
void vec_free(struct Vector *vec) {
|
||||||
while(vec->length > 0)
|
while (vec->length > 0)
|
||||||
free(vec->pages[--vec->length]);
|
free(vec->pages[--vec->length]);
|
||||||
|
|
||||||
vec_clear(vec);
|
vec_clear(vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vec_clear(struct Vector* vec) {
|
void vec_clear(struct Vector *vec) {
|
||||||
free(vec->pages);
|
free(vec->pages);
|
||||||
vec_reset(vec);
|
vec_reset(vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vec_reset(struct Vector* vec) {
|
void vec_reset(struct Vector *vec) {
|
||||||
vec->length = 0;
|
vec->length = 0;
|
||||||
vec->alloc_len = 0;
|
vec->alloc_len = 0;
|
||||||
vec->alloc_size = 4096; // 4KiB page size?
|
vec->alloc_size = 4096; // 4KiB page size?
|
||||||
vec->pages = NULL;
|
vec->pages = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* vec_pop(struct Vector* vec) {
|
void *vec_pop(struct Vector *vec) {
|
||||||
if (vec->length == 0)
|
if (vec->length == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return vec->pages[--vec->length];
|
return vec->pages[--vec->length];
|
||||||
}
|
}
|
||||||
|
|
||||||
void* vec_get(struct Vector* vec, size_t index) {
|
void *vec_get(struct Vector *vec, size_t index) {
|
||||||
if (index >= vec->length)
|
if (index >= vec->length)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user