diff options
author | Lennart Poettering <lennart@poettering.net> | 2004-01-14 18:08:39 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2004-01-14 18:08:39 +0000 |
commit | 1b34f889f90cd879367f233c90d98b18dd47d338 (patch) | |
tree | 10025d8103bff429ccfdac18a70158996ba05c7f /src/client-tcp.c | |
parent | 94fea1e00bc2115cb9163d53a0d5b25a88d35898 (diff) |
initial commit
git-svn-id: file:///home/lennart/svn/public/bidilink/trunk@3 9cde1c1d-e4d0-0310-8a68-bf217395ea82
Diffstat (limited to 'src/client-tcp.c')
-rw-r--r-- | src/client-tcp.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/client-tcp.c b/src/client-tcp.c new file mode 100644 index 0000000..78d8fc4 --- /dev/null +++ b/src/client-tcp.c @@ -0,0 +1,66 @@ +#include <sys/types.h> +#include <sys/socket.h> +#include <inttypes.h> +#include <string.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <errno.h> +#include <stdlib.h> +#include <stdio.h> +#include <assert.h> +#include <netdb.h> +#include <unistd.h> + +#include "client-tcp.h" + +struct stream* stream_client_tcp(const char *args) { + struct stream *s = NULL; + int fd = -1; + struct sockaddr_in sa; + struct hostent *h; + size_t l; + uint16_t port = 23; + + char hn[256]; + l = strcspn(args, ":"); + if (l > sizeof(hn)-1) + l = sizeof(hn)-1; + strncpy(hn, args, l); + hn[l] = 0; + + if (args[l] == ':') + port = atoi(args+l+1); + + s = malloc(sizeof(struct stream)); + assert(s); + memset(s, 0, sizeof(struct stream)); + + if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) { + fprintf(stderr, "socket(): %s\n", strerror(errno)); + goto fail; + } + + memset(&sa, 0, sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = htons(port); + if (!(h = gethostbyname(hn))) { + fprintf(stderr, "Unknown host '%s'.\n", hn); + goto fail; + } + sa.sin_addr = *(struct in_addr *) h->h_addr; + + if (connect(fd, (struct sockaddr *) &sa, sizeof(sa)) < 0) { + fprintf(stderr, "connect(): %s\n", strerror(errno)); + goto fail; + } + + s->input_fd = s->output_fd = fd; + return s; + +fail: + free(s); + if (fd >= 0) + close(fd); + + return NULL; +} |