[ltt-dev] [UST PATCH] Rename libustcmd to libustctl

Mathieu Desnoyers compudj at krystal.dyndns.org
Sat Jan 29 02:27:56 EST 2011


(re-sending after fixing my mail server)

* Mathieu Desnoyers (compudj at krystal.dyndns.org) wrote:
> * Nils Carlson (nils.carlson at ericsson.com) wrote:
> > This patch renames libustcmd to libustctl mostly because libustctl
> > sounds much better but also to clarify the connection between ustctl
> > and libustctl.
> 
> Yep, sounds much nicer.
> 
> Thanks!
> 
> Acked-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> 
> > 
> > Signed-off-by: Nils Carlson <nils.carlson at ericsson.com>
> > ---
> >  Makefile.am                                        |    2 +-
> >  README                                             |    4 +-
> >  configure.ac                                       |    4 +-
> >  doc/info/ust.texi                                  |    2 +-
> >  include/Makefile.am                                |    2 +-
> >  include/ust/ustcmd.h                               |   76 ---
> >  include/ust/ustctl.h                               |   76 +++
> >  libustcmd/Makefile.am                              |   14 -
> >  libustcmd/README                                   |    2 -
> >  libustcmd/ustcmd.c                                 |  671 --------------------
> >  libustctl/Makefile.am                              |   14 +
> >  libustctl/README                                   |    2 +
> >  libustctl/libustctl.c                              |  671 ++++++++++++++++++++
> >  tests/Makefile.am                                  |    2 +-
> >  tests/libustctl_function_tests/Makefile.am         |   10 +
> >  .../libustctl_function_tests.c                     |  184 ++++++
> >  tests/runtests                                     |    2 +-
> >  tests/ustcmd_function_tests/Makefile.am            |   10 -
> >  .../ustcmd_function_tests/ustcmd_function_tests.c  |  184 ------
> >  ustctl/Makefile.am                                 |    4 +-
> >  ustctl/channel_cmds.c                              |   10 +-
> >  ustctl/marker_cmds.c                               |   10 +-
> >  ustctl/scanning_functions.c                        |    2 +-
> >  ustctl/trace_cmds.c                                |   14 +-
> >  ustctl/ustctl.c                                    |   10 +-
> >  25 files changed, 991 insertions(+), 991 deletions(-)
> >  delete mode 100644 include/ust/ustcmd.h
> >  create mode 100644 include/ust/ustctl.h
> >  delete mode 100644 libustcmd/Makefile.am
> >  delete mode 100644 libustcmd/README
> >  delete mode 100644 libustcmd/ustcmd.c
> >  create mode 100644 libustctl/Makefile.am
> >  create mode 100644 libustctl/README
> >  create mode 100644 libustctl/libustctl.c
> >  create mode 100644 tests/libustctl_function_tests/Makefile.am
> >  create mode 100644 tests/libustctl_function_tests/libustctl_function_tests.c
> >  delete mode 100644 tests/ustcmd_function_tests/Makefile.am
> >  delete mode 100644 tests/ustcmd_function_tests/ustcmd_function_tests.c
> > 
> > diff --git a/Makefile.am b/Makefile.am
> > index 249bf02..6957f07 100644
> > --- a/Makefile.am
> > +++ b/Makefile.am
> > @@ -5,7 +5,7 @@ ACLOCAL_AMFLAGS = -I config
> >  # libust and '.' (that contains the linker script). However, '.'
> >  # must be installed after libust so it can overwrite libust.so with
> >  # the linker script.
> > -SUBDIRS = snprintf libustcomm libustcmd libust . tests libustinstr-malloc libustconsumer ust-consumerd ustctl libustfork include doc
> > +SUBDIRS = snprintf libustcomm libustctl libust . tests libustinstr-malloc libustconsumer ust-consumerd ustctl libustfork include doc
> >  
> >  EXTRA_DIST = libust.ldscript.in libust-initializer.c libust-initializer.h
> >  dist_bin_SCRIPTS = usttrace
> > diff --git a/README b/README
> > index a381c95..b09a1ab 100644
> > --- a/README
> > +++ b/README
> > @@ -79,11 +79,11 @@ PACKAGE CONTENTS:
> >      calls in order to trace across these calls. It _has_ to be LD_PRELOAD'ed
> >      in order to hijack calls. In contrast, libust may be linked at build time.
> >  
> > -  - libustcmd
> > +  - libustctl
> >      A library to control tracing in other processes. Used by ustctl.
> >  
> >    - libustcomm
> > -    A static library shared between libust, ust-consumerd and libustcmd, that
> > +    A static library shared between libust, ust-consumerd and libustctl, that
> >      provides functions that allow these components to communicate together.
> >  
> >    - libustconsumer
> > diff --git a/configure.ac b/configure.ac
> > index c7d966b..2b2962a 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -130,14 +130,14 @@ AC_CONFIG_FILES([
> >  	tests/tracepoint/Makefile
> >  	tests/tracepoint/benchmark/Makefile
> >  	tests/register_test/Makefile
> > -	tests/ustcmd_function_tests/Makefile
> > +	tests/libustctl_function_tests/Makefile
> >  	libustinstr-malloc/Makefile
> >  	libustfork/Makefile
> >  	libustconsumer/Makefile
> >  	ust-consumerd/Makefile
> >  	ustctl/Makefile
> >  	libustcomm/Makefile
> > -	libustcmd/Makefile
> > +	libustctl/Makefile
> >  	snprintf/Makefile
> >  ])
> >  AC_OUTPUT
> > diff --git a/doc/info/ust.texi b/doc/info/ust.texi
> > index 73a8bcd..83c91e0 100644
> > --- a/doc/info/ust.texi
> > +++ b/doc/info/ust.texi
> > @@ -91,7 +91,7 @@ Components licensed as LGPL v2.1:
> >  Components licensed as GPL v2:
> >  @itemize @bullet
> >  @item ustctl
> > - at item libustcmd
> > + at item libustctl
> >  @item ust-consumerd
> >  @end itemize
> >  
> > diff --git a/include/Makefile.am b/include/Makefile.am
> > index 400e8b1..e703ffd 100644
> > --- a/include/Makefile.am
> > +++ b/include/Makefile.am
> > @@ -17,7 +17,7 @@ nobase_include_HEADERS = \
> >  	ust/kcompat/simple.h \
> >  	ust/kcompat/types.h \
> >  	ust/kcompat/stringify.h \
> > -	ust/ustcmd.h \
> > +	ust/ustctl.h \
> >  	ust/ustconsumer.h
> >  
> >  noinst_HEADERS = share.h usterr.h ust_snprintf.h
> > diff --git a/include/ust/ustcmd.h b/include/ust/ustcmd.h
> > deleted file mode 100644
> > index 6273575..0000000
> > --- a/include/ust/ustcmd.h
> > +++ /dev/null
> > @@ -1,76 +0,0 @@
> > -/* Copyright (C) 2009  Pierre-Marc Fournier
> > - *
> > - * This library is free software; you can redistribute it and/or
> > - * modify it under the terms of the GNU Lesser General Public
> > - * License as published by the Free Software Foundation; either
> > - * version 2.1 of the License, or (at your option) any later version.
> > - *
> > - * This library is distributed in the hope that it will be useful,
> > - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > - * Lesser General Public License for more details.
> > - *
> > - * You should have received a copy of the GNU Lesser General Public
> > - * License along with this library; if not, write to the Free Software
> > - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
> > - */
> > -
> > -#ifndef _USTCMD_H
> > -#define _USTCMD_H
> > -
> > -#include <stdio.h>
> > -#include <unistd.h>
> > -#include <getopt.h>
> > -#include <stdlib.h>
> > -#include <fcntl.h>
> > -
> > -#define USTCMD_ERR_CONN		1 /* Process connection error */
> > -#define USTCMD_ERR_ARG		2 /* Invalid function argument */
> > -#define USTCMD_ERR_GEN		3 /* General ustcmd error */
> > -
> > -#define USTCMD_MS_CHR_OFF	'0' /* Marker state 'on' character */
> > -#define USTCMD_MS_CHR_ON	'1' /* Marker state 'on' character */
> > -#define USTCMD_MS_OFF		0   /* Marker state 'on' value */
> > -#define USTCMD_MS_ON		1   /* Marker state 'on' value */
> > -
> > -#define USTCMD_SOCK_PATH	"/tmp/socks/"
> > -
> > -/* Channel/marker/state/format string (cmsf) info. structure */
> > -struct marker_status {
> > -	char *channel; /* Channel name (end of marker_status array if NULL) */
> > -	char *marker; /* Marker name (end of marker_status array if NULL) */
> > -	int state; /* State (0 := marker disabled, 1 := marker enabled) */
> > -	char *fs; /* Format string (end of marker_status array if NULL) */
> > -};
> > -
> > -struct trace_event_status {
> > -	char *name;
> > -};
> > -
> > -extern pid_t *ustcmd_get_online_pids(void);
> > -extern int ustcmd_set_marker_state(const char *trace, const char *channel,
> > -				   const char *marker, int state, pid_t pid);
> > -extern int ustcmd_set_subbuf_size(const char *trace, const char *channel,
> > -				  unsigned int subbuf_size, pid_t pid);
> > -extern int ustcmd_set_subbuf_num(const char *trace, const char *channel,
> > -				 unsigned int num, pid_t pid);
> > -extern int ustcmd_get_subbuf_size(const char *trace, const char *channel,
> > -				  pid_t pid);
> > -extern int ustcmd_get_subbuf_num(const char *trace, const char *channel,
> > -				 pid_t pid);
> > -extern int ustcmd_destroy_trace(const char *trace, pid_t pid);
> > -extern int ustcmd_setup_and_start(const char *trace, pid_t pid);
> > -extern int ustcmd_stop_trace(const char *trace, pid_t pid);
> > -extern int ustcmd_create_trace(const char *trace, pid_t pid);
> > -extern int ustcmd_start_trace(const char *trace, pid_t pid);
> > -extern int ustcmd_alloc_trace(const char *trace, pid_t pid);
> > -extern int ustcmd_free_cmsf(struct marker_status *);
> > -extern unsigned int ustcmd_count_nl(const char *);
> > -extern int ustcmd_get_cmsf(struct marker_status **, pid_t);
> > -extern int ustcmd_free_tes(struct trace_event_status *);
> > -extern int ustcmd_get_tes(struct trace_event_status **, pid_t);
> > -extern int ustcmd_set_sock_path(const char *sock_path, pid_t pid);
> > -extern int ustcmd_get_sock_path(char **sock_path, pid_t pid);
> > -extern int ustcmd_force_switch(pid_t pid);
> > -
> > -#endif /* _USTCMD_H */
> > diff --git a/include/ust/ustctl.h b/include/ust/ustctl.h
> > new file mode 100644
> > index 0000000..195ee26
> > --- /dev/null
> > +++ b/include/ust/ustctl.h
> > @@ -0,0 +1,76 @@
> > +/* Copyright (C) 2009  Pierre-Marc Fournier
> > + *
> > + * This library is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU Lesser General Public
> > + * License as published by the Free Software Foundation; either
> > + * version 2.1 of the License, or (at your option) any later version.
> > + *
> > + * This library is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > + * Lesser General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU Lesser General Public
> > + * License along with this library; if not, write to the Free Software
> > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
> > + */
> > +
> > +#ifndef _USTCTL_H
> > +#define _USTCTL_H
> > +
> > +#include <stdio.h>
> > +#include <unistd.h>
> > +#include <getopt.h>
> > +#include <stdlib.h>
> > +#include <fcntl.h>
> > +
> > +#define USTCTL_ERR_CONN		1 /* Process connection error */
> > +#define USTCTL_ERR_ARG		2 /* Invalid function argument */
> > +#define USTCTL_ERR_GEN		3 /* General ustctl error */
> > +
> > +#define USTCTL_MS_CHR_OFF	'0' /* Marker state 'on' character */
> > +#define USTCTL_MS_CHR_ON	'1' /* Marker state 'on' character */
> > +#define USTCTL_MS_OFF		0   /* Marker state 'on' value */
> > +#define USTCTL_MS_ON		1   /* Marker state 'on' value */
> > +
> > +#define USTCTL_SOCK_PATH	"/tmp/socks/"
> > +
> > +/* Channel/marker/state/format string (cmsf) info. structure */
> > +struct marker_status {
> > +	char *channel; /* Channel name (end of marker_status array if NULL) */
> > +	char *marker; /* Marker name (end of marker_status array if NULL) */
> > +	int state; /* State (0 := marker disabled, 1 := marker enabled) */
> > +	char *fs; /* Format string (end of marker_status array if NULL) */
> > +};
> > +
> > +struct trace_event_status {
> > +	char *name;
> > +};
> > +
> > +extern pid_t *ustctl_get_online_pids(void);
> > +extern int ustctl_set_marker_state(const char *trace, const char *channel,
> > +				   const char *marker, int state, pid_t pid);
> > +extern int ustctl_set_subbuf_size(const char *trace, const char *channel,
> > +				  unsigned int subbuf_size, pid_t pid);
> > +extern int ustctl_set_subbuf_num(const char *trace, const char *channel,
> > +				 unsigned int num, pid_t pid);
> > +extern int ustctl_get_subbuf_size(const char *trace, const char *channel,
> > +				  pid_t pid);
> > +extern int ustctl_get_subbuf_num(const char *trace, const char *channel,
> > +				 pid_t pid);
> > +extern int ustctl_destroy_trace(const char *trace, pid_t pid);
> > +extern int ustctl_setup_and_start(const char *trace, pid_t pid);
> > +extern int ustctl_stop_trace(const char *trace, pid_t pid);
> > +extern int ustctl_create_trace(const char *trace, pid_t pid);
> > +extern int ustctl_start_trace(const char *trace, pid_t pid);
> > +extern int ustctl_alloc_trace(const char *trace, pid_t pid);
> > +extern int ustctl_free_cmsf(struct marker_status *);
> > +extern unsigned int ustctl_count_nl(const char *);
> > +extern int ustctl_get_cmsf(struct marker_status **, pid_t);
> > +extern int ustctl_free_tes(struct trace_event_status *);
> > +extern int ustctl_get_tes(struct trace_event_status **, pid_t);
> > +extern int ustctl_set_sock_path(const char *sock_path, pid_t pid);
> > +extern int ustctl_get_sock_path(char **sock_path, pid_t pid);
> > +extern int ustctl_force_switch(pid_t pid);
> > +
> > +#endif /* _USTCTL_H */
> > diff --git a/libustcmd/Makefile.am b/libustcmd/Makefile.am
> > deleted file mode 100644
> > index f467244..0000000
> > --- a/libustcmd/Makefile.am
> > +++ /dev/null
> > @@ -1,14 +0,0 @@
> > -AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libustcomm
> > -AM_CFLAGS = -fno-strict-aliasing
> > -
> > -lib_LTLIBRARIES = libustcmd.la
> > -
> > -libustcmd_la_SOURCES = \
> > -	ustcmd.c
> > -
> > -libustcmd_la_LDFLAGS = -no-undefined -version-info 0:0:0
> > -
> > -libustcmd_la_LIBADD = \
> > -	$(top_builddir)/libustcomm/libustcomm.la
> > -
> > -libustcmd_la_CFLAGS = -DUST_COMPONENT="libustcmd" -fno-strict-aliasing
> > diff --git a/libustcmd/README b/libustcmd/README
> > deleted file mode 100644
> > index 8c2819a..0000000
> > --- a/libustcmd/README
> > +++ /dev/null
> > @@ -1,2 +0,0 @@
> > -libustcmd is a library that provides an API and its implementation to send
> > -commands to traceable processes.
> > diff --git a/libustcmd/ustcmd.c b/libustcmd/ustcmd.c
> > deleted file mode 100644
> > index 62c117f..0000000
> > --- a/libustcmd/ustcmd.c
> > +++ /dev/null
> > @@ -1,671 +0,0 @@
> > -/* Copyright (C) 2009  Pierre-Marc Fournier, Philippe Proulx-Barrette
> > - *
> > - * This library is free software; you can redistribute it and/or
> > - * modify it under the terms of the GNU Lesser General Public
> > - * License as published by the Free Software Foundation; either
> > - * version 2.1 of the License, or (at your option) any later version.
> > - *
> > - * This library is distributed in the hope that it will be useful,
> > - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > - * Lesser General Public License for more details.
> > - *
> > - * You should have received a copy of the GNU Lesser General Public
> > - * License along with this library; if not, write to the Free Software
> > - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
> > - */
> > -
> > -#define _GNU_SOURCE
> > -#include <stdio.h>
> > -#include <unistd.h>
> > -#include <getopt.h>
> > -#include <stdlib.h>
> > -#include <fcntl.h>
> > -#include <string.h>
> > -#include <dirent.h>
> > -
> > -#include "ustcomm.h"
> > -#include "ust/ustcmd.h"
> > -#include "usterr.h"
> > -
> > -static int do_cmd(const pid_t pid,
> > -		  const struct ustcomm_header *req_header,
> > -		  const char *req_data,
> > -		  struct ustcomm_header *res_header,
> > -		  char **res_data)
> > -{
> > -	int app_fd, result, saved_errno = 0;
> > -	char *recv_buf;
> > -
> > -	if (ustcomm_connect_app(pid, &app_fd)) {
> > -		ERR("could not connect to PID %u", (unsigned int) pid);
> > -		errno = ENOTCONN;
> > -		return -1;
> > -	}
> > -
> > -	recv_buf = zmalloc(USTCOMM_BUFFER_SIZE);
> > -	if (!recv_buf) {
> > -		saved_errno = ENOMEM;
> > -		goto close_app_fd;
> > -	}
> > -
> > -	result = ustcomm_req(app_fd, req_header, req_data, res_header, recv_buf);
> > -	if (result > 0) {
> > -		saved_errno = -res_header->result;
> > -		if (res_header->size == 0 || saved_errno > 0) {
> > -			free(recv_buf);
> > -		} else {
> > -			if (res_data) {
> > -				*res_data = recv_buf;
> > -			} else {
> > -				free(recv_buf);
> > -			}
> > -		}
> > -	} else {
> > -		ERR("ustcomm req failed");
> > -		if (result == 0) {
> > -			saved_errno = ENOTCONN;
> > -		} else {
> > -			saved_errno = -result;
> > -		}
> > -		free(recv_buf);
> > -	}
> > -
> > -close_app_fd:
> > -	close(app_fd);
> > -
> > -	errno = saved_errno;
> > -
> > -	if (errno) {
> > -		return -1;
> > -	}
> > -
> > -	return 0;
> > -}
> > -
> > -pid_t *ustcmd_get_online_pids(void)
> > -{
> > -	struct dirent *dirent;
> > -	DIR *dir;
> > -	unsigned int ret_size = 1 * sizeof(pid_t), i = 0;
> > -
> > -	dir = opendir(SOCK_DIR);
> > -	if (!dir) {
> > -		return NULL;
> > -	}
> > -
> > -	pid_t *ret = (pid_t *) malloc(ret_size);
> > -
> > -	while ((dirent = readdir(dir))) {
> > -		if (!strcmp(dirent->d_name, ".") ||
> > -		    !strcmp(dirent->d_name, "..")) {
> > -
> > -			continue;
> > -		}
> > -
> > -		if (dirent->d_type != DT_DIR &&
> > -		    !!strcmp(dirent->d_name, "ust-consumer")) {
> > -
> > -			sscanf(dirent->d_name, "%u", (unsigned int *) &ret[i]);
> > -			/* FIXME: Here we previously called pid_is_online, which
> > -			 * always returned 1, now I replaced it with just 1.
> > -			 * We need to figure out an intelligent way of solving
> > -			 * this, maybe connect-disconnect.
> > -			 */
> > -			if (1) {
> > -				ret_size += sizeof(pid_t);
> > -				ret = (pid_t *) realloc(ret, ret_size);
> > -				++i;
> > -			}
> > -		}
> > -	}
> > -
> > -	ret[i] = 0; /* Array end */
> > -
> > -	if (ret[0] == 0) {
> > -		/* No PID at all */
> > -		free(ret);
> > -		return NULL;
> > -	}
> > -
> > -	closedir(dir);
> > -	return ret;
> > -}
> > -
> > -/**
> > - * Sets marker state (USTCMD_MS_ON or USTCMD_MS_OFF).
> > - *
> > - * @param mn	Marker name
> > - * @param state	Marker's new state
> > - * @param pid	Traced process ID
> > - * @return	0 if successful, or errors {USTCMD_ERR_GEN, USTCMD_ERR_ARG}
> > - */
> > -int ustcmd_set_marker_state(const char *trace, const char *channel,
> > -			    const char *marker, int state, pid_t pid)
> > -{
> > -	struct ustcomm_header req_header, res_header;
> > -	struct ustcomm_marker_info marker_inf;
> > -	int result;
> > -
> > -	result = ustcomm_pack_marker_info(&req_header,
> > -					  &marker_inf,
> > -					  trace,
> > -					  channel,
> > -					  marker);
> > -	if (result < 0) {
> > -		errno = -result;
> > -		return -1;
> > -	}
> > -
> > -	req_header.command = state ? ENABLE_MARKER : DISABLE_MARKER;
> > -
> > -	return do_cmd(pid, &req_header, (char *)&marker_inf,
> > -		      &res_header, NULL);
> > -}
> > -
> > -/**
> > - * Set subbuffer size.
> > - *
> > - * @param channel_size	Channel name and size
> > - * @param pid		Traced process ID
> > - * @return		0 if successful, or error
> > - */
> > -int ustcmd_set_subbuf_size(const char *trace, const char *channel,
> > -			   unsigned int subbuf_size, pid_t pid)
> > -{
> > -	struct ustcomm_header req_header, res_header;
> > -	struct ustcomm_channel_info ch_inf;
> > -	int result;
> > -
> > -	result = ustcomm_pack_channel_info(&req_header,
> > -					   &ch_inf,
> > -					   trace,
> > -					   channel);
> > -	if (result < 0) {
> > -		errno = -result;
> > -		return -1;
> > -	}
> > -
> > -	req_header.command = SET_SUBBUF_SIZE;
> > -	ch_inf.subbuf_size = subbuf_size;
> > -
> > -	return do_cmd(pid, &req_header, (char *)&ch_inf,
> > -		      &res_header, NULL);
> > -}
> > -
> > -/**
> > - * Set subbuffer num.
> > - *
> > - * @param channel_num	Channel name and num
> > - * @param pid		Traced process ID
> > - * @return		0 if successful, or error
> > - */
> > -int ustcmd_set_subbuf_num(const char *trace, const char *channel,
> > -			  unsigned int num, pid_t pid)
> > -{
> > -	struct ustcomm_header req_header, res_header;
> > -	struct ustcomm_channel_info ch_inf;
> > -	int result;
> > -
> > -	result = ustcomm_pack_channel_info(&req_header,
> > -					   &ch_inf,
> > -					   trace,
> > -					   channel);
> > -	if (result < 0) {
> > -		errno = -result;
> > -		return -1;
> > -	}
> > -
> > -	req_header.command = SET_SUBBUF_NUM;
> > -	ch_inf.subbuf_num = num;
> > -
> > -	return do_cmd(pid, &req_header, (char *)&ch_inf,
> > -		      &res_header, NULL);
> > -
> > -}
> > -
> > -static int ustcmd_get_subbuf_num_size(const char *trace, const char *channel,
> > -				      pid_t pid, int *num, int *size)
> > -{
> > -	struct ustcomm_header req_header, res_header;
> > -	struct ustcomm_channel_info ch_inf, *ch_inf_res;
> > -	int result;
> > -
> > -
> > -	result = ustcomm_pack_channel_info(&req_header,
> > -					   &ch_inf,
> > -					   trace,
> > -					   channel);
> > -	if (result < 0) {
> > -		errno = -result;
> > -		return -1;
> > -	}
> > -
> > -	req_header.command = GET_SUBBUF_NUM_SIZE;
> > -
> > -	result = do_cmd(pid, &req_header, (char *)&ch_inf,
> > -			&res_header, (char **)&ch_inf_res);
> > -	if (result < 0) {
> > -		return -1;
> > -	}
> > -
> > -	*num = ch_inf_res->subbuf_num;
> > -	*size = ch_inf_res->subbuf_size;
> > -
> > -	free(ch_inf_res);
> > -
> > -	return 0;
> > -}
> > -
> > -/**
> > - * Get subbuffer num.
> > - *
> > - * @param channel	Channel name
> > - * @param pid		Traced process ID
> > - * @return		subbuf cnf if successful, or error
> > - */
> > -int ustcmd_get_subbuf_num(const char *trace, const char *channel, pid_t pid)
> > -{
> > -	int num, size, result;
> > -
> > -	result = ustcmd_get_subbuf_num_size(trace, channel, pid,
> > -					    &num, &size);
> > -	if (result < 0) {
> > -		errno = -result;
> > -		return -1;
> > -	}
> > -
> > -	return num;
> > -}
> > -
> > -/**
> > - * Get subbuffer size.
> > - *
> > - * @param channel	Channel name
> > - * @param pid		Traced process ID
> > - * @return		subbuf size if successful, or error
> > - */
> > -int ustcmd_get_subbuf_size(const char *trace, const char *channel, pid_t pid)
> > -{
> > -	int num, size, result;
> > -
> > -	result = ustcmd_get_subbuf_num_size(trace, channel, pid,
> > -					    &num, &size);
> > -	if (result < 0) {
> > -		errno = -result;
> > -		return -1;
> > -	}
> > -
> > -	return size;
> > -}
> > -
> > -
> > -static int do_trace_cmd(const char *trace, pid_t pid, int command)
> > -{
> > -	struct ustcomm_header req_header, res_header;
> > -	struct ustcomm_single_field trace_inf;
> > -	int result;
> > -
> > -	result = ustcomm_pack_single_field(&req_header,
> > -					   &trace_inf,
> > -					   trace);
> > -	if (result < 0) {
> > -		errno = -result;
> > -		return -1;
> > -	}
> > -
> > -	req_header.command = command;
> > -
> > -	return do_cmd(pid, &req_header, (char *)&trace_inf, &res_header, NULL);
> > -}
> > -
> > -/**
> > - * Destroys an UST trace according to a PID.
> > - *
> > - * @param pid	Traced process ID
> > - * @return	0 if successful, or error USTCMD_ERR_GEN
> > - */
> > -int ustcmd_destroy_trace(const char *trace, pid_t pid)
> > -{
> > -	return do_trace_cmd(trace, pid, DESTROY_TRACE);
> > -}
> > -
> > -/**
> > - * Starts an UST trace (and setups it) according to a PID.
> > - *
> > - * @param pid	Traced process ID
> > - * @return	0 if successful, or error USTCMD_ERR_GEN
> > - */
> > -int ustcmd_setup_and_start(const char *trace, pid_t pid)
> > -{
> > -	return do_trace_cmd(trace, pid, START);
> > -}
> > -
> > -/**
> > - * Creates an UST trace according to a PID.
> > - *
> > - * @param pid	Traced process ID
> > - * @return	0 if successful, or error USTCMD_ERR_GEN
> > - */
> > -int ustcmd_create_trace(const char *trace, pid_t pid)
> > -{
> > -	return do_trace_cmd(trace, pid, CREATE_TRACE);
> > -}
> > -
> > -/**
> > - * Starts an UST trace according to a PID.
> > - *
> > - * @param pid	Traced process ID
> > - * @return	0 if successful, or error USTCMD_ERR_GEN
> > - */
> > -int ustcmd_start_trace(const char *trace, pid_t pid)
> > -{
> > -	return do_trace_cmd(trace, pid, START_TRACE);
> > -}
> > -
> > -/**
> > - * Alloc an UST trace according to a PID.
> > - *
> > - * @param pid	Traced process ID
> > - * @return	0 if successful, or error USTCMD_ERR_GEN
> > - */
> > -int ustcmd_alloc_trace(const char *trace, pid_t pid)
> > -{
> > -	return do_trace_cmd(trace, pid, ALLOC_TRACE);
> > -}
> > -
> > -/**
> > - * Stops an UST trace according to a PID.
> > - *
> > - * @param pid	Traced process ID
> > - * @return	0 if successful, or error USTCMD_ERR_GEN
> > - */
> > -int ustcmd_stop_trace(const char *trace, pid_t pid)
> > -{
> > -	return do_trace_cmd(trace, pid, STOP_TRACE);
> > -}
> > -
> > -/**
> > - * Counts newlines ('\n') in a string.
> > - *
> > - * @param str	String to search in
> > - * @return	Total newlines count
> > - */
> > -unsigned int ustcmd_count_nl(const char *str)
> > -{
> > -	unsigned int i = 0, tot = 0;
> > -
> > -	while (str[i] != '\0') {
> > -		if (str[i] == '\n') {
> > -			++tot;
> > -		}
> > -		++i;
> > -	}
> > -
> > -	return tot;
> > -}
> > -
> > -/**
> > - * Frees a CMSF array.
> > - *
> > - * @param cmsf	CMSF array to free
> > - * @return	0 if successful, or error USTCMD_ERR_ARG
> > - */
> > -int ustcmd_free_cmsf(struct marker_status *cmsf)
> > -{
> > -	if (cmsf == NULL) {
> > -		return USTCMD_ERR_ARG;
> > -	}
> > -
> > -	unsigned int i = 0;
> > -	while (cmsf[i].channel != NULL) {
> > -		free(cmsf[i].channel);
> > -		free(cmsf[i].marker);
> > -		free(cmsf[i].fs);
> > -		++i;
> > -	}
> > -	free(cmsf);
> > -
> > -	return 0;
> > -}
> > -
> > -/**
> > - * Gets channel/marker/state/format string for a given PID.
> > - *
> > - * @param cmsf	Pointer to CMSF array to be filled (callee allocates, caller
> > - *		frees with `ustcmd_free_cmsf')
> > - * @param pid	Targeted PID
> > - * @return	0 if successful, or -1 on error
> > - */
> > -int ustcmd_get_cmsf(struct marker_status **cmsf, const pid_t pid)
> > -{
> > -	struct ustcomm_header req_header, res_header;
> > -	char *big_str = NULL;
> > -	int result, app_fd;
> > -	struct marker_status *tmp_cmsf = NULL;
> > -	unsigned int i = 0, cmsf_ind = 0;
> > -
> > -	if (cmsf == NULL) {
> > -		return -1;
> > -	}
> > -
> > -	if (ustcomm_connect_app(pid, &app_fd)) {
> > -		ERR("could not connect to PID %u", (unsigned int) pid);
> > -		return -1;
> > -	}
> > -
> > -	req_header.command = LIST_MARKERS;
> > -	req_header.size = 0;
> > -
> > -	result = ustcomm_send(app_fd, &req_header, NULL);
> > -	if (result <= 0) {
> > -		PERROR("error while requesting markers list for process %d", pid);
> > -		return -1;
> > -	}
> > -
> > -	result = ustcomm_recv_alloc(app_fd, &res_header, &big_str);
> > -	if (result <= 0) {
> > -		ERR("error while receiving markers list");
> > -		return -1;
> > -	}
> > -
> > -	close(app_fd);
> > -
> > -	tmp_cmsf = (struct marker_status *) zmalloc(sizeof(struct marker_status) *
> > -						    (ustcmd_count_nl(big_str) + 1));
> > -	if (tmp_cmsf == NULL) {
> > -		ERR("Failed to allocate CMSF array");
> > -		return -1;
> > -	}
> > -
> > -	/* Parse received reply string (format: "[chan]/[mark] [st] [fs]"): */
> > -	while (big_str[i] != '\0') {
> > -		char state;
> > -
> > -		sscanf(big_str + i, "marker: %a[^/]/%a[^ ] %c %a[^\n]",
> > -		       &tmp_cmsf[cmsf_ind].channel,
> > -		       &tmp_cmsf[cmsf_ind].marker,
> > -		       &state,
> > -		       &tmp_cmsf[cmsf_ind].fs);
> > -		tmp_cmsf[cmsf_ind].state = (state == USTCMD_MS_CHR_ON ?
> > -					    USTCMD_MS_ON : USTCMD_MS_OFF); /* Marker state */
> > -
> > -		while (big_str[i] != '\n') {
> > -			++i; /* Go to next '\n' */
> > -		}
> > -		++i; /* Skip current pointed '\n' */
> > -		++cmsf_ind;
> > -	}
> > -	tmp_cmsf[cmsf_ind].channel = NULL;
> > -	tmp_cmsf[cmsf_ind].marker = NULL;
> > -	tmp_cmsf[cmsf_ind].fs = NULL;
> > -
> > -	*cmsf = tmp_cmsf;
> > -
> > -	free(big_str);
> > -	return 0;
> > -}
> > -
> > -
> > -/**
> > - * Frees a TES array.
> > - *
> > - * @param tes	TES array to free
> > - * @return	0 if successful, or error USTCMD_ERR_ARG
> > - */
> > -int ustcmd_free_tes(struct trace_event_status *tes)
> > -{
> > -	if (tes == NULL) {
> > -		return USTCMD_ERR_ARG;
> > -	}
> > -
> > -	unsigned int i = 0;
> > -	while (tes[i].name != NULL) {
> > -		free(tes[i].name);
> > -		++i;
> > -	}
> > -	free(tes);
> > -
> > -	return 0;
> > -}
> > -
> > -/**
> > - * Gets trace_events string for a given PID.
> > - *
> > - * @param tes	Pointer to TES array to be filled (callee allocates, caller
> > - *		frees with `ustcmd_free_tes')
> > - * @param pid	Targeted PID
> > - * @return	0 if successful, or -1 on error
> > - */
> > -int ustcmd_get_tes(struct trace_event_status **tes,
> > -		   const pid_t pid)
> > -{
> > -	struct ustcomm_header req_header, res_header;
> > -	char *big_str = NULL;
> > -	int result, app_fd;
> > -	struct trace_event_status *tmp_tes = NULL;
> > -	unsigned int i = 0, tes_ind = 0;
> > -
> > -	if (tes == NULL) {
> > -		return -1;
> > -	}
> > -
> > -	if (ustcomm_connect_app(pid, &app_fd)) {
> > -		ERR("could not connect to PID %u", (unsigned int) pid);
> > -		return -1;
> > -	}
> > -
> > -	req_header.command = LIST_TRACE_EVENTS;
> > -	req_header.size = 0;
> > -
> > -	result = ustcomm_send(app_fd, &req_header, NULL);
> > -	if (result != 1) {
> > -		ERR("error while requesting trace_event list");
> > -		return -1;
> > -	}
> > -
> > -	result = ustcomm_recv_alloc(app_fd, &res_header, &big_str);
> > -	if (result != 1) {
> > -		ERR("error while receiving markers list");
> > -		return -1;
> > -	}
> > -
> > -	close(app_fd);
> > -
> > -	tmp_tes = (struct trace_event_status *)
> > -		zmalloc(sizeof(struct trace_event_status) *
> > -			(ustcmd_count_nl(big_str) + 1));
> > -	if (tmp_tes == NULL) {
> > -		ERR("Failed to allocate TES array");
> > -		return -1;
> > -	}
> > -
> > -	/* Parse received reply string (format: "[name]"): */
> > -	while (big_str[i] != '\0') {
> > -		sscanf(big_str + i, "trace_event: %a[^\n]",
> > -		       &tmp_tes[tes_ind].name);
> > -		while (big_str[i] != '\n') {
> > -			++i; /* Go to next '\n' */
> > -		}
> > -		++i; /* Skip current pointed '\n' */
> > -		++tes_ind;
> > -	}
> > -	tmp_tes[tes_ind].name = NULL;
> > -
> > -	*tes = tmp_tes;
> > -
> > -	free(big_str);
> > -	return 0;
> > -}
> > -
> > -/**
> > - * Set socket path
> > - *
> > - * @param sock_path	Socket path
> > - * @param pid		Traced process ID
> > - * @return		0 if successful, or error
> > - */
> > -int ustcmd_set_sock_path(const char *sock_path, pid_t pid)
> > -{
> > -	int result;
> > -	struct ustcomm_header req_header, res_header;
> > -	struct ustcomm_single_field sock_path_msg;
> > -
> > -	result = ustcomm_pack_single_field(&req_header,
> > -					   &sock_path_msg,
> > -					   sock_path);
> > -	if (result < 0) {
> > -		errno = -result;
> > -		return -1;
> > -	}
> > -
> > -	req_header.command = SET_SOCK_PATH;
> > -
> > -	return do_cmd(pid, &req_header, (char *)&sock_path_msg,
> > -		      &res_header, NULL);
> > -}
> > -
> > -/**
> > - * Get socket path
> > - *
> > - * @param sock_path	Pointer to where the socket path will be returned
> > - * @param pid		Traced process ID
> > - * @return		0 if successful, or error
> > - */
> > -int ustcmd_get_sock_path(char **sock_path, pid_t pid)
> > -{
> > -	int result;
> > -	struct ustcomm_header req_header, res_header;
> > -	struct ustcomm_single_field *sock_path_msg;
> > -
> > -	req_header.command = GET_SOCK_PATH;
> > -	req_header.size = 0;
> > -
> > -	result = do_cmd(pid, &req_header, NULL, &res_header,
> > -			(char **)&sock_path_msg);
> > -	if (result < 0) {
> > -		return -1;
> > -	}
> > -
> > -	result = ustcomm_unpack_single_field(sock_path_msg);
> > -	if (result < 0) {
> > -		return result;
> > -	}
> > -
> > -	*sock_path = strdup(sock_path_msg->field);
> > -
> > -	free(sock_path_msg);
> > -
> > -	return 0;
> > -}
> > -
> > -int ustcmd_force_switch(pid_t pid)
> > -{
> > -	struct ustcomm_header req_header, res_header;
> > -
> > -	req_header.command = FORCE_SUBBUF_SWITCH;
> > -	req_header.size = 0;
> > -
> > -	return do_cmd(pid, &req_header, NULL, &res_header, NULL);
> > -}
> > -
> > diff --git a/libustctl/Makefile.am b/libustctl/Makefile.am
> > new file mode 100644
> > index 0000000..bc7526b
> > --- /dev/null
> > +++ b/libustctl/Makefile.am
> > @@ -0,0 +1,14 @@
> > +AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libustcomm
> > +AM_CFLAGS = -fno-strict-aliasing
> > +
> > +lib_LTLIBRARIES = libustctl.la
> > +
> > +libustctl_la_SOURCES = \
> > +	libustctl.c
> > +
> > +libustctl_la_LDFLAGS = -no-undefined -version-info 0:0:0
> > +
> > +libustctl_la_LIBADD = \
> > +	$(top_builddir)/libustcomm/libustcomm.la
> > +
> > +libustctl_la_CFLAGS = -DUST_COMPONENT="libustctl" -fno-strict-aliasing
> > diff --git a/libustctl/README b/libustctl/README
> > new file mode 100644
> > index 0000000..fd4cc97
> > --- /dev/null
> > +++ b/libustctl/README
> > @@ -0,0 +1,2 @@
> > +libustctl is a library that provides an API and its implementation to send
> > +commands to traceable processes.
> > diff --git a/libustctl/libustctl.c b/libustctl/libustctl.c
> > new file mode 100644
> > index 0000000..9c4ced2
> > --- /dev/null
> > +++ b/libustctl/libustctl.c
> > @@ -0,0 +1,671 @@
> > +/* Copyright (C) 2009  Pierre-Marc Fournier, Philippe Proulx-Barrette
> > + *
> > + * This library is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU Lesser General Public
> > + * License as published by the Free Software Foundation; either
> > + * version 2.1 of the License, or (at your option) any later version.
> > + *
> > + * This library is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > + * Lesser General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU Lesser General Public
> > + * License along with this library; if not, write to the Free Software
> > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
> > + */
> > +
> > +#define _GNU_SOURCE
> > +#include <stdio.h>
> > +#include <unistd.h>
> > +#include <getopt.h>
> > +#include <stdlib.h>
> > +#include <fcntl.h>
> > +#include <string.h>
> > +#include <dirent.h>
> > +
> > +#include "ustcomm.h"
> > +#include "ust/ustctl.h"
> > +#include "usterr.h"
> > +
> > +static int do_cmd(const pid_t pid,
> > +		  const struct ustcomm_header *req_header,
> > +		  const char *req_data,
> > +		  struct ustcomm_header *res_header,
> > +		  char **res_data)
> > +{
> > +	int app_fd, result, saved_errno = 0;
> > +	char *recv_buf;
> > +
> > +	if (ustcomm_connect_app(pid, &app_fd)) {
> > +		ERR("could not connect to PID %u", (unsigned int) pid);
> > +		errno = ENOTCONN;
> > +		return -1;
> > +	}
> > +
> > +	recv_buf = zmalloc(USTCOMM_BUFFER_SIZE);
> > +	if (!recv_buf) {
> > +		saved_errno = ENOMEM;
> > +		goto close_app_fd;
> > +	}
> > +
> > +	result = ustcomm_req(app_fd, req_header, req_data, res_header, recv_buf);
> > +	if (result > 0) {
> > +		saved_errno = -res_header->result;
> > +		if (res_header->size == 0 || saved_errno > 0) {
> > +			free(recv_buf);
> > +		} else {
> > +			if (res_data) {
> > +				*res_data = recv_buf;
> > +			} else {
> > +				free(recv_buf);
> > +			}
> > +		}
> > +	} else {
> > +		ERR("ustcomm req failed");
> > +		if (result == 0) {
> > +			saved_errno = ENOTCONN;
> > +		} else {
> > +			saved_errno = -result;
> > +		}
> > +		free(recv_buf);
> > +	}
> > +
> > +close_app_fd:
> > +	close(app_fd);
> > +
> > +	errno = saved_errno;
> > +
> > +	if (errno) {
> > +		return -1;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +pid_t *ustctl_get_online_pids(void)
> > +{
> > +	struct dirent *dirent;
> > +	DIR *dir;
> > +	unsigned int ret_size = 1 * sizeof(pid_t), i = 0;
> > +
> > +	dir = opendir(SOCK_DIR);
> > +	if (!dir) {
> > +		return NULL;
> > +	}
> > +
> > +	pid_t *ret = (pid_t *) malloc(ret_size);
> > +
> > +	while ((dirent = readdir(dir))) {
> > +		if (!strcmp(dirent->d_name, ".") ||
> > +		    !strcmp(dirent->d_name, "..")) {
> > +
> > +			continue;
> > +		}
> > +
> > +		if (dirent->d_type != DT_DIR &&
> > +		    !!strcmp(dirent->d_name, "ust-consumer")) {
> > +
> > +			sscanf(dirent->d_name, "%u", (unsigned int *) &ret[i]);
> > +			/* FIXME: Here we previously called pid_is_online, which
> > +			 * always returned 1, now I replaced it with just 1.
> > +			 * We need to figure out an intelligent way of solving
> > +			 * this, maybe connect-disconnect.
> > +			 */
> > +			if (1) {
> > +				ret_size += sizeof(pid_t);
> > +				ret = (pid_t *) realloc(ret, ret_size);
> > +				++i;
> > +			}
> > +		}
> > +	}
> > +
> > +	ret[i] = 0; /* Array end */
> > +
> > +	if (ret[0] == 0) {
> > +		/* No PID at all */
> > +		free(ret);
> > +		return NULL;
> > +	}
> > +
> > +	closedir(dir);
> > +	return ret;
> > +}
> > +
> > +/**
> > + * Sets marker state (USTCTL_MS_ON or USTCTL_MS_OFF).
> > + *
> > + * @param mn	Marker name
> > + * @param state	Marker's new state
> > + * @param pid	Traced process ID
> > + * @return	0 if successful, or errors {USTCTL_ERR_GEN, USTCTL_ERR_ARG}
> > + */
> > +int ustctl_set_marker_state(const char *trace, const char *channel,
> > +			    const char *marker, int state, pid_t pid)
> > +{
> > +	struct ustcomm_header req_header, res_header;
> > +	struct ustcomm_marker_info marker_inf;
> > +	int result;
> > +
> > +	result = ustcomm_pack_marker_info(&req_header,
> > +					  &marker_inf,
> > +					  trace,
> > +					  channel,
> > +					  marker);
> > +	if (result < 0) {
> > +		errno = -result;
> > +		return -1;
> > +	}
> > +
> > +	req_header.command = state ? ENABLE_MARKER : DISABLE_MARKER;
> > +
> > +	return do_cmd(pid, &req_header, (char *)&marker_inf,
> > +		      &res_header, NULL);
> > +}
> > +
> > +/**
> > + * Set subbuffer size.
> > + *
> > + * @param channel_size	Channel name and size
> > + * @param pid		Traced process ID
> > + * @return		0 if successful, or error
> > + */
> > +int ustctl_set_subbuf_size(const char *trace, const char *channel,
> > +			   unsigned int subbuf_size, pid_t pid)
> > +{
> > +	struct ustcomm_header req_header, res_header;
> > +	struct ustcomm_channel_info ch_inf;
> > +	int result;
> > +
> > +	result = ustcomm_pack_channel_info(&req_header,
> > +					   &ch_inf,
> > +					   trace,
> > +					   channel);
> > +	if (result < 0) {
> > +		errno = -result;
> > +		return -1;
> > +	}
> > +
> > +	req_header.command = SET_SUBBUF_SIZE;
> > +	ch_inf.subbuf_size = subbuf_size;
> > +
> > +	return do_cmd(pid, &req_header, (char *)&ch_inf,
> > +		      &res_header, NULL);
> > +}
> > +
> > +/**
> > + * Set subbuffer num.
> > + *
> > + * @param channel_num	Channel name and num
> > + * @param pid		Traced process ID
> > + * @return		0 if successful, or error
> > + */
> > +int ustctl_set_subbuf_num(const char *trace, const char *channel,
> > +			  unsigned int num, pid_t pid)
> > +{
> > +	struct ustcomm_header req_header, res_header;
> > +	struct ustcomm_channel_info ch_inf;
> > +	int result;
> > +
> > +	result = ustcomm_pack_channel_info(&req_header,
> > +					   &ch_inf,
> > +					   trace,
> > +					   channel);
> > +	if (result < 0) {
> > +		errno = -result;
> > +		return -1;
> > +	}
> > +
> > +	req_header.command = SET_SUBBUF_NUM;
> > +	ch_inf.subbuf_num = num;
> > +
> > +	return do_cmd(pid, &req_header, (char *)&ch_inf,
> > +		      &res_header, NULL);
> > +
> > +}
> > +
> > +static int ustctl_get_subbuf_num_size(const char *trace, const char *channel,
> > +				      pid_t pid, int *num, int *size)
> > +{
> > +	struct ustcomm_header req_header, res_header;
> > +	struct ustcomm_channel_info ch_inf, *ch_inf_res;
> > +	int result;
> > +
> > +
> > +	result = ustcomm_pack_channel_info(&req_header,
> > +					   &ch_inf,
> > +					   trace,
> > +					   channel);
> > +	if (result < 0) {
> > +		errno = -result;
> > +		return -1;
> > +	}
> > +
> > +	req_header.command = GET_SUBBUF_NUM_SIZE;
> > +
> > +	result = do_cmd(pid, &req_header, (char *)&ch_inf,
> > +			&res_header, (char **)&ch_inf_res);
> > +	if (result < 0) {
> > +		return -1;
> > +	}
> > +
> > +	*num = ch_inf_res->subbuf_num;
> > +	*size = ch_inf_res->subbuf_size;
> > +
> > +	free(ch_inf_res);
> > +
> > +	return 0;
> > +}
> > +
> > +/**
> > + * Get subbuffer num.
> > + *
> > + * @param channel	Channel name
> > + * @param pid		Traced process ID
> > + * @return		subbuf cnf if successful, or error
> > + */
> > +int ustctl_get_subbuf_num(const char *trace, const char *channel, pid_t pid)
> > +{
> > +	int num, size, result;
> > +
> > +	result = ustctl_get_subbuf_num_size(trace, channel, pid,
> > +					    &num, &size);
> > +	if (result < 0) {
> > +		errno = -result;
> > +		return -1;
> > +	}
> > +
> > +	return num;
> > +}
> > +
> > +/**
> > + * Get subbuffer size.
> > + *
> > + * @param channel	Channel name
> > + * @param pid		Traced process ID
> > + * @return		subbuf size if successful, or error
> > + */
> > +int ustctl_get_subbuf_size(const char *trace, const char *channel, pid_t pid)
> > +{
> > +	int num, size, result;
> > +
> > +	result = ustctl_get_subbuf_num_size(trace, channel, pid,
> > +					    &num, &size);
> > +	if (result < 0) {
> > +		errno = -result;
> > +		return -1;
> > +	}
> > +
> > +	return size;
> > +}
> > +
> > +
> > +static int do_trace_cmd(const char *trace, pid_t pid, int command)
> > +{
> > +	struct ustcomm_header req_header, res_header;
> > +	struct ustcomm_single_field trace_inf;
> > +	int result;
> > +
> > +	result = ustcomm_pack_single_field(&req_header,
> > +					   &trace_inf,
> > +					   trace);
> > +	if (result < 0) {
> > +		errno = -result;
> > +		return -1;
> > +	}
> > +
> > +	req_header.command = command;
> > +
> > +	return do_cmd(pid, &req_header, (char *)&trace_inf, &res_header, NULL);
> > +}
> > +
> > +/**
> > + * Destroys an UST trace according to a PID.
> > + *
> > + * @param pid	Traced process ID
> > + * @return	0 if successful, or error USTCTL_ERR_GEN
> > + */
> > +int ustctl_destroy_trace(const char *trace, pid_t pid)
> > +{
> > +	return do_trace_cmd(trace, pid, DESTROY_TRACE);
> > +}
> > +
> > +/**
> > + * Starts an UST trace (and setups it) according to a PID.
> > + *
> > + * @param pid	Traced process ID
> > + * @return	0 if successful, or error USTCTL_ERR_GEN
> > + */
> > +int ustctl_setup_and_start(const char *trace, pid_t pid)
> > +{
> > +	return do_trace_cmd(trace, pid, START);
> > +}
> > +
> > +/**
> > + * Creates an UST trace according to a PID.
> > + *
> > + * @param pid	Traced process ID
> > + * @return	0 if successful, or error USTCTL_ERR_GEN
> > + */
> > +int ustctl_create_trace(const char *trace, pid_t pid)
> > +{
> > +	return do_trace_cmd(trace, pid, CREATE_TRACE);
> > +}
> > +
> > +/**
> > + * Starts an UST trace according to a PID.
> > + *
> > + * @param pid	Traced process ID
> > + * @return	0 if successful, or error USTCTL_ERR_GEN
> > + */
> > +int ustctl_start_trace(const char *trace, pid_t pid)
> > +{
> > +	return do_trace_cmd(trace, pid, START_TRACE);
> > +}
> > +
> > +/**
> > + * Alloc an UST trace according to a PID.
> > + *
> > + * @param pid	Traced process ID
> > + * @return	0 if successful, or error USTCTL_ERR_GEN
> > + */
> > +int ustctl_alloc_trace(const char *trace, pid_t pid)
> > +{
> > +	return do_trace_cmd(trace, pid, ALLOC_TRACE);
> > +}
> > +
> > +/**
> > + * Stops an UST trace according to a PID.
> > + *
> > + * @param pid	Traced process ID
> > + * @return	0 if successful, or error USTCTL_ERR_GEN
> > + */
> > +int ustctl_stop_trace(const char *trace, pid_t pid)
> > +{
> > +	return do_trace_cmd(trace, pid, STOP_TRACE);
> > +}
> > +
> > +/**
> > + * Counts newlines ('\n') in a string.
> > + *
> > + * @param str	String to search in
> > + * @return	Total newlines count
> > + */
> > +unsigned int ustctl_count_nl(const char *str)
> > +{
> > +	unsigned int i = 0, tot = 0;
> > +
> > +	while (str[i] != '\0') {
> > +		if (str[i] == '\n') {
> > +			++tot;
> > +		}
> > +		++i;
> > +	}
> > +
> > +	return tot;
> > +}
> > +
> > +/**
> > + * Frees a CMSF array.
> > + *
> > + * @param cmsf	CMSF array to free
> > + * @return	0 if successful, or error USTCTL_ERR_ARG
> > + */
> > +int ustctl_free_cmsf(struct marker_status *cmsf)
> > +{
> > +	if (cmsf == NULL) {
> > +		return USTCTL_ERR_ARG;
> > +	}
> > +
> > +	unsigned int i = 0;
> > +	while (cmsf[i].channel != NULL) {
> > +		free(cmsf[i].channel);
> > +		free(cmsf[i].marker);
> > +		free(cmsf[i].fs);
> > +		++i;
> > +	}
> > +	free(cmsf);
> > +
> > +	return 0;
> > +}
> > +
> > +/**
> > + * Gets channel/marker/state/format string for a given PID.
> > + *
> > + * @param cmsf	Pointer to CMSF array to be filled (callee allocates, caller
> > + *		frees with `ustctl_free_cmsf')
> > + * @param pid	Targeted PID
> > + * @return	0 if successful, or -1 on error
> > + */
> > +int ustctl_get_cmsf(struct marker_status **cmsf, const pid_t pid)
> > +{
> > +	struct ustcomm_header req_header, res_header;
> > +	char *big_str = NULL;
> > +	int result, app_fd;
> > +	struct marker_status *tmp_cmsf = NULL;
> > +	unsigned int i = 0, cmsf_ind = 0;
> > +
> > +	if (cmsf == NULL) {
> > +		return -1;
> > +	}
> > +
> > +	if (ustcomm_connect_app(pid, &app_fd)) {
> > +		ERR("could not connect to PID %u", (unsigned int) pid);
> > +		return -1;
> > +	}
> > +
> > +	req_header.command = LIST_MARKERS;
> > +	req_header.size = 0;
> > +
> > +	result = ustcomm_send(app_fd, &req_header, NULL);
> > +	if (result <= 0) {
> > +		PERROR("error while requesting markers list for process %d", pid);
> > +		return -1;
> > +	}
> > +
> > +	result = ustcomm_recv_alloc(app_fd, &res_header, &big_str);
> > +	if (result <= 0) {
> > +		ERR("error while receiving markers list");
> > +		return -1;
> > +	}
> > +
> > +	close(app_fd);
> > +
> > +	tmp_cmsf = (struct marker_status *) zmalloc(sizeof(struct marker_status) *
> > +						    (ustctl_count_nl(big_str) + 1));
> > +	if (tmp_cmsf == NULL) {
> > +		ERR("Failed to allocate CMSF array");
> > +		return -1;
> > +	}
> > +
> > +	/* Parse received reply string (format: "[chan]/[mark] [st] [fs]"): */
> > +	while (big_str[i] != '\0') {
> > +		char state;
> > +
> > +		sscanf(big_str + i, "marker: %a[^/]/%a[^ ] %c %a[^\n]",
> > +		       &tmp_cmsf[cmsf_ind].channel,
> > +		       &tmp_cmsf[cmsf_ind].marker,
> > +		       &state,
> > +		       &tmp_cmsf[cmsf_ind].fs);
> > +		tmp_cmsf[cmsf_ind].state = (state == USTCTL_MS_CHR_ON ?
> > +					    USTCTL_MS_ON : USTCTL_MS_OFF); /* Marker state */
> > +
> > +		while (big_str[i] != '\n') {
> > +			++i; /* Go to next '\n' */
> > +		}
> > +		++i; /* Skip current pointed '\n' */
> > +		++cmsf_ind;
> > +	}
> > +	tmp_cmsf[cmsf_ind].channel = NULL;
> > +	tmp_cmsf[cmsf_ind].marker = NULL;
> > +	tmp_cmsf[cmsf_ind].fs = NULL;
> > +
> > +	*cmsf = tmp_cmsf;
> > +
> > +	free(big_str);
> > +	return 0;
> > +}
> > +
> > +
> > +/**
> > + * Frees a TES array.
> > + *
> > + * @param tes	TES array to free
> > + * @return	0 if successful, or error USTCTL_ERR_ARG
> > + */
> > +int ustctl_free_tes(struct trace_event_status *tes)
> > +{
> > +	if (tes == NULL) {
> > +		return USTCTL_ERR_ARG;
> > +	}
> > +
> > +	unsigned int i = 0;
> > +	while (tes[i].name != NULL) {
> > +		free(tes[i].name);
> > +		++i;
> > +	}
> > +	free(tes);
> > +
> > +	return 0;
> > +}
> > +
> > +/**
> > + * Gets trace_events string for a given PID.
> > + *
> > + * @param tes	Pointer to TES array to be filled (callee allocates, caller
> > + *		frees with `ustctl_free_tes')
> > + * @param pid	Targeted PID
> > + * @return	0 if successful, or -1 on error
> > + */
> > +int ustctl_get_tes(struct trace_event_status **tes,
> > +		   const pid_t pid)
> > +{
> > +	struct ustcomm_header req_header, res_header;
> > +	char *big_str = NULL;
> > +	int result, app_fd;
> > +	struct trace_event_status *tmp_tes = NULL;
> > +	unsigned int i = 0, tes_ind = 0;
> > +
> > +	if (tes == NULL) {
> > +		return -1;
> > +	}
> > +
> > +	if (ustcomm_connect_app(pid, &app_fd)) {
> > +		ERR("could not connect to PID %u", (unsigned int) pid);
> > +		return -1;
> > +	}
> > +
> > +	req_header.command = LIST_TRACE_EVENTS;
> > +	req_header.size = 0;
> > +
> > +	result = ustcomm_send(app_fd, &req_header, NULL);
> > +	if (result != 1) {
> > +		ERR("error while requesting trace_event list");
> > +		return -1;
> > +	}
> > +
> > +	result = ustcomm_recv_alloc(app_fd, &res_header, &big_str);
> > +	if (result != 1) {
> > +		ERR("error while receiving markers list");
> > +		return -1;
> > +	}
> > +
> > +	close(app_fd);
> > +
> > +	tmp_tes = (struct trace_event_status *)
> > +		zmalloc(sizeof(struct trace_event_status) *
> > +			(ustctl_count_nl(big_str) + 1));
> > +	if (tmp_tes == NULL) {
> > +		ERR("Failed to allocate TES array");
> > +		return -1;
> > +	}
> > +
> > +	/* Parse received reply string (format: "[name]"): */
> > +	while (big_str[i] != '\0') {
> > +		sscanf(big_str + i, "trace_event: %a[^\n]",
> > +		       &tmp_tes[tes_ind].name);
> > +		while (big_str[i] != '\n') {
> > +			++i; /* Go to next '\n' */
> > +		}
> > +		++i; /* Skip current pointed '\n' */
> > +		++tes_ind;
> > +	}
> > +	tmp_tes[tes_ind].name = NULL;
> > +
> > +	*tes = tmp_tes;
> > +
> > +	free(big_str);
> > +	return 0;
> > +}
> > +
> > +/**
> > + * Set socket path
> > + *
> > + * @param sock_path	Socket path
> > + * @param pid		Traced process ID
> > + * @return		0 if successful, or error
> > + */
> > +int ustctl_set_sock_path(const char *sock_path, pid_t pid)
> > +{
> > +	int result;
> > +	struct ustcomm_header req_header, res_header;
> > +	struct ustcomm_single_field sock_path_msg;
> > +
> > +	result = ustcomm_pack_single_field(&req_header,
> > +					   &sock_path_msg,
> > +					   sock_path);
> > +	if (result < 0) {
> > +		errno = -result;
> > +		return -1;
> > +	}
> > +
> > +	req_header.command = SET_SOCK_PATH;
> > +
> > +	return do_cmd(pid, &req_header, (char *)&sock_path_msg,
> > +		      &res_header, NULL);
> > +}
> > +
> > +/**
> > + * Get socket path
> > + *
> > + * @param sock_path	Pointer to where the socket path will be returned
> > + * @param pid		Traced process ID
> > + * @return		0 if successful, or error
> > + */
> > +int ustctl_get_sock_path(char **sock_path, pid_t pid)
> > +{
> > +	int result;
> > +	struct ustcomm_header req_header, res_header;
> > +	struct ustcomm_single_field *sock_path_msg;
> > +
> > +	req_header.command = GET_SOCK_PATH;
> > +	req_header.size = 0;
> > +
> > +	result = do_cmd(pid, &req_header, NULL, &res_header,
> > +			(char **)&sock_path_msg);
> > +	if (result < 0) {
> > +		return -1;
> > +	}
> > +
> > +	result = ustcomm_unpack_single_field(sock_path_msg);
> > +	if (result < 0) {
> > +		return result;
> > +	}
> > +
> > +	*sock_path = strdup(sock_path_msg->field);
> > +
> > +	free(sock_path_msg);
> > +
> > +	return 0;
> > +}
> > +
> > +int ustctl_force_switch(pid_t pid)
> > +{
> > +	struct ustcomm_header req_header, res_header;
> > +
> > +	req_header.command = FORCE_SUBBUF_SWITCH;
> > +	req_header.size = 0;
> > +
> > +	return do_cmd(pid, &req_header, NULL, &res_header, NULL);
> > +}
> > +
> > diff --git a/tests/Makefile.am b/tests/Makefile.am
> > index 526f81c..e4e06ce 100644
> > --- a/tests/Makefile.am
> > +++ b/tests/Makefile.am
> > @@ -1,4 +1,4 @@
> > -SUBDIRS = . hello hello2 basic basic_long fork simple_include snprintf test-nevents test-libustinstr-malloc dlopen same_line_marker trace_event register_test tracepoint ustcmd_function_tests
> > +SUBDIRS = . hello hello2 basic basic_long fork simple_include snprintf test-nevents test-libustinstr-malloc dlopen same_line_marker trace_event register_test tracepoint libustctl_function_tests
> >  
> >  dist_noinst_SCRIPTS = test_loop runtests trace_matches
> >  
> > diff --git a/tests/libustctl_function_tests/Makefile.am b/tests/libustctl_function_tests/Makefile.am
> > new file mode 100644
> > index 0000000..723b456
> > --- /dev/null
> > +++ b/tests/libustctl_function_tests/Makefile.am
> > @@ -0,0 +1,10 @@
> > +AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/tests/
> > +
> > +noinst_PROGRAMS = libustctl_function_tests
> > +libustctl_function_tests_SOURCES = libustctl_function_tests.c
> > +libustctl_function_tests_LDADD = $(top_builddir)/libust/libust.la \
> > +	$(top_builddir)/libustctl/libustctl.la \
> > +	$(top_builddir)/libust-initializer.o \
> > +	$(top_builddir)/tests/libtap.la \
> > +	-lpthread
> > +
> > diff --git a/tests/libustctl_function_tests/libustctl_function_tests.c b/tests/libustctl_function_tests/libustctl_function_tests.c
> > new file mode 100644
> > index 0000000..784ff5d
> > --- /dev/null
> > +++ b/tests/libustctl_function_tests/libustctl_function_tests.c
> > @@ -0,0 +1,184 @@
> > +/* Copyright (C) 2010 Nils Carlson
> > + *
> > + * This library is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU Lesser General Public
> > + * License as published by the Free Software Foundation; either
> > + * version 2.1 of the License, or (at your option) any later version.
> > + *
> > + * This library is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > + * Lesser General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU Lesser General Public
> > + * License along with this library; if not, write to the Free Software
> > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
> > + */
> > +
> > +/* Simple function tests for ustctl */
> > +
> > +#include <stdio.h>
> > +#include <unistd.h>
> > +#include <sys/types.h>
> > +
> > +#include <ust/marker.h>
> > +#include <ust/ustctl.h>
> > +
> > +#include "tap.h"
> > +
> > +static void ustctl_function_tests(pid_t pid)
> > +{
> > +	int result;
> > +	unsigned int subbuf_size, subbuf_num;
> > +	unsigned int new_subbuf_size, new_subbuf_num;
> > +	struct marker_status *marker_status, *ms_ptr;
> > +	char *old_socket_path, *new_socket_path;
> > +	char *tmp_ustd_socket = "/tmp/tmp_ustd_socket";
> > +	char *trace = "auto";
> > +
> > +	printf("Connecting to pid %d\n", pid);
> > +
> > +	/* marker status array functions */
> > +	result = ustctl_get_cmsf(&marker_status, pid);
> > +	tap_ok(!result, "ustctl_get_cmsf");
> > +
> > +	result = 0;
> > +	for (ms_ptr = marker_status; ms_ptr->channel; ms_ptr++) {
> > +		if (!strcmp(ms_ptr->channel, "ust") &&
> > +		    !strcmp(ms_ptr->marker, "bar")) {
> > +			result = 1;
> > +		}
> > +	}
> > +	tap_ok(result, "Found channel \"ust\", marker \"bar\"");
> > +
> > +	tap_ok(!ustctl_free_cmsf(marker_status), "ustctl_free_cmsf");
> > +
> > +	/* Get and set the socket path */
> > +	tap_ok(!ustctl_get_sock_path(&old_socket_path, pid),
> > +	       "ustctl_get_sock_path");
> > +
> > +	printf("Socket path: %s\n", old_socket_path);
> > +
> > +	tap_ok(!ustctl_set_sock_path(tmp_ustd_socket, pid),
> > +	       "ustctl_set_sock_path - set a new path");
> > +
> > +	tap_ok(!ustctl_get_sock_path(&new_socket_path, pid),
> > +	       "ustctl_get_sock_path - get the new path");
> > +
> > +	tap_ok(!strcmp(new_socket_path, tmp_ustd_socket),
> > +	       "Compare the set path and the retrieved path");
> > +
> > +	free(new_socket_path);
> > +
> > +	tap_ok(!ustctl_set_sock_path(old_socket_path, pid),
> > +	       "Reset the socket path");
> > +
> > +	free(old_socket_path);
> > +
> > +	/* Enable, disable markers */
> > +	tap_ok(!ustctl_set_marker_state(trace, "ust", "bar", 1, pid),
> > +	       "ustctl_set_marker_state - existing marker ust bar");
> > +
> > +	/* Create and allocate a trace */
> > +	tap_ok(!ustctl_create_trace(trace, pid), "ustctl_create_trace");
> > +
> > +	tap_ok(!ustctl_alloc_trace(trace, pid), "ustctl_alloc_trace");
> > +
> > +	/* Get subbuf size and number */
> > +	subbuf_num = ustctl_get_subbuf_num(trace, "ust", pid);
> > +	tap_ok(subbuf_num > 0, "ustctl_get_subbuf_num - %d sub-buffers",
> > +	       subbuf_num);
> > +
> > +	subbuf_size = ustctl_get_subbuf_size(trace, "ust", pid);
> > +	tap_ok(subbuf_size, "ustctl_get_subbuf_size - sub-buffer size is %d",
> > +	       subbuf_size);
> > +
> > +	/* Start the trace */
> > +	tap_ok(!ustctl_start_trace(trace, pid), "ustctl_start_trace");
> > +
> > +
> > +	/* Stop the trace and destroy it*/
> > +	tap_ok(!ustctl_stop_trace(trace, pid), "ustctl_stop_trace");
> > +
> > +	tap_ok(!ustctl_destroy_trace(trace, pid), "ustctl_destroy_trace");
> > +
> > +	/* Create a new trace */
> > +	tap_ok(!ustctl_create_trace(trace, pid), "ustctl_create_trace - create a new trace");
> > +
> > +	printf("Setting new subbufer number and sizes (doubling)\n");
> > +	new_subbuf_num = 2 * subbuf_num;
> > +	new_subbuf_size = 2 * subbuf_size;
> > +
> > +	tap_ok(!ustctl_set_subbuf_num(trace, "ust", new_subbuf_num, pid),
> > +	       "ustctl_set_subbuf_num");
> > +
> > +	tap_ok(!ustctl_set_subbuf_size(trace, "ust", new_subbuf_size, pid),
> > +	       "ustctl_set_subbuf_size");
> > +
> > +
> > +	/* Allocate the new trace */
> > +	tap_ok(!ustctl_alloc_trace(trace, pid), "ustctl_alloc_trace - allocate the new trace");
> > +
> > +
> > +        /* Get subbuf size and number and compare with what was set */
> > +	subbuf_num = ustctl_get_subbuf_num(trace, "ust", pid);
> > +
> > +	subbuf_size = ustctl_get_subbuf_size(trace, "ust", pid);
> > +
> > +	tap_ok(subbuf_num == new_subbuf_num, "Set a new subbuf number, %d == %d",
> > +	       subbuf_num, new_subbuf_num);
> > +
> > +
> > +	result = ustctl_get_subbuf_size(trace, "ust", pid);
> > +	tap_ok(subbuf_size == new_subbuf_size, "Set a new subbuf size, %d == %d",
> > +	       subbuf_size, new_subbuf_size);
> > +
> > +	tap_ok(!ustctl_destroy_trace(trace, pid), "ustctl_destroy_trace - without ever starting");
> > +
> > +
> > +	printf("##### Tests that definetly should work are completed #####\n");
> > +	printf("############## Start expected failure cases ##############\n");
> > +
> > +	tap_ok(ustctl_set_marker_state(trace, "ust","bar", 1, pid),
> > +	       "Enable already enabled marker ust/bar");
> > +
> > +	tap_ok(ustctl_set_marker_state(trace, "ustl", "blar", 1, pid),
> > +	       "Enable non-existent marker ustl blar");
> > +
> > +	tap_ok(ustctl_start_trace(trace, pid),
> > +	       "Start a non-existent trace");
> > +
> > +	tap_ok(ustctl_destroy_trace(trace, pid),
> > +	       "Destroy non-existent trace");
> > +
> > +	exit(tap_status() ? EXIT_FAILURE : EXIT_SUCCESS);
> > +
> > +}
> > +
> > +
> > +int main()
> > +{
> > +	int i, status, pipefd[2];
> > +	pid_t parent_pid, child_pid;
> > +	FILE *pipe_file;
> > +
> > +	tap_plan(27);
> > +
> > +	printf("Function tests for ustctl\n");
> > +
> > +	parent_pid = getpid();
> > +	child_pid = fork();
> > +	if (child_pid) {
> > +		for(i=0; i<10; i++) {
> > +			trace_mark(ust, bar, "str %s", "FOOBAZ");
> > +			trace_mark(ust, bar2, "number1 %d number2 %d", 53, 9800);
> > +			usleep(100000);
> > +		}
> > +
> > +		wait(&status);
> > +	} else {
> > +		ustctl_function_tests(parent_pid);
> > +	}
> > +
> > +	exit(status ? EXIT_FAILURE : EXIT_SUCCESS);
> > +}
> > diff --git a/tests/runtests b/tests/runtests
> > index afc1e21..68427f2 100755
> > --- a/tests/runtests
> > +++ b/tests/runtests
> > @@ -45,7 +45,7 @@ simple_harness_run same_line_marker/same_line_marker.sh
> >  
> >  simple_harness_run tracepoint/run
> >  
> > -simple_harness_run ustcmd_function_tests/ustcmd_function_tests
> > +simple_harness_run libustctl_function_tests/libustctl_function_tests
> >  
> >  echo "************************************"
> >  if [[ $tests_failed -eq 0 ]]; then
> > diff --git a/tests/ustcmd_function_tests/Makefile.am b/tests/ustcmd_function_tests/Makefile.am
> > deleted file mode 100644
> > index b70e784..0000000
> > --- a/tests/ustcmd_function_tests/Makefile.am
> > +++ /dev/null
> > @@ -1,10 +0,0 @@
> > -AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/tests/
> > -
> > -noinst_PROGRAMS = ustcmd_function_tests
> > -ustcmd_function_tests_SOURCES = ustcmd_function_tests.c
> > -ustcmd_function_tests_LDADD = $(top_builddir)/libust/libust.la \
> > -	$(top_builddir)/libustcmd/libustcmd.la \
> > -	$(top_builddir)/libust-initializer.o \
> > -	$(top_builddir)/tests/libtap.la \
> > -	-lpthread
> > -
> > diff --git a/tests/ustcmd_function_tests/ustcmd_function_tests.c b/tests/ustcmd_function_tests/ustcmd_function_tests.c
> > deleted file mode 100644
> > index d44dafc..0000000
> > --- a/tests/ustcmd_function_tests/ustcmd_function_tests.c
> > +++ /dev/null
> > @@ -1,184 +0,0 @@
> > -/* Copyright (C) 2010 Nils Carlson
> > - *
> > - * This library is free software; you can redistribute it and/or
> > - * modify it under the terms of the GNU Lesser General Public
> > - * License as published by the Free Software Foundation; either
> > - * version 2.1 of the License, or (at your option) any later version.
> > - *
> > - * This library is distributed in the hope that it will be useful,
> > - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > - * Lesser General Public License for more details.
> > - *
> > - * You should have received a copy of the GNU Lesser General Public
> > - * License along with this library; if not, write to the Free Software
> > - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
> > - */
> > -
> > -/* Simple function tests for ustcmd */
> > -
> > -#include <stdio.h>
> > -#include <unistd.h>
> > -#include <sys/types.h>
> > -
> > -#include <ust/marker.h>
> > -#include <ust/ustcmd.h>
> > -
> > -#include "tap.h"
> > -
> > -static void ustcmd_function_tests(pid_t pid)
> > -{
> > -	int result;
> > -	unsigned int subbuf_size, subbuf_num;
> > -	unsigned int new_subbuf_size, new_subbuf_num;
> > -	struct marker_status *marker_status, *ms_ptr;
> > -	char *old_socket_path, *new_socket_path;
> > -	char *tmp_ustd_socket = "/tmp/tmp_ustd_socket";
> > -	char *trace = "auto";
> > -
> > -	printf("Connecting to pid %d\n", pid);
> > -
> > -	/* marker status array functions */
> > -	result = ustcmd_get_cmsf(&marker_status, pid);
> > -	tap_ok(!result, "ustcmd_get_cmsf");
> > -
> > -	result = 0;
> > -	for (ms_ptr = marker_status; ms_ptr->channel; ms_ptr++) {
> > -		if (!strcmp(ms_ptr->channel, "ust") &&
> > -		    !strcmp(ms_ptr->marker, "bar")) {
> > -			result = 1;
> > -		}
> > -	}
> > -	tap_ok(result, "Found channel \"ust\", marker \"bar\"");
> > -
> > -	tap_ok(!ustcmd_free_cmsf(marker_status), "ustcmd_free_cmsf");
> > -
> > -	/* Get and set the socket path */
> > -	tap_ok(!ustcmd_get_sock_path(&old_socket_path, pid),
> > -	       "ustcmd_get_sock_path");
> > -
> > -	printf("Socket path: %s\n", old_socket_path);
> > -
> > -	tap_ok(!ustcmd_set_sock_path(tmp_ustd_socket, pid),
> > -	       "ustcmd_set_sock_path - set a new path");
> > -
> > -	tap_ok(!ustcmd_get_sock_path(&new_socket_path, pid),
> > -	       "ustcmd_get_sock_path - get the new path");
> > -
> > -	tap_ok(!strcmp(new_socket_path, tmp_ustd_socket),
> > -	       "Compare the set path and the retrieved path");
> > -
> > -	free(new_socket_path);
> > -
> > -	tap_ok(!ustcmd_set_sock_path(old_socket_path, pid),
> > -	       "Reset the socket path");
> > -
> > -	free(old_socket_path);
> > -
> > -	/* Enable, disable markers */
> > -	tap_ok(!ustcmd_set_marker_state(trace, "ust", "bar", 1, pid),
> > -	       "ustcmd_set_marker_state - existing marker ust bar");
> > -
> > -	/* Create and allocate a trace */
> > -	tap_ok(!ustcmd_create_trace(trace, pid), "ustcmd_create_trace");
> > -
> > -	tap_ok(!ustcmd_alloc_trace(trace, pid), "ustcmd_alloc_trace");
> > -
> > -	/* Get subbuf size and number */
> > -	subbuf_num = ustcmd_get_subbuf_num(trace, "ust", pid);
> > -	tap_ok(subbuf_num > 0, "ustcmd_get_subbuf_num - %d sub-buffers",
> > -	       subbuf_num);
> > -
> > -	subbuf_size = ustcmd_get_subbuf_size(trace, "ust", pid);
> > -	tap_ok(subbuf_size, "ustcmd_get_subbuf_size - sub-buffer size is %d",
> > -	       subbuf_size);
> > -
> > -	/* Start the trace */
> > -	tap_ok(!ustcmd_start_trace(trace, pid), "ustcmd_start_trace");
> > -
> > -
> > -	/* Stop the trace and destroy it*/
> > -	tap_ok(!ustcmd_stop_trace(trace, pid), "ustcmd_stop_trace");
> > -
> > -	tap_ok(!ustcmd_destroy_trace(trace, pid), "ustcmd_destroy_trace");
> > -
> > -	/* Create a new trace */
> > -	tap_ok(!ustcmd_create_trace(trace, pid), "ustcmd_create_trace - create a new trace");
> > -
> > -	printf("Setting new subbufer number and sizes (doubling)\n");
> > -	new_subbuf_num = 2 * subbuf_num;
> > -	new_subbuf_size = 2 * subbuf_size;
> > -
> > -	tap_ok(!ustcmd_set_subbuf_num(trace, "ust", new_subbuf_num, pid),
> > -	       "ustcmd_set_subbuf_num");
> > -
> > -	tap_ok(!ustcmd_set_subbuf_size(trace, "ust", new_subbuf_size, pid),
> > -	       "ustcmd_set_subbuf_size");
> > -
> > -
> > -	/* Allocate the new trace */
> > -	tap_ok(!ustcmd_alloc_trace(trace, pid), "ustcmd_alloc_trace - allocate the new trace");
> > -
> > -
> > -        /* Get subbuf size and number and compare with what was set */
> > -	subbuf_num = ustcmd_get_subbuf_num(trace, "ust", pid);
> > -
> > -	subbuf_size = ustcmd_get_subbuf_size(trace, "ust", pid);
> > -
> > -	tap_ok(subbuf_num == new_subbuf_num, "Set a new subbuf number, %d == %d",
> > -	       subbuf_num, new_subbuf_num);
> > -
> > -
> > -	result = ustcmd_get_subbuf_size(trace, "ust", pid);
> > -	tap_ok(subbuf_size == new_subbuf_size, "Set a new subbuf size, %d == %d",
> > -	       subbuf_size, new_subbuf_size);
> > -
> > -	tap_ok(!ustcmd_destroy_trace(trace, pid), "ustcmd_destroy_trace - without ever starting");
> > -
> > -
> > -	printf("##### Tests that definetly should work are completed #####\n");
> > -	printf("############## Start expected failure cases ##############\n");
> > -
> > -	tap_ok(ustcmd_set_marker_state(trace, "ust","bar", 1, pid),
> > -	       "Enable already enabled marker ust/bar");
> > -
> > -	tap_ok(ustcmd_set_marker_state(trace, "ustl", "blar", 1, pid),
> > -	       "Enable non-existent marker ustl blar");
> > -
> > -	tap_ok(ustcmd_start_trace(trace, pid),
> > -	       "Start a non-existent trace");
> > -
> > -	tap_ok(ustcmd_destroy_trace(trace, pid),
> > -	       "Destroy non-existent trace");
> > -
> > -	exit(tap_status() ? EXIT_FAILURE : EXIT_SUCCESS);
> > -
> > -}
> > -
> > -
> > -int main()
> > -{
> > -	int i, status, pipefd[2];
> > -	pid_t parent_pid, child_pid;
> > -	FILE *pipe_file;
> > -
> > -	tap_plan(27);
> > -
> > -	printf("Function tests for ustcmd\n");
> > -
> > -	parent_pid = getpid();
> > -	child_pid = fork();
> > -	if (child_pid) {
> > -		for(i=0; i<10; i++) {
> > -			trace_mark(ust, bar, "str %s", "FOOBAZ");
> > -			trace_mark(ust, bar2, "number1 %d number2 %d", 53, 9800);
> > -			usleep(100000);
> > -		}
> > -
> > -		wait(&status);
> > -	} else {
> > -		ustcmd_function_tests(parent_pid);
> > -	}
> > -
> > -	exit(status ? EXIT_FAILURE : EXIT_SUCCESS);
> > -}
> > diff --git a/ustctl/Makefile.am b/ustctl/Makefile.am
> > index 3b09745..1e442a3 100644
> > --- a/ustctl/Makefile.am
> > +++ b/ustctl/Makefile.am
> > @@ -1,5 +1,5 @@
> >  AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libustcomm \
> > -	-I$(top_srcdir)/libustcmd $(KCOMPAT_CFLAGS)
> > +	-I$(top_srcdir)/libustctl $(KCOMPAT_CFLAGS)
> >  AM_CFLAGS = -fno-strict-aliasing
> >  
> >  bin_PROGRAMS = ustctl
> > @@ -12,4 +12,4 @@ ustctl_CFLAGS = -DUST_COMPONENT=ustctl -fno-strict-aliasing
> >  ustctl_LDADD = \
> >  	$(top_builddir)/snprintf/libustsnprintf.la \
> >  	$(top_builddir)/libustcomm/libustcomm.la \
> > -	$(top_builddir)/libustcmd/libustcmd.la
> > +	$(top_builddir)/libustctl/libustctl.la
> > diff --git a/ustctl/channel_cmds.c b/ustctl/channel_cmds.c
> > index 51f7d50..2ccf460 100644
> > --- a/ustctl/channel_cmds.c
> > +++ b/ustctl/channel_cmds.c
> > @@ -17,7 +17,7 @@
> >  #include <stdio.h>
> >  #include <sys/types.h>
> >  #include <unistd.h>
> > -#include <ust/ustcmd.h>
> > +#include <ust/ustctl.h>
> >  #include "scanning_functions.h"
> >  #include "usterr.h"
> >  #include "cli.h"
> > @@ -38,7 +38,7 @@ static int set_subbuf_size(int argc, char *argv[])
> >  			free(channel);
> >  		return -1;
> >  	}
> > -	if (ustcmd_set_subbuf_size(argv[2], channel, size, pid)) {
> > +	if (ustctl_set_subbuf_size(argv[2], channel, size, pid)) {
> >  		ERR("error while trying to set the size of subbuffers "
> >  		    "for PID %u\n",
> >  		    pid);
> > @@ -66,7 +66,7 @@ static int set_subbuf_num(int argc, char *argv[])
> >  			free(channel);
> >  		return -1;
> >  	}
> > -	if (ustcmd_set_subbuf_num(argv[2], channel, num, pid)) {
> > +	if (ustctl_set_subbuf_num(argv[2], channel, num, pid)) {
> >  		ERR("error while trying to set the number of subbuffers for PID %u\n",
> >  		    pid);
> >  		result = -1;
> > @@ -84,7 +84,7 @@ static int get_subbuf_size(int argc, char *argv[])
> >  
> >  	pid = parse_pid(argv[1]);
> >  
> > -	if ((size = ustcmd_get_subbuf_size(argv[2], argv[3], pid)) < 0) {
> > +	if ((size = ustctl_get_subbuf_size(argv[2], argv[3], pid)) < 0) {
> >  		ERR("error while trying to get the subbuffer size from PID %u\n",
> >  		    pid);
> >  		return -1;
> > @@ -102,7 +102,7 @@ static int get_subbuf_num(int argc, char *argv[])
> >  
> >  	pid = parse_pid(argv[1]);
> >  
> > -	if ((num = ustcmd_get_subbuf_num(argv[2], argv[3], pid)) < 0) {
> > +	if ((num = ustctl_get_subbuf_num(argv[2], argv[3], pid)) < 0) {
> >  		ERR("error while trying to get the subbuffer size from PID %u\n",
> >  		    pid);
> >  		return -1;
> > diff --git a/ustctl/marker_cmds.c b/ustctl/marker_cmds.c
> > index 20222dd..6544669 100644
> > --- a/ustctl/marker_cmds.c
> > +++ b/ustctl/marker_cmds.c
> > @@ -17,7 +17,7 @@
> >  #include <stdio.h>
> >  #include <sys/types.h>
> >  #include <unistd.h>
> > -#include <ust/ustcmd.h>
> > +#include <ust/ustctl.h>
> >  #include "scanning_functions.h"
> >  #include "usterr.h"
> >  #include "cli.h"
> > @@ -30,7 +30,7 @@ static int list_markers(int argc, char *argv[])
> >  
> >  	pid = parse_pid(argv[1]);
> >  
> > -	if (ustcmd_get_cmsf(&cmsf, pid)) {
> > +	if (ustctl_get_cmsf(&cmsf, pid)) {
> >  		ERR("error while trying to list markers for PID %u\n", pid);
> >  		return -1;
> >  	}
> > @@ -43,7 +43,7 @@ static int list_markers(int argc, char *argv[])
> >  		       cmsf[i].state,
> >  		       cmsf[i].fs);
> >  	}
> > -	ustcmd_free_cmsf(cmsf);
> > +	ustctl_free_cmsf(cmsf);
> >  	return 0;
> >  }
> >  
> > @@ -68,7 +68,7 @@ static int enable_marker(int argc, char *argv[])
> >  			if (marker)
> >  				free(marker);
> >  		}
> > -		if (ustcmd_set_marker_state(argv[2], channel, marker, 1, pid)) {
> > +		if (ustctl_set_marker_state(argv[2], channel, marker, 1, pid)) {
> >  			PERROR("error while trying to enable marker %s with PID %u",
> >  			       argv[i], pid);
> >  			result = -1;
> > @@ -101,7 +101,7 @@ static int disable_marker(int argc, char *argv[])
> >  				free(marker);
> >  			return -1;
> >  		}
> > -		if (ustcmd_set_marker_state(argv[2], channel, marker, 0, pid)) {
> > +		if (ustctl_set_marker_state(argv[2], channel, marker, 0, pid)) {
> >  			PERROR("error while trying to disable marker %s with PID %u",
> >  			       argv[i], pid);
> >  			result = -1;
> > diff --git a/ustctl/scanning_functions.c b/ustctl/scanning_functions.c
> > index 0cf809e..a3eceb5 100644
> > --- a/ustctl/scanning_functions.c
> > +++ b/ustctl/scanning_functions.c
> > @@ -17,7 +17,7 @@
> >  
> >  #define _GNU_SOURCE
> >  #include <stdio.h>
> > -#include <ust/ustcmd.h>
> > +#include <ust/ustctl.h>
> >  #include "usterr.h"
> >  
> >  
> > diff --git a/ustctl/trace_cmds.c b/ustctl/trace_cmds.c
> > index f6e11a7..020e5b2 100644
> > --- a/ustctl/trace_cmds.c
> > +++ b/ustctl/trace_cmds.c
> > @@ -17,7 +17,7 @@
> >  #include <stdio.h>
> >  #include <sys/types.h>
> >  #include <unistd.h>
> > -#include <ust/ustcmd.h>
> > +#include <ust/ustctl.h>
> >  #include "scanning_functions.h"
> >  #include "usterr.h"
> >  #include "cli.h"
> > @@ -29,7 +29,7 @@ static int create_trace(int argc, char *argv[])
> >  
> >  	pid = parse_pid(argv[1]);
> >  
> > -	if (ustcmd_create_trace(argv[2], pid)) {
> > +	if (ustctl_create_trace(argv[2], pid)) {
> >  		ERR("Failed to create trace %s for PID %u\n", argv[2], pid);
> >  		return -1;
> >  	}
> > @@ -43,7 +43,7 @@ static int alloc_trace(int argc, char *argv[])
> >  
> >  	pid = parse_pid(argv[1]);
> >  
> > -	if (ustcmd_alloc_trace(argv[2], pid)) {
> > +	if (ustctl_alloc_trace(argv[2], pid)) {
> >  		ERR("Failed to allocate trace %s for PID %u\n", argv[2], pid);
> >  		return -1;
> >  	}
> > @@ -56,7 +56,7 @@ static int start_trace(int argc, char *argv[])
> >  
> >  	pid = parse_pid(argv[1]);
> >  
> > -	if (ustcmd_start_trace(argv[2], pid)) {
> > +	if (ustctl_start_trace(argv[2], pid)) {
> >  		ERR("Failed to start trace %s for PID %u\n", argv[2], pid);
> >  		return -1;
> >  	}
> > @@ -69,7 +69,7 @@ static int stop_trace(int argc, char *argv[])
> >  
> >  	pid = parse_pid(argv[1]);
> >  
> > -	if (ustcmd_stop_trace(argv[2], pid)) {
> > +	if (ustctl_stop_trace(argv[2], pid)) {
> >  		ERR("Failed to stop trace %s for PID %u\n", argv[2], pid);
> >  		return -1;
> >  	}
> > @@ -82,7 +82,7 @@ static int destroy_trace(int argc, char *argv[])
> >  
> >  	pid = parse_pid(argv[1]);
> >  
> > -	if (ustcmd_destroy_trace(argv[2], pid)) {
> > +	if (ustctl_destroy_trace(argv[2], pid)) {
> >  		ERR("Failed to destroy trace %s for PID %u\n", argv[2], pid);
> >  		return -1;
> >  	}
> > @@ -95,7 +95,7 @@ static int force_subbuf_switch(int argc, char *argv[])
> >  
> >  	pid = parse_pid(argv[1]);
> >  
> > -	if (ustcmd_force_switch(pid)) {
> > +	if (ustctl_force_switch(pid)) {
> >  		ERR("error while trying to force switch for PID %u\n", pid);
> >  		return -1;
> >  	}
> > diff --git a/ustctl/ustctl.c b/ustctl/ustctl.c
> > index 2b75a58..c1bbe8c 100644
> > --- a/ustctl/ustctl.c
> > +++ b/ustctl/ustctl.c
> > @@ -23,7 +23,7 @@
> >  #include <stdlib.h>
> >  #include <fcntl.h>
> >  
> > -#include "ust/ustcmd.h"
> > +#include "ust/ustctl.h"
> >  #include "usterr.h"
> >  #include "cli.h"
> >  #include "scanning_functions.h"
> > @@ -111,7 +111,7 @@ static int list_trace_events(int argc, char *argv[])
> >  
> >  	pid = parse_pid(argv[1]);
> >  
> > -	if (ustcmd_get_tes(&tes, pid)) {
> > +	if (ustctl_get_tes(&tes, pid)) {
> >  		ERR("error while trying to list "
> >  		    "trace_events for PID %u\n",
> >  		    pid);
> > @@ -123,7 +123,7 @@ static int list_trace_events(int argc, char *argv[])
> >  		       pid,
> >  		       tes[i].name);
> >  	}
> > -	ustcmd_free_tes(tes);
> > +	ustctl_free_tes(tes);
> >  
> >  	return 0;
> >  }
> > @@ -134,7 +134,7 @@ static int set_sock_path(int argc, char *argv[])
> >  
> >  	pid = parse_pid(argv[1]);
> >  
> > -	if (ustcmd_set_sock_path(argv[2], pid)) {
> > +	if (ustctl_set_sock_path(argv[2], pid)) {
> >  		ERR("error while trying to set sock path for PID %u\n", pid);
> >  		return -1;
> >  	}
> > @@ -149,7 +149,7 @@ static int get_sock_path(int argc, char *argv[])
> >  
> >  	pid = parse_pid(argv[1]);
> >  
> > -	if (ustcmd_get_sock_path(&sock_path, pid)) {
> > +	if (ustctl_get_sock_path(&sock_path, pid)) {
> >  		ERR("error while trying to get sock path for PID %u\n", pid);
> >  		return -1;
> >  	}
> > -- 
> > 1.7.1
> > 
> > 
> > _______________________________________________
> > ltt-dev mailing list
> > ltt-dev at lists.casi.polymtl.ca
> > http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
> > 
> 
> -- 
> Mathieu Desnoyers
> Operating System Efficiency R&D Consultant
> EfficiOS Inc.
> http://www.efficios.com

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com




More information about the lttng-dev mailing list