Qsmtp
0.30dev
|
functions for network I/O More...
#include <netio.h>
#include <log.h>
#include <ssl_timeoutio.h>
#include <tls.h>
#include <assert.h>
#include <errno.h>
#include <poll.h>
#include <string.h>
#include <unistd.h>
Macros | |
#define | _GNU_SOURCE /* to get POLLRDHUP if possible */ |
#define | POLL_IN_OR_ERROR POLLIN |
#define | DEBUG_IN(l) {} |
#define | DEBUG_OUT(s, l) {} |
Functions | |
static void | get_from_inbuffer (char *dest, const size_t len, const size_t droplen) |
static size_t | readinput (char *buffer, const size_t len, const int fatal) |
static const char * | find_eol (const char *buffer, const size_t buflen, int *valid) |
static void | loop_long (int has_cr) |
int | net_read (const int fatal) |
read one line from the network More... | |
int | netnwrite (const char *s, const size_t l) |
int | net_writen (const char *const *s) |
int | net_write_multiline (const char *const *s) |
size_t | net_readbin (size_t num, char *buf) |
size_t | net_readline (size_t num, char *buf) |
int | data_pending (void) |
check if there is data ready to be read without blocking More... | |
Variables | |
static char | lineinbuf [1002] |
struct string | linein |
static char | lineinn [sizeof(lineinbuf)] |
static size_t | linenlen |
time_t | timeout |
functions for network I/O
int data_pending | ( | void | ) |
check if there is data ready to be read without blocking
0 | if no data |
1 | if data |
<0 | error code |
This will return -ECONNRESET if the connection has been closed by the remote end.
|
static |
detect the end of the first line in the given buffer
buffer | input buffer to check |
buflen | amount of data in buffer |
valid | a flag is stored here if the line is valid |
NULL | buffer does neither contain CR nor LF |
If the buffer begins with a sequence of characters that contains a stray CR or LF a pointer one character behind this is returned and valid is set to 0. If the buffer begins with a valid line ending in CRLF a pointer behind the LF is returned. If neither CR nor LF is found NULL is returned.
|
static |
read the first characters of lineinn
dest | destination buffer or NULL to simply drop the data |
len | characters to copy |
droplen | additional characters to drop (usually 2 to drop CRLF) |
Move the rest of the buffer content forward (if any).
|
static |
read input until a line with a valid length is in buffer
has_cr | if the previous buffer ended with CR |
This function will set errno to the proper error code before returning.
int net_read | ( | const int | fatal | ) |
read one line from the network
fatal | if connection errors should lead to program termination |
0 | on success |
-1 | on error (errno is set) |
does not return on timeout, program will be cancelled
size_t net_readbin | ( | size_t | num, |
char * | buf | ||
) |
read a given number of bytes from network as binary data (i.e. without any mangling)
num | number of bytes to read |
buf | buffer to store data (must have enough space for (num + 1) bytes) |
-1 | on error |
size_t net_readline | ( | size_t | num, |
char * | buf | ||
) |
read up to a given number of bytes from network but stop at the first CRLF
num | number of bytes to read, must be < 1002 so everything behind the CRLF can be copied back to lineinn |
buf | buffer to store data (must have enough space) |
-1 | on error |
The trailing CRLF sequence is kept in the buffer. This function will return an error if it detects a bare CR or LF in the middle of the input data, but it cannot detect if the CR goes in one call and LF in the next, so it will allow the output to be just LF or to end in CR.
int net_write_multiline | ( | const char *const * | s | ) |
write multiple lines to the network
s | array of strings to send |
0 | on success |
-1 | on error (errno is set) |
This combines all given strings into one buffer and send them out to the network. This allows the underlying network stack to use the least sensible number of packets, reducing network latency. If memory allocation fails for the intermediate buffer the lines may be send in smaller chunks, which is less efficient but is no other loss in functionality.
Does not return on timeout, program will be cancelled.
If one part or multiple consecutive parts covers a whole SMTP line this line must conform to the SMTP line length limit (512 bytes).
int net_writen | ( | const char *const * | s | ) |
write one line to the network, fold if needed
s | array of strings to send |
0 | on success |
-1 | on error (errno is set) |
does not return on timeout, program will be cancelled
int netnwrite | ( | const char * | s, |
const size_t | l | ||
) |
write one line to the network
s | line to be written (nothing else it written so it should contain CRLF) |
l | length of s |
0 | on success |
-1 | on error (errno is set) |
does not return on timeout, program will be cancelled
|
static |
read characters from (network) input
buffer | buffer to put the data in |
len | maximum length of data to read (one char less is read, the last one is set to '\0') |
fatal | if connection errors should lead to program termination |
-1 | on error (errno is set) |
struct string linein |
|
static |
buffer for the line to read: max 1000 chars including CRLF, leading extra '.', closing '\0'
|
static |
if more than one line was in linein the rest is stored here
|
static |
length of the lineinn
time_t timeout |
how long to wait for data