Coverage Report

Created: 2026-10-17 07:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/git/compat/posix.h
Line
Count
Source
1
#ifndef COMPAT_POSIX_H
2
#define COMPAT_POSIX_H
3
4
#define _FILE_OFFSET_BITS 64
5
6
/*
7
 * Convenience macros to test the versions of GCC (or a compatible compiler).
8
 * Use them like this:
9
 *  #if GIT_GNUC_PREREQ (2,8)
10
 *   ... code requiring GCC 2.8 or later ...
11
 *  #endif
12
 *
13
 * Note that Clang and other compilers define __GNUC__ for compatibility; use
14
 * GIT_CLANG_PREREQ() to check for specific Clang versions.
15
 *
16
 * This macro of course is not part of POSIX, but we need it for the UNUSED
17
 * macro which is used by some of our POSIX compatibility wrappers.
18
 */
19
#if defined(__GNUC__) && defined(__GNUC_MINOR__)
20
# define GIT_GNUC_PREREQ(maj, min) \
21
  ((__GNUC__ > (maj)) || \
22
   (__GNUC__ == (maj) && __GNUC_MINOR__ >= (min)))
23
#else
24
# define GIT_GNUC_PREREQ(maj, min) 0
25
#endif
26
27
/* Similar for Clang. */
28
#if defined(__clang__) && defined(__clang_minor__) && defined(__clang_major__)
29
# define GIT_CLANG_PREREQ(maj, min) \
30
  ((__clang_major__ > (maj)) || \
31
   (__clang_major__ == (maj) && __clang_minor__ >= (min)))
32
#else
33
# define GIT_CLANG_PREREQ(maj, min) 0
34
#endif
35
36
/*
37
 * UNUSED marks a function parameter that is always unused.  It also
38
 * can be used to annotate a function, a variable, or a type that is
39
 * always unused.
40
 *
41
 * A callback interface may dictate that a function accepts a
42
 * parameter at that position, but the implementation of the function
43
 * may not need to use the parameter.  In such a case, mark the parameter
44
 * with UNUSED.
45
 *
46
 * When a parameter may be used or unused, depending on conditional
47
 * compilation, consider using MAYBE_UNUSED instead.
48
 */
49
#if GIT_GNUC_PREREQ(4, 5) || GIT_CLANG_PREREQ(2, 9)
50
# define UNUSED __attribute__((unused)) \
51
  __attribute__((deprecated("parameter declared as UNUSED")))
52
#elif defined(__GNUC__)
53
# define UNUSED __attribute__((unused)) \
54
  __attribute__((deprecated))
55
#else
56
# define UNUSED
57
#endif
58
59
#if defined(__MINGW32__) || defined(__MINGW64__)
60
#define _POSIX_C_SOURCE 1
61
#elif defined(__sun__)
62
 /*
63
  * On Solaris, when _XOPEN_EXTENDED is set, its header file
64
  * forces the programs to be XPG4v2, defeating any _XOPEN_SOURCE
65
  * setting to say we are XPG5 or XPG6.  Also on Solaris,
66
  * XPG6 programs must be compiled with a c99 compiler, while
67
  * non XPG6 programs must be compiled with a pre-c99 compiler.
68
  */
69
# if __STDC_VERSION__ - 0 >= 199901L
70
# define _XOPEN_SOURCE 600
71
# else
72
# define _XOPEN_SOURCE 500
73
# endif
74
#elif !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && \
75
      !defined(__OpenBSD__) && !defined(__DragonFly__) && !defined(__MirBSD__) && \
76
      !defined(__USLC__) && !defined(_M_UNIX) && !defined(__sgi) && \
77
      !defined(__TANDEM) && !defined(__QNX__) && !defined(__CYGWIN__)
