githooks documentation: add a note about the +x mode
[gitweb.git] / path.c
diff --git a/path.c b/path.c
index 85ab28a0f1f0ff6276c587ec6d5be7716d8e0c83..a074aea64921eb1fb90f079ede9087e6b8109f6a 100644 (file)
--- a/path.c
+++ b/path.c
@@ -41,16 +41,15 @@ char *mksnpath(char *buf, size_t n, const char *fmt, ...)
        len = vsnprintf(buf, n, fmt, args);
        va_end(args);
        if (len >= n) {
-               snprintf(buf, n, bad_path);
+               strlcpy(buf, bad_path, n);
                return buf;
        }
        return cleanup_path(buf);
 }
 
-char *git_snpath(char *buf, size_t n, const char *fmt, ...)
+static char *git_vsnpath(char *buf, size_t n, const char *fmt, va_list args)
 {
        const char *git_dir = get_git_dir();
-       va_list args;
        size_t len;
 
        len = strlen(git_dir);
@@ -59,17 +58,34 @@ char *git_snpath(char *buf, size_t n, const char *fmt, ...)
        memcpy(buf, git_dir, len);
        if (len && !is_dir_sep(git_dir[len-1]))
                buf[len++] = '/';
-       va_start(args, fmt);
        len += vsnprintf(buf + len, n - len, fmt, args);
-       va_end(args);
        if (len >= n)
                goto bad;
        return cleanup_path(buf);
 bad:
-       snprintf(buf, n, bad_path);
+       strlcpy(buf, bad_path, n);
+       return buf;
+}
+
+char *git_snpath(char *buf, size_t n, const char *fmt, ...)
+{
+       va_list args;
+       va_start(args, fmt);
+       (void)git_vsnpath(buf, n, fmt, args);
+       va_end(args);
        return buf;
 }
 
+char *git_pathdup(const char *fmt, ...)
+{
+       char path[PATH_MAX];
+       va_list args;
+       va_start(args, fmt);
+       (void)git_vsnpath(path, sizeof(path), fmt, args);
+       va_end(args);
+       return xstrdup(path);
+}
+
 char *mkpath(const char *fmt, ...)
 {
        va_list args;
@@ -386,7 +402,7 @@ int normalize_absolute_path(char *buf, const char *path)
                        goto next;
                }
 
-               memcpy(dst, comp_start, comp_len);
+               memmove(dst, comp_start, comp_len);
                dst += comp_len;
        next:
                comp_start = comp_end;