2
* RRDtool - src/rrd_utils.c
3
* Copyright (C) 2009 Kevin Brintnall
4
* Copyright (C) 2008 Sebastian Harl
6
* This program is free software; you can redistribute it and/or modify it
7
* under the terms of the GNU General Public License as published by the
8
* Free Software Foundation; only version 2 of the License is applicable.
10
* This program is distributed in the hope that it will be useful, but
11
* WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
* General Public License for more details.
15
* You should have received a copy of the GNU General Public License along
16
* with this program; if not, write to the Free Software Foundation, Inc.,
17
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
* kevin brintnall <kbrint@rufus.net>
21
* Sebastian Harl <sh@tokkee.org>
31
#include <sys/types.h>
36
# define random() rand()
37
# define srandom(x) srand(x)
41
/* make sure that the random number generator seeded EXACTLY ONCE */
44
static int rand_init = 0;
46
srandom((unsigned int) time(NULL) + (unsigned int) getpid());
53
/* rrd_add_ptr: add a pointer to a dynamically sized array of pointers,
54
* realloc as necessary. returns 1 on success, 0 on failure.
57
int rrd_add_ptr(void ***dest, size_t *dest_size, void *src)
63
temp = (void **) rrd_realloc(*dest, (*dest_size+1) * sizeof(*dest));
68
temp[*dest_size] = src;
74
/* like rrd_add_ptr, but calls strdup() on a string first. */
75
int rrd_add_strdup(char ***dest, size_t *dest_size, char *src)
83
dup_src = strdup(src);
87
add_ok = rrd_add_ptr((void ***)dest, dest_size, (void *)dup_src);
94
void rrd_free_ptrs(void ***src, size_t *cnt)
113
/* recursively create the directory named by 'pathname'
114
* (similar to "mkdir -p" on the command line) */
115
int rrd_mkdir_p(const char *pathname, mode_t mode)
122
if ((NULL == pathname) || ('\0' == *pathname)) {
127
if (0 == stat(pathname, &sb)) {
128
if (! S_ISDIR(sb.st_mode)) {
135
/* keep errno as set by stat() */
139
/* dirname might modify its first argument */
140
if (NULL == (pathname_copy = strdup(pathname)))
143
base_dir = dirname(pathname_copy);
145
if (0 != rrd_mkdir_p(base_dir, mode)) {
146
int orig_errno = errno;
154
/* keep errno as set by mkdir() */
155
if (0 != mkdir(pathname, mode))