11489St.nateldemoura@f5.com /*
21489St.nateldemoura@f5.com * Copyright (C) NGINX, Inc.
31489St.nateldemoura@f5.com */
41489St.nateldemoura@f5.com
51489St.nateldemoura@f5.com #include <nxt_main.h>
61489St.nateldemoura@f5.com
71489St.nateldemoura@f5.com
81489St.nateldemoura@f5.com static nxt_int_t nxt_fs_mkdir(const u_char *dir, mode_t mode);
91489St.nateldemoura@f5.com
101489St.nateldemoura@f5.com
111489St.nateldemoura@f5.com nxt_int_t
nxt_fs_mkdir_all(const u_char * dir,mode_t mode)121489St.nateldemoura@f5.com nxt_fs_mkdir_all(const u_char *dir, mode_t mode)
131489St.nateldemoura@f5.com {
141489St.nateldemoura@f5.com char *start, *end, *dst;
151489St.nateldemoura@f5.com size_t dirlen;
161489St.nateldemoura@f5.com char path[PATH_MAX];
171489St.nateldemoura@f5.com
181489St.nateldemoura@f5.com dirlen = nxt_strlen(dir);
191489St.nateldemoura@f5.com
201489St.nateldemoura@f5.com nxt_assert(dirlen < PATH_MAX && dirlen > 1 && dir[0] == '/');
211489St.nateldemoura@f5.com
221489St.nateldemoura@f5.com dst = path;
23*2402Sa.clayton@nginx.com start = (char *) dir;
241489St.nateldemoura@f5.com
251489St.nateldemoura@f5.com while (*start != '\0') {
261489St.nateldemoura@f5.com if (*start == '/') {
271489St.nateldemoura@f5.com *dst++ = *start++;
281489St.nateldemoura@f5.com }
291489St.nateldemoura@f5.com
301489St.nateldemoura@f5.com end = strchr(start, '/');
311489St.nateldemoura@f5.com if (end == NULL) {
321489St.nateldemoura@f5.com end = ((char *)dir + dirlen);
331489St.nateldemoura@f5.com }
341489St.nateldemoura@f5.com
351489St.nateldemoura@f5.com dst = nxt_cpymem(dst, start, end - start);
361489St.nateldemoura@f5.com *dst = '\0';
371489St.nateldemoura@f5.com
381489St.nateldemoura@f5.com if (nxt_slow_path(nxt_fs_mkdir((u_char *) path, mode) != NXT_OK
391489St.nateldemoura@f5.com && nxt_errno != EEXIST))
401489St.nateldemoura@f5.com {
411489St.nateldemoura@f5.com return NXT_ERROR;
421489St.nateldemoura@f5.com }
431489St.nateldemoura@f5.com
441489St.nateldemoura@f5.com start = end;
451489St.nateldemoura@f5.com }
461489St.nateldemoura@f5.com
471489St.nateldemoura@f5.com return NXT_OK;
481489St.nateldemoura@f5.com }
491489St.nateldemoura@f5.com
501489St.nateldemoura@f5.com
512207Sa.clayton@nginx.com nxt_int_t
nxt_fs_mkdir_parent(const u_char * path,mode_t mode)522207Sa.clayton@nginx.com nxt_fs_mkdir_parent(const u_char *path, mode_t mode)
532207Sa.clayton@nginx.com {
542207Sa.clayton@nginx.com char *ptr, *dir;
552207Sa.clayton@nginx.com nxt_int_t ret;
562207Sa.clayton@nginx.com
572207Sa.clayton@nginx.com dir = nxt_strdup(path);
582207Sa.clayton@nginx.com if (nxt_slow_path(dir == NULL)) {
592207Sa.clayton@nginx.com return NXT_ERROR;
602207Sa.clayton@nginx.com }
612207Sa.clayton@nginx.com
622207Sa.clayton@nginx.com ret = NXT_OK;
632207Sa.clayton@nginx.com
642207Sa.clayton@nginx.com ptr = strrchr(dir, '/');
652207Sa.clayton@nginx.com if (nxt_fast_path(ptr != NULL)) {
662207Sa.clayton@nginx.com *ptr = '\0';
672207Sa.clayton@nginx.com ret = nxt_fs_mkdir((const u_char *) dir, mode);
682207Sa.clayton@nginx.com }
692207Sa.clayton@nginx.com
702207Sa.clayton@nginx.com nxt_free(dir);
712207Sa.clayton@nginx.com
722207Sa.clayton@nginx.com return ret;
732207Sa.clayton@nginx.com }
742207Sa.clayton@nginx.com
752207Sa.clayton@nginx.com
761489St.nateldemoura@f5.com static nxt_int_t
nxt_fs_mkdir(const u_char * dir,mode_t mode)771489St.nateldemoura@f5.com nxt_fs_mkdir(const u_char *dir, mode_t mode)
781489St.nateldemoura@f5.com {
791489St.nateldemoura@f5.com if (nxt_fast_path(mkdir((const char *) dir, mode) == 0)) {
801489St.nateldemoura@f5.com return NXT_OK;
811489St.nateldemoura@f5.com }
821489St.nateldemoura@f5.com
831489St.nateldemoura@f5.com return NXT_ERROR;
841489St.nateldemoura@f5.com }
85