Skip to content

Commit 3cadcc8

Browse files
Pj file io (#4638)
1 parent 0adcacb commit 3cadcc8

File tree

9 files changed

+158
-104
lines changed

9 files changed

+158
-104
lines changed

pjlib/build/pjlib.vcxproj

Lines changed: 6 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -620,33 +620,11 @@
620620
<ClCompile Include="..\src\pj\errno.c" />
621621
<ClCompile Include="..\src\pj\except.c" />
622622
<ClCompile Include="..\src\pj\fifobuf.c" />
623-
<ClCompile Include="..\src\pj\file_access_win32.c" />
624-
<ClCompile Include="..\src\pj\file_io_ansi.c">
625-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Dynamic|Win32'">true</ExcludedFromBuild>
626-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Dynamic|ARM'">true</ExcludedFromBuild>
627-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Dynamic|x64'">true</ExcludedFromBuild>
628-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Dynamic|ARM64'">true</ExcludedFromBuild>
629-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Static|Win32'">true</ExcludedFromBuild>
630-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Static|ARM'">true</ExcludedFromBuild>
631-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Static|x64'">true</ExcludedFromBuild>
632-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Static|ARM64'">true</ExcludedFromBuild>
633-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
634-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</ExcludedFromBuild>
635-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
636-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">true</ExcludedFromBuild>
637-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Dynamic|Win32'">true</ExcludedFromBuild>
638-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Dynamic|ARM'">true</ExcludedFromBuild>
639-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Dynamic|x64'">true</ExcludedFromBuild>
640-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Dynamic|ARM64'">true</ExcludedFromBuild>
641-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Static|Win32'">true</ExcludedFromBuild>
642-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Static|ARM'">true</ExcludedFromBuild>
643-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Static|x64'">true</ExcludedFromBuild>
644-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Static|ARM64'">true</ExcludedFromBuild>
645-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
646-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">true</ExcludedFromBuild>
647-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
648-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">true</ExcludedFromBuild>
623+
<ClCompile Include="..\src\pj\file_access_unistd.c">
624+
<ExcludedFromBuild>true</ExcludedFromBuild>
649625
</ClCompile>
626+
<ClCompile Include="..\src\pj\file_access_win32.c" />
627+
<ClCompile Include="..\src\pj\file_io_ansi.c" />
650628
<ClCompile Include="..\src\pj\file_io_win32.c" />
651629
<ClCompile Include="..\src\pj\guid.c" />
652630
<ClCompile Include="..\src\pj\guid_simple.c">
@@ -703,58 +681,8 @@
703681
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
704682
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">true</ExcludedFromBuild>
705683
</ClCompile>
706-
<ClCompile Include="..\src\pj\ioqueue_dummy.c">
707-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Dynamic|Win32'">true</ExcludedFromBuild>
708-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Dynamic|ARM'">true</ExcludedFromBuild>
709-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Dynamic|x64'">true</ExcludedFromBuild>
710-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Dynamic|ARM64'">true</ExcludedFromBuild>
711-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Static|Win32'">true</ExcludedFromBuild>
712-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Static|ARM'">true</ExcludedFromBuild>
713-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Static|x64'">true</ExcludedFromBuild>
714-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Static|ARM64'">true</ExcludedFromBuild>
715-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
716-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</ExcludedFromBuild>
717-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
718-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">true</ExcludedFromBuild>
719-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Dynamic|Win32'">true</ExcludedFromBuild>
720-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Dynamic|ARM'">true</ExcludedFromBuild>
721-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Dynamic|x64'">true</ExcludedFromBuild>
722-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Dynamic|ARM64'">true</ExcludedFromBuild>
723-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Static|Win32'">true</ExcludedFromBuild>
724-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Static|ARM'">true</ExcludedFromBuild>
725-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Static|x64'">true</ExcludedFromBuild>
726-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Static|ARM64'">true</ExcludedFromBuild>
727-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
728-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">true</ExcludedFromBuild>
729-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
730-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">true</ExcludedFromBuild>
731-
</ClCompile>
732-
<ClCompile Include="..\src\pj\ioqueue_epoll.c">
733-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Dynamic|Win32'">true</ExcludedFromBuild>
734-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Dynamic|ARM'">true</ExcludedFromBuild>
735-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Dynamic|x64'">true</ExcludedFromBuild>
736-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Dynamic|ARM64'">true</ExcludedFromBuild>
737-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Static|Win32'">true</ExcludedFromBuild>
738-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Static|ARM'">true</ExcludedFromBuild>
739-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Static|x64'">true</ExcludedFromBuild>
740-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-Static|ARM64'">true</ExcludedFromBuild>
741-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
742-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</ExcludedFromBuild>
743-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
744-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">true</ExcludedFromBuild>
745-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Dynamic|Win32'">true</ExcludedFromBuild>
746-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Dynamic|ARM'">true</ExcludedFromBuild>
747-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Dynamic|x64'">true</ExcludedFromBuild>
748-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Dynamic|ARM64'">true</ExcludedFromBuild>
749-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Static|Win32'">true</ExcludedFromBuild>
750-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Static|ARM'">true</ExcludedFromBuild>
751-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Static|x64'">true</ExcludedFromBuild>
752-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release-Static|ARM64'">true</ExcludedFromBuild>
753-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
754-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">true</ExcludedFromBuild>
755-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
756-
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">true</ExcludedFromBuild>
757-
</ClCompile>
684+
<ClCompile Include="..\src\pj\ioqueue_dummy.c" />
685+
<ClCompile Include="..\src\pj\ioqueue_epoll.c" />
758686
<ClCompile Include="..\src\pj\ioqueue_select.c" />
759687
<ClCompile Include="..\src\pj\ioqueue_winnt.c" />
760688
<ClCompile Include="..\src\pj\ip_helper_winphone8.c">

pjlib/build/pjlib.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,9 @@
233233
<ClCompile Include="..\src\pj\atomic_slist.c">
234234
<Filter>Source Files</Filter>
235235
</ClCompile>
236+
<ClCompile Include="..\src\pj\file_access_unistd.c">
237+
<Filter>Source Files\Other Targets</Filter>
238+
</ClCompile>
236239
</ItemGroup>
237240
<ItemGroup>
238241
<ClInclude Include="..\src\pj\ioqueue_common_abs.h">
@@ -457,5 +460,8 @@
457460
<ClInclude Include="..\src\pj\ssl_sock_imp_common.h">
458461
<Filter>Header Files</Filter>
459462
</ClInclude>
463+
<ClInclude Include="..\include\pj\argparse.h">
464+
<Filter>Header Files</Filter>
465+
</ClInclude>
460466
</ItemGroup>
461467
</Project>

pjlib/include/pj/compat/os_linux.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#define PJ_HAS_SYS_IOCTL_H 1
4444
#define PJ_HAS_SYS_SELECT_H 1
4545
#define PJ_HAS_SYS_SOCKET_H 1
46+
#define PJ_HAS_SYS_STAT_H 1
4647
#define PJ_HAS_SYS_TIME_H 1
4748
#define PJ_HAS_SYS_TIMEB_H 1
4849
#define PJ_HAS_SYS_TYPES_H 1

pjlib/include/pj/compat/os_win32.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
#define PJ_HAS_SYS_IOCTL_H 0
5858
#define PJ_HAS_SYS_SELECT_H 0
5959
#define PJ_HAS_SYS_SOCKET_H 0
60+
#define PJ_HAS_SYS_STAT_H 1
6061
#define PJ_HAS_SYS_TIME_H 0
6162
#define PJ_HAS_SYS_TIMEB_H 1
6263
#define PJ_HAS_SYS_TYPES_H 1

pjlib/include/pj/config.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1259,6 +1259,27 @@
12591259
# endif // PJ_WIN32
12601260
#endif //PJ_ATOMIC_SLIST_IMPLEMENTATION
12611261

1262+
/**
1263+
* File I/O backend implementation.
1264+
* Select one of these implementations in PJ_FILE_IO.
1265+
* By default, PJ_FILE_IO_WIN32 is selected on Windows platform,
1266+
* otherwise PJ_FILE_IO_ANSI is selected.
1267+
*
1268+
* select ioqueue supports both backend under Windows, but IOCP
1269+
* supports Win32 file I/O only.
1270+
*/
1271+
#define PJ_FILE_IO_WIN32 0 /* Using Win32 file I/O */
1272+
#define PJ_FILE_IO_ANSI 1 /* Using ANSI C file I/O */
1273+
1274+
#ifndef PJ_FILE_IO
1275+
# ifdef PJ_WIN32
1276+
# define PJ_FILE_IO PJ_FILE_IO_WIN32
1277+
# else
1278+
# define PJ_FILE_IO PJ_FILE_IO_ANSI
1279+
# endif // PJ_WIN32
1280+
#elif PJ_FILE_IO == PJ_FILE_IO_ANSI && PJ_IOQUEUE_IMP == PJ_IOQUEUE_IMP_IOCP
1281+
# error IOCP ioqueue does not support ANSI file backend
1282+
#endif //PJ_FILE_IO
12621283

12631284
/** @} */
12641285

pjlib/include/pj/file_access.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,15 @@ PJ_DECL(pj_bool_t) pj_file_exists(const char *filename);
6666
*/
6767
PJ_DECL(pj_off_t) pj_file_size(const char *filename);
6868

69+
/**
70+
* Returns the size of the file.
71+
*
72+
* @param fh The file handle (or FILE* for ansi file backend).
73+
*
74+
* @return The file size in bytes or -1 on error.
75+
*/
76+
PJ_DECL(pj_off_t) pj_file_size_by_handle(pj_oshandle_t fh);
77+
6978
/**
7079
* Delete a file.
7180
*

pjlib/include/pj/file_io.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,22 @@ enum pj_file_access
6363
File will be truncated. */
6464
PJ_O_APPEND = 0x1108, /**< Append to existing file. */
6565
PJ_O_CLOEXEC = 0x1104, /**< Enable unix close-on-exec flag. */
66+
67+
PJ_O_ASYNC = 0x200, /**< Open file for asynchronous
68+
(OVERLAPPED) IO.
69+
Currently supports on Windows
70+
platform only. Otherwise is ignored. */
71+
PJ_O_SEQUENTIAL = 0x400, /**< Access is intended to be sequential
72+
from beginning to end. This flag
73+
should not be used together with
74+
PJ_O_RANDOM.
75+
Currently supports on Windows
76+
platform only. Otherwise is ignored. */
77+
PJ_O_RANDOM = 0x800 /**< Access is intended to be random.
78+
This flag should not be used together
79+
with PJ_O_SEQUENTIAL.
80+
Currently supports on Windows
81+
platform only.Otherwise is ignored. */
6682
};
6783

