src/sock_tcp.c
changeset 2 a834f0559939
parent 1 cf0e1bb6bcab
child 3 cc94ae754e2a
--- 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);
+}