xref: /csrg-svn/sbin/clri/clri.c (revision 6494)
1*6494Smckusick static char sccsid[] = "@(#)clri.c 2.1 04/08/82";
25341Smckusick 
3*6494Smckusick /* static char *sccsid = "@(#)clri.c	4.1 (Berkeley) 10/1/80"; */
45341Smckusick 
55341Smckusick /*
65341Smckusick  * clri filsys inumber ...
75341Smckusick  */
85341Smckusick 
9*6494Smckusick #ifndef SIMFS
10*6494Smckusick #include <sys/param.h>
11*6494Smckusick #include <sys/inode.h>
12*6494Smckusick #include <sys/fs.h>
13*6494Smckusick #else
145345Smckusic #include "../h/param.h"
155345Smckusic #include "../h/inode.h"
165345Smckusic #include "../h/fs.h"
17*6494Smckusick #endif
185341Smckusick 
195341Smckusick #define ISIZE	(sizeof(struct dinode))
205345Smckusic #define	NI	(MAXBSIZE/ISIZE)
215345Smckusic struct	ino {
225341Smckusick 	char	junk[ISIZE];
235341Smckusick };
245341Smckusick struct	ino	buf[NI];
255345Smckusic 
265345Smckusic union {
275345Smckusic 	char		dummy[SBSIZE];
285345Smckusic 	struct fs	sblk;
295345Smckusic } sb_un;
305345Smckusic #define sblock sb_un.sblk
315345Smckusic 
325341Smckusick int	status;
335341Smckusick 
345341Smckusick main(argc, argv)
355345Smckusic 	int argc;
365345Smckusic 	char *argv[];
375341Smckusick {
385341Smckusick 	register i, f;
395341Smckusick 	unsigned n;
405341Smckusick 	int j, k;
415341Smckusick 	long off;
425341Smckusick 
435345Smckusic 	if (argc < 3) {
445341Smckusick 		printf("usage: clri filsys inumber ...\n");
455341Smckusick 		exit(4);
465341Smckusick 	}
475341Smckusick 	f = open(argv[1], 2);
485345Smckusic 	if (f < 0) {
495341Smckusick 		printf("cannot open %s\n", argv[1]);
505341Smckusick 		exit(4);
515341Smckusick 	}
525345Smckusic 	lseek(f, SBLOCK * DEV_BSIZE, 0);
535345Smckusic 	if (read(f, &sblock, SBSIZE) != SBSIZE) {
545345Smckusic 		printf("cannot read %s\n", argv[1]);
555345Smckusic 		exit(4);
565345Smckusic 	}
575345Smckusic 	for (i = 2; i < argc; i++) {
585345Smckusic 		if (!isnumber(argv[i])) {
595341Smckusick 			printf("%s: is not a number\n", argv[i]);
605341Smckusick 			status = 1;
615341Smckusick 			continue;
625341Smckusick 		}
635341Smckusick 		n = atoi(argv[i]);
645345Smckusic 		if (n == 0) {
655341Smckusick 			printf("%s: is zero\n", argv[i]);
665341Smckusick 			status = 1;
675341Smckusick 			continue;
685341Smckusick 		}
695378Smckusic 		off = fsbtodb(&sblock, itod(&sblock, n)) * DEV_BSIZE;
705341Smckusick 		lseek(f, off, 0);
715345Smckusic 		if (read(f, (char *)buf, sblock.fs_bsize) != sblock.fs_bsize) {
725341Smckusick 			printf("%s: read error\n", argv[i]);
735341Smckusick 			status = 1;
745341Smckusick 		}
755341Smckusick 	}
765345Smckusic 	if (status)
775341Smckusick 		exit(status);
785345Smckusic 	for (i = 2; i < argc; i++) {
795341Smckusick 		n = atoi(argv[i]);
805341Smckusick 		printf("clearing %u\n", n);
815378Smckusic 		off = fsbtodb(&sblock, itod(&sblock, n)) * DEV_BSIZE;
825341Smckusick 		lseek(f, off, 0);
835345Smckusic 		read(f, (char *)buf, sblock.fs_bsize);
845378Smckusic 		j = itoo(&sblock, n);
855345Smckusic 		for (k = 0; k < ISIZE; k++)
865341Smckusick 			buf[j].junk[k] = 0;
875341Smckusick 		lseek(f, off, 0);
885345Smckusic 		write(f, (char *)buf, sblock.fs_bsize);
895341Smckusick 	}
905341Smckusick 	exit(status);
915341Smckusick }
925341Smckusick 
935341Smckusick isnumber(s)
945345Smckusic 	char *s;
955341Smckusick {
965341Smckusick 	register c;
975341Smckusick 
985341Smckusick 	while(c = *s++)
995345Smckusic 		if (c < '0' || c > '9')
1005341Smckusick 			return(0);
1015341Smckusick 	return(1);
1025341Smckusick }
103