receive-pack: simplify keep_arg computation
[gitweb.git] / wrapper.c
index e4514634313c44354190e0c7e08a2b501aa0b098..6fcaa4dc62b504078ea5202cfd7a096e79a83c5e 100644 (file)
--- a/wrapper.c
+++ b/wrapper.c
@@ -621,19 +621,34 @@ char *xgetcwd(void)
        return strbuf_detach(&sb, NULL);
 }
 
-int write_file(const char *path, int fatal, const char *fmt, ...)
+int xsnprintf(char *dst, size_t max, const char *fmt, ...)
+{
+       va_list ap;
+       int len;
+
+       va_start(ap, fmt);
+       len = vsnprintf(dst, max, fmt, ap);
+       va_end(ap);
+
+       if (len < 0)
+               die("BUG: your snprintf is broken");
+       if (len >= max)
+               die("BUG: attempt to snprintf into too-small buffer");
+       return len;
+}
+
+static int write_file_v(const char *path, int fatal,
+                       const char *fmt, va_list params)
 {
        struct strbuf sb = STRBUF_INIT;
-       va_list params;
        int fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0666);
        if (fd < 0) {
                if (fatal)
                        die_errno(_("could not open %s for writing"), path);
                return -1;
        }
-       va_start(params, fmt);
        strbuf_vaddf(&sb, fmt, params);
-       va_end(params);
+       strbuf_complete_line(&sb);
        if (write_in_full(fd, sb.buf, sb.len) != sb.len) {
                int err = errno;
                close(fd);
@@ -652,6 +667,28 @@ int write_file(const char *path, int fatal, const char *fmt, ...)
        return 0;
 }
 
+int write_file(const char *path, const char *fmt, ...)
+{
+       int status;
+       va_list params;
+
+       va_start(params, fmt);
+       status = write_file_v(path, 1, fmt, params);
+       va_end(params);
+       return status;
+}
+
+int write_file_gently(const char *path, const char *fmt, ...)
+{
+       int status;
+       va_list params;
+
+       va_start(params, fmt);
+       status = write_file_v(path, 0, fmt, params);
+       va_end(params);
+       return status;
+}
+
 void sleep_millisec(int millisec)
 {
        poll(NULL, 0, millisec);