78
#define _XOPEN_SOURCE 600 /* glibc2 and AIX 5.3L need 500 */
79
#define _XOPEN_SOURCE_EXTENDED 1 /* AIX 5.3L needs this */
80
#endif
81
#define _ALL_SOURCE 1
82
#define _GNU_SOURCE 1
83
#define _BSD_SOURCE 1
84
#define _DEFAULT_SOURCE 1
85
#define _NETBSD_SOURCE 1
86
#define _SGI_SOURCE 1
87
88
#if defined(WIN32) && !defined(__CYGWIN__) /* Both MinGW and MSVC */
89
# if !defined(_WIN32_WINNT)
90
#  define _WIN32_WINNT 0x0603
91
# endif
92
#define WIN32_LEAN_AND_MEAN  /* stops windows.h including winsock.h */
93
#include <winsock2.h>
94
#ifndef NO_UNIX_SOCKETS
95
#include <afunix.h>
96
#endif
97
#include <windows.h>
98
#define GIT_WINDOWS_NATIVE
99
#endif
100
101
#include <unistd.h>
102
#include <stdio.h>
103
#include <sys/stat.h>
104
#include <fcntl.h>
105
#include <stddef.h>
106
#include <stdlib.h>
107
#include <stdarg.h>
108
#include <stdbool.h>
109
#include <string.h>
110
#ifdef HAVE_STRINGS_H
111
#include <strings.h> /* for strcasecmp() */
112
#endif
113
#include <errno.h>
114
#include <limits.h>
115
#include <locale.h>
116
#ifdef NEEDS_SYS_PARAM_H
117
#include <sys/param.h>
118
#endif
119
#include <sys/types.h>
120
#include <dirent.h>
121
#include <sys/time.h>
122
#include <time.h>
123
#include <signal.h>
124
#include <assert.h>
125
#include <regex.h>
126
#include <utime.h>
127
#include <syslog.h>
128
#if !defined(NO_POLL_H)
129
#include <poll.h>
130
#elif !defined(NO_SYS_POLL_H)
131
#include <sys/poll.h>
132
#else
133
/* Pull the compat stuff */
134
#include <poll.h>
135
#endif
136
#ifdef HAVE_BSD_SYSCTL
137
#include <sys/sysctl.h>
138
#endif
139
140
#if defined(__MINGW32__)
141
#include "mingw-posix.h"
142
#elif defined(_MSC_VER)
143
#include "msvc-posix.h"
144
#else
145
#include <sys/utsname.h>
146
#include <sys/wait.h>
147
#include <sys/resource.h>
148
#include <sys/socket.h>
149
#include <sys/ioctl.h>
150
#include <sys/statvfs.h>
151
#ifndef NO_WRITEV
152
#include <sys/uio.h>
153
#endif
154
#include <termios.h>
155
#ifndef NO_SYS_SELECT_H
156
#include <sys/select.h>
157
#endif
158
#include <netinet/in.h>
159
#include <netinet/tcp.h>
160
#include <arpa/inet.h>
161
#include <netdb.h>
162
#include <pwd.h>
163
#include <sys/un.h>
164
#ifndef NO_INTTYPES_H
165
#include <inttypes.h>
166
#else
167
#include <stdint.h>
168
#endif
169
#ifdef HAVE_ARC4RANDOM_LIBBSD
170
#include <bsd/stdlib.h>
171
#endif
172
#ifdef HAVE_GETRANDOM
173
#include <sys/random.h>
174
#endif
175
#ifdef NO_INTPTR_T
176
/*
177
 * On I16LP32, ILP32 and LP64 "long" is the safe bet, however
178
 * on LLP86, IL33LLP64 and P64 it needs to be "long long",
179
 * while on IP16 and IP16L32 it is "int" (resp. "short")
180
 * Size needs to match (or exceed) 'sizeof(void *)'.
181
 * We can't take "long long" here as not everybody has it.
182
 */
