aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.c')
-rw-r--r--src/utils.c106
1 files changed, 98 insertions, 8 deletions
diff --git a/src/utils.c b/src/utils.c
index 31853e2..71ad02d 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -1,4 +1,5 @@
#include "../include/utils.h"
+#include "../include/log.h"
#include "../include/window/window.h"
#include "../include/capture/capture.h"
@@ -33,7 +34,7 @@ double clock_get_monotonic_seconds(void) {
bool generate_random_characters(char *buffer, int buffer_size, const char *alphabet, size_t alphabet_size) {
/* TODO: Use other functions on other platforms than linux */
if(getrandom(buffer, buffer_size, 0) < buffer_size) {
- fprintf(stderr, "Failed to get random bytes, error: %s\n", strerror(errno));
+ gsr_log(GSR_LOG_LEVEL_ERROR, "failed to get random bytes, error: %s", strerror(errno));
return false;
}
@@ -197,7 +198,7 @@ static bool connector_get_property_by_name(int drmfd, drmModeConnectorPtr props,
static void for_each_active_monitor_output_drm(const char *card_path, active_monitor_callback callback, void *userdata) {
int fd = open(card_path, O_RDONLY);
if(fd == -1) {
- fprintf(stderr, "gsr error: for_each_active_monitor_output_drm failed, failed to open \"%s\", error: %s\n", card_path, strerror(errno));
+ gsr_log(GSR_LOG_LEVEL_ERROR, "for_each_active_monitor_output_drm failed, failed to open \"%s\", error: %s", card_path, strerror(errno));
return;
}
@@ -365,14 +366,14 @@ bool gl_get_gpu_info(gsr_egl *egl, gsr_gpu_info *info) {
info->is_steam_deck = false;
if(!gl_vendor) {
- fprintf(stderr, "gsr error: failed to get gpu vendor\n");
+ gsr_log(GSR_LOG_LEVEL_ERROR, "failed to get gpu vendor");
return false;
}
if(gl_renderer) {
for(int i = 0; software_renderers[i]; ++i) {
if(strstr(gl_renderer, software_renderers[i])) {
- fprintf(stderr, "gsr error: your opengl environment is not properly setup. It's using %s (software rendering) for opengl instead of your graphics card. Please make sure your graphics driver is properly installed\n", software_renderers[i]);
+ gsr_log(GSR_LOG_LEVEL_ERROR, "your opengl environment is not properly setup. It's using %s (software rendering) for opengl instead of your graphics card. Please make sure your graphics driver is properly installed", software_renderers[i]);
return false;
}
}
@@ -388,8 +389,10 @@ bool gl_get_gpu_info(gsr_egl *egl, gsr_gpu_info *info) {
info->vendor = GSR_GPU_VENDOR_NVIDIA;
else if(strstr(gl_vendor, "Broadcom"))
info->vendor = GSR_GPU_VENDOR_BROADCOM;
+ else if(strstr(gl_vendor, "Mesa") && gl_renderer && strstr(gl_renderer, "Apple"))
+ info->vendor = GSR_GPU_VENDOR_APPLE;
else {
- fprintf(stderr, "gsr error: unknown gpu vendor: %s\n", gl_vendor);
+ gsr_log(GSR_LOG_LEVEL_ERROR, "unknown gpu vendor: %s", gl_vendor);
return false;
}
@@ -449,7 +452,8 @@ bool try_card_has_valid_plane(const char *card_path) {
bool gsr_get_valid_card_path(gsr_egl *egl, char *output, bool is_monitor_capture) {
if(egl->dri_card_path) {
snprintf(output, 128, "%s", egl->dri_card_path);
- return is_monitor_capture ? try_card_has_valid_plane(output) : true;
+ if(!is_monitor_capture || try_card_has_valid_plane(output))
+ return true;
}
for(int i = 0; i < 10; ++i) {
@@ -656,7 +660,7 @@ bool get_nvidia_driver_version(int *major, int *minor) {
FILE *f = fopen("/proc/driver/nvidia/version", "rb");
if(!f) {
- fprintf(stderr, "gsr warning: failed to get nvidia driver version (failed to read /proc/driver/nvidia/version)\n");
+ gsr_log(GSR_LOG_LEVEL_WARNING, "failed to get nvidia driver version (failed to read /proc/driver/nvidia/version)");
return false;
}
@@ -677,8 +681,94 @@ bool get_nvidia_driver_version(int *major, int *minor) {
}
if(!success)
- fprintf(stderr, "gsr warning: failed to get nvidia driver version\n");
+ gsr_log(GSR_LOG_LEVEL_WARNING, "failed to get nvidia driver version");
fclose(f);
return success;
}
+
+void gsr_string_split(const char *str, char delimiter, gsr_string_split_callback callback, void *userdata) {
+ const size_t str_len = strlen(str);
+ size_t index = 0;
+ while(index < str_len) {
+ const char *end = strchr(str + index, delimiter);
+ const size_t end_index = end ? (size_t)(end - str) : str_len;
+
+ if(!callback(str + index, end_index - index, userdata))
+ break;
+
+ index = end_index + 1;
+ }
+}
+
+bool gsr_string_starts_with(const char *str, size_t str_size, const char *substr) {
+ const size_t substr_len = strlen(substr);
+ return str_size >= substr_len && memcmp(str, substr, substr_len) == 0;
+}
+
+bool gsr_string_ends_with(const char *str, const char *substr) {
+ const size_t str_len = strlen(str);
+ const size_t substr_len = strlen(substr);
+ return str_len >= substr_len && memcmp(str + str_len - substr_len, substr, substr_len) == 0;
+}
+
+static bool string_to_long(const char *str, size_t size, long *number) {
+ char number_str[32];
+ snprintf(number_str, sizeof(number_str), "%.*s", (int)size, str);
+
+ errno = 0;
+ *number = strtol(number_str, NULL, 0);
+ return errno == 0;
+}
+
+bool gsr_string_to_int(const char *str, size_t size, int *number) {
+ long value = 0;
+ if(!string_to_long(str, size, &value))
+ return false;
+ *number = value;
+ return true;
+}
+
+bool gsr_string_to_int64(const char *str, size_t size, int64_t *number) {
+ long value = 0;
+ if(!string_to_long(str, size, &value))
+ return false;
+ *number = value;
+ return true;
+}
+
+bool gsr_array_ensure_capacity(void **array, size_t num_items, size_t *capacity_items, size_t item_size) {
+ if(num_items + 1 >= *capacity_items) {
+ size_t new_capacity_items = *capacity_items * 2;
+ if(new_capacity_items == 0)
+ new_capacity_items = 32;
+
+ void *new_data = realloc(*array, new_capacity_items * item_size);
+ if(!new_data) {
+ gsr_log(GSR_LOG_LEVEL_ERROR, "gsr_array_ensure_capacity: failed to reallocate memory");
+ return false;
+ }
+
+ *array = new_data;
+ *capacity_items = new_capacity_items;
+ }
+ return true;
+}
+
+void gsr_get_date_str(char *str, size_t size) {
+ time_t now = time(NULL);
+ struct tm *t = localtime(&now);
+ strftime(str, size - 1, "%Y-%m-%d_%H-%M-%S", t);
+}
+
+void gsr_get_date_only_str(char *str, size_t size) {
+ time_t now = time(NULL);
+ struct tm *t = localtime(&now);
+ strftime(str, size - 1, "%Y-%m-%d", t);
+}
+
+void gsr_get_time_only_str(char *str, size_t size) {
+ time_t now = time(NULL);
+ struct tm *t = localtime(&now);
+ strftime(str, size - 1, "%H-%M-%S", t);
+}