view src/lib/mkdir-parents.c @ 1545:9ce3f3f950c5 HEAD

Check for EISDIR error as well. Fixed problems with BSD/OS.
author Timo Sirainen <tss@iki.fi>
date Sat, 14 Jun 2003 20:22:02 +0300
parents 836c952e17ec
children 53428bbf212e
line wrap: on
line source

/* Copyright (c) 2003 Timo Sirainen */

#include "lib.h"
#include "mkdir-parents.h"

#include <sys/stat.h>

int mkdir_parents(const char *path, mode_t mode)
{
	const char *p;

	/* EISDIR check is for BSD/OS which returns it if path contains '/'
	   at the end and it exists. */
	if (mkdir(path, mode) < 0 && errno != EEXIST && errno != EISDIR) {
		if (errno != ENOENT)
			return -1;

		p = strrchr(path, '/');
		if (p == NULL || p == path)
			return -1; /* shouldn't happen */

		t_push();
		if (mkdir_parents(t_strdup_until(path, p), mode) < 0) {
			t_pop();
			return -1;
		}
		t_pop();

		/* should work now */
		if (mkdir(path, mode) < 0 && errno != EEXIST)
			return -1;
	}

	return 0;
}