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.
13 #include <sys/resource.h>
17 const char * fix_msg[2] = { "IGNORED", "FIXED" };
18 const char * clear_msg[2] = { "IGNORED", "CLEARED" };
20 void fatal_error (const char *msg)
23 fprintf (stderr, "%s: %s\n", program_name, msg);
27 void *allocate_memory(int size, const char *description)
32 #ifdef DEBUG_ALLOCATE_MEMORY
33 printf("Allocating %d bytes for %s...\n", size, description);
37 sprintf(buf, "%%s: Can't allocate %s\n", description);
45 int ask_yn(const char * string, int def)
48 struct termios termios, tmp;
51 tcgetattr (0, &termios);
53 tmp.c_lflag &= ~(ICANON | ECHO);
54 tcsetattr (0, TCSANOW, &tmp);
62 printf("%s%s? ", string, defstr);
65 if ((c = getchar()) == EOF)
76 else if ((c == ' ' || c == '\n') && (def != -1))
83 tcsetattr (0, TCSANOW, &termios);
87 int ask (const char * string, int def)
90 printf ("%s? no\n\n", string);
94 printf ("%s? yes\n\n", string);
98 printf ("%s? %s\n\n", string, def ? "yes" : "no");
101 return ask_yn(string, def);
104 void read_bitmaps(ext2_filsys fs)
108 if (!fs->inode_map) {
109 ehandler_operation("reading inode bitmaps");
110 retval = ext2fs_read_inode_bitmap(fs);
111 ehandler_operation(0);
113 com_err(program_name, retval,
114 "while retrying to read inode bitmaps for %s",
120 if (!fs->block_map) {
121 ehandler_operation("reading block bitmaps");
122 retval = ext2fs_read_block_bitmap(fs);
123 ehandler_operation(0);
125 com_err(program_name, retval,
126 "while retrying to read block bitmaps for %s",
133 void write_bitmaps(ext2_filsys fs)
137 if (ext2fs_test_bb_dirty(fs)) {
138 ehandler_operation("writing block bitmaps");
139 retval = ext2fs_write_block_bitmap(fs);
140 ehandler_operation(0);
142 com_err(program_name, retval,
143 "while retrying to write block bitmaps for %s",
149 if (ext2fs_test_ib_dirty(fs)) {
150 ehandler_operation("writing inode bitmaps");
151 retval = ext2fs_write_inode_bitmap(fs);
152 ehandler_operation(0);
154 com_err(program_name, retval,
155 "while retrying to write inode bitmaps for %s",
162 void preenhalt(NOARGS)
166 fprintf(stderr, "\n\n%s: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.\n",
168 exit(FSCK_UNCORRECTED);
171 void init_resource_track(struct resource_track *track)
175 track->brk_start = sbrk(0);
176 gettimeofday(&track->time_start, 0);
177 getrusage(RUSAGE_SELF, &r);
178 track->user_start = r.ru_utime;
179 track->system_start = r.ru_stime;
182 static __inline__ float timeval_subtract(struct timeval *tv1,
185 return ((tv1->tv_sec - tv2->tv_sec) +
186 ((float) (tv1->tv_usec - tv2->tv_usec)) / 1000000);
189 void print_resource_track(struct resource_track *track)
192 struct timeval time_end;
194 gettimeofday(&time_end, 0);
195 getrusage(RUSAGE_SELF, &r);
197 printf("Memory used: %d, elapsed time: %6.3f/%6.3f/%6.3f\n",
198 (int) (((char *) sbrk(0)) - ((char *) track->brk_start)),
199 timeval_subtract(&time_end, &track->time_start),
200 timeval_subtract(&r.ru_utime, &track->user_start),
201 timeval_subtract(&r.ru_stime, &track->system_start));
205 * This function returns 1 if the inode's block entries actually
206 * contain block entries.
208 int inode_has_valid_blocks(struct ext2_inode *inode)
211 * Only directories, regular files, and some symbolic links
212 * have valid block entries.
214 if (!S_ISDIR(inode->i_mode) && !S_ISREG(inode->i_mode) &&
215 !S_ISLNK(inode->i_mode))
219 * If the symbolic link is a "fast symlink", then the symlink
220 * target is stored in the block entries.
222 if (S_ISLNK (inode->i_mode) && inode->i_blocks == 0 &&
223 inode->i_size < EXT2_N_BLOCKS * sizeof (unsigned long))
230 void mtrace_print(char *mesg)
232 FILE *malloc_get_mallstream();
233 FILE *f = malloc_get_mallstream();
236 fprintf(f, "============= %s\n", mesg);