diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2002-09-04 08:23:27 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2002-09-04 08:23:27 +0000 |
commit | e7c9313f98d297523f6b724d8e339f8c6e55ace7 (patch) | |
tree | 5d3976a7002e2c27888aa396481e2c21ab678a0f /examples | |
parent | 4dfb57688e3d63311389df80343846bfafda8ab4 (diff) | |
download | mailutils-e7c9313f98d297523f6b724d8e339f8c6e55ace7.tar.gz mailutils-e7c9313f98d297523f6b724d8e339f8c6e55ace7.tar.bz2 |
Example of stream functions.
Diffstat (limited to 'examples')
-rw-r--r-- | examples/http.c | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/examples/http.c b/examples/http.c new file mode 100644 index 000000000..facc15128 --- /dev/null +++ b/examples/http.c @@ -0,0 +1,128 @@ +/* GNU mailutils - a suite of utilities for electronic mail + Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* This is an example program to illustrate the use of stream functions. + It connects to a remote HTTP server and prints the contents of its + index page */ +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> +#include <string.h> +#include <unistd.h> +#include <sys/select.h> + +#include <mailutils/mailutils.h> + +const char *wbuf = "GET / HTTP/1.0\r\n\r\n"; +char rbuf[1024]; + +int +main () +{ + int ret, off = 0, fd; + stream_t stream; + size_t nb; + fd_set fds; + + ret = tcp_stream_create (&stream, "www.gnu.org", 80, MU_STREAM_NONBLOCK); + if (ret != 0) + { + mu_error ( "tcp_stream_create: %s\n", mu_errstring (ret)); + exit (EXIT_FAILURE); + } + +connect_again: + ret = stream_open (stream); + if (ret != 0) + { + if (ret == EAGAIN) + { + ret = stream_get_fd (stream, &fd); + if (ret != 0) + { + mu_error ( "stream_get_fd: %s\n", mu_errstring (ret)); + exit (EXIT_FAILURE); + } + FD_ZERO (&fds); + FD_SET (fd, &fds); + select (fd + 1, NULL, &fds, NULL, NULL); + goto connect_again; + } + mu_error ( "stream_open: %s\n", mu_errstring (ret)); + exit (EXIT_FAILURE); + } + + ret = stream_get_fd (stream, &fd); + if (ret != 0) + { + mu_error ( "stream_get_fd: %s\n", mu_errstring (ret)); + exit (EXIT_FAILURE); + } + +write_again: + ret = stream_write (stream, wbuf + off, strlen (wbuf), 0, &nb); + if (ret != 0) + { + if (ret == EAGAIN) + { + FD_ZERO (&fds); + FD_SET (fd, &fds); + select (fd + 1, NULL, &fds, NULL, NULL); + off += nb; + goto write_again; + } + mu_error ( "stream_write: %s\n", mu_errstring (ret)); + exit (EXIT_FAILURE); + } + + if (nb != strlen (wbuf)) + { + mu_error ( "stream_write: %s\n", "nb != wbuf length"); + exit (EXIT_FAILURE); + } + + do + { + ret = stream_read (stream, rbuf, sizeof (rbuf), 0, &nb); + if (ret != 0) + { + if (ret == EAGAIN) + { + FD_ZERO (&fds); + FD_SET (fd, &fds); + select (fd + 1, &fds, NULL, NULL, NULL); + } + else + { + mu_error ( "stream_read: %s\n", mu_errstring (ret)); + exit (EXIT_FAILURE); + } + } + write (2, rbuf, nb); + } + while (nb || ret == EAGAIN); + + ret = stream_close (stream); + if (ret != 0) + { + mu_error ( "stream_close: %s\n", mu_errstring (ret)); + exit (EXIT_FAILURE); + } + + stream_destroy (&stream, NULL); + exit (EXIT_SUCCESS); +} |