~ubuntu-branches/ubuntu/saucy/postfix/saucy

« back to all changes in this revision

Viewing changes to src/util/unix_pass_listen.c

  • Committer: Bazaar Package Importer
  • Author(s): LaMont Jones
  • Date: 2011-02-22 11:20:43 UTC
  • mfrom: (1.1.27 upstream)
  • Revision ID: james.westby@ubuntu.com-20110222112043-c34ht219w3ybrilr
Tags: 2.8.0-2
* a little more lintian cleanup
* Fix missing format strings in smtp-sink.c

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*++
 
2
/* NAME
 
3
/*      unix_pass_listen 3
 
4
/* SUMMARY
 
5
/*      start UNIX-domain file descriptor listener
 
6
/* SYNOPSIS
 
7
/*      #include <listen.h>
 
8
/*
 
9
/*      int     unix_pass_listen(path, backlog, block_mode)
 
10
/*      const char *path;
 
11
/*      int     backlog;
 
12
/*      int     block_mode;
 
13
/*
 
14
/*      int     unix_pass_accept(fd)
 
15
/*      int     fd;
 
16
/* DESCRIPTION
 
17
/*      This module implements a listener that receives one file descriptor
 
18
/*      across each UNIX-domain connection that is made to it.
 
19
/*
 
20
/*      unix_pass_listen() creates a listener endpoint with the specified
 
21
/*      permissions, and returns a file descriptor to be used for accepting
 
22
/*      descriptors.
 
23
/*
 
24
/*      unix_pass_accept() accepts a descriptor.
 
25
/*
 
26
/*      Arguments:
 
27
/* .IP path
 
28
/*      Null-terminated string with connection destination.
 
29
/* .IP backlog
 
30
/*      This argument exists for compatibility and is ignored.
 
31
/* .IP block_mode
 
32
/*      Either NON_BLOCKING or BLOCKING. This does not affect the
 
33
/*      mode of accepted connections.
 
34
/* .IP fd
 
35
/*      File descriptor returned by unix_pass_listen().
 
36
/* DIAGNOSTICS
 
37
/*      Fatal errors: unix_pass_listen() aborts upon any system call failure.
 
38
/*      unix_pass_accept() leaves all error handling up to the caller.
 
39
/* LICENSE
 
40
/* .ad
 
41
/* .fi
 
42
/*      The Secure Mailer license must be distributed with this software.
 
43
/* AUTHOR(S)
 
44
/*      Wietse Venema
 
45
/*      IBM T.J. Watson Research
 
46
/*      P.O. Box 704
 
47
/*      Yorktown Heights, NY 10598, USA
 
48
/*--*/
 
49
 
 
50
/* System library. */
 
51
 
 
52
#include <sys_defs.h>
 
53
#include <sys/socket.h>
 
54
#include <errno.h>
 
55
#include <unistd.h>
 
56
 
 
57
/* Utility library. */
 
58
 
 
59
#include <msg.h>
 
60
#include <sane_accept.h>
 
61
#include <listen.h>
 
62
 
 
63
/* unix_pass_accept - accept descriptor */
 
64
 
 
65
int     unix_pass_accept(int listen_fd)
 
66
{
 
67
    const char *myname = "unix_pass_accept";
 
68
    int     accept_fd;
 
69
    int     recv_fd = -1;
 
70
 
 
71
    accept_fd = sane_accept(listen_fd, (struct sockaddr *) 0, (SOCKADDR_SIZE *) 0);
 
72
    if (accept_fd < 0) {
 
73
        if (errno != EAGAIN)
 
74
            msg_warn("%s: accept connection: %m", myname);
 
75
        return (-1);
 
76
    } else {
 
77
        if (read_wait(accept_fd, 100) < 0)
 
78
            msg_warn("%s: timeout receiving file descriptor: %m", myname);
 
79
        else if ((recv_fd = unix_recv_fd(accept_fd)) < 0)
 
80
            msg_warn("%s: cannot receive file descriptor: %m", myname);
 
81
        if (close(accept_fd) < 0)
 
82
            msg_warn("%s: close: %m", myname);
 
83
        return (recv_fd);
 
84
    }
 
85
}