Merge branch 'pb/log-rev-list-doc' into master
[git] / wrapper.c
1 /*
2  * Various trivial helper wrappers around standard functions
3  */
4 #include "cache.h"
5 #include "config.h"
6
7 static int memory_limit_check(size_t size, int gentle)
8 {
9         static size_t limit = 0;
10         if (!limit) {
11                 limit = git_env_ulong("GIT_ALLOC_LIMIT", 0);
12                 if (!limit)
13                         limit = SIZE_MAX;
14         }
15         if (size > limit) {
16                 if (gentle) {
17                         error("attempting to allocate %"PRIuMAX" over limit %"PRIuMAX,
18                               (uintmax_t)size, (uintmax_t)limit);
19                         return -1;
20                 } else
21                         die("attempting to allocate %"PRIuMAX" over limit %"PRIuMAX,
22                             (uintmax_t)size, (uintmax_t)limit);
23         }
24         return 0;
25 }
26
27 char *xstrdup(const char *str)
28 {
29         char *ret = strdup(str);
30         if (!ret)
31                 die("Out of memory, strdup failed");
32         return ret;
33 }
34
35 static void *do_xmalloc(size_t size, int gentle)
36 {
37         void *ret;
38
39         if (memory_limit_check(size, gentle))
40                 return NULL;
41         ret = malloc(size);
42         if (!ret && !size)
43                 ret = malloc(1);
44         if (!ret) {
45                 if (!gentle)
46                         die("Out of memory, malloc failed (tried to allocate %lu bytes)",
47                             (unsigned long)size);
48                 else {
49                         error("Out of memory, malloc failed (tried to allocate %lu bytes)",
50                               (unsigned long)size);
51                         return NULL;
52                 }
53         }
54 #ifdef XMALLOC_POISON
55         memset(ret, 0xA5, size);
56 #endif
57         return ret;
58 }
59
60 void *xmalloc(size_t size)
61 {
62         return do_xmalloc(size, 0);
63 }
64
65 static void *do_xmallocz(size_t size, int gentle)
66 {
67         void *ret;
68         if (unsigned_add_overflows(size, 1)) {
69                 if (gentle) {
70                         error("Data too large to fit into virtual memory space.");
71                         return NULL;
72                 } else
73                         die("Data too large to fit into virtual memory space.");
74         }
75         ret = do_xmalloc(size + 1, gentle);
76         if (ret)
77                 ((char*)ret)[size] = 0;
78         return ret;
79 }
80
81 void *xmallocz(size_t size)
82 {
83         return do_xmallocz(size, 0);
84 }
85
86 void *xmallocz_gently(size_t size)
87 {
88         return do_xmallocz(size, 1);
89 }
90
91 /*
92  * xmemdupz() allocates (len + 1) bytes of memory, duplicates "len" bytes of
93  * "data" to the allocated memory, zero terminates the allocated memory,
94  * and returns a pointer to the allocated memory. If the allocation fails,
95  * the program dies.
96  */
97 void *xmemdupz(const void *data, size_t len)
98 {
99         return memcpy(xmallocz(len), data, len);
100 }
101
102 char *xstrndup(const char *str, size_t len)
103 {
104         char *p = memchr(str, '\0', len);
105         return xmemdupz(str, p ? p - str : len);
106 }
107
108 int xstrncmpz(const char *s, const char *t, size_t len)
109 {
110         int res = strncmp(s, t, len);
111         if (res)
112                 return res;
113         return s[len] == '\0' ? 0 : 1;
114 }
115
116 void *xrealloc(void *ptr, size_t size)
117 {
118         void *ret;
119
120         memory_limit_check(size, 0);
121         ret = realloc(ptr, size);
122         if (!ret && !size)
123                 ret = realloc(ptr, 1);
124         if (!ret)
125                 die("Out of memory, realloc failed");
126         return ret;
127 }
128
129 void *xcalloc(size_t nmemb, size_t size)
130 {
131         void *ret;
132
133         if (unsigned_mult_overflows(nmemb, size))
134                 die("data too large to fit into virtual memory space");
135
136         memory_limit_check(size * nmemb, 0);
137         ret = calloc(nmemb, size);
138         if (!ret && (!nmemb || !size))
139                 ret = calloc(1, 1);
140         if (!ret)
141                 die("Out of memory, calloc failed");
142         return ret;
143 }
144
145 /*
146  * Limit size of IO chunks, because huge chunks only cause pain.  OS X
147  * 64-bit is buggy, returning EINVAL if len >= INT_MAX; and even in
148  * the absence of bugs, large chunks can result in bad latencies when
149  * you decide to kill the process.
150  *
151  * We pick 8 MiB as our default, but if the platform defines SSIZE_MAX
152  * that is smaller than that, clip it to SSIZE_MAX, as a call to
153  * read(2) or write(2) larger than that is allowed to fail.  As the last
154  * resort, we allow a port to pass via CFLAGS e.g. "-DMAX_IO_SIZE=value"
155  * to override this, if the definition of SSIZE_MAX given by the platform
156  * is broken.
157  */
158 #ifndef MAX_IO_SIZE
159 # define MAX_IO_SIZE_DEFAULT (8*1024*1024)
160 # if defined(SSIZE_MAX) && (SSIZE_MAX < MAX_IO_SIZE_DEFAULT)
161 #  define MAX_IO_SIZE SSIZE_MAX
162 # else
163 #  define MAX_IO_SIZE MAX_IO_SIZE_DEFAULT
164 # endif
165 #endif
166
167 /**
168  * xopen() is the same as open(), but it die()s if the open() fails.
169  */
170 int xopen(const char *path, int oflag, ...)
171 {
172         mode_t mode = 0;
173         va_list ap;
174
175         /*
176          * va_arg() will have undefined behavior if the specified type is not
177          * compatible with the argument type. Since integers are promoted to
178          * ints, we fetch the next argument as an int, and then cast it to a
179          * mode_t to avoid undefined behavior.
180          */
181         va_start(ap, oflag);
182         if (oflag & O_CREAT)
183                 mode = va_arg(ap, int);
184         va_end(ap);
185
186         for (;;) {
187                 int fd = open(path, oflag, mode);
188                 if (fd >= 0)
189                         return fd;
190                 if (errno == EINTR)
191                         continue;
192
193                 if ((oflag & O_RDWR) == O_RDWR)
194                         die_errno(_("could not open '%s' for reading and writing"), path);
195                 else if ((oflag & O_WRONLY) == O_WRONLY)
196                         die_errno(_("could not open '%s' for writing"), path);
197                 else
198                         die_errno(_("could not open '%s' for reading"), path);
199         }
200 }
201
202 static int handle_nonblock(int fd, short poll_events, int err)
203 {
204         struct pollfd pfd;
205
206         if (err != EAGAIN && err != EWOULDBLOCK)
207                 return 0;
208
209         pfd.fd = fd;
210         pfd.events = poll_events;
211
212         /*
213          * no need to check for errors, here;
214          * a subsequent read/write will detect unrecoverable errors
215          */
216         poll(&pfd, 1, -1);
217         return 1;
218 }
219
220 /*
221  * xread() is the same a read(), but it automatically restarts read()
222  * operations with a recoverable error (EAGAIN and EINTR). xread()
223  * DOES NOT GUARANTEE that "len" bytes is read even if the data is available.
224  */
225 ssize_t xread(int fd, void *buf, size_t len)
226 {
227         ssize_t nr;
228         if (len > MAX_IO_SIZE)
229                 len = MAX_IO_SIZE;
230         while (1) {
231                 nr = read(fd, buf, len);
232                 if (nr < 0) {
233                         if (errno == EINTR)
234                                 continue;
235                         if (handle_nonblock(fd, POLLIN, errno))
236                                 continue;
237                 }
238                 return nr;
239         }
240 }
241
242 /*
243  * xwrite() is the same a write(), but it automatically restarts write()
244  * operations with a recoverable error (EAGAIN and EINTR). xwrite() DOES NOT
245  * GUARANTEE that "len" bytes is written even if the operation is successful.
246  */
247 ssize_t xwrite(int fd, const void *buf, size_t len)
248 {
249         ssize_t nr;
250         if (len > MAX_IO_SIZE)
251                 len = MAX_IO_SIZE;
252         while (1) {
253                 nr = write(fd, buf, len);
254                 if (nr < 0) {
255                         if (errno == EINTR)
256                                 continue;
257                         if (handle_nonblock(fd, POLLOUT, errno))
258                                 continue;
259                 }
260
261                 return nr;
262         }
263 }
264
265 /*
266  * xpread() is the same as pread(), but it automatically restarts pread()
267  * operations with a recoverable error (EAGAIN and EINTR). xpread() DOES
268  * NOT GUARANTEE that "len" bytes is read even if the data is available.
269  */
270 ssize_t xpread(int fd, void *buf, size_t len, off_t offset)
271 {
272         ssize_t nr;
273         if (len > MAX_IO_SIZE)
274                 len = MAX_IO_SIZE;
275         while (1) {
276                 nr = pread(fd, buf, len, offset);
277                 if ((nr < 0) && (errno == EAGAIN || errno == EINTR))
278                         continue;
279                 return nr;
280         }
281 }
282
283 ssize_t read_in_full(int fd, void *buf, size_t count)
284 {
285         char *p = buf;
286         ssize_t total = 0;
287
288         while (count > 0) {
289                 ssize_t loaded = xread(fd, p, count);
290                 if (loaded < 0)
291                         return -1;
292                 if (loaded == 0)
293                         return total;
294                 count -= loaded;
295                 p += loaded;
296                 total += loaded;
297         }
298
299         return total;
300 }
301
302 ssize_t write_in_full(int fd, const void *buf, size_t count)
303 {
304         const char *p = buf;
305         ssize_t total = 0;
306
307         while (count > 0) {
308                 ssize_t written = xwrite(fd, p, count);
309                 if (written < 0)
310                         return -1;
311                 if (!written) {
312                         errno = ENOSPC;
313                         return -1;
314                 }
315                 count -= written;
316                 p += written;
317                 total += written;
318         }
319
320         return total;
321 }
322
323 ssize_t pread_in_full(int fd, void *buf, size_t count, off_t offset)
324 {
325         char *p = buf;
326         ssize_t total = 0;
327
328         while (count > 0) {
329                 ssize_t loaded = xpread(fd, p, count, offset);
330                 if (loaded < 0)
331                         return -1;
332                 if (loaded == 0)
333                         return total;
334                 count -= loaded;
335                 p += loaded;
336                 total += loaded;
337                 offset += loaded;
338         }
339
340         return total;
341 }
342
343 int xdup(int fd)
344 {
345         int ret = dup(fd);
346         if (ret < 0)
347                 die_errno("dup failed");
348         return ret;
349 }
350
351 /**
352  * xfopen() is the same as fopen(), but it die()s if the fopen() fails.
353  */
354 FILE *xfopen(const char *path, const char *mode)
355 {
356         for (;;) {
357                 FILE *fp = fopen(path, mode);
358                 if (fp)
359                         return fp;
360                 if (errno == EINTR)
361                         continue;
362
363                 if (*mode && mode[1] == '+')
364                         die_errno(_("could not open '%s' for reading and writing"), path);
365                 else if (*mode == 'w' || *mode == 'a')
366                         die_errno(_("could not open '%s' for writing"), path);
367                 else
368                         die_errno(_("could not open '%s' for reading"), path);
369         }
370 }
371
372 FILE *xfdopen(int fd, const char *mode)
373 {
374         FILE *stream = fdopen(fd, mode);
375         if (stream == NULL)
376                 die_errno("Out of memory? fdopen failed");
377         return stream;
378 }
379
380 FILE *fopen_for_writing(const char *path)
381 {
382         FILE *ret = fopen(path, "w");
383
384         if (!ret && errno == EPERM) {
385                 if (!unlink(path))
386                         ret = fopen(path, "w");
387                 else
388                         errno = EPERM;
389         }
390         return ret;
391 }
392
393 static void warn_on_inaccessible(const char *path)
394 {
395         warning_errno(_("unable to access '%s'"), path);
396 }
397
398 int warn_on_fopen_errors(const char *path)
399 {
400         if (errno != ENOENT && errno != ENOTDIR) {
401                 warn_on_inaccessible(path);
402                 return -1;
403         }
404
405         return 0;
406 }
407
408 FILE *fopen_or_warn(const char *path, const char *mode)
409 {
410         FILE *fp = fopen(path, mode);
411
412         if (fp)
413                 return fp;
414
415         warn_on_fopen_errors(path);
416         return NULL;
417 }
418
419 int xmkstemp(char *filename_template)
420 {
421         int fd;
422         char origtemplate[PATH_MAX];
423         strlcpy(origtemplate, filename_template, sizeof(origtemplate));
424
425         fd = mkstemp(filename_template);
426         if (fd < 0) {
427                 int saved_errno = errno;
428                 const char *nonrelative_template;
429
430                 if (strlen(filename_template) != strlen(origtemplate))
431                         filename_template = origtemplate;
432
433                 nonrelative_template = absolute_path(filename_template);
434                 errno = saved_errno;
435                 die_errno("Unable to create temporary file '%s'",
436                         nonrelative_template);
437         }
438         return fd;
439 }
440
441 /* Adapted from libiberty's mkstemp.c. */
442
443 #undef TMP_MAX
444 #define TMP_MAX 16384
445
446 int git_mkstemps_mode(char *pattern, int suffix_len, int mode)
447 {
448         static const char letters[] =
449                 "abcdefghijklmnopqrstuvwxyz"
450                 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
451                 "0123456789";
452         static const int num_letters = ARRAY_SIZE(letters) - 1;
453         static const char x_pattern[] = "XXXXXX";
454         static const int num_x = ARRAY_SIZE(x_pattern) - 1;
455         uint64_t value;
456         struct timeval tv;
457         char *filename_template;
458         size_t len;
459         int fd, count;
460
461         len = strlen(pattern);
462
463         if (len < num_x + suffix_len) {
464                 errno = EINVAL;
465                 return -1;
466         }
467
468         if (strncmp(&pattern[len - num_x - suffix_len], x_pattern, num_x)) {
469                 errno = EINVAL;
470                 return -1;
471         }
472
473         /*
474          * Replace pattern's XXXXXX characters with randomness.
475          * Try TMP_MAX different filenames.
476          */
477         gettimeofday(&tv, NULL);
478         value = ((uint64_t)tv.tv_usec << 16) ^ tv.tv_sec ^ getpid();
479         filename_template = &pattern[len - num_x - suffix_len];
480         for (count = 0; count < TMP_MAX; ++count) {
481                 uint64_t v = value;
482                 int i;
483                 /* Fill in the random bits. */
484                 for (i = 0; i < num_x; i++) {
485                         filename_template[i] = letters[v % num_letters];
486                         v /= num_letters;
487                 }
488
489                 fd = open(pattern, O_CREAT | O_EXCL | O_RDWR, mode);
490                 if (fd >= 0)
491                         return fd;
492                 /*
493                  * Fatal error (EPERM, ENOSPC etc).
494                  * It doesn't make sense to loop.
495                  */
496                 if (errno != EEXIST)
497                         break;
498                 /*
499                  * This is a random value.  It is only necessary that
500                  * the next TMP_MAX values generated by adding 7777 to
501                  * VALUE are different with (module 2^32).
502                  */
503                 value += 7777;
504         }
505         /* We return the null string if we can't find a unique file name.  */
506         pattern[0] = '\0';
507         return -1;
508 }
509
510 int git_mkstemp_mode(char *pattern, int mode)
511 {
512         /* mkstemp is just mkstemps with no suffix */
513         return git_mkstemps_mode(pattern, 0, mode);
514 }
515
516 int xmkstemp_mode(char *filename_template, int mode)
517 {
518         int fd;
519         char origtemplate[PATH_MAX];
520         strlcpy(origtemplate, filename_template, sizeof(origtemplate));
521
522         fd = git_mkstemp_mode(filename_template, mode);
523         if (fd < 0) {
524                 int saved_errno = errno;
525                 const char *nonrelative_template;
526
527                 if (!filename_template[0])
528                         filename_template = origtemplate;
529
530                 nonrelative_template = absolute_path(filename_template);
531                 errno = saved_errno;
532                 die_errno("Unable to create temporary file '%s'",
533                         nonrelative_template);
534         }
535         return fd;
536 }
537
538 static int warn_if_unremovable(const char *op, const char *file, int rc)
539 {
540         int err;
541         if (!rc || errno == ENOENT)
542                 return 0;
543         err = errno;
544         warning_errno("unable to %s '%s'", op, file);
545         errno = err;
546         return rc;
547 }
548
549 int unlink_or_msg(const char *file, struct strbuf *err)
550 {
551         int rc = unlink(file);
552
553         assert(err);
554
555         if (!rc || errno == ENOENT)
556                 return 0;
557
558         strbuf_addf(err, "unable to unlink '%s': %s",
559                     file, strerror(errno));
560         return -1;
561 }
562
563 int unlink_or_warn(const char *file)
564 {
565         return warn_if_unremovable("unlink", file, unlink(file));
566 }
567
568 int rmdir_or_warn(const char *file)
569 {
570         return warn_if_unremovable("rmdir", file, rmdir(file));
571 }
572
573 int remove_or_warn(unsigned int mode, const char *file)
574 {
575         return S_ISGITLINK(mode) ? rmdir_or_warn(file) : unlink_or_warn(file);
576 }
577
578 static int access_error_is_ok(int err, unsigned flag)
579 {
580         return (is_missing_file_error(err) ||
581                 ((flag & ACCESS_EACCES_OK) && err == EACCES));
582 }
583
584 int access_or_warn(const char *path, int mode, unsigned flag)
585 {
586         int ret = access(path, mode);
587         if (ret && !access_error_is_ok(errno, flag))
588                 warn_on_inaccessible(path);
589         return ret;
590 }
591
592 int access_or_die(const char *path, int mode, unsigned flag)
593 {
594         int ret = access(path, mode);
595         if (ret && !access_error_is_ok(errno, flag))
596                 die_errno(_("unable to access '%s'"), path);
597         return ret;
598 }
599
600 char *xgetcwd(void)
601 {
602         struct strbuf sb = STRBUF_INIT;
603         if (strbuf_getcwd(&sb))
604                 die_errno(_("unable to get current working directory"));
605         return strbuf_detach(&sb, NULL);
606 }
607
608 int xsnprintf(char *dst, size_t max, const char *fmt, ...)
609 {
610         va_list ap;
611         int len;
612
613         va_start(ap, fmt);
614         len = vsnprintf(dst, max, fmt, ap);
615         va_end(ap);
616
617         if (len < 0)
618                 BUG("your snprintf is broken");
619         if (len >= max)
620                 BUG("attempt to snprintf into too-small buffer");
621         return len;
622 }
623
624 void write_file_buf(const char *path, const char *buf, size_t len)
625 {
626         int fd = xopen(path, O_WRONLY | O_CREAT | O_TRUNC, 0666);
627         if (write_in_full(fd, buf, len) < 0)
628                 die_errno(_("could not write to '%s'"), path);
629         if (close(fd))
630                 die_errno(_("could not close '%s'"), path);
631 }
632
633 void write_file(const char *path, const char *fmt, ...)
634 {
635         va_list params;
636         struct strbuf sb = STRBUF_INIT;
637
638         va_start(params, fmt);
639         strbuf_vaddf(&sb, fmt, params);
640         va_end(params);
641
642         strbuf_complete_line(&sb);
643
644         write_file_buf(path, sb.buf, sb.len);
645         strbuf_release(&sb);
646 }
647
648 void sleep_millisec(int millisec)
649 {
650         poll(NULL, 0, millisec);
651 }
652
653 int xgethostname(char *buf, size_t len)
654 {
655         /*
656          * If the full hostname doesn't fit in buf, POSIX does not
657          * specify whether the buffer will be null-terminated, so to
658          * be safe, do it ourselves.
659          */
660         int ret = gethostname(buf, len);
661         if (!ret)
662                 buf[len - 1] = 0;
663         return ret;
664 }
665
666 int is_empty_or_missing_file(const char *filename)
667 {
668         struct stat st;
669
670         if (stat(filename, &st) < 0) {
671                 if (errno == ENOENT)
672                         return 1;
673                 die_errno(_("could not stat %s"), filename);
674         }
675
676         return !st.st_size;
677 }