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_chunk: add a pointer to a dynamically sized array of
54 * pointers, realloc as necessary in multiples of "chunk".
56 * "alloc" is the number of pointers allocated
57 * "dest_size" is the number of valid pointers
59 * returns 1 on success, 0 on failure.
62 int rrd_add_ptr_chunk(void ***dest, size_t *dest_size, void *src,
63 size_t *alloc, size_t chunk)
68 assert(alloc != NULL);
69 assert(*alloc >= *dest_size);
71 if (*alloc == *dest_size)
73 temp = (void **) rrd_realloc(*dest, (*alloc+chunk) * sizeof(*dest));
81 (*dest)[*dest_size] = src;
87 /* rrd_add_ptr: add a pointer to a dynamically sized array of pointers,
88 * realloc as necessary. returns 1 on success, 0 on failure.
90 int rrd_add_ptr(void ***dest, size_t *dest_size, void *src)
92 size_t alloc = *dest_size;
94 return rrd_add_ptr_chunk(dest, dest_size, src, &alloc, 1);
97 /* like rrd_add_ptr_chunk, but calls strdup() on a string first. */
98 int rrd_add_strdup_chunk(char ***dest, size_t *dest_size, char *src,
99 size_t *alloc, size_t chunk)
104 assert(dest != NULL);
107 dup_src = strdup(src);
111 add_ok = rrd_add_ptr_chunk((void ***)dest, dest_size, (void *)dup_src, alloc, chunk);
118 int rrd_add_strdup(char ***dest, size_t *dest_size, char *src)
120 size_t alloc = *dest_size;
122 return rrd_add_strdup_chunk(dest, dest_size, src, &alloc, 1);
125 void rrd_free_ptrs(void ***src, size_t *cnt)
144 /* recursively create the directory named by 'pathname'
145 * (similar to "mkdir -p" on the command line) */
146 int rrd_mkdir_p(const char *pathname, mode_t mode)
153 if ((NULL == pathname) || ('\0' == *pathname)) {
158 if (0 == stat(pathname, &sb)) {
159 if (! S_ISDIR(sb.st_mode)) {
166 /* keep errno as set by stat() */
170 /* dirname might modify its first argument */
171 if (NULL == (pathname_copy = strdup(pathname)))
174 base_dir = dirname(pathname_copy);
176 if (0 != rrd_mkdir_p(base_dir, mode)) {
177 int orig_errno = errno;
185 /* keep errno as set by mkdir() */
186 if (0 != mkdir(pathname, mode))