util.c revision c6bd0c97e4dc42511015b9a20b3e35dcdc8fd411
1/*
2 * util.c --- utilities for the debugfs program
3 *
4 * Copyright (C) 1993, 1994 Theodore Ts'o.  This file may be
5 * redistributed under the terms of the GNU Public License.
6 *
7 */
8
9#include <stdio.h>
10#include <unistd.h>
11#include <stdlib.h>
12#include <ctype.h>
13#include <string.h>
14#include <time.h>
15
16#include "debugfs.h"
17
18FILE *open_pager(void)
19{
20	FILE *outfile;
21	char *pager = getenv("PAGER");
22
23	if (!pager)
24		pager = "more";
25
26	outfile = popen(pager, "w");
27	if (!outfile)
28		outfile = stdout;
29
30	return (outfile);
31}
32
33void close_pager(FILE *stream)
34{
35	if (stream && stream != stdout) fclose(stream);
36}
37
38/*
39 * This routine is used whenever a command needs to turn a string into
40 * an inode.
41 */
42ino_t string_to_inode(char *str)
43{
44	ino_t	ino;
45	int	len = strlen(str);
46	int	i;
47	int	retval;
48
49	/*
50	 * If the string is of the form <ino>, then treat it as an
51	 * inode number.
52	 */
53	if ((len > 2) && (str[0] == '<') && (str[len-1] == '>')) {
54		for (i = 1; i < len-1; i++)
55			if (!isdigit(str[i]))
56				break;
57		if (i == len-1)
58			return(atoi(str+1));
59	}
60
61	retval = ext2fs_namei(current_fs, root, cwd, str, &ino);
62	if (retval) {
63		com_err(str, retval, "");
64		return 0;
65	}
66	return ino;
67}
68
69/*
70 * This routine returns 1 if the filesystem is not open, and prints an
71 * error message to that effect.
72 */
73int check_fs_open(char *name)
74{
75	if (!current_fs) {
76		com_err(name, 0, "Filesystem not open");
77		return 1;
78	}
79	return 0;
80}
81
82/*
83 * This routine returns 1 if a filesystem is open, and prints an
84 * error message to that effect.
85 */
86int check_fs_not_open(char *name)
87{
88	if (current_fs) {
89		com_err(name, 0,
90			"Filesystem %s is still open.  Close it first.\n",
91			current_fs->device_name);
92		return 1;
93	}
94	return 0;
95}
96
97/*
98 * This routine returns 1 if a filesystem is not opened read/write,
99 * and prints an error message to that effect.
100 */
101int check_fs_read_write(char *name)
102{
103	if (!(current_fs->flags & EXT2_FLAG_RW)) {
104		com_err(name, 0, "Filesystem opened read/only");
105		return 1;
106	}
107	return 0;
108}
109
110/*
111 * This routine returns 1 if a filesystem is doesn't have its inode
112 * and block bitmaps loaded, and prints an error message to that
113 * effect.
114 */
115int check_fs_bitmaps(char *name)
116{
117	if (!current_fs->block_map || !current_fs->inode_map) {
118		com_err(name, 0, "Filesystem bitmaps not loaded");
119		return 1;
120	}
121	return 0;
122}
123
124/*
125 * This function takes a __u32 time value and converts it to a string,
126 * using ctime
127 */
128char *time_to_string(__u32 cl)
129{
130	time_t	t = (time_t) cl;
131
132	return ctime(&t);
133}
134
135
136
137
138