124 lines
3.0 KiB
C
124 lines
3.0 KiB
C
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "common.h"
|
|
|
|
|
|
static int uv_link_observer_read_start(uv_link_t* link) {
|
|
uv_link_observer_t* observer;
|
|
|
|
observer = container_of(link, uv_link_observer_t, link);
|
|
|
|
return uv_link_read_start(observer->target);
|
|
}
|
|
|
|
|
|
static int uv_link_observer_read_stop(uv_link_t* link) {
|
|
uv_link_observer_t* observer;
|
|
|
|
observer = container_of(link, uv_link_observer_t, link);
|
|
|
|
return uv_link_read_stop(observer->target);
|
|
}
|
|
|
|
|
|
static int uv_link_observer_write(uv_link_t* link,
|
|
const uv_buf_t bufs[],
|
|
unsigned int nbufs,
|
|
uv_stream_t* send_handle,
|
|
uv_link_write_cb cb) {
|
|
uv_link_observer_t* observer;
|
|
|
|
observer = container_of(link, uv_link_observer_t, link);
|
|
|
|
return uv_link_write(observer->target, bufs, nbufs, send_handle, cb);
|
|
}
|
|
|
|
|
|
static int uv_link_observer_try_write(uv_link_t* link,
|
|
const uv_buf_t bufs[],
|
|
unsigned int nbufs) {
|
|
uv_link_observer_t* observer;
|
|
|
|
observer = container_of(link, uv_link_observer_t, link);
|
|
|
|
return uv_link_try_write(observer->target, bufs, nbufs);
|
|
}
|
|
|
|
|
|
static int uv_link_observer_shutdown(uv_link_t* link, uv_link_shutdown_cb cb) {
|
|
uv_link_observer_t* observer;
|
|
|
|
observer = container_of(link, uv_link_observer_t, link);
|
|
|
|
return uv_link_shutdown(observer->target, cb);
|
|
}
|
|
|
|
|
|
static void uv_link_observer_alloc_cb(uv_link_t* link,
|
|
size_t suggested_size,
|
|
uv_buf_t* buf) {
|
|
return uv_link_invoke_alloc_cb(link, suggested_size, buf);
|
|
}
|
|
|
|
|
|
static void uv_link_observer_read_cb(uv_link_t* link,
|
|
ssize_t nread,
|
|
const uv_buf_t* buf) {
|
|
uv_link_observer_t* observer;
|
|
|
|
observer = container_of(link, uv_link_observer_t, link);
|
|
|
|
if (observer->read_cb != NULL)
|
|
observer->read_cb(observer, nread, buf);
|
|
|
|
return uv_link_invoke_read_cb(link, nread, buf);
|
|
}
|
|
|
|
|
|
static uv_link_methods_t uv_link_observer_methods = {
|
|
.read_start = uv_link_observer_read_start,
|
|
.read_stop = uv_link_observer_read_stop,
|
|
.write = uv_link_observer_write,
|
|
.try_write = uv_link_observer_try_write,
|
|
.shutdown = uv_link_observer_shutdown
|
|
};
|
|
|
|
|
|
int uv_link_observer_init(uv_link_observer_t* observer,
|
|
uv_link_t* target) {
|
|
int err;
|
|
|
|
memset(observer, 0, sizeof(*observer));
|
|
|
|
err = uv_link_init(&observer->link, &uv_link_observer_methods);
|
|
if (err != 0)
|
|
return err;
|
|
|
|
observer->target = target;
|
|
|
|
err = uv_link_chain(target, &observer->link, uv_link_observer_alloc_cb,
|
|
uv_link_observer_read_cb);
|
|
if (err != 0) {
|
|
uv_link_close(&observer->link);
|
|
return err;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int uv_link_observer_close(uv_link_observer_t* observer) {
|
|
int err;
|
|
|
|
err = uv_link_unchain(observer->target, &observer->link);
|
|
if (err != 0)
|
|
return err;
|
|
|
|
uv_link_close(&observer->link);
|
|
|
|
observer->target = NULL;
|
|
|
|
return 0;
|
|
}
|