183
typedef long intptr_t;
184
typedef unsigned long uintptr_t;
185
#endif
186
#undef _ALL_SOURCE /* AIX 5.3L defines a struct list with _ALL_SOURCE. */
187
#include <grp.h>
188
#define _ALL_SOURCE 1
189
#endif
190
191
#ifdef MKDIR_WO_TRAILING_SLASH
192
#define mkdir(a,b) compat_mkdir_wo_trailing_slash((a),(b))
193
int compat_mkdir_wo_trailing_slash(const char*, mode_t);
194
#endif
195
196
#ifdef time
197
#undef time
198
#endif
199
static inline time_t git_time(time_t *tloc)
200
0
{
201
0
  struct timeval tv;
202
0
203
0
  /*
204
0
   * Avoid time(NULL), which can disagree with gettimeofday(2)
205
0
   * and filesystem timestamps.
206
0
   */
207
0
  gettimeofday(&tv, NULL);
208
0
209
0
  if (tloc)
210
0
    *tloc = tv.tv_sec;
211
0
  return tv.tv_sec;
212
0
}
Unexecuted instantiation: attr.c:git_time
Unexecuted instantiation: dir.c:git_time
Unexecuted instantiation: environment.c:git_time
Unexecuted instantiation: ident.c:git_time
Unexecuted instantiation: object-file.c:git_time
Unexecuted instantiation: object-name.c:git_time
Unexecuted instantiation: object.c:git_time
Unexecuted instantiation: odb.c:git_time
Unexecuted instantiation: source.c:git_time
Unexecuted instantiation: source-files.c:git_time
Unexecuted instantiation: source-inmemory.c:git_time
Unexecuted instantiation: source-loose.c:git_time
Unexecuted instantiation: source-packed.c:git_time
Unexecuted instantiation: pack-bitmap.c:git_time
Unexecuted instantiation: pack-check.c:git_time
Unexecuted instantiation: pack-write.c:git_time
Unexecuted instantiation: packfile.c:git_time
Unexecuted instantiation: pretty.c:git_time
Unexecuted instantiation: pseudo-merge.c:git_time
Unexecuted instantiation: read-cache.c:git_time
Unexecuted instantiation: reflog-walk.c:git_time
Unexecuted instantiation: refs.c:git_time
Unexecuted instantiation: files-backend.c:git_time
Unexecuted instantiation: reftable-backend.c:git_time
Unexecuted instantiation: remote.c:git_time
Unexecuted instantiation: revision.c:git_time
Unexecuted instantiation: run-command.c:git_time
Unexecuted instantiation: setup.c:git_time
Unexecuted instantiation: shallow.c:git_time
Unexecuted instantiation: strbuf.c:git_time
Unexecuted instantiation: submodule.c:git_time
Unexecuted instantiation: tmp-objdir.c:git_time
Unexecuted instantiation: tree-walk.c:git_time
Unexecuted instantiation: wt-status.c:git_time
Unexecuted instantiation: error.c:git_time
Unexecuted instantiation: fsck.c:git_time
Unexecuted instantiation: iter.c:git_time
Unexecuted instantiation: record.c:git_time
Unexecuted instantiation: stack.c:git_time
Unexecuted instantiation: system.c:git_time
Unexecuted instantiation: table.c:git_time
Unexecuted instantiation: writer.c:git_time
Unexecuted instantiation: sha1.c:git_time
Unexecuted instantiation: ubc_check.c:git_time
Unexecuted instantiation: procinfo.c:git_time
Unexecuted instantiation: fopen.c:git_time
Unexecuted instantiation: strlcpy.c:git_time
Unexecuted instantiation: qsort_s.c:git_time
Unexecuted instantiation: fsm-ipc-unix.c:git_time
Unexecuted instantiation: fsm-settings-unix.c:git_time
Unexecuted instantiation: fsm-path-utils-linux.c:git_time
Unexecuted instantiation: bisect.c:git_time
Unexecuted instantiation: bundle.c:git_time
Unexecuted instantiation: cache-tree.c:git_time
Unexecuted instantiation: combine-diff.c:git_time
Unexecuted instantiation: commit-graph.c:git_time
Unexecuted instantiation: commit-reach.c:git_time
Unexecuted instantiation: commit.c:git_time
Unexecuted instantiation: config.c:git_time
Unexecuted instantiation: convert.c:git_time
Unexecuted instantiation: csum-file.c:git_time
Unexecuted instantiation: date.c:git_time
Unexecuted instantiation: diff-merges.c:git_time
Unexecuted instantiation: diff-lib.c:git_time
Unexecuted instantiation: diff.c:git_time
Unexecuted instantiation: diffcore-pickaxe.c:git_time
Unexecuted instantiation: diffcore-rename.c:git_time
Unexecuted instantiation: fetch-pack.c:git_time
Unexecuted instantiation: git-zlib.c:git_time
Unexecuted instantiation: gpg-interface.c:git_time
Unexecuted instantiation: graph.c:git_time
Unexecuted instantiation: grep.c:git_time
Unexecuted instantiation: line-log.c:git_time
Unexecuted instantiation: list-objects.c:git_time
Unexecuted instantiation: log-tree.c:git_time
Unexecuted instantiation: loose.c:git_time
Unexecuted instantiation: merge-ort.c:git_time
Unexecuted instantiation: notes-cache.c:git_time
Unexecuted instantiation: notes.c:git_time
Unexecuted instantiation: pack-bitmap-write.c:git_time
Unexecuted instantiation: parse-options-cb.c:git_time
Unexecuted instantiation: range-diff.c:git_time
Unexecuted instantiation: send-pack.c:git_time
Unexecuted instantiation: sequencer.c:git_time
Unexecuted instantiation: basics.c:git_time
Unexecuted instantiation: block.c:git_time
Unexecuted instantiation: blocksource.c:git_time
Unexecuted instantiation: merged.c:git_time
Unexecuted instantiation: pq.c:git_time
Unexecuted instantiation: tree.c:git_time
Unexecuted instantiation: apply.c:git_time
Unexecuted instantiation: list-objects-filter.c:git_time
Unexecuted instantiation: match-trees.c:git_time
Unexecuted instantiation: rerere.c:git_time
213
0
#define time git_time
214
215
#ifdef NO_STRUCT_ITIMERVAL
216
struct itimerval {
217
  struct timeval it_interval;
218
  struct timeval it_value;
219
};
220
#endif
221
222
#ifdef NO_SETITIMER
223
static inline int git_setitimer(int which UNUSED,
224
        const struct itimerval *value UNUSED,
225
        struct itimerval *newvalue UNUSED) {
226
  return 0; /* pretend success */
227
}
228
#undef setitimer
229
#define setitimer(which,value,ovalue) git_setitimer(which,value,ovalue)
230
#endif
231
232
#ifndef NO_LIBGEN_H
233
#include <libgen.h>
234
#else
235
#define basename gitbasename
236
char *gitbasename(char *);
237
#define dirname gitdirname
238
char *gitdirname(char *);
239
#endif
240
241
#ifndef NO_ICONV
242
#include <iconv.h>
243
#endif
244
245
/* On most systems <netdb.h> would have given us this, but
246
 * not on some systems (e.g. z/OS).
247
 */
