2 * util.c --- miscellaneous utilities
4 * Copyright (C) 1993, 1994 Theodore Ts'o. This file may be
5 * redistributed under the terms of the GNU Public License.
17 #include <sys/resource.h>
19 const char * fix_msg[2] = { "IGNORED", "FIXED" };
20 const char * clear_msg[2] = { "IGNORED", "CLEARED" };
22 void fatal_error (const char *msg)
25 fprintf (stderr, "%s: %s\n", program_name, msg);
29 void *allocate_memory(int size, const char *description)
34 #ifdef DEBUG_ALLOCATE_MEMORY
35 printf("Allocating %d bytes for %s...\n", size, description);
39 sprintf(buf, "Can't allocate %s\n", description);
47 int ask_yn(const char * string, int def)
50 struct termios termios, tmp;
53 tcgetattr (0, &termios);
55 tmp.c_lflag &= ~(ICANON | ECHO);
58 tcsetattr (0, TCSANOW, &tmp);
66 printf("%s%s? ", string, defstr);
69 if ((c = getchar()) == EOF)
80 else if ((c == ' ' || c == '\n') && (def != -1))
87 tcsetattr (0, TCSANOW, &termios);
91 int ask (const char * string, int def)
94 printf ("%s? no\n\n", string);
98 printf ("%s? yes\n\n", string);
102 printf ("%s? %s\n\n", string, def ? "yes" : "no");
105 return ask_yn(string, def);
108 void read_bitmaps(ext2_filsys fs)
112 if (invalid_bitmaps) {
113 com_err(program_name, 0,
114 "read_bitmaps: illegal bitmap block(s) for %s",
119 ehandler_operation("reading inode and block bitmaps");
120 retval = ext2fs_read_bitmaps(fs);
121 ehandler_operation(0);
123 com_err(program_name, retval,
124 "while retrying to read bitmaps for %s",
130 void write_bitmaps(ext2_filsys fs)
134 if (ext2fs_test_bb_dirty(fs)) {
135 ehandler_operation("writing block bitmaps");
136 retval = ext2fs_write_block_bitmap(fs);
137 ehandler_operation(0);
139 com_err(program_name, retval,
140 "while retrying to write block bitmaps for %s",
146 if (ext2fs_test_ib_dirty(fs)) {
147 ehandler_operation("writing inode bitmaps");
148 retval = ext2fs_write_inode_bitmap(fs);
149 ehandler_operation(0);
151 com_err(program_name, retval,
152 "while retrying to write inode bitmaps for %s",
159 void preenhalt(ext2_filsys fs)
163 fprintf(stderr, "\n\n%s: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.\n",
166 fs->super->s_state |= EXT2_ERROR_FS;
167 ext2fs_mark_super_dirty(fs);
170 exit(FSCK_UNCORRECTED);
173 void init_resource_track(struct resource_track *track)
175 #ifdef HAVE_GETRUSAGE
179 track->brk_start = sbrk(0);
180 gettimeofday(&track->time_start, 0);
181 #ifdef HAVE_GETRUSAGE
182 getrusage(RUSAGE_SELF, &r);
183 track->user_start = r.ru_utime;
184 track->system_start = r.ru_stime;
186 track->user_start.tv_sec = track->user_start.tv_usec = 0;
187 track->system_start.tv_sec = track->system_start.tv_usec = 0;
191 static __inline__ float timeval_subtract(struct timeval *tv1,
194 return ((tv1->tv_sec - tv2->tv_sec) +
195 ((float) (tv1->tv_usec - tv2->tv_usec)) / 1000000);
198 void print_resource_track(struct resource_track *track)
200 #ifdef HAVE_GETRUSAGE
203 struct timeval time_end;
205 gettimeofday(&time_end, 0);
206 #ifdef HAVE_GETRUSAGE
207 getrusage(RUSAGE_SELF, &r);
209 printf("Memory used: %d, elapsed time: %6.3f/%6.3f/%6.3f\n",
210 (int) (((char *) sbrk(0)) - ((char *) track->brk_start)),
211 timeval_subtract(&time_end, &track->time_start),
212 timeval_subtract(&r.ru_utime, &track->user_start),
213 timeval_subtract(&r.ru_stime, &track->system_start));
215 printf("Memory used: %d, elapsed time: %6.3f\n",
216 (int) (((char *) sbrk(0)) - ((char *) track->brk_start)),
217 timeval_subtract(&time_end, &track->time_start));
221 void e2fsck_read_inode(ext2_filsys fs, unsigned long ino,
222 struct ext2_inode * inode, const char *proc)
226 retval = ext2fs_read_inode(fs, ino, inode);
228 com_err("ext2fs_read_inode", retval,
229 "while reading inode %ld in %s", ino, proc);
234 extern void e2fsck_write_inode(ext2_filsys fs, unsigned long ino,
235 struct ext2_inode * inode, const char *proc)
239 retval = ext2fs_write_inode(fs, ino, inode);
241 com_err("ext2fs_write_inode", retval,
242 "while writing inode %ld in %s", ino, proc);
248 * This function returns 1 if the inode's block entries actually
249 * contain block entries.
251 int inode_has_valid_blocks(struct ext2_inode *inode)
254 * Only directories, regular files, and some symbolic links
255 * have valid block entries.
257 if (!LINUX_S_ISDIR(inode->i_mode) && !LINUX_S_ISREG(inode->i_mode) &&
258 !LINUX_S_ISLNK(inode->i_mode))
262 * If the symbolic link is a "fast symlink", then the symlink
263 * target is stored in the block entries.
265 if (LINUX_S_ISLNK (inode->i_mode) && inode->i_blocks == 0 &&
266 inode->i_size < EXT2_N_BLOCKS * sizeof (unsigned long))
273 void mtrace_print(char *mesg)
275 FILE *malloc_get_mallstream();
276 FILE *f = malloc_get_mallstream();
279 fprintf(f, "============= %s\n", mesg);