NeoMutt  2025-12-11-435-g4ac674
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
private.h File Reference

POP network mailbox. More...

#include <stdbool.h>
#include <time.h>
#include "conn/lib.h"
+ Include dependency graph for private.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  PopCache
 POP-specific email cache. More...
 
struct  PopAuth
 POP authentication multiplexor. More...
 

Macros

#define POP_PORT   110
 Default port for POP3.
 
#define POP_SSL_PORT   995
 Default port for POP3 over SSL.
 
#define POP_CACHE_LEN   10
 Number of entries in the POP cache hash table.
 
#define POP_CMD_RESPONSE   512
 Maximum length of POP server response (per RFC1939)
 
#define pop_query(adata, buf, buflen)
 

Typedefs

typedef int(* pop_fetch_t) (const char *str, void *data)
 

Enumerations

enum  PopStatus { POP_NONE = 0 , POP_CONNECTED , POP_DISCONNECTED }
 POP server responses. More...
 
enum  PopAuthRes { POP_A_SUCCESS = 0 , POP_A_SOCKET , POP_A_FAILURE , POP_A_UNAVAIL }
 POP authentication responses. More...
 

Functions

bool pop_auth_is_valid (const char *authenticator)
 Check if string is a valid pop authentication method.
 
int pop_authenticate (struct PopAccountData *adata)
 Authenticate with a POP server.
 
void pop_apop_timestamp (struct PopAccountData *adata, char *buf)
 Get the server timestamp for APOP authentication.
 
int pop_parse_path (const char *path, struct ConnAccount *acct)
 Parse a POP mailbox name.
 
int pop_connect (struct PopAccountData *adata)
 Open connection.
 
int pop_open_connection (struct PopAccountData *adata)
 Open connection and authenticate.
 
int pop_query_d (struct PopAccountData *adata, char *buf, size_t buflen, char *msg)
 Send data from buffer and receive answer to the same buffer.
 
int pop_fetch_data (struct PopAccountData *adata, const char *query, struct Progress *progress, pop_fetch_t callback, void *data)
 Read Headers with callback function.
 
int pop_reconnect (struct Mailbox *m)
 Reconnect and verify indexes if connection was lost.
 
void pop_logout (struct Mailbox *m)
 Logout from a POP server.
 
const char * pop_get_field (enum ConnAccountField field, void *gf_data)
 Get connection login credentials - Implements ConnAccount::get_field() -.
 

Detailed Description

POP network mailbox.

Authors
  • Vsevolod Volkov
  • Richard Russon

This program 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 General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Definition in file private.h.

Macro Definition Documentation

◆ POP_PORT

#define POP_PORT   110

Default port for POP3.

Definition at line 35 of file private.h.

◆ POP_SSL_PORT

#define POP_SSL_PORT   995

Default port for POP3 over SSL.

Definition at line 36 of file private.h.

◆ POP_CACHE_LEN

#define POP_CACHE_LEN   10

Number of entries in the POP cache hash table.

Definition at line 38 of file private.h.

◆ POP_CMD_RESPONSE

#define POP_CMD_RESPONSE   512

Maximum length of POP server response (per RFC1939)

Definition at line 40 of file private.h.

◆ pop_query

#define pop_query ( adata,
buf,
buflen )
Value:
pop_query_d(adata, buf, buflen, NULL)
int pop_query_d(struct PopAccountData *adata, char *buf, size_t buflen, char *msg)
Send data from buffer and receive answer to the same buffer.
Definition lib.c:466

Definition at line 109 of file private.h.

Typedef Documentation

◆ pop_fetch_t

typedef int(* pop_fetch_t) (const char *str, void *data)

Definition at line 106 of file private.h.

Enumeration Type Documentation

◆ PopStatus

enum PopStatus

POP server responses.

Enumerator
POP_NONE 

No connected to server.

POP_CONNECTED 

Connected to server.

POP_DISCONNECTED 

Disconnected from server.

Definition at line 45 of file private.h.

46{
47 POP_NONE = 0,
50};
@ POP_DISCONNECTED
Disconnected from server.
Definition private.h:49
@ POP_CONNECTED
Connected to server.
Definition private.h:48
@ POP_NONE
No connected to server.
Definition private.h:47

