Fourth batch
[gitweb.git] / wrapper.c
index 0542fc75821fdbdd7bfecebec5f7df01e49dcb0c..c55d7722d7be5a5933f2b662f685e6536357380e 100644 (file)
--- a/wrapper.c
+++ b/wrapper.c
@@ -2,12 +2,7 @@
  * Various trivial helper wrappers around standard functions
  */
 #include "cache.h"
-
-static void do_nothing(size_t size)
-{
-}
-
-static void (*try_to_free_routine)(size_t size) = do_nothing;
+#include "config.h"
 
 static int memory_limit_check(size_t size, int gentle)
 {
@@ -29,24 +24,11 @@ static int memory_limit_check(size_t size, int gentle)
        return 0;
 }
 
-try_to_free_t set_try_to_free_routine(try_to_free_t routine)
-{
-       try_to_free_t old = try_to_free_routine;
-       if (!routine)
-               routine = do_nothing;
-       try_to_free_routine = routine;
-       return old;
-}
-
 char *xstrdup(const char *str)
 {
        char *ret = strdup(str);
-       if (!ret) {
-               try_to_free_routine(strlen(str) + 1);
-               ret = strdup(str);
-               if (!ret)
-                       die("Out of memory, strdup failed");
-       }
+       if (!ret)
+               die("Out of memory, strdup failed");
        return ret;
 }
 
@@ -60,19 +42,13 @@ static void *do_xmalloc(size_t size, int gentle)
        if (!ret && !size)
                ret = malloc(1);
        if (!ret) {
-               try_to_free_routine(size);
-               ret = malloc(size);
-               if (!ret && !size)
-                       ret = malloc(1);
-               if (!ret) {
-                       if (!gentle)
-                               die("Out of memory, malloc failed (tried to allocate %lu bytes)",
-                                   (unsigned long)size);
-                       else {
-                               error("Out of memory, malloc failed (tried to allocate %lu bytes)",
-                                     (unsigned long)size);
-                               return NULL;
-                       }
+               if (!gentle)
+                       die("Out of memory, malloc failed (tried to allocate %lu bytes)",
+                           (unsigned long)size);
+               else {
+                       error("Out of memory, malloc failed (tried to allocate %lu bytes)",
+                             (unsigned long)size);
+                       return NULL;
                }
        }
 #ifdef XMALLOC_POISON
@@ -137,14 +113,8 @@ void *xrealloc(void *ptr, size_t size)
        ret = realloc(ptr, size);
        if (!ret && !size)
                ret = realloc(ptr, 1);
-       if (!ret) {
-               try_to_free_routine(size);
-               ret = realloc(ptr, size);
-               if (!ret && !size)
-                       ret = realloc(ptr, 1);
-               if (!ret)
-                       die("Out of memory, realloc failed");
-       }
+       if (!ret)
+               die("Out of memory, realloc failed");
        return ret;
 }
 
@@ -159,14 +129,8 @@ void *xcalloc(size_t nmemb, size_t size)
        ret = calloc(nmemb, size);
        if (!ret && (!nmemb || !size))
                ret = calloc(1, 1);
-       if (!ret) {
-               try_to_free_routine(nmemb * size);
-               ret = calloc(nmemb, size);
-               if (!ret && (!nmemb || !size))
-                       ret = calloc(1, 1);
-               if (!ret)
-                       die("Out of memory, calloc failed");
-       }
+       if (!ret)
+               die("Out of memory, calloc failed");
        return ret;
 }
 
@@ -418,21 +382,47 @@ FILE *fopen_for_writing(const char *path)
        return ret;
 }
 
