1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef _FDLEAK_H_
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define _FDLEAK_H_
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DO(op) \
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ({ \
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      long res = op; \
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (res < 0) { \
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         perror(#op); \
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         exit(1); \
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }; \
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res; \
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   })
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * The macro below closes file descriptors inherited from the process
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * that forked the current process. Close these file descriptors right
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * after the start of main() in order to get consistent results across
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * different releases. Known behavior:
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * - Fedora Core 1's Perl opens /dev/pts/2 as fd 10.
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * - For Ubuntu 8.04, see also
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   https://bugs.launchpad.net/ubuntu/+source/seahorse/+bug/235184
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLOSE_INHERITED_FDS { int i; for (i = 3; i < 64; i++) close(i); }
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* _FDLEAK_H_ */
29