/* Modifications were made by Cisco Systems, Inc. on or before Wed Nov 30 13:28:05 PST 2011
 * MIME functions for netfilter modules.  This file provides implementations
 * for basic MIME parsing.  MIME headers are used in many protocols, such as
 * HTTP, RTSP, SIP, etc.
 *
 * gcc will warn for defined but unused functions, so we only include the
 * functions requested.  The following macros are used:
 *   NF_NEED_MIME_NEXTLINE      nf_mime_nextline()
 */
#ifndef _NETFILTER_MIME_H
#define _NETFILTER_MIME_H

/* Only include these functions for kernel code. */
#ifdef __KERNEL__

#include <linux/ctype.h>

/*
 * Given a buffer and length, advance to the next line and mark the current
 * line.  If the current line is empty, *plinelen will be set to zero.  If
 * not, it will be set to the actual line length (including CRLF).
 *
 * 'line' in this context means logical line (includes LWS continuations).
 * Returns 1 on success, 0 on failure.
 */
#ifdef NF_NEED_MIME_NEXTLINE
static int
nf_mime_nextline(char* p, uint len, uint* poff, uint* plineoff, uint* plinelen)
{
    uint    off = *poff;
    uint    physlen = 0;
    int     is_first_line = 1;

    if (off >= len)
    {
        return 0;
    }

    do
    {
        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++;

        /* check for an empty line */
        if (physlen == 0)
        {
            break;
        }

        /* check for colon on the first physical line */
        if (is_first_line)
        {
            is_first_line = 0;
            if (memchr(p+(*poff), ':', physlen) == NULL)
            {
                return 0;
            }
        }
    }
    while (p[off] == ' ' || p[off] == '\t');

    *plineoff = *poff;
    *plinelen = (physlen == 0) ? 0 : (off - *poff);
    *poff = off;

    return 1;
}
#endif /* NF_NEED_MIME_NEXTLINE */

#endif /* __KERNEL__ */

#endif /* _NETFILTER_MIME_H */
