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