File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / pimd / libite / makepath.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 14 09:12:58 2017 UTC (7 years, 3 months ago) by misho
Branches: pimd, MAIN
CVS tags: v2_3_2, HEAD
libite

    1: /* mkpath() -- Create all components leading up to a given directory
    2:  *
    3:  * Copyright (c) 2013  Joachim Nilsson <troglobit@gmail.com>
    4:  *
    5:  * Permission to use, copy, modify, and/or distribute this software for any
    6:  * purpose with or without fee is hereby granted, provided that the above
    7:  * copyright notice and this permission notice appear in all copies.
    8:  *
    9:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   10:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   11:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   12:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   13:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   14:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   15:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   16:  */
   17: 
   18: #include <errno.h>
   19: #include <libgen.h>
   20: #include <limits.h>
   21: #include <stdlib.h>
   22: #include <string.h>
   23: #include <sys/stat.h>
   24: #include <sys/types.h>
   25: 
   26: int mkpath(char *dir, mode_t mode)
   27: {
   28: 	if (!dir) {
   29: 		errno = EINVAL;
   30: 		return 1;
   31: 	}
   32: 
   33: 	if (strlen(dir) == 1 && dir[0] == '/')
   34: 		return 0;
   35: 
   36: 	mkpath(dirname(strdupa(dir)), mode);
   37: 
   38: 	return mkdir(dir, mode);
   39: }
   40: 
   41: /**
   42:  * makepath - Create all components of the specified directory.
   43:  * @dir: Directory to create.
   44:  *
   45:  * Returns:
   46:  * POSIX OK (0) on success, otherwise -1 and errno set appropriately.
   47:  * This function returns EINVAL on bad argument, or ENOMEM when it
   48:  * fails allocating temporary memory.  For other error codes see the
   49:  * mkdir() syscall description.
   50:  */
   51: int makepath(char *dir)
   52: {
   53: 	return mkpath(dir, 0777);
   54: }
   55: 
   56: /********************************* UNIT TESTS ************************************/
   57: #ifdef UNITTEST
   58: #include "lite.h"
   59: 
   60: int checkpath(char *dir)
   61: {
   62: 	char tmp[256];
   63: 	struct stat sb;
   64: 
   65: 	snprintf(tmp, sizeof(tmp), "ls -ld %s", dir);
   66: 	if (system(tmp))
   67: 		perror("system");
   68: 
   69: 	if (!stat(dir, &sb) && S_ISDIR(sb.st_mode))
   70: 		return 0;
   71: 
   72: 	errno = ENOTDIR;
   73: 	return 1;
   74: }
   75: 
   76: int test_makepath(char *dir)
   77: {
   78: 	int ret = makepath(dir);
   79: 
   80: 	if (!ret)
   81: 		ret = checkpath(dir);
   82: 	if (ret)
   83: 		perror("Failed");
   84: 
   85: 	return ret;
   86: }
   87: 
   88: int main(void)
   89: {
   90: 	int i, ret = 0;
   91: 	char *list[] = {
   92: 		"/tmp/tok/",
   93: 		"/tmp/tok2",
   94: 		"/tmp/ab",
   95: 		"/tmp/b",
   96: 		"/tmp/a/",
   97: 		"/tmp/a/b",
   98: 		"/tmp/a/c/",
   99: 		NULL
  100: 	};
  101: 
  102: 	for (i = 0; list[i]; i++)
  103: 		rmdir(list[i]);
  104: 
  105: 	printf("Testing makepath() ...\n");
  106: 	for (i = 0; list[i] && !ret; i++)
  107: 		ret = test_makepath(list[i]);
  108: 
  109: 	printf("\nCleaning up ...\n");
  110: 	for (i = 0; list[i]; i++)
  111: 		rmdir(list[i]);
  112: 
  113: 	return ret;
  114: }
  115: #endif  /* UNITTEST */
  116: 
  117: /**
  118:  * Local Variables:
  119:  *  compile-command: "make V=1 -f makepath.mk"
  120:  *  version-control: t
  121:  *  indent-tabs-mode: t
  122:  *  c-file-style: "linux"
  123:  * End:
  124:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>