6884
/**

pjlib/src/pj/file_io_ansi.c

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,21 @@
2525
#if defined(PJ_HAS_FCNTL_H) && PJ_HAS_FCNTL_H != 0
2626
#include <fcntl.h>
2727
#endif
28+
#if defined(PJ_HAS_SYS_TYPES_H) && PJ_HAS_SYS_TYPES_H != 0
29+
#include <sys/types.h>
30+
#endif
31+
#if defined(PJ_HAS_SYS_STAT_H) && PJ_HAS_SYS_STAT_H != 0
32+
#include <sys/stat.h>
33+
#endif
34+
35+
#if PJ_FILE_IO == PJ_FILE_IO_ANSI
2836

2937
PJ_DEF(pj_status_t) pj_file_open( pj_pool_t *pool,
3038
const char *pathname,
3139
unsigned flags,
3240
pj_oshandle_t *fd)
3341
{
34-
char mode[8];
42+
char mode[10];
3543
char *p = mode;
3644

3745
PJ_ASSERT_RETURN(pathname && fd, PJ_EINVAL);
@@ -66,6 +74,19 @@ PJ_DEF(pj_status_t) pj_file_open( pj_pool_t *pool,
6674
return PJ_EINVAL;
6775

6876
*p++ = 'b';
77+
78+
#if defined(_O_SEQUENTIAL)
79+
/* MSVC: file access is primarily sequential */
80+
if ((flags & PJ_O_SEQUENTIAL) == PJ_O_SEQUENTIAL)
81+
*p++ = 'S';
82+
#endif
83+
84+
#if defined(_O_RANDOM)
85+
/* MSVC: file access is primarily random */
86+
if ((flags & PJ_O_RANDOM) == PJ_O_RANDOM)
87+
*p++ = 'R';
88+
#endif
89+
6990
*p++ = '\0';
7091

