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 30#include "libbb.h" 31 32/* Create the directory PATH with mode MODE, or the default if MODE is -1. 33 * Also create parent directories as necessary if flags contains 34 * FILEUTILS_RECUR. */ 35 36int make_directory (char *path, long mode, int flags) 37{ 38 if (!(flags & FILEUTILS_RECUR)) { 39 if (mkdir (path, 0777) < 0) { 40 perror_msg ("Cannot create directory `%s'", path); 41 return -1; 42 } 43 44 if (mode != -1 && chmod (path, mode) < 0) { 45 perror_msg ("Cannot set permissions of directory `%s'", path); 46 return -1; 47 } 48 } else { 49 struct stat st; 50 51 if (stat (path, &st) < 0 && errno == ENOENT) { 52 char *parent = dirname (path); 53 mode_t mask = umask (0); 54 umask (mask); 55 56 if (make_directory (parent, (0777 & ~mask) | 0300, 57 FILEUTILS_RECUR) < 0) 58 return -1; 59 free (parent); 60 61 if (make_directory (path, mode, 0) < 0) 62 return -1; 63 } 64 } 65 66 return 0; 67} 68