main.c
1 /* FinnOS - Beowulf cluster linux distro. 2 * If you find this software useful, please consider supporting future development. 3 * Donate what you believe this software is worth at: https://SammTech.net/donate 4 * Copyright (c) 2025 Samm and FinnOS Contributors. 5 * Licensed under the GNU General Public License, version 2 (GPLv2). 6 * See LICENSE.txt for details. 7 */ 8 9 #include <stddef.h> 10 #include <stdio.h> 11 12 #include <ncurses.h> 13 14 #include <settings.h> 15 #include <strbst.h> 16 #include <string.h> 17 18 UnsortedStrBstNode unsorted_cpu_archs[] = { 19 { "X86-64", (CPUArch*)X86_64 }, 20 { "X86-32", (CPUArch*)X86_32 }, 21 { "X86", (CPUArch*)X86_32 }, 22 { "ARM64", (CPUArch*)ARM64 }, 23 { "AARCH", (CPUArch*)ARM64 }, 24 { "AARCH64", (CPUArch*)ARM64 }, 25 { "ARM32", (CPUArch*)ARM32 }, 26 { "ARM", (CPUArch*)ARM32 }, 27 { "RISC-V_64", (CPUArch*)RISCV64 }, 28 { "RISC-V", (CPUArch*)RISCV64 }, 29 }; 30 31 StrBstNode* cpu_archs = NULL; 32 33 /* set master architecture */ 34 static int handle_mA(SetupSettings* settings, int argc, char* argv[], int argi) { 35 if (argi + 1 >= argc) return -1; 36 char* arch_str = argv[argi + 1]; 37 38 StrBstNode* arch_node = search_strbst(cpu_archs, arch_str); 39 if (arch_node == NULL) return -1; 40 41 if (settings->is_default_master_arch > 0) { 42 settings->is_default_master_arch = 0; 43 settings->master_arch_len = 0; 44 } 45 settings->master_archs = (CPUArch*)realloc(settings->master_archs, sizeof(CPUArch) * (settings->master_arch_len + 1)); 46 if (settings->master_archs == NULL) return -1; 47 settings->master_archs[settings->master_arch_len] = (size_t)arch_node->echild; 48 settings->master_arch_len++; 49 50 return 1; 51 } 52 53 /* set node architecture */ 54 static int handle_nA(SetupSettings* settings, int argc, char* argv[], int argi) { 55 if (argi + 1 >= argc) return -1; 56 char* arch_str = argv[argi + 1]; 57 58 StrBstNode* arch_node = search_strbst(cpu_archs, arch_str); 59 if (arch_node == NULL) return -1; 60 61 if (settings->is_default_node_arch > 0) { 62 settings->is_default_node_arch = 0; 63 settings->node_arch_len = 0; 64 } 65 settings->node_archs = (CPUArch*)realloc(settings->node_archs, sizeof(CPUArch) * (settings->node_arch_len + 1)); 66 if (settings->node_archs == NULL) return -1; 67 settings->node_archs[settings->node_arch_len] = (size_t)arch_node->echild; 68 settings->node_arch_len++; 69 70 return 1; 71 } 72 73 static UnsortedStrBstNode unsorted_argfunc_pairs[] = { 74 { "mA", handle_mA }, 75 { "nA", handle_nA }, 76 }; 77 78 int main(int argc, char* argv[]) { 79 /* init */ 80 SetupSettings settings; 81 if (create_default_settings(&settings) != 0) { 82 return -2; 83 } 84 85 cpu_archs = insert_multiple_to_strbst(cpu_archs, unsorted_cpu_archs, sizeof(unsorted_cpu_archs)/sizeof(unsorted_cpu_archs[0])); 86 87 /* terminal arguments */ 88 if (argc > 2) { 89 StrBstNode* argfunc_pairs = insert_multiple_to_strbst(NULL, unsorted_argfunc_pairs, sizeof(unsorted_argfunc_pairs) / sizeof(unsorted_argfunc_pairs[0])); 90 for (int i = 1; i < argc; i++) { 91 StrBstNode* argfunc = search_strbst(argfunc_pairs, argv[i]); 92 93 if (argfunc == NULL) { 94 printf("Error: \"%s\" is not a valid argument.\n", argv[i]); 95 destroy_strbst(argfunc_pairs); 96 destroy_strbst(cpu_archs); 97 destroy_settings(&settings); 98 return -1; 99 } 100 101 int inc = ((int (*)(SetupSettings*, int, char*[], int))argfunc->echild)(&settings, argc, argv, i); 102 if (inc < 0) { 103 printf("Error: in argument `%s` #%d.\n", argv[i], i + -inc); 104 destroy_strbst(argfunc_pairs); 105 destroy_strbst(cpu_archs); 106 destroy_settings(&settings); 107 return -1; 108 } 109 i += inc; 110 } 111 destroy_strbst(argfunc_pairs); 112 } 113 114 /* clean up */ 115 destroy_strbst(cpu_archs); 116 destroy_settings(&settings); 117 118 return 0; 119 }