lavf: Drop deprecated AVFract type and related field
[libav.git] / libavformat / os_support.h
CommitLineData
04d7f601 1/*
124e2884 2 * various OS-feature replacement utilities
04d7f601
DB
3 * copyright (c) 2000, 2001, 2002 Fabrice Bellard
4 *
2912e87a 5 * This file is part of Libav.
b78e7197 6 *
2912e87a 7 * Libav is free software; you can redistribute it and/or
04d7f601
DB
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
b78e7197 10 * version 2.1 of the License, or (at your option) any later version.
04d7f601 11 *
2912e87a 12 * Libav is distributed in the hope that it will be useful,
04d7f601
DB
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
2912e87a 18 * License along with Libav; if not, write to the Free Software
04d7f601
DB
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
98790382
SS
22#ifndef AVFORMAT_OS_SUPPORT_H
23#define AVFORMAT_OS_SUPPORT_H
f71869a4
FB
24
25/**
ba87f080 26 * @file
f71869a4 27 * miscellaneous OS support macros and functions.
f71869a4
FB
28 */
29
da837937
DB
30#include "config.h"
31
5a608a23
RB
32#include <sys/stat.h>
33
960aff37
MS
34#ifdef _WIN32
35#if HAVE_DIRECT_H
36#include <direct.h>
37#endif
38#if HAVE_IO_H
39#include <io.h>
40#endif
41#endif
42
85a46ad6 43#if defined(_WIN32) && !defined(__MINGW32CE__)
acb3b537 44# include <fcntl.h>
1019b7c4 45# undef lseek
acb3b537 46# define lseek(f,p,w) _lseeki64((f), (p), (w))
1019b7c4 47# undef stat
f1dfaa7a 48# define stat _stati64
1019b7c4 49# undef fstat
f1dfaa7a 50# define fstat(f,s) _fstati64((f), (s))
4c8bd8dd 51#endif /* defined(_WIN32) && !defined(__MINGW32CE__) */
6ff3f3e7 52
bc574408
RP
53static inline int is_dos_path(const char *path)
54{
b250f9c6 55#if HAVE_DOS_PATHS
bc574408
RP
56 if (path[0] && path[1] == ':')
57 return 1;
58#endif
59 return 0;
60}
61
3794062a 62#if defined(__OS2__)
3f9d6e42
DY
63#define SHUT_RD 0
64#define SHUT_WR 1
65#define SHUT_RDWR 2
66#endif
67
4a9ca935
SP
68#if defined(_WIN32)
69#define SHUT_RD SD_RECEIVE
70#define SHUT_WR SD_SEND
71#define SHUT_RDWR SD_BOTH
5a608a23
RB
72
73#ifndef S_IRUSR
74#define S_IRUSR S_IREAD
75#endif
76#ifndef S_IWUSR
77#define S_IWUSR S_IWRITE
78#endif
4a9ca935
SP
79#endif
80
b250f9c6
AJ
81#if CONFIG_NETWORK
82#if !HAVE_SOCKLEN_T
591cf117
RP
83typedef int socklen_t;
84#endif
f71869a4 85
e9d511dc 86/* most of the time closing a socket is just closing an fd */
b250f9c6 87#if !HAVE_CLOSESOCKET
e9d511dc
FR
88#define closesocket close
89#endif
90
b250f9c6 91#if !HAVE_POLL_H
b0c858d8
FR
92typedef unsigned long nfds_t;
93
cdee08e3
MS
94#if HAVE_WINSOCK2_H
95#include <winsock2.h>
96#endif
97#if !HAVE_STRUCT_POLLFD
b0c858d8
FR
98struct pollfd {
99 int fd;
100 short events; /* events to look for */
d9526386 101 short revents; /* events that occurred */
b0c858d8
FR
102};
103
104/* events & revents */
105#define POLLIN 0x0001 /* any readable data available */
106#define POLLOUT 0x0002 /* file descriptor is writeable */
107#define POLLRDNORM POLLIN
108#define POLLWRNORM POLLOUT
109#define POLLRDBAND 0x0008 /* priority readable data */
110#define POLLWRBAND 0x0010 /* priority data can be written */
111#define POLLPRI 0x0020 /* high priority readable data */
112
113/* revents only */
114#define POLLERR 0x0004 /* errors pending */
115#define POLLHUP 0x0080 /* disconnected */
116#define POLLNVAL 0x1000 /* invalid file descriptor */
cdee08e3 117#endif
b0c858d8
FR
118
119
cab2eb87
MS
120int ff_poll(struct pollfd *fds, nfds_t numfds, int timeout);
121#define poll ff_poll
f8cda19e 122#endif /* HAVE_POLL_H */
409e1d71 123#endif /* CONFIG_NETWORK */
b0c858d8 124
960aff37
MS
125#if defined(__MINGW32CE__)
126#define mkdir(a, b) _mkdir(a)
127#elif defined(_WIN32)
128#include <stdio.h>
129#include <windows.h>
9326d64e 130#include "libavutil/wchar_filename.h"
960aff37 131
8ebf02f8
MS
132#ifdef WINAPI_FAMILY
133#include <winapifamily.h>
134// If a WINAPI_FAMILY is defined, check that the desktop API subset
135// is enabled
136#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
137#define USE_MOVEFILEEXA
138#endif
139#else
140// If no WINAPI_FAMILY is defined, assume the full API subset
141#define USE_MOVEFILEEXA
142#endif
143
960aff37
MS
144#define DEF_FS_FUNCTION(name, wfunc, afunc) \
145static inline int win32_##name(const char *filename_utf8) \
146{ \
147 wchar_t *filename_w; \
148 int ret; \
149 \
150 if (utf8towchar(filename_utf8, &filename_w)) \
151 return -1; \
152 if (!filename_w) \
153 goto fallback; \
154 \
155 ret = wfunc(filename_w); \
156 av_free(filename_w); \
157 return ret; \
158 \
159fallback: \
160 /* filename may be be in CP_ACP */ \
161 return afunc(filename_utf8); \
162}
163
164DEF_FS_FUNCTION(unlink, _wunlink, _unlink)
165DEF_FS_FUNCTION(mkdir, _wmkdir, _mkdir)
166DEF_FS_FUNCTION(rmdir, _wrmdir , _rmdir)
167
168static inline int win32_rename(const char *src_utf8, const char *dest_utf8)
169{
170 wchar_t *src_w, *dest_w;
171 int ret;
172
173 if (utf8towchar(src_utf8, &src_w))
174 return -1;
175 if (utf8towchar(dest_utf8, &dest_w)) {
176 av_free(src_w);
177 return -1;
178 }
179 if (!src_w || !dest_w) {
180 av_free(src_w);
181 av_free(dest_w);
182 goto fallback;
183 }
184
79fd186a 185 ret = MoveFileExW(src_w, dest_w, MOVEFILE_REPLACE_EXISTING);
960aff37
MS
186 av_free(src_w);
187 av_free(dest_w);
79fd186a
MS
188 // Lacking proper mapping from GetLastError() error codes to errno codes
189 if (ret)
190 errno = EPERM;
960aff37
MS
191 return ret;
192
193fallback:
194 /* filename may be be in CP_ACP */
8ebf02f8 195#ifdef USE_MOVEFILEEXA
79fd186a
MS
196 ret = MoveFileExA(src_utf8, dest_utf8, MOVEFILE_REPLACE_EXISTING);
197 if (ret)
198 errno = EPERM;
199#else
8ebf02f8
MS
200 /* Windows Phone doesn't have MoveFileExA, and for Windows Store apps,
201 * it is available but not allowed by the app certification kit. However,
202 * it's unlikely that anybody would input filenames in CP_ACP there, so this
79fd186a
MS
203 * fallback is kept mostly for completeness. Alternatively we could
204 * do MultiByteToWideChar(CP_ACP) and use MoveFileExW, but doing
205 * explicit conversions with CP_ACP is allegedly forbidden in windows
206 * store apps (or windows phone), and the notion of a native code page
207 * doesn't make much sense there. */
208 ret = rename(src_utf8, dest_utf8);
209#endif
210 return ret;
960aff37
MS
211}
212
213#define mkdir(a, b) win32_mkdir(a)
214#define rename win32_rename
215#define rmdir win32_rmdir
216#define unlink win32_unlink
217
218#endif
219
98790382 220#endif /* AVFORMAT_OS_SUPPORT_H */