7192
*fd = fopen(pathname, mode);
@@ -182,3 +203,57 @@ PJ_DEF(pj_status_t) pj_file_flush(pj_oshandle_t fd)
182203

183204
return PJ_SUCCESS;
184205
}
206+
207+
/*
208+
* pj_file_size_by_handle()
209+
*/
210+
PJ_DECL(pj_off_t) pj_file_size_by_handle(pj_oshandle_t fh)
211+
{
212+
#if !defined(PJ_HAS_SYS_STAT_H) && PJ_HAS_SYS_STAT_H == 0
213+
214+
// fallback implementation: seek to end of file
215+
// ineffective, not thread safe (because it changes file pointer),
216+
// but better than nothing.
217+
// use fstat() instead
218+
219+
pj_off_t size = -1, pos;
220+
221+
PJ_ASSERT_RETURN(fh, -1);
222+
223+
/* get initial file pointer */
224+
if (pj_file_getpos(fh, &pos) != PJ_SUCCESS)
225+
return -1;
226+
227+
if (pj_file_setpos(fh, 0, PJ_SEEK_END) != PJ_SUCCESS ||/* seek to end of file */
228+
pj_file_getpos(fh, &size) != PJ_SUCCESS) /* get current file pointer */
229+
{
230+
size = -1;
231+
}
232+
233+
/* seek back to reset file pointer */
234+
if (pj_file_setpos(fh, pos, PJ_SEEK_SET) != PJ_SUCCESS)
235+
return -1;
236+
237+
return size;
238+
239+
#else
240+
241+
#if (defined(PJ_HAS_UNISTD_H) && PJ_HAS_UNISTD_H != 0)
242+
# define _fileno(f) fileno(f)
243+
#endif
244+
struct stat buf;
245+
int fd, result;
246+
247+
fd = _fileno((FILE*)fh);
248+
if (fd == -1)
249+
return -1;
250+
251+
result = fstat(fd, &buf);
252+
if (result != 0)
253+
return -1;
254+
255+
return buf.st_size;
256+
#endif
257+
}
258+
259+
#endif //PJ_FILE_IO == PJ_FILE_IO_ANSI

0 commit comments

Comments
 (0)