blob: ca81da54eb269b9bb96ecc87d487c73f0e1add65 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
/* ISC license. */
#include <skalibs/bsdsnowflake.h>
#include <string.h>
#include <errno.h>
#include <skalibs/stat.h>
#include <skalibs/posixplz.h>
static int domkdir (char const *s, mode_t mode)
{
return !mkdir(s, mode) || errno == EEXIST ;
}
int mkdirp2 (char *s, mode_t mode)
{
mode_t m = umask(0) ;
size_t len = strlen(s) ;
size_t i = 2 ;
for (; i < len ; i++) if (s[i] == '/')
{
s[i] = 0 ;
if (!domkdir(s, 02755)) goto err ;
s[i] = '/' ;
}
if (!domkdir(s, mode)) goto err ;
umask(m) ;
return 0 ;
err:
umask(m) ;
return -1 ;
}
|