diff options
Diffstat (limited to 'librabbitmq/amqp-tcp-socket.c')
-rw-r--r-- | librabbitmq/amqp-tcp-socket.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/librabbitmq/amqp-tcp-socket.c b/librabbitmq/amqp-tcp-socket.c index 10430a9..2307c5c 100644 --- a/librabbitmq/amqp-tcp-socket.c +++ b/librabbitmq/amqp-tcp-socket.c @@ -29,7 +29,7 @@ #include <stdlib.h> struct amqp_tcp_socket_t { - amqp_socket_t base; + const struct amqp_socket_class_t *klass; int sockfd; }; @@ -117,6 +117,16 @@ amqp_tcp_socket_get_sockfd(void *base) return self->sockfd; } +static const struct amqp_socket_class_t amqp_tcp_socket_class = { + amqp_tcp_socket_writev, /* writev */ + amqp_tcp_socket_send, /* send */ + amqp_tcp_socket_recv, /* recv */ + amqp_tcp_socket_open, /* open */ + amqp_tcp_socket_close, /* close */ + amqp_tcp_socket_error, /* error */ + amqp_tcp_socket_get_sockfd /* get_sockfd */ +}; + amqp_socket_t * amqp_tcp_socket_new(void) { @@ -124,13 +134,7 @@ amqp_tcp_socket_new(void) if (!self) { return NULL; } - self->base.writev = amqp_tcp_socket_writev; - self->base.send = amqp_tcp_socket_send; - self->base.recv = amqp_tcp_socket_recv; - self->base.open = amqp_tcp_socket_open; - self->base.close = amqp_tcp_socket_close; - self->base.error = amqp_tcp_socket_error; - self->base.get_sockfd = amqp_tcp_socket_get_sockfd; + self->klass = &amqp_tcp_socket_class; self->sockfd = -1; return (amqp_socket_t *)self; } @@ -138,6 +142,10 @@ amqp_tcp_socket_new(void) void amqp_tcp_socket_set_sockfd(amqp_socket_t *base, int sockfd) { - struct amqp_tcp_socket_t *self = (struct amqp_tcp_socket_t *)base; + struct amqp_tcp_socket_t *self; + if (base->klass != &amqp_tcp_socket_class) { + amqp_abort("<%p> is not of type amqp_tcp_socket_t", base); + } + self = (struct amqp_tcp_socket_t *)base; self->sockfd = sockfd; } |