Data-Queue-Shared
view release on metacpan or search on metacpan
__atomic_thread_fence(__ATOMIC_SEQ_CST);
}
/* Securely obtain a fd: create exclusively (O_CREAT|O_EXCL|O_NOFOLLOW at
* file_mode, default 0600 = owner-only), or attach an existing file
* (O_RDWR|O_NOFOLLOW, no O_CREAT). Blocks a symlink swap or a pre-seeded/
* hard-linked backing file; cross-user sharing is opt-in via a wider file_mode. */
static int queue_secure_open(const char *path, mode_t file_mode, char *errbuf) {
for (int attempt = 0; attempt < 100; attempt++) {
int fd = open(path, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW|O_CLOEXEC, file_mode);
if (fd >= 0) { (void)fchmod(fd, file_mode); return fd; } /* exact mode: umask narrowed the O_EXCL create */
if (errno != EEXIST) { QUEUE_ERR("create(%s): %s", path, strerror(errno)); return -1; }
fd = open(path, O_RDWR|O_NOFOLLOW|O_CLOEXEC);
if (fd >= 0) return fd;
if (errno == ENOENT) continue;
QUEUE_ERR("open(%s): %s", path, strerror(errno));
return -1;
}
QUEUE_ERR("open(%s): create/attach kept racing", path);
return -1;
}
( run in 0.911 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )