BSD 4_3_Net_2 release
[unix-history] / usr / src / sbin / clri / clri.c
CommitLineData
63ac1b03
KM
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
1b71c7c8 6 * Rich $alz of BBN Inc.
63ac1b03 7 *
af359dea
C
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by the University of
19 * California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
63ac1b03
KM
35 */
36
37#ifndef lint
38char copyright[] =
39"@(#) Copyright (c) 1990 The Regents of the University of California.\n\
40 All rights reserved.\n";
41#endif /* not lint */
be79e615 42
63ac1b03 43#ifndef lint
af359dea 44static char sccsid[] = "@(#)clri.c 5.3 (Berkeley) 6/29/91";
63ac1b03 45#endif /* not lint */
45eb394d 46
be79e615 47/*
63ac1b03 48 * clri(8)
be79e615
KM
49 */
50
45eb394d 51#include <sys/param.h>
63ac1b03
KM
52#include <ufs/quota.h>
53#include <ufs/inode.h>
c0efa4d3 54#include <ufs/fs.h>
63ac1b03
KM
55#include <unistd.h>
56#include <stdio.h>
57#include <fcntl.h>
58#include <errno.h>
be79e615 59
63ac1b03 60char *fs;
be79e615
KM
61
62main(argc, argv)
e335baf5 63 int argc;
63ac1b03 64 char **argv;
be79e615 65{
63ac1b03
KM
66 register struct fs *sbp;
67 register struct dinode *ip;
68 register int fd;
69 struct dinode ibuf[MAXBSIZE / sizeof (struct dinode)];
70 long generation, offset, bsize;
71 int inonum;
72 char sblock[SBSIZE];
be79e615 73
e335baf5 74 if (argc < 3) {
63ac1b03
KM
75 (void)fprintf(stderr, "usage: clri filesystem inode ...\n");
76 exit(1);
be79e615 77 }
63ac1b03
KM
78
79 fs = *++argv;
80
81 /* get the superblock. */
82 if ((fd = open(fs, O_RDWR, 0)) < 0)
83 error();
84 if (lseek(fd, SBLOCK * DEV_BSIZE, SEEK_SET) < 0)
85 error();
86 if (read(fd, sblock, sizeof(sblock)) != sizeof(sblock)) {
87 (void)fprintf(stderr,
88 "clri: %s: can't read the superblock.\n", fs);
89 exit(1);
e335baf5 90 }
63ac1b03
KM
91
92 sbp = (struct fs *)sblock;
93 if (sbp->fs_magic != FS_MAGIC) {
94 (void)fprintf(stderr,
95 "clri: %s: superblock magic number 0x%x, not 0x%x.\n",
96 fs, sbp->fs_magic, FS_MAGIC);
97 exit(1);
87ad4e58 98 }
63ac1b03
KM
99 bsize = sbp->fs_bsize;
100
101 /* remaining arguments are inode numbers. */
102 while (*++argv) {
103 /* get the inode number. */
104 if ((inonum = atoi(*argv)) <= 0) {
105 (void)fprintf(stderr,
106 "clri: %s is not a valid inode number.\n", *argv);
107 exit(1);
be79e615 108 }
63ac1b03
KM
109 (void)printf("clearing %d\n", inonum);
110
111 /* read in the appropriate block. */
112 offset = itod(sbp, inonum); /* inode to fs block */
113 offset = fsbtodb(sbp, offset); /* fs block to disk block */
114 offset *= DEV_BSIZE; /* disk block to disk bytes */
115
116 /* seek and read the block */
117 if (lseek(fd, offset, SEEK_SET) < 0)
118 error();
119 if (read(fd, (char *)ibuf, bsize) != bsize)
120 error();
121
122 /* get the inode within the block. */
123 ip = &ibuf[itoo(sbp, inonum)];
124
125 /* clear the inode, and bump the generation count. */
126 generation = ip->di_gen + 1;
127 bzero((char *)ip, sizeof *ip);
128 ip->di_gen = generation;
129
130 /* backup and write the block */
131 if (lseek(fd, -bsize, SEEK_CUR) < 0)
132 error();
133 if (write(fd, (char *)ibuf, bsize) != bsize)
134 error();
135 (void)fsync(fd);
be79e615 136 }
63ac1b03
KM
137 (void)close(fd);
138 exit(0);
be79e615
KM
139}
140
63ac1b03 141error()
be79e615 142{
63ac1b03
KM
143 (void)fprintf(stderr, "clri: %s: %s\n", fs, strerror(errno));
144 exit(1);
be79e615 145}