Qsmtp  0.30dev
Enumerations | Functions | Variables
netio.h File Reference

functions for network I/O More...

#include "sstring.h"
#include <string.h>
#include <sys/types.h>
#include <time.h>

Go to the source code of this file.

Enumerations

enum  conn_shutdown_type { shutdown_clean, shutdown_abort }
 

Functions

int net_read (const int fatal)
 read one line from the network More...
 
int net_writen (const char *const *)
 
int net_write_multiline (const char *const *)
 
static int netwrite (const char *)
 
int netnwrite (const char *, const size_t)
 
size_t net_readbin (size_t, char *)
 
size_t net_readline (size_t, char *)
 
int data_pending (void)
 check if there is data ready to be read without blocking More...
 
void net_conn_shutdown (const enum conn_shutdown_type sd_type)
 shutdown the connection and end the program More...
 

Variables

struct string linein
 
time_t timeout
 
int socketd
 

Detailed Description

functions for network I/O

Enumeration Type Documentation

Enumerator
shutdown_clean 

do a normal shutdown and notify the partner about the shutdown

shutdown_abort 

do hard abort of connection

Function Documentation

int data_pending ( void  )

check if there is data ready to be read without blocking

Returns
if there is data available
Return values
0if no data
1if data
<0error code

This will return -ECONNRESET if the connection has been closed by the remote end.

void net_conn_shutdown ( const enum conn_shutdown_type  sd_type)

shutdown the connection and end the program

Parameters
sd_typespecifies the way the shutdown should be performed

This is a forward declaration only, every program has to implement this function in a way that matches how it works.

A shutdown_clean shutdown is e.g. sending QUIT to the server and waiting for it's reply. A shutdown with shutdown_abort is e.g. hard dropping of the connection if the client sends spam and has a broken SMTP engine that does not react to error codes.

Calling this function even before the connection was established is fine.

int net_read ( const int  fatal)

read one line from the network

Parameters
fatalif connection errors should lead to program termination
Return values
0on success
-1on 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)

Parameters
numnumber of bytes to read
bufbuffer to store data (must have enough space for (num + 1) bytes)
Returns
number of bytes read
Return values
-1on 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

Parameters
numnumber of bytes to read, must be < 1002 so everything behind the CRLF can be copied back to lineinn
bufbuffer to store data (must have enough space)
Returns
number of bytes read
Return values
-1on 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

Parameters
sarray of strings to send
Return values
0on success
-1on 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

Parameters
sarray of strings to send
Return values
0on success
-1on error (errno is set)

does not return on timeout, program will be cancelled

Warning
s[0] must be short enough to fit completely into the buffer
s[0] must contain the whole status code as well as the following space (' ') or hyphen ('-')
every s[] must not have a sequence longer then 506 characters without a space (' ') in them
int netnwrite ( const char *  s,
const size_t  l 
)

write one line to the network

Parameters
sline to be written (nothing else it written so it should contain CRLF)
llength of s
Return values
0on success
-1on error (errno is set)

does not return on timeout, program will be cancelled

Variable Documentation

int socketd

the descriptor where messages to network are written to

time_t timeout

how long to wait for data