xref: /aosp_15_r20/external/iproute2/lib/inet_proto.c (revision de1e4e894b0c224df933550f0afdecc354b238c4)
1*de1e4e89SAndroid Build Coastguard Worker /*
2*de1e4e89SAndroid Build Coastguard Worker  * inet_proto.c
3*de1e4e89SAndroid Build Coastguard Worker  *
4*de1e4e89SAndroid Build Coastguard Worker  *		This program is free software; you can redistribute it and/or
5*de1e4e89SAndroid Build Coastguard Worker  *		modify it under the terms of the GNU General Public License
6*de1e4e89SAndroid Build Coastguard Worker  *		as published by the Free Software Foundation; either version
7*de1e4e89SAndroid Build Coastguard Worker  *		2 of the License, or (at your option) any later version.
8*de1e4e89SAndroid Build Coastguard Worker  *
9*de1e4e89SAndroid Build Coastguard Worker  * Authors:	Alexey Kuznetsov, <[email protected]>
10*de1e4e89SAndroid Build Coastguard Worker  *
11*de1e4e89SAndroid Build Coastguard Worker  */
12*de1e4e89SAndroid Build Coastguard Worker 
13*de1e4e89SAndroid Build Coastguard Worker #include <stdio.h>
14*de1e4e89SAndroid Build Coastguard Worker #include <stdlib.h>
15*de1e4e89SAndroid Build Coastguard Worker #include <unistd.h>
16*de1e4e89SAndroid Build Coastguard Worker #include <syslog.h>
17*de1e4e89SAndroid Build Coastguard Worker #include <fcntl.h>
18*de1e4e89SAndroid Build Coastguard Worker #include <sys/socket.h>
19*de1e4e89SAndroid Build Coastguard Worker #include <netinet/in.h>
20*de1e4e89SAndroid Build Coastguard Worker #include <netdb.h>
21*de1e4e89SAndroid Build Coastguard Worker #include <string.h>
22*de1e4e89SAndroid Build Coastguard Worker 
23*de1e4e89SAndroid Build Coastguard Worker #include "rt_names.h"
24*de1e4e89SAndroid Build Coastguard Worker #include "utils.h"
25*de1e4e89SAndroid Build Coastguard Worker 
inet_proto_n2a(int proto,char * buf,int len)26*de1e4e89SAndroid Build Coastguard Worker const char *inet_proto_n2a(int proto, char *buf, int len)
27*de1e4e89SAndroid Build Coastguard Worker {
28*de1e4e89SAndroid Build Coastguard Worker 	static char *ncache;
29*de1e4e89SAndroid Build Coastguard Worker 	static int icache = -1;
30*de1e4e89SAndroid Build Coastguard Worker 	struct protoent *pe;
31*de1e4e89SAndroid Build Coastguard Worker 
32*de1e4e89SAndroid Build Coastguard Worker 	if (proto == icache)
33*de1e4e89SAndroid Build Coastguard Worker 		return ncache;
34*de1e4e89SAndroid Build Coastguard Worker 
35*de1e4e89SAndroid Build Coastguard Worker 	pe = getprotobynumber(proto);
36*de1e4e89SAndroid Build Coastguard Worker 	if (pe) {
37*de1e4e89SAndroid Build Coastguard Worker 		if (icache != -1)
38*de1e4e89SAndroid Build Coastguard Worker 			free(ncache);
39*de1e4e89SAndroid Build Coastguard Worker 		icache = proto;
40*de1e4e89SAndroid Build Coastguard Worker 		ncache = strdup(pe->p_name);
41*de1e4e89SAndroid Build Coastguard Worker 		strlcpy(buf, pe->p_name, len);
42*de1e4e89SAndroid Build Coastguard Worker 		return buf;
43*de1e4e89SAndroid Build Coastguard Worker 	}
44*de1e4e89SAndroid Build Coastguard Worker 	snprintf(buf, len, "ipproto-%d", proto);
45*de1e4e89SAndroid Build Coastguard Worker 	return buf;
46*de1e4e89SAndroid Build Coastguard Worker }
47*de1e4e89SAndroid Build Coastguard Worker 
inet_proto_a2n(const char * buf)48*de1e4e89SAndroid Build Coastguard Worker int inet_proto_a2n(const char *buf)
49*de1e4e89SAndroid Build Coastguard Worker {
50*de1e4e89SAndroid Build Coastguard Worker 	static char *ncache;
51*de1e4e89SAndroid Build Coastguard Worker 	static int icache = -1;
52*de1e4e89SAndroid Build Coastguard Worker 	struct protoent *pe;
53*de1e4e89SAndroid Build Coastguard Worker 	__u8 ret;
54*de1e4e89SAndroid Build Coastguard Worker 
55*de1e4e89SAndroid Build Coastguard Worker 	if (icache != -1 && strcmp(ncache, buf) == 0)
56*de1e4e89SAndroid Build Coastguard Worker 		return icache;
57*de1e4e89SAndroid Build Coastguard Worker 
58*de1e4e89SAndroid Build Coastguard Worker 	if (!get_u8(&ret, buf, 10))
59*de1e4e89SAndroid Build Coastguard Worker 		return ret;
60*de1e4e89SAndroid Build Coastguard Worker 
61*de1e4e89SAndroid Build Coastguard Worker 	pe = getprotobyname(buf);
62*de1e4e89SAndroid Build Coastguard Worker 	if (pe) {
63*de1e4e89SAndroid Build Coastguard Worker 		if (icache != -1)
64*de1e4e89SAndroid Build Coastguard Worker 			free(ncache);
65*de1e4e89SAndroid Build Coastguard Worker 		icache = pe->p_proto;
66*de1e4e89SAndroid Build Coastguard Worker 		ncache = strdup(pe->p_name);
67*de1e4e89SAndroid Build Coastguard Worker 		return pe->p_proto;
68*de1e4e89SAndroid Build Coastguard Worker 	}
69*de1e4e89SAndroid Build Coastguard Worker 	return -1;
70*de1e4e89SAndroid Build Coastguard Worker }
71