-int xmkstemp(char *template)
+static void warn_on_inaccessible(const char *path)
+{
+       warning_errno(_("unable to access '%s'"), path);
+}
+
+int warn_on_fopen_errors(const char *path)
+{
+       if (errno != ENOENT && errno != ENOTDIR) {
+               warn_on_inaccessible(path);
+               return -1;
+       }
+
+       return 0;
+}
+
+FILE *fopen_or_warn(const char *path, const char *mode)
+{
+       FILE *fp = fopen(path, mode);
+
+       if (fp)
+               return fp;
+
+       warn_on_fopen_errors(path);
+       return NULL;
+}
+
+int xmkstemp(char *filename_template)
 {
        int fd;
        char origtemplate[PATH_MAX];
-       strlcpy(origtemplate, template, sizeof(origtemplate));
+       strlcpy(origtemplate, filename_template, sizeof(origtemplate));
 
-       fd = mkstemp(template);
+       fd = mkstemp(filename_template);
        if (fd < 0) {
                int saved_errno = errno;
                const char *nonrelative_template;
 
-               if (strlen(template) != strlen(origtemplate))
-                       template = origtemplate;
+               if (strlen(filename_template) != strlen(origtemplate))
+                       filename_template = origtemplate;
 
-               nonrelative_template = absolute_path(template);
+               nonrelative_template = absolute_path(filename_template);
                errno = saved_errno;
                die_errno("Unable to create temporary file '%s'",
                        nonrelative_template);
@@ -454,7 +444,7 @@ int git_mkstemps_mode(char *pattern, int suffix_len, int mode)
        static const int num_letters = 62;
        uint64_t value;
        struct timeval tv;
-       char *template;
+       char *filename_template;
        size_t len;
        int fd, count;
 
@@ -475,17 +465,17 @@ int git_mkstemps_mode(char *pattern, int suffix_len, int mode)
         * Try TMP_MAX different filenames.
         */
        gettimeofday(&tv, NULL);
-       value = ((size_t)(tv.tv_usec << 16)) ^ tv.tv_sec ^ getpid();
-       template = &pattern[len - 6 - suffix_len];
+       value = ((uint64_t)tv.tv_usec << 16) ^ tv.tv_sec ^ getpid();
+       filename_template = &pattern[len - 6 - suffix_len];
        for (count = 0; count < TMP_MAX; ++count) {
                uint64_t v = value;
                /* Fill in the random bits. */
-               template[0] = letters[v % num_letters]; v /= num_letters;
-               template[1] = letters[v % num_letters]; v /= num_letters;
-               template[2] = letters[v % num_letters]; v /= num_letters;
-               template[3] = letters[v % num_letters]; v /= num_letters;
-               template[4] = letters[v % num_letters]; v /= num_letters;
-               template[5] = letters[v % num_letters]; v /= num_letters;
+               filename_template[0] = letters[v % num_letters]; v /= num_letters;
+               filename_template[1] = letters[v % num_letters]; v /= num_letters;
+               filename_template[2] = letters[v % num_letters]; v /= num_letters;
+               filename_template[3] = letters[v % num_letters]; v /= num_letters;
+               filename_template[4] = letters[v % num_letters]; v /= num_letters;
+               filename_template[5] = letters[v % num_letters]; v /= num_letters;
 
                fd = open(pattern, O_CREAT | O_EXCL | O_RDWR, mode);
                if (fd >= 0)
@@ -514,21 +504,21 @@ int git_mkstemp_mode(char *pattern, int mode)
        return git_mkstemps_mode(pattern, 0, mode);
 }
 
-int xmkstemp_mode(char *template, int mode)
+int xmkstemp_mode(char *filename_template, int mode)
 {
        int fd;
        char origtemplate[PATH_MAX];
-       strlcpy(origtemplate, template, sizeof(origtemplate));
+       strlcpy(origtemplate, filename_template, sizeof(origtemplate));
 
-       fd = git_mkstemp_mode(template, mode);
+       fd = git_mkstemp_mode(filename_template, mode);
        if (fd < 0) {
                int saved_errno = errno;
                const char *nonrelative_template;
 
-               if (!template[0])
-                       template = origtemplate;
+               if (!filename_template[0])
+                       filename_template = origtemplate;
 
-               nonrelative_template = absolute_path(template);
+               nonrelative_template = absolute_path(filename_template);
                errno = saved_errno;
                die_errno("Unable to create temporary file '%s'",
                        nonrelative_template);
@@ -542,7 +532,7 @@ static int warn_if_unremovable(const char *op, const char *file, int rc)
        if (!rc || errno == ENOENT)
                return 0;
        err = errno;
-       warning_errno("unable to %s %s", op, file);
+       warning_errno("unable to %s '%s'", op, file);
        errno = err;
        return rc;
 }
@@ -556,7 +546,7 @@ int unlink_or_msg(const char *file, struct strbuf *err)
        if (!rc || errno == ENOENT)
                return 0;
 
-       strbuf_addf(err, "unable to unlink %s: %s",
+       strbuf_addf(err, "unable to unlink '%s': %s",
                    file, strerror(errno));
        return -1;
 }
@@ -576,15 +566,10 @@ int remove_or_warn(unsigned int mode, const char *file)
        return S_ISGITLINK(mode) ? rmdir_or_warn(file) : unlink_or_warn(file);
 }
 
-void warn_on_inaccessible(const char *path)
-{
-       warning_errno(_("unable to access '%s'"), path);
-}
-
 static int access_error_is_ok(int err, unsigned flag)
 {
-       return err == ENOENT || err == ENOTDIR ||
-               ((flag & ACCESS_EACCES_OK) && err == EACCES);
+       return (is_missing_file_error(err) ||
+               ((flag & ACCESS_EACCES_OK) && err == EACCES));
 }
 
 int access_or_warn(const char *path, int mode, unsigned flag)
@@ -621,19 +606,19 @@ int xsnprintf(char *dst, size_t max, const char *fmt, ...)
        va_end(ap);
 
        if (len < 0)
-               die("BUG: your snprintf is broken");
+               BUG("your snprintf is broken");
        if (len >= max)
-               die("BUG: attempt to snprintf into too-small buffer");
+               BUG("attempt to snprintf into too-small buffer");
        return len;
 }
 
 void write_file_buf(const char *path, const char *buf, size_t len)
 {
        int fd = xopen(path, O_WRONLY | O_CREAT | O_TRUNC, 0666);
-       if (write_in_full(fd, buf, len) != len)
-               die_errno(_("could not write to %s"), path);
+       if (write_in_full(fd, buf, len) < 0)
+               die_errno(_("could not write to '%s'"), path);
        if (close(fd))
-               die_errno(_("could not close %s"), path);
+               die_errno(_("could not close '%s'"), path);
 }
 
 void write_file(const char *path, const char *fmt, ...)
@@ -655,3 +640,29 @@ void sleep_millisec(int millisec)
 {
        poll(NULL, 0, millisec);
 }
+
+int xgethostname(char *buf, size_t len)
+{
+       /*
+        * If the full hostname doesn't fit in buf, POSIX does not
+        * specify whether the buffer will be null-terminated, so to
+        * be safe, do it ourselves.
+        */
+       int ret = gethostname(buf, len);
+       if (!ret)
+               buf[len - 1] = 0;
+       return ret;
+}
+
+int is_empty_or_missing_file(const char *filename)
+{
+       struct stat st;
+
+       if (stat(filename, &st) < 0) {
+               if (errno == ENOENT)
+                       return 1;
+               die_errno(_("could not stat %s"), filename);
+       }
+
+       return !st.st_size;
+}