#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(int argc, char **argv) { unsigned int d_flag = 0; char *path = NULL; int opt; while ((opt = getopt(argc, argv, "dp:")) != -1) { switch (opt) { case 'd': d_flag = 1; break; case 'p': path = optarg; break; default: printf("mktemp [file]\n\t[-d Dir] [-p Base dir]\n"); return 0; } } argv += optind; argc -= optind; if (argc == 0) { fprintf(stderr, "mktemp: missing operand\n"); return 1; } if (argc > 1) { fprintf(stderr, "mktemp: extra operands\n"); return 1; } if (path == NULL) { 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[0])) return 1; } else { if (make_temp_file(argv[0])) return 1; } printf("%s/%s\n", path, argv[0]); return 0; }