diff options
Diffstat (limited to 'mailbox/nntp/nntp_stat.c')
-rw-r--r-- | mailbox/nntp/nntp_stat.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/mailbox/nntp/nntp_stat.c b/mailbox/nntp/nntp_stat.c new file mode 100644 index 000000000..0df9d3514 --- /dev/null +++ b/mailbox/nntp/nntp_stat.c @@ -0,0 +1,99 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 1999, 2000, 2001, 2004 Free Software Foundation, Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <string.h> +#include <errno.h> +#include <mailutils/sys/nntp.h> + +int +mu_nntp_stat (mu_nntp_t nntp, unsigned long number, unsigned long *pnumber, char **mid) +{ + int status; + char *message_id = NULL; + if (number != 0) + { + message_id = malloc (128); + if (message_id == NULL) + { + return ENOMEM; + } + snprintf (message_id, 127, "%ld", number); + } + status = mu_nntp_stat_id (nntp, message_id, pnumber, mid); + if (message_id) + { + free (message_id); + } + return status; +} + +int +mu_nntp_stat_id (mu_nntp_t nntp, const char *message_id, unsigned long *number, char **mid) +{ + int status; + + if (nntp == NULL) + return EINVAL; + + switch (nntp->state) + { + case MU_NNTP_NO_STATE: + if (message_id == NULL || *message_id == '\0') + { + status = mu_nntp_writeline (nntp, "STAT\r\n"); + } + else + { + status = mu_nntp_writeline (nntp, "STAT %s\r\n", message_id); + } + MU_NNTP_CHECK_ERROR (nntp, status); + mu_nntp_debug_cmd (nntp); + nntp->state = MU_NNTP_STAT; + + case MU_NNTP_STAT: + status = mu_nntp_send (nntp); + MU_NNTP_CHECK_EAGAIN (nntp, status); + nntp->acknowledge = 0; + nntp->state = MU_NNTP_STAT_ACK; + + case MU_NNTP_STAT_ACK: + status = mu_nntp_response (nntp, NULL, 0, NULL); + MU_NNTP_CHECK_EAGAIN (nntp, status); + mu_nntp_debug_ack (nntp); + MU_NNTP_CHECK_CODE(nntp, MU_NNTP_RESP_CODE_ARTICLE_FOUND); + nntp->state = MU_NNTP_NO_STATE; + + /* parse the answer now. */ + status = mu_nntp_parse_article(nntp, MU_NNTP_RESP_CODE_ARTICLE_FOUND, number, mid); + MU_NNTP_CHECK_ERROR (nntp, status); + break; + + /* They must deal with the error first by reopening. */ + case MU_NNTP_ERROR: + status = ECANCELED; + break; + + default: + status = EINPROGRESS; + } + + return status; +} |