util.c revision d61f6176024865007d5a0da49c61c21e9d498007
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>
153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "debugfs.h"
173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oFILE *open_pager(void)
193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	FILE *outfile;
213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	char *pager = getenv("PAGER");
223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (!pager)
243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		outfile = stdout;
253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	else {
263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		outfile = popen(pager, "w");
273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		if (!outfile) outfile = stdout;
283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return (outfile);
303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid close_pager(FILE *stream)
333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (stream && stream != stdout) fclose(stream);
353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * This routine is used whenever a command needs to turn a string into
393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * an inode.
403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oino_t string_to_inode(char *str)
423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	ino_t	ino;
443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int	len = strlen(str);
453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int	i;
463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int	retval;
473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	/*
493839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	 * If the string is of the form <ino>, then treat it as an
503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	 * inode number.
513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	 */
523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if ((len > 2) && (str[0] == '<') && (str[len-1] == '>')) {
533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		for (i = 1; i < len-1; i++)
543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o			if (!isdigit(str[i]))
553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o				break;
563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		if (i == len-1)
573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o			return(atoi(str+1));
583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
601e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	retval = ext2fs_namei(current_fs, root, cwd, str, &ino);
613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (retval) {
623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		com_err(str, retval, "");
633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return 0;
643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return ino;
663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
673839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * This routine returns 1 if the filesystem is not open, and prints an
703839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * error message to that effect.
713839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
723839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint check_fs_open(char *name)
733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
741e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	if (!current_fs) {
753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		com_err(name, 0, "Filesystem not open");
763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return 1;
773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
783839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return 0;
793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
813839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * This routine returns 1 if a filesystem is open, and prints an
833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * error message to that effect.
843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint check_fs_not_open(char *name)
863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
871e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	if (current_fs) {
883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		com_err(name, 0,
893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o			"Filesystem %s is still open.  Close it first.\n",
901e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o			current_fs->device_name);
913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return 1;
923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
933839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return 0;
943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
953839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
961e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/*
971e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * This routine returns 1 if a filesystem is not opened read/write,
981e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * and prints an error message to that effect.
991e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */
1001e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'oint check_fs_read_write(char *name)
1011e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{
1021e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	if (!(current_fs->flags & EXT2_FLAG_RW)) {
1031e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		com_err(name, 0, "Filesystem opened read/only");
1041e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o		return 1;
1051e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	}
1061e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return 0;
1071e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o}
1081e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
1091e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/*
110d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o * This routine returns 1 if a filesystem is doesn't have its inode
111d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o * and block bitmaps loaded, and prints an error message to that
112d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o * effect.
113d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o */
114d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'oint check_fs_bitmaps(char *name)
115d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o{
116d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o	if (!current_fs->block_map || !current_fs->inode_map) {
117d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o		com_err(name, 0, "Filesystem bitmaps not loaded");
118d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o		return 1;
119d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o	}
120d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o	return 0;
121d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o}
122d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o
123d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o/*
1241e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * This function takes a __u32 time value and converts it to a string,
1251e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * using ctime
1261e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */
1271e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'ochar *time_to_string(__u32 cl)
1281e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{
1291e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	time_t	t = (time_t) cl;
1301e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
1311e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return ctime(&t);
1321e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o}
1331e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
1341e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
1351e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
1361e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
137