1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
// stapdyn session attribute code
// Copyright (C) 2013 Red Hat Inc.
//
// This file is part of systemtap, and is free software. You can
// redistribute it and/or modify it under the terms of the GNU General
// Public License (GPL); either version 2, or (at your option) any
// later version.
#ifndef SESSION_ATTRIBUTES_C
#define SESSION_ATTRIBUTES_C
#include "session_attributes.h"
static struct _stp_session_attributes _stp_init_session_attributes = {
.log_level = 0,
.suppress_warnings = 0,
.stp_pid = 0,
.target = 0,
.tz_gmtoff = 0,
.tz_name = "",
.module_name = "",
.outfile_name = "",
};
static void stp_session_attributes_init(void)
{
*stp_session_attributes() = _stp_init_session_attributes;
}
static int stp_session_attribute_setter(const char *name, const char *value)
{
// Note that We start all internal variables with '@', since
// that can't start a "real" variable.
struct _stp_session_attributes *init = &_stp_init_session_attributes;
#define set_num(field, type) \
if (strcmp(name, "@" #field) == 0) { \
char *endp = NULL; \
errno = 0; \
init->field = strto##type(value, &endp, 0); \
return (endp == value || *endp != '\0') ? \
-EINVAL : -errno; \
}
#define set_string(field) \
if (strcmp(name, "@" #field) == 0) { \
size_t size = sizeof(init->field); \
size_t len = strlcpy(init->field, value, size); \
return (len < size) ? 0 : -EOVERFLOW; \
}
set_num(log_level, ul);
set_num(suppress_warnings, ul);
set_num(stp_pid, ul);
set_num(target, ul);
set_num(tz_gmtoff, l);
set_string(tz_name);
set_string(module_name);
set_string(outfile_name);
#undef set_num
#undef set_string
return -ENOENT;
}
#endif // SESSION_ATTRIBUTES_C
|