Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */ 2 : : #include "alloc-util.h" 3 : : #include "naming-scheme.h" 4 : : #include "proc-cmdline.h" 5 : : #include "string-util.h" 6 : : 7 : : static const NamingScheme naming_schemes[] = { 8 : : { "v238", NAMING_V238 }, 9 : : { "v239", NAMING_V239 }, 10 : : { "v240", NAMING_V240 }, 11 : : { "v241", NAMING_V241 }, 12 : : { "v243", NAMING_V243 }, 13 : : /* … add more schemes here, as the logic to name devices is updated … */ 14 : : }; 15 : : 16 : 0 : static const NamingScheme* naming_scheme_from_name(const char *name) { 17 : : size_t i; 18 : : 19 [ # # ]: 0 : if (streq(name, "latest")) 20 : 0 : return naming_schemes + ELEMENTSOF(naming_schemes) - 1; 21 : : 22 [ # # ]: 0 : for (i = 0; i < ELEMENTSOF(naming_schemes); i++) 23 [ # # ]: 0 : if (streq(naming_schemes[i].name, name)) 24 : 0 : return naming_schemes + i; 25 : : 26 : 0 : return NULL; 27 : : } 28 : : 29 : 0 : const NamingScheme* naming_scheme(void) { 30 : : static const NamingScheme *cache = NULL; 31 : 0 : _cleanup_free_ char *buffer = NULL; 32 : : const char *e, *k; 33 : : 34 [ # # ]: 0 : if (cache) 35 : 0 : return cache; 36 : : 37 : : /* Acquire setting from the kernel command line */ 38 : 0 : (void) proc_cmdline_get_key("net.naming-scheme", 0, &buffer); 39 : : 40 : : /* Also acquire it from an env var */ 41 : 0 : e = getenv("NET_NAMING_SCHEME"); 42 [ # # ]: 0 : if (e) { 43 [ # # ]: 0 : if (*e == ':') { 44 : : /* If prefixed with ':' the kernel cmdline takes precedence */ 45 [ # # ]: 0 : k = buffer ?: e + 1; 46 : : } else 47 : 0 : k = e; /* Otherwise the env var takes precedence */ 48 : : } else 49 : 0 : k = buffer; 50 : : 51 [ # # ]: 0 : if (k) { 52 : 0 : cache = naming_scheme_from_name(k); 53 [ # # ]: 0 : if (cache) { 54 [ # # ]: 0 : log_info("Using interface naming scheme '%s'.", cache->name); 55 : 0 : return cache; 56 : : } 57 : : 58 [ # # ]: 0 : log_warning("Unknown interface naming scheme '%s' requested, ignoring.", k); 59 : : } 60 : : 61 : 0 : cache = naming_scheme_from_name(DEFAULT_NET_NAMING_SCHEME); 62 [ # # ]: 0 : assert(cache); 63 [ # # ]: 0 : log_info("Using default interface naming scheme '%s'.", cache->name); 64 : : 65 : 0 : return cache; 66 : : }