static gchar *get_unseen_seq_name(void) { static gchar *seq_name = NULL; if (!seq_name) { gchar buf[BUFFSIZE]; gchar *tmp; gchar *profile_path = g_strconcat( get_home_dir(), G_DIR_SEPARATOR_S, ".mh_profile", NULL); FILE *fp = g_fopen(profile_path, "r"); if (fp) { while (fgets(buf, sizeof(buf), fp) != NULL) { if (!strncmp(buf, "Unseen-Sequence:", strlen("Unseen-Sequence:"))) { gchar *seq_tmp = buf+strlen("Unseen-Sequence:"); while (*seq_tmp == ' ') seq_tmp++; seq_name = g_strdup(seq_tmp); seq_name = strretchomp(seq_name); break; } } fclose(fp); } if (!seq_name) seq_name = g_strdup("unseen"); tmp = g_strdup_printf("%s:", seq_name); g_free(seq_name); seq_name = tmp; } return seq_name; }
gchar *partial_get_filename(const gchar *server, const gchar *login, const gchar *muidl) { gchar *path; gchar *result = NULL; FILE *fp; gchar buf[POPBUFSIZE]; gchar uidl[POPBUFSIZE]; time_t recv_time; time_t now; gchar *sanitized_uid = g_strdup(login); subst_for_filename(sanitized_uid); path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl", G_DIR_SEPARATOR_S, server, "-", sanitized_uid, NULL); if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(path); path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl-", server, "-", sanitized_uid, NULL); if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(sanitized_uid); g_free(path); return result; } } g_free(sanitized_uid); g_free(path); now = time(NULL); while (fgets(buf, sizeof(buf), fp) != NULL) { gchar tmp[POPBUFSIZE]; strretchomp(buf); recv_time = RECV_TIME_NONE; if (sscanf(buf, "%s\t%ld\t%s", uidl, (long int *) &recv_time, tmp) < 2) { if (sscanf(buf, "%s", uidl) != 1) continue; else { recv_time = now; } } if (!strcmp(muidl, uidl)) { result = g_strdup(tmp); break; } } fclose(fp); return result; }
void alertpanel_error(const gchar *format, ...) { va_list args; gchar buf[ALERT_PANEL_BUFSIZE]; va_start(args, format); g_vsnprintf(buf, sizeof(buf), format, args); va_end(args); strretchomp(buf); alertpanel_message(_("Error"), buf, ALERT_ERROR); }
void alertpanel_warning(const gchar *format, ...) { va_list args; gchar buf[ALERT_PANEL_BUFSIZE]; va_start(args, format); g_vsnprintf(buf, sizeof(buf), format, args); va_end(args); strretchomp(buf); alertpanel_message(_("Warning"), buf, ALERT_WARNING); }
void alertpanel_notice(const gchar *format, ...) { va_list args; gchar buf[ALERT_PANEL_BUFSIZE]; va_start(args, format); g_vsnprintf(buf, sizeof(buf), format, args); va_end(args); strretchomp(buf); alertpanel_message(_("Notice"), buf, ALERT_NOTICE); }
static void sieve_read_chunk(SieveSession *session, gchar *data, guint len) { log_print(LOG_PROTOCOL, "Sieve< [%u bytes]\n", len); switch (session->state) { case SIEVE_GETSCRIPT_DATA: command_cb(session->current_cmd, (gchar *)data); break; case SIEVE_SETACTIVE: /* Dovecot shows a script's warnings when making it active */ /* TODO: append message in case it is very long*/ strretchomp(data); sieve_error(session, data); break; case SIEVE_PUTSCRIPT: { SieveResult result = {.description = (gchar *)data}; sieve_session_putscript_cb(session, &result); break; } default: log_warning(LOG_PROTOCOL, _("error occurred on SIEVE session\n")); } } static gint sieve_read_chunk_done(SieveSession *session) { gint ret = SE_OK; switch (session->state) { case SIEVE_GETSCRIPT_DATA: /* wait for ending "OK" response */ break; case SIEVE_SETACTIVE: case SIEVE_PUTSCRIPT: session->state = SIEVE_READY; break; default: log_warning(LOG_PROTOCOL, _("error occurred on SIEVE session\n")); } if (ret == SE_OK && session->state == SIEVE_READY) ret = sieve_pop_send_queue(session); if (ret == SE_OK) return session_recv_msg(SESSION(session)); return 0; }
void statusbar_puts(GtkStatusbar *statusbar, const gchar *str) { gint cid; gchar *buf; gchar *tmp; tmp = g_strdup(str); strretchomp(tmp); buf = trim_string(tmp, 76); g_free(tmp); cid = gtk_statusbar_get_context_id(statusbar, "Standard Output"); gtk_statusbar_pop(statusbar, cid); gtk_statusbar_push(statusbar, cid, buf); gtkut_widget_draw_now(GTK_WIDGET(statusbar)); g_free(buf); }
/*! *\brief display an error with a View Log button * */ void alertpanel_error_log(const gchar *format, ...) { va_list args; int val; MainWindow *mainwin; gchar buf[ALERT_PANEL_BUFSIZE]; va_start(args, format); g_vsnprintf(buf, sizeof(buf), format, args); va_end(args); strretchomp(buf); mainwin = mainwindow_get_mainwindow(); if (mainwin && mainwin->logwin) { mainwindow_clear_error(mainwin); val = alertpanel_full(_("Error"), buf, GTK_STOCK_CLOSE, _("_View log"), NULL, ALERTFOCUS_FIRST, FALSE, NULL, ALERT_ERROR); if (val == G_ALERTALTERNATE) log_window_show(mainwin->logwin); } else alertpanel_error("%s", buf); }
static void pop3_get_uidl_table(PrefsAccount *ac_prefs, Pop3Session *session) { GHashTable *table; GHashTable *partial_recv_table; gchar *path; FILE *fp; gchar buf[POPBUFSIZE]; gchar uidl[POPBUFSIZE]; time_t recv_time; time_t now; gint partial_recv; gchar *sanitized_uid = g_strdup(ac_prefs->userid); subst_for_filename(sanitized_uid); table = g_hash_table_new(g_str_hash, g_str_equal); partial_recv_table = g_hash_table_new(g_str_hash, g_str_equal); path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl", G_DIR_SEPARATOR_S, ac_prefs->recv_server, "-", sanitized_uid, NULL); g_free(sanitized_uid); if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(path); path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl-", ac_prefs->recv_server, "-", ac_prefs->userid, NULL); if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(path); session->uidl_table = table; session->partial_recv_table = partial_recv_table; return; } } g_free(path); now = time(NULL); while (fgets(buf, sizeof(buf), fp) != NULL) { gchar tmp[POPBUFSIZE]; strretchomp(buf); recv_time = RECV_TIME_NONE; partial_recv = POP3_TOTALLY_RECEIVED; if (sscanf(buf, "%s\t%ld\t%s", uidl, (long int *) &recv_time, tmp) < 3) { if (sscanf(buf, "%s\t%ld", uidl, (long int *) &recv_time) != 2) { if (sscanf(buf, "%s", uidl) != 1) continue; else { recv_time = now; strcpy(tmp, "0"); } } else { strcpy(tmp, "0"); } } if (recv_time == RECV_TIME_NONE) recv_time = RECV_TIME_RECEIVED; g_hash_table_insert(table, g_strdup(uidl), GINT_TO_POINTER(recv_time)); if (strlen(tmp) == 1) partial_recv = atoi(tmp); /* totally received ?*/ else partial_recv = POP3_MUST_COMPLETE_RECV; g_hash_table_insert(partial_recv_table, g_strdup(uidl), GINT_TO_POINTER(partial_recv)); } fclose(fp); session->uidl_table = table; session->partial_recv_table = partial_recv_table; return; }
static gboolean session_read_msg_cb(SockInfo *source, GIOCondition condition, gpointer data) { Session *session = SESSION(data); gchar buf[SESSION_BUFFSIZE]; gint line_len; gchar *newline; gchar *msg; gint ret; g_return_val_if_fail(condition == G_IO_IN, FALSE); session_set_timeout(session, session->timeout_interval); if (session->read_buf_len == 0) { gint read_len; read_len = sock_read(session->sock, session->read_buf, SESSION_BUFFSIZE - 1); if (read_len == 0) { g_warning("sock_read: received EOF\n"); session->state = SESSION_EOF; return FALSE; } if (read_len < 0) { switch (errno) { case EAGAIN: return TRUE; default: g_warning("sock_read: %s\n", g_strerror(errno)); session->state = SESSION_ERROR; return FALSE; } } session->read_buf_len = read_len; } if ((newline = memchr(session->read_buf_p, '\n', session->read_buf_len)) != NULL) line_len = newline - session->read_buf_p + 1; else line_len = session->read_buf_len; if (line_len == 0) return TRUE; memcpy(buf, session->read_buf_p, line_len); buf[line_len] = '\0'; g_string_append(session->read_msg_buf, buf); session->read_buf_len -= line_len; if (session->read_buf_len == 0) session->read_buf_p = session->read_buf; else session->read_buf_p += line_len; /* incomplete read */ if (buf[line_len - 1] != '\n') return TRUE; /* complete */ if (session->io_tag > 0) { g_source_remove(session->io_tag); session->io_tag = 0; } /* callback */ msg = g_strdup(session->read_msg_buf->str); strretchomp(msg); g_string_truncate(session->read_msg_buf, 0); ret = session->recv_msg(session, msg); session->recv_msg_notify(session, msg, session->recv_msg_notify_data); g_free(msg); if (ret < 0) session->state = SESSION_ERROR; return FALSE; }
gint send_message_local(const gchar *command, FILE *fp) { gchar **argv; GPid pid; gint child_stdin; gchar buf[BUFFSIZE]; gboolean err = FALSE; cm_return_val_if_fail(command != NULL, -1); cm_return_val_if_fail(fp != NULL, -1); log_message(LOG_PROTOCOL, _("Sending message using command: %s\n"), command); argv = strsplit_with_quote(command, " ", 0); if (g_spawn_async_with_pipes(NULL, argv, NULL, #ifdef G_OS_WIN32 0, #else G_SPAWN_DO_NOT_REAP_CHILD, #endif NULL, NULL, &pid, &child_stdin, NULL, NULL, NULL) == FALSE) { g_snprintf(buf, sizeof(buf), _("Couldn't execute command: %s"), command); log_warning(LOG_PROTOCOL, "%s\n", buf); alertpanel_error("%s", buf); g_strfreev(argv); return -1; } g_strfreev(argv); while (claws_fgets(buf, sizeof(buf), fp) != NULL) { strretchomp(buf); if (buf[0] == '.' && buf[1] == '\0') { if (fd_write_all(child_stdin, ".", 1) < 0) { err = TRUE; break; } } if (fd_write_all(child_stdin, buf, strlen(buf)) < 0 || fd_write_all(child_stdin, "\n", 1) < 0) { err = TRUE; break; } } fd_close(child_stdin); #ifndef G_OS_WIN32 gint status; waitpid(pid, &status, 0); if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) err = TRUE; #endif g_spawn_close_pid(pid); if (err) { g_snprintf(buf, sizeof(buf), _("Error occurred while executing command: %s"), command); log_warning(LOG_PROTOCOL, "%s\n", buf); alertpanel_error("%s", buf); return -1; } return 0; }
int partial_msg_in_uidl_list(MsgInfo *msginfo) { gchar *path; FILE *fp; gchar buf[POPBUFSIZE]; gchar uidl[POPBUFSIZE]; time_t recv_time; time_t now; gchar *sanitized_uid = NULL; if (!msginfo->extradata) return FALSE; sanitized_uid = g_strdup(msginfo->extradata->account_login); subst_for_filename(sanitized_uid); if (!msginfo->extradata->account_server || !msginfo->extradata->account_login || !msginfo->extradata->partial_recv) return FALSE; path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl", G_DIR_SEPARATOR_S, msginfo->extradata->account_server, "-", msginfo->extradata->account_login, NULL); if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(path); path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl-", msginfo->extradata->account_server, "-", sanitized_uid, NULL); if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(sanitized_uid); g_free(path); return FALSE; } } g_free(sanitized_uid); g_free(path); now = time(NULL); while (fgets(buf, sizeof(buf), fp) != NULL) { gchar tmp[POPBUFSIZE]; strretchomp(buf); recv_time = RECV_TIME_NONE; if (sscanf(buf, "%s\t%ld\t%s", uidl, (long int *) &recv_time, tmp) < 2) { if (sscanf(buf, "%s", uidl) != 1) continue; else { recv_time = now; } } if (!strcmp(uidl, msginfo->extradata->partial_recv)) { fclose(fp); return TRUE; } } fclose(fp); return FALSE; }
static int partial_uidl_mark_mail(MsgInfo *msginfo, int download) { gchar *path; gchar *pathnew; FILE *fp; FILE *fpnew; gchar buf[POPBUFSIZE]; gchar uidl[POPBUFSIZE]; time_t recv_time; time_t now; gchar partial_recv[POPBUFSIZE]; int err = -1; gchar *filename; MsgInfo *tinfo; gchar *sanitized_uid = NULL; filename = procmsg_get_message_file_path(msginfo); if (!filename) { g_warning("can't get message file path."); return err; } tinfo = procheader_parse_file(filename, msginfo->flags, TRUE, TRUE); if (!tinfo->extradata) { g_free(filename); return err; } sanitized_uid = g_strdup(tinfo->extradata->account_login); subst_for_filename(sanitized_uid); if (!tinfo->extradata->account_server || !tinfo->extradata->account_login || !tinfo->extradata->partial_recv) { goto bail; } path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl", G_DIR_SEPARATOR_S, tinfo->extradata->account_server, "-", sanitized_uid, NULL); if ((fp = g_fopen(path, "rb")) == NULL) { perror("fopen1"); if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(path); path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl-", tinfo->extradata->account_server, "-", tinfo->extradata->account_login, NULL); if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(path); goto bail; } } pathnew = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl", G_DIR_SEPARATOR_S, tinfo->extradata->account_server, "-", sanitized_uid, ".new", NULL); g_free(sanitized_uid); if ((fpnew = g_fopen(pathnew, "wb")) == NULL) { perror("fopen2"); fclose(fp); g_free(pathnew); goto bail; } now = time(NULL); while (fgets(buf, sizeof(buf), fp) != NULL) { strretchomp(buf); recv_time = RECV_TIME_NONE; sprintf(partial_recv,"0"); if (sscanf(buf, "%s\t%ld\t%s", uidl, (long int *) &recv_time, partial_recv) < 2) { if (sscanf(buf, "%s", uidl) != 1) continue; else { recv_time = now; } } if (strcmp(tinfo->extradata->partial_recv, uidl)) { if (fprintf(fpnew, "%s\t%ld\t%s\n", uidl, (long int) recv_time, partial_recv) < 0) { FILE_OP_ERROR(pathnew, "fprintf"); fclose(fpnew); fclose(fp); g_free(path); g_free(pathnew); goto bail; } } else { gchar *stat = NULL; if (download == POP3_PARTIAL_DLOAD_DLOAD) { gchar *folder_id = folder_item_get_identifier( msginfo->folder); stat = g_strdup_printf("%s:%d", folder_id, msginfo->msgnum); g_free(folder_id); } else if (download == POP3_PARTIAL_DLOAD_UNKN) stat = g_strdup("1"); else if (download == POP3_PARTIAL_DLOAD_DELE) stat = g_strdup("0"); if (fprintf(fpnew, "%s\t%ld\t%s\n", uidl, (long int) recv_time, stat) < 0) { FILE_OP_ERROR(pathnew, "fprintf"); fclose(fpnew); fclose(fp); g_free(path); g_free(pathnew); goto bail; } g_free(stat); } } if (fclose(fpnew) == EOF) { FILE_OP_ERROR(pathnew, "fclose"); fclose(fp); g_free(path); g_free(pathnew); goto bail; } fclose(fp); move_file(pathnew, path, TRUE); g_free(path); g_free(pathnew); if ((fp = g_fopen(filename,"rb")) == NULL) { perror("fopen3"); goto bail; } pathnew = g_strdup_printf("%s.new", filename); if ((fpnew = g_fopen(pathnew, "wb")) == NULL) { perror("fopen4"); fclose(fp); g_free(pathnew); goto bail; } if (fprintf(fpnew, "SC-Marked-For-Download: %d\n", download) < 0) { FILE_OP_ERROR(pathnew, "fprintf"); fclose(fpnew); fclose(fp); g_free(pathnew); goto bail; } while (fgets(buf, sizeof(buf)-1, fp) != NULL) { if(strlen(buf) > strlen("SC-Marked-For-Download: x\n") && !strncmp(buf, "SC-Marked-For-Download:", strlen("SC-Marked-For-Download:"))) { if (fprintf(fpnew, "%s", buf+strlen("SC-Marked-For-Download: x\n")) < 0) { FILE_OP_ERROR(pathnew, "fprintf"); fclose(fpnew); fclose(fp); g_free(pathnew); goto bail; } continue; } else if (strlen(buf) == strlen("SC-Marked-For-Download: x\n") && !strncmp(buf, "SC-Marked-For-Download:", strlen("SC-Marked-For-Download:"))) { continue; } if (fprintf(fpnew, "%s", buf) < 0) { FILE_OP_ERROR(pathnew, "fprintf"); fclose(fpnew); fclose(fp); g_free(pathnew); goto bail; } } if (fclose(fpnew) == EOF) { FILE_OP_ERROR(pathnew, "fclose"); fclose(fp); g_free(pathnew); goto bail; } fclose(fp); if (rename_force(pathnew, filename) != 0) { g_free(pathnew); goto bail; } g_free(pathnew); msginfo->planned_download = download; msgcache_update_msg(msginfo->folder->cache, msginfo); err = 0; bail: g_free(filename); procmsg_msginfo_free(&tinfo); return err; }