util.c revision b044c2e02af46c54206f0f6e29896ab32681a7db
13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * util.c --- utilities for the debugfs program
33839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
43839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Copyright (C) 1993, 1994 Theodore Ts'o.  This file may be
53839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * redistributed under the terms of the GNU Public License.
63839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
73839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
83839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
93839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdio.h>
103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <unistd.h>
113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdlib.h>
123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <ctype.h>
133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <string.h>
141e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#include <time.h>
152c4a540636142a936889bbe4b85a2b9c56bfa458Theodore Ts'o#include <signal.h>
163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "debugfs.h"
183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oFILE *open_pager(void)
203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	FILE *outfile;
22b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o	const char *pager = getenv("PAGER");
233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
242c4a540636142a936889bbe4b85a2b9c56bfa458Theodore Ts'o	signal(SIGPIPE, SIG_IGN);
253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (!pager)
26c6bd0c97e4dc42511015b9a20b3e35dcdc8fd411Theodore Ts'o		pager = "more";
27c6bd0c97e4dc42511015b9a20b3e35dcdc8fd411Theodore Ts'o
28c6bd0c97e4dc42511015b9a20b3e35dcdc8fd411Theodore Ts'o	outfile = popen(pager, "w");
29c6bd0c97e4dc42511015b9a20b3e35dcdc8fd411Theodore Ts'o	if (!outfile)
303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		outfile = stdout;
31c6bd0c97e4dc42511015b9a20b3e35dcdc8fd411Theodore Ts'o
323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return (outfile);
333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid close_pager(FILE *stream)
363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (stream && stream != stdout) fclose(stream);
383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * This routine is used whenever a command needs to turn a string into
423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * an inode.
433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
44b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'oext2_ino_t string_to_inode(char *str)
453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
46b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o	ext2_ino_t	ino;
47b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o	int		len = strlen(str);
48b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o	char		*end;
49b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o	int		retval;
503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	/*
523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	 * If the string is of the form <ino>, then treat it as an
533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	 * inode number.
543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	 */
553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if ((len > 2) && (str[0] == '<') && (str[len-1] == '>')) {
569131a759318963d9c86a7de7138ac8cee9641f8cTheodore Ts'o		ino = strtoul(str+1, &end, 0);
579131a759318963d9c86a7de7138ac8cee9641f8cTheodore Ts'o		if (*end=='>')
589131a759318963d9c86a7de7138ac8cee9641f8cTheodore Ts'o			return ino;
593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
611e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	retval = ext2fs_namei(current_fs, root, cwd, str, &ino);
623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (retval) {
633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		com_err(str, retval, "");
643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return 0;
653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return ino;
673839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
703839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * This routine returns 1 if the filesystem is not open, and prints an
713839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * error message to that effect.
723839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint check_fs_open(char *name)
743839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
751e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	if (!current_fs) {
763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		com_err(name, 0, "Filesystem not open");
773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return 1;
783839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return 0;
803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
813839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * This routine returns 1 if a filesystem is open, and prints an
843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * error message to that effect.
853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint check_fs_not_open(char *name)
873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
881e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	if (current_fs) {
893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		com_err(name, 0,
903839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o			"Filesystem %s is still open.  Close it first.\n",
911e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o			current_fs->device_name);
923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return 1;
933839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return 0;
953839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
963839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
971e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/*
981e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * This routine returns 1 if a filesystem is not opened read/write,
991e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * and prints an error message to that effect.
1001e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */
1011e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'oint check_fs_read_write(char *name)
1021e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{
1031e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	if (!(current_fs->flags & EXT2_FLAG_RW)) {
1041e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		com_err(name, 0, "Filesystem opened read/only");
1051e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		return 1;
1061e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	}
1071e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return 0;
1081e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o}
1091e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
1101e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/*
111d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o * This routine returns 1 if a filesystem is doesn't have its inode
112d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o * and block bitmaps loaded, and prints an error message to that
113d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o * effect.
114d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o */
115d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'oint check_fs_bitmaps(char *name)
116d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o{
117d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o	if (!current_fs->block_map || !current_fs->inode_map) {
118d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o		com_err(name, 0, "Filesystem bitmaps not loaded");
119d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o		return 1;
120d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o	}
121d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o	return 0;
122d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o}
123d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o
124d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o/*
1251e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * This function takes a __u32 time value and converts it to a string,
1261e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * using ctime
1271e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */
1281e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'ochar *time_to_string(__u32 cl)
1291e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{
1301e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	time_t	t = (time_t) cl;
1311e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
1321e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return ctime(&t);
1331e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o}
1341e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
1351e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
1361e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
1371e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
138