◆ PopAuthRes

enum PopAuthRes

POP authentication responses.

Enumerator
POP_A_SUCCESS 

Authenticated successfully.

POP_A_SOCKET 

Connection lost.

POP_A_FAILURE 

Authentication failed.

POP_A_UNAVAIL 

No valid authentication method.

Definition at line 55 of file private.h.

56{
57 POP_A_SUCCESS = 0,
61};
@ POP_A_UNAVAIL
No valid authentication method.
Definition private.h:60
@ POP_A_SUCCESS
Authenticated successfully.
Definition private.h:57
@ POP_A_FAILURE
Authentication failed.
Definition private.h:59
@ POP_A_SOCKET
Connection lost.
Definition private.h:58

Function Documentation

◆ pop_auth_is_valid()

bool pop_auth_is_valid ( const char * authenticator)

Check if string is a valid pop authentication method.

Parameters
authenticatorAuthenticator string to check
Return values
trueArgument is a valid auth method

Validate whether an input string is an accepted pop authentication method as defined by PopAuthenticators.

Definition at line 503 of file auth.c.

504{
505 for (size_t i = 0; i < countof(PopAuthenticators); i++)
506 {
507 const struct PopAuth *auth = &PopAuthenticators[i];
508 if (auth->method && mutt_istr_equal(auth->method, authenticator))
509 return true;
510 }
511
512 return false;
513}
#define countof(x)
Definition memory.h:49
bool mutt_istr_equal(const char *a, const char *b)
Compare two strings, ignoring case.
Definition string.c:674
static const struct PopAuth PopAuthenticators[]
Accepted authentication methods.
Definition auth.c:480
POP authentication multiplexor.
Definition private.h:76
const char * method
Name of authentication method supported, NULL means variable.
Definition private.h:87
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ pop_authenticate()

int pop_authenticate ( struct PopAccountData * adata)

Authenticate with a POP server.

Parameters
adataPOP Account data
Return values
numResult, e.g. POP_A_SUCCESS
0Successful
-1Connection lost
-2Login failed
-3Authentication cancelled

Definition at line 524 of file auth.c.

