diff --git a/rmdir.c b/rmdir.c new file mode 100644 index 0000000..adfb3e0 --- /dev/null +++ b/rmdir.c @@ -0,0 +1,82 @@ +#define _POSIX_C_SOURCE 200809L + +#include +#include +#include +#include + +int remove_up(char * path); + +int main(int argc, char * argv[]) { + int do_remove_up = 0, error = 0; char c; + + while((c = getopt(argc, argv, "p")) != -1) { + do_remove_up = c == 'p' ? 1 : do_remove_up; + } + + for(; optind < argc; optind++) { + if(remove_up) { + int status = remove_up(argv[optind]); + if(status == -1) { + switch(errno) { + case EACCES: fprintf(stderr, "%s: %s: write permission denied\n", + argv[0], argv[optind]); error = 1; break; + case EBUSY: fprintf(stderr, "%s: %s: file in use\n", argv[0], + argv[optind]); error = 1; break; + case ENOTEMPTY: + case EEXIST: fprintf(stderr, "%s: %s: directory not empty\n", argv[0], + argv[optind]); error = 1; break; + case EINVAL: error = 1; break; + case EIO: fprintf(stderr, "%s: %s: IO error\n", argv[0], argv[optind]); + error = 1; break; + case ELOOP: error = 1; break; + case ENAMETOOLONG: error = 1; break; + case ENOENT: fprintf(stderr, "%s: %s: file not found\n", argv[0], + argv[optind]); error = 1; break; + case ENOTDIR: fprintf(stderr, "%s: %s: not a directory\n", argv[0], + argv[optind]); error = 1; break; + case EPERM: error = 1; break; + case EROFS: fprintf(stderr, "%s: %s: contained on read-only filesystem", + argv[0], argv[optind]); error = 1; break; + } + } + } + else { + int status = rmdir(argv[optind]); + if(status == -1) { + switch(errno) { + case EACCES: fprintf(stderr, "%s: %s: write permission denied\n", + argv[0], argv[optind]); error = 1; break; + case EBUSY: fprintf(stderr, "%s: %s: file in use\n", argv[0], + argv[optind]); error = 1; break; + case ENOTEMPTY: + case EEXIST: fprintf(stderr, "%s: %s: directory not empty\n", argv[0], + argv[optind]); error = 1; break; + case EINVAL: error = 1; break; + case EIO: fprintf(stderr, "%s: %s: IO error\n", argv[0], argv[optind]); + error = 1; break; + case ELOOP: error = 1; break; + case ENAMETOOLONG: error = 1; break; + case ENOENT: fprintf(stderr, "%s: %s: file not found\n", argv[0], + argv[optind]); error = 1; break; + case ENOTDIR: fprintf(stderr, "%s: %s: not a directory\n", argv[0], + argv[optind]); error = 1; break; + case EPERM: error = 1; break; + case EROFS: fprintf(stderr, "%s: %s: contained on read-only filesystem", + argv[0], argv[optind]); error = 1; break; + } + } + } + } + + return error; +} + +int remove_up(char * path) { + if(path[0] == '.' && path[1] == '\0') { + return 0; + } + else { + return rmdir(path) == -1 ? -1 : remove_up(dirname(path)); + } +} \ No newline at end of file