"SfR Fresh" - the SfR Freeware/Shareware Archive 
Member "dosfstools-2.11/dosfsck/dosfsck.c" of archive dosfstools-2.11.src.tar.gz:
As a special service "SfR Fresh" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting with prefixed line numbers.
Alternatively you can here view or download the uninterpreted source code file.
That can be also achieved for any archive member file by clicking within an archive contents listing on the first character of the file(path) respectively on the according byte size field.
1 /* dosfsck.c - User interface */
2
3 /* Written 1993 by Werner Almesberger */
4
5 /* FAT32, VFAT, Atari format support, and various fixes additions May 1998
6 * by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
7
8
9 #include "../version.h"
10
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <stdlib.h>
15 #include <unistd.h>
16 #include <getopt.h>
17
18 #include "common.h"
19 #include "dosfsck.h"
20 #include "io.h"
21 #include "boot.h"
22 #include "fat.h"
23 #include "file.h"
24 #include "check.h"
25
26
27 int interactive = 0,list = 0,test = 0,verbose = 0,write_immed = 0;
28 int atari_format = 0;
29 unsigned n_files = 0;
30 void *mem_queue = NULL;
31
32
33 static void usage(char *name)
34 {
35 fprintf(stderr,"usage: %s [-aAflrtvVwy] [-d path -d ...] "
36 "[-u path -u ...]\n%15sdevice\n",name,"");
37 fprintf(stderr," -a automatically repair the file system\n");
38 fprintf(stderr," -A toggle Atari file system format\n");
39 fprintf(stderr," -d path drop that file\n");
40 fprintf(stderr," -f salvage unused chains to files\n");
41 fprintf(stderr," -l list path names\n");
42 fprintf(stderr," -n no-op, check non-interactively without changing\n");
43 fprintf(stderr," -r interactively repair the file system\n");
44 fprintf(stderr," -t test for bad clusters\n");
45 fprintf(stderr," -u path try to undelete that (non-directory) file\n");
46 fprintf(stderr," -v verbose mode\n");
47 fprintf(stderr," -V perform a verification pass\n");
48 fprintf(stderr," -w write changes to disk immediately\n");
49 fprintf(stderr," -y same as -a, for compat with other *fsck\n");
50 exit(2);
51 }
52
53
54 /*
55 * ++roman: On m68k, check if this is an Atari; if yes, turn on Atari variant
56 * of MS-DOS filesystem by default.
57 */
58 static void check_atari( void )
59 {
60 #ifdef __mc68000__
61 FILE *f;
62 char line[128], *p;
63
64 if (!(f = fopen( "/proc/hardware", "r" ))) {
65 perror( "/proc/hardware" );
66 return;
67 }
68
69 while( fgets( line, sizeof(line), f ) ) {
70 if (strncmp( line, "Model:", 6 ) == 0) {
71 p = line + 6;
72 p += strspn( p, " \t" );
73 if (strncmp( p, "Atari ", 6 ) == 0)
74 atari_format = 1;
75 break;
76 }
77 }
78 fclose( f );
79 #endif
80 }
81
82
83 int main(int argc,char **argv)
84 {
85 DOS_FS fs;
86 int rw,salvage_files,verify,c;
87 unsigned long free_clusters;
88
89 rw = salvage_files = verify = 0;
90 interactive = 1;
91 check_atari();
92
93 while ((c = getopt(argc,argv,"Aad:flnrtu:vVwy")) != EOF)
94 switch (c) {
95 case 'A': /* toggle Atari format */
96 atari_format = !atari_format;
97 break;
98 case 'a':
99 case 'y':
100 rw = 1;
101 interactive = 0;
102 salvage_files = 1;
103 break;
104 case 'd':
105 file_add(optarg,fdt_drop);
106 break;
107 case 'f':
108 salvage_files = 1;
109 break;
110 case 'l':
111 list = 1;
112 break;
113 case 'n':
114 rw = 0;
115 interactive = 0;
116 break;
117 case 'r':
118 rw = 1;
119 interactive = 1;
120 break;
121 case 't':
122 test = 1;
123 break;
124 case 'u':
125 file_add(optarg,fdt_undelete);
126 break;
127 case 'v':
128 verbose = 1;
129 printf("dosfsck " VERSION " (" VERSION_DATE ")\n");
130 break;
131 case 'V':
132 verify = 1;
133 break;
134 case 'w':
135 write_immed = 1;
136 break;
137 default:
138 usage(argv[0]);
139 }
140 if ((test || write_immed) && !rw) {
141 fprintf(stderr,"-t and -w require -a or -r\n");
142 exit(2);
143 }
144 if (optind != argc-1) usage(argv[0]);
145
146 printf( "dosfsck " VERSION ", " VERSION_DATE ", FAT32, LFN\n" );
147 fs_open(argv[optind],rw);
148 read_boot(&fs);
149 if (verify) printf("Starting check/repair pass.\n");
150 while (read_fat(&fs), scan_root(&fs)) qfree(&mem_queue);
151 if (test) fix_bad(&fs);
152 if (salvage_files) reclaim_file(&fs);
153 else reclaim_free(&fs);
154 free_clusters = update_free(&fs);
155 file_unused();
156 qfree(&mem_queue);
157 if (verify) {
158 printf("Starting verification pass.\n");
159 read_fat(&fs);
160 scan_root(&fs);
161 reclaim_free(&fs);
162 qfree(&mem_queue);
163 }
164
165 if (fs_changed()) {
166 if (rw) {
167 if (interactive)
168 rw = get_key("yn","Perform changes ? (y/n)") == 'y';
169 else printf("Performing changes.\n");
170 }
171 else
172 printf("Leaving file system unchanged.\n");
173 }
174
175 printf( "%s: %u files, %lu/%lu clusters\n", argv[optind],
176 n_files, fs.clusters - free_clusters, fs.clusters );
177
178 return fs_close(rw) ? 1 : 0;
179 }
180
181 /* Local Variables: */
182 /* tab-width: 8 */
183 /* End: */