Add config option to make paths relative to config file
parent
16ff0fa11d
commit
6d59ab8323
|
@ -35,8 +35,10 @@
|
||||||
X(string, xkb_layout) \
|
X(string, xkb_layout) \
|
||||||
X(string, xkb_variant) \
|
X(string, xkb_variant) \
|
||||||
X(string, xkb_options) \
|
X(string, xkb_options) \
|
||||||
|
X(bool, use_relative_paths) \
|
||||||
|
|
||||||
struct cfg {
|
struct cfg {
|
||||||
|
char* directory;
|
||||||
#define string char*
|
#define string char*
|
||||||
#define uint uint32_t
|
#define uint uint32_t
|
||||||
#define X(type, name) type name;
|
#define X(type, name) type name;
|
||||||
|
|
13
src/cfg.c
13
src/cfg.c
|
@ -18,6 +18,8 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <libgen.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
#include "cfg.h"
|
#include "cfg.h"
|
||||||
|
|
||||||
|
@ -106,11 +108,16 @@ static int cfg__load_line(struct cfg* self, char* line)
|
||||||
return cfg__load_key_value(self, key, value);
|
return cfg__load_key_value(self, key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char* cfg__dirname(const char* path)
|
||||||
|
{
|
||||||
|
char buffer[PATH_MAX];
|
||||||
|
return strdup(dirname(realpath(path, buffer)));
|
||||||
|
}
|
||||||
|
|
||||||
int cfg_load(struct cfg* self, const char* requested_path)
|
int cfg_load(struct cfg* self, const char* requested_path)
|
||||||
{
|
{
|
||||||
const char* path = requested_path ? requested_path
|
const char* path = requested_path ? requested_path
|
||||||
: cfg__get_default_path();
|
: cfg__get_default_path();
|
||||||
|
|
||||||
if (!path)
|
if (!path)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -118,6 +125,8 @@ int cfg_load(struct cfg* self, const char* requested_path)
|
||||||
if (!stream)
|
if (!stream)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
self->directory = cfg__dirname(path);
|
||||||
|
|
||||||
char* line = NULL;
|
char* line = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
int lineno = 0;
|
int lineno = 0;
|
||||||
|
@ -136,6 +145,7 @@ int cfg_load(struct cfg* self, const char* requested_path)
|
||||||
failure:
|
failure:
|
||||||
cfg_destroy(self);
|
cfg_destroy(self);
|
||||||
free(line);
|
free(line);
|
||||||
|
free(self->directory);
|
||||||
fclose(stream);
|
fclose(stream);
|
||||||
return lineno;
|
return lineno;
|
||||||
}
|
}
|
||||||
|
@ -153,4 +163,5 @@ void cfg_destroy(struct cfg* self)
|
||||||
#undef DESTROY_string
|
#undef DESTROY_string
|
||||||
#undef DESTROY_uint
|
#undef DESTROY_uint
|
||||||
#undef DESTROY_bool
|
#undef DESTROY_bool
|
||||||
|
free(self->directory);
|
||||||
}
|
}
|
||||||
|
|
28
src/main.c
28
src/main.c
|
@ -705,7 +705,18 @@ static int blank_screen(struct wayvnc* self)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int init_nvnc(struct wayvnc* self, const char* addr, uint16_t port,
|
static char* get_cfg_path(const struct cfg* cfg, char* dst, const char* src)
|
||||||
|
{
|
||||||
|
if (!cfg->use_relative_paths) {
|
||||||
|
strlcpy(dst, src, PATH_MAX);
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(dst, PATH_MAX, "%s/%s", cfg->directory, src);
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int init_nvnc(struct wayvnc* self, const char* addr, uint16_t port,
|
||||||
enum socket_type socket_type)
|
enum socket_type socket_type)
|
||||||
{
|
{
|
||||||
switch (socket_type) {
|
switch (socket_type) {
|
||||||
|
@ -755,16 +766,25 @@ int init_nvnc(struct wayvnc* self, const char* addr, uint16_t port,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->cfg.rsa_private_key_file) {
|
if (self->cfg.rsa_private_key_file) {
|
||||||
if (nvnc_set_rsa_creds(self->nvnc, self->cfg.rsa_private_key_file) < 0) {
|
char tmp[PATH_MAX];
|
||||||
|
const char* key_file = get_cfg_path(&self->cfg, tmp,
|
||||||
|
self->cfg.rsa_private_key_file);
|
||||||
|
if (nvnc_set_rsa_creds(self->nvnc, key_file) < 0) {
|
||||||
nvnc_log(NVNC_LOG_ERROR, "Failed to load RSA credentials");
|
nvnc_log(NVNC_LOG_ERROR, "Failed to load RSA credentials");
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->cfg.private_key_file) {
|
if (self->cfg.private_key_file) {
|
||||||
int r = nvnc_set_tls_creds(self->nvnc,
|
char key_file[PATH_MAX];
|
||||||
self->cfg.private_key_file,
|
char cert_file[PATH_MAX];
|
||||||
|
|
||||||
|
get_cfg_path(&self->cfg, key_file,
|
||||||
|
self->cfg.private_key_file);
|
||||||
|
get_cfg_path(&self->cfg, cert_file,
|
||||||
self->cfg.certificate_file);
|
self->cfg.certificate_file);
|
||||||
|
int r = nvnc_set_tls_creds(self->nvnc, key_file,
|
||||||
|
cert_file);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
nvnc_log(NVNC_LOG_ERROR, "Failed to enable TLS authentication");
|
nvnc_log(NVNC_LOG_ERROR, "Failed to enable TLS authentication");
|
||||||
goto failure;
|
goto failure;
|
||||||
|
|
Loading…
Reference in New Issue