#include<unistd.h>#if ! _POSIX_MAPPED_FILES
#include<rt/shm_open.c>#else
#include<errno.h>#include<sys/mman.h>#include<fcntl.h>#include<string.h>#include<stdlib.h>#include<paths.h>#define SHMDIR (_PATH_DEV "shm/")
/* Open shared memory object. */intshm_open(constchar*name,intoflag,mode_tmode){size_tnamelen;char*fname;intfd;/* Construct the filename. */while(name[0]=='/')++name;if(name[0]=='\0'){/* The name "/" is not supported. */__set_errno(EINVAL);return-1;}namelen=strlen(name);fname=(char*)__alloca(sizeofSHMDIR-1+namelen+1);__mempcpy(__mempcpy(fname,SHMDIR,sizeofSHMDIR-1),name,namelen+1);fd=open(name,oflag,mode);if(fd!=-1){/* We got a descriptor. Now set the FD_CLOEXEC bit. */intflags=fcntl(fd,F_GETFD,0);if(__builtin_expect(flags,0)!=-1){flags|=FD_CLOEXEC;flags=fcntl(fd,F_SETFD,flags);}if(flags==-1){/* Something went wrong. We cannot return the descriptor. */intsave_errno=errno;close(fd);fd=-1;__set_errno(save_errno);}}returnfd;}#endif
#include<unistd.h>#if ! _POSIX_MAPPED_FILES
# include <rt/shm_open.c>
#else
# include <fcntl.h>
# include <shm-directory.h>
/* Open shared memory object. */intshm_open(constchar*name,intoflag,mode_tmode){SHM_GET_NAME(EINVAL,-1,"");# ifdef O_NOFOLLOW
oflag|=O_NOFOLLOW;# endif
# ifdef O_CLOEXEC
oflag|=O_CLOEXEC;# endif
intfd=open(shm_name,oflag,mode);if(fd==-1&&__glibc_unlikely(errno==EISDIR))/* It might be better to fold this error with EINVAL since
directory names are just another example for unsuitable shared
object names and the standard does not mention EISDIR. */__set_errno(EINVAL);# ifndef O_CLOEXEC
if(fd!=-1){/* We got a descriptor. Now set the FD_CLOEXEC bit. */intflags=fcntl(fd,F_GETFD,0);if(__glibc_likely(flags!=-1)){flags|=FD_CLOEXEC;flags=fcntl(fd,F_SETFD,flags);}if(flags==-1){/* Something went wrong. We cannot return the descriptor. */intsave_errno=errno;close(fd);fd=-1;__set_errno(save_errno);}}# endif
returnfd;}#endif /* _POSIX_MAPPED_FILES */