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