525{
526 struct ConnAccount *cac = &adata->conn->account;
527 const struct PopAuth *authenticator = NULL;
528 int attempts = 0;
529 int rc = POP_A_UNAVAIL;
530
531 if ((mutt_account_getuser(cac) < 0) || (cac->user[0] == '\0'))
532 {
533 return -3;
534 }
535
536 const struct Slist *c_pop_authenticators = cs_subset_slist(NeoMutt->sub, "pop_authenticators");
537 const bool c_pop_auth_try_all = cs_subset_bool(NeoMutt->sub, "pop_auth_try_all");
538 if (c_pop_authenticators && (c_pop_authenticators->count > 0))
539 {
540 /* Try user-specified list of authentication methods */
541 struct ListNode *np = NULL;
542 STAILQ_FOREACH(np, &c_pop_authenticators->head, entries)
543 {
544 mutt_debug(LL_DEBUG2, "Trying method %s\n", np->data);
545 authenticator = PopAuthenticators;
546
547 while (authenticator->authenticate)
548 {
549 if (!authenticator->method || mutt_istr_equal(authenticator->method, np->data))
550 {
551 rc = authenticator->authenticate(adata, np->data);
552 if (rc == POP_A_SOCKET)
553 {
554 switch (pop_connect(adata))
555 {
556 case 0:
557 {
558 rc = authenticator->authenticate(adata, np->data);
559 break;
560 }
561 case -2:
562 rc = POP_A_FAILURE;
563 }
564 }
565
566 if (rc != POP_A_UNAVAIL)
567 attempts++;
568 if ((rc == POP_A_SUCCESS) || (rc == POP_A_SOCKET) ||
569 ((rc == POP_A_FAILURE) && !c_pop_auth_try_all))
570 {
571 break;
572 }
573 }
574 authenticator++;
575 }
576 }
577 }
578 else
579 {
580 /* Fall back to default: any authenticator */
581 mutt_debug(LL_DEBUG2, "Using any available method\n");
582 authenticator = PopAuthenticators;
583
584 while (authenticator->authenticate)
585 {
586 rc = authenticator->authenticate(adata, NULL);
587 if (rc == POP_A_SOCKET)
588 {
589 switch (pop_connect(adata))
590 {
591 case 0:
592 {
593 rc = authenticator->authenticate(adata, NULL);
594 break;
595 }
596 case -2:
597 rc = POP_A_FAILURE;
598 }
599 }
600
601 if (rc != POP_A_UNAVAIL)
602 attempts++;
603 if ((rc == POP_A_SUCCESS) || (rc == POP_A_SOCKET) ||
604 ((rc == POP_A_FAILURE) && !c_pop_auth_try_all))
605 {
606 break;
607 }
608
609 authenticator++;
610 }
611 }
612
613 switch (rc)
614 {
615 case POP_A_SUCCESS:
616 return 0;
617 case POP_A_SOCKET:
618 return -1;
619 case POP_A_UNAVAIL:
620 if (attempts == 0)
621 mutt_error(_("No authenticators available"));
622 }
623
624 return -2;
625}
const struct Slist * cs_subset_slist(const struct ConfigSubset *sub, const char *name)
Get a string-list config item by name.
Definition helpers.c:242
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition helpers.c:47
int mutt_account_getuser(struct ConnAccount *cac)
Retrieve username into ConnAccount, if necessary.
Definition connaccount.c:51
#define mutt_error(...)
Definition logging2.h:94
#define mutt_debug(LEVEL,...)
Definition logging2.h:91
@ LL_DEBUG2
Log at debug level 2.
Definition logging2.h:46
#define _(a)
Definition message.h:28
int pop_connect(struct PopAccountData *adata)
Open connection.
Definition lib.c:281
#define STAILQ_FOREACH(var, head, field)
Definition queue.h:390
Login details for a remote server.
Definition connaccount.h:53
char user[128]
Username.
Definition connaccount.h:56
struct ConnAccount account
Account details: username, password, etc.
Definition connection.h:49
A List node for strings.
Definition list.h:37
char * data
String.
Definition list.h:38
Container for Accounts, Notifications.
Definition neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:49
struct Connection * conn
Connection to POP server.
Definition adata.h:38
enum PopAuthRes(* authenticate)(struct PopAccountData *adata, const char *method)
Definition private.h:85
String list.
Definition slist.h:37
struct ListHead head
List containing values.
Definition slist.h:38
size_t count
Number of values in list.
Definition slist.h:39
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ pop_apop_timestamp()

void pop_apop_timestamp ( struct PopAccountData * adata,
char * buf )

Get the server timestamp for APOP authentication.

Parameters
adataPOP Account data
bufTimestamp string

Definition at line 302 of file auth.c.

303{
304 char *p1 = NULL, *p2 = NULL;
305
306 FREE(&adata->timestamp);
307
308 if ((p1 = strchr(buf, '<')) && (p2 = strchr(p1, '>')))
309 {
310 p2[1] = '\0';
311 adata->timestamp = mutt_str_dup(p1);
312 }
313}
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:68
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition string.c:257
char * timestamp
APOP timestamp.
Definition adata.h:55
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ pop_parse_path()

int pop_parse_path ( const char * path,
struct ConnAccount * cac )

Parse a POP mailbox name.

Parameters
pathPath to parse
cacAccount to store details
Return values
0success
-1error

Split a POP path into host, port, username and password

Definition at line 82 of file lib.c.

