github.com/afumu/libc@v0.0.6/musl/src/mman/shm_open.c (about)

     1  #include <sys/mman.h>
     2  #include <errno.h>
     3  #include <fcntl.h>
     4  #include <unistd.h>
     5  #include <string.h>
     6  #include <limits.h>
     7  #include <pthread.h>
     8  
     9  char *__shm_mapname(const char *name, char *buf)
    10  {
    11  	char *p;
    12  	while (*name == '/') name++;
    13  	if (*(p = __strchrnul(name, '/')) || p==name ||
    14  	    (p-name <= 2 && name[0]=='.' && p[-1]=='.')) {
    15  		errno = EINVAL;
    16  		return 0;
    17  	}
    18  	if (p-name > NAME_MAX) {
    19  		errno = ENAMETOOLONG;
    20  		return 0;
    21  	}
    22  	memcpy(buf, "/dev/shm/", 9);
    23  	memcpy(buf+9, name, p-name+1);
    24  	return buf;
    25  }
    26  
    27  int shm_open(const char *name, int flag, mode_t mode)
    28  {
    29  	int cs;
    30  	char buf[NAME_MAX+10];
    31  	if (!(name = __shm_mapname(name, buf))) return -1;
    32  	pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
    33  	int fd = open(name, flag|O_NOFOLLOW|O_CLOEXEC|O_NONBLOCK, mode);
    34  	pthread_setcancelstate(cs, 0);
    35  	return fd;
    36  }
    37  
    38  int shm_unlink(const char *name)
    39  {
    40  	char buf[NAME_MAX+10];
    41  	if (!(name = __shm_mapname(name, buf))) return -1;
    42  	return unlink(name);
    43  }