Commit 6c72035fbc9688d52ccee47f3efb24913fc20af9

Philip Kelley 2013-02-22T12:23:14

Portability fixes for Solaris

diff --git a/src/errors.c b/src/errors.c
index 3aa1757..c5f0b3b 100644
--- a/src/errors.c
+++ b/src/errors.c
@@ -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)
 {
 	char error_buf[1024];
+
+	assert(error_code);
+
 	regerror(error_code, regex, error_buf, sizeof(error_buf));
 	giterr_set_str(GITERR_REGEX, error_buf);
 
 	if (error_code == REG_NOMATCH)
 		return GIT_ENOTFOUND;
-	else if (error_code > REG_BADPAT)
-		return GIT_EINVALIDSPEC;
-	else
-		return -1;
+
+	return GIT_EINVALIDSPEC;
 }
 
 void giterr_clear(void)
diff --git a/src/fileops.c b/src/fileops.c
index 4ae9e3a..3531e75 100644
--- a/src/fileops.c
+++ b/src/fileops.c
@@ -300,25 +300,43 @@ int git_futils_mkdir(
 
 		/* make directory */
 		if (p_mkdir(make_path.ptr, mode) < 0) {
-			if (errno == EEXIST) {
-				if (!lastch && (flags & GIT_MKDIR_VERIFY_DIR) != 0) {
-					if (!git_path_isdir(make_path.ptr)) {
+			int already_exists = 0;
+
+			switch (errno) {
+				case EEXIST:
+					if (!lastch && (flags & GIT_MKDIR_VERIFY_DIR) != 0 &&
+						!git_path_isdir(make_path.ptr)) {
 						giterr_set(
 							GITERR_OS, "Existing path is not a directory '%s'",
 							make_path.ptr);
 						error = GIT_ENOTFOUND;
 						goto fail;
 					}
-				}
-				if ((flags & GIT_MKDIR_EXCL) != 0) {
-					giterr_set(GITERR_OS, "Directory already exists '%s'",
+
+					already_exists = 1;
+					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);
-					error = GIT_EEXISTS;
 					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);
+				error = GIT_EEXISTS;
 				goto fail;
 			}
 		}