clsync
Toggle main menu visibility
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
31
int
reserved_fd[FOPEN_MAX + 1] = { -1};
32
int
reserved_fd_used;
33
34
35
static
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
47
int
posixhacks_init
()
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
64
FILE *posixhacks_fopen (
const
char
*path,
const
char
*mode )
65
{
66
close ( reserved_fd[reserved_fd_used++] );
67
return
fopen ( path, mode );
68
}
69
70
int
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
88
int
posixhacks_deinit
()
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
104
extern
int
make_iso_compilers_happy
;
// anti-warning
105
make_iso_compilers_happy
int make_iso_compilers_happy
posixhacks_deinit
#define posixhacks_deinit()
Definition
posix-hacks.h:35
posixhacks_init
#define posixhacks_init()
Definition
posix-hacks.h:34
Generated on
for clsync by
1.17.0