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