aboutsummaryrefslogtreecommitdiffstats
path: root/src/libposixplz/mkdirp2.c
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 ;
}