Commit 5eeb357d by Vicent Martí

Merge pull request #1355 from phkelley/development

Portability fixes for Solaris
parents 68fec637 6c72035f
...@@ -89,15 +89,16 @@ void giterr_set_str(int error_class, const char *string) ...@@ -89,15 +89,16 @@ void giterr_set_str(int error_class, const char *string)
int giterr_set_regex(const regex_t *regex, int error_code) int giterr_set_regex(const regex_t *regex, int error_code)
{ {
char error_buf[1024]; char error_buf[1024];
assert(error_code);
regerror(error_code, regex, error_buf, sizeof(error_buf)); regerror(error_code, regex, error_buf, sizeof(error_buf));
giterr_set_str(GITERR_REGEX, error_buf); giterr_set_str(GITERR_REGEX, error_buf);
if (error_code == REG_NOMATCH) if (error_code == REG_NOMATCH)
return GIT_ENOTFOUND; return GIT_ENOTFOUND;
else if (error_code > REG_BADPAT)
return GIT_EINVALIDSPEC; return GIT_EINVALIDSPEC;
else
return -1;
} }
void giterr_clear(void) void giterr_clear(void)
......
...@@ -300,25 +300,43 @@ int git_futils_mkdir( ...@@ -300,25 +300,43 @@ int git_futils_mkdir(
/* make directory */ /* make directory */
if (p_mkdir(make_path.ptr, mode) < 0) { if (p_mkdir(make_path.ptr, mode) < 0) {
if (errno == EEXIST) { int already_exists = 0;
if (!lastch && (flags & GIT_MKDIR_VERIFY_DIR) != 0) {
if (!git_path_isdir(make_path.ptr)) { switch (errno) {
case EEXIST:
if (!lastch && (flags & GIT_MKDIR_VERIFY_DIR) != 0 &&
!git_path_isdir(make_path.ptr)) {
giterr_set( giterr_set(
GITERR_OS, "Existing path is not a directory '%s'", GITERR_OS, "Existing path is not a directory '%s'",
make_path.ptr); make_path.ptr);
error = GIT_ENOTFOUND; error = GIT_ENOTFOUND;
goto fail; goto fail;
} }
}
if ((flags & GIT_MKDIR_EXCL) != 0) { already_exists = 1;
giterr_set(GITERR_OS, "Directory already exists '%s'", break;
case ENOSYS:
/* Solaris can generate this error if you try to mkdir
* a path which is already a mount point. In that case,
* the path does already exist; but it's not implied by
* the definition of the error, so let's recheck */
if (git_path_isdir(make_path.ptr)) {
already_exists = 1;
break;
}
/* Fall through */
errno = ENOSYS;
default:
giterr_set(GITERR_OS, "Failed to make directory '%s'",
make_path.ptr); make_path.ptr);
error = GIT_EEXISTS;
goto fail; goto fail;
} }
} else {
giterr_set(GITERR_OS, "Failed to make directory '%s'", if (already_exists && (flags & GIT_MKDIR_EXCL) != 0) {
giterr_set(GITERR_OS, "Directory already exists '%s'",
make_path.ptr); make_path.ptr);
error = GIT_EEXISTS;
goto fail; goto fail;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment