summaryrefslogtreecommitdiff
path: root/mailbox/nntp/nntp_response.c
diff options
context:
space:
mode:
Diffstat (limited to 'mailbox/nntp/nntp_response.c')
-rw-r--r--mailbox/nntp/nntp_response.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/mailbox/nntp/nntp_response.c b/mailbox/nntp/nntp_response.c
new file mode 100644
index 000000000..a943a8743
--- /dev/null
+++ b/mailbox/nntp/nntp_response.c
@@ -0,0 +1,72 @@
+/* GNU Mailutils -- a suite of utilities for electronic mail
+ Copyright (C) 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>
+
+/* If we did not grap the ack already, call nntp_readline() but handle
+ Nonblocking also. */
+int
+mu_nntp_response (mu_nntp_t nntp, char *buffer, size_t buflen, size_t *pnread)
+{
+ size_t n = 0;
+ int status = 0;
+
+ if (nntp == NULL)
+ return EINVAL;
+
+ if (!nntp->acknowledge)
+ {
+ size_t len = nntp->ack.len - (nntp->ack.ptr - nntp->ack.buf);
+ status = mu_nntp_readline (nntp, nntp->ack.ptr, len, &n);
+ nntp->ack.ptr += n;
+ if (status == 0)
+ {
+ len = nntp->ack.ptr - nntp->ack.buf;
+ if (len && nntp->ack.buf[len - 1] == '\n')
+ nntp->ack.buf[len - 1] = '\0';
+ nntp->acknowledge = 1; /* Flag that we have the ack. */
+ nntp->ack.ptr = nntp->ack.buf;
+ }
+ else
+ {
+ /* Provide them with an error. */
+ const char *econ = "500 NNTP IO ERROR";
+ n = strlen (econ);
+ strcpy (nntp->ack.buf, econ);
+ }
+ }
+ else
+ n = strlen (nntp->ack.buf);
+
+ if (buffer)
+ {
+ buflen--; /* Leave space for the NULL. */
+ n = (buflen < n) ? buflen : n;
+ memcpy (buffer, nntp->ack.buf, n);
+ buffer[n] = '\0';
+ }
+
+ if (pnread)
+ *pnread = n;
+ return status;
+}

Return to:

Send suggestions and report system problems to the System administrator.