1583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
2583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
3583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/usr/src/ext2ed/dir_com.c
4583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
5583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oA part of the extended file system 2 disk editor.
6583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
7583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o--------------------
8583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oHandles directories.
9583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o--------------------
10583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
11583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThis file contains the codes which allows the user to handle directories.
12583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
13583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oMost of the functions use the global variable file_info (along with the special directory fields there) to save
14583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oinformation and pass it between them.
15583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
16583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oSince a directory is just a big file which is composed of directory entries, you will find that
17583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'othe functions here are a superset of those in the file_com.c source.
18583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
19583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oWe assume that the user reached here using the dir command of the inode type and not by using settype dir, so
20583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'othat init_dir_info is indeed called to gather the required information.
21583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
22598ff01414fc01bc12be69c0fa1e852c4a93864dTheodore Ts'otype_data is not changed! It still contains the inode of the file - We handle the directory in our own
23583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovariables, so that settype ext2_inode will "go back" to the inode of this directory.
24583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
25583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oFirst written on: April 28 1995
26583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
27583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oCopyright (C) 1995 Gadi Oxman
28583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
29583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
30583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
31d1154eb460efe588eaed3d439c1caaca149fa362Theodore Ts'o#include "config.h"
32583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include <stdio.h>
33583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include <stdlib.h>
34583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include <string.h>
35583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
36583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include "ext2ed.h"
37583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
38583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ochar name_search [80];
39583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'olong entry_num_search;
40583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
41583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oint init_dir_info (struct struct_file_info *info_ptr)
42583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
43583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
44583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
45583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThis function is called by the inode of the directory when the user issues the dir command from the inode.
46583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oIt is used to gather information about the inode and to reset some variables which we need in order to handle
47583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'odirectories.
48583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
49583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
50583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
51583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
52583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	struct ext2_inode *ptr;
53efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
54583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=&type_data.u.t_ext2_inode;					/* type_data contains the inode */
55efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
56583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	info_ptr->inode_ptr=ptr;
57583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	info_ptr->inode_offset=device_offset;				/* device offset contains the inode's offset */
58efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
59583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o									/* Reset the current position to the start */
60583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
61efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o	info_ptr->global_block_num=ptr->i_block [0];
62583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	info_ptr->global_block_offset=ptr->i_block [0]*file_system_info.block_size;
63583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	info_ptr->block_num=0;
64583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	info_ptr->file_offset=0;
65583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o									/* Set the size of the directory */
66efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
67583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	info_ptr->blocks_count=(ptr->i_size+file_system_info.block_size-1)/file_system_info.block_size;
68583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	info_ptr->file_length=ptr->i_size;
69583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
70583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	info_ptr->level=0;						/* We start using direct blocks */
71583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	info_ptr->display=HEX;						/* This is not actually used */
72583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
73583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	info_ptr->dir_entry_num=0;info_ptr->dir_entries_count=0;	/* We'll start at the first directory entry */
74583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	info_ptr->dir_entry_offset=0;
75583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
76583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	/* Find dir_entries_count */
77efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
78583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	info_ptr->dir_entries_count=count_dir_entries (); 		/* Set the total number of entries */
79efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
80583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	return (1);
81583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
82583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
83583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ostruct struct_file_info search_dir_entries (int (*action) (struct struct_file_info *info),int *status)
84583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
85583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
86583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	This is the main function in this source file. Various actions are implemented using this basic function.
87583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
88583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	This routine runs on all directory entries in the current directory.
89583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	For each entry, action is called. We'll act according to the return code of action:
90efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
91583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		ABORT		-	Current dir entry is returned.
92583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		CONTINUE	-	Continue searching.
93583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		FOUND		-	Current dir entry is returned.
94efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
95583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	If the last entry is reached, it is returned, along with an ABORT status.
96efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
97efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o	status is updated to the returned code of action.
98583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
99583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
100583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
101583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	struct struct_file_info info;						/* Temporary variables used to */
1020f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o	struct ext2_dir_entry_2 *dir_entry_ptr;					/* contain the current search entries */
10393599d0c408ef167c6e18537668a74e76f925c29Theodore Ts'o	int return_code, next;
104efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
105583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	info=first_file_info;							/* Start from the first entry - Read it */
106583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	low_read (info.buffer,file_system_info.block_size,info.global_block_offset);
1070f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o	dir_entry_ptr=(struct ext2_dir_entry_2 *) (info.buffer+info.dir_entry_offset);
108efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
109583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	while (info.file_offset < info.file_length) {				/* While we haven't reached the end */
110efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
111583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		*status=return_code=action (&info);				/* Call the client function to test */
112efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o										/* the current entry */
113583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		if (return_code==ABORT || return_code==FOUND)
114583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			return (info);						/* Stop, if so asked */
115583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
116583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o										/* Pass to the next entry */
117efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
1180f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o		dir_entry_ptr=(struct ext2_dir_entry_2 *) (info.buffer+info.dir_entry_offset);
119583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
120583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		info.dir_entry_num++;
12193599d0c408ef167c6e18537668a74e76f925c29Theodore Ts'o		next = dir_entry_ptr->rec_len;
12293599d0c408ef167c6e18537668a74e76f925c29Theodore Ts'o		if (!next)
12393599d0c408ef167c6e18537668a74e76f925c29Theodore Ts'o			next = file_system_info.block_size - info.dir_entry_offset;
12493599d0c408ef167c6e18537668a74e76f925c29Theodore Ts'o		info.dir_entry_offset += next;
12593599d0c408ef167c6e18537668a74e76f925c29Theodore Ts'o		info.file_offset += next;
126583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
127583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		if (info.file_offset >= info.file_length) break;
128583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
129583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		if (info.dir_entry_offset >= file_system_info.block_size) {	/* We crossed a block boundary */
130583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o										/* Find the next block, */
131583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			info.block_num++;
132583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			info.global_block_num=file_block_to_global_block (info.block_num,&info);
133583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			info.global_block_offset=info.global_block_num*file_system_info.block_size;
134583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			info.file_offset=info.block_num*file_system_info.block_size;
135efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o			info.dir_entry_offset=0;
136583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o										/* read it and update the pointer */
137efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
138583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			low_read (info.buffer,file_system_info.block_size,info.global_block_offset);
1390f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o			dir_entry_ptr=(struct ext2_dir_entry_2 *) (info.buffer+info.dir_entry_offset);
140efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
141583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		}
142efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
143583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
144efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
145583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	*status=ABORT;return (info);						/* There was no match */
146583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
147583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
148583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'olong count_dir_entries (void)
149583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
150583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
151583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
152583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThis function counts the number of entries in the directory. We just call search_dir_entries till the end.
153583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThe client function is action_count, which just tell search_dir_entries to continue.
154583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
155583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
156583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
157583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
158583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	int status;
159efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
160583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	return (search_dir_entries (&action_count,&status).dir_entry_num);
161583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
162583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
163583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oint action_count (struct struct_file_info *info)
164583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
165583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
166583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
167583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oUsed by count_dir_entries above - This function is called by search_dir_entries, and it tells it to continue
168583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'osearching, until we get to the last entry.
169583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
170583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
171583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
172583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
173583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	return (CONTINUE);							/* Just continue searching */
174583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
175583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
176583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___cd (char *command_line)
177583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
178583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
179583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	Changes to a directory, relative to the current directory.
180583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
181583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	This is a complicated operation, so I would repeat here the explanation from the design and
182583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	implementation document.
183583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
184583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o1.	The path is checked that it is not an absolute path (from /). If it is, we let the general cd to do the job by
185583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	calling directly type_ext2___cd.
186583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
187583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o2.	The path is divided into the nearest path and the rest of the path. For example, cd 1/2/3/4 is divided into
188583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	1 and into 2/3/4.
189583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
190583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o3.	It is the first part of the path that we need to search for in the current directory. We search for it using
191efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o	search_dir_entries, which accepts the action_name function as the client function.
192583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
193583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o4.	search_dir_entries will scan the entire entries and will call our action_name function for each entry.
194583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	In action_name, the required name will be checked against the name of the current entry, and FOUND will be
195583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	returned when a match occurs.
196583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
197583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o5.	If the required entry is found, we dispatch a remember command to insert the current inode (remember that
198583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	type_data is still intact and contains the inode of the current directory) into the object memory.
199583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	This is required to easily support symbolic links - If we find later that the inode pointed by the entry is
200583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	actually a symbolic link, we'll need to return to this point, and the above inode doesn't have (and can't have,
201583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	because of hard links) the information necessary to "move back".
202583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
203583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o6.	We then dispatch a followinode command to reach the inode pointed by the required entry. This command will
204583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	automatically change the type to ext2_inode - We are now at an inode, and all the inode commands are available.
205583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
206583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o7.	We check the inode's type to see if it is a directory. If it is, we dispatch a dir command to "enter the directory",
207583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	and recursively call ourself (The type is dir again) by dispatching a cd command, with the rest of the path
208583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	as an argument.
209efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
210583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o8.	If the inode's type is a symbolic link (only fast symbolic link were meanwhile implemented. I guess this is
211583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	typically the case.), we note the path it is pointing at, the saved inode is recalled, we dispatch dir to
212583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	get back to the original directory, and we call ourself again with the link path/rest of the path argument.
213583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
214583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o9.	In any other case, we just stop at the resulting inode.
215583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
216583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
217583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
218583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
219583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	int status;
220583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	char *ptr,full_dir_name [500],dir_name [500],temp [500],temp2 [500];
221583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	struct struct_file_info info;
2220f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o	struct ext2_dir_entry_2 *dir_entry_ptr;
223583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
2240f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o	dir_entry_ptr=(struct ext2_dir_entry_2 *) (file_info.buffer+file_info.dir_entry_offset);
225efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
226583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (command_line,dir_name);
227efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
228583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (*ptr==0) {						/* cd alone will enter the highlighted directory */
229583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		strncpy (full_dir_name,dir_entry_ptr->name,dir_entry_ptr->name_len);
230583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		full_dir_name [dir_entry_ptr->name_len]=0;
231583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
232583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	else
233583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		ptr=parse_word (ptr,full_dir_name);
234583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
235583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=strchr (full_dir_name,'/');
236efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
237583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (ptr==full_dir_name) {				/* Pathname is from root - Let the general cd do the job */
238583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		sprintf (temp,"cd %s",full_dir_name);type_ext2___cd (temp);return;
239583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
240efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
241583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (ptr==NULL) {
242583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		strcpy (dir_name,full_dir_name);
243583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		full_dir_name [0]=0;
244583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
245583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
246583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	else {
247583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		strncpy (dir_name,full_dir_name,ptr-full_dir_name);
248583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		dir_name [ptr-full_dir_name]=0;
249583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		strcpy (full_dir_name,++ptr);
250583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
251583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o								/* dir_name contains the current entry, while */
252583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o								/* full_dir_name contains the rest */
253583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
254583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	strcpy (name_search,dir_name);				/* name_search is used to hold the required entry name */
255efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
256583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (dir_entry_ptr->name_len != strlen (dir_name) ||
257583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	    strncmp (dir_name,dir_entry_ptr->name,dir_entry_ptr->name_len)!=0)
258583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		info=search_dir_entries (&action_name,&status);	/* Search for the entry. Answer in info. */
259583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	else {
260583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		status=FOUND;info=file_info;
261583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
262583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
263583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (status==FOUND) {					/* If found */
264583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		file_info=info;					/* Switch to it, by setting the global file_info */
265583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		dispatch ("remember internal_variable");	/* Move the inode into the objects memory */
266efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
267583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		dispatch ("followinode");			/* Go to the inode pointed by this directory entry */
268efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
269583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		if (S_ISLNK (type_data.u.t_ext2_inode.i_mode)) {/* Symbolic link ? */
270583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
271583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			if (type_data.u.t_ext2_inode.i_size > 60) {	/* I'm lazy, I guess :-) */
272583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				wprintw (command_win,"Error - Sorry, Only fast symbolic link following is currently supported\n");
273583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				refresh_command_win ();
274efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o				return;
275583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			}
276583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o								/* Get the pointed name and append the previous path */
277583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
278583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			strcpy (temp2,(unsigned char *) &type_data.u.t_ext2_inode.i_block);
279583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			strcat (temp2,"/");
280583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			strcat (temp2,full_dir_name);
281583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
282583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			dispatch ("recall internal_variable");	/* Return to the original inode */
283583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			dispatch ("dir");			/* and to the directory */
284efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
285583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			sprintf (temp,"cd %s",temp2);		/* And continue from there by dispatching a cd command */
286583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			dispatch (temp);			/* (which can call ourself or the general cd) */
287efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
288583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			return;
289583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		}
290583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
291583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		if (S_ISDIR (type_data.u.t_ext2_inode.i_mode)) { /* Is it an inode of a directory ? */
292583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
293583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			dispatch ("dir");			/* Yes - Pass to the pointed directory */
294583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
295583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			if (full_dir_name [0] != 0) {		/* And call ourself with the rest of the pathname */
296583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				sprintf (temp,"cd %s",full_dir_name);
297583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				dispatch (temp);
298583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			}
299efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
300583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			return;
301583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		}
302efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
303583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		else {						/* If we can't continue from here, we'll just stop */
304583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			wprintw (command_win,"Can\'t continue - Stopping at last inode\n");refresh_command_win ();
305583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			return;
306583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		}
307583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
308efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
309583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wprintw (command_win,"Error - Directory entry %s not found.\n",dir_name);	/* Hmm, an invalid path somewhere */
310583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	refresh_command_win ();
311583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
312583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
313583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oint action_name (struct struct_file_info *info)
314583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
315583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
316583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
317583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oCompares the current search entry name (somewhere inside info) with the required name (in name_search).
318583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oReturns FOUND if found, or CONTINUE if not found.
319583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
320583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
321583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
322583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
3230f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o	struct ext2_dir_entry_2 *dir_entry_ptr;
324583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
3250f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o	dir_entry_ptr=(struct ext2_dir_entry_2 *) (info->buffer+info->dir_entry_offset);
326583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
327583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (dir_entry_ptr->name_len != strlen (name_search))
328583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		return (CONTINUE);
329efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
330583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (strncmp (dir_entry_ptr->name,name_search,dir_entry_ptr->name_len)==0)
331583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		return (FOUND);
332583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
333583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	return (CONTINUE);
334583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
335583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
336583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___entry (char *command_line)
337583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
338583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
339583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
340583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oSelects a directory entry according to its number.
341583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'osearch_dir_entries is used along with action_entry_num, in the same fashion as the previous usage of search_dir_entries.
342583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
343583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
344583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
345583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
346583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	int status;
347583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	struct struct_file_info info;
348583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	char *ptr,buffer [80];
349efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
350583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (command_line,buffer);
351583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (*ptr==0) {
352583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Argument_not_specified\n");wrefresh (command_win);
353583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		return;
354583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
355583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (ptr,buffer);
356583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	entry_num_search=atol (buffer);
357efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
358583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (entry_num_search < 0 || entry_num_search >= file_info.dir_entries_count) {
359583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Entry number out of range\n");wrefresh (command_win);
360583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		return;
361583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
362583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
363583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	info=search_dir_entries (&action_entry_num,&status);
364583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (status==FOUND) {
365583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		file_info=info;
366583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		dispatch ("show");
367583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		return;
368583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
369583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#ifdef DEBUG
370583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	internal_error ("dir_com","type_dir___entry","According to our gathered data, we should have found this entry");
371583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#endif
372583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
373583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
374583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oint action_entry_num (struct struct_file_info *info)
375583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
376583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
377583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
378583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oUsed by the above function. Just compares the current number (in info) with the required one.
379583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
380583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
381583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
382583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
383583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (info->dir_entry_num == entry_num_search)
384583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		return (FOUND);
385583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
386583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	return (CONTINUE);
387583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
388583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
389583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___followinode (char *command_line)
390583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
391583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
392583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
393583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oHere we pass to the inode pointed by the current entry.
394583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oIt involves computing the device offset of the inode and using directly the setoffset and settype commands.
395583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
396583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
397583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
398583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	long inode_offset;
399583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	char buffer [80];
400583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
4010f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o	struct ext2_dir_entry_2 *dir_entry_ptr;
402583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
403583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	low_read (file_info.buffer,file_system_info.block_size,file_info.global_block_offset);
4040f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o	dir_entry_ptr=(struct ext2_dir_entry_2 *) (file_info.buffer+file_info.dir_entry_offset);
405583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
406583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	inode_offset=inode_num_to_inode_offset (dir_entry_ptr->inode);			/* Compute the inode's offset */
407583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	sprintf (buffer,"setoffset %ld",inode_offset);dispatch (buffer);		/* Move to it */
408583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	sprintf (buffer,"settype ext2_inode");dispatch (buffer);			/* and set the type to an inode */
409583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
410583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
411583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___inode (char *command_line)
412583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
413583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
414583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
415583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oReturns to the parent inode of the current directory.
416583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThis is trivial, as we type_data is still intact and contains the parent inode !
417583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
418583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
419583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
420583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
421583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	dispatch ("settype ext2_inode");
422583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
423583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
424583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
425583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___show (char *command_line)
426583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
427583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
428583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
429583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oWe use search_dir_entries to run on all the entries. Each time, action_show will be called to show one entry.
430583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
431583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
432583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
433583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
434583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	int status;
435efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
436583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wmove (show_pad,0,0);
437583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	show_pad_info.max_line=-1;
438583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
439583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	search_dir_entries (&action_show,&status);
440583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	show_pad_info.line=file_info.dir_entry_num-show_pad_info.display_lines/2;
441583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	refresh_show_pad ();
442583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	show_dir_status ();
443583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
444583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
445583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oint action_show (struct struct_file_info *info)
446583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
447583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
448583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
449583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oShow the current search entry (info) in one line. If the entry happens to be the current edited entry, it is highlighted.
450583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
451583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
452583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
453583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
454583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	unsigned char temp [80];
4550f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o	struct ext2_dir_entry_2 *dir_entry_ptr;
456efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
4570f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o	dir_entry_ptr=(struct ext2_dir_entry_2 *) (info->buffer+info->dir_entry_offset);
458583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
459583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (info->dir_entry_num == file_info.dir_entry_num)				/* Highlight the current entry */
460583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wattrset (show_pad,A_REVERSE);
461583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
462583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	strncpy (temp,dir_entry_ptr->name,dir_entry_ptr->name_len);			/* The name is not terminated */
463583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	temp [dir_entry_ptr->name_len]=0;
464583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (dir_entry_ptr->name_len > (COLS - 55) && COLS > 55)
465583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		temp [COLS-55]=0;
466583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wprintw (show_pad,"inode = %-8lu rec_len = %-4lu name_len = %-3lu name = %s\n",	/* Display the various fields */
467583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		 dir_entry_ptr->inode,dir_entry_ptr->rec_len,dir_entry_ptr->name_len,temp);
468583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
469583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	show_pad_info.max_line++;
470583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
471583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (info->dir_entry_num == file_info.dir_entry_num)
472583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wattrset (show_pad,A_NORMAL);
473583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
474583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	return (CONTINUE);								/* And pass to the next */
475583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
476583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
477583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___next (char *command_line)
478583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
479583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
480583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
481583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThis function moves to the next directory entry. It just uses the current information and the entry command.
482583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
483583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
484583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
485583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
486583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	int offset=1;
487583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	char *ptr,buffer [80];
488583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
489583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (command_line,buffer);
490efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
491583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (*ptr!=0) {
492583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		ptr=parse_word (ptr,buffer);
493583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		offset*=atol (buffer);
494583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
495583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
496583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	sprintf (buffer,"entry %ld",file_info.dir_entry_num+offset);dispatch (buffer);
497583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
498583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
499583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
500583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___prev (char *command_line)
501583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
502583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
503583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	int offset=1;
504583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	char *ptr,buffer [80];
505583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
506583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (command_line,buffer);
507efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
508583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (*ptr!=0) {
509583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		ptr=parse_word (ptr,buffer);
510583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		offset*=atol (buffer);
511583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
512583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
513583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	sprintf (buffer,"entry %ld",file_info.dir_entry_num-offset);dispatch (buffer);
514583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
515583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
516583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid show_dir_status (void)
517583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
518583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
519583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
520583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oVarious statistics about the directory.
521583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
522583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
523583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
524583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
525583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	long inode_num;
526efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
527583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wmove (show_win,0,0);
528583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wprintw (show_win,"Directory listing. Block %ld. ",file_info.global_block_num);
529583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wprintw (show_win,"Directory entry %ld of %ld.\n",file_info.dir_entry_num,file_info.dir_entries_count-1);
530583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wprintw (show_win,"Directory Offset %ld of %ld. ",file_info.file_offset,file_info.file_length-1);
531efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
532583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	inode_num=inode_offset_to_inode_num (file_info.inode_offset);
533583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wprintw (show_win,"File inode %ld. Indirection level %ld.\n",inode_num,file_info.level);
534583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
535583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	refresh_show_win ();
536583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
537583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
538583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___remember (char *command_line)
539583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
540583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
541583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
542583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThis is overrided here because we don't remember a directory - It is too complicated. Instead, we remember the
543583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oinode of the current directory.
544583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
545583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
546583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
547583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
548583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	int found=0;
549583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	long entry_num;
550583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	char *ptr,buffer [80];
551583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	struct struct_descriptor *descriptor_ptr;
552efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
553583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (command_line,buffer);
554efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
555583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (*ptr==0) {
556583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Argument not specified\n");wrefresh (command_win);
557efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o		return;
558583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
559efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
560583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (ptr,buffer);
561583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
562583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	entry_num=remember_lifo.entries_count++;
563583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (entry_num>REMEMBER_COUNT-1) {
564583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		entry_num=0;
565583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		remember_lifo.entries_count--;
566583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
567efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
568583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	descriptor_ptr=first_type;
569583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	while (descriptor_ptr!=NULL && !found) {
570583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		if (strcmp (descriptor_ptr->name,"ext2_inode")==0)
571583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			found=1;
572583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		else
573583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			descriptor_ptr=descriptor_ptr->next;
574583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
575583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
576583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
577583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	remember_lifo.offset [entry_num]=device_offset;
578583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	remember_lifo.type [entry_num]=descriptor_ptr;
579583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	strcpy (remember_lifo.name [entry_num],buffer);
580efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
581583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wprintw (command_win,"Object %s in Offset %ld remembered as %s\n",descriptor_ptr->name,device_offset,buffer);
582583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wrefresh (command_win);
583583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
584583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
585583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___set (char *command_line)
586583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
587583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
588583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
589583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oSince the dir object doesn't have variables, we provide the impression that it has here. ext2_dir_entry was not used
590583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'obecause it is of variable length.
591583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
592583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
593583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
594583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
595583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	int found=0;
596583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	unsigned char *ptr,buffer [80],variable [80],value [80],temp [80];
5970f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o	struct ext2_dir_entry_2 *dir_entry_ptr;
598efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
5990f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o	dir_entry_ptr=(struct ext2_dir_entry_2 *) (file_info.buffer+file_info.dir_entry_offset);
600efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
601583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (command_line,buffer);
602583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (*ptr==0) {
603583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Missing arguments\n");refresh_command_win ();
604583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		return;
605583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
606583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	parse_word (ptr,buffer);
607583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=strchr (buffer,'=');
608583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (ptr==NULL) {
609583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Bad syntax\n");refresh_command_win ();return;
610583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
611583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	strncpy (variable,buffer,ptr-buffer);variable [ptr-buffer]=0;
612583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	strcpy (value,++ptr);
613583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
614583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (strcasecmp ("inode",variable)==0) {
615583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		found=1;
616583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		dir_entry_ptr->inode=atol (value);
617583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Variable %s set to %lu\n",variable,dir_entry_ptr->inode);refresh_command_win ();
618583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
619583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
620583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
621583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (strcasecmp ("rec_len",variable)==0) {
622583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		found=1;
623583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		dir_entry_ptr->rec_len=(unsigned int) atol (value);
624583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Variable %s set to %lu\n",variable,dir_entry_ptr->rec_len);refresh_command_win ();
625583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
626583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
627583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
628583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (strcasecmp ("name_len",variable)==0) {
629583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		found=1;
630583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		dir_entry_ptr->name_len=(unsigned int) atol (value);
631583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Variable %s set to %lu\n",variable,dir_entry_ptr->name_len);refresh_command_win ();
632583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
633583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
634583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
635583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (strcasecmp ("name",variable)==0) {
636583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		found=1;
637583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		if (strlen (value) > dir_entry_ptr->name_len) {
638583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			wprintw (command_win,"Error - Length of name greater then name_len\n");
639583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			refresh_command_win ();return;
640583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		}
641583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		strncpy (dir_entry_ptr->name,value,strlen (value));
642583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Variable %s set to %s\n",variable,value);refresh_command_win ();
643583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
644583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
645efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
646583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (found) {
647583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wattrset (show_pad,A_REVERSE);
648583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		strncpy (temp,dir_entry_ptr->name,dir_entry_ptr->name_len);
649583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		temp [dir_entry_ptr->name_len]=0;
650583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wmove (show_pad,file_info.dir_entry_num,0);
651583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (show_pad,"inode = %-8lu rec_len = %-4lu name_len = %-3lu name = %s\n",
652583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			 dir_entry_ptr->inode,dir_entry_ptr->rec_len,dir_entry_ptr->name_len,temp);
653583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wattrset (show_pad,A_NORMAL);
654583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		show_pad_info.line=file_info.dir_entry_num-show_pad_info.display_lines/2;
655583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		refresh_show_pad ();
656583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		show_dir_status ();
657583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
658efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
659583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	else {
660583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Variable %s not found\n",variable);
661583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		refresh_command_win ();
662583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
663583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
664583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
665583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
666583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___writedata (char *command_line)
667583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
668583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
669583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
670583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oWe need to override this since the data is not in type_data. Instead, we have to write the buffer which corresponds
671583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oto the current block.
672583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
673583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
674583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
675583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
676583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	low_write (file_info.buffer,file_system_info.block_size,file_info.global_block_offset);
677583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	return;
678583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
679