This commit is contained in:
Your Name 2023-10-24 20:23:32 +03:00
parent 0e91bb1ec5
commit a2fae4ab76
3 changed files with 98 additions and 4 deletions

3
TODO
View File

@ -1,8 +1,6 @@
With "micro-" prefix
*Todo:
mktemp
ln
nice
renice
nohup
@ -12,6 +10,7 @@ split
truncate
date
tee
ln
tr
cut
shuf

94
coreutils/mktemp.c Normal file
View File

@ -0,0 +1,94 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
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;
exit(1);
}
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] [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;
}

View File

@ -64,15 +64,16 @@ int main(const int argc, char **argv) {
return 0;
}
int status = 0;
for (int i = 1; i < argc; i++) {
if (argv[i][0] == '-')
continue;
int status = rmtree(argv[i]);
if (status != 0)
return status;
status = 1;
}
return 0;
return status;
}