21#include <radcli/radcli.h>
32static char const * months[] =
34 "Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
35 "Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
43void rc_str2tm (
char const *valstr,
struct tm *tm)
48 for (i = 0; i < 12; i++)
50 if (strncmp (months[i], valstr, 3) == 0)
58 tm->tm_mday = atoi (&valstr[4]);
61 tm->tm_year = atoi (&valstr[7]) - 1900;
69double rc_getmtime(
void)
71#ifdef HAVE_CLOCK_GETTIME
72 struct timespec timespec;
74 if (clock_gettime(CLOCK_MONOTONIC, ×pec) != 0)
77 return timespec.tv_sec + ((double)timespec.tv_nsec) / 1000000000.0;
81 if (gettimeofday(&timev, NULL) == -1)
84 return timev.tv_sec + ((double)timev.tv_usec) / 1000000.0;
106 static unsigned short int cnt = 0;
107 snprintf (buf,
sizeof(buf),
"%08lX%04X%02hX",
108 (
unsigned long int) time (NULL),
109 (
unsigned int) getpid (),
132#ifdef RC_NEED_STRLCPY
140rc_strlcpy(
char *dst,
char const *src,
size_t siz)
147 if (n != 0 && --n != 0) {
149 if ((*d++ = *s++) == 0)
174int rc_set_netns(
const char *net_namespace,
int *prev_ns_handle)
179 static const char* crt_nsnet =
"/proc/self/ns/net";
181 char sock_nsnet[NSNET_SZ];
183 if (NULL == net_namespace) {
184 rc_log(LOG_ERR,
"Namespace not provided");
187 if (NULL == prev_ns_handle) {
188 rc_log(LOG_ERR,
"NULL NS handle for: %s", net_namespace);
191 *prev_ns_handle = -1;
192 snprintf(sock_nsnet, NSNET_SZ,
"/var/run/netns/%s", net_namespace);
194 *prev_ns_handle = open(crt_nsnet, O_RDONLY);
195 if (*prev_ns_handle < 0) {
196 rc_log(LOG_ERR,
"Cannot open %s errno=%s(%d)", crt_nsnet, strerror (errno), errno);
199 sock_ns_fd = open(sock_nsnet, O_RDONLY);
200 if (sock_ns_fd < 0) {
201 rc_log(LOG_ERR,
"Cannot open %s errno=%s(%d)", sock_nsnet, strerror (errno), errno);
204 if (setns(sock_ns_fd, CLONE_NEWNET) < 0) {
205 rc_log(LOG_ERR,
"'setns' set failed for %s errno=%s(%d)", sock_nsnet,
206 strerror(errno), errno);
211 if (sock_ns_fd >= 0) {
212 (void)close(sock_ns_fd);
215 if (*prev_ns_handle >=0 ) {
216 (void)close(*prev_ns_handle);
217 *prev_ns_handle = -1;
221 rc_log(LOG_ERR,
"Not a Linux system. No operation performed");
233int rc_reset_netns(
int *prev_ns_handle)
237 if (NULL == prev_ns_handle) {
238 rc_log(LOG_ERR,
"NULL NS handle");
241 if (setns(*prev_ns_handle, CLONE_NEWNET) < 0) {
242 rc_log(LOG_ERR,
"'setns' - reset failed errno=%s(%d)", strerror (errno), errno);
244 if (close(*prev_ns_handle) != 0) {
245 rc_log(LOG_ERR,
"Close error fd=%d errno=%s(%d)", *prev_ns_handle, strerror (errno), errno);
248 *prev_ns_handle = -1;
250 rc_log(LOG_ERR,
"Not a Linux system. No operation performed");