Coverage Report

Created: 2025-10-10 06:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/tmux/compat.h
Line
Count
Source
1
/*
2
 * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
3
 *
4
 * Permission to use, copy, modify, and distribute this software for any
5
 * purpose with or without fee is hereby granted, provided that the above
6
 * copyright notice and this permission notice appear in all copies.
7
 *
8
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
13
 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
14
 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
 */
16
17
#ifndef COMPAT_H
18
#define COMPAT_H
19
20
#include <sys/types.h>
21
#include <sys/ioctl.h>
22
#include <sys/uio.h>
23
24
#include <fnmatch.h>
25
#include <limits.h>
26
#include <stdio.h>
27
#include <termios.h>
28
#include <wchar.h>
29
30
#ifdef HAVE_EVENT2_EVENT_H
31
#include <event2/event.h>
32
#include <event2/event_compat.h>
33
#include <event2/event_struct.h>
34
#include <event2/buffer.h>
35
#include <event2/buffer_compat.h>
36
#include <event2/bufferevent.h>
37
#include <event2/bufferevent_struct.h>
38
#include <event2/bufferevent_compat.h>
39
#else
40
#include <event.h>
41
#ifndef EVBUFFER_EOL_LF
42
/*
43
 * This doesn't really work because evbuffer_readline is broken, but gets us to
44
 * build with very old (older than 1.4.14) libevent.
45
 */
46
#define EVBUFFER_EOL_LF
47
#define evbuffer_readln(a, b, c) evbuffer_readline(a)
48
#endif
49
#endif
50
51
#ifdef HAVE_MALLOC_TRIM
52
#include <malloc.h>
53
#endif
54
55
#ifdef HAVE_UTF8PROC
56
#include <utf8proc.h>
57
#endif
58
59
#ifndef __GNUC__
60
#define __attribute__(a)
61
#endif
62
63
#ifdef BROKEN___DEAD
64
#undef __dead
65
#endif
66
67
#ifndef __unused
68
#define __unused __attribute__ ((__unused__))
69
#endif
70
#ifndef __dead
71
#define __dead __attribute__ ((__noreturn__))
72
#endif
73
#ifndef __packed
74
#define __packed __attribute__ ((__packed__))
75
#endif
76
#ifndef __weak
77
#define __weak __attribute__ ((__weak__))
78
#endif
79
80
#ifndef ECHOPRT
81
#define ECHOPRT 0
82
#endif
83
84
#ifndef ACCESSPERMS
85
#define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO)
86
#endif
87
88
#if !defined(FIONREAD) && defined(__sun)
89
#include <sys/filio.h>
90
#endif
91
92
#ifdef HAVE_ERR_H
93
#include <err.h>
94
#else
95
void  err(int, const char *, ...);
96
void  errx(int, const char *, ...);
97
void  warn(const char *, ...);
98
void  warnx(const char *, ...);
99
#endif
100
101
#ifdef HAVE_PATHS_H
102
#include <paths.h>
103
#endif
104
105
#ifndef _PATH_BSHELL
106
#define _PATH_BSHELL  "/bin/sh"
107
#endif
108
109
#ifndef _PATH_TMP
110
#define _PATH_TMP "/tmp/"
111
#endif
112
113
#ifndef _PATH_DEVNULL
114
#define _PATH_DEVNULL "/dev/null"
115
#endif
116
117
#ifndef _PATH_TTY
118
#define _PATH_TTY "/dev/tty"
119
#endif
120
121
#ifndef _PATH_DEV
122
#define _PATH_DEV "/dev/"
123
#endif
124
125
#ifndef _PATH_DEFPATH
126
#define _PATH_DEFPATH "/usr/bin:/bin"
127
#endif
128
129
#ifndef _PATH_VI
130
#define _PATH_VI  "/usr/bin/vi"
131
#endif
132
133
#ifndef __OpenBSD__
134
0
#define pledge(s, p) (0)
135
#endif
136
137
#ifndef IMAXBEL
138
#define IMAXBEL 0
139
#endif
140
141
#ifdef HAVE_STDINT_H
142
#include <stdint.h>
143
#else
144
#include <inttypes.h>
145
#endif
146
147
#ifdef HAVE_QUEUE_H
148
#include <sys/queue.h>
149
#else
150
#include "compat/queue.h"
151
#endif
152
153
#ifdef HAVE_TREE_H
154
#include <sys/tree.h>
155
#else
156
#include "compat/tree.h"
157
#endif
158
159
#ifdef HAVE_BITSTRING_H
160
#include <bitstring.h>
161
#else
162
#include "compat/bitstring.h"
163
#endif
164
165
#ifdef HAVE_LIBUTIL_H
166
#include <libutil.h>
167
#endif
168
169
#ifdef HAVE_PTY_H
170
#include <pty.h>
171
#endif
172
173
#ifdef HAVE_UTIL_H
174
#include <util.h>
175
#endif
176
177
#ifdef HAVE_VIS
178
#include <vis.h>
179
#else
180
#include "compat/vis.h"
181
#endif
182
183
#ifdef HAVE_IMSG
184
#include <imsg.h>
185
#else
186
#include "compat/imsg.h"
187
#endif
188
189
#ifdef BROKEN_CMSG_FIRSTHDR
190
#undef CMSG_FIRSTHDR
191
#define CMSG_FIRSTHDR(mhdr) \
192
  ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