83{
84 /* Defaults */
85 cac->flags = 0;
87 cac->port = 0;
88 cac->service = "pop";
90
91 struct Url *url = url_parse(path);
92
93 if (!url || ((url->scheme != U_POP) && (url->scheme != U_POPS)) ||
94 !url->host || (account_from_url(cac, url) < 0))
95 {
96 url_free(&url);
97 mutt_error(_("Invalid POP URL: %s"), path);
98 return -1;
99 }
100
101 if (url->scheme == U_POPS)
102 cac->flags |= MUTT_ACCT_SSL;
103
104 struct servent *service = getservbyname((url->scheme == U_POP) ? "pop3" : "pop3s", "tcp");
105 if (cac->port == 0)
106 {
107 if (service)
108 cac->port = ntohs(service->s_port);
109 else
110 cac->port = (url->scheme == U_POP) ? POP_PORT : POP_SSL_PORT;
111 }
112
113 url_free(&url);
114 return 0;
115}
#define MUTT_ACCT_SSL
Account uses SSL/TLS.
Definition connaccount.h:47
const char * pop_get_field(enum ConnAccountField field, void *gf_data)
Get connection login credentials - Implements ConnAccount::get_field() -.
Definition lib.c:56
int account_from_url(struct ConnAccount *cac, const struct Url *url)
Fill ConnAccount with information from url.
@ MUTT_ACCT_TYPE_POP
Pop Account.
#define POP_SSL_PORT
Default port for POP3 over SSL.
Definition private.h:36
#define POP_PORT
Default port for POP3.
Definition private.h:35
const char * service
Name of the service, e.g. "imap".
Definition connaccount.h:61
const char *(* get_field)(enum ConnAccountField field, void *gf_data)
Definition connaccount.h:70
unsigned char type
Connection type, e.g. MUTT_ACCT_TYPE_IMAP.
Definition connaccount.h:59
MuttAccountFlags flags
Which fields are initialised, e.g. MUTT_ACCT_USER.
Definition connaccount.h:60
unsigned short port
Port to connect to.
Definition connaccount.h:58
A parsed URL proto://user:password@host:port/path?a=1&b=2
Definition url.h:69
char * host
Host.
Definition url.h:73
char * path
Path.
Definition url.h:75
enum UrlScheme scheme
Scheme, e.g. U_SMTPS.
Definition url.h:70
struct Url * url_parse(const char *src)
Fill in Url.
Definition url.c:239
void url_free(struct Url **ptr)
Free the contents of a URL.
Definition url.c:124
@ U_POPS
Url is pops://.
Definition url.h:38
@ U_POP
Url is pop://.
Definition url.h:37
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ pop_connect()

int pop_connect ( struct PopAccountData * adata)

Open connection.

Parameters
adataPOP Account data
Return values
0Successful
-1Connection lost
-2Invalid response

Definition at line 281 of file lib.c.

282{
283 char buf[1024] = { 0 };
284
285 adata->status = POP_NONE;
286 if ((mutt_socket_open(adata->conn) < 0) ||
287 (mutt_socket_readln(buf, sizeof(buf), adata->conn) < 0))
288 {
289 mutt_error(_("Error connecting to server: %s"), adata->conn->account.host);
290 return -1;
291 }
292
293 adata->status = POP_CONNECTED;
294
295 if (!mutt_str_startswith(buf, "+OK"))
296 {
297 *adata->err_msg = '\0';
298 pop_error(adata, buf);
299 mutt_error("%s", adata->err_msg);
300 return -2;
301 }
302
303 pop_apop_timestamp(adata, buf);
304
305 return 0;
306}
size_t mutt_str_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix.
Definition string.c:234
void pop_apop_timestamp(struct PopAccountData *adata, char *buf)
Get the server timestamp for APOP authentication.
Definition auth.c:302
static void pop_error(struct PopAccountData *adata, char *msg)
Copy error message to err_msg buffer.
Definition lib.c:122
int mutt_socket_open(struct Connection *conn)
Simple wrapper.
Definition socket.c:76
#define mutt_socket_readln(buf, buflen, conn)
Definition socket.h:55
char host[128]
Server to login to.
Definition connaccount.h:54
char err_msg[POP_CMD_RESPONSE]
Last error message.
Definition adata.h:57
unsigned int status
Connection status.
Definition adata.h:39
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ pop_open_connection()

int pop_open_connection ( struct PopAccountData * adata)

Open connection and authenticate.

Parameters
adataPOP Account data
Return values
0Successful
-1Connection lost
-2Invalid command or execution error
-3Authentication cancelled

Definition at line 316 of file lib.c.