248
#ifndef NI_MAXHOST
249
#define NI_MAXHOST 1025
250
#endif
251
252
#ifndef NI_MAXSERV
253
#define NI_MAXSERV 32
254
#endif
255
256
/* On most systems <limits.h> would have given us this, but
257
 * not on some systems (e.g. GNU/Hurd).
258
 */
259
#ifndef PATH_MAX
260
#define PATH_MAX 4096
261
#endif
262
263
#ifndef NAME_MAX
264
#define NAME_MAX 255
265
#endif
266
267
typedef uintmax_t timestamp_t;
268
0
#define PRItime PRIuMAX
269
0
#define parse_timestamp strtoumax
270
0
#define TIME_MAX UINTMAX_MAX
271
#define TIME_MIN 0
272
273
int lstat_cache_aware_rmdir(const char *path);
274
#if !defined(__MINGW32__) && !defined(_MSC_VER)
275
0
#define rmdir lstat_cache_aware_rmdir
276
#endif
277
278
#if defined(NO_MMAP) || defined(USE_WIN32_MMAP)
279
280
#ifndef PROT_READ
281
#define PROT_READ 1
282
#define PROT_WRITE 2
283
#define MAP_PRIVATE 1
284
#endif
285
286
#define mmap git_mmap
287
#define munmap git_munmap
288
void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
289
int git_munmap(void *start, size_t length);
290
291
#else /* NO_MMAP || USE_WIN32_MMAP */
292
293
#include <sys/mman.h>
294
295
#endif /* NO_MMAP || USE_WIN32_MMAP */
296
297
#ifndef MAP_FAILED
298
#define MAP_FAILED ((void *)-1)
299
#endif
300
301
#ifdef NEEDS_MODE_TRANSLATION
302
#undef S_IFMT
303
#undef S_IFREG
304
#undef S_IFDIR
305
#undef S_IFLNK
306
#undef S_IFBLK
307
#undef S_IFCHR
308
#undef S_IFIFO
309
#undef S_IFSOCK
310
#define S_IFMT   0170000
311
#define S_IFREG  0100000
312
#define S_IFDIR  0040000
313
#define S_IFLNK  0120000
314
#define S_IFBLK  0060000
315
#define S_IFCHR  0020000
316
#define S_IFIFO  0010000
317
#define S_IFSOCK 0140000
318
#ifdef stat
319
#undef stat
320
#endif
321
#define stat(path, buf) git_stat(path, buf)
322
int git_stat(const char *, struct stat *);
323
#ifdef fstat
324
#undef fstat
325
#endif
326
#define fstat(fd, buf) git_fstat(fd, buf)
327
int git_fstat(int, struct stat *);
328
#ifdef lstat
329
#undef lstat
330
#endif
331
#define lstat(path, buf) git_lstat(path, buf)
332
int git_lstat(const char *, struct stat *);
333
#endif
334
335
#ifdef NO_PREAD
336
#define pread git_pread
337
ssize_t git_pread(int fd, void *buf, size_t count, off_t offset);
338
#endif
339
340
#ifdef NO_WRITEV
341
#define writev git_writev
342
#define iovec git_iovec
343
struct git_iovec {
344
  void *iov_base;
345
  size_t iov_len;
346
};
347
348
ssize_t git_writev(int fd, const struct iovec *iov, int iovcnt);
349
#endif
350
351
#ifdef NO_SETENV
352
#define setenv gitsetenv
353
int gitsetenv(const char *, const char *, int);
354
#endif
355
356
#ifdef NO_MKDTEMP
357
#define mkdtemp git_mkdtemp
358
#endif
359
360
#ifdef NO_UNSETENV
361
#define unsetenv gitunsetenv
362
int gitunsetenv(const char *);
363
#endif
364
365
#ifdef NO_STRCASESTR
366
#define strcasestr gitstrcasestr
367
char *gitstrcasestr(const char *haystack, const char *needle);
368
#endif
369
370
#ifdef NO_STRLCPY
371
0
#define strlcpy gitstrlcpy
372
size_t gitstrlcpy(char *, const char *, size_t);
373
#endif
374
375
#ifdef NO_STRTOUMAX
376
#define strtoumax gitstrtoumax
377
uintmax_t gitstrtoumax(const char *, char **, int);
378
#define strtoimax gitstrtoimax
379
intmax_t gitstrtoimax(const char *, char **, int);
380
#endif
381
382
#ifdef NO_HSTRERROR
383
#define hstrerror githstrerror
384
const char *githstrerror(int herror);
385
#endif
386
387
#ifdef NO_MEMMEM
388
#define memmem gitmemmem
389
void *gitmemmem(const void *haystack, size_t haystacklen,
390
    const void *needle, size_t needlelen);
