Qsmtp  0.37
Macros | Functions | Variables
data.c File Reference

receive and queue message data More...

#include <qsmtpd/qsdata.h>
#include <fmt.h>
#include <log.h>
#include <netio.h>
#include <qsmtpd/antispam.h>
#include <qsmtpd/qsmtpd.h>
#include <qsmtpd/queue.h>
#include <qsmtpd/syntax.h>
#include <tls.h>
#include <version.h>
#include <errno.h>
#include <openssl/ssl.h>
#include <string.h>
#include <strings.h>
#include <sys/time.h>
#include <sys/uio.h>
#include <syslog.h>
#include <time.h>
#include <unistd.h>

Macros

#define _STD_SOURCE
 
#define _GNU_SOURCE
 
#define _NETBSD_SOURCE
 
#define MAXHOPS   100 /* maximum number of "Received:" lines allowed in a mail (loop prevention) */
 
#define WRITE(buf, len)
 
#define WRITEL(str)   WRITE(str, strlen(str))
 
#define WRITE(buf, len)
 
#define WRITEVEC(vec, cnt, len)
 
#define LOG_BRACES   "] ("
 
#define HEADER_HAS_DATE   0x1
 
#define HEADER_HAS_FROM   0x2
 
#define HEADER_HAS_MSGID   0x4
 

Functions

static void two_digit (char *buf, int num)
 
static void date822 (char *buf)
 
static int write_received (const int chunked)
 write Received header line More...
 
static int check_rfc822_headers (unsigned int *headerflags, const char **hdrname)
 check if header lines violate RfC822 More...
 
static void log_recips (const char *reason1, const char *reason2, const char *reason3)
 
int smtp_data (void)
 

Variables

size_t maxbytes
 
static char datebuf [35] = ">; "
 
static const char * loop_logmsg = "mail loop}"
 
static const char * loop_netmsg = "554 5.4.6 too many hops, this message is looping"
 
static unsigned long msgsize
 

Detailed Description

receive and queue message data

Macro Definition Documentation

◆ WRITE [1/2]

#define WRITE (   buf,
  len 
)
Value:
do { \
wdata[wpos].iov_base = (void*)(buf); \
wdata[wpos].iov_len = (len); \
wlen += wdata[wpos].iov_len; \
wpos++; \
} while (0)

◆ WRITE [2/2]

#define WRITE (   buf,
  len 
)
Value:
do { \
ssize_t _wlen = (len); \
ssize_t _wret = write(queuefd_data, (buf), _wlen); \
if (_wret != _wlen) { \
if (_wret >= 0) \
errno = EPIPE; \
goto err_write; \
} \
} while (0)

◆ WRITEVEC

#define WRITEVEC (   vec,
  cnt,
  len 
)
Value:
do { \
ssize_t wret = writev(queuefd_data, (vec), (cnt)); \
if (wret != (ssize_t)(len)) { \
if (wret >= 0) \
errno = EPIPE; \
goto err_write; \
} \
} while (0)

Function Documentation

◆ check_rfc822_headers()

static int check_rfc822_headers ( unsigned int *  headerflags,
const char **  hdrname 
)
static

check if header lines violate RfC822

Parameters
headerflagsflags which headers were already found
hdrnamethe header found on error
Returns
if processing should continue
Return values
0nothing special found
1a known header was found
-2a duplicate header was found (hdrname is set)
-8unencoded 8 bit data was found

◆ date822()

static void date822 ( char *  buf)
static

write RfC822 date information to buffer

Parameters
bufbuffer to store string in, must have at least 32 bytes free

exactly 31 bytes in buffer are filled, it will not be 0-terminated

◆ smtp_data()

int smtp_data ( void  )

handle DATA command and store data into queue

Returns
0 on success, else error code

◆ write_received()

static int write_received ( const int  chunked)
static

write Received header line

Parameters
chunkedif message was transferred using BDAT
queuefd_data
int queuefd_data
Definition: queue.c:24