317{
318 char buf[1024] = { 0 };
319
320 int rc = pop_connect(adata);
321 if (rc < 0)
322 return rc;
323
324 rc = pop_capabilities(adata, 0);
325 if (rc == -1)
326 goto err_conn;
327 if (rc == -2)
328 return -2;
329
330#ifdef USE_SSL
331 /* Attempt STLS if available and desired. */
332 const bool c_ssl_force_tls = cs_subset_bool(NeoMutt->sub, "ssl_force_tls");
333 if ((adata->conn->ssf == 0) && (adata->cmd_stls || c_ssl_force_tls))
334 {
335 if (c_ssl_force_tls)
336 adata->use_stls = 2;
337 if (adata->use_stls == 0)
338 {
339 enum QuadOption ans = query_quadoption(_("Secure connection with TLS?"),
340 NeoMutt->sub, "ssl_starttls");
341 if (ans == MUTT_ABORT)
342 return -2;
343 adata->use_stls = 1;
344 if (ans == MUTT_YES)
345 adata->use_stls = 2;
346 }
347 if (adata->use_stls == 2)
348 {
349 mutt_str_copy(buf, "STLS\r\n", sizeof(buf));
350 rc = pop_query(adata, buf, sizeof(buf));
351 // Clear any data after the STLS acknowledgement
352 mutt_socket_empty(adata->conn);
353 if (rc == -1)
354 goto err_conn;
355 if (rc != 0)
356 {
357 mutt_error("%s", adata->err_msg);
358 }
359 else if (mutt_ssl_starttls(adata->conn))
360 {
361 mutt_error(_("Could not negotiate TLS connection"));
362 return -2;
363 }
364 else
365 {
366 /* recheck capabilities after STLS completes */
367 rc = pop_capabilities(adata, 1);
368 if (rc == -1)
369 goto err_conn;
370 if (rc == -2)
371 return -2;
372 }
373 }
374 }
375
376 if (c_ssl_force_tls && (adata->conn->ssf == 0))
377 {
378 mutt_error(_("Encrypted connection unavailable"));
379 return -2;
380 }
381#endif
382
383 rc = pop_authenticate(adata);
384 if (rc == -1)
385 goto err_conn;
386 if (rc == -3)
388 if (rc != 0)
389 return rc;
390
391 /* recheck capabilities after authentication */
392 rc = pop_capabilities(adata, 2);
393 if (rc == -1)
394 goto err_conn;
395 if (rc == -2)
396 return -2;
397
398 /* get total size of mailbox */
399 mutt_str_copy(buf, "STAT\r\n", sizeof(buf));
400 rc = pop_query(adata, buf, sizeof(buf));
401 if (rc == -1)
402 goto err_conn;
403 if (rc == -2)
404 {
405 mutt_error("%s", adata->err_msg);
406 return rc;
407 }
408
409 unsigned int n = 0;
410 size_t size = 0;
411 sscanf(buf, "+OK %u %zu", &n, &size);
412 adata->size = size;
413 return 0;
414
415err_conn:
416 adata->status = POP_DISCONNECTED;
417 mutt_error(_("Server closed connection"));
418 return -1;
419}
int mutt_ssl_starttls(struct Connection *conn)
Negotiate TLS over an already opened connection.
Definition gnutls.c:1172
size_t mutt_str_copy(char *dest, const char *src, size_t dsize)
Copy a string into a buffer (guaranteeing NUL-termination)
Definition string.c:583
void mutt_clear_error(void)
Clear the message line (bottom line of screen)
int pop_authenticate(struct PopAccountData *adata)
Authenticate with a POP server.
Definition auth.c:524
static int pop_capabilities(struct PopAccountData *adata, int mode)
Get capabilities from a POP server.
Definition lib.c:202
#define pop_query(adata, buf, buflen)
Definition private.h:109
QuadOption
Possible values for a quad-option.
Definition quad.h:36
@ MUTT_ABORT
User aborted the question (with Ctrl-G)
Definition quad.h:37
@ MUTT_YES
User answered 'Yes', or assume 'Yes'.
Definition quad.h:39
enum QuadOption query_quadoption(const char *prompt, struct ConfigSubset *sub, const char *name)
Ask the user a quad-question.
Definition question.c:378
void mutt_socket_empty(struct Connection *conn)
Clear out any queued data.
Definition socket.c:306
unsigned int ssf
Security strength factor, in bits (see notes)
Definition connection.h:50
size_t size
Mailbox size.
Definition adata.h:50
bool cmd_stls
optional command STLS
Definition adata.h:43
unsigned int use_stls
Use STLS.
Definition adata.h:41
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ pop_query_d()

