1 /* 2 * GRUB -- GRand Unified Bootloader 3 * Copyright (C) 2012 Daniil Lunev 4 * 5 * GRUB is free software: you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation, either version 3 of the License, or 8 * (at your option) any later version. 9 * 10 * GRUB is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with GRUB. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 #include <grub/types.h> 20 #include <grub/file.h> 21 #include <grub/disk.h> 22 #include <grub/misc.h> 23 #include <grub/err.h> 24 #include <grub/dl.h> 25 #include <grub/extcmd.h> 26 #include <grub/i18n.h> 27 #include <grub/normal.h> 28 29 #include "menu_managing.c" 30 31 GRUB_MOD_LICENSE ("GPLv3+"); 32 33 static const struct grub_arg_option options[] = { 34 {0, 0, 0, 0, 0, 0} 35 }; 36 37 static const char * globals[] = { 38 "default_entry", 39 "timeout", 40 "serial", 41 "terminal", 42 NULL 43 }; 44 45 static grub_err_t 46 get_value(char * buf, char ** value) 47 { 48 *value = grub_strchr(buf, '='); 49 if (! *value) 50 return grub_error (GRUB_ERR_INVALID_COMMAND, N_("illumos syntax error")); 51 **value = '\0'; 52 ++(*value); 53 return 0; 54 } 55 56 static int 57 check_param(char * param) 58 { 59 int i = 0; 60 61 for (; params_list[i]; ++i) 62 if (!grub_strcmp(param, params_list[i])) 63 return i; 64 65 return -1; 66 } 67 68 static int 69 check_global(char * param) 70 { 71 int i = 0; 72 73 for (; globals[i]; ++i) 74 if (!grub_strcmp(param, globals[i])) 75 return i; 76 77 return -1; 78 } 79 80 static grub_err_t 81 parse_config(grub_file_t file, entries * entry_list) 82 { 83 char * param; 84 char * value; 85 entries * current_entry = NULL; 86 int param_id = 0; 87 int global_id = 0; 88 grub_err_t err; 89 90 for(;;) { 91 param = grub_file_getline(file); 92 if (! param) 93 return grub_errno; 94 95 if ((*param == '#') || (*param == ' ') || 96 (*param == '\t') || (*param == '\n') || 97 (*param == 0)) { 98 grub_free(param); 99 continue; 100 } 101 global_id = -1; 102 103 err = get_value(param, &value); 104 if (err) 105 return err; 106 107 param_id = check_param(param); 108 if (param_id < 0) { 109 global_id = check_global(param); 110 if (global_id < 0) { 111 grub_free(param); 112 return grub_error (GRUB_ERR_INVALID_COMMAND, N_("illumos syntax error")); 113 } 114 } 115 if (err) 116 return err; 117 if (!value[0]) 118 return grub_error (GRUB_ERR_INVALID_COMMAND, N_("illumos syntax error")); 119 if (global_id < 0) { 120 if (param_id == 0) { 121 current_entry = new_entry(value, entry_list); 122 if (! current_entry) { 123 grub_free(param); 124 return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("memory can not be allocated")); 125 } 126 } else { 127 grub_strcpy(current_entry->entry_info[param_id], value); 128 } 129 } else { 130 char line[512]; 131 switch (global_id) { 132 case 0: 133 grub_env_set("default", value); 134 break; 135 case 1: 136 grub_env_set("timeout", value); 137 break; 138 case 2: 139 grub_strcpy(line, "serial "); 140 grub_strcat(line, value); 141 grub_normal_parse_line(line, NULL); 142 break; 143 case 3: 144 grub_strcpy(line, "terminal_input "); 145 grub_strcat(line, value); 146 grub_strcat(line, "; terminal_output "); 147 grub_strcat(line, value); 148 grub_normal_parse_line(line, NULL); 149 break; 150 default: 151 break; 152 } 153 } 154 grub_free(param); 155 } 156 return 0; 157 } 158 159 static grub_err_t 160 grub_cmd_illumos_entries (grub_extcmd_context_t ctxt __attribute__ ((unused)), int argc, char **args) 161 { 162 grub_file_t file; 163 entries * menu_entries = NULL; 164 165 if (argc != 1) 166 return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); 167 168 file = grub_file_open(args[0]); 169 170 if (!file) 171 return grub_errno; 172 173 init_entries(&menu_entries); 174 175 if (parse_config(file, menu_entries) == 0) { 176 add_entries(menu_entries); 177 } 178 clear_entries(menu_entries); 179 180 grub_refresh(); 181 grub_file_close(file); 182 183 return 0; 184 } 185 186 static grub_extcmd_t illumos_entries; 187 188 GRUB_MOD_INIT(illumos_entries) 189 { 190 illumos_entries = grub_register_extcmd ("illumos_entries", grub_cmd_illumos_entries, 0, 191 N_("FILE"), N_("Define an illumos menu entries."), options); 192 } 193 194 GRUB_MOD_FINI(illumos_entries) 195 { 196 grub_unregister_extcmd (illumos_entries); 197 }