391
#endif
392
393
#ifdef OVERRIDE_STRDUP
394
#ifdef strdup
395
#undef strdup
396
#endif
397
#define strdup gitstrdup
398
char *gitstrdup(const char *s);
399
#endif
400
401
#ifdef NO_GETPAGESIZE
402
#define getpagesize() sysconf(_SC_PAGESIZE)
403
#endif
404
405
#ifndef O_CLOEXEC
406
#define O_CLOEXEC 0
407
#endif
408
409
#ifdef FREAD_READS_DIRECTORIES
410
# if !defined(SUPPRESS_FOPEN_REDEFINITION)
411
#  ifdef fopen
412
#   undef fopen
413
#  endif
414
0
#  define fopen(a,b) git_fopen(a,b)
415
# endif
416
FILE *git_fopen(const char*, const char*);
417
#endif
418
419
#ifdef SNPRINTF_RETURNS_BOGUS
420
#ifdef snprintf
421
#undef snprintf
422
#endif
423
#define snprintf git_snprintf
424
int git_snprintf(char *str, size_t maxsize,
425
     const char *format, ...);
426
#ifdef vsnprintf
427
#undef vsnprintf
428
#endif
429
#define vsnprintf git_vsnprintf
430
int git_vsnprintf(char *str, size_t maxsize,
431
      const char *format, va_list ap);
