Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sbin/clri/clri.c
39475 views
1
/*-
2
* SPDX-License-Identifier: BSD-3-Clause
3
*
4
* Copyright (c) 1990, 1993
5
* The Regents of the University of California. All rights reserved.
6
*
7
* This code is derived from software contributed to Berkeley by
8
* Rich $alz of BBN Inc.
9
*
10
* Redistribution and use in source and binary forms, with or without
11
* modification, are permitted provided that the following conditions
12
* are met:
13
* 1. Redistributions of source code must retain the above copyright
14
* notice, this list of conditions and the following disclaimer.
15
* 2. Redistributions in binary form must reproduce the above copyright
16
* notice, this list of conditions and the following disclaimer in the
17
* documentation and/or other materials provided with the distribution.
18
* 3. Neither the name of the University nor the names of its contributors
19
* may be used to endorse or promote products derived from this software
20
* without specific prior written permission.
21
*
22
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32
* SUCH DAMAGE.
33
*/
34
35
#include <sys/param.h>
36
#include <sys/disklabel.h>
37
38
#include <ufs/ufs/dinode.h>
39
#include <ufs/ffs/fs.h>
40
41
#include <err.h>
42
#include <errno.h>
43
#include <fcntl.h>
44
#include <libufs.h>
45
#include <stdlib.h>
46
#include <string.h>
47
#include <stdio.h>
48
#include <unistd.h>
49
50
static void
51
usage(void)
52
{
53
(void)fprintf(stderr, "usage: clri special_device inode_number ...\n");
54
exit(1);
55
}
56
57
int
58
main(int argc, char *argv[])
59
{
60
union dinodep dp;
61
struct uufsd disk;
62
long generation;
63
int inonum, exitval;
64
char *fsname;
65
66
if (argc < 3)
67
usage();
68
69
/* get the superblock. */
70
fsname = *++argv;
71
if (ufs_disk_fillout(&disk, fsname) == -1) {
72
printf("loading superblock: %s\n", disk.d_error);
73
exit (1);
74
}
75
76
/* remaining arguments are inode numbers. */
77
exitval = 0;
78
while (*++argv) {
79
/* get the inode number. */
80
if ((inonum = atoi(*argv)) < UFS_ROOTINO) {
81
printf("%s is not a valid inode number", *argv);
82
exitval = 1;
83
continue;
84
}
85
(void)printf("clearing %d\n", inonum);
86
87
if (getinode(&disk, &dp, inonum) == -1) {
88
printf("getinode: %s\n", disk.d_error);
89
exitval = 1;
90
continue;
91
}
92
/* clear the inode, and bump the generation count. */
93
if (disk.d_fs.fs_magic == FS_UFS1_MAGIC) {
94
generation = dp.dp1->di_gen + 1;
95
memset(dp.dp1, 0, sizeof(*dp.dp1));
96
dp.dp1->di_gen = generation;
97
} else {
98
generation = dp.dp2->di_gen + 1;
99
memset(dp.dp2, 0, sizeof(*dp.dp2));
100
dp.dp2->di_gen = generation;
101
}
102
putinode(&disk);
103
(void)fsync(disk.d_fd);
104
}
105
(void)ufs_disk_close(&disk);
106
exit(exitval);
107
}
108
109