- /* This is much like like mkostemp() but avoids using any
- * static variables, thus is async signal safe. Also, it's not
- * subject to umask(). */
-
- s = endswith(pattern, "XXXXXX");
- if (!s)
- return -EINVAL;
-
- while (tries--) {
- unsigned i;
- int fd;
-
- r = dev_urandom(s, 6);
- if (r < 0)
- return r;
-
- for (i = 0; i < 6; i++)
- s[i] = ALPHANUMERICAL[(unsigned) s[i] % (sizeof(ALPHANUMERICAL)-1)];
-
- fd = open(pattern, flags|O_EXCL|O_CREAT|O_NOCTTY|O_NOFOLLOW, S_IRUSR|S_IWUSR);
- if (fd >= 0)
- return fd;
- if (!IN_SET(errno, EEXIST, EINTR))
- return -errno;
- }