2021-06-17 21:32:24 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "log.h"
|
|
|
|
#include "string.h"
|
|
|
|
#include "util.h"
|
|
|
|
|
|
|
|
// Safe execvpe()
|
|
|
|
__attribute__((noreturn)) static inline void safe_execvpe(const char *pathname, char *argv[], char *const envp[]) {
|
|
|
|
argv[0] = (char *) pathname;
|
|
|
|
int ret = execvpe(pathname, argv, envp);
|
|
|
|
if (ret == -1) {
|
|
|
|
ERR("Unable To Execute Program: %s: %s", pathname, strerror(errno));
|
|
|
|
} else {
|
|
|
|
ERR("%s", "Unknown execvpe() Error");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Get Binary Directory (Remember To Free)
|
|
|
|
static inline char *get_binary_directory() {
|
2021-08-16 03:11:03 +00:00
|
|
|
// Get Path To Current Executable
|
|
|
|
char *exe = realpath("/proc/self/exe", NULL);
|
2021-06-17 21:32:24 +00:00
|
|
|
ALLOC_CHECK(exe);
|
|
|
|
|
|
|
|
// Chop Off Last Component
|
2021-08-16 03:11:03 +00:00
|
|
|
int length = strlen(exe);
|
|
|
|
for (int i = length - 1; i >= 0; i--) {
|
2021-06-17 21:32:24 +00:00
|
|
|
if (exe[i] == '/') {
|
|
|
|
exe[i] = '\0';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return
|
|
|
|
return exe;
|
|
|
|
}
|
|
|
|
// Safe execvpe() Relative To Binary
|
|
|
|
__attribute__((noreturn)) static inline void safe_execvpe_relative_to_binary(const char *pathname, char *argv[], char *const envp[]) {
|
|
|
|
// Get Binary Directory
|
|
|
|
char *binary_directory = get_binary_directory();
|
|
|
|
// Create Full Path
|
|
|
|
char *full_path = NULL;
|
|
|
|
safe_asprintf(&full_path, "%s/%s", binary_directory, pathname);
|
|
|
|
// Free Binary Directory
|
|
|
|
free(binary_directory);
|
|
|
|
// Run
|
|
|
|
safe_execvpe(full_path, argv, envp);
|
|
|
|
}
|