xref: /unit/src/nxt_fs.c (revision 2402:d750c9bd2c66)
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