-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.c
35 lines (30 loc) · 935 Bytes
/
utils.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "utils.h"
#include <libgen.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
#define EXECUTABLE_SYMLINK "/proc/self/exe"
bool get_executable_dirname(char *buffer, int buffer_size) {
int path_len = readlink(EXECUTABLE_SYMLINK, buffer, buffer_size - 1);
if (path_len == -1)
return false;
buffer[path_len] = '\0';
const char *res = dirname(buffer);
int dirname_len = strlen(res);
if (dirname_len > buffer_size - 1)
dirname_len = buffer_size - 1;
memmove(buffer, res, dirname_len);
buffer[dirname_len] = '\0';
return true;
}
void get_default_config_path(const char *name, char *buffer, int buffer_size) {
if (!get_executable_dirname(buffer, buffer_size)) {
strncpy(buffer, name, buffer_size);
buffer[buffer_size - 1] = '\0';
return;
}
int directory_len = strlen(buffer);
snprintf(buffer + directory_len, buffer_size - directory_len, "/%s", name);
}