-/* imap.c -- Routines for communication with an IMAP server */
-
+/*
+ * imap.c -- Routines for communication with an IMAP server
+ *
+ * Copyright (C) 2003 Hugo Villeneuve <hugo@hugovil.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
/* Define filename_M */
#define IMAP_M 1
get_packet:
len = WmnotifyGetResponse( rx_buffer, WMNOTIFY_BUFSIZE );
-
if( len < 0 ) {
- /* An error occured. */
- perror( PACKAGE );
- ErrorLocation( __FILE__, __LINE__ );
+ /* An error occured. WmnotifyGetResponse() should have printed an error message. */
goto error;
}
else if( len == 0 ) {
goto error;
}
else if( len == WMNOTIFY_BUFSIZE ) {
- /* This shouldn't happen, the examine command doesn't requires that much data. */
if( wmnotify_infos.debug ) {
ErrorLocation( __FILE__, __LINE__ );
- fprintf( stderr, "Response too big to fit in receive buffer.\n" );
+ fprintf( stderr, "Response too big (%d bytes) to fit in receive buffer.\n", len );
}
goto error;
}
/* We suppose that, if a partial response packet was sent, it is not broken in the middle
of a line (to confirm). Normally, each string is terminated by CRLF. */
- if( STREQ_LEN( &rx_buffer[ len - 2 ], IMAP4_ENDL, 2 ) == FALSE ) {
+ if( STREQ_LEN( &rx_buffer[ len - 2 ], IMAP4_ENDL, 2 ) == false ) {
/* No CRLF found at the end of the buffer --> not handled by wmnotify. */
ErrorLocation( __FILE__, __LINE__ );
fprintf( stderr, "Response buffer doesn't contain CRLF at the end.\n" );
/* In case no delimiter was found, the token is taken to
be the entire string *stringp, and *stringp is made NULL. */
if( stringp == NULL ) {
- /* This should never happen. */
- ErrorLocation( __FILE__, __LINE__ );
- fprintf( stderr, " Delimiter not found in strsep() call.\n" );
- goto error;
+ if( token[0] == '\0' ) {
+ /* This means we finished parsing the last line of the buffer, but we need to
+ get more data to continue process the next part of the IMAP4 response. */
+ goto get_packet;
+ }
+ else {
+ /* This should never happen. */
+ ErrorLocation( __FILE__, __LINE__ );
+ fprintf( stderr, " Delimiter not found in strsep() call.\n" );
+ goto error;
+ }
}
-
+
if( token == NULL ) {
/* This should never happen. */
ErrorLocation( __FILE__, __LINE__ );
if( token[0] == '*' ) {
/* Untagged response. If there is a space after the SEARCH response, it means
* at least 1 message is unseen. */
- if( STREQ_LEN( token, IMAP4_RSP_SEARCH_UNSEEN, strlen(IMAP4_RSP_SEARCH_UNSEEN) ) == TRUE ) {
- unseen_string_found = TRUE;
+ if( STREQ_LEN( token, IMAP4_RSP_SEARCH_UNSEEN, strlen(IMAP4_RSP_SEARCH_UNSEEN) ) == true ) {
+ unseen_string_found = true;
}
}
else {
/* Must be the status... */
/* We check for the correct transaction label plus a space. */
- if( STREQ_LEN( token, tx_buffer, tlabel_len + 1 ) == TRUE ) {
+ if( STREQ_LEN( token, tx_buffer, tlabel_len + 1 ) == true ) {
token += tlabel_len + 1;
- if( STREQ_LEN( token, IMAP4_RSP_SUCCESS, strlen(IMAP4_RSP_SUCCESS) ) == TRUE ) {
+ if( STREQ_LEN( token, IMAP4_RSP_SUCCESS, strlen(IMAP4_RSP_SUCCESS) ) == true ) {
goto end; /* OK, no errors. */
}
- else if( STREQ_LEN( token, IMAP4_RSP_PROTOCOL_ERR, strlen(IMAP4_RSP_PROTOCOL_ERR) ) == TRUE ) {
+ else if( STREQ_LEN( token, IMAP4_RSP_PROTOCOL_ERR, strlen(IMAP4_RSP_PROTOCOL_ERR) ) == true ) {
fprintf( stderr, "%s: Protocol error (%s).\n", PACKAGE, token );
goto error;
}
- else if( STREQ_LEN( token, IMAP4_RSP_FAILURE, strlen(IMAP4_RSP_FAILURE) ) == TRUE ) {
+ else if( STREQ_LEN( token, IMAP4_RSP_FAILURE, strlen(IMAP4_RSP_FAILURE) ) == true ) {
fprintf( stderr, "%s: Failure (%s).\n", PACKAGE, token );
goto error;
}
/* Selecting the mailbox first. */
argv[0] = IMAP4_CMD_EXAMINE;
- argv[1] = "inbox";
+ argv[1] = wmnotify_infos.imap_folder;
status = IMAP4_SendCommand( 2, argv );
if( status != EXIT_SUCCESS ) {
new_messages = -1;
* and UNSEEN will have entries. But if we recheck again later, RECENT will report zero.
* RECENT, when set, simply means that there are new messages since our last visit.
But, on the other hand, when using EXAMINE, no messages should lose their RECENT flag. */
- unseen_string_found = FALSE;
+ unseen_string_found = false;
argv[0] = IMAP4_CMD_SEARCH_UNSEEN;
argv[1] = "";
status = IMAP4_SendCommand( 1, argv );
goto imap4_logout;
}
- if( unseen_string_found == TRUE ) {
+ if( unseen_string_found == true ) {
new_messages = 1;
}