|
|
1.1 root 1: /*
2: * Copyright (c) 1990 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * This code is derived from software contributed to Berkeley by
6: * Rich $alz of BBN Inc.
7: *
8: * Redistribution and use in source and binary forms are permitted provided
9: * that: (1) source distributions retain this entire copyright notice and
10: * comment, and (2) distributions including binaries display the following
11: * acknowledgement: ``This product includes software developed by the
12: * University of California, Berkeley and its contributors'' in the
13: * documentation or other materials provided with the distribution and in
14: * all advertising materials mentioning features or use of this software.
15: * Neither the name of the University nor the names of its contributors may
16: * be used to endorse or promote products derived from this software without
17: * specific prior written permission.
18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
19: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
20: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21: */
22:
23: #ifndef lint
24: char copyright[] =
25: "@(#) Copyright (c) 1990 The Regents of the University of California.\n\
26: All rights reserved.\n";
27: #endif /* not lint */
28:
29: #ifndef lint
30: static char sccsid[] = "@(#)clri.c 5.2 (Berkeley) 6/11/90";
31: #endif /* not lint */
32:
33: /*
34: * clri(8)
35: */
36:
37: #include <sys/param.h>
38: #include <sys/time.h>
39: #include <sys/vnode.h>
40: #include <ufs/quota.h>
41: #include <ufs/inode.h>
42: #include <ufs/fs.h>
43: #include <unistd.h>
44: #include <stdio.h>
45: #include <fcntl.h>
46: #include <errno.h>
47:
48: char *fs;
49:
50: main(argc, argv)
51: int argc;
52: char **argv;
53: {
54: register struct fs *sbp;
55: register struct dinode *ip;
56: register int fd;
57: struct dinode ibuf[MAXBSIZE / sizeof (struct dinode)];
58: long generation, offset, bsize;
59: int inonum;
60: char sblock[SBSIZE];
61:
62: if (argc < 3) {
63: (void)fprintf(stderr, "usage: clri filesystem inode ...\n");
64: exit(1);
65: }
66:
67: fs = *++argv;
68:
69: /* get the superblock. */
70: if ((fd = open(fs, O_RDWR, 0)) < 0)
71: error();
72: if (lseek(fd, SBLOCK * DEV_BSIZE, SEEK_SET) < 0)
73: error();
74: if (read(fd, sblock, sizeof(sblock)) != sizeof(sblock)) {
75: (void)fprintf(stderr,
76: "clri: %s: can't read the superblock.\n", fs);
77: exit(1);
78: }
79:
80: sbp = (struct fs *)sblock;
81: if (sbp->fs_magic != FS_MAGIC) {
82: (void)fprintf(stderr,
83: "clri: %s: superblock magic number 0x%x, not 0x%x.\n",
84: fs, sbp->fs_magic, FS_MAGIC);
85: exit(1);
86: }
87: bsize = sbp->fs_bsize;
88:
89: /* remaining arguments are inode numbers. */
90: while (*++argv) {
91: /* get the inode number. */
92: if ((inonum = atoi(*argv)) <= 0) {
93: (void)fprintf(stderr,
94: "clri: %s is not a valid inode number.\n", *argv);
95: exit(1);
96: }
97: (void)printf("clearing %d\n", inonum);
98:
99: /* read in the appropriate block. */
100: offset = itod(sbp, inonum); /* inode to fs block */
101: offset = fsbtodb(sbp, offset); /* fs block to disk block */
102: offset *= DEV_BSIZE; /* disk block to disk bytes */
103:
104: /* seek and read the block */
105: if (lseek(fd, offset, SEEK_SET) < 0)
106: error();
107: if (read(fd, (char *)ibuf, bsize) != bsize)
108: error();
109:
110: /* get the inode within the block. */
111: ip = &ibuf[itoo(sbp, inonum)];
112:
113: /* clear the inode, and bump the generation count. */
114: generation = ip->di_gen + 1;
115: bzero((char *)ip, sizeof *ip);
116: ip->di_gen = generation;
117:
118: /* backup and write the block */
119: if (lseek(fd, -bsize, SEEK_CUR) < 0)
120: error();
121: if (write(fd, (char *)ibuf, bsize) != bsize)
122: error();
123: (void)fsync(fd);
124: }
125: (void)close(fd);
126: exit(0);
127: }
128:
129: error()
130: {
131: (void)fprintf(stderr, "clri: %s: %s\n", fs, strerror(errno));
132: exit(1);
133: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.