114 |
|
|
115 |
An example using @code{tcp_stream_create} to make a simple web client: |
An example using @code{tcp_stream_create} to make a simple web client: |
116 |
|
|
|
FIXME: this example won't build anymore. |
|
|
|
|
117 |
@example |
@example |
118 |
#include <stdlib.h> |
@include http.c.texi |
|
#include <stdio.h> |
|
|
#include <errno.h> |
|
|
#include <string.h> |
|
|
#include <unistd.h> |
|
|
#include <sys/select.h> |
|
|
|
|
|
#include <mailutils/io.h> |
|
|
|
|
|
const char *wbuf = "GET / HTTP/1.0\r\n\r\n"; |
|
|
char rbuf[1024]; |
|
|
|
|
|
int |
|
|
main(int argc, char **argv) |
|
|
@{ |
|
|
int ret, off = 0, fd; |
|
|
stream_t stream; |
|
|
size_t nb; |
|
|
fd_set fds; |
|
|
|
|
|
argc = argc, argv = argv; |
|
|
|
|
|
ret = tcp_stream_create (&stream); |
|
|
if (ret != 0) |
|
|
@{ |
|
|
fprintf (stderr, "tcp_stream_create: %s\n", |
|
|
mailutils_error(ret)); |
|
|
exit (EXIT_FAILURE); |
|
|
@} |
|
|
|
|
|
connect_again: |
|
|
ret = stream_open (stream, "www.netscape.com", 80, |
|
|
MU_STREAM_NONBLOCK); |
|
|
if (ret != 0) |
|
|
@{ |
|
|
if (ret == MU_ERROR_EAGAIN) |
|
|
@{ |
|
|
ret = stream_get_fd(stream, &fd); |
|
|
if (ret != 0) |
|
|
@{ |
|
|
fprintf (stderr, "stream_get_fd: %s\n", |
|
|
mailutils_error(ret)); |
|
|
exit (EXIT_FAILURE); |
|
|
@} |
|
|
FD_ZERO (&fds); |
|
|
FD_SET (fd, &fds); |
|
|
select (fd+1, NULL, &fds, NULL, NULL); |
|
|
goto connect_again; |
|
|
@} |
|
|
fprintf (stderr, "stream_open: %s\n", mailutils_error (ret)); |
|
|
exit (EXIT_FAILURE); |
|
|
@} |
|
|
|
|
|
ret = stream_get_fd (stream, &fd); |
|
|
if (ret != 0) |
|
|
@{ |
|
|
fprintf(stderr, "stream_get_fd: %s\n", strerror(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; |
|
|
@} |
|
|
fprintf (stderr, "stream_write: %s\n", strerror(ret)); |
|
|
exit (EXIT_FAILURE) |
|
|
@} |
|
|
|
|
|
if (nb != strlen (wbuf)) |
|
|
@{ |
|
|
fprintf(stderr, "stream_write: %s\n", "nb != wbuf length"); |
|
|
exit (EXIT_FAILURE); |
|
|
@} |
|
|
|
|
|
do |
|
|
@{ |
|
|
read_again: |
|
|
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); |
|
|
goto read_again; |
|
|
@} |
|
|
fprintf (stderr, "stream_read: %s\n", strerror(ret)); |
|
|
exit(EXIT_FAILURE); |
|
|
@} |
|
|
write (2, rbuf, nb); |
|
|
@} while (nb); |
|
|
|
|
|
ret = stream_close (stream); |
|
|
if (ret!= 0) |
|
|
@{ |
|
|
fprintf (stderr, "stream_close: %s\n", strerror(ret)); |
|
|
exit (EXIT_FAILURE); |
|
|
@} |
|
|
|
|
|
stream_destroy (&stream, NULL); |
|
|
exit (EXIT_SUCCESS); |
|
|
@} |
|
119 |
@end example |
@end example |