Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/networking/libiproute/rt_names.c
- Timestamp:
- Feb 25, 2011, 9:26:54 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2.9/mindi-busybox/networking/libiproute/rt_names.c
r1765 r2725 1 1 /* vi: set sw=4 ts=4: */ 2 2 /* 3 * rt_names.c rtnetlink names DB. 3 * This program is free software; you can redistribute it and/or 4 * modify it under the terms of the GNU General Public License 5 * as published by the Free Software Foundation; either version 6 * 2 of the License, or (at your option) any later version. 4 7 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License 7 * as published by the Free Software Foundation; either version 8 * 2 of the License, or (at your option) any later version. 9 * 10 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> 8 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> 11 9 */ 12 13 10 #include "libbb.h" 14 11 #include "rt_names.h" 15 12 16 static void rtnl_tab_initialize(const char *file, const char **tab, int size) 17 { 18 char buf[512]; 19 FILE *fp; 20 21 fp = fopen(file, "r"); 22 if (!fp) 23 return; 24 while (fgets(buf, sizeof(buf), fp)) { 25 char *p = buf; 26 int id; 27 char namebuf[512]; 28 29 while (*p == ' ' || *p == '\t') 30 p++; 31 if (*p == '#' || *p == '\n' || *p == 0) 32 continue; 33 if (sscanf(p, "0x%x %s\n", &id, namebuf) != 2 34 && sscanf(p, "0x%x %s #", &id, namebuf) != 2 35 && sscanf(p, "%d %s\n", &id, namebuf) != 2 36 && sscanf(p, "%d %s #", &id, namebuf) != 2 13 typedef struct rtnl_tab_t { 14 const char *cached_str; 15 unsigned cached_result; 16 const char *tab[256]; 17 } rtnl_tab_t; 18 19 static void rtnl_tab_initialize(const char *file, const char **tab) 20 { 21 char *token[2]; 22 parser_t *parser = config_open2(file, fopen_for_read); 23 24 while (config_read(parser, token, 2, 2, "# \t", PARSE_NORMAL)) { 25 unsigned id = bb_strtou(token[0], NULL, 0); 26 if (id > 256) { 27 bb_error_msg("database %s is corrupted at line %d", 28 file, parser->lineno); 29 break; 30 } 31 tab[id] = xstrdup(token[1]); 32 } 33 config_close(parser); 34 } 35 36 static int rtnl_a2n(rtnl_tab_t *tab, uint32_t *id, const char *arg, int base) 37 { 38 unsigned i; 39 40 if (tab->cached_str && strcmp(tab->cached_str, arg) == 0) { 41 *id = tab->cached_result; 42 return 0; 43 } 44 45 for (i = 0; i < 256; i++) { 46 if (tab->tab[i] 47 && strcmp(tab->tab[i], arg) == 0 37 48 ) { 38 bb_error_msg("database %s is corrupted at %s", 39 file, p); 40 return; 49 tab->cached_str = tab->tab[i]; 50 tab->cached_result = i; 51 *id = i; 52 return 0; 41 53 } 42 43 if (id < 0 || id > size) 44 continue;45 46 tab[id] = xstrdup(namebuf);47 }48 fclose(fp);49 } 50 51 52 static const char **rtnl_rtprot_tab; /* [256] */54 } 55 56 i = bb_strtou(arg, NULL, base); 57 if (i > 255) 58 return -1; 59 *id = i; 60 return 0; 61 } 62 63 64 static rtnl_tab_t *rtnl_rtprot_tab; 53 65 54 66 static void rtnl_rtprot_initialize(void) … … 69 81 "bird", 70 82 }; 71 if (rtnl_rtprot_tab) return; 72 rtnl_rtprot_tab = xzalloc(256 * sizeof(rtnl_rtprot_tab[0]));73 memcpy(rtnl_rtprot_tab, init_tab, sizeof(init_tab));74 rtnl_ tab_initialize("/etc/iproute2/rt_protos",75 rtnl_rtprot_tab, 256);76 } 77 78 79 const char* rtnl_rtprot_n2a(int id, char *buf, int len)80 { 81 if (id < 0 || id >= 256) { 82 s nprintf(buf, len, "%d", id);83 84 if (rtnl_rtprot_tab) 85 return; 86 rtnl_rtprot_tab = xzalloc(sizeof(*rtnl_rtprot_tab)); 87 memcpy(rtnl_rtprot_tab->tab, init_tab, sizeof(init_tab)); 88 rtnl_tab_initialize("/etc/iproute2/rt_protos", rtnl_rtprot_tab->tab); 89 } 90 91 const char* FAST_FUNC rtnl_rtprot_n2a(int id, char *buf) 92 { 93 if (id < 0 || id >= 256) { 94 sprintf(buf, "%d", id); 83 95 return buf; 84 96 } … … 86 98 rtnl_rtprot_initialize(); 87 99 88 if (rtnl_rtprot_tab[id]) 89 return rtnl_rtprot_tab[id]; 90 snprintf(buf, len, "%d", id); 91 return buf; 92 } 93 94 int rtnl_rtprot_a2n(uint32_t *id, char *arg) 95 { 96 static const char *cache = NULL; 97 static unsigned long res; 98 int i; 99 100 if (cache && strcmp(cache, arg) == 0) { 101 *id = res; 102 return 0; 103 } 104 100 if (rtnl_rtprot_tab->tab[id]) 101 return rtnl_rtprot_tab->tab[id]; 102 /* buf is SPRINT_BSIZE big */ 103 sprintf(buf, "%d", id); 104 return buf; 105 } 106 107 int FAST_FUNC rtnl_rtprot_a2n(uint32_t *id, char *arg) 108 { 105 109 rtnl_rtprot_initialize(); 106 107 for (i = 0; i < 256; i++) { 108 if (rtnl_rtprot_tab[i] && 109 strcmp(rtnl_rtprot_tab[i], arg) == 0) { 110 cache = rtnl_rtprot_tab[i]; 111 res = i; 112 *id = res; 113 return 0; 114 } 115 } 116 117 res = bb_strtoul(arg, NULL, 0); 118 if (errno || res > 255) 119 return -1; 120 *id = res; 121 return 0; 122 } 123 124 125 static const char **rtnl_rtscope_tab; /* [256] */ 110 return rtnl_a2n(rtnl_rtprot_tab, id, arg, 0); 111 } 112 113 114 static rtnl_tab_t *rtnl_rtscope_tab; 126 115 127 116 static void rtnl_rtscope_initialize(void) 128 117 { 129 if (rtnl_rtscope_tab) return; 130 rtnl_rtscope_tab = xzalloc(256 * sizeof(rtnl_rtscope_tab[0])); 131 rtnl_rtscope_tab[0] = "global"; 132 rtnl_rtscope_tab[255] = "nowhere"; 133 rtnl_rtscope_tab[254] = "host"; 134 rtnl_rtscope_tab[253] = "link"; 135 rtnl_rtscope_tab[200] = "site"; 136 rtnl_tab_initialize("/etc/iproute2/rt_scopes", 137 rtnl_rtscope_tab, 256); 138 } 139 140 141 const char* rtnl_rtscope_n2a(int id, char *buf, int len) 142 { 143 if (id < 0 || id >= 256) { 144 snprintf(buf, len, "%d", id); 118 if (rtnl_rtscope_tab) 119 return; 120 rtnl_rtscope_tab = xzalloc(sizeof(*rtnl_rtscope_tab)); 121 rtnl_rtscope_tab->tab[0] = "global"; 122 rtnl_rtscope_tab->tab[255] = "nowhere"; 123 rtnl_rtscope_tab->tab[254] = "host"; 124 rtnl_rtscope_tab->tab[253] = "link"; 125 rtnl_rtscope_tab->tab[200] = "site"; 126 rtnl_tab_initialize("/etc/iproute2/rt_scopes", rtnl_rtscope_tab->tab); 127 } 128 129 const char* FAST_FUNC rtnl_rtscope_n2a(int id, char *buf) 130 { 131 if (id < 0 || id >= 256) { 132 sprintf(buf, "%d", id); 145 133 return buf; 146 134 } … … 148 136 rtnl_rtscope_initialize(); 149 137 150 if (rtnl_rtscope_tab[id]) 151 return rtnl_rtscope_tab[id]; 152 snprintf(buf, len, "%d", id); 153 return buf; 154 } 155 156 int rtnl_rtscope_a2n(uint32_t *id, char *arg) 157 { 158 static const char *cache = NULL; 159 static unsigned long res; 160 int i; 161 162 if (cache && strcmp(cache, arg) == 0) { 163 *id = res; 164 return 0; 165 } 166 138 if (rtnl_rtscope_tab->tab[id]) 139 return rtnl_rtscope_tab->tab[id]; 140 /* buf is SPRINT_BSIZE big */ 141 sprintf(buf, "%d", id); 142 return buf; 143 } 144 145 int FAST_FUNC rtnl_rtscope_a2n(uint32_t *id, char *arg) 146 { 167 147 rtnl_rtscope_initialize(); 168 169 for (i = 0; i < 256; i++) { 170 if (rtnl_rtscope_tab[i] && 171 strcmp(rtnl_rtscope_tab[i], arg) == 0) { 172 cache = rtnl_rtscope_tab[i]; 173 res = i; 174 *id = res; 175 return 0; 176 } 177 } 178 179 res = bb_strtoul(arg, NULL, 0); 180 if (errno || res > 255) 181 return -1; 182 *id = res; 183 return 0; 184 } 185 186 187 static const char **rtnl_rtrealm_tab; /* [256] */ 148 return rtnl_a2n(rtnl_rtscope_tab, id, arg, 0); 149 } 150 151 152 static rtnl_tab_t *rtnl_rtrealm_tab; 188 153 189 154 static void rtnl_rtrealm_initialize(void) 190 155 { 191 156 if (rtnl_rtrealm_tab) return; 192 rtnl_rtrealm_tab = xzalloc(256 * sizeof(rtnl_rtrealm_tab[0])); 193 rtnl_rtrealm_tab[0] = "unknown"; 194 rtnl_tab_initialize("/etc/iproute2/rt_realms", 195 rtnl_rtrealm_tab, 256); 196 } 197 198 199 int rtnl_rtrealm_a2n(uint32_t *id, char *arg) 200 { 201 static const char *cache = NULL; 202 static unsigned long res; 203 int i; 204 205 if (cache && strcmp(cache, arg) == 0) { 206 *id = res; 207 return 0; 208 } 209 157 rtnl_rtrealm_tab = xzalloc(sizeof(*rtnl_rtrealm_tab)); 158 rtnl_rtrealm_tab->tab[0] = "unknown"; 159 rtnl_tab_initialize("/etc/iproute2/rt_realms", rtnl_rtrealm_tab->tab); 160 } 161 162 int FAST_FUNC rtnl_rtrealm_a2n(uint32_t *id, char *arg) 163 { 210 164 rtnl_rtrealm_initialize(); 211 212 for (i = 0; i < 256; i++) { 213 if (rtnl_rtrealm_tab[i] && 214 strcmp(rtnl_rtrealm_tab[i], arg) == 0) { 215 cache = rtnl_rtrealm_tab[i]; 216 res = i; 217 *id = res; 218 return 0; 219 } 220 } 221 222 res = bb_strtoul(arg, NULL, 0); 223 if (errno || res > 255) 224 return -1; 225 *id = res; 226 return 0; 165 return rtnl_a2n(rtnl_rtrealm_tab, id, arg, 0); 227 166 } 228 167 229 168 #if ENABLE_FEATURE_IP_RULE 230 const char* rtnl_rtrealm_n2a(int id, char *buf, int len)231 { 232 if (id < 0 || id >= 256) { 233 s nprintf(buf, len, "%d", id);169 const char* FAST_FUNC rtnl_rtrealm_n2a(int id, char *buf) 170 { 171 if (id < 0 || id >= 256) { 172 sprintf(buf, "%d", id); 234 173 return buf; 235 174 } … … 237 176 rtnl_rtrealm_initialize(); 238 177 239 if (rtnl_rtrealm_tab[id]) 240 return rtnl_rtrealm_tab[id]; 241 snprintf(buf, len, "%d", id); 178 if (rtnl_rtrealm_tab->tab[id]) 179 return rtnl_rtrealm_tab->tab[id]; 180 /* buf is SPRINT_BSIZE big */ 181 sprintf(buf, "%d", id); 242 182 return buf; 243 183 } … … 245 185 246 186 247 static const char **rtnl_rtdsfield_tab; /* [256] */187 static rtnl_tab_t *rtnl_rtdsfield_tab; 248 188 249 189 static void rtnl_rtdsfield_initialize(void) 250 190 { 251 191 if (rtnl_rtdsfield_tab) return; 252 rtnl_rtdsfield_tab = xzalloc(256 * sizeof(rtnl_rtdsfield_tab[0])); 253 rtnl_rtdsfield_tab[0] = "0"; 254 rtnl_tab_initialize("/etc/iproute2/rt_dsfield", 255 rtnl_rtdsfield_tab, 256); 256 } 257 258 259 const char * rtnl_dsfield_n2a(int id, char *buf, int len) 260 { 261 if (id < 0 || id >= 256) { 262 snprintf(buf, len, "%d", id); 192 rtnl_rtdsfield_tab = xzalloc(sizeof(*rtnl_rtdsfield_tab)); 193 rtnl_rtdsfield_tab->tab[0] = "0"; 194 rtnl_tab_initialize("/etc/iproute2/rt_dsfield", rtnl_rtdsfield_tab->tab); 195 } 196 197 const char* FAST_FUNC rtnl_dsfield_n2a(int id, char *buf) 198 { 199 if (id < 0 || id >= 256) { 200 sprintf(buf, "%d", id); 263 201 return buf; 264 202 } … … 266 204 rtnl_rtdsfield_initialize(); 267 205 268 if (rtnl_rtdsfield_tab[id]) 269 return rtnl_rtdsfield_tab[id]; 270 snprintf(buf, len, "0x%02x", id); 271 return buf; 272 } 273 274 275 int rtnl_dsfield_a2n(uint32_t *id, char *arg) 276 { 277 static const char *cache = NULL; 278 static unsigned long res; 279 int i; 280 281 if (cache && strcmp(cache, arg) == 0) { 282 *id = res; 283 return 0; 284 } 285 206 if (rtnl_rtdsfield_tab->tab[id]) 207 return rtnl_rtdsfield_tab->tab[id]; 208 /* buf is SPRINT_BSIZE big */ 209 sprintf(buf, "0x%02x", id); 210 return buf; 211 } 212 213 int FAST_FUNC rtnl_dsfield_a2n(uint32_t *id, char *arg) 214 { 286 215 rtnl_rtdsfield_initialize(); 287 288 for (i = 0; i < 256; i++) { 289 if (rtnl_rtdsfield_tab[i] && 290 strcmp(rtnl_rtdsfield_tab[i], arg) == 0) { 291 cache = rtnl_rtdsfield_tab[i]; 292 res = i; 293 *id = res; 294 return 0; 295 } 296 } 297 298 res = bb_strtoul(arg, NULL, 16); 299 if (errno || res > 255) 300 return -1; 301 *id = res; 302 return 0; 216 return rtnl_a2n(rtnl_rtdsfield_tab, id, arg, 16); 303 217 } 304 218 305 219 306 220 #if ENABLE_FEATURE_IP_RULE 307 static const char **rtnl_rttable_tab; /* [256] */221 static rtnl_tab_t *rtnl_rttable_tab; 308 222 309 223 static void rtnl_rttable_initialize(void) 310 224 { 311 225 if (rtnl_rtdsfield_tab) return; 312 rtnl_rttable_tab = xzalloc(256 * sizeof(rtnl_rttable_tab[0])); 313 rtnl_rttable_tab[0] = "unspec"; 314 rtnl_rttable_tab[255] = "local"; 315 rtnl_rttable_tab[254] = "main"; 316 rtnl_rttable_tab[253] = "default"; 317 rtnl_tab_initialize("/etc/iproute2/rt_tables", rtnl_rttable_tab, 256); 318 } 319 320 321 const char *rtnl_rttable_n2a(int id, char *buf, int len) 322 { 323 if (id < 0 || id >= 256) { 324 snprintf(buf, len, "%d", id); 226 rtnl_rttable_tab = xzalloc(sizeof(*rtnl_rttable_tab)); 227 rtnl_rttable_tab->tab[0] = "unspec"; 228 rtnl_rttable_tab->tab[255] = "local"; 229 rtnl_rttable_tab->tab[254] = "main"; 230 rtnl_rttable_tab->tab[253] = "default"; 231 rtnl_tab_initialize("/etc/iproute2/rt_tables", rtnl_rttable_tab->tab); 232 } 233 234 const char* FAST_FUNC rtnl_rttable_n2a(int id, char *buf) 235 { 236 if (id < 0 || id >= 256) { 237 sprintf(buf, "%d", id); 325 238 return buf; 326 239 } … … 328 241 rtnl_rttable_initialize(); 329 242 330 if (rtnl_rttable_tab[id]) 331 return rtnl_rttable_tab[id]; 332 snprintf(buf, len, "%d", id); 333 return buf; 334 } 335 336 int rtnl_rttable_a2n(uint32_t * id, char *arg) 337 { 338 static char *cache = NULL; 339 static unsigned long res; 340 int i; 341 342 if (cache && strcmp(cache, arg) == 0) { 343 *id = res; 344 return 0; 345 } 346 243 if (rtnl_rttable_tab->tab[id]) 244 return rtnl_rttable_tab->tab[id]; 245 /* buf is SPRINT_BSIZE big */ 246 sprintf(buf, "%d", id); 247 return buf; 248 } 249 250 int FAST_FUNC rtnl_rttable_a2n(uint32_t *id, char *arg) 251 { 347 252 rtnl_rttable_initialize(); 348 349 for (i = 0; i < 256; i++) { 350 if (rtnl_rttable_tab[i] && strcmp(rtnl_rttable_tab[i], arg) == 0) { 351 cache = (char*)rtnl_rttable_tab[i]; 352 res = i; 353 *id = res; 354 return 0; 355 } 356 } 357 358 i = bb_strtoul(arg, NULL, 0); 359 if (errno || i > 255) 360 return -1; 361 *id = i; 362 return 0; 253 return rtnl_a2n(rtnl_rttable_tab, id, arg, 0); 363 254 } 364 255
Note:
See TracChangeset
for help on using the changeset viewer.