mktemp.c 512 B

123456789101112131415161718192021222324252627282930
  1. #define _GNU_SOURCE
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <sys/stat.h>
  6. char *mktemp(char *template)
  7. {
  8. size_t l = strlen(template);
  9. int retries = 100;
  10. struct stat st;
  11. if (l < 6 || memcmp(template+l-6, "XXXXXX", 6)) {
  12. errno = EINVAL;
  13. *template = 0;
  14. return template;
  15. }
  16. do {
  17. __randname(template+l-6);
  18. if (stat(template, &st)) {
  19. if (errno != ENOENT) *template = 0;
  20. return template;
  21. }
  22. } while (--retries);
  23. *template = 0;
  24. errno = EEXIST;
  25. return template;
  26. }