1*b94b84caSDaniel Fojt /*-
2*b94b84caSDaniel Fojt * SPDX-License-Identifier: BSD-3-Clause
3*b94b84caSDaniel Fojt *
49d62a0f9SSascha Wildner * Copyright (c) 1983, 1992, 1993
59d62a0f9SSascha Wildner * The Regents of the University of California. All rights reserved.
69d62a0f9SSascha Wildner *
79d62a0f9SSascha Wildner * Redistribution and use in source and binary forms, with or without
89d62a0f9SSascha Wildner * modification, are permitted provided that the following conditions
99d62a0f9SSascha Wildner * are met:
109d62a0f9SSascha Wildner * 1. Redistributions of source code must retain the above copyright
119d62a0f9SSascha Wildner * notice, this list of conditions and the following disclaimer.
129d62a0f9SSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright
139d62a0f9SSascha Wildner * notice, this list of conditions and the following disclaimer in the
149d62a0f9SSascha Wildner * documentation and/or other materials provided with the distribution.
159d62a0f9SSascha Wildner * 3. Neither the name of the University nor the names of its contributors
169d62a0f9SSascha Wildner * may be used to endorse or promote products derived from this software
179d62a0f9SSascha Wildner * without specific prior written permission.
189d62a0f9SSascha Wildner *
199d62a0f9SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
209d62a0f9SSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
219d62a0f9SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
229d62a0f9SSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
239d62a0f9SSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
249d62a0f9SSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
259d62a0f9SSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
269d62a0f9SSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
279d62a0f9SSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
289d62a0f9SSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
299d62a0f9SSascha Wildner * SUCH DAMAGE.
30*b94b84caSDaniel Fojt *
31*b94b84caSDaniel Fojt * $OpenBSD: mkpath.c,v 1.2 2005/06/20 07:14:06 otto Exp $
32*b94b84caSDaniel Fojt * $FreeBSD: head/usr.bin/patch/mkpath.c 326025 2017-11-20 19:49:47Z pfg $
339d62a0f9SSascha Wildner */
349d62a0f9SSascha Wildner
359d62a0f9SSascha Wildner #include <sys/types.h>
369d62a0f9SSascha Wildner #include <sys/stat.h>
379d62a0f9SSascha Wildner #include <err.h>
389d62a0f9SSascha Wildner #include <errno.h>
399d62a0f9SSascha Wildner #include <string.h>
409d62a0f9SSascha Wildner
419d62a0f9SSascha Wildner int mkpath(char *);
429d62a0f9SSascha Wildner
439d62a0f9SSascha Wildner /* Code taken directly from mkdir(1).
449d62a0f9SSascha Wildner
459d62a0f9SSascha Wildner * mkpath -- create directories.
469d62a0f9SSascha Wildner * path - path
479d62a0f9SSascha Wildner */
489d62a0f9SSascha Wildner int
mkpath(char * path)499d62a0f9SSascha Wildner mkpath(char *path)
509d62a0f9SSascha Wildner {
519d62a0f9SSascha Wildner struct stat sb;
529d62a0f9SSascha Wildner char *slash;
539d62a0f9SSascha Wildner int done = 0;
549d62a0f9SSascha Wildner
559d62a0f9SSascha Wildner slash = path;
569d62a0f9SSascha Wildner
579d62a0f9SSascha Wildner while (!done) {
589d62a0f9SSascha Wildner slash += strspn(slash, "/");
599d62a0f9SSascha Wildner slash += strcspn(slash, "/");
609d62a0f9SSascha Wildner
619d62a0f9SSascha Wildner done = (*slash == '\0');
629d62a0f9SSascha Wildner *slash = '\0';
639d62a0f9SSascha Wildner
649d62a0f9SSascha Wildner if (stat(path, &sb)) {
659d62a0f9SSascha Wildner if (errno != ENOENT || (mkdir(path, 0777) &&
669d62a0f9SSascha Wildner errno != EEXIST)) {
679d62a0f9SSascha Wildner warn("%s", path);
689d62a0f9SSascha Wildner return (-1);
699d62a0f9SSascha Wildner }
709d62a0f9SSascha Wildner } else if (!S_ISDIR(sb.st_mode)) {
719d62a0f9SSascha Wildner warnx("%s: %s", path, strerror(ENOTDIR));
729d62a0f9SSascha Wildner return (-1);
739d62a0f9SSascha Wildner }
749d62a0f9SSascha Wildner
759d62a0f9SSascha Wildner *slash = '/';
769d62a0f9SSascha Wildner }
779d62a0f9SSascha Wildner
789d62a0f9SSascha Wildner return (0);
799d62a0f9SSascha Wildner }
809d62a0f9SSascha Wildner
81