logo

utils-std

Collection of commonly available Unix tools git clone https://anongit.hacktivis.me/git/utils-std.git

mktemp.c (1913B)


  1. // utils-std: Collection of commonly available Unix tools
  2. // SPDX-FileCopyrightText: 2017 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
  3. // SPDX-License-Identifier: MPL-2.0
  4. #define _POSIX_C_SOURCE 200809L
  5. #include <errno.h>
  6. #include <limits.h> // PATH_MAX
  7. #include <stdbool.h>
  8. #include <stdio.h> // fprintf
  9. #include <stdlib.h> // getenv
  10. #include <string.h> // strerror
  11. #include <unistd.h> // getopt
  12. int
  13. main(int argc, char *argv[])
  14. {
  15. bool o_create_dir = false, o_quiet = false;
  16. char template[PATH_MAX] = "tmp.XXXXXXXXXX";
  17. const char *tmpdir = NULL;
  18. int c = -1;
  19. while((c = getopt(argc, argv, ":dqp:t")) != -1)
  20. {
  21. switch(c)
  22. {
  23. case 'd':
  24. o_create_dir = true;
  25. break;
  26. case 'q':
  27. o_quiet = true;
  28. break;
  29. case 'p':
  30. tmpdir = optarg;
  31. break;
  32. case 't':
  33. if(tmpdir == NULL) tmpdir = getenv("TMPDIR");
  34. if(tmpdir == NULL) tmpdir = "/tmp";
  35. break;
  36. default:
  37. abort();
  38. }
  39. }
  40. argc -= optind;
  41. argv += optind;
  42. if(argc == 1)
  43. {
  44. strncpy(template, *argv, PATH_MAX);
  45. }
  46. else if(argc > 1)
  47. {
  48. fprintf(stderr, "mktemp: Only one template argument is supported, got %d\n", argc);
  49. return 1;
  50. }
  51. if(tmpdir)
  52. {
  53. if(chdir(tmpdir) < 0)
  54. {
  55. fprintf(stderr,
  56. "mktemp: Failed changing directory into tmpdir '%s': %s\n",
  57. tmpdir,
  58. strerror(errno));
  59. return 1;
  60. }
  61. printf("%s/", tmpdir);
  62. }
  63. if(o_create_dir)
  64. {
  65. char *dir = mkdtemp(template);
  66. if(dir == NULL)
  67. {
  68. if(!o_quiet)
  69. fprintf(stderr, "mktemp: Failed creating random directory: %s\n", strerror(errno));
  70. return 1;
  71. }
  72. puts(dir);
  73. return 0;
  74. }
  75. int fd = mkstemp(template);
  76. if(fd < 0)
  77. {
  78. if(!o_quiet) fprintf(stderr, "mktemp: Failed creating random file: %s\n", strerror(errno));
  79. return 1;
  80. }
  81. puts(template);
  82. if(close(fd) < 0)
  83. {
  84. if(!o_quiet) fprintf(stderr, "mktemp: Failed closing file descriptor: %s\n", strerror(errno));
  85. return 1;
  86. }
  87. return 0;
  88. }