| File: | erver/mail.c |
| Location: | line 171, column 3 |
| Description: | Value stored to 'tok' is never read |
| 1 | /* GKrellM |
| 2 | | Copyright (C) 1999-2010 Bill Wilson |
| 3 | | |
| 4 | | Author: Bill Wilson billw@gkrellm.net |
| 5 | | Latest versions might be found at: http://gkrellm.net |
| 6 | | |
| 7 | | |
| 8 | | GKrellM is free software: you can redistribute it and/or modify it |
| 9 | | under the terms of the GNU General Public License as published by |
| 10 | | the Free Software Foundation, either version 3 of the License, or |
| 11 | | (at your option) any later version. |
| 12 | | |
| 13 | | GKrellM is distributed in the hope that it will be useful, but WITHOUT |
| 14 | | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
| 15 | | or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public |
| 16 | | License for more details. |
| 17 | | |
| 18 | | You should have received a copy of the GNU General Public License |
| 19 | | along with this program. If not, see http://www.gnu.org/licenses/ |
| 20 | | |
| 21 | | |
| 22 | | Additional permission under GNU GPL version 3 section 7 |
| 23 | | |
| 24 | | If you modify this program, or any covered work, by linking or |
| 25 | | combining it with the OpenSSL project's OpenSSL library (or a |
| 26 | | modified version of that library), containing parts covered by |
| 27 | | the terms of the OpenSSL or SSLeay licenses, you are granted |
| 28 | | additional permission to convey the resulting work. |
| 29 | | Corresponding Source for a non-source form of such a combination |
| 30 | | shall include the source code for the parts of OpenSSL used as well |
| 31 | | as that of the covered work. |
| 32 | */ |
| 33 | |
| 34 | #include "gkrellmd.h" |
| 35 | #include "gkrellmd-private.h" |
| 36 | |
| 37 | |
| 38 | #if !defined(WIN32) |
| 39 | |
| 40 | #define MBOX_MBOX0 0 |
| 41 | #define MBOX_MAILDIR1 1 |
| 42 | #define MBOX_MH_DIR2 2 |
| 43 | |
| 44 | |
| 45 | typedef struct |
| 46 | { |
| 47 | gchar *path; |
| 48 | gchar *homedir_path; |
| 49 | gint mboxtype; |
| 50 | gboolean (*check_func)(); |
| 51 | gint mail_count; |
| 52 | gint new_mail_count; |
| 53 | gint old_mail_count; |
| 54 | gint prev_mail_count, |
| 55 | prev_new_mail_count; |
| 56 | time_t last_mtime; |
| 57 | off_t last_size; |
| 58 | gboolean is_internal; /* Internal mail message (ie: localmachine) */ |
| 59 | gboolean changed; |
| 60 | } |
| 61 | Mailbox; |
| 62 | |
| 63 | static GList *mailbox_list; |
| 64 | |
| 65 | static gint mail_check_timeout = 5; /* Seconds */ |
| 66 | |
| 67 | static gboolean unseen_is_new = TRUE(!(0)); /* Accessed but unread */ |
| 68 | |
| 69 | static gboolean mail_need_serve; |
| 70 | |
| 71 | |
| 72 | /* Look at a From line to see if it is valid, lines look like: |
| 73 | | From sending_address dayofweek month dayofmonth timeofday year |
| 74 | | eg: From billw@gkrellm.net Fri Oct 22 13:52:49 2010 |
| 75 | */ |
| 76 | static gint |
| 77 | is_From_line(Mailbox *mbox, gchar *buf) |
| 78 | { |
| 79 | gchar sender[512]; |
| 80 | gint dayofmonth = 0; |
| 81 | |
| 82 | if (strncmp(buf, "From ", 5)(__extension__ (__builtin_constant_p (5) && ((__builtin_constant_p (buf) && strlen (buf) < ((size_t) (5))) || (__builtin_constant_p ("From ") && strlen ("From ") < ((size_t) (5)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (buf) && __builtin_constant_p ("From ") && ( __s1_len = strlen (buf), __s2_len = strlen ("From "), (!((size_t )(const void *)((buf) + 1) - (size_t)(const void *)(buf) == 1 ) || __s1_len >= 4) && (!((size_t)(const void *)(( "From ") + 1) - (size_t)(const void *)("From ") == 1) || __s2_len >= 4)) ? __builtin_strcmp (buf, "From ") : (__builtin_constant_p (buf) && ((size_t)(const void *)((buf) + 1) - (size_t )(const void *)(buf) == 1) && (__s1_len = strlen (buf ), __s1_len < 4) ? (__builtin_constant_p ("From ") && ((size_t)(const void *)(("From ") + 1) - (size_t)(const void *)("From ") == 1) ? __builtin_strcmp (buf, "From ") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("From "); int __result = (((const unsigned char *) ( const char *) (buf))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (buf))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (buf))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (buf))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("From ") && ((size_t)(const void *)(("From ") + 1) - (size_t)(const void *)("From ") == 1) && (__s2_len = strlen ("From "), __s2_len < 4) ? (__builtin_constant_p ( buf) && ((size_t)(const void *)((buf) + 1) - (size_t) (const void *)(buf) == 1) ? __builtin_strcmp (buf, "From ") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (buf); int __result = (((const unsigned char *) (const char *) ("From "))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("From "))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("From "))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("From "))[3] - __s2[3]); } } __result ; })))) : __builtin_strcmp (buf, "From ")))); }) : strncmp (buf , "From ", 5)))) |
| 83 | return FALSE(0); |
| 84 | |
| 85 | /* In case sending address missing, look for a day of month |
| 86 | | number in field 3 or 4 (0 based). |
| 87 | */ |
| 88 | sender[0] = '\0'; |
| 89 | if (sscanf(buf, "%*s %*s %*s %d", &dayofmonth) != 1) |
| 90 | { |
| 91 | if (sscanf(buf, "%*s %511s %*s %*s %d", sender, &dayofmonth) != 2) |
| 92 | return FALSE(0); |
| 93 | } |
| 94 | if (dayofmonth < 1 || dayofmonth > 31) |
| 95 | return FALSE(0); |
| 96 | if (strcmp(sender, "MAILER-DAEMON")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (sender) && __builtin_constant_p ("MAILER-DAEMON") && (__s1_len = strlen (sender), __s2_len = strlen ("MAILER-DAEMON" ), (!((size_t)(const void *)((sender) + 1) - (size_t)(const void *)(sender) == 1) || __s1_len >= 4) && (!((size_t) (const void *)(("MAILER-DAEMON") + 1) - (size_t)(const void * )("MAILER-DAEMON") == 1) || __s2_len >= 4)) ? __builtin_strcmp (sender, "MAILER-DAEMON") : (__builtin_constant_p (sender) && ((size_t)(const void *)((sender) + 1) - (size_t)(const void * )(sender) == 1) && (__s1_len = strlen (sender), __s1_len < 4) ? (__builtin_constant_p ("MAILER-DAEMON") && ((size_t)(const void *)(("MAILER-DAEMON") + 1) - (size_t)(const void *)("MAILER-DAEMON") == 1) ? __builtin_strcmp (sender, "MAILER-DAEMON" ) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("MAILER-DAEMON"); int __result = ((( const unsigned char *) (const char *) (sender))[0] - __s2[0]) ; if (__s1_len > 0 && __result == 0) { __result = ( ((const unsigned char *) (const char *) (sender))[1] - __s2[1 ]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (sender))[2] - __s2 [2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (sender))[3] - __s2 [3]); } } __result; }))) : (__builtin_constant_p ("MAILER-DAEMON" ) && ((size_t)(const void *)(("MAILER-DAEMON") + 1) - (size_t)(const void *)("MAILER-DAEMON") == 1) && (__s2_len = strlen ("MAILER-DAEMON"), __s2_len < 4) ? (__builtin_constant_p (sender) && ((size_t)(const void *)((sender) + 1) - ( size_t)(const void *)(sender) == 1) ? __builtin_strcmp (sender , "MAILER-DAEMON") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (sender); int __result = (((const unsigned char *) (const char *) ("MAILER-DAEMON" ))[0] - __s2[0]); if (__s2_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("MAILER-DAEMON" ))[1] - __s2[1]); if (__s2_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("MAILER-DAEMON" ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) ("MAILER-DAEMON" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (sender , "MAILER-DAEMON")))); }) == 0) |
| 97 | mbox->is_internal = TRUE(!(0)); |
| 98 | return TRUE(!(0)); |
| 99 | } |
| 100 | |
| 101 | |
| 102 | /* Check if this is a Content-Type-line. If it contains a boundary |
| 103 | | field, copy boundary string to buffer (including two leading and |
| 104 | | trailing dashes marking the end of a multipart mail) and return |
| 105 | | true. Otherwise, return false. |
| 106 | */ |
| 107 | static gint |
| 108 | is_multipart_mail(gchar *buf, gchar *separator) |
| 109 | { |
| 110 | gchar *fieldstart; |
| 111 | gchar *sepstart; |
| 112 | gint seplen; |
| 113 | |
| 114 | if (strncmp(buf, "Content-Type: ", 14)(__extension__ (__builtin_constant_p (14) && ((__builtin_constant_p (buf) && strlen (buf) < ((size_t) (14))) || (__builtin_constant_p ("Content-Type: ") && strlen ("Content-Type: ") < ((size_t) (14)))) ? __extension__ ({ size_t __s1_len, __s2_len ; (__builtin_constant_p (buf) && __builtin_constant_p ("Content-Type: ") && (__s1_len = strlen (buf), __s2_len = strlen ("Content-Type: "), (!((size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf) == 1) || __s1_len >= 4 ) && (!((size_t)(const void *)(("Content-Type: ") + 1 ) - (size_t)(const void *)("Content-Type: ") == 1) || __s2_len >= 4)) ? __builtin_strcmp (buf, "Content-Type: ") : (__builtin_constant_p (buf) && ((size_t)(const void *)((buf) + 1) - (size_t )(const void *)(buf) == 1) && (__s1_len = strlen (buf ), __s1_len < 4) ? (__builtin_constant_p ("Content-Type: " ) && ((size_t)(const void *)(("Content-Type: ") + 1) - (size_t)(const void *)("Content-Type: ") == 1) ? __builtin_strcmp (buf, "Content-Type: ") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("Content-Type: " ); int __result = (((const unsigned char *) (const char *) (buf ))[0] - __s2[0]); if (__s1_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (buf) )[1] - __s2[1]); if (__s1_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (buf) )[2] - __s2[2]); if (__s1_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) (buf))[ 3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("Content-Type: " ) && ((size_t)(const void *)(("Content-Type: ") + 1) - (size_t)(const void *)("Content-Type: ") == 1) && (__s2_len = strlen ("Content-Type: "), __s2_len < 4) ? (__builtin_constant_p (buf) && ((size_t)(const void *)((buf) + 1) - (size_t )(const void *)(buf) == 1) ? __builtin_strcmp (buf, "Content-Type: " ) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (buf); int __result = (((const unsigned char *) (const char *) ("Content-Type: "))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("Content-Type: "))[1] - __s2 [1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("Content-Type: " ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) ("Content-Type: " ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (buf , "Content-Type: ")))); }) : strncmp (buf, "Content-Type: ", 14 ))) != 0) |
| 115 | return FALSE(0); |
| 116 | if (strncmp(&buf[14], "multipart/", 10)(__extension__ (__builtin_constant_p (10) && ((__builtin_constant_p (&buf[14]) && strlen (&buf[14]) < ((size_t ) (10))) || (__builtin_constant_p ("multipart/") && strlen ("multipart/") < ((size_t) (10)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (&buf[14]) && __builtin_constant_p ("multipart/") && (__s1_len = strlen (&buf[14]), __s2_len = strlen ("multipart/"), (!((size_t )(const void *)((&buf[14]) + 1) - (size_t)(const void *)( &buf[14]) == 1) || __s1_len >= 4) && (!((size_t )(const void *)(("multipart/") + 1) - (size_t)(const void *)( "multipart/") == 1) || __s2_len >= 4)) ? __builtin_strcmp ( &buf[14], "multipart/") : (__builtin_constant_p (&buf [14]) && ((size_t)(const void *)((&buf[14]) + 1) - (size_t)(const void *)(&buf[14]) == 1) && (__s1_len = strlen (&buf[14]), __s1_len < 4) ? (__builtin_constant_p ("multipart/") && ((size_t)(const void *)(("multipart/" ) + 1) - (size_t)(const void *)("multipart/") == 1) ? __builtin_strcmp (&buf[14], "multipart/") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("multipart/" ); int __result = (((const unsigned char *) (const char *) (& buf[14]))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ( &buf[14]))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ( &buf[14]))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (& buf[14]))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("multipart/") && ((size_t)(const void *)(("multipart/" ) + 1) - (size_t)(const void *)("multipart/") == 1) && (__s2_len = strlen ("multipart/"), __s2_len < 4) ? (__builtin_constant_p (&buf[14]) && ((size_t)(const void *)((&buf[ 14]) + 1) - (size_t)(const void *)(&buf[14]) == 1) ? __builtin_strcmp (&buf[14], "multipart/") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (&buf [14]); int __result = (((const unsigned char *) (const char * ) ("multipart/"))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("multipart/"))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("multipart/"))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("multipart/"))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (&buf[14], "multipart/")))); }) : strncmp (&buf[14], "multipart/", 10))) != 0) |
| 117 | return FALSE(0); |
| 118 | fieldstart = &buf[14]; |
| 119 | while (*fieldstart!=0) |
| 120 | { |
| 121 | while (*fieldstart!=0 && *fieldstart!=';') |
| 122 | fieldstart++; |
| 123 | if (*fieldstart==';') fieldstart++; |
| 124 | while (*fieldstart!=0 && *fieldstart==' ') |
| 125 | fieldstart++; |
| 126 | if (strncmp(fieldstart, "boundary=", 9)(__extension__ (__builtin_constant_p (9) && ((__builtin_constant_p (fieldstart) && strlen (fieldstart) < ((size_t) ( 9))) || (__builtin_constant_p ("boundary=") && strlen ("boundary=") < ((size_t) (9)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (fieldstart) && __builtin_constant_p ("boundary=") && (__s1_len = strlen (fieldstart), __s2_len = strlen ("boundary="), (!((size_t)(const void *)((fieldstart) + 1) - (size_t)(const void *)(fieldstart ) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("boundary=") + 1) - (size_t)(const void *)("boundary=") == 1) || __s2_len >= 4)) ? __builtin_strcmp (fieldstart, "boundary=" ) : (__builtin_constant_p (fieldstart) && ((size_t)(const void *)((fieldstart) + 1) - (size_t)(const void *)(fieldstart ) == 1) && (__s1_len = strlen (fieldstart), __s1_len < 4) ? (__builtin_constant_p ("boundary=") && ((size_t )(const void *)(("boundary=") + 1) - (size_t)(const void *)("boundary=" ) == 1) ? __builtin_strcmp (fieldstart, "boundary=") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("boundary="); int __result = (((const unsigned char *) (const char *) (fieldstart))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (fieldstart))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (fieldstart))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (fieldstart))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("boundary=") && ((size_t )(const void *)(("boundary=") + 1) - (size_t)(const void *)("boundary=" ) == 1) && (__s2_len = strlen ("boundary="), __s2_len < 4) ? (__builtin_constant_p (fieldstart) && ((size_t )(const void *)((fieldstart) + 1) - (size_t)(const void *)(fieldstart ) == 1) ? __builtin_strcmp (fieldstart, "boundary=") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (fieldstart); int __result = (((const unsigned char * ) (const char *) ("boundary="))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("boundary="))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("boundary="))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("boundary="))[3] - __s2[3]); } } __result ; })))) : __builtin_strcmp (fieldstart, "boundary=")))); }) : strncmp (fieldstart, "boundary=", 9))) == 0) |
| 127 | { |
| 128 | sepstart = fieldstart + 9; |
| 129 | if (sepstart[0]=='"') |
| 130 | { |
| 131 | sepstart++; |
| 132 | seplen = 0; |
| 133 | while (sepstart[seplen]!='"' && sepstart[seplen]>=32) |
| 134 | seplen++; |
| 135 | } |
| 136 | else |
| 137 | { |
| 138 | seplen = 0; |
| 139 | while (sepstart[seplen]!=';' && sepstart[seplen]>32) |
| 140 | seplen++; |
| 141 | } |
| 142 | strcpy(separator,"--"); |
| 143 | strncpy(&separator[2],sepstart,seplen)__builtin_strncpy (&separator[2], sepstart, seplen); |
| 144 | strcpy(&separator[seplen+2],"--"); |
| 145 | return TRUE(!(0)); |
| 146 | } |
| 147 | } |
| 148 | return FALSE(0); |
| 149 | } |
| 150 | |
| 151 | static gboolean |
| 152 | mh_sequences_new_count(Mailbox *mbox) |
| 153 | { |
| 154 | FILE *f; |
| 155 | gchar buf[1024]; |
| 156 | gchar *path, *tok; |
| 157 | gint n0, n1; |
| 158 | |
| 159 | path = g_strconcat(mbox->path, G_DIR_SEPARATOR_S"/", |
| 160 | ".mh_sequences", NULL((void*)0)); |
| 161 | f = fopen(path, "r"); |
| 162 | g_free(path); |
| 163 | if (!f) |
| 164 | return FALSE(0); |
| 165 | while (fgets(buf, sizeof(buf), f)) |
| 166 | { |
| 167 | /* Look for unseen sequence like "unseen: 4 7-9 23" |
| 168 | */ |
| 169 | if (strncmp(buf, "unseen:", 7)(__extension__ (__builtin_constant_p (7) && ((__builtin_constant_p (buf) && strlen (buf) < ((size_t) (7))) || (__builtin_constant_p ("unseen:") && strlen ("unseen:") < ((size_t) (7) ))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (buf) && __builtin_constant_p ("unseen:") && (__s1_len = strlen (buf), __s2_len = strlen ("unseen:"), (!( (size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf ) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("unseen:") + 1) - (size_t)(const void *)("unseen:") == 1 ) || __s2_len >= 4)) ? __builtin_strcmp (buf, "unseen:") : (__builtin_constant_p (buf) && ((size_t)(const void * )((buf) + 1) - (size_t)(const void *)(buf) == 1) && ( __s1_len = strlen (buf), __s1_len < 4) ? (__builtin_constant_p ("unseen:") && ((size_t)(const void *)(("unseen:") + 1) - (size_t)(const void *)("unseen:") == 1) ? __builtin_strcmp (buf, "unseen:") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("unseen:"); int __result = (((const unsigned char *) (const char *) (buf))[0] - __s2[ 0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (buf))[1] - __s2[ 1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (buf))[2] - __s2[ 2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (buf))[3] - __s2[3] ); } } __result; }))) : (__builtin_constant_p ("unseen:") && ((size_t)(const void *)(("unseen:") + 1) - (size_t)(const void *)("unseen:") == 1) && (__s2_len = strlen ("unseen:" ), __s2_len < 4) ? (__builtin_constant_p (buf) && ( (size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf ) == 1) ? __builtin_strcmp (buf, "unseen:") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (buf); int __result = (((const unsigned char *) (const char *) ("unseen:"))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("unseen:"))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("unseen:"))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("unseen:"))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (buf, "unseen:")))); }) : strncmp (buf, "unseen:", 7)))) |
| 170 | continue; |
| 171 | tok = strtok(buf, " \t\n"); |
Value stored to 'tok' is never read | |
| 172 | while ((tok = strtok(NULL((void*)0), " \t\n")) != NULL((void*)0)) |
| 173 | { |
| 174 | if (sscanf(tok, "%d-%d", &n0, &n1) == 2) |
| 175 | mbox->new_mail_count += n1 - n0 + 1; |
| 176 | else |
| 177 | mbox->new_mail_count++; |
| 178 | } |
| 179 | break; |
| 180 | } |
| 181 | fclose(f); |
| 182 | return TRUE(!(0)); |
| 183 | } |
| 184 | |
| 185 | /* Sylpheed procmsg.h enums MSG_NEW as (1 << 0) and MSG_UNREAD as (1 << 1) |
| 186 | | And procmsg_write_flags() in Sylpheeds procmsg.c writes a mail record as |
| 187 | | a pair of ints with msgnum first followed by flags. |
| 188 | */ |
| 189 | #define SYLPHEED_MSG_NEW1 1 |
| 190 | #define SYLPHEED_MSG_UNREAD2 2 |
| 191 | #define SYLPHEED_MARK_VERSION2 2 |
| 192 | |
| 193 | static gboolean |
| 194 | sylpheed_mark_new_count(Mailbox *mbox) |
| 195 | { |
| 196 | FILE *f; |
| 197 | gchar *path; |
| 198 | gint msgnum, flags, ver, mark_files = 0; |
| 199 | |
| 200 | path = g_strconcat(mbox->path, G_DIR_SEPARATOR_S"/", |
| 201 | ".sylpheed_mark", NULL((void*)0)); |
| 202 | f = fopen(path, "rb"); |
| 203 | g_free(path); |
| 204 | if (!f) |
| 205 | return FALSE(0); |
| 206 | |
| 207 | if ( fread(&ver, sizeof(ver), 1, f) == 1 |
| 208 | && SYLPHEED_MARK_VERSION2 == ver |
| 209 | ) |
| 210 | { |
| 211 | while ( fread(&msgnum, sizeof(msgnum), 1, f) == 1 |
| 212 | && fread(&flags, sizeof(flags), 1, f) == 1 |
| 213 | ) |
| 214 | { |
| 215 | if ( (flags & SYLPHEED_MSG_NEW1) |
| 216 | || ((flags & SYLPHEED_MSG_UNREAD2) && unseen_is_new) |
| 217 | ) |
| 218 | mbox->new_mail_count += 1; |
| 219 | ++mark_files; |
| 220 | } |
| 221 | if (mark_files < mbox->mail_count) |
| 222 | mbox->new_mail_count += mbox->mail_count - mark_files; |
| 223 | } |
| 224 | fclose(f); |
| 225 | return TRUE(!(0)); |
| 226 | } |
| 227 | |
| 228 | |
| 229 | /* Check a mh directory for mail. The way that messages are marked as new |
| 230 | | depends on the MUA being using. Only .mh_sequences and .sylpheed_mark |
| 231 | | are currently checked, otherwise all mail found is considered new mail. |
| 232 | */ |
| 233 | static gboolean |
| 234 | check_mh_dir(Mailbox *mbox) |
| 235 | { |
| 236 | GDir *dir; |
| 237 | gchar *name; |
| 238 | |
| 239 | mbox->mail_count = mbox->new_mail_count = 0; |
| 240 | |
| 241 | if ((dir = g_dir_open(mbox->path, 0, NULL((void*)0))) == NULL((void*)0)) |
| 242 | return FALSE(0); |
| 243 | while ((name = (gchar *) g_dir_read_name(dir)) != NULL((void*)0)) |
| 244 | { |
| 245 | /* Files starting with a digit are messages. */ |
| 246 | if (isdigit((unsigned char)name[0])((*__ctype_b_loc ())[(int) (((unsigned char)name[0]))] & ( unsigned short int) _ISdigit)) |
| 247 | mbox->mail_count++; |
| 248 | } |
| 249 | g_dir_close(dir); |
| 250 | |
| 251 | /* Some MH dir clients use .mh_sequences, others such as mutt or gnus |
| 252 | | do not. For mixed cases, it's a user option to ignore .mh_sequences. |
| 253 | | Sylpheed uses .sylpheed_mark. |
| 254 | */ |
| 255 | if ( !mh_sequences_new_count(mbox) |
| 256 | && !sylpheed_mark_new_count(mbox) |
| 257 | ) |
| 258 | mbox->new_mail_count = mbox->mail_count; |
| 259 | |
| 260 | return TRUE(!(0)); |
| 261 | } |
| 262 | |
| 263 | |
| 264 | /* A maildir has new, cur, and tmp subdirectories. Any file in new |
| 265 | | or cur that does not begin with a '.' is a mail message. It is |
| 266 | | suggested that messages begin with the output of time() (9 digits) |
| 267 | | but while mutt and qmail use this standard, procmail does not. |
| 268 | | maildir(5) says: |
| 269 | | It is a good idea for readers to skip all filenames in |
| 270 | | new and cur starting with a dot. Other than this, |
| 271 | | readers should not attempt to parse filenames. |
| 272 | | So check_maildir() simply looks for files in new and cur. |
| 273 | | But if unseen_is_new flag is set, look for ":2,*S" file suffix where |
| 274 | | the 'S' indicates the mail is seen. |
| 275 | | See http://cr.yp.to/proto/maildir.html |
| 276 | */ |
| 277 | static gboolean |
| 278 | check_maildir(Mailbox *mbox) |
| 279 | { |
| 280 | gchar path[256], *s; |
| 281 | gchar *name; |
| 282 | GDir *dir; |
| 283 | |
| 284 | mbox->new_mail_count = 0; |
| 285 | snprintf(path, sizeof(path), "%s%cnew", mbox->path, |
| 286 | G_DIR_SEPARATOR'/'); |
| 287 | if ((dir = g_dir_open(path, 0, NULL((void*)0))) != NULL((void*)0)) |
| 288 | { |
| 289 | while ((name = (gchar *) g_dir_read_name(dir)) != NULL((void*)0)) |
| 290 | mbox->new_mail_count++; |
| 291 | g_dir_close(dir); |
| 292 | } |
| 293 | mbox->mail_count = mbox->new_mail_count; |
| 294 | snprintf(path, sizeof(path), "%s%ccur", mbox->path, |
| 295 | G_DIR_SEPARATOR'/'); |
| 296 | if ((dir = g_dir_open(path, 0, NULL((void*)0))) != NULL((void*)0)) |
| 297 | { |
| 298 | while ((name = (gchar *) g_dir_read_name(dir)) != NULL((void*)0)) |
| 299 | { |
| 300 | mbox->mail_count++; |
| 301 | if ( unseen_is_new |
| 302 | && ( (s = strchr(name, ':')(__extension__ (__builtin_constant_p (':') && !__builtin_constant_p (name) && (':') == '\0' ? (char *) __rawmemchr (name , ':') : __builtin_strchr (name, ':')))) == NULL((void*)0) |
| 303 | || !strchr(s, 'S')(__extension__ (__builtin_constant_p ('S') && !__builtin_constant_p (s) && ('S') == '\0' ? (char *) __rawmemchr (s, 'S') : __builtin_strchr (s, 'S'))) |
| 304 | ) |
| 305 | ) |
| 306 | mbox->new_mail_count++; |
| 307 | } |
| 308 | g_dir_close(dir); |
| 309 | } |
| 310 | |
| 311 | if (_GK.debug_level & DEBUG_MAIL0x10) |
| 312 | g_print(_("mdir %s total=%d old=%d new=%d\n")dcgettext ("gkrellmd", "mdir %s total=%d old=%d new=%d\n", 5), mbox->path, |
| 313 | mbox->mail_count, mbox->old_mail_count, mbox->new_mail_count); |
| 314 | return TRUE(!(0)); |
| 315 | } |
| 316 | |
| 317 | |
| 318 | /* Count total mail and old mail in a mailbox. Old mail can be read |
| 319 | | with a Status: R0, or can be accessed and not read with Status: O |
| 320 | | So, new mail will be the diff - note that unread mail is not |
| 321 | | necessarily new mail. According to stat() man page: |
| 322 | | st_atime is changed by mknod(), utime(), read(), write(), truncate() |
| 323 | | st_mtime is changed by mknod(), utime(), write() |
| 324 | | But, new mail arriving (writing mailbox) sets st_mtime while reading |
| 325 | | the mailbox (mail program reading) sets st_atime. So the test |
| 326 | | st_atime > st_mtime is testing if mbox has been read since last new mail. |
| 327 | | Mail readers may restore st_mtime after writting status. |
| 328 | | And Netscape mail does status with X-Mozilla-Status: xxxS |
| 329 | | where S is bitwise or of status flags: |
| 330 | | 1: read 2: replied 4: marked 8: deleted |
| 331 | | |
| 332 | | Evolution uses status with X-Evolution: 00000000-xxxx where xxxx status is |
| 333 | | a bitfield in hexadecimal (see enum _CamelMessageFlags in evolution/camel |
| 334 | | source) and most importantly CAMEL_MESSAGE_SEEN = 1<<4. |
| 335 | */ |
| 336 | /* test if buf is a status for standard mail, mozilla or evolution |
| 337 | */ |
| 338 | static gboolean |
| 339 | is_status(gchar *buf) |
| 340 | { |
| 341 | if (buf[0] != 'S' && buf[0] != 'X') |
| 342 | return FALSE(0); |
| 343 | |
| 344 | if ( !strncmp(buf, "Status:", 7)(__extension__ (__builtin_constant_p (7) && ((__builtin_constant_p (buf) && strlen (buf) < ((size_t) (7))) || (__builtin_constant_p ("Status:") && strlen ("Status:") < ((size_t) (7) ))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (buf) && __builtin_constant_p ("Status:") && (__s1_len = strlen (buf), __s2_len = strlen ("Status:"), (!( (size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf ) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("Status:") + 1) - (size_t)(const void *)("Status:") == 1 ) || __s2_len >= 4)) ? __builtin_strcmp (buf, "Status:") : (__builtin_constant_p (buf) && ((size_t)(const void * )((buf) + 1) - (size_t)(const void *)(buf) == 1) && ( __s1_len = strlen (buf), __s1_len < 4) ? (__builtin_constant_p ("Status:") && ((size_t)(const void *)(("Status:") + 1) - (size_t)(const void *)("Status:") == 1) ? __builtin_strcmp (buf, "Status:") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("Status:"); int __result = (((const unsigned char *) (const char *) (buf))[0] - __s2[ 0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (buf))[1] - __s2[ 1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (buf))[2] - __s2[ 2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (buf))[3] - __s2[3] ); } } __result; }))) : (__builtin_constant_p ("Status:") && ((size_t)(const void *)(("Status:") + 1) - (size_t)(const void *)("Status:") == 1) && (__s2_len = strlen ("Status:" ), __s2_len < 4) ? (__builtin_constant_p (buf) && ( (size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf ) == 1) ? __builtin_strcmp (buf, "Status:") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (buf); int __result = (((const unsigned char *) (const char *) ("Status:"))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("Status:"))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("Status:"))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("Status:"))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (buf, "Status:")))); }) : strncmp (buf, "Status:", 7))) /* Standard mail clients */ |
| 345 | || !strncmp(buf, "X-Mozilla-Status:", 17)(__extension__ (__builtin_constant_p (17) && ((__builtin_constant_p (buf) && strlen (buf) < ((size_t) (17))) || (__builtin_constant_p ("X-Mozilla-Status:") && strlen ("X-Mozilla-Status:" ) < ((size_t) (17)))) ? __extension__ ({ size_t __s1_len, __s2_len ; (__builtin_constant_p (buf) && __builtin_constant_p ("X-Mozilla-Status:") && (__s1_len = strlen (buf), __s2_len = strlen ("X-Mozilla-Status:"), (!((size_t)(const void *)((buf ) + 1) - (size_t)(const void *)(buf) == 1) || __s1_len >= 4 ) && (!((size_t)(const void *)(("X-Mozilla-Status:") + 1) - (size_t)(const void *)("X-Mozilla-Status:") == 1) || __s2_len >= 4)) ? __builtin_strcmp (buf, "X-Mozilla-Status:") : (__builtin_constant_p (buf) && ((size_t)(const void *)((buf) + 1) - (size_t )(const void *)(buf) == 1) && (__s1_len = strlen (buf ), __s1_len < 4) ? (__builtin_constant_p ("X-Mozilla-Status:" ) && ((size_t)(const void *)(("X-Mozilla-Status:") + 1 ) - (size_t)(const void *)("X-Mozilla-Status:") == 1) ? __builtin_strcmp (buf, "X-Mozilla-Status:") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("X-Mozilla-Status:" ); int __result = (((const unsigned char *) (const char *) (buf ))[0] - __s2[0]); if (__s1_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (buf) )[1] - __s2[1]); if (__s1_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (buf) )[2] - __s2[2]); if (__s1_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) (buf))[ 3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("X-Mozilla-Status:" ) && ((size_t)(const void *)(("X-Mozilla-Status:") + 1 ) - (size_t)(const void *)("X-Mozilla-Status:") == 1) && (__s2_len = strlen ("X-Mozilla-Status:"), __s2_len < 4) ? (__builtin_constant_p (buf) && ((size_t)(const void * )((buf) + 1) - (size_t)(const void *)(buf) == 1) ? __builtin_strcmp (buf, "X-Mozilla-Status:") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (buf); int __result = (((const unsigned char *) (const char *) ("X-Mozilla-Status:" ))[0] - __s2[0]); if (__s2_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("X-Mozilla-Status:" ))[1] - __s2[1]); if (__s2_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("X-Mozilla-Status:" ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) ("X-Mozilla-Status:" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (buf , "X-Mozilla-Status:")))); }) : strncmp (buf, "X-Mozilla-Status:" , 17))) /* Netscape */ |
| 346 | || !strncmp(buf, "X-Evolution:", 12)(__extension__ (__builtin_constant_p (12) && ((__builtin_constant_p (buf) && strlen (buf) < ((size_t) (12))) || (__builtin_constant_p ("X-Evolution:") && strlen ("X-Evolution:") < ((size_t ) (12)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (buf) && __builtin_constant_p ("X-Evolution:") && (__s1_len = strlen (buf), __s2_len = strlen ("X-Evolution:") , (!((size_t)(const void *)((buf) + 1) - (size_t)(const void * )(buf) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("X-Evolution:") + 1) - (size_t)(const void *)("X-Evolution:" ) == 1) || __s2_len >= 4)) ? __builtin_strcmp (buf, "X-Evolution:" ) : (__builtin_constant_p (buf) && ((size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf) == 1) && (__s1_len = strlen (buf), __s1_len < 4) ? (__builtin_constant_p ("X-Evolution:") && ((size_t)(const void *)(("X-Evolution:" ) + 1) - (size_t)(const void *)("X-Evolution:") == 1) ? __builtin_strcmp (buf, "X-Evolution:") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("X-Evolution:" ); int __result = (((const unsigned char *) (const char *) (buf ))[0] - __s2[0]); if (__s1_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (buf) )[1] - __s2[1]); if (__s1_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (buf) )[2] - __s2[2]); if (__s1_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) (buf))[ 3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("X-Evolution:" ) && ((size_t)(const void *)(("X-Evolution:") + 1) - ( size_t)(const void *)("X-Evolution:") == 1) && (__s2_len = strlen ("X-Evolution:"), __s2_len < 4) ? (__builtin_constant_p (buf) && ((size_t)(const void *)((buf) + 1) - (size_t )(const void *)(buf) == 1) ? __builtin_strcmp (buf, "X-Evolution:" ) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (buf); int __result = (((const unsigned char *) (const char *) ("X-Evolution:"))[0] - __s2[0]); if ( __s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("X-Evolution:"))[1] - __s2[ 1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("X-Evolution:")) [2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("X-Evolution:" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (buf , "X-Evolution:")))); }) : strncmp (buf, "X-Evolution:", 12)) ) /* Mozilla */ |
| 347 | ) |
| 348 | return TRUE(!(0)); |
| 349 | else |
| 350 | return FALSE(0); |
| 351 | } |
| 352 | |
| 353 | static gboolean |
| 354 | status_is_old(gchar *buf) |
| 355 | { |
| 356 | gchar c; |
| 357 | int tmp; |
| 358 | |
| 359 | /* Standard mail clients |
| 360 | */ |
| 361 | if ( !strncmp(buf, "Status:", 7)(__extension__ (__builtin_constant_p (7) && ((__builtin_constant_p (buf) && strlen (buf) < ((size_t) (7))) || (__builtin_constant_p ("Status:") && strlen ("Status:") < ((size_t) (7) ))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (buf) && __builtin_constant_p ("Status:") && (__s1_len = strlen (buf), __s2_len = strlen ("Status:"), (!( (size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf ) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("Status:") + 1) - (size_t)(const void *)("Status:") == 1 ) || __s2_len >= 4)) ? __builtin_strcmp (buf, "Status:") : (__builtin_constant_p (buf) && ((size_t)(const void * )((buf) + 1) - (size_t)(const void *)(buf) == 1) && ( __s1_len = strlen (buf), __s1_len < 4) ? (__builtin_constant_p ("Status:") && ((size_t)(const void *)(("Status:") + 1) - (size_t)(const void *)("Status:") == 1) ? __builtin_strcmp (buf, "Status:") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("Status:"); int __result = (((const unsigned char *) (const char *) (buf))[0] - __s2[ 0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (buf))[1] - __s2[ 1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (buf))[2] - __s2[ 2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (buf))[3] - __s2[3] ); } } __result; }))) : (__builtin_constant_p ("Status:") && ((size_t)(const void *)(("Status:") + 1) - (size_t)(const void *)("Status:") == 1) && (__s2_len = strlen ("Status:" ), __s2_len < 4) ? (__builtin_constant_p (buf) && ( (size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf ) == 1) ? __builtin_strcmp (buf, "Status:") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (buf); int __result = (((const unsigned char *) (const char *) ("Status:"))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("Status:"))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("Status:"))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("Status:"))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (buf, "Status:")))); }) : strncmp (buf, "Status:", 7))) |
| 362 | && (strchr(buf, 'R')(__extension__ (__builtin_constant_p ('R') && !__builtin_constant_p (buf) && ('R') == '\0' ? (char *) __rawmemchr (buf, 'R' ) : __builtin_strchr (buf, 'R'))) || (!unseen_is_new && strchr(buf, 'O')(__extension__ (__builtin_constant_p ('O') && !__builtin_constant_p (buf) && ('O') == '\0' ? (char *) __rawmemchr (buf, 'O' ) : __builtin_strchr (buf, 'O'))))) |
| 363 | ) |
| 364 | return TRUE(!(0)); |
| 365 | |
| 366 | /* Netscape |
| 367 | */ |
| 368 | if (!strncmp(buf, "X-Mozilla-Status:", 17)(__extension__ (__builtin_constant_p (17) && ((__builtin_constant_p (buf) && strlen (buf) < ((size_t) (17))) || (__builtin_constant_p ("X-Mozilla-Status:") && strlen ("X-Mozilla-Status:" ) < ((size_t) (17)))) ? __extension__ ({ size_t __s1_len, __s2_len ; (__builtin_constant_p (buf) && __builtin_constant_p ("X-Mozilla-Status:") && (__s1_len = strlen (buf), __s2_len = strlen ("X-Mozilla-Status:"), (!((size_t)(const void *)((buf ) + 1) - (size_t)(const void *)(buf) == 1) || __s1_len >= 4 ) && (!((size_t)(const void *)(("X-Mozilla-Status:") + 1) - (size_t)(const void *)("X-Mozilla-Status:") == 1) || __s2_len >= 4)) ? __builtin_strcmp (buf, "X-Mozilla-Status:") : (__builtin_constant_p (buf) && ((size_t)(const void *)((buf) + 1) - (size_t )(const void *)(buf) == 1) && (__s1_len = strlen (buf ), __s1_len < 4) ? (__builtin_constant_p ("X-Mozilla-Status:" ) && ((size_t)(const void *)(("X-Mozilla-Status:") + 1 ) - (size_t)(const void *)("X-Mozilla-Status:") == 1) ? __builtin_strcmp (buf, "X-Mozilla-Status:") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("X-Mozilla-Status:" ); int __result = (((const unsigned char *) (const char *) (buf ))[0] - __s2[0]); if (__s1_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (buf) )[1] - __s2[1]); if (__s1_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (buf) )[2] - __s2[2]); if (__s1_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) (buf))[ 3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("X-Mozilla-Status:" ) && ((size_t)(const void *)(("X-Mozilla-Status:") + 1 ) - (size_t)(const void *)("X-Mozilla-Status:") == 1) && (__s2_len = strlen ("X-Mozilla-Status:"), __s2_len < 4) ? (__builtin_constant_p (buf) && ((size_t)(const void * )((buf) + 1) - (size_t)(const void *)(buf) == 1) ? __builtin_strcmp (buf, "X-Mozilla-Status:") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (buf); int __result = (((const unsigned char *) (const char *) ("X-Mozilla-Status:" ))[0] - __s2[0]); if (__s2_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("X-Mozilla-Status:" ))[1] - __s2[1]); if (__s2_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("X-Mozilla-Status:" ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) ("X-Mozilla-Status:" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (buf , "X-Mozilla-Status:")))); }) : strncmp (buf, "X-Mozilla-Status:" , 17)))) |
| 369 | { |
| 370 | c = buf[21]; |
| 371 | if (c < '8') /* Not deleted */ |
| 372 | c -= '0'; |
| 373 | if (c >= '8' || (c & 0x1)) |
| 374 | return TRUE(!(0)); |
| 375 | } |
| 376 | |
| 377 | /* Evolution |
| 378 | */ |
| 379 | if (!strncmp(buf, "X-Evolution:", 12)(__extension__ (__builtin_constant_p (12) && ((__builtin_constant_p (buf) && strlen (buf) < ((size_t) (12))) || (__builtin_constant_p ("X-Evolution:") && strlen ("X-Evolution:") < ((size_t ) (12)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (buf) && __builtin_constant_p ("X-Evolution:") && (__s1_len = strlen (buf), __s2_len = strlen ("X-Evolution:") , (!((size_t)(const void *)((buf) + 1) - (size_t)(const void * )(buf) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("X-Evolution:") + 1) - (size_t)(const void *)("X-Evolution:" ) == 1) || __s2_len >= 4)) ? __builtin_strcmp (buf, "X-Evolution:" ) : (__builtin_constant_p (buf) && ((size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf) == 1) && (__s1_len = strlen (buf), __s1_len < 4) ? (__builtin_constant_p ("X-Evolution:") && ((size_t)(const void *)(("X-Evolution:" ) + 1) - (size_t)(const void *)("X-Evolution:") == 1) ? __builtin_strcmp (buf, "X-Evolution:") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("X-Evolution:" ); int __result = (((const unsigned char *) (const char *) (buf ))[0] - __s2[0]); if (__s1_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (buf) )[1] - __s2[1]); if (__s1_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (buf) )[2] - __s2[2]); if (__s1_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) (buf))[ 3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("X-Evolution:" ) && ((size_t)(const void *)(("X-Evolution:") + 1) - ( size_t)(const void *)("X-Evolution:") == 1) && (__s2_len = strlen ("X-Evolution:"), __s2_len < 4) ? (__builtin_constant_p (buf) && ((size_t)(const void *)((buf) + 1) - (size_t )(const void *)(buf) == 1) ? __builtin_strcmp (buf, "X-Evolution:" ) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (buf); int __result = (((const unsigned char *) (const char *) ("X-Evolution:"))[0] - __s2[0]); if ( __s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("X-Evolution:"))[1] - __s2[ 1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("X-Evolution:")) [2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("X-Evolution:" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (buf , "X-Evolution:")))); }) : strncmp (buf, "X-Evolution:", 12)) )) |
| 380 | { |
| 381 | sscanf(buf+22, "%04x", &tmp); |
| 382 | if (tmp & (1<<4)) |
| 383 | return TRUE(!(0)); |
| 384 | } |
| 385 | |
| 386 | return FALSE(0); |
| 387 | } |
| 388 | |
| 389 | /* test if a mail is marked as deleted |
| 390 | | Evolution uses status with X-Evolution: 00000000-xxxx where xxxx status is |
| 391 | | a bitfield in hexadecimal (see enum _CamelMessageFlags in evolution/camel source) |
| 392 | | and most importantly CAMEL_MESSAGE_DELETED = 1<<1. |
| 393 | */ |
| 394 | static gboolean |
| 395 | status_is_deleted(gchar *buf) |
| 396 | { |
| 397 | gint tmp; |
| 398 | |
| 399 | /* Standard mail clients |
| 400 | if ( !strncmp(buf, "Status:", 7) ) |
| 401 | */ |
| 402 | /* Netscape |
| 403 | if (!strncmp(buf, "X-Mozilla-Status:", 17)) |
| 404 | */ |
| 405 | /* Evolution |
| 406 | */ |
| 407 | if (!strncmp(buf, "X-Evolution:", 12)(__extension__ (__builtin_constant_p (12) && ((__builtin_constant_p (buf) && strlen (buf) < ((size_t) (12))) || (__builtin_constant_p ("X-Evolution:") && strlen ("X-Evolution:") < ((size_t ) (12)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (buf) && __builtin_constant_p ("X-Evolution:") && (__s1_len = strlen (buf), __s2_len = strlen ("X-Evolution:") , (!((size_t)(const void *)((buf) + 1) - (size_t)(const void * )(buf) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("X-Evolution:") + 1) - (size_t)(const void *)("X-Evolution:" ) == 1) || __s2_len >= 4)) ? __builtin_strcmp (buf, "X-Evolution:" ) : (__builtin_constant_p (buf) && ((size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf) == 1) && (__s1_len = strlen (buf), __s1_len < 4) ? (__builtin_constant_p ("X-Evolution:") && ((size_t)(const void *)(("X-Evolution:" ) + 1) - (size_t)(const void *)("X-Evolution:") == 1) ? __builtin_strcmp (buf, "X-Evolution:") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("X-Evolution:" ); int __result = (((const unsigned char *) (const char *) (buf ))[0] - __s2[0]); if (__s1_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (buf) )[1] - __s2[1]); if (__s1_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (buf) )[2] - __s2[2]); if (__s1_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) (buf))[ 3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("X-Evolution:" ) && ((size_t)(const void *)(("X-Evolution:") + 1) - ( size_t)(const void *)("X-Evolution:") == 1) && (__s2_len = strlen ("X-Evolution:"), __s2_len < 4) ? (__builtin_constant_p (buf) && ((size_t)(const void *)((buf) + 1) - (size_t )(const void *)(buf) == 1) ? __builtin_strcmp (buf, "X-Evolution:" ) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (buf); int __result = (((const unsigned char *) (const char *) ("X-Evolution:"))[0] - __s2[0]); if ( __s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("X-Evolution:"))[1] - __s2[ 1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("X-Evolution:")) [2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("X-Evolution:" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (buf , "X-Evolution:")))); }) : strncmp (buf, "X-Evolution:", 12)) )) |
| 408 | { |
| 409 | sscanf(buf+22, "%04x", &tmp); |
| 410 | if (tmp & (1<<1)) |
| 411 | return TRUE(!(0)); |
| 412 | /* Junk is not explicitly marked as deleted but is shown as if |
| 413 | | where in evolution |
| 414 | */ |
| 415 | if (tmp & (1<<7)) |
| 416 | return TRUE(!(0)); |
| 417 | } |
| 418 | |
| 419 | return FALSE(0); |
| 420 | } |
| 421 | |
| 422 | static gboolean |
| 423 | check_mbox(Mailbox *mbox) |
| 424 | { |
| 425 | FILE *f; |
| 426 | struct utimbuf ut; |
| 427 | struct stat s; |
| 428 | gchar buf[1024]; |
| 429 | gchar mpart_sep[1024]; |
| 430 | gint in_header = FALSE(0); |
| 431 | gint marked_read = FALSE(0); |
| 432 | gint is_multipart = FALSE(0); |
| 433 | |
| 434 | if (stat(mbox->path, &s) != 0) |
| 435 | { |
| 436 | mbox->mail_count = mbox->old_mail_count = mbox->new_mail_count = 0; |
| 437 | mbox->last_mtime = 0; |
| 438 | mbox->last_size = 0; |
| 439 | gkrellm_debug(DEBUG_MAIL0x10, "check_mbox can't stat(%s): %s\n", |
| 440 | mbox->path, g_strerror(errno(*__errno_location ()))); |
| 441 | return FALSE(0); |
| 442 | } |
| 443 | |
| 444 | /* If the mailboxes have been modified since last check, count |
| 445 | | the new/total messages. |
| 446 | */ |
| 447 | if ( s.st_mtimest_mtim.tv_sec != mbox->last_mtime |
| 448 | || s.st_size != mbox->last_size |
| 449 | ) |
| 450 | { |
| 451 | if ((f = fopen(mbox->path, "r")) == NULL((void*)0)) |
| 452 | { |
| 453 | gkrellm_debug(DEBUG_MAIL0x10, "check_mbox can't fopen(%s): %s\n", |
| 454 | mbox->path, g_strerror(errno(*__errno_location ()))); |
| 455 | return FALSE(0); |
| 456 | } |
| 457 | mbox->mail_count = 0; |
| 458 | mbox->old_mail_count = 0; |
| 459 | while(fgets(buf, sizeof(buf), f)) |
| 460 | { |
| 461 | if (is_multipart && !in_header) |
| 462 | { |
| 463 | /* Skip to last line of multipart mail */ |
| 464 | if (strncmp(buf,mpart_sep,strlen(mpart_sep))(__extension__ (__builtin_constant_p (strlen(mpart_sep)) && ((__builtin_constant_p (buf) && strlen (buf) < (( size_t) (strlen(mpart_sep)))) || (__builtin_constant_p (mpart_sep ) && strlen (mpart_sep) < ((size_t) (strlen(mpart_sep ))))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (buf) && __builtin_constant_p (mpart_sep) && (__s1_len = strlen (buf), __s2_len = strlen (mpart_sep), (!( (size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf ) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((mpart_sep) + 1) - (size_t)(const void *)(mpart_sep) == 1 ) || __s2_len >= 4)) ? __builtin_strcmp (buf, mpart_sep) : (__builtin_constant_p (buf) && ((size_t)(const void * )((buf) + 1) - (size_t)(const void *)(buf) == 1) && ( __s1_len = strlen (buf), __s1_len < 4) ? (__builtin_constant_p (mpart_sep) && ((size_t)(const void *)((mpart_sep) + 1) - (size_t)(const void *)(mpart_sep) == 1) ? __builtin_strcmp (buf, mpart_sep) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (mpart_sep); int __result = (((const unsigned char *) (const char *) (buf))[0] - __s2[ 0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (buf))[1] - __s2[ 1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (buf))[2] - __s2[ 2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (buf))[3] - __s2[3] ); } } __result; }))) : (__builtin_constant_p (mpart_sep) && ((size_t)(const void *)((mpart_sep) + 1) - (size_t)(const void *)(mpart_sep) == 1) && (__s2_len = strlen (mpart_sep ), __s2_len < 4) ? (__builtin_constant_p (buf) && ( (size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf ) == 1) ? __builtin_strcmp (buf, mpart_sep) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (buf); int __result = (((const unsigned char *) (const char *) (mpart_sep))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (mpart_sep))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (mpart_sep))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (mpart_sep))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (buf, mpart_sep)))); }) : strncmp (buf, mpart_sep, strlen(mpart_sep ))))==0) |
| 465 | is_multipart = FALSE(0); |
| 466 | } |
| 467 | else if (buf[0] == '\n') |
| 468 | { |
| 469 | in_header = FALSE(0); |
| 470 | mbox->is_internal = FALSE(0); |
| 471 | } |
| 472 | else if (is_From_line(mbox, buf)) |
| 473 | { |
| 474 | mbox->mail_count += 1; |
| 475 | in_header = TRUE(!(0)); |
| 476 | marked_read = FALSE(0); |
| 477 | } |
| 478 | else if (in_header && is_status(buf)) |
| 479 | { |
| 480 | if (status_is_old(buf) && !marked_read) |
| 481 | { |
| 482 | mbox->old_mail_count += 1; |
| 483 | marked_read = TRUE(!(0)); |
| 484 | } |
| 485 | if (status_is_deleted(buf)) |
| 486 | { |
| 487 | if (marked_read) |
| 488 | mbox->old_mail_count -= 1; |
| 489 | mbox->mail_count -= 1; |
| 490 | } |
| 491 | } |
| 492 | else if (in_header && mbox->is_internal) |
| 493 | { |
| 494 | if (strncmp(buf, "From: Mail System Internal Data", 31)(__extension__ (__builtin_constant_p (31) && ((__builtin_constant_p (buf) && strlen (buf) < ((size_t) (31))) || (__builtin_constant_p ("From: Mail System Internal Data") && strlen ("From: Mail System Internal Data" ) < ((size_t) (31)))) ? __extension__ ({ size_t __s1_len, __s2_len ; (__builtin_constant_p (buf) && __builtin_constant_p ("From: Mail System Internal Data") && (__s1_len = strlen (buf), __s2_len = strlen ("From: Mail System Internal Data") , (!((size_t)(const void *)((buf) + 1) - (size_t)(const void * )(buf) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("From: Mail System Internal Data") + 1) - (size_t)( const void *)("From: Mail System Internal Data") == 1) || __s2_len >= 4)) ? __builtin_strcmp (buf, "From: Mail System Internal Data" ) : (__builtin_constant_p (buf) && ((size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf) == 1) && (__s1_len = strlen (buf), __s1_len < 4) ? (__builtin_constant_p ("From: Mail System Internal Data") && ((size_t)(const void *)(("From: Mail System Internal Data") + 1) - (size_t)( const void *)("From: Mail System Internal Data") == 1) ? __builtin_strcmp (buf, "From: Mail System Internal Data") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("From: Mail System Internal Data"); int __result = (((const unsigned char *) (const char *) (buf))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (buf))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (buf))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (buf))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("From: Mail System Internal Data") && ((size_t)(const void *)(("From: Mail System Internal Data") + 1) - (size_t)( const void *)("From: Mail System Internal Data") == 1) && (__s2_len = strlen ("From: Mail System Internal Data"), __s2_len < 4) ? (__builtin_constant_p (buf) && ((size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf) == 1) ? __builtin_strcmp (buf, "From: Mail System Internal Data") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (buf); int __result = (((const unsigned char *) (const char *) ("From: Mail System Internal Data"))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("From: Mail System Internal Data" ))[1] - __s2[1]); if (__s2_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("From: Mail System Internal Data" ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) ("From: Mail System Internal Data" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (buf , "From: Mail System Internal Data")))); }) : strncmp (buf, "From: Mail System Internal Data" , 31))) == 0) |
| 495 | { |
| 496 | in_header = FALSE(0); |
| 497 | mbox->mail_count -= 1; |
| 498 | mbox->is_internal = FALSE(0); |
| 499 | } |
| 500 | } |
| 501 | else if (in_header && is_multipart_mail(buf,mpart_sep)) |
| 502 | { |
| 503 | is_multipart = TRUE(!(0)); |
| 504 | } |
| 505 | } |
| 506 | fclose(f); |
| 507 | |
| 508 | /* Restore the mbox stat times for other mail checking programs and |
| 509 | | so the (st_atime > st_mtime) animation override below will work. |
| 510 | */ |
| 511 | ut.actime = s.st_atimest_atim.tv_sec; |
| 512 | ut.modtime = s.st_mtimest_mtim.tv_sec; |
| 513 | utime(mbox->path, &ut); |
| 514 | |
| 515 | mbox->last_mtime = s.st_mtimest_mtim.tv_sec; |
| 516 | mbox->last_size = s.st_size; |
| 517 | if (_GK.debug_level & DEBUG_MAIL0x10) |
| 518 | g_print("mbox read <%s> total=%d old=%d\n", |
| 519 | mbox->path, |
| 520 | mbox->mail_count, mbox->old_mail_count); |
| 521 | } |
| 522 | |
| 523 | /* If mbox has been accessed since last modify a MUA has probably read |
| 524 | | the mbox. |
| 525 | */ |
| 526 | mbox->new_mail_count = mbox->mail_count - mbox->old_mail_count; |
| 527 | if (s.st_atimest_atim.tv_sec > s.st_mtimest_mtim.tv_sec) |
| 528 | { |
| 529 | mbox->prev_new_mail_count = mbox->new_mail_count; |
| 530 | } |
| 531 | return TRUE(!(0)); |
| 532 | } |
| 533 | |
| 534 | |
| 535 | static void |
| 536 | update_mail(GkrellmdMonitor *mon, gboolean force) |
| 537 | { |
| 538 | Mailbox *mbox; |
| 539 | GList *list; |
| 540 | static gint second_count; |
| 541 | |
| 542 | if ( (!GK.second_tick || (++second_count % mail_check_timeout) != 0) |
| 543 | && !force |
| 544 | ) |
| 545 | return; |
| 546 | |
| 547 | for (list = mailbox_list; list; list = list->next) |
| 548 | { |
| 549 | mbox = (Mailbox *) list->data; |
| 550 | if (mbox->check_func) |
| 551 | (*mbox->check_func)(mbox); |
| 552 | |
| 553 | if ( mbox->prev_mail_count != mbox->mail_count |
| 554 | || mbox->prev_new_mail_count != mbox->new_mail_count |
| 555 | ) |
| 556 | { |
| 557 | mbox->changed = TRUE(!(0)); |
| 558 | mail_need_serve = TRUE(!(0)); |
| 559 | gkrellmd_need_serve(mon); |
| 560 | } |
| 561 | mbox->prev_mail_count = mbox->mail_count; |
| 562 | mbox->prev_new_mail_count = mbox->new_mail_count; |
| 563 | } |
| 564 | } |
| 565 | |
| 566 | |
| 567 | static void |
| 568 | get_local_mboxtype(Mailbox *mbox) |
| 569 | { |
| 570 | gchar *path; |
| 571 | |
| 572 | if (*(mbox->path) == '~') |
| 573 | { |
| 574 | mbox->homedir_path = mbox->path; |
| 575 | mbox->path = g_strdup_printf("%s%s", g_get_home_dir(), |
| 576 | mbox->homedir_path + 1); |
| 577 | } |
| 578 | if (g_file_test(mbox->path, G_FILE_TEST_IS_DIR)) |
| 579 | { |
| 580 | path = g_build_path(G_DIR_SEPARATOR_S"/", mbox->path, "new", NULL((void*)0)); |
| 581 | if (g_file_test(path, G_FILE_TEST_IS_DIR)) |
| 582 | mbox->mboxtype = MBOX_MAILDIR1; |
| 583 | else |
| 584 | mbox->mboxtype = MBOX_MH_DIR2; |
| 585 | g_free(path); |
| 586 | } |
| 587 | else |
| 588 | mbox->mboxtype = MBOX_MBOX0; |
| 589 | } |
| 590 | |
| 591 | void |
| 592 | gkrellmd_add_mailbox(gchar *path) |
| 593 | { |
| 594 | Mailbox *mbox; |
| 595 | |
| 596 | if (!path || !*path) |
| 597 | return; |
| 598 | mbox = g_new0(Mailbox, 1)(Mailbox *) (__extension__ ({ gsize __n = (gsize) (1); gsize __s = sizeof (Mailbox); gpointer __p; if (__s == 1) __p = g_malloc0 (__n); else if (__builtin_constant_p (__n) && (__s == 0 || __n <= (9223372036854775807L *2UL+1UL) / __s)) __p = g_malloc0 (__n * __s); else __p = g_malloc0_n (__n, __s); __p ; })); |
| 599 | mbox->path = g_strdup(path); |
| 600 | get_local_mboxtype(mbox); |
| 601 | |
| 602 | if (mbox->mboxtype == MBOX_MAILDIR1) |
| 603 | mbox->check_func = check_maildir; |
| 604 | else if (mbox->mboxtype == MBOX_MH_DIR2) |
| 605 | mbox->check_func = check_mh_dir; |
| 606 | else |
| 607 | mbox->check_func = check_mbox; |
| 608 | |
| 609 | mailbox_list = g_list_append(mailbox_list, mbox); |
| 610 | gkrellmd_add_serveflag_done(&mbox->changed); |
| 611 | } |
| 612 | |
| 613 | /* ============================================================= */ |
| 614 | |
| 615 | static void |
| 616 | serve_mail_data(GkrellmdMonitor *mon, gboolean first_serve) |
| 617 | { |
| 618 | Mailbox *mbox; |
| 619 | GList *list; |
| 620 | gchar *line; |
| 621 | |
| 622 | if ((!mail_need_serve && !first_serve) || !mailbox_list) |
| 623 | return; |
| 624 | gkrellmd_set_serve_name(mon, "mail"); |
| 625 | for (list = mailbox_list; list; list = list->next) |
| 626 | { |
| 627 | mbox = (Mailbox *) list->data; |
| 628 | if (mbox->changed || first_serve) |
| 629 | { |
| 630 | line = g_strdup_printf("%s %d %d\n", mbox->homedir_path ? |
| 631 | mbox->homedir_path : mbox->path, |
| 632 | mbox->mail_count, mbox->new_mail_count); |
| 633 | gkrellmd_serve_data(mon, line); |
| 634 | g_free(line); |
| 635 | } |
| 636 | } |
| 637 | } |
| 638 | |
| 639 | static void |
| 640 | serve_mail_setup(GkrellmdMonitor *mon) |
| 641 | { |
| 642 | GkrellmdClient *client = mon->privat->client; |
| 643 | GList *list; |
| 644 | Mailbox *mbox; |
| 645 | gchar *line; |
| 646 | |
| 647 | gkrellmd_send_to_client(client, "<mail_setup>\n"); |
| 648 | for (list = mailbox_list; list; list = list->next) |
| 649 | { |
| 650 | mbox = (Mailbox *) list->data; |
| 651 | line = g_strdup_printf("%s\n", mbox->homedir_path ? |
| 652 | mbox->homedir_path : mbox->path); |
| 653 | gkrellmd_send_to_client(client, line); |
| 654 | g_free(line); |
| 655 | } |
| 656 | } |
| 657 | |
| 658 | static GkrellmdMonitor mail_monitor = |
| 659 | { |
| 660 | "mail", |
| 661 | update_mail, |
| 662 | serve_mail_data, |
| 663 | serve_mail_setup |
| 664 | }; |
| 665 | |
| 666 | GkrellmdMonitor * |
| 667 | gkrellmd_init_mail_monitor(void) |
| 668 | { |
| 669 | gkrellmd_add_serveflag_done(&mail_need_serve); |
| 670 | return &mail_monitor; |
| 671 | } |
| 672 | |
| 673 | #else /* defined(WIN32) */ |
| 674 | |
| 675 | GkrellmdMonitor * |
| 676 | gkrellmd_init_mail_monitor(void) |
| 677 | { |
| 678 | return NULL((void*)0); |
| 679 | } |
| 680 | |
| 681 | void |
| 682 | gkrellmd_add_mailbox(gchar *path) |
| 683 | { |
| 684 | } |
| 685 | |
| 686 | #endif |
| 687 | |
| 688 | |
| 689 | void |
| 690 | gkrellm_mail_local_unsupported(void) |
| 691 | { |
| 692 | /* WIN32 only calls this and it is taken care of by above #if */ |
| 693 | } |
| 694 | |
| 695 | GThread * |
| 696 | gkrellm_mail_get_active_thread(void) |
| 697 | { |
| 698 | return NULL((void*)0); |
| 699 | } |
| 700 |