icmpcode.c revision 145510
1145510Sdarrenr/*	$NetBSD$	*/
2145510Sdarrenr
3145510Sdarrenr/*
4145510Sdarrenr * Copyright (C) 1993-2001 by Darren Reed.
5145510Sdarrenr *
6145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing.
7145510Sdarrenr *
8145510Sdarrenr * Id: icmpcode.c,v 1.7.2.1 2004/12/09 19:41:20 darrenr Exp
9145510Sdarrenr */
10145510Sdarrenr
11145510Sdarrenr#include <ctype.h>
12145510Sdarrenr
13145510Sdarrenr#include "ipf.h"
14145510Sdarrenr
15145510Sdarrenr#ifndef	MIN
16145510Sdarrenr# define	MIN(a,b)	((a) > (b) ? (b) : (a))
17145510Sdarrenr#endif
18145510Sdarrenr
19145510Sdarrenr
20145510Sdarrenrchar	*icmpcodes[MAX_ICMPCODE + 1] = {
21145510Sdarrenr	"net-unr", "host-unr", "proto-unr", "port-unr", "needfrag", "srcfail",
22145510Sdarrenr	"net-unk", "host-unk", "isolate", "net-prohib", "host-prohib",
23145510Sdarrenr	"net-tos", "host-tos", "filter-prohib", "host-preced", "preced-cutoff",
24145510Sdarrenr	NULL };
25145510Sdarrenr
26145510Sdarrenr/*
27145510Sdarrenr * Return the number for the associated ICMP unreachable code.
28145510Sdarrenr */
29145510Sdarrenrint icmpcode(str)
30145510Sdarrenrchar *str;
31145510Sdarrenr{
32145510Sdarrenr	char	*s;
33145510Sdarrenr	int	i, len;
34145510Sdarrenr
35145510Sdarrenr	if ((s = strrchr(str, ')')))
36145510Sdarrenr		*s = '\0';
37145510Sdarrenr	if (ISDIGIT(*str)) {
38145510Sdarrenr		if (!ratoi(str, &i, 0, 255))
39145510Sdarrenr			return -1;
40145510Sdarrenr		else
41145510Sdarrenr			return i;
42145510Sdarrenr	}
43145510Sdarrenr	len = strlen(str);
44145510Sdarrenr	for (i = 0; icmpcodes[i]; i++)
45145510Sdarrenr		if (!strncasecmp(str, icmpcodes[i], MIN(len,
46145510Sdarrenr				 strlen(icmpcodes[i])) ))
47145510Sdarrenr			return i;
48145510Sdarrenr	return -1;
49145510Sdarrenr}
50