#include #include #include #include #include int make_temp_dir(char *tmp) { if (!mkdtemp(tmp)) { if (errno == EINVAL) fprintf(stderr, "mktemp: template does not end in exactly 'XXXXX': %s\n", tmp); else fprintf(stderr, "mktemp: %s\n", strerror(errno)); return 1; } return 0; } int get_suffix(const char *str) { size_t len = strlen(str); for (size_t i = len - 1; i > 0; i--) if (str[i] == 'X') return len - i - 1; return 0; } int make_temp_file(char *tmp) { if (!strstr(tmp, "XXXXXX")) { fprintf(stderr, "mktemp: too few X's in template: %s\n", tmp); return 1; } int fd = mkstemps(tmp, get_suffix(tmp)); if (fd < 0) { fprintf(stderr, "mktemp: %s\n", strerror(errno)); return 1; } close(fd); return 0; } int main(const int argc, char **argv) { unsigned int d_flag = 0; int i; for (i = 1; i < argc; i++) { if (argv[i][0] != '-') break; else if (!strcmp(argv[i], "-d")) d_flag = 1; else if (!strcmp(argv[i], "--help")) { printf("mktemp [-d dir] [file]\n"); return 0; } } if (argc - i == 0) { fprintf(stderr, "mktemp: missing operand\n"); return 1; } if (argc - 1 > i) { fprintf(stderr, "mktemp: extra operands\n"); return 1; } char *path = getenv("TMPDIR"); if (!path || path[0] == '\0') path = "/tmp"; if (chdir(path)) { fprintf(stderr, "mktemp: %s\n", strerror(errno)); return 1; } if (d_flag) { if (make_temp_dir(argv[i])) return 1; } else { if (make_temp_file(argv[i])) return 1; } printf("%s/%s\n", path, argv[i]); return 0; }