X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=liblttng-ust%2Flttng-ust-comm.c;h=69414ebd34cc338b4f9f10a3ce02f3af89003239;hb=2d78951a159c97fd2bfebb84a9b22ef97674d56a;hp=deca7cbd8f3b884e9dd59bb16871cf8a118e6bfa;hpb=1ddfd6412d2a160eb5b8e97ebbfd0a9dbc88faa0;p=lttng-ust.git diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c index deca7cbd..69414ebd 100644 --- a/liblttng-ust/lttng-ust-comm.c +++ b/liblttng-ust/lttng-ust-comm.c @@ -281,6 +281,56 @@ int handle_message(struct sock_info *sock_info, else ret = lttng_ust_objd_unref(lum->handle); break; + case LTTNG_UST_FILTER: + { + /* Receive filter data */ + struct { + uint16_t len; + uint16_t reloc_offset; + char data[FILTER_BYTECODE_MAX_LEN]; + } filter_data; + + if (lum->u.filter.data_size > 65536) { + ERR("Filter data size is too large: %u bytes\n", + lum->u.filter.data_size); + ret = -EINVAL; + goto error; + } + len = ustcomm_recv_unix_sock(sock, filter_data.data, + lum->u.filter.data_size); + switch (len) { + case 0: /* orderly shutdown */ + ret = 0; + goto error; + case -1: + DBG("Receive failed from lttng-sessiond with errno %d", errno); + if (errno == ECONNRESET) { + ERR("%s remote end closed connection\n", sock_info->name); + ret = -EINVAL; + goto error; + } + ret = -EINVAL; + goto end; + default: + if (len == lum->u.filter.data_size) { + DBG("filter data received\n"); + break; + } else { + ERR("incorrect filter data message size: %zd\n", len); + ret = -EINVAL; + goto end; + } + } + filter_data.len = lum->u.filter.data_size; + filter_data.reloc_offset = lum->u.filter.reloc_offset; + if (ops->cmd) + ret = ops->cmd(lum->handle, lum->cmd, + (unsigned long) &filter_data, + &args); + else + ret = -ENOSYS; + break; + } default: if (ops->cmd) ret = ops->cmd(lum->handle, lum->cmd,