193
      (struct cmsghdr *)(mhdr)->msg_control :     \
194
      (struct cmsghdr *)NULL)
195
#endif
196
197
#ifndef CMSG_ALIGN
198
#ifdef _CMSG_DATA_ALIGN
199
#define CMSG_ALIGN _CMSG_DATA_ALIGN
200
#else
201
#define CMSG_ALIGN(len) (((len) + sizeof(long) - 1) & ~(sizeof(long) - 1))
202
#endif
203
#endif
204
205
#ifndef CMSG_SPACE
206
#define CMSG_SPACE(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(len))
207
#endif
208
209
#ifndef CMSG_LEN
210
#define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (len))
211
#endif
212
213
#ifndef O_DIRECTORY
214
#define O_DIRECTORY 0
215
#endif
216
217
#ifndef FNM_CASEFOLD
218
#ifdef FNM_IGNORECASE
219
#define FNM_CASEFOLD FNM_IGNORECASE
220
#else
221
#define FNM_CASEFOLD 0
222
#endif
223
#endif
224
225
#ifndef INFTIM
226
#define INFTIM -1
227
#endif
228
229
#ifndef WAIT_ANY
230
#define WAIT_ANY -1
231
#endif
232
233
#ifndef SUN_LEN
234
#define SUN_LEN(sun) (sizeof (sun)->sun_path)
235
#endif
236
237
#ifndef timercmp
238
#define timercmp(tvp, uvp, cmp)           \
239
  (((tvp)->tv_sec == (uvp)->tv_sec) ?       \
240
      ((tvp)->tv_usec cmp (uvp)->tv_usec) :     \
241
      ((tvp)->tv_sec cmp (uvp)->tv_sec))
