/ src / setup / src / main.c
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  }