wl.c (899B)


      1 #include <errno.h>
      2 #include <fcntl.h>
      3 #include <sys/mman.h>
      4 #include <time.h>
      5 #include <unistd.h>
      6 
      7 static void randname(char* buf) {
      8   struct timespec ts;
      9   clock_gettime(CLOCK_REALTIME, &ts);
     10   long r = ts.tv_nsec;
     11   for (int i = 0; i < 6; ++i) {
     12     buf[i] = 'A' + (r & 15) + (r & 16) * 2;
     13     r >>= 5;
     14   }
     15 }
     16 
     17 static int create_shm_file(void) {
     18   int retries = 100;
     19   do {
     20     char name[] = "/wl_shm-XXXXXX";
     21     randname(name + sizeof(name) - 7);
     22     --retries;
     23     int fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0600);
     24     if (fd >= 0) {
     25       shm_unlink(name);
     26       return fd;
     27     }
     28   } while (retries > 0 && errno == EEXIST);
     29   return -1;
     30 }
     31 
     32 int allocate_shm_file(size_t size) {
     33   int fd = create_shm_file();
     34   if (fd < 0) return -1;
     35   int ret;
     36   do {
     37     ret = ftruncate(fd, size);
     38   } while (ret < 0 && errno == EINTR);
     39   if (ret < 0) {
     40     close(fd);
     41     return -1;
     42   }
     43   return fd;
     44 }