#define POP3_TYPE 1
#define IMAP_TYPE 2
-#define MAXFOLDERSIZE 128
+#define MAXSIZE 1024
struct mail_s { // for imap and pop3
unsigned long unseen;
unsigned int retries;
float interval;
double last_update;
- char host[128];
- char user[128];
- char pass[128];
- char command[1024];
- char folder[MAXFOLDERSIZE];
+ char host[MAXSIZE];
+ char user[MAXSIZE];
+ char pass[MAXSIZE];
+ char command[MAXSIZE];
+ char folder[MAXSIZE];
timed_thread *p_timed_thread;
char secure;
};
mail = malloc(sizeof(struct mail_s));
memset(mail, 0, sizeof(struct mail_s));
- if (sscanf(arg, "%128s %128s %128s", mail->host, mail->user, mail->pass)
+#define lenstr "%1023s"
+ if (sscanf(arg, lenstr " " lenstr " " lenstr, mail->host, mail->user, mail->pass)
!= 3) {
if (type == POP3_TYPE) {
NORM_ERR("Scanning POP3 args failed");
term.c_lflag &= ~ECHO;
tcsetattr(fp, TCSANOW, &term);
printf("Enter mailbox password (%s@%s): ", mail->user, mail->host);
- scanf("%128s", mail->pass);
+ scanf(lenstr, mail->pass);
+#undef lenstr
printf("\n");
term.c_lflag |= ECHO;
tcsetattr(fp, TCSANOW, &term);
if (type == IMAP_TYPE) {
tmp = strstr(arg, "-f ");
if (tmp) {
- int len = MAXFOLDERSIZE-1;
+ int len = MAXSIZE - 1;
tmp += 3;
if (tmp[0] == '\'') {
- len = strstr(tmp + 1, "'") - tmp - 1;
- if (len > MAXFOLDERSIZE-1) {
- len = MAXFOLDERSIZE-1;
+ len = strstr(tmp + 1, "'") - tmp;
+ if (len > MAXSIZE) {
+ len = MAXSIZE;
}
- tmp++;
}
- strncpy(mail->folder, tmp, len);
- mail->folder[len-1] = 0;
+ strncpy(mail->folder, tmp + 1, len - 1);
} else {
- strncpy(mail->folder, "INBOX", MAXFOLDERSIZE-1); // default imap inbox
- mail->folder[MAXFOLDERSIZE-1] = 0;
+ strncpy(mail->folder, "INBOX", MAXSIZE - 1); // default imap inbox
}
}
tmp = strstr(arg, "-e ");
if (tmp) {
- int len = 1024;
+ int len = MAXSIZE - 1;
tmp += 3;
if (tmp[0] == '\'') {
- len = strstr(tmp + 1, "'") - tmp - 1;
- if (len > 1024) {
- len = 1024;
+ len = strstr(tmp + 1, "'") - tmp;
+ if (len > MAXSIZE) {
+ len = MAXSIZE;
}
}
- strncpy(mail->command, tmp + 1, len);
+ strncpy(mail->command, tmp + 1, len - 1);
} else {
mail->command[0] = '\0';
}
+ DBGP("mail args parsed: folder: '%s' command: '%s' user: '%s' host: '%s'\n",
+ mail->folder, mail->command, mail->user, mail->host);
mail->p_timed_thread = NULL;
return mail;
}
while (1) {
/*
* RFC 2177 says we have to re-idle every 29 minutes.
- * We'll do it every 20 minutes to be safe.
+ * We'll do it every 10 minutes to be safe.
*/
- fetchtimeout.tv_sec = 1200;
+ fetchtimeout.tv_sec = 600;
fetchtimeout.tv_usec = 0;
- DBGP2("idling...");
+ DBGP("idling...");
FD_ZERO(&fdset);
FD_SET(sockfd, &fdset);
FD_SET(threadfd, &fdset);
- res = select(MAX(sockfd + 1, threadfd + 1), &fdset, NULL, NULL, &fetchtimeout);
+ res = select(MAX(sockfd + 1, threadfd + 1), &fdset, NULL,
+ NULL, &fetchtimeout);
+ DBGP("done idling");
if (timed_thread_test(mail->p_timed_thread, 1) || (res == -1 && errno == EINTR) || FD_ISSET(threadfd, &fdset)) {
if ((fstat(sockfd, &stat_buf) == 0) && S_ISSOCK(stat_buf.st_mode)) {
/* if a valid socket, close it */
fail++;
break;
}
- } else {
- fail++;
- break;
}
recvbuf[numbytes] = '\0';
DBGP2("imap_thread() received: %s", recvbuf);
timed_thread_lock(mail->p_timed_thread);
if (mail->messages != messages) {
force_check = 1;
- mail->messages = messages;
}
timed_thread_unlock(mail->p_timed_thread);
}