242
#endif
243
244
#ifndef timeradd
245
#define timeradd(tvp, uvp, vvp)           \
246
  do {                \
247
    (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec;    \
248
    (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \
249
    if ((vvp)->tv_usec >= 1000000) {      \
250
      (vvp)->tv_sec++;        \
251
      (vvp)->tv_usec -= 1000000;      \
252
    }             \
253
  } while (0)
254
#endif
255
256
#ifndef timersub
257
#define timersub(tvp, uvp, vvp)                                         \
258
  do {                                                            \
259
    (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;          \
260
    (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec;       \
261
    if ((vvp)->tv_usec < 0) {                               \
262
      (vvp)->tv_sec--;                                \
263
      (vvp)->tv_usec += 1000000;                      \
264
    }                                                       \
265
  } while (0)
266
#endif
267
268
#ifndef TTY_NAME_MAX
269
#define TTY_NAME_MAX 32
270
#endif
271
272
#ifndef HOST_NAME_MAX
273
#define HOST_NAME_MAX 255
274
#endif
275
276
#ifndef CLOCK_REALTIME
277
#define CLOCK_REALTIME 0
278
#endif
279
#ifndef CLOCK_MONOTONIC
280
#define CLOCK_MONOTONIC CLOCK_REALTIME
281
#endif
282
283
#ifndef HAVE_FLOCK
284
#define LOCK_SH 0
285
#define LOCK_EX 0
286
#define LOCK_NB 0
287
#define flock(fd, op) (0)
288
#endif
289
290
#ifndef HAVE_EXPLICIT_BZERO
291
/* explicit_bzero.c */
292
void     explicit_bzero(void *, size_t);
293
#endif
294
295
#ifndef HAVE_GETDTABLECOUNT
296
/* getdtablecount.c */
297
int    getdtablecount(void);
298
#endif
299
300
#ifndef HAVE_GETDTABLESIZE
301
/* getdtablesize.c */
302
int    getdtablesize(void);
303
#endif
304
305
#ifndef HAVE_CLOSEFROM
306
/* closefrom.c */
307
void     closefrom(int);
308
#endif
309
310
#ifndef HAVE_STRCASESTR
311
/* strcasestr.c */
312
char    *strcasestr(const char *, const char *);
313
#endif
314
315
#ifndef HAVE_STRSEP
316
/* strsep.c */
317
char    *strsep(char **, const char *);
318
#endif
319
320
#ifndef HAVE_STRTONUM
321
/* strtonum.c */
322
long long  strtonum(const char *, long long, long long, const char **);
323
#endif
324
325
#ifndef HAVE_STRLCPY
326
/* strlcpy.c */
327
size_t     strlcpy(char *, const char *, size_t);
328
#endif
329
330
#ifndef HAVE_STRLCAT
331
/* strlcat.c */
332
size_t     strlcat(char *, const char *, size_t);
333
#endif
334
335
#ifndef HAVE_STRNLEN
336
/* strnlen.c */
337
size_t     strnlen(const char *, size_t);
338
#endif
339
340
#ifndef HAVE_STRNDUP
341
/* strndup.c */
342
char    *strndup(const char *, size_t);
343
#endif
344
345
#ifndef HAVE_MEMMEM
346
/* memmem.c */
347
void    *memmem(const void *, size_t, const void *, size_t);
348
#endif
349
350
#ifndef HAVE_HTONLL
351
/* htonll.c */
352
#undef htonll
353
uint64_t   htonll(uint64_t);
354
#endif
355
356
#ifndef HAVE_NTOHLL
357
/* ntohll.c */
358
#undef ntohll
359
uint64_t   ntohll(uint64_t);
360
#endif
361
362
#ifndef HAVE_GETPEEREID
363
/* getpeereid.c */
364
int   getpeereid(int, uid_t *, gid_t *);
365
#endif
366
367
#ifndef HAVE_DAEMON
368
/* daemon.c */
369
int    daemon(int, int);
370
#endif
371
372
#ifndef HAVE_GETPROGNAME
373
/* getprogname.c */
374
const char  *getprogname(void);
375
#endif
376
377
#ifndef HAVE_SETPROCTITLE
378
/* setproctitle.c */
379
void     setproctitle(const char *, ...);
380
#endif
381
382
#ifndef HAVE_CLOCK_GETTIME
383
/* clock_gettime.c */
384
int    clock_gettime(int, struct timespec *);
385
#endif
386
387
#ifndef HAVE_B64_NTOP
388
/* base64.c */
389
#undef b64_ntop
390
#undef b64_pton
391
int    b64_ntop(const char *, size_t, char *, size_t);
392
int    b64_pton(const char *, u_char *, size_t);
393
#endif
394
395
#ifndef HAVE_FDFORKPTY
396
/* fdforkpty.c */
397
int    getptmfd(void);
398
pid_t    fdforkpty(int, int *, char *, struct termios *,
399
         struct winsize *);
400
#endif
401
402
#ifndef HAVE_FORKPTY
403
/* forkpty.c */
404
pid_t    forkpty(int *, char *, struct termios *, struct winsize *);
405
#endif
406
407
#ifndef HAVE_ASPRINTF
408
/* asprintf.c */
409
int    asprintf(char **, const char *, ...);
410
int    vasprintf(char **, const char *, va_list);
411
#endif
412
413
#ifndef HAVE_FGETLN
414
/* fgetln.c */
415
char    *fgetln(FILE *, size_t *);
416
#endif
417
418
#ifndef HAVE_GETLINE
419
/* getline.c */
420
ssize_t    getline(char **, size_t *, FILE *);
421
#endif
422
423
#ifndef HAVE_SETENV
424
/* setenv.c */
425
int    setenv(const char *, const char *, int);
426
int    unsetenv(const char *);
427
#endif
428
429
#ifndef HAVE_CFMAKERAW
430
/* cfmakeraw.c */
431
void     cfmakeraw(struct termios *);
432
#endif
433
434
#ifndef HAVE_FREEZERO
435
/* freezero.c */
436
void     freezero(void *, size_t);
437
#endif
438
439
#ifndef HAVE_REALLOCARRAY
440
/* reallocarray.c */
441
void    *reallocarray(void *, size_t, size_t);
442
#endif
443
444
#ifndef HAVE_RECALLOCARRAY
445
/* recallocarray.c */
446
void    *recallocarray(void *, size_t, size_t, size_t);
447
#endif
448
449
#ifdef HAVE_SYSTEMD
450
/* systemd.c */
451
int    systemd_activated(void);
452
int    systemd_create_socket(int, char **);
453
int    systemd_move_to_new_cgroup(char **);
454
#endif
455
456
#ifdef HAVE_UTF8PROC
457
/* utf8proc.c */
458
int    utf8proc_wcwidth(wchar_t);
459
int    utf8proc_mbtowc(wchar_t *, const char *, size_t);
460
int    utf8proc_wctomb(char *, wchar_t);
461
#endif
462
463
#ifdef NEED_FUZZING
464
/* tmux.c */
465
#define main __weak main
466
#endif
467
468
/* getopt.c */
469
extern int   BSDopterr;
470
extern int   BSDoptind;
471
extern int   BSDoptopt;
472
extern int   BSDoptreset;
473
extern char *BSDoptarg;
474
int BSDgetopt(int, char *const *, const char *);
475
0
#define getopt(ac, av, o)  BSDgetopt(ac, av, o)
476
0
#define opterr             BSDopterr
477
0
#define optind             BSDoptind
478
0
#define optopt             BSDoptopt
479
0
#define optreset           BSDoptreset
480
0
#define optarg             BSDoptarg
481
482
#endif /* COMPAT_H */