]> git.meshlink.io Git - catta/blob - avahi-core/fdutil.c
FreeBSD portability fixes contributed by marcus
[catta] / avahi-core / fdutil.c
1 /* $Id$ */
2
3 /***
4   This file is part of avahi.
5  
6   avahi is free software; you can redistribute it and/or modify it
7   under the terms of the GNU Lesser General Public License as
8   published by the Free Software Foundation; either version 2.1 of the
9   License, or (at your option) any later version.
10  
11   avahi is distributed in the hope that it will be useful, but WITHOUT
12   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13   or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
14   Public License for more details.
15  
16   You should have received a copy of the GNU Lesser General Public
17   License along with avahi; if not, write to the Free Software
18   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19   USA.
20 ***/
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <sys/select.h>
27 #include <unistd.h>
28 #include <fcntl.h>
29 #include <assert.h>
30
31 #include "fdutil.h"
32
33 int avahi_set_cloexec(int fd) {
34     int n;
35
36     assert(fd >= 0);
37     
38     if ((n = fcntl(fd, F_GETFD)) < 0)
39         return -1;
40
41     if (n & FD_CLOEXEC)
42         return 0;
43
44     return fcntl(fd, F_SETFD, n|FD_CLOEXEC);
45 }
46
47 int avahi_set_nonblock(int fd) {
48     int n;
49     
50     assert(fd >= 0);
51
52     if ((n = fcntl(fd, F_GETFL)) < 0)
53         return -1;
54
55     if (n & O_NONBLOCK)
56         return 0;
57
58     return fcntl(fd, F_SETFL, n|O_NONBLOCK);
59 }
60
61 int avahi_wait_for_write(int fd) {
62     fd_set fds;
63     int r;
64     
65     FD_ZERO(&fds);
66     FD_SET(fd, &fds);
67     
68     if ((r = select(fd+1, NULL, &fds, NULL, NULL)) < 0)
69         return -1;
70     
71     assert(r > 0);
72
73     return 0;
74 }