Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */ 2 : : 3 : : #include <errno.h> 4 : : #include <netinet/in.h> 5 : : 6 : : #include "alloc-util.h" 7 : : #include "ip-protocol-list.h" 8 : : #include "macro.h" 9 : : #include "parse-util.h" 10 : : #include "string-util.h" 11 : : 12 : : static const struct ip_protocol_name* lookup_ip_protocol(register const char *str, register GPERF_LEN_TYPE len); 13 : : 14 : : #include "ip-protocol-from-name.h" 15 : : #include "ip-protocol-to-name.h" 16 : : 17 : 80 : const char *ip_protocol_to_name(int id) { 18 : : 19 [ + + ]: 80 : if (id < 0) 20 : 16 : return NULL; 21 : : 22 [ + + ]: 64 : if ((size_t) id >= ELEMENTSOF(ip_protocol_names)) 23 : 16 : return NULL; 24 : : 25 : 48 : return ip_protocol_names[id]; 26 : : } 27 : : 28 : 100 : int ip_protocol_from_name(const char *name) { 29 : : const struct ip_protocol_name *sc; 30 : : 31 [ - + ]: 100 : assert(name); 32 : : 33 : 100 : sc = lookup_ip_protocol(name, strlen(name)); 34 [ + + ]: 100 : if (!sc) 35 : 56 : return -EINVAL; 36 : : 37 : 44 : return sc->id; 38 : : } 39 : : 40 : 68 : int parse_ip_protocol(const char *s) { 41 : 68 : _cleanup_free_ char *str = NULL; 42 : : int i, r; 43 : : 44 [ - + ]: 68 : assert(s); 45 : : 46 [ + + ]: 68 : if (isempty(s)) 47 : 4 : return IPPROTO_IP; 48 : : 49 : : /* Do not use strdupa() here, as the input string may come from * 50 : : * command line or config files. */ 51 : 64 : str = strdup(s); 52 [ - + ]: 64 : if (!str) 53 : 0 : return -ENOMEM; 54 : : 55 : 64 : i = ip_protocol_from_name(ascii_strlower(str)); 56 [ + + ]: 64 : if (i >= 0) 57 : 20 : return i; 58 : : 59 : 44 : r = safe_atoi(str, &i); 60 [ + + ]: 44 : if (r < 0) 61 : 4 : return r; 62 : : 63 [ + + ]: 40 : if (!ip_protocol_to_name(i)) 64 : 24 : return -EINVAL; 65 : : 66 : 16 : return i; 67 : : }