X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fmakepath.c;h=4d647b5ef3160a5bcdd1cf8c80bdd7b51a1b3f34;hb=56f88f60ae60c1483a1ee5330d02a8251897f383;hp=98b78a1e658e69d7aa5b91107b69af45838ffe7a;hpb=26e411da187cbe2e67d334a9230f4836219c24e2;p=gnulib.git diff --git a/lib/makepath.c b/lib/makepath.c index 98b78a1e6..4d647b5ef 100644 --- a/lib/makepath.c +++ b/lib/makepath.c @@ -18,6 +18,17 @@ /* Written by David MacKenzie and Jim Meyering . */ +#ifdef HAVE_CONFIG_H +#if defined (CONFIG_BROKETS) +/* We use instead of "config.h" so that a compilation + using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h + (which it would do because it found this file in $srcdir). */ +#include +#else +#include "config.h" +#endif +#endif + #ifdef __GNUC__ #define alloca __builtin_alloca #else @@ -38,20 +49,34 @@ char *alloca (); #ifdef HAVE_UNISTD_H #include #endif + +#ifdef STAT_MACROS_BROKEN +#ifdef S_ISDIR +#undef S_ISDIR +#endif +#endif /* STAT_MACROS_BROKEN. */ + #if !defined(S_ISDIR) && defined(S_IFDIR) -#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif #ifdef STDC_HEADERS -#include #include -#else +#endif + +#ifdef HAVE_ERRNO_H +#include +#endif + +#ifndef STDC_HEADERS extern int errno; #endif -#if defined(USG) || defined(STDC_HEADERS) +#if defined(STDC_HEADERS) || defined(HAVE_STRING_H) #include +#ifndef index #define index strchr +#endif #else #include #endif @@ -93,7 +118,7 @@ make_path (argpath, mode, parent_mode, owner, group, verbose_fmt_string) int retval = 0; int oldmask = umask (0); - dirpath = alloca (strlen (argpath) + 1); + dirpath = (char *) alloca (strlen (argpath) + 1); strcpy (dirpath, argpath); if (stat (dirpath, &stats)) @@ -145,7 +170,7 @@ make_path (argpath, mode, parent_mode, owner, group, verbose_fmt_string) if (owner != (uid_t) -1 && group != (gid_t) -1 && chown (dirpath, owner, group) -#ifdef AFS +#if defined(AFS) && defined (EPERM) && errno != EPERM #endif ) @@ -181,7 +206,10 @@ make_path (argpath, mode, parent_mode, owner, group, verbose_fmt_string) /* We're done making leading directories. Make the final component of the path. */ - if (mkdir (dirpath, mode)) + /* The path could end in "/." or contain "/..", so test + if we really have to create the directory. */ + + if (stat (dirpath, &stats) && mkdir (dirpath, mode)) { error (0, errno, "cannot make directory `%s'", dirpath); umask (oldmask);