--- a/src/sock_tcp.c Sun Feb 22 03:57:44 2009 +0200
+++ b/src/sock_tcp.c Sun Feb 22 05:27:29 2009 +0200
@@ -30,33 +30,43 @@
}
/*
- * Define our sock_stream_Type
+ * Our sock_stream_type
+ *
+ * XXX: move to sock_tcp.h
*/
struct sock_stream_type sock_tcp_type = {
.methods.read = &sock_tcp_read,
.methods.write = &sock_tcp_write,
};
-struct sock_stream* sock_tcp_new (int fd)
+struct sock_tcp* sock_tcp_alloc (void)
{
struct sock_tcp *sock;
// alloc
if ((sock = calloc(1, sizeof(*sock))) == NULL)
errx(1, "calloc");
+
+ // initialize base
+ sock->base.type = &sock_tcp_type;
+ // done
+ return sock;
+}
+
+int sock_tcp_init_fd (struct sock_tcp *sock, int fd)
+{
// initialize
- sock->base.type = &sock_tcp_type;
sock->fd = fd;
// done
- return SOCK_TCP_BASE(sock);
+ return 0;
}
-struct sock_stream* sock_tcp_connect (const char *host, const char *service)
+int sock_tcp_init_connect (struct sock_tcp *sock, const char *hostname, const char *service)
{
struct addrinfo hints, *res, *r;
- int _err, fd = -1;
+ int _err;
// hints
memset(&hints, 0, sizeof(hints));
@@ -64,26 +74,40 @@
hints.ai_socktype = SOCK_STREAM;
// resolve
- if ((_err = getaddrinfo(host, service, &hints, &res)))
+ if ((_err = getaddrinfo(hostname, service, &hints, &res)))
errx(1, "getaddrinfo: %s", gai_strerror(_err));
// use
for (r = res; r; r = r->ai_next) {
// XXX: wrong
- if ((fd = socket(r->ai_family, r->ai_socktype, r->ai_protocol)) < 0)
+ if ((sock->fd = socket(r->ai_family, r->ai_socktype, r->ai_protocol)) < 0)
err(1, "socket");
- if (connect(fd, r->ai_addr, r->ai_addrlen))
+ if (connect(sock->fd, r->ai_addr, r->ai_addrlen))
err(1, "connect");
break;
}
// ensure we got some valid socket
- if (fd < 0)
+ if (sock->fd < 0)
errx(1, "no valid socket");
- // ok, return sock_stream
- return sock_tcp_new(fd);
+ // ok, done
+ return 0;
}
+// XXX: error handling
+struct sock_stream* sock_tcp_connect (const char *host, const char *service)
+{
+ struct sock_tcp *sock;
+
+ // allocate
+ sock = sock_tcp_alloc();
+
+ // connect
+ sock_tcp_init_connect(sock, host, service);
+
+ // done
+ return SOCK_TCP_BASE(sock);
+}