aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>2016-09-14 18:54:30 -0400
committerSteven Rostedt <rostedt@goodmis.org>2016-10-30 19:46:49 -0400
commit7a96111611ed8e67a0a371be04779609a2483a7e (patch)
tree162b6569a8b72760cdef14e42581139ebd6617b5
parent7a9bb2d85096327d02836f6587de78784ce1b9ca (diff)
downloadtrace-cmd-7a96111611ed8e67a0a371be04779609a2483a7e.tar.gz
trace-cmd msg: Consolidate logic of allocating reads of RINIT and SENDMETA
As the logic of allocating RINIT and SENDMETA on read is the same except for sizes and where to store the dynamic data, create a helper funtion that performs the algorithm for both of them. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--trace-msg.c48
1 files changed, 24 insertions, 24 deletions
diff --git a/trace-msg.c b/trace-msg.c
index 03c48ceb..62a9c194 100644
--- a/trace-msg.c
+++ b/trace-msg.c
@@ -309,6 +309,26 @@ static int msg_read(int fd, void *buf, u32 size, int *n)
return 0;
}
+static int msg_read_extra(int fd, void *buf, int *n,
+ int size, int min_size, void **addr)
+{
+ int rsize;
+ int ret;
+
+ rsize = min_size - *n;
+ ret = msg_read(fd, buf, rsize, n);
+ if (ret < 0)
+ return ret;
+ size -= *n;
+ if (size < 0)
+ return -ENOMSG;
+ *addr = malloc(size);
+ if (!*addr)
+ return -ENOMEM;
+ *n = 0;
+ return msg_read(fd, *addr, size, n);
+}
+
static int tracecmd_msg_read_extra(int fd, struct tracecmd_msg *msg, int *n)
{
int size = ntohl(msg->size);
@@ -335,31 +355,11 @@ static int tracecmd_msg_read_extra(int fd, struct tracecmd_msg *msg, int *n)
}
return 0;
case MSG_RINIT:
- rsize = MIN_RINIT_SIZE - *n;
- ret = msg_read(fd, msg, rsize, n);
- if (ret < 0)
- return ret;
- size -= *n;
- if (size < 0)
- return -ENOMSG;
- msg->data.rinit.port_array = malloc(size);
- if (!msg->data.rinit.port_array)
- return -ENOMEM;
- *n = 0;
- return msg_read(fd, msg->data.rinit.port_array, size, n);
+ return msg_read_extra(fd, msg, n, size, MIN_RINIT_SIZE,
+ (void **)&msg->data.rinit.port_array);
case MSG_SENDMETA:
- rsize = MIN_META_SIZE - *n;
- ret = msg_read(fd, msg, rsize, n);
- if (ret < 0)
- return ret;
- size -= *n;
- if (size < 0)
- return -ENOMSG;
- msg->data.meta.buf = malloc(size);
- if (!msg->data.meta.buf)
- return -ENOMEM;
- *n = 0;
- return msg_read(fd, msg->data.meta.buf, size, n);
+ return msg_read_extra(fd, msg, n, size, MIN_META_SIZE,
+ (void **)&msg->data.meta.buf);
}
return msg_read(fd, msg, size - MSG_HDR_LEN, n);