432
#endif
433
434
#ifdef OPEN_RETURNS_EINTR
435
#undef open
436
#define open git_open_with_retry
437
int git_open_with_retry(const char *path, int flag, ...);
438
#endif
439
440
#ifdef __GLIBC_PREREQ
441
#if __GLIBC_PREREQ(2, 1)
442
#define HAVE_STRCHRNUL
443
#endif
444
#endif
445
446
#ifndef HAVE_STRCHRNUL
447
#define strchrnul gitstrchrnul
448
static inline char *gitstrchrnul(const char *s, int c)
449
{
450
  while (*s && *s != c)
451
    s++;
452
  return (char *)s;
453
}
454
#endif
455
456
#ifdef NO_INET_PTON
457
int inet_pton(int af, const char *src, void *dst);
458
#endif
459
460
#ifdef NO_INET_NTOP
461
const char *inet_ntop(int af, const void *src, char *dst, size_t size);
462
#endif
463
464
#ifdef NO_PTHREADS
465
#define atexit git_atexit
466
int git_atexit(void (*handler)(void));
467
#endif
468
469
#ifndef HOST_NAME_MAX
470
#define HOST_NAME_MAX 256
471
#endif
472
473
#include "../sane-ctype.h"
474
475
void git_stable_qsort(void *base, size_t nmemb, size_t size,
476
          int(*compar)(const void *, const void *));
477
#ifdef INTERNAL_QSORT
478
#define qsort git_stable_qsort
479
#endif
480
481
0
#define QSORT(base, n, compar) sane_qsort((base), (n), sizeof(*(base)), compar)
482
static inline void sane_qsort(void *base, size_t nmemb, size_t size,
483
            int(*compar)(const void *, const void *))
484
0
{
485
0
  if (nmemb > 1)
486
0
    qsort(base, nmemb, size, compar);
487
0
}
Unexecuted instantiation: dir.c:sane_qsort
Unexecuted instantiation: oid-array.c:sane_qsort
Unexecuted instantiation: pack-bitmap.c:sane_qsort
Unexecuted instantiation: pack-check.c:sane_qsort
Unexecuted instantiation: pack-write.c:sane_qsort
Unexecuted instantiation: pathspec.c:sane_qsort
Unexecuted instantiation: pseudo-merge.c:sane_qsort
Unexecuted instantiation: read-cache.c:sane_qsort
Unexecuted instantiation: refs.c:sane_qsort
Unexecuted instantiation: reftable-backend.c:sane_qsort
Unexecuted instantiation: packed-backend.c:sane_qsort
Unexecuted instantiation: ref-cache.c:sane_qsort
Unexecuted instantiation: repack-geometry.c:sane_qsort
Unexecuted instantiation: error.c:sane_qsort
Unexecuted instantiation: fsck.c:sane_qsort
Unexecuted instantiation: iter.c:sane_qsort
Unexecuted instantiation: record.c:sane_qsort
Unexecuted instantiation: stack.c:sane_qsort
Unexecuted instantiation: system.c:sane_qsort
Unexecuted instantiation: table.c:sane_qsort
Unexecuted instantiation: writer.c:sane_qsort
Unexecuted instantiation: sha1.c:sane_qsort
Unexecuted instantiation: ubc_check.c:sane_qsort
Unexecuted instantiation: procinfo.c:sane_qsort
Unexecuted instantiation: fopen.c:sane_qsort
Unexecuted instantiation: strlcpy.c:sane_qsort
Unexecuted instantiation: qsort_s.c:sane_qsort
Unexecuted instantiation: fsm-ipc-unix.c:sane_qsort
Unexecuted instantiation: fsm-settings-unix.c:sane_qsort
Unexecuted instantiation: fsm-path-utils-linux.c:sane_qsort
Unexecuted instantiation: bisect.c:sane_qsort
Unexecuted instantiation: bundle-uri.c:sane_qsort
Unexecuted instantiation: commit-graph.c:sane_qsort
Unexecuted instantiation: commit-reach.c:sane_qsort
Unexecuted instantiation: diff.c:sane_qsort
Unexecuted instantiation: diffcore-delta.c:sane_qsort
Unexecuted instantiation: diffcore-order.c:sane_qsort
Unexecuted instantiation: fetch-pack.c:sane_qsort
Unexecuted instantiation: line-log.c:sane_qsort
Unexecuted instantiation: merge-ort.c:sane_qsort
Unexecuted instantiation: midx.c:sane_qsort
Unexecuted instantiation: pack-bitmap-write.c:sane_qsort
Unexecuted instantiation: basics.c:sane_qsort
Unexecuted instantiation: block.c:sane_qsort
Unexecuted instantiation: blocksource.c:sane_qsort
Unexecuted instantiation: merged.c:sane_qsort
Unexecuted instantiation: pq.c:sane_qsort
Unexecuted instantiation: tree.c:sane_qsort
488
489
#define STABLE_QSORT(base, n, compar) \
490
0
  git_stable_qsort((base), (n), sizeof(*(base)), compar)
