dsw.c
utzoo!decvax!ucbvax!ucsfcgl!sdcarl!rusty
utzoo!decvax!ucbvax!ucsfcgl!sdcarl!rusty
Sat Jun 12 14:55:28 AEST 1982
# include <sys/param.h>
# include <sys/dir.h>
# include <stat.h>
# include <stdio.h>
typedef FILE file;
int vflg;
main(argc, argv)
char **argv;
{
register char *pv;
register int i, j;
vflg = 0;
for (i = 1; i < argc; i++) {
pv = argv[i];
if (pv[0] != '-')
break;
for (j = 1; pv[j] != NULL; j++) {
switch (pv[j]) {
case 'v':
vflg++;
break;
default:
fputs("usage: dsw [-v] [dir]\n", stderr);
exit(1);
break;
}
}
}
if (i == argc)
dsw(".");
else
while (i < argc)
dsw(argv[i++]);
}
dsw(dir)
char *dir;
{
register file *fid;
struct direct ds;
struct stat stb;
char fnam[80];
if ((fid = fopen(dir, "r")) == NULL) {
fputs("fopen: ", stderr);
perror(dir);
return;
}
if (fstat(fileno(fid), &stb)) {
fputs("fstat: ", stderr);
perror(dir);
return;
}
if ((stb.st_mode & S_IFMT) != S_IFDIR) {
fprintf(stderr, "not a directory: %s\n", dir);
return;
}
/* skip "." and ".." */
if (fseek(fid, (long) (sizeof(struct direct) * 2), 0) == -1) {
fprintf(stderr, "mangled directory: %s (find a guru!)\n", dir);
exit(1);
}
while (fread(&ds, sizeof(struct direct), 1, fid) == 1) {
if (ds.d_ino == 0)
continue;
if (grbg(ds.d_name) || vflg) {
strcpy(fnam, dir);
if (fnam[strlen(fnam)-1] != '/')
strcat(fnam, "/");
strncat(fnam, ds.d_name, DIRSIZ);
if (prompt(fnam)) {
if (unlink(fnam) == -1) {
if (stat(fnam, &stb)) {
fputs("stat: ", stderr);
perror(fnam);
continue;
}
if ((stb.st_mode & S_IFMT) == S_IFDIR) {
fprintf(stderr, "%s: can't rm directories\n", fnam);
continue;
}
fputs("unlink: ", stderr);
perror(fnam);
}
}
}
}
}
/*
* check for garbaged file
* name.
*/
grbg(fnam)
register char *fnam;
{
register int i;
for (i = 0; i < DIRSIZ; i++) {
if (fnam[i] == NULL)
return((i == 0) ? 1 : 0);
if ((fnam[i] <= ' ') || (fnam[i] > 0177))
return(1);
if ((fnam[i] == '-') && (i == 0))
return(1);
}
return(0);
}
/*
* prompt for removal; print out the
* file name being sure to print
* something reasonable for non-
* printable chars.
*/
prompt(fnam)
register char *fnam;
{
register char ch;
register char *bp;
char buf[40];
while ((ch = *fnam++) != NULL) {
if (ch >= 0177)
putchar('?');
else if (ch < ' ') {
putchar('^');
putchar(ch + '@');
}
else
putchar(ch);
}
fputs(" ? ", stdout);
fflush(stdout);
fgets(buf, sizeof(buf), stdin);
if (feof(stdin) || ferror(stdin)) {
putchar('\n');
exit(0);
}
bp = &buf[0];
while ((*bp == ' ') || (*bp == '\t')) {
if (bp++ >= &buf[sizeof(buf)])
return(0);
}
return((*bp == 'y') || (*bp == 'Y'));
}
More information about the Comp.sources.unix
mailing list