/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 1999-2021 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General
Public License along with this library. If not, see
. */
#ifndef _MAILUTILS_SYS_POP3_H
#define _MAILUTILS_SYS_POP3_H
#include
#include
#include
#include
#ifdef __cplusplus
extern "C" {
#endif
enum mu_pop3_state
{
MU_POP3_NO_STATE,
MU_POP3_CONNECT, MU_POP3_GREETINGS,
MU_POP3_APOP,
MU_POP3_AUTH,
MU_POP3_CAPA, MU_POP3_CAPA_RX,
MU_POP3_DELE,
MU_POP3_LIST, MU_POP3_LIST_RX,
MU_POP3_NOOP,
MU_POP3_PASS,
MU_POP3_QUIT,
MU_POP3_RETR, MU_POP3_RETR_RX,
MU_POP3_RSET,
MU_POP3_STAT,
MU_POP3_STLS, MU_POP3_STLS_CONNECT,
MU_POP3_TOP, MU_POP3_TOP_RX,
MU_POP3_UIDL, MU_POP3_UIDL_RX,
MU_POP3_USER,
MU_POP3_DONE,
MU_POP3_UNKNOWN,
MU_POP3_ERROR
};
#define MU_POP3_ACK 0x01
#define MU_POP3_TRACE 0x02
#define MU_POP3_XSCRIPT_MASK(n) (1<<((n)+1))
/* Structure to hold things general to POP3 mailbox, like its state, etc ... */
struct _mu_pop3
{
int flags;
/* Holds the first line response of the last command, i.e the ACK */
char *ackbuf;
size_t acksize;
char *rdbuf;
size_t rdsize;
char *timestamp; /* For apop, if supported. */
unsigned timeout; /* Default is 10 minutes. */
enum mu_pop3_state state; /* Indicate the state of the running
command. */
mu_list_t capa; /* Capabilities. */
mu_stream_t carrier; /* TCP Connection. */
};
#define MU_POP3_FSET(p,f) ((p)->flags |= (f))
#define MU_POP3_FISSET(p,f) ((p)->flags & (f))
#define MU_POP3_FCLR(p,f) ((p)->flags &= ~(f))
extern int mu_pop3_iterator_create (mu_pop3_t pop3, mu_iterator_t *piterator);
extern int mu_pop3_stream_create (mu_pop3_t pop3, mu_stream_t *pstream);
extern int mu_pop3_carrier_is_ready (mu_stream_t carrier, int flag,
int timeout);
int _mu_pop3_xscript_level (mu_pop3_t pop3, int xlev);
int _mu_pop3_trace_enable (mu_pop3_t pop3);
int _mu_pop3_trace_disable (mu_pop3_t pop3);
int _mu_pop3_init (mu_pop3_t pop3);
/* Check if status indicates an error.
If the error is recoverable just return the status.
Otherwise, set the error state and return the status
*/
#define MU_POP3_CHECK_EAGAIN(pop3, status) \
do \
{ \
switch (status) \
{ \
case 0: \
break; \
case EAGAIN: \
case EINPROGRESS: \
case EINTR: \
return status; \
case MU_ERR_REPLY: \
case MU_ERR_BADREPLY: \
pop3->state = MU_POP3_NO_STATE; \
return status; \
default: \
pop3->state = MU_POP3_ERROR; \
return status; \
} \
} \
while (0)
/* If status indicates an error, return.
*/
#define MU_POP3_CHECK_ERROR(pop3, status) \
do \
{ \
if (status != 0) \
{ \
pop3->state = MU_POP3_ERROR; \
return status; \
} \
} \
while (0)
/* Check if we got "+OK".
In POP3 protocol and ack of "+OK" means the command was successfull.
*/
#define MU_POP3_CHECK_OK(pop3) \
do \
{ \
if (mu_c_strncasecmp (pop3->ackbuf, "+OK", 3) != 0) \
{ \
pop3->state = MU_POP3_NO_STATE; \
return EACCES; \
} \
} \
while (0)
#ifdef __cplusplus
}
#endif
#endif /* _MAILUTILS_SYS_POP3_H */