> From: Junio C Hamano [mailto:gitster@xxxxxxxxx] > Sent: Sunday, August 19, 2012 7:23 PM > To: Joachim Schmitz > Cc: 'Shawn Pearce'; git@xxxxxxxxxxxxxxx; rsbecker@xxxxxxxxxxxxx > Subject: Re: Porting git to HP NonStop > > "Joachim Schmitz" <jojo@xxxxxxxxxxxxxxxxxx> writes: > > > Found the problem: our mkdir(dir,flags) fails with ENOENT when dir > > ends with a '/'. > > Not sure whether this us a bug on out platform or just allowed by > > POSIX and as such a wrong assumption in git though? > > > > [shortly after] > > A bit of googleing revealed that there is a GNUlib solution for this, > > which claims that at least NetBSD 1.5.2 has the same problem. > > (http://www.opensource.apple.com/source/gpatch/gpatch-2/patch/mkdir.c) > > > > And apparently this has been discussed on the git mailing list too, 2 > > years > > ago: > > http://lists-archives.com/git/728359-git-s-use-of-mkdir-2.html, > > there's a patch too. > > Given that newer BSDs have fixed libc to accept directory name with a trailing > slash, and that we use mkdir(2) in many places, I think the right way to do so is > still what I suggested in that old thread in the last paragraph of my message > > http://thread.gmane.org/gmane.comp.version- > control.git/155812/focus=155876 > > That is, have compat/tandem.c and define a replacement mkdir(2) in a way > similar to how MinGW does so. OK, I'll go for a compat/mkdir.c though. We shouldn't call it tandem.c as Tandem, the Company, doesn't exist anymore and since more than a decade (bough by Compaq, then HP), only the __TANDEM survived in our compiler and headers/libraries. Could call it NonStop.c, but I don't really like that idea either, I'd rather keep it more generic, just in case someone else might need it too, or that issue someday gets fixed for NonStop. > > For now I've fixed it like this: > > /usr/local/bin/diff -EBbu ./builtin/init-db.c.orig ./builtin/init-db.c > > --- ./builtin/init-db.c.orig 2012-08-19 03:55:50 -0500 > > +++ ./builtin/init-db.c 2012-08-19 03:39:57 -0500 > > @@ -25,7 +25,16 @@ > > > > static void safe_create_dir(const char *dir, int share) { > > +#ifdef __TANDEM /* our mkdir() can't cope with a trailing '/' */ > > + char mydir[PATH_MAX]; > > + > > + strcpy(mydir,dir); > > + if (dir[strlen(dir)-1] == '/') > > + mydir[strlen(dir)-1] = '\0'; > > + if (mkdir(mydir, 0777) < 0) { > > +#else > > if (mkdir(dir, 0777) < 0) { > > +#endif > > Move that part inside #ifdef __TANDEM to define > > int tandem_mkdir(const char *dir, mode_t mode) > { > ... > } I'll go for git_mkdir(), similar to other git wrappers, (like for mmap, pread, fopen, snprintf, vsnprintf, qsort). Could call it gitmkdir() too (like for basename, setenv, mkdtemp, mkstemps, unsetenv, strcasestr, strlcpy, strtoumax, strtoimax, strtok_r, hstrerror, memmem, strchrnul, memcpy), Opinions? It seems the ones without the "_" are for missing APIs and the ones with "_" to wrap existing APIs (not sure about mmap and pread)? Here it's current state: $ cat compat/mkdir.c #include "../git-compat-util.h" #undef mkdir /* for platforms that can't deal with a trailing '/' */ int git_mkdir(const char *dir, mode_t mode) { int retval; char *tmp_dir = NULL; size_t len = strlen(dir); if (len && dir[len-1] == '/') { if ((tmp_dir = strdup(dir)) == NULL) return -1; tmp_dir[len-1] = '\0'; } else tmp_dir = (char *)dir; retval = mkdir(tmp_dir, mode); if (tmp_dir != dir) free(tmp_dir); return retval; } $ There is room for improvement though: it only removes one trailing slash. By far not as advanced and generic as GNUlib's mkdir wrapper, but should be good enough for git's usage. > in your new file compat/tandem.c, add > > #ifdef __TANDEM > #define mkdir(a,b) tandem_mkdir((a), (b)) > #endif > > to git-compat-util.h Again, git_mkdir, see above > and then add compat/tandem.o to COMPAT_OBJS in the > top-level Makefile. For now I've added it to the (new) NOSTOP_KERNEL section. We may want it to go along with some MKDIR_DISLIKES_TRAILING_SLASH or MKDIR_BOGUS_TRAILING_SLASH some such. Opinions, Ideas? > That way we do not have to keep an ugly platform specific ifdef in the very > generic codepath. Agreed, it was my quick and dirty fix for it. Bye, Jojo -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html