Updated bootstrap_main.c to no longer hard-code "ncc" but find it's execution point instead

This commit is contained in:
Netkas 2023-10-08 15:40:37 -04:00
parent 09debf85c6
commit a63d148f30
No known key found for this signature in database
GPG key ID: 5DAF58535614062B

View file

@ -4,50 +4,77 @@
#include <unistd.h> #include <unistd.h>
#include <limits.h> #include <limits.h>
int main(int argc, char *argv[]) // Function to check if a file exists in the given path
{ int fileExists(const char *path) {
// Get the program's file path return access(path, F_OK) != -1;
char programPath[PATH_MAX]; }
ssize_t pathLength = readlink("/proc/self/exe", programPath, sizeof(programPath) - 1);
if (pathLength == -1) // Function to find 'ncc' in the $PATH
{ char *findNCCInPath() {
perror("readlink"); char *path = getenv("PATH");
if (path == NULL) {
return NULL;
}
char *token = strtok(path, ":");
while (token != NULL) {
char fullPath[PATH_MAX];
snprintf(fullPath, sizeof(fullPath), "%s/%s", token, "ncc");
if (fileExists(fullPath)) {
return strdup(fullPath);
}
token = strtok(NULL, ":");
}
return NULL;
}
int main(int argc, char *argv[]) {
// Find 'ncc' in the $PATH
char *nccPath = findNCCInPath();
if (nccPath == NULL) {
fprintf(stderr, "Error: 'ncc' needs to be installed on the system or added to the $PATH to execute this program.\n");
return 1; return 1;
} }
// Get the program's file path
char programPath[PATH_MAX];
ssize_t pathLength = readlink("/proc/self/exe", programPath, sizeof(programPath) - 1);
if (pathLength == -1) {
perror("readlink");
free(nccPath);
return 1;
}
programPath[pathLength] = '\0'; programPath[pathLength] = '\0';
// Calculate the total length needed for the command string // Calculate the total length needed for the command string
size_t totalLength = snprintf(NULL, 0, "ncc exec --package=\"%s\" --exec-args", programPath); size_t totalLength = strlen(nccPath) + strlen(programPath) + 50; // 50 for additional characters
for (int i = 1; i < argc; i++) for (int i = 1; i < argc; i++) {
{ totalLength += strlen(argv[i]) + 3; // +3 for quotes and space
totalLength += snprintf(NULL, 0, " \"%s\"", argv[i]) + 1; // +1 for space or null terminator
} }
// Allocate memory for the command string // Allocate memory for the command string
char *command = (char *)malloc(totalLength + 1); // +1 for null terminator char *command = (char *)malloc(totalLength);
if (command == NULL) if (command == NULL) {
{
perror("malloc"); perror("malloc");
free(nccPath);
return 1; return 1;
} }
// Construct the command to execute // Construct the command to execute
snprintf(command, totalLength + 1, "ncc exec --package=\"%s\" --exec-args", programPath); snprintf(command, totalLength, "%s exec --package=\"%s\" --exec-args", nccPath, programPath);
for (int i = 1; i < argc; i++) for (int i = 1; i < argc; i++) {
{ snprintf(command + strlen(command), totalLength - strlen(command), " \"%s\"", argv[i]);
snprintf(command + strlen(command), totalLength - strlen(command) + 1, " \"%s\"", argv[i]);
} }
// Execute the ncc command // Execute the ncc command
int result = system(command); int result = system(command);
free(command); free(command);
free(nccPath);
if (result == -1) if (result == -1) {
{
perror("system"); perror("system");
return 1; return 1;
} }
return WEXITSTATUS(result); return WEXITSTATUS(result);
} }