1 /*	$FreeBSD$	*/
2 
3 /*
4  * Copyright (C) 1993-2001 by Darren Reed.
5  *
6  * See the IPFILTER.LICENCE file for details on licencing.
7  *
8  * $Id: icmpcode.c,v 1.7.2.1 2004/12/09 19:41:20 darrenr Exp $
9  */
10 
11 #include <ctype.h>
12 
13 #include "ipf.h"
14 
15 #ifndef	MIN
16 # define	MIN(a,b)	((a) > (b) ? (b) : (a))
17 #endif
18 
19 
20 char	*icmpcodes[MAX_ICMPCODE + 1] = {
21 	"net-unr", "host-unr", "proto-unr", "port-unr", "needfrag", "srcfail",
22 	"net-unk", "host-unk", "isolate", "net-prohib", "host-prohib",
23 	"net-tos", "host-tos", "filter-prohib", "host-preced", "preced-cutoff",
24 	NULL };
25 
26 /*
27  * Return the number for the associated ICMP unreachable code.
28  */
29 int icmpcode(str)
30 char *str;
31 {
32 	char	*s;
33 	int	i, len;
34 
35 	if ((s = strrchr(str, ')')))
36 		*s = '\0';
37 	if (ISDIGIT(*str)) {
38 		if (!ratoi(str, &i, 0, 255))
39 			return -1;
40 		else
41 			return i;
42 	}
43 	len = strlen(str);
44 	for (i = 0; icmpcodes[i]; i++)
45 		if (!strncasecmp(str, icmpcodes[i], MIN(len,
46 				 strlen(icmpcodes[i])) ))
47 			return i;
48 	return -1;
49 }
50