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