1 /* $Cambridge: exim/test/src/fd.c,v 1.1 2006/02/06 16:24:05 ph10 Exp $ */
3 /* A program to check on open file descriptors. There are some weird options
4 for running it in Exim testing. If -q is given, make output suitable for
5 queryprogram. If -f is given, copy the input as for a transport filter. If -s
6 is given, add extra output from stat(). */
11 #include <sys/types.h>
19 /* The way of finding out the maximum file descriptor various between OS.
20 Most have sysconf(), but a few don't. */
23 #define mac_maxfd (sysconf(_SC_OPEN_MAX) - 1)
24 #elif defined OPEN_MAX
25 #define mac_maxfd (OPEN_MAX - 1)
27 #define mac_maxfd (NOFILE - 1)
29 #define mac_maxfd 255; /* just in case */
33 int main(int argc
, char **argv
)
45 char *arg
= argv
[--argc
];
46 if (strcmp(arg
, "-q") == 0) qpgm
= 1;
47 if (strcmp(arg
, "-f") == 0) filter
= 1;
48 if (strcmp(arg
, "-s") == 0) use_stat
= 1;
54 while ((len
= read(0, buffer
, sizeof(buffer
))) > 0)
55 write(1, buffer
, len
);
58 p
+= sprintf(p
, "max fd = %d\n", (int)mac_maxfd
);
60 for (fd
= 0; fd
<= mac_maxfd
; fd
++)
62 int options
= fcntl(fd
, F_GETFD
);
65 int status
= fcntl(fd
, F_GETFL
);
66 p
+= sprintf(p
, "%3d opt=%d status=%X ", fd
, options
, status
);
69 case 0: p
+= sprintf(p
, "RDONLY");
71 case 1: p
+= sprintf(p
, "WRONLY");
73 case 2: p
+= sprintf(p
, "RDWR");
76 if (isatty(fd
)) p
+= sprintf(p
, " TTY");
77 if ((status
& 8) != 0) p
+= sprintf(p
, " APPEND");
79 if (use_stat
&& fstat(fd
, &statbuf
) >= 0)
81 p
+= sprintf(p
, " mode=%o uid=%d size=%d", (int)statbuf
.st_mode
,
82 (int)statbuf
.st_uid
, (int)statbuf
.st_size
);
85 p
+= sprintf(p
, "\n");
87 else if (errno
!= EBADF
)
89 p
+= sprintf(p
, "%3d errno=%d %s\n", fd
, errno
, strerror(errno
));
95 for (p
= buffer
; *p
!= 0; p
++)
96 if (*p
== '\n') *p
= ' ';
97 printf("ACCEPT DATA=\"%s\"\n", buffer
);
99 else printf("%s", buffer
);