4
* Misc utility functions
6
* Copyright (C) 2006, 2007 Olaf Kirch <olaf.kirch@oracle.com>
17
parse_size(const char *arg)
19
unsigned long mult = 1, ret;
22
ret = strtol(arg, &s, 0);
27
mult = 1024 * 1024 * 1024;
43
err(1, "parse_size: unknown unit in \"%s\"\n", arg);
53
print_size(unsigned long size)
55
static char unit[] = "-kMG";
56
static char buffer[64];
57
unsigned int power = 0;
59
while (size && !(size % 1024) && power < sizeof(unit)) {
65
snprintf(buffer, sizeof(buffer), "%lu", size);
67
snprintf(buffer, sizeof(buffer), "%lu%c",
74
parse_count(const char *arg)
79
ret = strtoul(arg, &s, 0);
81
err(1, "parse_count: unexpected character in \"%s\"\n", arg);
87
parse_int(const char *arg)
92
ret = strtol(arg, &s, 0);
94
err(1, "parse_count: unexpected character in \"%s\"\n", arg);
100
parse_longlong(const char *arg)
105
ret = strtoll(arg, &s, 0);
107
err(1, "parse_count: unexpected character in \"%s\"\n", arg);
113
parse_double(const char *arg)
118
ret = strtod(arg, &s);
120
err(1, "parse_count: unexpected character in \"%s\"\n", arg);
126
parse_timeout(const char *arg)
128
unsigned int v, ret = 0;
132
v = strtoul(arg, &s, 10);
149
errx(1, "parse_timeout: unexpected character in \"%s\"\n",
160
isns_string_array_append(struct string_array *array, const char *val)
162
if (!(array->count % 32)) {
163
array->list = isns_realloc(array->list,
164
(array->count + 32) * sizeof(val));
166
array->list[array->count++] = val? isns_strdup(val) : NULL;
170
isns_string_array_destroy(struct string_array *array)
174
for (i = 0; i < array->count; ++i)
175
isns_free(array->list[i]);
176
isns_free(array->list);
177
memset(array, 0, sizeof(*array));
181
isns_assign_string(char **var, const char *val)
185
if (val && !(s = isns_strdup(val)))
186
errx(1, "out of memory");
194
* Recursively create a directory
197
isns_mkdir_recursive(const char *pathname)
199
const char *orig_pathname = pathname;
201
char *copy = NULL, *s;
204
if (!pathname || !strcmp(pathname, "."))
207
if (mkdir(pathname, 0755) >= 0) {
210
*squirrel[--ns] = '/';
220
copy = isns_strdup(pathname);
224
s = strrchr(copy, '/');
225
while (s > copy && s[-1] == '/')
229
isns_assert(ns < 64);
243
perror(orig_pathname);
248
* This one differs from POSIX dirname; it does not
249
* modify its argument
252
isns_dirname(const char *pathname)
254
static char buffer[4096];
257
strcpy(buffer, pathname);
258
if ((s = strrchr(buffer, '/')) != NULL) {