@ -24,6 +24,8 @@
//
//========================================================================
# define _GNU_SOURCE
# include "internal.h"
# include <stdio.h>
@ -101,43 +103,13 @@ static GLboolean createSurface(_GLFWwindow* window,
}
static int
set_cloexec_or_close ( int fd )
{
long flags ;
if ( fd = = - 1 )
return - 1 ;
flags = fcntl ( fd , F_GETFD ) ;
if ( flags = = - 1 )
goto err ;
if ( fcntl ( fd , F_SETFD , flags | FD_CLOEXEC ) = = - 1 )
goto err ;
return fd ;
err :
close ( fd ) ;
return - 1 ;
}
static int
create_tmpfile_cloexec ( char * tmpname )
createTmpfileCloexec ( char * tmpname )
{
int fd ;
# ifdef HAVE_MKOSTEMP
fd = mkostemp ( tmpname , O_CLOEXEC ) ;
if ( fd > = 0 )
unlink ( tmpname ) ;
# else
fd = mkstemp ( tmpname ) ;
if ( fd > = 0 ) {
fd = set_cloexec_or_close ( fd ) ;
unlink ( tmpname ) ;
}
# endif
return fd ;
}
@ -157,23 +129,23 @@ create_tmpfile_cloexec(char *tmpname)
* transmitting the file descriptor over Unix sockets using the
* SCM_RIGHTS methods .
*
* If the C library implements posix_fallocate ( ) , it is used to
* guarantee that disk space is available for the file at the
* given size . If disk space is insufficent , errno is set to ENOSPC .
* If posix_fallocate ( ) is not supported , program may receive
* SIGBUS on accessing mmap ( ) ' ed file contents instead .
* posix_fallocate ( ) is used to guarantee that disk space is available
* for the file at the given size . If disk space is insufficent , errno
* is set to ENOSPC . If posix_fallocate ( ) is not supported , program may
* receive SIGBUS on accessing mmap ( ) ' ed file contents instead .
*/
int
os_create_anonymous_f ile( off_t size )
createAnonymousF ile( off_t size )
{
static const char template [ ] = " /glfw-shared-XXXXXX " ;
const char * path ;
char * name ;
const char * path ;
char * name ;
int fd ;
int ret ;
path = getenv ( " XDG_RUNTIME_DIR " ) ;
if ( ! path ) {
if ( ! path )
{
errno = ENOENT ;
return - 1 ;
}
@ -182,14 +154,15 @@ os_create_anonymous_file(off_t size)
strcpy ( name , path ) ;
strcat ( name , template ) ;
fd = create_tmpfile_c loexec ( name ) ;
fd = createTmpfileC loexec ( name ) ;
free ( name ) ;
if ( fd < 0 )
return - 1 ;
ret = posix_fallocate ( fd , 0 , size ) ;
if ( ret ! = 0 ) {
if ( ret ! = 0 )
{
close ( fd ) ;
errno = ret ;
return - 1 ;
@ -403,7 +376,7 @@ int _glfwPlatformCreateCursor(_GLFWcursor* cursor,
void * data ;
int fd , i ;
fd = os_create_anonymous_f ile( length ) ;
fd = createAnonymousF ile( length ) ;
if ( fd < 0 ) {
_glfwInputError ( GLFW_PLATFORM_ERROR ,
" Wayland: Creating a buffer file for %d B failed: %m \n " ,