RE: Porting git to HP NonStop
- From
Joachim Schmitz <jojo@schmitz-digital.de>
- Date
- Aug 20, 2012, 10:22 UTC
- Message-ID
- <000601cd7ebd$a4ef5740$eece05c0$@schmitz-digital.de>
- In-Reply-To
- <7v628epzia.fsf@alter.siamese.dyndns.org>
Show 25 quoted lines
> From: Junio C Hamano [mailto:gitster@pobox.com] > Sent: Sunday, August 19, 2012 7:23 PM > To: Joachim Schmitz > Cc: 'Shawn Pearce'; git@vger.kernel.org; rsbecker@nexbridge.com > Subject: Re: Porting git to HP NonStop > > "Joachim Schmitz" <jojo@schmitz-digital.de> 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
Show 6 quoted lines
> > 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.
Show 24 quoted lines
> > 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.
Show 7 quoted lines
> 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