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
) {