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
46int     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}
72