#include <stdio.h>
#include <libgen.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <locale.h>
int
main(int argc, char **argv)
{
char *prog;
int c, pflag, sflag, errflg, rc;
char *ptr, *remain, *msg, *path;
unsigned int pathlen;
prog = argv[0];
pflag = sflag = 0;
errflg = 0;
(void) setlocale(LC_ALL, "");
#if !defined(TEXT_DOMAIN)
#define TEXT_DOMAIN "SYS_TEST"
#endif
(void) textdomain(TEXT_DOMAIN);
while ((c = getopt(argc, argv, "ps")) != EOF)
switch (c) {
case 'p':
pflag++;
break;
case 's':
sflag++;
break;
case '?':
errflg++;
break;
}
if (argc < 2 || errflg) {
(void) fprintf(stderr, gettext("Usage: %s [-ps] dirname ...\n"),
prog);
exit(2);
}
errno = 0;
argc -= optind;
argv = &argv[optind];
while (argc--) {
ptr = *argv++;
if (pflag) {
pathlen = (unsigned)strlen(ptr);
if ((path = (char *)malloc(pathlen + 4)) == NULL ||
(remain = (char *)malloc(pathlen + 4)) == NULL) {
perror(prog);
exit(2);
}
(void) strcpy(path, ptr);
if (((rc = rmdirp(path, remain)) != 0) && !sflag) {
switch (rc) {
case -1:
if (errno == EEXIST)
msg = gettext(
"Directory not empty");
else
msg = strerror(errno);
break;
case -2:
errno = EINVAL;
msg = gettext("Can not remove . or ..");
break;
case -3:
errno = EINVAL;
msg = gettext(
"Can not remove current directory");
break;
}
(void) fprintf(stderr, gettext("%s: directory"
" \"%s\": %s not removed; %s\n"),
prog, ptr, remain, msg);
}
free(path);
free(remain);
continue;
}
if (rmdir(ptr) == -1) {
switch (errno) {
case EEXIST:
msg = gettext("Directory not empty");
break;
case ENOTDIR:
msg = gettext("Path component not a directory");
break;
case ENOENT:
msg = gettext("Directory does not exist");
break;
case EACCES:
msg = gettext(
"Search or write permission needed");
break;
case EBUSY:
msg = gettext(
"Directory is a mount point or in use");
break;
case EROFS:
msg = gettext("Read-only file system");
break;
case EIO:
msg = gettext(
"I/O error accessing file system");
break;
case EINVAL:
msg = gettext(
"Can't remove current directory or ..");
break;
case EFAULT:
default:
msg = strerror(errno);
break;
}
(void) fprintf(stderr,
gettext("%s: directory \"%s\": %s\n"),
prog, ptr, msg);
continue;
}
}
return (errno ? 2 : 0);
}