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