Postfix3.3.1
non_blocking.c
[詳解]
1 /*++
2 /* NAME
3 /* non_blocking 3
4 /* SUMMARY
5 /* set/clear non-blocking flag
6 /* SYNOPSIS
7 /* #include <iostuff.h>
8 /*
9 /* int non_blocking(int fd, int on)
10 /* DESCRIPTION
11 /* the \fInon_blocking\fR() function manipulates the non-blocking
12 /* flag for the specified open file, and returns the old setting.
13 /*
14 /* Arguments:
15 /* .IP fd
16 /* A file descriptor.
17 /* .IP on
18 /* For non-blocking I/O, specify a non-zero value (or use the
19 /* NON_BLOCKING constant); for blocking I/O, specify zero
20 /* (or use the BLOCKING constant).
21 /*
22 /* The result is non-zero when the non-blocking flag was enabled.
23 /* DIAGNOSTICS
24 /* All errors are fatal.
25 /* LICENSE
26 /* .ad
27 /* .fi
28 /* The Secure Mailer license must be distributed with this software.
29 /* AUTHOR(S)
30 /* Wietse Venema
31 /* IBM T.J. Watson Research
32 /* P.O. Box 704
33 /* Yorktown Heights, NY 10598, USA
34 /*--*/
35 
36 /* System interfaces. */
37 
38 #include "sys_defs.h"
39 #include <fcntl.h>
40 
41 /* Utility library. */
42 
43 #include "msg.h"
44 #include "iostuff.h"
45 
46 /* Backwards compatibility */
47 #ifndef O_NONBLOCK
48 #define PATTERN FNDELAY
49 #else
50 #define PATTERN O_NONBLOCK
51 #endif
52 
53 /* non_blocking - set/clear non-blocking flag */
54 
55 int non_blocking(fd, on)
56 int fd;
57 int on;
58 {
59  int flags;
60 
61  if ((flags = fcntl(fd, F_GETFL, 0)) < 0)
62  msg_fatal("fcntl: get flags: %m");
63  if (fcntl(fd, F_SETFL, on ? flags | PATTERN : flags & ~PATTERN) < 0)
64  msg_fatal("fcntl: set non-blocking flag %s: %m", on ? "on" : "off");
65  return ((flags & PATTERN) != 0);
66 }
#define PATTERN
Definition: non_blocking.c:48
NORETURN msg_fatal(const char *fmt,...)
Definition: msg.c:249
int non_blocking(int fd, int on)
Definition: non_blocking.c:55
int int
Definition: smtpd_proxy.h:21