491
492
#ifndef HAVE_ISO_QSORT_S
493
int git_qsort_s(void *base, size_t nmemb, size_t size,
494
    int (*compar)(const void *, const void *, void *), void *ctx);
495
0
#define qsort_s git_qsort_s
496
#endif
497
498
0
#define QSORT_S(base, n, compar, ctx) do {     \
499
0
  if (qsort_s((base), (n), sizeof(*(base)), compar, ctx)) \
500
0
    BUG("qsort_s() failed");     \
501
0
} while (0)
502
503
#ifdef NO_NSEC
504
#define ST_CTIME_NSEC(st) 0
505
#define ST_MTIME_NSEC(st) 0
506
#else
507
#ifdef USE_ST_TIMESPEC
508
#define ST_CTIME_NSEC(st) ((unsigned int)((st).st_ctimespec.tv_nsec))
509
#define ST_MTIME_NSEC(st) ((unsigned int)((st).st_mtimespec.tv_nsec))
510
#else
511
0
#define ST_CTIME_NSEC(st) ((unsigned int)((st).st_ctim.tv_nsec))
512
0
#define ST_MTIME_NSEC(st) ((unsigned int)((st).st_mtim.tv_nsec))
513
#endif
514
#endif
515
516
#ifndef va_copy
517
/*
518
 * Since an obvious implementation of va_list would be to make it a
519
 * pointer into the stack frame, a simple assignment will work on
520
 * many systems.  But let's try to be more portable.
521
 */
522
#ifdef __va_copy
523
#define va_copy(dst, src) __va_copy(dst, src)
524
#else
525
#define va_copy(dst, src) ((dst) = (src))
526
#endif
527
#endif
528
529
#ifndef _POSIX_THREAD_SAFE_FUNCTIONS
530
static inline void git_flockfile(FILE *fh UNUSED)
531
{
532
  ; /* nothing */
533
}
534
static inline void git_funlockfile(FILE *fh UNUSED)
535
{
536
  ; /* nothing */
537
}
538
#undef flockfile
539
#undef funlockfile
540
#undef getc_unlocked
541
#define flockfile(fh) git_flockfile(fh)
542
#define funlockfile(fh) git_funlockfile(fh)
543
#define getc_unlocked(fh) getc(fh)
544
#endif
545
546
#ifdef FILENO_IS_A_MACRO
547
int git_fileno(FILE *stream);
548
# ifndef COMPAT_CODE_FILENO
549
#  undef fileno
550
#  define fileno(p) git_fileno(p)
551
# endif
552
#endif
553
554
#ifdef NEED_ACCESS_ROOT_HANDLER
555
int git_access(const char *path, int mode);
556
# ifndef COMPAT_CODE_ACCESS
557
#  ifdef access
558
#  undef access
559
#  endif
560
#  define access(path, mode) git_access(path, mode)
561
# endif
562
#endif
563
564
#endif /* COMPAT_POSIX_H */