+static
+int create_posix_shm(void)
+{
+ char tmp_name[NAME_MAX] = "/ust-shm-tmp-XXXXXX";
+ int shmfd, ret;
+
+ /*
+ * Allocate shm, and immediately unlink its shm oject, keeping
+ * only the file descriptor as a reference to the object. If it
+ * already exists (caused by short race window during which the
+ * global object exists in a concurrent shm_open), simply retry.
+ * We specifically do _not_ use the / at the beginning of the
+ * pathname so that some OS implementations can keep it local to
+ * the process (POSIX leaves this implementation-defined).
+ */
+ do {
+ /*
+ * Using mktemp filename with O_CREAT | O_EXCL open
+ * flags.
+ */
+ (void) mktemp(tmp_name);
+ if (tmp_name[0] == '\0') {
+ PERROR("mktemp");
+ goto error_shm_open;
+ }
+ shmfd = shm_open(tmp_name,
+ O_CREAT | O_EXCL | O_RDWR, 0700);
+ } while (shmfd < 0 && (errno == EEXIST || errno == EACCES));
+ if (shmfd < 0) {
+ PERROR("shm_open");
+ goto error_shm_open;
+ }
+ ret = shm_unlink(tmp_name);
+ if (ret < 0 && errno != ENOENT) {
+ PERROR("shm_unlink");
+ goto error_shm_release;
+ }
+ return shmfd;
+
+error_shm_release:
+ ret = close(shmfd);
+ if (ret) {
+ PERROR("close");
+ assert(0);
+ }
+error_shm_open:
+ return -1;
+}
+
+static
+int create_shared_file(const char *shm_path)
+{
+ return open(shm_path, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+}
+