util.c revision 3839e65723771b85975f4263102dd3ceec4523c
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>
143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "debugfs.h"
163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oFILE *open_pager(void)
183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	FILE *outfile;
203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	char *pager = getenv("PAGER");
213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (!pager)
233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		outfile = stdout;
243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	else {
253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		outfile = popen(pager, "w");
263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		if (!outfile) outfile = stdout;
273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return (outfile);
293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid close_pager(FILE *stream)
323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (stream && stream != stdout) fclose(stream);
343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * This routine is used whenever a command needs to turn a string into
383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * an inode.
393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oino_t string_to_inode(char *str)
413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	ino_t	ino;
433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int	len = strlen(str);
443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int	i;
453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int	retval;
463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	/*
483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	 * If the string is of the form <ino>, then treat it as an
493839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	 * inode number.
503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	 */
513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if ((len > 2) && (str[0] == '<') && (str[len-1] == '>')) {
523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		for (i = 1; i < len-1; i++)
533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o			if (!isdigit(str[i]))
543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o				break;
553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		if (i == len-1)
563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o			return(atoi(str+1));
573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	retval = ext2fs_namei(fs, root, cwd, str, &ino);
603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (retval) {
613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		com_err(str, retval, "");
623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return 0;
633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return ino;
653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
673839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * This routine returns 1 if the filesystem is not open, and prints an
693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * error message to that effect.
703839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
713839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint check_fs_open(char *name)
723839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (!fs) {
743839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		com_err(name, 0, "Filesystem not open");
753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return 1;
763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return 0;
783839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
813839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * This routine returns 1 if a filesystem is open, and prints an
823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * error message to that effect.
833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint check_fs_not_open(char *name)
853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (fs) {
873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		com_err(name, 0,
883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o			"Filesystem %s is still open.  Close it first.\n",
893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o			fs->device_name);
903839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return 1;
913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return 0;
933839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
95