clsync
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 
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 
close
close(fd_w)
posixhacks_deinit
#define posixhacks_deinit()
Definition: posix-hacks.h:35
make_iso_compilers_happy
int make_iso_compilers_happy
posixhacks_init
#define posixhacks_init()
Definition: posix-hacks.h:34