int pop_query_d ( struct PopAccountData * adata,
char * buf,
size_t buflen,
char * msg )

Send data from buffer and receive answer to the same buffer.

Parameters
adataPOP Account data
bufBuffer to send/store data
buflenBuffer length
msgProgress message
Return values
0Successful
-1Connection lost
-2Invalid command or execution error

Definition at line 466 of file lib.c.

467{
468 if (adata->status != POP_CONNECTED)
469 return -1;
470
471 /* print msg instead of real command */
472 if (msg)
473 {
474 mutt_debug(MUTT_SOCK_LOG_CMD, "> %s", msg);
475 }
476
478
479 char *c = strpbrk(buf, " \r\n");
480 if (c)
481 *c = '\0';
482 snprintf(adata->err_msg, sizeof(adata->err_msg), "%s: ", buf);
483
484 if (mutt_socket_readln_d(buf, buflen, adata->conn, MUTT_SOCK_LOG_FULL) < 0)
485 {
486 adata->status = POP_DISCONNECTED;
487 return -1;
488 }
489 if (mutt_str_startswith(buf, "+OK"))
490 return 0;
491
492 pop_error(adata, buf);
493 return -2;
494}
int mutt_socket_readln_d(char *buf, size_t buflen, struct Connection *conn, int dbg)
Read a line from a socket.
Definition socket.c:238
#define MUTT_SOCK_LOG_FULL
Log everything including full protocol.
Definition socket.h:53
#define MUTT_SOCK_LOG_CMD
Log commands only.
Definition socket.h:51
#define mutt_socket_send_d(conn, buf, dbg)
Definition socket.h:57
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ pop_fetch_data()

int pop_fetch_data ( struct PopAccountData * adata,
const char * query,
struct Progress * progress,
pop_fetch_t callback,
void * data )

Read Headers with callback function.

Parameters
adataPOP Account data
queryPOP query to send to server
progressProgress bar
callbackFunction called for each header read
dataData to pass to the callback
Return values
0Successful
-1Connection lost
-2Invalid command or execution error
-3Error in callback(*line, *data)

This function calls callback(*line, *data) for each received line, callback(NULL, *data) if rewind(*data) needs, exits when fail or done.

Definition at line 511 of file lib.c.

513{
514 char buf[1024] = { 0 };
515 long pos = 0;
516 size_t lenbuf = 0;
517
518 mutt_str_copy(buf, query, sizeof(buf));
519 int rc = pop_query(adata, buf, sizeof(buf));
520 if (rc < 0)
521 return rc;
522
523 char *inbuf = MUTT_MEM_MALLOC(sizeof(buf), char);
524
525 while (true)
526 {
527 const int chunk = mutt_socket_readln_d(buf, sizeof(buf), adata->conn, MUTT_SOCK_LOG_FULL);
528 if (chunk < 0)
529 {
530 adata->status = POP_DISCONNECTED;
531 rc = -1;
532 break;
533 }
534
535 char *p = buf;
536 if (!lenbuf && (buf[0] == '.'))
537 {
538 if (buf[1] != '.')
539 break;
540 p++;
541 }
542
543 mutt_str_copy(inbuf + lenbuf, p, sizeof(buf));
544 pos += chunk;
545
546 /* cast is safe since we break out of the loop when chunk<=0 */
547 if ((size_t) chunk >= sizeof(buf))
548 {
549 lenbuf += strlen(p);
550 }
551 else
552 {
553 progress_update(progress, pos, -1);
554 if ((rc == 0) && (callback(inbuf, data) < 0))
555 rc = -3;
556 lenbuf = 0;
557 }
558
559 MUTT_MEM_REALLOC(&inbuf, lenbuf + sizeof(buf), char);
560 }
561
562 FREE(&inbuf);
563 return rc;
564}
#define MUTT_MEM_REALLOC(pptr, n, type)
Definition memory.h:55
#define MUTT_MEM_MALLOC(n, type)
Definition memory.h:53
bool progress_update(struct Progress *progress, size_t pos, int percent)
Update the state of the progress bar.
Definition progress.c:80
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ pop_reconnect()

int pop_reconnect ( struct Mailbox * m)

