blob: 826429381603ddd64303269947527e050fa01ba2 [file] [log] [blame]
/* Modifications were made by Cisco Systems, Inc. on or before Wed Nov 30 13:28:05 PST 2011
* Helpers for netfiler modules. This file provides implementations for basic
* functions such as strncasecmp(), etc.
*
* gcc will warn for defined but unused functions, so we only include the
* functions requested. The following macros are used:
* NF_NEED_STRNCASECMP nf_strncasecmp()
* NF_NEED_STRTOU16 nf_strtou16()
* NF_NEED_STRTOU32 nf_strtou32()
*/
#ifndef _NETFILTER_HELPERS_H
#define _NETFILTER_HELPERS_H
/* Only include these functions for kernel code. */
#ifdef __KERNEL__
#include <linux/ctype.h>
#define iseol(c) ( (c) == '\r' || (c) == '\n' )
/*
* The standard strncasecmp()
*/
#ifdef NF_NEED_STRNCASECMP
static int
nf_strncasecmp(const char* s1, const char* s2, u_int32_t len)
{
if (s1 == NULL || s2 == NULL)
{
if (s1 == NULL && s2 == NULL)
{
return 0;
}
return (s1 == NULL) ? -1 : 1;
}
while (len > 0 && tolower(*s1) == tolower(*s2))
{
len--;
s1++;
s2++;
}
return ( (len == 0) ? 0 : (tolower(*s1) - tolower(*s2)) );
}
#endif /* NF_NEED_STRNCASECMP */
/*
* Parse a string containing a 16-bit unsigned integer.
* Returns the number of chars used, or zero if no number is found.
*/
#ifdef NF_NEED_STRTOU16
static int
nf_strtou16(const char* pbuf, u_int16_t* pval)
{
int n = 0;
*pval = 0;
while (isdigit(pbuf[n]))
{
*pval = (*pval * 10) + (pbuf[n] - '0');
n++;
}
return n;
}
#endif /* NF_NEED_STRTOU16 */
/*
* Parse a string containing a 32-bit unsigned integer.
* Returns the number of chars used, or zero if no number is found.
*/
#ifdef NF_NEED_STRTOU32
static int
nf_strtou32(const char* pbuf, u_int32_t* pval)
{
int n = 0;
*pval = 0;
while (pbuf[n] >= '0' && pbuf[n] <= '9')
{
*pval = (*pval * 10) + (pbuf[n] - '0');
n++;
}
return n;
}
#endif /* NF_NEED_STRTOU32 */
/*
* Given a buffer and length, advance to the next line and mark the current
* line.
*/
#ifdef NF_NEED_NEXTLINE
static int
nf_nextline(char* p, uint len, uint* poff, uint* plineoff, uint* plinelen)
{
uint off = *poff;
uint physlen = 0;
if (off >= len)
{
return 0;
}
while (p[off] != '\n')
{
if (len-off <= 1)
{
return 0;
}
physlen++;
off++;
}
/* if we saw a crlf, physlen needs adjusted */
if (physlen > 0 && p[off] == '\n' && p[off-1] == '\r')
{
physlen--;
}
/* advance past the newline */
off++;
*plineoff = *poff;
*plinelen = physlen;
*poff = off;
return 1;
}
#endif /* NF_NEED_NEXTLINE */
#endif /* __KERNEL__ */
#endif /* _NETFILTER_HELPERS_H */