clsync
Loading...
Searching...
No Matches
posix-hacks.c
Go to the documentation of this file.
1/*
2 clsync - file tree sync utility based on inotify/kqueue/bsm/gio
3
4 Copyright (C) 2013-2014 Dmitry Yu Okunev <dyokunev@ut.mephi.ru> 0x8E30679C
5
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#ifdef __FreeBSD__
21
22#define _GNU_SOURCE
23
24#include <stdio.h>
25#include <unistd.h>
26#include <fcntl.h>
27#include <errno.h>
28
29#define __POSIX_HACKS_C
30
31int reserved_fd[FOPEN_MAX + 1] = { -1};
32int reserved_fd_used;
33
34
35static inline int reserve_fdpair ( int idx )
36{
37 int pipe_fds[2];
38
39 if ( pipe2 ( pipe_fds, O_CLOEXEC | O_NONBLOCK ) )
40 return errno;
41
42 reserved_fd[ idx ] = pipe_fds[0];
43 reserved_fd[ idx + 1 ] = pipe_fds[1];
44 return 0;
45}
46
48{
49 int i;
50 // Reserving file descriptors from start to bypass FOPEN_MAX limit on fopen()/fdopen()
51 i = 0;
52
53 while ( i < ( FOPEN_MAX + 1 ) / 2 ) {
54 if ( reserve_fdpair ( i << 1 ) )
55 return errno;
56
57 i++;
58 }
59
60 reserved_fd_used = 0;
61 return 0;
62}
63
64FILE *posixhacks_fopen ( const char *path, const char *mode )
65{
66 close ( reserved_fd[reserved_fd_used++] );
67 return fopen ( path, mode );
68}
69
70int posixhacks_fclose ( FILE *fp )
71{
72 int rc;
73 int pipe_fds[2];
74 rc = fclose ( fp );
75
76 // reserving the file descriptor
77 if ( ! ( reserved_fd_used & 1 ) )
78 close ( reserved_fd[reserved_fd_used++] );
79
80 reserved_fd_used -= 2;
81
82 if ( reserve_fdpair ( reserved_fd_used ) )
83 return errno;
84
85 return rc;
86}
87
89{
90 int i;
91 i = 0;
92
93 while ( i < ( FOPEN_MAX + 1 ) / 2 ) {
94 close ( reserved_fd[ ( i << 1 ) ] );
95 close ( reserved_fd[ ( i << 1 ) + 1 ] );
96 i++;
97 }
98
99 return 0;
100}
101
102#endif
103
104extern int make_iso_compilers_happy; // anti-warning
105
int make_iso_compilers_happy
#define posixhacks_deinit()
Definition posix-hacks.h:35
#define posixhacks_init()
Definition posix-hacks.h:34