> From: Junio C Hamano [mailto:gitster@xxxxxxxxx] > Sent: Wednesday, August 22, 2012 8:25 PM > To: Joachim Schmitz > Cc: 'Brandon Casey'; 'Shawn Pearce'; git@xxxxxxxxxxxxxxx; > rsbecker@xxxxxxxxxxxxx > Subject: Re: Porting git to HP NonStop > > "Joachim Schmitz" <jojo@xxxxxxxxxxxxxxxxxx> writes: > > >> Nice. And we have xmemdupz() would be even better as you followed-up. > > > > How's that one used? > > I forgot that we frown upon use of any x<allocate>() wrapper in the compat/ > layer as J6t mentioned. > > So probably something along these lines... > > int retval; > char *dir_to_free = NULL; > size_t len = strlen(dir); > > if (len && dir[len - 1] == '/') { > dir_to_free = malloc(len); > if (!dir_to_free) { > fprintf(stderr, "malloc failed!\n"); > exit(1); > } > memcpy(dir_to_free, dir, len - 1); > dir_to_free[len - 1] = '\0'; > dir = dir_to_free; > } > retval = mkdir(dir, mode); > free(dir_to_free); > return retval; So why not just strdup? I stole the idea from gnulib... int rpl_mkdir (char const *dir, mode_t mode maybe_unused) { int ret_val; char *tmp_dir; size_t len = strlen (dir); if (len && dir[len - 1] == '/') { tmp_dir = strdup (dir); if (!tmp_dir) { /* Rather than rely on strdup-posix, we set errno ourselves. */ errno = ENOMEM; return -1; } strip_trailing_slashes (tmp_dir); } else { tmp_dir = (char *) dir; } They strip more than one trailing slash, but for git's purpose I believed this to be too much overhead. Also the errno stuff doesn't seem to be really needed IMHO. Same for the following code #if FUNC_MKDIR_DOT_BUG /* Additionally, cygwin 1.5 mistakenly creates a directory "d/./". */ { char *last = last_component (tmp_dir); if (*last == '.' && (last[1] == '\0' || (last[1] == '.' && last[2] == '\0'))) { struct stat st; if (stat (tmp_dir, &st) == 0) errno = EEXIST; return -1; } } #endif /* FUNC_MKDIR_DOT_BUG */ Then it goes on like mine: ret_val = mkdir (tmp_dir, mode); if (tmp_dir != dir) free (tmp_dir); return ret_val; } Compare: $ cat compat/mkdir.c #include "../git-compat-util.h" #undef mkdir /* for platforms that can't deal with a trailing '/' */ int compat_mkdir_wo_trailing_slash(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; } 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