1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-28 01:52:19 +00:00
mpv/osdep
wm4 ef507ad50a osdep: add mkostemps() emulation
Supposed to follow the standard function.

The standard function is not standard, but a GNU extension. Adding some
ifdef mess is pointless too - it has no advantages other than having a
mess, and not spotting implementation bugs in the emulation due to
running it only on "obscure" platforms (like Windows, so most computers
actually, except the developer's platform).

There is mkstemp(), which at least is in POSIX 2008. But it's 100%
useless, except in some obscure cases: it doesn't set O_CLOEXEC, nor can
you pass it to it. Without O_CLOEXEC, we'd leak the temporary file to
all child processes. (The fact that the file, which is expected to reach
double or tripple digit GB sizes, will be deleted only once all
processes unreference the FD, makes this sort of a big deal. You could
ftruncate() it, but that doesn't fix all the other problems.)

Why did POSIX standardize mkstemp() and O_CLOEXEC apparently at the same
time, but provided no way to pass O_CLOEXEC to mkstemp()? With the
introduction of O_CLOEXEC, they acknowledged that there's a need to
atomically set the FD_CLOEXEC flag when creating file descriptors.
(FD_CLOEXEC was standard before that, but setting it with fcntl() is
racy.) You're much more likely to need a temp file that is CLOEXEC
rather than the opposite, and even if they were somehow opposed to
CLOEXEC by default (such as for compat. reasons), surely POSIX could
have standardized mkostemp() too or instead.

And then there's the fact that this whole O_CLOEXEC mess is stupid.
Surely there would have been a better way to handle this, instead of
requiring adding O_CLOEXEC to almost ALL instances of open() in all code
that has been written ever. The justification for this is that the
historic default was wrong, and you can't change it (e.g. this won't
work: changing the behavior of exec() and not inherit the FD to the
child process, unless a hypothetical O_KEEP_EXEC flag is set).

But on the other hand, surely you could have introduced an exec()
variant which does close all FDs, except a whitelist of FDs passed to
it. Let's call it execve2(). In fact, I'm going to argue that exec()
call sites are the most aware of whether (and which) FDs to inherit.
Some programs even tried to explicitly iterate over all opened FDs and
explicitly close "unwanted" FDs (which of course was problematic for
other reasons), and such an execve2() call would have been the ideal
solution.

Maybe this proposed solution would have had problems too. But surely
revisiting and reviewing every exec*() call would have been simpler than
reviewing every open() call. And more importantly, having to extend
every damn library function that either calls open() or creates FDs in
some other way, like mkstemp().

What argument are there going to be against this? That there will be
library code that can't keep working correctly with processes that use
the "old" exec? Well, what about all my legacy library code that uses
open() incorrectly, and that will break no matter what?

Well, I'm not going to claim that I can come up with better solutions
than POSIX (generally or in this case), but this situation is ABSOLUTELY
ATROCIOUS. It makes win32 programming look attractive compared to POSIX,
that standard pandering to dead people from the past. (Note: not trying
to insult dead people.)

I'm not sure what POSIX is even doing. Anything useful? Doesn't look
like it to me. Are they paid? Why? They didn't even fix the locale mess,
nor do they intend to. I bet they're proud of discussing compatibility
to 70ies code day in and day out iwtohut ever producing anything useful.
What a load of crap. They seriously got to do better than this.

Oh, and my wrapper is probably buggy. Fortunately that doesn't matter.
Also I'm dumping this into io.h. Originally, io.h was just supposed to
replace broken implementation of standard functions by MinGW (and then
by Android), but whatever, just give a dumping ground for shit code.
2019-09-19 20:37:05 +02:00
..
android android: posix_spawn(p) replacement 2017-09-22 09:24:19 +02:00
ar HIDRemote: fix volume buttons on macOS 10.13 2018-04-17 20:10:17 +03:00
win32 win32: fix massive memory corruption (take 2) 2017-08-21 18:42:04 +02:00
atomic.h demux: support for some kinds of timed metadata 2018-04-18 01:17:42 +03:00
compiler.h osdep: add portable C11-like alignof() macro 2018-05-24 19:56:35 +02:00
endian.h
getpid.h lua+js: Implement utils.getpid() 2018-02-13 20:16:01 -08:00
glob-win.c Universal Windows Plaform (UWP) support 2017-06-29 10:36:16 +02:00
io.c osdep: add mkostemps() emulation 2019-09-19 20:37:05 +02:00
io.h osdep: add mkostemps() emulation 2019-09-19 20:37:05 +02:00
macOS_mpv_helper.swift cocoa-cb: migrate to swift 5 with swift 4 fallback 2019-07-21 18:13:07 +03:00
macOS_swift_bridge.h cocoa-cb: add support for VOCTRL_GET_DISPLAY_NAMES 2019-02-10 22:39:25 +02:00
macOS_swift_compat.swift cocoa-cb: migrate to swift 5 with swift 4 fallback 2019-07-21 18:13:07 +03:00
macOS_swift_extensions.swift cocoa-cb: migrate to swift 5 with swift 4 fallback 2019-07-21 18:13:07 +03:00
macosx_application_objc.h cocoa-cb: remove pre-allocation of window, view and layer 2018-06-12 01:51:01 +03:00
macosx_application.h cocoa-cb: add support for custom colored title bar 2019-04-02 02:09:01 +03:00
macosx_application.m cocoa-cb: add support for custom colored title bar 2019-04-02 02:09:01 +03:00
macosx_compat.h mac: add missing semicolon to macosx_compat.h 2019-01-26 20:44:36 +01:00
macosx_events_objc.h osx: code cleanups and cosmetic fixes 2018-01-20 14:43:49 -08:00
macosx_events.h osx: code cleanups and cosmetic fixes 2018-01-20 14:43:49 -08:00
macosx_events.m macosx_events: fix crash when shutting down during window animations 2019-03-13 19:44:34 +01:00
macosx_menubar_objc.h osx: refactor menu bar creation 2017-08-18 19:20:41 +02:00
macosx_menubar.h osx: move menu bar creation into its own file 2017-08-18 19:20:41 +02:00
macosx_menubar.m osx: Fix initialization and access of service menu 2018-08-11 13:00:08 +02:00
macosx_touchbar.h osx: change license of OSX and cocoa files to LGPL 2017-06-24 16:29:22 +02:00
macosx_touchbar.m osx: change license of OSX and cocoa files to LGPL 2017-06-24 16:29:22 +02:00
macosx_versions.h osx: change license of OSX and cocoa files to LGPL 2017-06-24 16:29:22 +02:00
main-fn-cocoa.c
main-fn-unix.c
main-fn-win.c
main-fn.h
mpv.exe.manifest
mpv.rc mpv.rc: readd actual version info 2018-01-01 21:44:01 +00:00
path-macosx.m osx: fix bundle on macOS High Sierra (10.13) 2017-10-03 11:30:56 +02:00
path-unix.c
path-uwp.c Universal Windows Plaform (UWP) support 2017-06-29 10:36:16 +02:00
path-win.c
path.h Universal Windows Plaform (UWP) support 2017-06-29 10:36:16 +02:00
polldev.c osdep: add poll shim for macOS 2017-12-09 21:11:46 +02:00
polldev.h osdep: add poll shim for macOS 2017-12-09 21:11:46 +02:00
posix-spawn.h osdep: make use of HAVE_ANDROID 2018-08-20 17:16:22 +02:00
semaphore_osx.c Fix use of ISC license 2017-04-15 16:20:00 +02:00
semaphore.h
strnlen.h osdep: make use of HAVE_ANDROID 2018-08-20 17:16:22 +02:00
subprocess-dummy.c build: change how some OS specific source files are selected 2017-06-29 10:30:16 +02:00
subprocess-posix.c misc: move mp_cancel from stream.c to thread_tools.c 2018-05-24 19:56:35 +02:00
subprocess-win.c misc: move mp_cancel from stream.c to thread_tools.c 2018-05-24 19:56:35 +02:00
subprocess.c build: change how some OS specific source files are selected 2017-06-29 10:30:16 +02:00
subprocess.h
terminal-dummy.c build: change how some OS specific source files are selected 2017-06-29 10:30:16 +02:00
terminal-unix.c terminal-unix: stop trying to read when terminal disappears 2018-05-25 10:17:06 +02:00
terminal-win.c terminal: remove unused return value 2017-06-27 18:08:56 +02:00
terminal.h terminal: remove unused return value 2017-06-27 18:08:56 +02:00
threads.c Revert "osdep: NetBSD pthread_setname_np()" 2017-06-22 13:17:40 +02:00
threads.h
timer-darwin.c
timer-linux.c build: remove nanosleep() check 2017-12-02 23:29:40 +01:00
timer-win2.c Universal Windows Plaform (UWP) support 2017-06-29 10:36:16 +02:00
timer.c timer: remove an unused helper function 2018-05-24 19:56:35 +02:00
timer.h demux, stream: readd cache-speed in some other form 2018-12-06 10:30:41 +01:00
w32_keyboard.c w32_common: handle media keys 2017-08-05 02:38:44 +10:00
w32_keyboard.h w32_common: handle media keys 2017-08-05 02:38:44 +10:00
win32-console-wrapper.c win32-console-wrapper: silence missing prototype warnings 2019-05-10 21:06:58 +10:00
windows_utils.c vo_opengl: angle: rewrite with custom swap chain 2017-02-07 22:45:07 +11:00
windows_utils.h win32: add COM-specific SAFE_RELEASE to windows_utils.h 2017-01-30 00:22:30 +11:00