• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/opkg-lede/libbb/make_directory.c

  1 /* vi: set sw=4 ts=4: */
  2 /*
  3  * Mini make_directory implementation for busybox
  4  *
  5  * Copyright (C) 2001  Matt Kraai.
  6  *
  7  * This program is free software; you can redistribute it and/or modify
  8  * it under the terms of the GNU General Public License as published by
  9  * the Free Software Foundation; either version 2 of the License, or
 10  * (at your option) any later version.
 11  *
 12  * This program is distributed in the hope that it will be useful,
 13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 15  * General Public License for more details.
 16  *
 17  * You should have received a copy of the GNU General Public License
 18  * along with this program; if not, write to the Free Software
 19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 20  *
 21  */
 22 
 23 #include <errno.h>
 24 #include <fcntl.h>
 25 #include <sys/stat.h>
 26 #include <sys/types.h>
 27 #include <unistd.h>
 28 #include <stdlib.h>
 29 #include <libgen.h>
 30 
 31 #include "libbb.h"
 32 
 33 /* Create the directory PATH with mode MODE, or the default if MODE is -1.
 34  * Also create parent directories as necessary if flags contains
 35  * FILEUTILS_RECUR.  */
 36 
 37 int make_directory(const char *path, long mode, int flags)
 38 {
 39         if (!(flags & FILEUTILS_RECUR)) {
 40                 if (mkdir(path, 0777) < 0) {
 41                         perror_msg("Cannot create directory `%s'", path);
 42                         return -1;
 43                 }
 44 
 45                 if (mode != -1 && chmod(path, mode) < 0) {
 46                         perror_msg("Cannot set permissions of directory `%s'",
 47                                    path);
 48                         return -1;
 49                 }
 50         } else {
 51                 struct stat st;
 52 
 53                 if (stat(path, &st) < 0 && errno == ENOENT) {
 54                         int status;
 55                         char *pathcopy, *parent, *parentcopy;
 56                         mode_t mask;
 57 
 58                         mask = umask(0);
 59                         umask(mask);
 60 
 61                         /* dirname is unsafe, it may both modify the
 62                            memory of the path argument and may return
 63                            a pointer to static memory, which can then
 64                            be modified by consequtive calls to dirname */
 65 
 66                         pathcopy = xstrdup(path);
 67                         parent = dirname(pathcopy);
 68                         parentcopy = xstrdup(parent);
 69                         status = make_directory(parentcopy, (0777 & ~mask)
 70                                                 | 0300, FILEUTILS_RECUR);
 71                         free(pathcopy);
 72                         free(parentcopy);
 73 
 74                         if (status < 0 || make_directory(path, mode, 0) < 0)
 75                                 return -1;
 76                 }
 77         }
 78 
 79         return 0;
 80 }
 81 

This page was automatically generated by LXR 0.3.1.  •  OpenWrt