Reconnect and verify indexes if connection was lost.

Parameters
mMailbox
Return values
0Success
-1Error

Definition at line 609 of file lib.c.

610{
612
613 if (adata->status == POP_CONNECTED)
614 return 0;
615
616 while (true)
617 {
619
620 int rc = pop_open_connection(adata);
621 if (rc == 0)
622 {
623 struct Progress *progress = progress_new(MUTT_PROGRESS_NET, 0);
624 progress_set_message(progress, _("Verifying message indexes..."));
625
626 for (int i = 0; i < m->msg_count; i++)
627 {
628 struct PopEmailData *edata = pop_edata_get(m->emails[i]);
629 edata->refno = -1;
630 }
631
632 rc = pop_fetch_data(adata, "UIDL\r\n", progress, check_uidl, m);
633 progress_free(&progress);
634 if (rc == -2)
635 {
636 mutt_error("%s", adata->err_msg);
637 }
638 }
639
640 if (rc == 0)
641 return 0;
642
643 pop_logout(m);
644
645 if (rc < -1)
646 return -1;
647
648 if (query_quadoption(_("Connection lost. Reconnect to POP server?"),
649 NeoMutt->sub, "pop_reconnect") != MUTT_YES)
650 {
651 return -1;
652 }
653 }
654}
static int check_uidl(const char *line, void *data)
Parse UIDL response - Implements pop_fetch_t -.
Definition lib.c:575
struct PopAccountData * pop_adata_get(struct Mailbox *m)
Get the Account data for this mailbox.
Definition adata.c:73
struct PopEmailData * pop_edata_get(struct Email *e)
Get the private data for this Email.
Definition edata.c:68
int pop_open_connection(struct PopAccountData *adata)
Open connection and authenticate.
Definition lib.c:316
int pop_fetch_data(struct PopAccountData *adata, const char *query, struct Progress *progress, pop_fetch_t callback, void *data)
Read Headers with callback function.
Definition lib.c:511
void pop_logout(struct Mailbox *m)
Logout from a POP server.
Definition lib.c:425
@ MUTT_PROGRESS_NET
Progress tracks bytes, according to $net_inc
Definition lib.h:83
struct Progress * progress_new(enum ProgressType type, size_t size)
Create a new Progress Bar.
Definition progress.c:139
void progress_free(struct Progress **ptr)
Free a Progress Bar.
Definition progress.c:110
void progress_set_message(struct Progress *progress, const char *fmt,...) __attribute__((__format__(__printf__
int mutt_socket_close(struct Connection *conn)
Close a socket.
Definition socket.c:100
void * adata
Private data (for Mailbox backends)
Definition account.h:42
void * edata
Driver-specific data.
Definition email.h:74
int msg_count
Total number of messages.
Definition mailbox.h:87
struct Email ** emails
Array of Emails.
Definition mailbox.h:95
POP-specific Account data -.
Definition adata.h:37
POP-specific Email data -.
Definition edata.h:32
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ pop_logout()

void pop_logout ( struct Mailbox * m)

Logout from a POP server.

Parameters
mMailbox

Definition at line 425 of file lib.c.

426{
428
429 if (adata->status == POP_CONNECTED)
430 {
431 int rc = 0;
432 char buf[1024] = { 0 };
433 mutt_message(_("Closing connection to POP server..."));
434
435 if (m->readonly)
436 {
437 mutt_str_copy(buf, "RSET\r\n", sizeof(buf));
438 rc = pop_query(adata, buf, sizeof(buf));
439 }
440
441 if (rc != -1)
442 {
443 mutt_str_copy(buf, "QUIT\r\n", sizeof(buf));
444 rc = pop_query(adata, buf, sizeof(buf));
445 }
446
447 if (rc < 0)
448 mutt_debug(LL_DEBUG1, "Error closing POP connection\n");
449
451 }
452
453 adata->status = POP_DISCONNECTED;
454}
#define mutt_message(...)
Definition logging2.h:93
@ LL_DEBUG1
Log at debug level 1.
Definition logging2.h:45
bool readonly
Don't allow changes to the mailbox.
Definition mailbox.h:115
+ Here is the call graph for this function:
+ Here is the caller graph for this function: