--- a/src/sock_tcp.c Tue Mar 10 02:34:11 2009 +0200
+++ b/src/sock_tcp.c Tue Mar 10 02:51:44 2009 +0200
@@ -149,7 +149,7 @@
err_t sock_tcp_init_fd (struct sock_tcp *sock, int fd)
{
- // valid fd -XXX: err instead?
+ // valid fd
assert(fd >= 0);
// initialize
@@ -194,8 +194,11 @@
err_t sock_tcp_init_connect (struct sock_tcp *sock, const char *hostname, const char *service)
{
struct addrinfo hints, *res, *r;
- int err;
- RESET_ERROR(SOCK_TCP_ERR(sock));
+ int ret;
+ struct error_info *err = SOCK_TCP_ERR(sock);
+
+ // zero error code
+ RESET_ERROR(err);
// hints
memset(&hints, 0, sizeof(hints));
@@ -203,15 +206,15 @@
hints.ai_socktype = SOCK_STREAM;
// resolve
- if ((err = getaddrinfo(hostname, service, &hints, &res)))
- RETURN_SET_ERROR_EXTRA(SOCK_TCP_ERR(sock), ERR_GETADDRINFO, err);
+ if ((ret = getaddrinfo(hostname, service, &hints, &res)))
+ RETURN_SET_ERROR_EXTRA(err, ERR_GETADDRINFO, ret);
// try each result in turn
for (r = res; r; r = r->ai_next) {
// create the socket
if ((sock->fd = socket(r->ai_family, r->ai_socktype, r->ai_protocol)) < 0) {
// remember error
- SET_ERROR_ERRNO(SOCK_TCP_ERR(sock), ERR_SOCKET);
+ SET_ERROR_ERRNO(err, ERR_SOCKET);
// skip to next one
continue;
@@ -220,7 +223,7 @@
// connect to remote address
if (connect(sock->fd, r->ai_addr, r->ai_addrlen)) {
// remember error
- SET_ERROR_ERRNO(SOCK_TCP_ERR(sock), ERR_CONNECT);
+ SET_ERROR_ERRNO(err, ERR_CONNECT);
// close/invalidate socket
close(sock->fd);
@@ -237,13 +240,13 @@
// ensure we got some valid socket, else return last error code
if (sock->fd < 0) {
// did we hit some error?
- if (IS_ERROR(SOCK_TCP_ERR(sock)))
+ if (IS_ERROR(err))
// return last error
- return ERROR_CODE(SOCK_TCP_ERR(sock));
+ return ERROR_CODE(err);
else
// no results
- return SET_ERROR(SOCK_TCP_ERR(sock), ERR_GETADDRINFO_EMPTY);
+ return SET_ERROR(err, ERR_GETADDRINFO_EMPTY);
}
// ok, done
@@ -261,8 +264,13 @@
return SUCCESS;
}
-void sock_tcp_close (struct sock_tcp *sock)
+err_t sock_tcp_close (struct sock_tcp *sock)
{
+ struct error_info *err = SOCK_TCP_ERR(sock);
+
+ // no errors yet
+ RESET_ERROR(err);
+
// must be connected
assert(sock->fd >= 0);
@@ -274,11 +282,13 @@
event_del(sock->ev_write);
// close the socket itself
- // XXX: errors?
- close(sock->fd);
+ if (close(sock->fd))
+ SET_ERROR_ERRNO(err, ERR_CLOSE);
// invalidate
sock->fd = -1;
+
+ return ERROR_CODE(err);
}
void sock_tcp_free (struct sock_tcp *sock)