Annotation of embedaddon/pimd/libite/makepath.c, revision 1.1
1.1 ! misho 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>