Postfix3.3.1
sane_socketpair.c
[詳解]
1 /*++
2 /* NAME
3 /* sane_socketpair 3
4 /* SUMMARY
5 /* sanitize socketpair() error returns
6 /* SYNOPSIS
7 /* #include <sane_socketpair.h>
8 /*
9 /* int sane_socketpair(domain, type, protocol, result)
10 /* int domain;
11 /* int type;
12 /* int protocol;
13 /* int *result;
14 /* DESCRIPTION
15 /* sane_socketpair() implements the socketpair(2) socket call, and
16 /* skips over silly error results such as EINTR.
17 /* BUGS
18 /* Bizarre systems may have other harmless error results. Such
19 /* systems encourage programmers to ignore error results, and
20 /* penalize programmers who code defensively.
21 /* LICENSE
22 /* .ad
23 /* .fi
24 /* The Secure Mailer license must be distributed with this software.
25 /* AUTHOR(S)
26 /* Wietse Venema
27 /* IBM T.J. Watson Research
28 /* P.O. Box 704
29 /* Yorktown Heights, NY 10598, USA
30 /*--*/
31 
32 /* System library. */
33 
34 #include "sys_defs.h"
35 #include <sys/socket.h>
36 #include <unistd.h>
37 #include <errno.h>
38 
39 /* Utility library. */
40 
41 #include "msg.h"
42 #include "sane_socketpair.h"
43 
44 /* sane_socketpair - sanitize socketpair() error returns */
45 
46 int sane_socketpair(int domain, int type, int protocol, int *result)
47 {
48  static int socketpair_ok_errors[] = {
49  EINTR,
50  0,
51  };
52  int count;
53  int err;
54  int ret;
55 
56  /*
57  * Solaris socketpair() can fail with EINTR.
58  */
59  while ((ret = socketpair(domain, type, protocol, result)) < 0) {
60  for (count = 0; /* void */ ; count++) {
61  if ((err = socketpair_ok_errors[count]) == 0)
62  return (ret);
63  if (errno == err) {
64  msg_warn("socketpair: %m (trying again)");
65  sleep(1);
66  break;
67  }
68  }
69  }
70  return (ret);
71 }
int sane_socketpair(int domain, int type, int protocol, int *result)
void msg_warn(const char *fmt,...)
Definition: msg.c:215