From a30218f8b3d68023d354d75b7c4674ae0c528f28 Mon Sep 17 00:00:00 2001 From: Pierre Habouzit Date: Sun, 27 May 2007 13:51:04 +0200 Subject: [PATCH] Deep rework of nntp_data_t (ex-NNTP_DATA) to make it list-able. Signed-off-by: Pierre Habouzit --- browser.c | 46 +++---- browser.h | 2 +- lib-ui/complete.c | 22 ++- lib-ui/curs_main.c | 4 +- nntp.c | 330 ++++++++++++++++++++------------------------- nntp.h | 107 ++++++++------- pager.c | 6 +- send.c | 2 +- 8 files changed, 238 insertions(+), 281 deletions(-) diff --git a/browser.c b/browser.c index 2ced749..d945b89 100644 --- a/browser.c +++ b/browser.c @@ -428,7 +428,7 @@ static void add_folder (MUTTMENU * m, struct browser_state *state, (state->entry)[state->entrylen].imap = 0; #ifdef USE_NNTP if (option (OPTNEWS)) - (state->entry)[state->entrylen].nd = (NNTP_DATA *) data; + (state->entry)[state->entrylen].nd = (nntp_data_t *) data; #endif (state->entrylen)++; } @@ -449,17 +449,14 @@ static int examine_directory (MUTTMENU * menu, struct browser_state *state, { #ifdef USE_NNTP if (option (OPTNEWS)) { - string_list_t *tmp; - NNTP_DATA *data; + nntp_data_t *data; NNTP_SERVER *news = CurrentNewsSrv; /* buffy_check (0); */ init_state (state, menu); - for (tmp = news->list; tmp; tmp = tmp->next) { - if (!(data = (NNTP_DATA *) tmp->data)) - continue; - nntp_sync_sidebar (data); + for (data = news->list; data; data = data->next) { + nntp_sync_sidebar(data); if (m_strncmp (prefix, data->group, m_strlen(prefix)) != 0) continue; if (!((regexec (Mask.rx, data->group, 0, NULL, 0) == 0) ^ Mask.neg)) @@ -544,16 +541,13 @@ static int examine_mailboxes (MUTTMENU * menu, struct browser_state *state) #ifdef USE_NNTP if (option (OPTNEWS)) { - string_list_t *tmp; - NNTP_DATA *data; + nntp_data_t *data; NNTP_SERVER *news = CurrentNewsSrv; /* buffy_check (0); */ init_state (state, menu); - for (tmp = news->list; tmp; tmp = tmp->next) { - if ((data = (NNTP_DATA*) tmp->data) == NULL) - continue; + for (data = news->list; data; data = data->next) { nntp_sync_sidebar (data); if ((data->new || (data->subscribed && (!option (OPTSHOWONLYUNREAD)|| data->unread)))) @@ -733,14 +727,12 @@ void mutt_select_file (char *f, ssize_t flen, int flags, char ***files, if (*f) m_strcpy(prefix, sizeof(prefix), f); else { - string_list_t *list; + nntp_data_t *list; /* default state for news reader mode is browse subscribed newsgroups */ buffy = 0; for (list = CurrentNewsSrv->list; list; list = list->next) { - NNTP_DATA *data = (NNTP_DATA *) list->data; - - if (data && data->subscribed) { + if (list->subscribed) { buffy = 1; break; } @@ -1327,7 +1319,7 @@ void mutt_select_file (char *f, ssize_t flen, int flags, char ***files, case OP_UNCATCHUP: if (option (OPTNEWS)) { struct folder_file *folder_f = &state.entry[menu->current]; - NNTP_DATA *nd; + nntp_data_t *nd; if (i == OP_CATCHUP) nd = mutt_newsgroup_catchup (CurrentNewsSrv, folder_f->name); @@ -1347,12 +1339,10 @@ void mutt_select_file (char *f, ssize_t flen, int flags, char ***files, break; { - string_list_t *tmp; - NNTP_DATA *data; + nntp_data_t *data; - for (tmp = CurrentNewsSrv->list; tmp; tmp = tmp->next) { - if ((data = (NNTP_DATA *) tmp->data)) - data->deleted = 1; + for (data = CurrentNewsSrv->list; data; data = data->next) { + data->deleted = 1; } } nntp_get_active (CurrentNewsSrv); @@ -1375,7 +1365,7 @@ void mutt_select_file (char *f, ssize_t flen, int flags, char ***files, regex_t *rx = p_new(regex_t, 1); char *s = buf; int j = menu->current; - NNTP_DATA *nd; + nntp_data_t *nd; NNTP_SERVER *news = CurrentNewsSrv; if (i == OP_SUBSCRIBE_PATTERN || i == OP_UNSUBSCRIBE_PATTERN) { @@ -1426,13 +1416,9 @@ void mutt_select_file (char *f, ssize_t flen, int flags, char ***files, } } if (i == OP_SUBSCRIBE_PATTERN) { - string_list_t *grouplist = NULL; - - if (news) - grouplist = news->list; - for (; grouplist; grouplist = grouplist->next) { - nd = (NNTP_DATA *) grouplist->data; - if (nd && nd->group && !nd->subscribed) { + nd = news ? news->list : NULL; + for (; nd; nd = nd->next) { + if (nd->group && !nd->subscribed) { if (regexec (rx, nd->group, 0, NULL, 0) == 0) { mutt_newsgroup_subscribe (news, nd->group); add_folder (menu, &state, nd->group, NULL, nd, nd->new); diff --git a/browser.h b/browser.h index 5139afc..721889b 100644 --- a/browser.h +++ b/browser.h @@ -30,7 +30,7 @@ struct folder_file { unsigned selectable:1; unsigned inferiors:1; #ifdef USE_NNTP - NNTP_DATA *nd; + nntp_data_t *nd; #endif unsigned tagged:1; }; diff --git a/lib-ui/complete.c b/lib-ui/complete.c index a06593b..e337e1e 100644 --- a/lib-ui/complete.c +++ b/lib-ui/complete.c @@ -36,7 +36,7 @@ int mutt_complete (char *s, ssize_t slen) #ifdef USE_NNTP if (option (OPTNEWS)) { - string_list_t *l = CurrentNewsSrv->list; + nntp_data_t *l = CurrentNewsSrv->list; m_strcpy(filepart, sizeof(filepart), s); @@ -46,10 +46,8 @@ int mutt_complete (char *s, ssize_t slen) */ if ((len = m_strlen(filepart)) == 0) { for (; l; l = l->next) { - NNTP_DATA *data = (NNTP_DATA *) l->data; - - if (data && data->subscribed) { - m_strcpy(filepart, sizeof(filepart), data->group); + if (l->subscribed) { + m_strcpy(filepart, sizeof(filepart), l->group); init++; l = l->next; break; @@ -58,21 +56,17 @@ int mutt_complete (char *s, ssize_t slen) } for (; l; l = l->next) { - NNTP_DATA *data = (NNTP_DATA *) l->data; - - if (data && data->subscribed && - m_strncmp(data->group, filepart, len) == 0) { + if (l->subscribed && m_strncmp(l->group, filepart, len) == 0) { if (init) { - for (i = 0; filepart[i] && data->group[i]; i++) { - if (filepart[i] != data->group[i]) { + for (i = 0; filepart[i] && l->group[i]; i++) { + if (filepart[i] != l->group[i]) { filepart[i] = 0; break; } } filepart[i] = 0; - } - else { - m_strcpy(filepart, sizeof(filepart), data->group); + } else { + m_strcpy(filepart, sizeof(filepart), l->group); init = 1; } } diff --git a/lib-ui/curs_main.c b/lib-ui/curs_main.c index dc78290..e32a25b 100644 --- a/lib-ui/curs_main.c +++ b/lib-ui/curs_main.c @@ -1929,7 +1929,7 @@ int mutt_index_menu (void) case OP_CATCHUP: if (Context && Context->magic == M_NNTP) { if (mutt_newsgroup_catchup (CurrentNewsSrv, - ((NNTP_DATA *) Context->data)->group)) + ((nntp_data_t *) Context->data)->group)) menu->redraw = REDRAW_INDEX | REDRAW_STATUS; } break; @@ -2114,7 +2114,7 @@ int mutt_index_menu (void) _("Reply by mail as poster prefers?")) != M_YES) { if (Context && Context->magic == M_NNTP - && !((NNTP_DATA *) Context->data)->allowed + && !((nntp_data_t *) Context->data)->allowed && query_quadoption (OPT_TOMODERATED, _ ("Posting to this group not allowed, may be moderated. Continue?")) diff --git a/nntp.c b/nntp.c index 73c254b..d6054a3 100644 --- a/nntp.c +++ b/nntp.c @@ -29,63 +29,47 @@ static int nntp_get_cache_all (NNTP_SERVER *); static int nntp_check_newgroups (NNTP_SERVER *, int); -static void mutt_newsgroup_stat (NNTP_DATA *); -static void nntp_delete_cache (NNTP_DATA *); -static void nntp_delete_data (void *p); +static void mutt_newsgroup_stat (nntp_data_t *); +static void nntp_delete_cache (nntp_data_t *); /* newsrc {{{ */ -static void nntp_add_to_list(NNTP_SERVER *s, NNTP_DATA *d) -{ - *s->tail = p_new(string_list_t, 1); - (*s->tail)->data = (void *)d; - s->tail = &(*s->tail)->next; -} - static int nntp_parse_newsrc_line (NNTP_SERVER * news, char *line) { - NNTP_DATA *data; + nntp_data_t *data; char group[LONG_STRING]; int x = 1; - char *p = line, *b, *h; - ssize_t len; + char *p, *b, *h; - while (*p) { - if (*p++ == ',') - x++; + for (p = line; p; p = strchr(p, ',')) { + x++; } - p = line; - while (*p && (*p != ':' && *p != '!')) - p++; - if (!*p) + p = strpbrk(line, ":!"); + if (!p) return -1; - len = MIN(p + 1 - line, ssizeof(group)); - m_strcpy(group, len, line); - if ((data = (NNTP_DATA *) hash_find (news->newsgroups, group)) == NULL) { - data = xmalloc(sizeof(NNTP_DATA) + m_strlen(group) + 1); - data->group = (char *) data + sizeof (NNTP_DATA); + + m_strncpy(group, ssizeof(group), line, p - line); + if ((data = (nntp_data_t *) hash_find (news->newsgroups, group)) == NULL) { + data = xmalloc(sizeof(nntp_data_t) + m_strlen(group) + 1); + data->group = (char *) data + sizeof (nntp_data_t); strcpy (data->group, group); data->nserv = news; data->deleted = 1; if (news->newsgroups->nelem < news->newsgroups->curnelem * 2) hash_resize (news->newsgroups, news->newsgroups->nelem * 2); hash_insert (news->newsgroups, data->group, data); - nntp_add_to_list (news, data); - } - else + nntp_data_list_append(&news->list, data); + } else { p_delete(&data->entries); + } data->rc = 1; data->entries = p_new(NEWSRC_ENTRY, x * 2); data->max = x * 2; - if (*p == ':') - data->subscribed = 1; - else - data->subscribed = 0; + data->subscribed = (*p++ == ':'); - p++; b = p; x = 0; while (*b) { @@ -159,7 +143,7 @@ static int nntp_parse_cacheindex (NNTP_SERVER * news) char buf[HUGE_STRING], *cp; char dir[_POSIX_PATH_MAX], file[_POSIX_PATH_MAX]; FILE *idx; - NNTP_DATA *data; + nntp_data_t *data; int l, m, t; /* check is server name defined or not */ @@ -212,16 +196,16 @@ static int nntp_parse_cacheindex (NNTP_SERVER * news) news->newgroups_time = m; } else if (news->newsgroups) { - if ((data = (NNTP_DATA *) hash_find (news->newsgroups, buf)) == NULL) { - data = xmalloc(sizeof(NNTP_DATA) + m_strlen(buf) + 1); - data->group = (char *) data + sizeof (NNTP_DATA); + if ((data = (nntp_data_t *) hash_find (news->newsgroups, buf)) == NULL) { + data = xmalloc(sizeof(nntp_data_t) + m_strlen(buf) + 1); + data->group = (char *) data + sizeof (nntp_data_t); strcpy (data->group, buf); data->nserv = news; data->deleted = 1; if (news->newsgroups->nelem < news->newsgroups->curnelem * 2) hash_resize (news->newsgroups, news->newsgroups->nelem * 2); hash_insert (news->newsgroups, data->group, data); - nntp_add_to_list (news, data); + nntp_data_list_append(&news->list, data); } data->cache = m_strdup(file); t = 0; @@ -318,7 +302,7 @@ NNTP_SERVER *mutt_select_newsserver (char *server) { char file[_POSIX_PATH_MAX]; char *buf, *p; - string_list_t *list; + nntp_data_t *list; ACCOUNT act; NNTP_SERVER *serv; CONNECTION *conn; @@ -357,17 +341,14 @@ NNTP_SERVER *mutt_select_newsserver (char *server) struct stat sb; /* externally modified? */ - if (serv->stat != stat (file, &sb) || (!serv->stat && + if (serv->stat != stat(file, &sb) || (!serv->stat && (serv->size != sb.st_size - || serv->mtime != sb.st_mtime))) { + || serv->mtime != sb.st_mtime))) + { for (list = serv->list; list; list = list->next) { - NNTP_DATA *data = (NNTP_DATA *) list->data; - - if (data) { - data->subscribed = 0; - data->rc = 0; - data->num = 0; - } + list->subscribed = 0; + list->rc = 0; + list->num = 0; } slurp_newsrc (serv); nntp_clear_cacheindex (serv); @@ -381,7 +362,6 @@ NNTP_SERVER *mutt_select_newsserver (char *server) /* New newsserver */ serv = p_new(NNTP_SERVER, 1); - serv->tail = &serv->list; serv->conn = conn; serv->newsrc = m_strdup(file); serv->newsgroups = hash_new(1009, false); @@ -390,10 +370,8 @@ NNTP_SERVER *mutt_select_newsserver (char *server) if (option (OPTNEWSCACHE) && serv->cache && nntp_get_cache_all (serv) >= 0) nntp_check_newgroups (serv, 1); else if (nntp_get_active (serv) < 0) { - hash_delete (&serv->newsgroups, nntp_delete_data); - for (list = serv->list; list; list = list->next) - list->data = NULL; - string_list_wipe(&serv->list); + hash_delete(&serv->newsgroups, NULL); + nntp_data_list_wipe(&serv->list); p_delete(&serv->newsrc); p_delete(&serv->cache); p_delete(&serv); @@ -417,11 +395,11 @@ NNTP_SERVER *mutt_select_newsserver (char *server) */ static void nntp_get_status(CONTEXT *ctx, HEADER *h, char *group, int article) { - NNTP_DATA *data = (NNTP_DATA *) ctx->data; + nntp_data_t *data = (nntp_data_t *) ctx->data; int x; if (group) - data = (NNTP_DATA *) hash_find (data->nserv->newsgroups, group); + data = (nntp_data_t *) hash_find (data->nserv->newsgroups, group); if (!data) { return; @@ -445,7 +423,7 @@ static void nntp_get_status(CONTEXT *ctx, HEADER *h, char *group, int article) h->old = 1; } -static void mutt_newsgroup_stat (NNTP_DATA * data) +static void mutt_newsgroup_stat (nntp_data_t * data) { int i, first, last; @@ -480,7 +458,7 @@ static int puti (char *line, int num) return num; } -static void nntp_create_newsrc_line (NNTP_DATA * data, char **buf, +static void nntp_create_newsrc_line (nntp_data_t * data, char **buf, char **pline, ssize_t * buflen) { char *line = *pline; @@ -533,7 +511,7 @@ static void nntp_create_newsrc_line (NNTP_DATA * data, char **buf, static void newsrc_gen_entries (CONTEXT * ctx) { - NNTP_DATA *data = (NNTP_DATA *) ctx->data; + nntp_data_t *data = (nntp_data_t *) ctx->data; int series, x; int last = 0, first = 1; int save_sort = SORT_ORDER; @@ -713,8 +691,7 @@ static int mutt_update_list_file (char *filename, char *section, int mutt_newsrc_update (NNTP_SERVER * news) { char *buf, *line; - NNTP_DATA *data; - string_list_t *tmp; + nntp_data_t *data; int r = -1; ssize_t len, llen; @@ -723,8 +700,7 @@ int mutt_newsrc_update (NNTP_SERVER * news) llen = len = 10 * LONG_STRING; line = buf = p_new(char, len); /* we will generate full newsrc here */ - for (tmp = news->list; tmp; tmp = tmp->next) { - data = (NNTP_DATA *) tmp->data; + for (data = news->list; data; data = data->next) { if (!data || !data->rc) continue; nntp_create_newsrc_line (data, &buf, &line, &llen); @@ -762,7 +738,7 @@ static FILE *mutt_mkname (char *s) } /* Updates info into .index file: ALL or about selected newsgroup */ -static int nntp_update_cacheindex (NNTP_SERVER * serv, NNTP_DATA * data) +static int nntp_update_cacheindex (NNTP_SERVER * serv, nntp_data_t * data) { char buf[LONG_STRING]; char file[_POSIX_PATH_MAX]; @@ -788,14 +764,12 @@ static int nntp_update_cacheindex (NNTP_SERVER * serv, NNTP_DATA * data) /* Remove cache files of unsubscribed newsgroups */ void nntp_clear_cacheindex (NNTP_SERVER * news) { - NNTP_DATA *data; - string_list_t *tmp; + nntp_data_t *data; if (option (OPTSAVEUNSUB) || !news) return; - for (tmp = news->list; tmp; tmp = tmp->next) { - data = (NNTP_DATA *) tmp->data; + for (data = news->list; data; data = data->next) { if (!data || data->subscribed || !data->cache) continue; nntp_delete_cache (data); @@ -807,9 +781,8 @@ static int nntp_save_cache_index (NNTP_SERVER * news) { char buf[HUGE_STRING]; char file[_POSIX_PATH_MAX]; - NNTP_DATA *d; + nntp_data_t *d; FILE *f; - string_list_t *l; if (!news || !news->newsgroups) return -1; @@ -830,8 +803,8 @@ static int nntp_save_cache_index (NNTP_SERVER * news) if (!f) return -1; - for (l = news->list; l; l = l->next) { - if ((d = (NNTP_DATA *) l->data) && !d->deleted) { + for (d = news->list; d; d = d->next) { + if (!d->deleted) { if (d->desc) snprintf (buf, sizeof (buf), "%s %d %d %c %s\n", d->group, d->lastMessage, d->firstMessage, d->allowed ? 'y' : 'n', @@ -870,17 +843,17 @@ static int nntp_save_cache_group (CONTEXT * ctx) if (!ctx || !ctx->data || ctx->magic != M_NNTP) return -1; - if (((NNTP_DATA *) ctx->data)->cache) { - nntp_cache_expand (file, ((NNTP_DATA *) ctx->data)->cache); + if (((nntp_data_t *) ctx->data)->cache) { + nntp_cache_expand (file, ((nntp_data_t *) ctx->data)->cache); unlink (file); f = safe_fopen (file, "w"); } else { snprintf (buf, sizeof (buf), "%s-%s", - ((NNTP_DATA *) ctx->data)->nserv->conn->account.host, - ((NNTP_DATA *) ctx->data)->group); + ((nntp_data_t *) ctx->data)->nserv->conn->account.host, + ((nntp_data_t *) ctx->data)->group); f = mutt_mkname (buf); - ((NNTP_DATA *) ctx->data)->cache = m_strdup(buf); + ((nntp_data_t *) ctx->data)->cache = m_strdup(buf); nntp_cache_expand (file, buf); } if (!f) @@ -893,7 +866,7 @@ static int nntp_save_cache_group (CONTEXT * ctx) } /* Save only $nntp_context messages... */ - ((NNTP_DATA *) ctx->data)->lastCached = 0; + ((nntp_data_t *) ctx->data)->lastCached = 0; if (NntpContext && ctx->msgcount > NntpContext) i = ctx->msgcount - NntpContext; for (; i < ctx->msgcount; i++) { @@ -927,17 +900,17 @@ static int nntp_save_cache_group (CONTEXT * ctx) } m_fclose(&f); - if (nntp_update_cacheindex (((NNTP_DATA *) ctx->data)->nserv, - (NNTP_DATA *) ctx->data)) { + if (nntp_update_cacheindex (((nntp_data_t *) ctx->data)->nserv, + (nntp_data_t *) ctx->data)) { unlink (file); return -1; } - ((NNTP_DATA *) ctx->data)->lastCached = - ((NNTP_DATA *) ctx->data)->lastLoaded; + ((nntp_data_t *) ctx->data)->lastCached = + ((nntp_data_t *) ctx->data)->lastLoaded; return 0; } -static void nntp_delete_cache (NNTP_DATA * data) +static void nntp_delete_cache (nntp_data_t * data) { char buf[_POSIX_PATH_MAX]; @@ -953,22 +926,22 @@ static void nntp_delete_cache (NNTP_DATA * data) NULL); } -NNTP_DATA *mutt_newsgroup_subscribe (NNTP_SERVER * news, char *group) +nntp_data_t *mutt_newsgroup_subscribe (NNTP_SERVER * news, char *group) { - NNTP_DATA *data; + nntp_data_t *data; if (!news || !news->newsgroups || !group || !*group) return NULL; - if (!(data = (NNTP_DATA *) hash_find (news->newsgroups, group))) { - data = xmalloc(sizeof(NNTP_DATA) + m_strlen(group) + 1); - data->group = (char *) data + sizeof (NNTP_DATA); + if (!(data = (nntp_data_t *) hash_find (news->newsgroups, group))) { + data = xmalloc(sizeof(nntp_data_t) + m_strlen(group) + 1); + data->group = (char *) data + sizeof (nntp_data_t); strcpy (data->group, group); data->nserv = news; data->deleted = 1; if (news->newsgroups->nelem < news->newsgroups->curnelem * 2) hash_resize (news->newsgroups, news->newsgroups->nelem * 2); hash_insert (news->newsgroups, data->group, data); - nntp_add_to_list (news, data); + nntp_data_list_append(&news->list, data); } if (!data->subscribed) { data->subscribed = 1; @@ -977,12 +950,12 @@ NNTP_DATA *mutt_newsgroup_subscribe (NNTP_SERVER * news, char *group) return data; } -NNTP_DATA *mutt_newsgroup_unsubscribe (NNTP_SERVER * news, char *group) +nntp_data_t *mutt_newsgroup_unsubscribe (NNTP_SERVER * news, char *group) { - NNTP_DATA *data; + nntp_data_t *data; if (!news || !news->newsgroups || !group || !*group || - !(data = (NNTP_DATA *) hash_find (news->newsgroups, group))) + !(data = (nntp_data_t *) hash_find (news->newsgroups, group))) return NULL; if (data->subscribed) { data->subscribed = 0; @@ -992,12 +965,12 @@ NNTP_DATA *mutt_newsgroup_unsubscribe (NNTP_SERVER * news, char *group) return data; } -NNTP_DATA *mutt_newsgroup_catchup (NNTP_SERVER * news, char *group) +nntp_data_t *mutt_newsgroup_catchup (NNTP_SERVER * news, char *group) { - NNTP_DATA *data; + nntp_data_t *data; if (!news || !news->newsgroups || !group || !*group || - !(data = (NNTP_DATA *) hash_find (news->newsgroups, group))) + !(data = (nntp_data_t *) hash_find (news->newsgroups, group))) return NULL; if (!data->max) { data->entries = p_new(NEWSRC_ENTRY, 5); @@ -1016,12 +989,12 @@ NNTP_DATA *mutt_newsgroup_catchup (NNTP_SERVER * news, char *group) return data; } -NNTP_DATA *mutt_newsgroup_uncatchup (NNTP_SERVER * news, char *group) +nntp_data_t *mutt_newsgroup_uncatchup (NNTP_SERVER * news, char *group) { - NNTP_DATA *data; + nntp_data_t *data; if (!news || !news->newsgroups || !group || !*group || - !(data = (NNTP_DATA *) hash_find (news->newsgroups, group))) + !(data = (nntp_data_t *) hash_find (news->newsgroups, group))) return NULL; if (!data->max) { data->entries = p_new(NEWSRC_ENTRY, 5); @@ -1044,15 +1017,15 @@ NNTP_DATA *mutt_newsgroup_uncatchup (NNTP_SERVER * news, char *group) /* this routine gives the first newsgroup with new messages */ void nntp_buffy (char* dst, ssize_t dstlen) { - string_list_t *list; + nntp_data_t *list; int count = 0; /* forward to current group */ for (list = CurrentNewsSrv->list; list; list = list->next) { - NNTP_DATA *data = (NNTP_DATA *) list->data; - if (data && data->subscribed && data->unread && - Context && Context->magic == M_NNTP && - m_strcmp(data->group, ((NNTP_DATA *) Context->data)->group) == 0) { + if (list->subscribed && list->unread + && Context && Context->magic == M_NNTP + && m_strcmp(list->group, ((nntp_data_t *)Context->data)->group) == 0) + { list = list->next; break; } @@ -1066,11 +1039,9 @@ void nntp_buffy (char* dst, ssize_t dstlen) { list = CurrentNewsSrv->list; for (; list; list = list->next) { - NNTP_DATA *data = (NNTP_DATA *) list->data; - - if (data && data->subscribed && data->unread) { + if (list->subscribed && list->unread) { if (Context && Context->magic == M_NNTP && - !m_strcmp(data->group, ((NNTP_DATA *) Context->data)->group)) { + !m_strcmp(list->group, ((nntp_data_t *)Context->data)->group)) { int i, unread = 0; for (i = 0; i < Context->msgcount; i++) @@ -1079,7 +1050,7 @@ void nntp_buffy (char* dst, ssize_t dstlen) { if (!unread) continue; } - m_strcpy(dst, dstlen, data->group); + m_strcpy(dst, dstlen, list->group); break; } } @@ -1096,7 +1067,7 @@ void nntp_buffy (char* dst, ssize_t dstlen) { static unsigned int _checked = 0; -void nntp_sync_sidebar (NNTP_DATA* data) { +void nntp_sync_sidebar (nntp_data_t* data) { int i = 0; BUFFY* tmp = NULL; char buf[STRING]; @@ -1314,7 +1285,7 @@ static int nntp_reconnect (NNTP_SERVER * serv) } /* Send data from line[LONG_STRING] and receive answer to same line */ -static int mutt_nntp_query (NNTP_DATA * data, char *line, size_t linelen) +static int mutt_nntp_query (nntp_data_t * data, char *line, size_t linelen) { char buf[LONG_STRING]; int done = TRUE; @@ -1363,7 +1334,7 @@ static int mutt_nntp_query (NNTP_DATA * data, char *line, size_t linelen) * -2 - invalid command or execution error, * -3 - error in funct(*line, *data). */ -static int mutt_nntp_fetch (NNTP_DATA * nntp_data, const char *query, +static int mutt_nntp_fetch (nntp_data_t * nntp_data, const char *query, const char *msg, progress_t* bar, int (*funct) (char *, void *), void *data, int tagged) @@ -1494,7 +1465,7 @@ static void nntp_parse_xref (CONTEXT * ctx, char *group, char *xref, static int nntp_read_header (CONTEXT * ctx, const char *msgid, int article_num) { - NNTP_DATA *nntp_data = ((NNTP_DATA *) ctx->data); + nntp_data_t *nntp_data = ((nntp_data_t *) ctx->data); FILE *f; char buf[LONG_STRING]; char tempfile[_POSIX_PATH_MAX]; @@ -1536,7 +1507,7 @@ static int nntp_read_header (CONTEXT * ctx, const char *msgid, static int parse_description (char *line, void *n) { register char *d = line; - NNTP_DATA *data; + nntp_data_t *data; NNTP_SERVER *news = n; if (!line) @@ -1547,7 +1518,7 @@ static int parse_description (char *line, void *n) d++; while (*d && (*d == '\t' || *d == ' ')) d++; - if ((data = (NNTP_DATA *) hash_find (news->newsgroups, line)) != NULL && + if ((data = (nntp_data_t *) hash_find (news->newsgroups, line)) != NULL && m_strcmp(d, data->desc)) { p_delete(&data->desc); data->desc = m_strdup(d); @@ -1555,7 +1526,7 @@ static int parse_description (char *line, void *n) return 0; } -static void nntp_get_desc (NNTP_DATA * data, const char *mask, char *msg, progress_t* bar) +static void nntp_get_desc (nntp_data_t * data, const char *mask, char *msg, progress_t* bar) { char buf[STRING]; @@ -1582,7 +1553,7 @@ static void nntp_get_desc (NNTP_DATA * data, const char *mask, char *msg, progre */ static int nntp_parse_xover (CONTEXT * ctx, char *buf, HEADER * hdr) { - NNTP_DATA *nntp_data = (NNTP_DATA *) ctx->data; + nntp_data_t *nntp_data = (nntp_data_t *) ctx->data; char *p, *b; int x, done = 0; @@ -1686,7 +1657,7 @@ static int add_xover_line (char *line, void *c) int num, total; FETCH_CONTEXT *fc = c; CONTEXT *ctx = fc->ctx; - NNTP_DATA *data = (NNTP_DATA *) ctx->data; + nntp_data_t *data = (nntp_data_t *) ctx->data; if (!line) return 0; @@ -1720,7 +1691,7 @@ static int nntp_fetch_headers(CONTEXT * ctx, int first, int last) char buf[HUGE_STRING]; const char *msg = _("Fetching message headers..."); const char *msg2 = _("Fetching headers from cache..."); - NNTP_DATA *nntp_data = ((NNTP_DATA *) ctx->data); + nntp_data_t *nntp_data = ((nntp_data_t *) ctx->data); int ret, num, oldmsgcount, current; FILE *f; FETCH_CONTEXT fc; @@ -1853,7 +1824,7 @@ static int nntp_fetch_headers(CONTEXT * ctx, int first, int last) */ static int nntp_open_mailbox (CONTEXT * ctx) { - NNTP_DATA *nntp_data; + nntp_data_t *nntp_data; NNTP_SERVER *serv; char buf[HUGE_STRING]; char server[LONG_STRING]; @@ -1876,12 +1847,12 @@ static int nntp_open_mailbox (CONTEXT * ctx) CurrentNewsSrv = serv; /* create NNTP-specific state struct if nof found in list */ - if ((nntp_data = (NNTP_DATA *) hash_find (serv->newsgroups, buf)) == NULL) { - nntp_data = xmalloc(sizeof(NNTP_DATA) + m_strlen(buf) + 1); - nntp_data->group = (char *) nntp_data + sizeof (NNTP_DATA); + if ((nntp_data = (nntp_data_t *) hash_find (serv->newsgroups, buf)) == NULL) { + nntp_data = xmalloc(sizeof(nntp_data_t) + m_strlen(buf) + 1); + nntp_data->group = (char *) nntp_data + sizeof (nntp_data_t); strcpy (nntp_data->group, buf); hash_insert (serv->newsgroups, nntp_data->group, nntp_data); - nntp_add_to_list (serv, nntp_data); + nntp_data_list_append(&serv->list, nntp_data); } ctx->data = nntp_data; nntp_data->nserv = serv; @@ -1900,7 +1871,7 @@ static int nntp_open_mailbox (CONTEXT * ctx) } if (m_strncmp("211", buf, 3)) { - string_list_t *l = serv->list; + nntp_data_t **l; /* GROUP command failed */ if (!m_strncmp("411", buf, 3)) { @@ -1909,13 +1880,15 @@ static int nntp_open_mailbox (CONTEXT * ctx) /* CACHE: delete cache and line from .index */ nntp_delete_cache (nntp_data); - hash_remove (serv->newsgroups, nntp_data->group, NULL, - nntp_delete_data); - while (l && l->data != (void *) nntp_data) - l = l->next; - if (l) - l->data = NULL; - + hash_remove(serv->newsgroups, nntp_data->group, NULL, NULL); + for (l = &serv->list; *l; l = &(*l)->next) { + if ((*l) == nntp_data) { + nntp_data_list_pop(l); + nntp_data_delete(&nntp_data); + break; + } + } + nntp_data_delete(&nntp_data); sleep (2); } @@ -1951,7 +1924,7 @@ int nntp_fetch_message (MESSAGE * msg, CONTEXT * ctx, int msgno) /* see if we already have the message in our cache */ cache = - &((NNTP_DATA *) ctx->data)->acache[ctx->hdrs[msgno]->index % + &((nntp_data_t *) ctx->data)->acache[ctx->hdrs[msgno]->index % NNTP_CACHE_LEN]; /* if everything is fine, assign msg->fp and return */ @@ -1981,7 +1954,7 @@ int nntp_fetch_message (MESSAGE * msg, CONTEXT * ctx, int msgno) bar.size = 0; mutt_progress_bar (&bar, 0); - ret = mutt_nntp_fetch ((NNTP_DATA *) ctx->data, buf, NULL, &bar, nntp_read_tempfile, + ret = mutt_nntp_fetch ((nntp_data_t *) ctx->data, buf, NULL, &bar, nntp_read_tempfile, msg->fp, ctx->tagged); if (ret == 1) { mutt_error (_("Article %d not found on server"), @@ -2027,17 +2000,18 @@ int nntp_post (const char *msg) char buf[LONG_STRING]; size_t len; FILE *f; - NNTP_DATA *nntp_data; + nntp_data_t *nntp_data; if (Context && Context->magic == M_NNTP) - nntp_data = (NNTP_DATA *) Context->data; + nntp_data = (nntp_data_t *)Context->data; else { - if (!(CurrentNewsSrv = mutt_select_newsserver (NewsServer)) || - !CurrentNewsSrv->list || !CurrentNewsSrv->list->data) { + if (!(CurrentNewsSrv = mutt_select_newsserver(NewsServer)) || + !CurrentNewsSrv->list) + { mutt_error (_("Can't post article. No connection to news server.")); return -1; } - nntp_data = (NNTP_DATA *) CurrentNewsSrv->list->data; + nntp_data = CurrentNewsSrv->list; } if (!(f = safe_fopen (msg, "r"))) { @@ -2111,7 +2085,7 @@ void nntp_logout_all (void) } } -static void nntp_free_acache (NNTP_DATA * data) +static void nntp_free_acache (nntp_data_t * data) { int i; @@ -2123,22 +2097,17 @@ static void nntp_free_acache (NNTP_DATA * data) } } -static void nntp_delete_data (void *p) +void nntp_data_wipe(nntp_data_t *data) { - NNTP_DATA *data = (NNTP_DATA *)p; - - if (!p) - return; - p_delete(&data->entries); - p_delete(&data->desc); - p_delete(&data->cache); - nntp_free_acache (data); - p_delete(&data); + p_delete(&data->entries); + p_delete(&data->desc); + p_delete(&data->cache); + nntp_free_acache(data); } static int nntp_sync_mailbox (CONTEXT * ctx, int unused1, int* unused2) { - NNTP_DATA *data = ctx->data; + nntp_data_t *data = ctx->data; /* CACHE: update cache and .index files */ if ((option (OPTSAVEUNSUB) || data->subscribed)) @@ -2151,7 +2120,7 @@ static int nntp_sync_mailbox (CONTEXT * ctx, int unused1, int* unused2) static void nntp_fastclose_mailbox (CONTEXT * ctx) { - NNTP_DATA *data = (NNTP_DATA *) ctx->data, *tmp; + nntp_data_t *data = (nntp_data_t *) ctx->data, *tmp; if (!data) return; @@ -2161,7 +2130,7 @@ static void nntp_fastclose_mailbox (CONTEXT * ctx) nntp_save_cache_index (data->nserv); if ((tmp = hash_find (data->nserv->newsgroups, data->group)) == NULL || tmp != data) - nntp_delete_data (data); + nntp_data_delete(&data); else nntp_sync_sidebar (data); } @@ -2174,7 +2143,7 @@ int nntp_close_mailbox (CONTEXT * ctx) mutt_message _("Quitting newsgroup..."); if (ctx->data) { - NNTP_DATA *data = (NNTP_DATA *) ctx->data; + nntp_data_t *data = (nntp_data_t *) ctx->data; int ret; if (data->nserv && data->nserv->conn && ctx->unread) { @@ -2186,12 +2155,12 @@ int nntp_close_mailbox (CONTEXT * ctx) } } nntp_sync_mailbox (ctx, 0, NULL); - if (ctx->data && ((NNTP_DATA *) ctx->data)->nserv) { + if (ctx->data && ((nntp_data_t *) ctx->data)->nserv) { NNTP_SERVER *news; - news = ((NNTP_DATA *) ctx->data)->nserv; + news = ((nntp_data_t *) ctx->data)->nserv; newsrc_gen_entries (ctx); - ((NNTP_DATA *) ctx->data)->unread = ctx->unread; + ((nntp_data_t *) ctx->data)->unread = ctx->unread; mutt_newsrc_update (news); } mutt_clear_error (); @@ -2199,7 +2168,7 @@ int nntp_close_mailbox (CONTEXT * ctx) } /* use the GROUP command to poll for new mail */ -static int _nntp_check_mailbox (CONTEXT * ctx, NNTP_DATA * nntp_data) +static int _nntp_check_mailbox (CONTEXT * ctx, nntp_data_t * nntp_data) { char buf[LONG_STRING]; int count = 0; @@ -2253,7 +2222,7 @@ static int _nntp_check_mailbox (CONTEXT * ctx, NNTP_DATA * nntp_data) static int nntp_check_mailbox (CONTEXT * ctx, int* unused1, int unused2) { - return _nntp_check_mailbox (ctx, (NNTP_DATA *) ctx->data); + return _nntp_check_mailbox (ctx, (nntp_data_t *) ctx->data); } static int add_group (char *buf, void *serv) @@ -2261,7 +2230,7 @@ static int add_group (char *buf, void *serv) NNTP_SERVER *s = serv; char group[LONG_STRING], mod, desc[HUGE_STRING]; int first, last; - NNTP_DATA *nntp_data; + nntp_data_t *nntp_data; static int n = 0; _checked = n; /* _checked have N, where N = number of groups */ @@ -2275,16 +2244,16 @@ static int add_group (char *buf, void *serv) sscanf (buf, "%s %d %d %c %[^\n]", group, &last, &first, &mod, desc); if (!group) return 0; - if ((nntp_data = (NNTP_DATA *) hash_find (s->newsgroups, group)) == NULL) { + if ((nntp_data = (nntp_data_t *) hash_find (s->newsgroups, group)) == NULL) { n++; - nntp_data = xmalloc(sizeof(NNTP_DATA) + m_strlen(group) + 1); - nntp_data->group = (char *) nntp_data + sizeof (NNTP_DATA); + nntp_data = xmalloc(sizeof(nntp_data_t) + m_strlen(group) + 1); + nntp_data->group = (char *) nntp_data + sizeof (nntp_data_t); strcpy (nntp_data->group, group); nntp_data->nserv = s; if (s->newsgroups->nelem < s->newsgroups->curnelem * 2) hash_resize (s->newsgroups, s->newsgroups->nelem * 2); hash_insert (s->newsgroups, nntp_data->group, nntp_data); - nntp_add_to_list (s, nntp_data); + nntp_data_list_append(&s->list, nntp_data); } nntp_data->deleted = 0; nntp_data->firstMessage = first; @@ -2311,8 +2280,8 @@ static int add_group (char *buf, void *serv) static int nntp_check_newgroups (NNTP_SERVER * serv, int force) { char buf[LONG_STRING]; - NNTP_DATA nntp_data; - string_list_t *l, **emp; + nntp_data_t nntp_data; + nntp_data_t *l, **emp; time_t now; struct tm *t; @@ -2328,8 +2297,8 @@ static int nntp_check_newgroups (NNTP_SERVER * serv, int force) for (l = serv->list; l; l = l->next) { serv->check_time = 0; /* really check! */ - if (l->data && ((NNTP_DATA *) l->data)->subscribed) - _nntp_check_mailbox (NULL, (NNTP_DATA *) l->data); + if (l->subscribed) + _nntp_check_mailbox (NULL, l); } sidebar_draw (); } @@ -2346,11 +2315,11 @@ static int nntp_check_newgroups (NNTP_SERVER * serv, int force) t->tm_min, t->tm_sec); nntp_data.nserv = serv; if (Context && Context->magic == M_NNTP) - nntp_data.group = ((NNTP_DATA *) Context->data)->group; + nntp_data.group = ((nntp_data_t *) Context->data)->group; else nntp_data.group = NULL; - emp = serv->tail; + emp = nntp_data_list_last(&serv->list); if (mutt_nntp_fetch (&nntp_data, buf, _("Adding new newsgroups..."), NULL, add_group, serv, 0) != 0) { return -1; @@ -2359,9 +2328,8 @@ static int nntp_check_newgroups (NNTP_SERVER * serv, int force) mutt_message _("Loading descriptions..."); for (l = *emp; l; l = l->next) { - ((NNTP_DATA *)l->data)->new = 1; - nntp_get_desc((NNTP_DATA *) l->data, ((NNTP_DATA *)l->data)->group, - NULL, NULL); + l->new = 1; + nntp_get_desc(l, l->group, NULL, NULL); } if (*emp) nntp_save_cache_index(serv); @@ -2400,8 +2368,7 @@ static int nntp_get_cache_all (NNTP_SERVER * serv) int nntp_get_active (NNTP_SERVER * serv) { char msg[STRING]; - NNTP_DATA nntp_data; - string_list_t *tmp; + nntp_data_t nntp_data, **tmp = &serv->list; if (nntp_open_connection (serv) < 0) return -1; @@ -2422,13 +2389,14 @@ int nntp_get_active (NNTP_SERVER * serv) mutt_message (msg); nntp_get_desc (&nntp_data, "*", msg, NULL); - for (tmp = serv->list; tmp; tmp = tmp->next) { - NNTP_DATA *data = (NNTP_DATA *) tmp->data; - - if (data && data->deleted && !data->rc) { - nntp_delete_cache (data); - hash_remove (serv->newsgroups, data->group, NULL, nntp_delete_data); - tmp->data = NULL; + while (*tmp) { + if ((*tmp)->deleted && !(*tmp)->rc) { + nntp_data_t *d = nntp_data_list_pop(tmp); + nntp_delete_cache(d); + hash_remove(serv->newsgroups, d->group, NULL, NULL); + nntp_data_delete(&d); + } else { + tmp = &(*tmp)->next; } } nntp_save_cache_index (serv); @@ -2493,7 +2461,7 @@ static int check_children (char *s, void *c) int nntp_check_children (CONTEXT * ctx, const char *msgid) { - NNTP_DATA *nntp_data = (NNTP_DATA *) ctx->data; + nntp_data_t *nntp_data = (nntp_data_t *) ctx->data; char buf[STRING]; int i, ret = 0, tmp = 0; CHILD_CONTEXT cc = { ctx, 0, 0, NULL }; diff --git a/nntp.h b/nntp.h index 7acfa9e..3bc9103 100644 --- a/nntp.h +++ b/nntp.h @@ -21,67 +21,76 @@ extern mx_t const nntp_mx; #define NNTP_CACHE_LEN 10 enum { - NNTP_NONE = 0, - NNTP_OK, - NNTP_BYE + NNTP_NONE = 0, + NNTP_OK, + NNTP_BYE }; +typedef struct nntp_data_t nntp_data_t; + typedef struct { - unsigned feat_known : 1; - unsigned hasXPAT : 1; - unsigned hasXGTITLE : 1; - unsigned hasXOVER : 1; - unsigned hasLISTGROUP : 1; - unsigned status : 3; - char *newsrc; - char *cache; - int stat; - off_t size; - time_t mtime; - time_t newgroups_time; - time_t check_time; - hash_t *newsgroups; - string_list_t *list; /* list of newsgroups */ - string_list_t **tail; /* last entry of list */ - CONNECTION *conn; + unsigned feat_known : 1; + unsigned hasXPAT : 1; + unsigned hasXGTITLE : 1; + unsigned hasXOVER : 1; + unsigned hasLISTGROUP : 1; + unsigned status : 3; + char *newsrc; + char *cache; + int stat; + off_t size; + time_t mtime; + time_t newgroups_time; + time_t check_time; + hash_t *newsgroups; + nntp_data_t *list; /* list of newsgroups */ + CONNECTION *conn; } NNTP_SERVER; typedef struct { - int index; - char *path; + int index; + char *path; } NNTP_CACHE; typedef struct { - int first; - int last; + int first; + int last; } NEWSRC_ENTRY; -typedef struct { - NEWSRC_ENTRY *entries; - int num; /* number of used entries */ - int max; /* number of allocated entries */ - int unread; - int firstMessage; - int lastMessage; - int lastLoaded; - int lastCached; - unsigned subscribed:1; - unsigned rc:1; - unsigned new:1; - unsigned allowed:1; - unsigned deleted:1; - char *group; - char *desc; - char *cache; - NNTP_SERVER *nserv; - NNTP_CACHE acache[NNTP_CACHE_LEN]; -} NNTP_DATA; +struct nntp_data_t { + struct nntp_data_t *next; + + NEWSRC_ENTRY *entries; + int num; /* number of used entries */ + int max; /* number of allocated entries */ + int unread; + int firstMessage; + int lastMessage; + int lastLoaded; + int lastCached; + unsigned subscribed:1; + unsigned rc:1; + unsigned new:1; + unsigned allowed:1; + unsigned deleted:1; + char *group; + char *desc; + char *cache; + NNTP_SERVER *nserv; + NNTP_CACHE acache[NNTP_CACHE_LEN]; +}; + +DO_INIT(nntp_data_t, nntp_data); +void nntp_data_wipe(nntp_data_t *); +DO_NEW(nntp_data_t, nntp_data); +DO_DELETE(nntp_data_t, nntp_data); +DO_SLIST(nntp_data_t, nntp_data, nntp_data_delete); NNTP_SERVER *mutt_select_newsserver (char *); -NNTP_DATA *mutt_newsgroup_subscribe (NNTP_SERVER *, char *); -NNTP_DATA *mutt_newsgroup_unsubscribe (NNTP_SERVER *, char *); -NNTP_DATA *mutt_newsgroup_catchup (NNTP_SERVER *, char *); -NNTP_DATA *mutt_newsgroup_uncatchup (NNTP_SERVER *, char *); +nntp_data_t *mutt_newsgroup_subscribe (NNTP_SERVER *, char *); +nntp_data_t *mutt_newsgroup_unsubscribe (NNTP_SERVER *, char *); +nntp_data_t *mutt_newsgroup_catchup (NNTP_SERVER *, char *); +nntp_data_t *mutt_newsgroup_uncatchup (NNTP_SERVER *, char *); void nntp_clear_cacheindex (NNTP_SERVER *); int mutt_newsrc_update (NNTP_SERVER *); int nntp_close_mailbox (CONTEXT *); @@ -95,7 +104,7 @@ void nntp_expand_path (char *, ssize_t, ACCOUNT *); void nntp_logout_all(void); const char *nntp_format_str(char *, ssize_t, char, const char *, const char *, const char *, const char *, anytype, format_flag); -void nntp_sync_sidebar (NNTP_DATA*); +void nntp_sync_sidebar (nntp_data_t*); WHERE NNTP_SERVER *CurrentNewsSrv INITVAL (NULL); diff --git a/pager.c b/pager.c index f1c9623..dd1a621 100644 --- a/pager.c +++ b/pager.c @@ -2221,7 +2221,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra) CHECK_MODE (IsHeader (extra) && !IsAttach (extra)); CHECK_ATTACH; if (extra->ctx && extra->ctx->magic == M_NNTP && - !((NNTP_DATA *) extra->ctx->data)->allowed && + !((nntp_data_t *) extra->ctx->data)->allowed && query_quadoption (OPT_TOMODERATED, _ ("Posting to this group not allowed, may be moderated. Continue?")) @@ -2235,7 +2235,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra) CHECK_MODE (IsHeader (extra) || IsMsgAttach (extra)); CHECK_ATTACH; if (extra->ctx && extra->ctx->magic == M_NNTP && - !((NNTP_DATA *) extra->ctx->data)->allowed && + !((nntp_data_t *) extra->ctx->data)->allowed && query_quadoption (OPT_TOMODERATED, _ ("Posting to this group not allowed, may be moderated. Continue?")) @@ -2263,7 +2263,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra) query_quadoption (OPT_FOLLOWUPTOPOSTER, _("Reply by mail as poster prefers?")) != M_YES) { if (extra->ctx && extra->ctx->magic == M_NNTP - && !((NNTP_DATA *) extra->ctx->data)->allowed + && !((nntp_data_t *) extra->ctx->data)->allowed && query_quadoption (OPT_TOMODERATED, _ ("Posting to this group not allowed, may be moderated. Continue?")) diff --git a/send.c b/send.c index f64c776..5551bad 100644 --- a/send.c +++ b/send.c @@ -1241,7 +1241,7 @@ int ci_send_message (int flags, /* send mode */ #ifdef USE_NNTP if ((flags & SENDNEWS) && ctx && ctx->magic == M_NNTP && !msg->env->newsgroups) - msg->env->newsgroups = m_strdup(((NNTP_DATA *) ctx->data)->group); + msg->env->newsgroups = m_strdup(((nntp_data_t *)ctx->data)->group); #endif if (!(option (OPTAUTOEDIT) && option (OPTEDITHDRS)) && -- 2.20.1