* modified is included with the above copyright notice.
*/
-#include <sys/syscall.h>
+/*
+ * sched_getcpu.
+ */
+#ifdef __linux__
#ifdef __UCLIBC__
+#include <sys/syscall.h>
#define __getcpu(cpu, node, cache) syscall(__NR_getcpu, cpu, node, cache)
static inline
int sched_getcpu(void)
return (s == -1) ? s : c;
}
#endif /* __UCLIBC__ */
+
+#else
+#error "Please add support for your OS into liblttng-ust/compat.h."
+#endif
+
+/*
+ * lttng_ust_getprocname.
+ */
+#ifdef __linux__
+
+#include <sys/prctl.h>
+
+#define LTTNG_UST_PROCNAME_LEN 17
+
+static inline
+void lttng_ust_getprocname(char *name)
+{
+ (void) prctl(PR_GET_NAME, (unsigned long) name, 0, 0, 0);
+}
+
+#elif defined(__FreeBSD__)
+#include <stdlib.h>
+#include <string.h>
+
+/*
+ * Limit imposed by Linux UST-sessiond ABI.
+ */
+#define LTTNG_UST_PROCNAME_LEN 17
+
+/*
+ * Acts like linux prctl, the string is not necessarily 0-terminated if
+ * 16-byte long.
+ */
+static inline
+void lttng_ust_getprocname(char *name)
+{
+ const char *bsd_name;
+
+ bsd_name = getprogname();
+ if (!bsd_name)
+ name[0] = '\0';
+ memcpy(name, bsd_name, LTTNG_UST_PROCNAME_LEN - 1);
+}
+
+#endif
+
#endif /* _UST_COMPAT_H */
#include <stddef.h>
#include <inttypes.h>
#include <time.h>
-#include <sys/prctl.h>
#include <lttng/ust-endian.h>
#include "clock.h"
#include <usterr-signal-safe.h>
#include <helper.h>
#include "error.h"
+#include "compat.h"
#include "tracepoint-internal.h"
#include "ltt-tracer.h"
#include "../libringbuffer/shm.h"
#include "jhash.h"
-#define PROCNAME_LEN 17
-
/*
* The sessions mutex is the centralized mutex across UST tracing
* control and probe registration. All operations within this file are
struct ltt_channel *chan;
struct ltt_event *event;
int ret = 0;
- char procname[PROCNAME_LEN] = "";
+ char procname[LTTNG_UST_PROCNAME_LEN] = "";
if (!CMM_ACCESS_ONCE(session->active))
return 0;
goto end;
/* ignore error, just use empty string if error. */
- (void) prctl(PR_GET_NAME, (unsigned long) procname, 0, 0, 0);
- procname[PROCNAME_LEN - 1] = '\0';
+ lttng_ust_getprocname(procname);
+ procname[LTTNG_UST_PROCNAME_LEN - 1] = '\0';
ret = lttng_metadata_printf(session,
"env {\n"
" vpid = %d;\n"
* Dual LGPL v2.1/GPL v2 license.
*/
-#include <sys/prctl.h>
#include <lttng/ust-events.h>
#include <lttng/ust-tracer.h>
#include <lttng/ringbuffer-config.h>
#include <assert.h>
-
-#define PROCNAME_LEN 17 /* includes \0 */
+#include "compat.h"
/*
* We cache the result to ensure we don't trigger a system call for
static inline
char *wrapper_getprocname(void)
{
- int ret;
-
if (caa_unlikely(!cached_procname[0])) {
- ret = prctl(PR_GET_NAME, (unsigned long) cached_procname,
- 0, 0, 0);
- assert(!ret);
+ lttng_ust_getprocname(cached_procname);
+ cached_procname[LTTNG_UST_PROCNAME_LEN - 1] = '\0';
}
return cached_procname;
}
{
size_t size = 0;
- size += PROCNAME_LEN;
+ size += LTTNG_UST_PROCNAME_LEN;
return size;
}
char *procname;
procname = wrapper_getprocname();
- chan->ops->event_write(ctx, procname, PROCNAME_LEN);
+ chan->ops->event_write(ctx, procname, LTTNG_UST_PROCNAME_LEN);
}
int lttng_add_procname_to_ctx(struct lttng_ctx **ctx)
field->event_field.type.u.array.elem_type.u.basic.integer.reverse_byte_order = 0;
field->event_field.type.u.array.elem_type.u.basic.integer.base = 10;
field->event_field.type.u.array.elem_type.u.basic.integer.encoding = lttng_encode_UTF8;
- field->event_field.type.u.array.length = PROCNAME_LEN;
+ field->event_field.type.u.array.length = LTTNG_UST_PROCNAME_LEN;
field->get_size = procname_get_size;
field->record = procname_record;
return 0;
#define _LGPL_SOURCE
#include <sys/types.h>
#include <sys/socket.h>
-#include <sys/prctl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <usterr-signal-safe.h>
#include "tracepoint-internal.h"
#include "ltt-tracer-core.h"
+#include "compat.h"
/*
* Has lttng ust comm constructor been called ?
int register_app_to_sessiond(int socket)
{
ssize_t ret;
- int prctl_ret;
struct {
uint32_t major;
uint32_t minor;
reg_msg.uid = getuid();
reg_msg.gid = getgid();
reg_msg.bits_per_long = CAA_BITS_PER_LONG;
- prctl_ret = prctl(PR_GET_NAME, (unsigned long) reg_msg.name, 0, 0, 0);
- if (prctl_ret) {
- ERR("Error executing prctl");
- return -errno;
- }
+ lttng_ust_getprocname(reg_msg.name);
ret = ustcomm_send_unix_sock(socket, ®_msg, sizeof(reg_msg));
if (ret >= 0 && ret != sizeof(reg_msg))