xref: /dflybsd-src/usr.bin/patch/mkpath.c (revision b94b84ca5c08efb447331811e050106ac4c7d3f1)
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