1 /* 2 * Copyright (c) 2010 The DragonFly Project. All rights reserved. 3 * 4 * This code is derived from software contributed to The DragonFly Project 5 * by Matthew Dillon <dillon@backplane.com> 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * 3. Neither the name of The DragonFly Project nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific, prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 */ 34 35 #include <stand.h> 36 #include <string.h> 37 #include "bootstrap.h" 38 #include "dloader.h" 39 40 dvar_t dvbase; 41 dvar_t *dvlastp = &dvbase; 42 43 dvar_t 44 dvar_get(const char *name) 45 { 46 dvar_t var; 47 48 for (var = dvbase; var; var = var->next) { 49 if (strcmp(name, var->name) == 0) 50 return(var); 51 } 52 return(NULL); 53 } 54 55 void 56 dvar_set(const char *name, char **data, int count) 57 { 58 dvar_t var; 59 60 for (var = dvbase; var; var = var->next) { 61 if (strcmp(name, var->name) == 0) 62 break; 63 } 64 if (var == NULL) { 65 var = malloc(sizeof(*var) + strlen(name) + 1); 66 var->name = (char *)(void *)(var + 1); 67 strcpy(var->name, name); 68 var->next = NULL; 69 *dvlastp = var; 70 dvlastp = &var->next; 71 } else { 72 while (--var->count >= 0) 73 free(var->data[var->count]); 74 free(var->data); 75 /* var->data = NULL; not needed */ 76 } 77 var->count = count; 78 var->data = malloc(sizeof(char *) * (count + 1)); 79 var->data[count] = NULL; 80 while (--count >= 0) 81 var->data[count] = strdup(data[count]); 82 } 83 84 dvar_t 85 dvar_copy(dvar_t ovar) 86 { 87 dvar_t var; 88 int count; 89 90 var = malloc(sizeof(*var)); 91 bzero(var, sizeof(*var)); 92 count = ovar->count; 93 94 var->count = count; 95 var->data = malloc(sizeof(char *) * (count + 1)); 96 var->data[count] = NULL; 97 while (--count >= 0) 98 var->data[count] = strdup(ovar->data[count]); 99 return (var); 100 } 101 102 void 103 dvar_unset(const char *name) 104 { 105 dvar_t *lastp; 106 dvar_t var; 107 char *p; 108 109 lastp = &dvbase; 110 if ((p = strchr(name, '*')) != NULL) { 111 while ((var = *lastp) != NULL) { 112 if (strlen(var->name) >= p - name && 113 strncmp(var->name, name, p - name) == 0) { 114 dvar_free(lastp); 115 } else { 116 lastp = &var->next; 117 } 118 } 119 } else { 120 while ((var = *lastp) != NULL) { 121 if (strcmp(name, var->name) == 0) { 122 dvar_free(lastp); 123 break; 124 } 125 lastp = &var->next; 126 } 127 } 128 } 129 130 dvar_t 131 dvar_first(void) 132 { 133 return(dvbase); 134 } 135 136 dvar_t 137 dvar_next(dvar_t var) 138 { 139 return(var->next); 140 } 141 142 dvar_t * 143 dvar_firstp(void) 144 { 145 return(&dvbase); 146 } 147 148 dvar_t * 149 dvar_nextp(dvar_t var) 150 { 151 return(&var->next); 152 } 153 154 void 155 dvar_free(dvar_t *lastp) 156 { 157 dvar_t dvar = *lastp; 158 159 if (dvlastp == &dvar->next) 160 dvlastp = lastp; 161 *lastp = dvar->next; 162 while (--dvar->count >= 0) 163 free(dvar->data[dvar->count]); 164 free(dvar->data); 165 free(dvar); 166 } 167 168 int 169 dvar_istrue(dvar_t var) 170 { 171 int retval = 0; 172 173 if (var != NULL && (strcasecmp(var->data[0], "yes") == 0 || 174 strcasecmp(var->data[0], "true") == 0 || 175 strcasecmp(var->data[0], "on") == 0 || 176 strcasecmp(var->data[0], "1") == 0)) 177 retval = 1; 178 179 return (retval); 180 } 181