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 31583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include <stdio.h> 32583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include <stdlib.h> 33583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include <string.h> 34583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 35583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include "ext2ed.h" 36583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 37583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ochar name_search [80]; 38583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'olong entry_num_search; 39583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 40583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oint init_dir_info (struct struct_file_info *info_ptr) 41583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 42583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 43583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 44583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThis function is called by the inode of the directory when the user issues the dir command from the inode. 45583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oIt is used to gather information about the inode and to reset some variables which we need in order to handle 46583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'odirectories. 47583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 48583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 49583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 50583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 51583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o struct ext2_inode *ptr; 52efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 53583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=&type_data.u.t_ext2_inode; /* type_data contains the inode */ 54efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 55583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info_ptr->inode_ptr=ptr; 56583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info_ptr->inode_offset=device_offset; /* device offset contains the inode's offset */ 57efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 58583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o /* Reset the current position to the start */ 59583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 60efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o info_ptr->global_block_num=ptr->i_block [0]; 61583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info_ptr->global_block_offset=ptr->i_block [0]*file_system_info.block_size; 62583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info_ptr->block_num=0; 63583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info_ptr->file_offset=0; 64583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o /* Set the size of the directory */ 65efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 66583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info_ptr->blocks_count=(ptr->i_size+file_system_info.block_size-1)/file_system_info.block_size; 67583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info_ptr->file_length=ptr->i_size; 68583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 69583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info_ptr->level=0; /* We start using direct blocks */ 70583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info_ptr->display=HEX; /* This is not actually used */ 71583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 72583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info_ptr->dir_entry_num=0;info_ptr->dir_entries_count=0; /* We'll start at the first directory entry */ 73583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info_ptr->dir_entry_offset=0; 74583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 75583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o /* Find dir_entries_count */ 76efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 77583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info_ptr->dir_entries_count=count_dir_entries (); /* Set the total number of entries */ 78efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 79583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return (1); 80583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 81583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 82583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ostruct struct_file_info search_dir_entries (int (*action) (struct struct_file_info *info),int *status) 83583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 84583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 85583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o This is the main function in this source file. Various actions are implemented using this basic function. 86583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 87583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o This routine runs on all directory entries in the current directory. 88583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o For each entry, action is called. We'll act according to the return code of action: 89efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 90583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ABORT - Current dir entry is returned. 91583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o CONTINUE - Continue searching. 92583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o FOUND - Current dir entry is returned. 93efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 94583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o If the last entry is reached, it is returned, along with an ABORT status. 95efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 96efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o status is updated to the returned code of action. 97583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 98583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 99583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 100583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o struct struct_file_info info; /* Temporary variables used to */ 1010f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o struct ext2_dir_entry_2 *dir_entry_ptr; /* contain the current search entries */ 10293599d0c408ef167c6e18537668a74e76f925c29Theodore Ts'o int return_code, next; 103efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 104583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info=first_file_info; /* Start from the first entry - Read it */ 105583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o low_read (info.buffer,file_system_info.block_size,info.global_block_offset); 1060f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o dir_entry_ptr=(struct ext2_dir_entry_2 *) (info.buffer+info.dir_entry_offset); 107efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 108583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o while (info.file_offset < info.file_length) { /* While we haven't reached the end */ 109efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 110583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o *status=return_code=action (&info); /* Call the client function to test */ 111efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o /* the current entry */ 112583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (return_code==ABORT || return_code==FOUND) 113583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return (info); /* Stop, if so asked */ 114583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 115583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o /* Pass to the next entry */ 116efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 1170f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o dir_entry_ptr=(struct ext2_dir_entry_2 *) (info.buffer+info.dir_entry_offset); 118583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 119583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info.dir_entry_num++; 12093599d0c408ef167c6e18537668a74e76f925c29Theodore Ts'o next = dir_entry_ptr->rec_len; 12193599d0c408ef167c6e18537668a74e76f925c29Theodore Ts'o if (!next) 12293599d0c408ef167c6e18537668a74e76f925c29Theodore Ts'o next = file_system_info.block_size - info.dir_entry_offset; 12393599d0c408ef167c6e18537668a74e76f925c29Theodore Ts'o info.dir_entry_offset += next; 12493599d0c408ef167c6e18537668a74e76f925c29Theodore Ts'o info.file_offset += next; 125583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 126583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (info.file_offset >= info.file_length) break; 127583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 128583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (info.dir_entry_offset >= file_system_info.block_size) { /* We crossed a block boundary */ 129583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o /* Find the next block, */ 130583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info.block_num++; 131583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info.global_block_num=file_block_to_global_block (info.block_num,&info); 132583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info.global_block_offset=info.global_block_num*file_system_info.block_size; 133583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info.file_offset=info.block_num*file_system_info.block_size; 134efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o info.dir_entry_offset=0; 135583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o /* read it and update the pointer */ 136efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 137583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o low_read (info.buffer,file_system_info.block_size,info.global_block_offset); 1380f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o dir_entry_ptr=(struct ext2_dir_entry_2 *) (info.buffer+info.dir_entry_offset); 139efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 140583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 141efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 142583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 143efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 144583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o *status=ABORT;return (info); /* There was no match */ 145583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 146583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 147583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'olong count_dir_entries (void) 148583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 149583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 150583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 151583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThis function counts the number of entries in the directory. We just call search_dir_entries till the end. 152583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThe client function is action_count, which just tell search_dir_entries to continue. 153583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 154583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 155583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 156583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 157583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o int status; 158efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 159583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return (search_dir_entries (&action_count,&status).dir_entry_num); 160583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 161583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 162583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oint action_count (struct struct_file_info *info) 163583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 164583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 165583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 166583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oUsed by count_dir_entries above - This function is called by search_dir_entries, and it tells it to continue 167583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'osearching, until we get to the last entry. 168583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 169583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 170583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 171583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 172583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return (CONTINUE); /* Just continue searching */ 173583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 174583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 175583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___cd (char *command_line) 176583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 177583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 178583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o Changes to a directory, relative to the current directory. 179583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 180583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o This is a complicated operation, so I would repeat here the explanation from the design and 181583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o implementation document. 182583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 183583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore 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 184583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o calling directly type_ext2___cd. 185583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 186583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore 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 187583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 1 and into 2/3/4. 188583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 189583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore 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 190efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o search_dir_entries, which accepts the action_name function as the client function. 191583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 192583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o4. search_dir_entries will scan the entire entries and will call our action_name function for each entry. 193583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o In action_name, the required name will be checked against the name of the current entry, and FOUND will be 194583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o returned when a match occurs. 195583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 196583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o5. If the required entry is found, we dispatch a remember command to insert the current inode (remember that 197583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o type_data is still intact and contains the inode of the current directory) into the object memory. 198583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o This is required to easily support symbolic links - If we find later that the inode pointed by the entry is 199583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore 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, 200583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o because of hard links) the information necessary to "move back". 201583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 202583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o6. We then dispatch a followinode command to reach the inode pointed by the required entry. This command will 203583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o automatically change the type to ext2_inode - We are now at an inode, and all the inode commands are available. 204583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 205583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore 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", 206583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o and recursively call ourself (The type is dir again) by dispatching a cd command, with the rest of the path 207583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o as an argument. 208efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 209583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o8. If the inode's type is a symbolic link (only fast symbolic link were meanwhile implemented. I guess this is 210583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o typically the case.), we note the path it is pointing at, the saved inode is recalled, we dispatch dir to 211583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o get back to the original directory, and we call ourself again with the link path/rest of the path argument. 212583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 213583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o9. In any other case, we just stop at the resulting inode. 214583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 215583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 216583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 217583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 218583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o int status; 219583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o char *ptr,full_dir_name [500],dir_name [500],temp [500],temp2 [500]; 220583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o struct struct_file_info info; 2210f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o struct ext2_dir_entry_2 *dir_entry_ptr; 222583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 2230f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o dir_entry_ptr=(struct ext2_dir_entry_2 *) (file_info.buffer+file_info.dir_entry_offset); 224efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 225583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (command_line,dir_name); 226efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 227583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (*ptr==0) { /* cd alone will enter the highlighted directory */ 228583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strncpy (full_dir_name,dir_entry_ptr->name,dir_entry_ptr->name_len); 229583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o full_dir_name [dir_entry_ptr->name_len]=0; 230583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 231583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o else 232583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (ptr,full_dir_name); 233583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 234583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=strchr (full_dir_name,'/'); 235efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 236583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (ptr==full_dir_name) { /* Pathname is from root - Let the general cd do the job */ 237583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o sprintf (temp,"cd %s",full_dir_name);type_ext2___cd (temp);return; 238583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 239efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 240583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (ptr==NULL) { 241583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strcpy (dir_name,full_dir_name); 242583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o full_dir_name [0]=0; 243583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 244583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 245583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o else { 246583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strncpy (dir_name,full_dir_name,ptr-full_dir_name); 247583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dir_name [ptr-full_dir_name]=0; 248583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strcpy (full_dir_name,++ptr); 249583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 250583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o /* dir_name contains the current entry, while */ 251583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o /* full_dir_name contains the rest */ 252583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 253583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strcpy (name_search,dir_name); /* name_search is used to hold the required entry name */ 254efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 255583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (dir_entry_ptr->name_len != strlen (dir_name) || 256583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strncmp (dir_name,dir_entry_ptr->name,dir_entry_ptr->name_len)!=0) 257583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info=search_dir_entries (&action_name,&status); /* Search for the entry. Answer in info. */ 258583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o else { 259583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o status=FOUND;info=file_info; 260583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 261583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 262583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (status==FOUND) { /* If found */ 263583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o file_info=info; /* Switch to it, by setting the global file_info */ 264583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dispatch ("remember internal_variable"); /* Move the inode into the objects memory */ 265efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 266583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dispatch ("followinode"); /* Go to the inode pointed by this directory entry */ 267efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 268583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (S_ISLNK (type_data.u.t_ext2_inode.i_mode)) {/* Symbolic link ? */ 269583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 270583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (type_data.u.t_ext2_inode.i_size > 60) { /* I'm lazy, I guess :-) */ 271583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Error - Sorry, Only fast symbolic link following is currently supported\n"); 272583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o refresh_command_win (); 273efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o return; 274583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 275583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o /* Get the pointed name and append the previous path */ 276583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 277583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strcpy (temp2,(unsigned char *) &type_data.u.t_ext2_inode.i_block); 278583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strcat (temp2,"/"); 279583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strcat (temp2,full_dir_name); 280583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 281583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dispatch ("recall internal_variable"); /* Return to the original inode */ 282583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dispatch ("dir"); /* and to the directory */ 283efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 284583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o sprintf (temp,"cd %s",temp2); /* And continue from there by dispatching a cd command */ 285583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dispatch (temp); /* (which can call ourself or the general cd) */ 286efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 287583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return; 288583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 289583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 290583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (S_ISDIR (type_data.u.t_ext2_inode.i_mode)) { /* Is it an inode of a directory ? */ 291583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 292583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dispatch ("dir"); /* Yes - Pass to the pointed directory */ 293583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 294583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (full_dir_name [0] != 0) { /* And call ourself with the rest of the pathname */ 295583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o sprintf (temp,"cd %s",full_dir_name); 296583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dispatch (temp); 297583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 298efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 299583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return; 300583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 301efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 302583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o else { /* If we can't continue from here, we'll just stop */ 303583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Can\'t continue - Stopping at last inode\n");refresh_command_win (); 304583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return; 305583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 306583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 307efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 308583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Error - Directory entry %s not found.\n",dir_name); /* Hmm, an invalid path somewhere */ 309583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o refresh_command_win (); 310583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 311583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 312583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oint action_name (struct struct_file_info *info) 313583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 314583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 315583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 316583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oCompares the current search entry name (somewhere inside info) with the required name (in name_search). 317583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oReturns FOUND if found, or CONTINUE if not found. 318583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 319583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 320583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 321583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 3220f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o struct ext2_dir_entry_2 *dir_entry_ptr; 323583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 3240f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o dir_entry_ptr=(struct ext2_dir_entry_2 *) (info->buffer+info->dir_entry_offset); 325583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 326583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (dir_entry_ptr->name_len != strlen (name_search)) 327583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return (CONTINUE); 328efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 329583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (strncmp (dir_entry_ptr->name,name_search,dir_entry_ptr->name_len)==0) 330583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return (FOUND); 331583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 332583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return (CONTINUE); 333583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 334583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 335583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___entry (char *command_line) 336583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 337583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 338583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 339583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oSelects a directory entry according to its number. 340583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'osearch_dir_entries is used along with action_entry_num, in the same fashion as the previous usage of search_dir_entries. 341583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 342583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 343583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 344583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 345583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o int status; 346583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o struct struct_file_info info; 347583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o char *ptr,buffer [80]; 348efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 349583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (command_line,buffer); 350583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (*ptr==0) { 351583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Error - Argument_not_specified\n");wrefresh (command_win); 352583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return; 353583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 354583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (ptr,buffer); 355583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o entry_num_search=atol (buffer); 356efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 357583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (entry_num_search < 0 || entry_num_search >= file_info.dir_entries_count) { 358583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Error - Entry number out of range\n");wrefresh (command_win); 359583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return; 360583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 361583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 362583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o info=search_dir_entries (&action_entry_num,&status); 363583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (status==FOUND) { 364583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o file_info=info; 365583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dispatch ("show"); 366583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return; 367583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 368583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#ifdef DEBUG 369583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o internal_error ("dir_com","type_dir___entry","According to our gathered data, we should have found this entry"); 370583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#endif 371583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 372583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 373583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oint action_entry_num (struct struct_file_info *info) 374583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 375583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 376583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 377583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oUsed by the above function. Just compares the current number (in info) with the required one. 378583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 379583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 380583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 381583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 382583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (info->dir_entry_num == entry_num_search) 383583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return (FOUND); 384583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 385583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return (CONTINUE); 386583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 387583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 388583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___followinode (char *command_line) 389583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 390583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 391583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 392583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oHere we pass to the inode pointed by the current entry. 393583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oIt involves computing the device offset of the inode and using directly the setoffset and settype commands. 394583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 395583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 396583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 397583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o long inode_offset; 398583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o char buffer [80]; 399583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 4000f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o struct ext2_dir_entry_2 *dir_entry_ptr; 401583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 402583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o low_read (file_info.buffer,file_system_info.block_size,file_info.global_block_offset); 4030f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o dir_entry_ptr=(struct ext2_dir_entry_2 *) (file_info.buffer+file_info.dir_entry_offset); 404583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 405583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o inode_offset=inode_num_to_inode_offset (dir_entry_ptr->inode); /* Compute the inode's offset */ 406583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o sprintf (buffer,"setoffset %ld",inode_offset);dispatch (buffer); /* Move to it */ 407583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o sprintf (buffer,"settype ext2_inode");dispatch (buffer); /* and set the type to an inode */ 408583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 409583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 410583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___inode (char *command_line) 411583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 412583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 413583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 414583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oReturns to the parent inode of the current directory. 415583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThis is trivial, as we type_data is still intact and contains the parent inode ! 416583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 417583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 418583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 419583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 420583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dispatch ("settype ext2_inode"); 421583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 422583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 423583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 424583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___show (char *command_line) 425583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 426583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 427583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 428583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oWe use search_dir_entries to run on all the entries. Each time, action_show will be called to show one entry. 429583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 430583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 431583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 432583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 433583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o int status; 434efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 435583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wmove (show_pad,0,0); 436583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o show_pad_info.max_line=-1; 437583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 438583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o search_dir_entries (&action_show,&status); 439583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o show_pad_info.line=file_info.dir_entry_num-show_pad_info.display_lines/2; 440583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o refresh_show_pad (); 441583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o show_dir_status (); 442583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 443583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 444583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oint action_show (struct struct_file_info *info) 445583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 446583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 447583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 448583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oShow the current search entry (info) in one line. If the entry happens to be the current edited entry, it is highlighted. 449583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 450583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 451583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 452583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 453583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o unsigned char temp [80]; 4540f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o struct ext2_dir_entry_2 *dir_entry_ptr; 455efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 4560f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o dir_entry_ptr=(struct ext2_dir_entry_2 *) (info->buffer+info->dir_entry_offset); 457583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 458583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (info->dir_entry_num == file_info.dir_entry_num) /* Highlight the current entry */ 459583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wattrset (show_pad,A_REVERSE); 460583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 461583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strncpy (temp,dir_entry_ptr->name,dir_entry_ptr->name_len); /* The name is not terminated */ 462583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o temp [dir_entry_ptr->name_len]=0; 463583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (dir_entry_ptr->name_len > (COLS - 55) && COLS > 55) 464583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o temp [COLS-55]=0; 465583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (show_pad,"inode = %-8lu rec_len = %-4lu name_len = %-3lu name = %s\n", /* Display the various fields */ 466583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dir_entry_ptr->inode,dir_entry_ptr->rec_len,dir_entry_ptr->name_len,temp); 467583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 468583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o show_pad_info.max_line++; 469583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 470583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (info->dir_entry_num == file_info.dir_entry_num) 471583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wattrset (show_pad,A_NORMAL); 472583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 473583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return (CONTINUE); /* And pass to the next */ 474583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 475583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 476583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___next (char *command_line) 477583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 478583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 479583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 480583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThis function moves to the next directory entry. It just uses the current information and the entry command. 481583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 482583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 483583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 484583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 485583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o int offset=1; 486583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o char *ptr,buffer [80]; 487583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 488583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (command_line,buffer); 489efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 490583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (*ptr!=0) { 491583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (ptr,buffer); 492583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o offset*=atol (buffer); 493583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 494583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 495583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o sprintf (buffer,"entry %ld",file_info.dir_entry_num+offset);dispatch (buffer); 496583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 497583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 498583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 499583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___prev (char *command_line) 500583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 501583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 502583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o int offset=1; 503583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o char *ptr,buffer [80]; 504583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 505583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (command_line,buffer); 506efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 507583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (*ptr!=0) { 508583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (ptr,buffer); 509583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o offset*=atol (buffer); 510583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 511583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 512583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o sprintf (buffer,"entry %ld",file_info.dir_entry_num-offset);dispatch (buffer); 513583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 514583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 515583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid show_dir_status (void) 516583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 517583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 518583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 519583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oVarious statistics about the directory. 520583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 521583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 522583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 523583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 524583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o long inode_num; 525efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 526583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wmove (show_win,0,0); 527583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (show_win,"Directory listing. Block %ld. ",file_info.global_block_num); 528583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (show_win,"Directory entry %ld of %ld.\n",file_info.dir_entry_num,file_info.dir_entries_count-1); 529583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (show_win,"Directory Offset %ld of %ld. ",file_info.file_offset,file_info.file_length-1); 530efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 531583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o inode_num=inode_offset_to_inode_num (file_info.inode_offset); 532583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (show_win,"File inode %ld. Indirection level %ld.\n",inode_num,file_info.level); 533583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 534583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o refresh_show_win (); 535583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 536583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 537583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___remember (char *command_line) 538583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 539583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 540583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 541583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThis is overrided here because we don't remember a directory - It is too complicated. Instead, we remember the 542583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oinode of the current directory. 543583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 544583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 545583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 546583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 547583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o int found=0; 548583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o long entry_num; 549583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o char *ptr,buffer [80]; 550583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o struct struct_descriptor *descriptor_ptr; 551efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 552583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (command_line,buffer); 553efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 554583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (*ptr==0) { 555583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Error - Argument not specified\n");wrefresh (command_win); 556efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o return; 557583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 558efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 559583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (ptr,buffer); 560583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 561583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o entry_num=remember_lifo.entries_count++; 562583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (entry_num>REMEMBER_COUNT-1) { 563583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o entry_num=0; 564583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o remember_lifo.entries_count--; 565583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 566efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 567583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o descriptor_ptr=first_type; 568583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o while (descriptor_ptr!=NULL && !found) { 569583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (strcmp (descriptor_ptr->name,"ext2_inode")==0) 570583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o found=1; 571583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o else 572583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o descriptor_ptr=descriptor_ptr->next; 573583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 574583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 575583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 576583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o remember_lifo.offset [entry_num]=device_offset; 577583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o remember_lifo.type [entry_num]=descriptor_ptr; 578583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strcpy (remember_lifo.name [entry_num],buffer); 579efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 580583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Object %s in Offset %ld remembered as %s\n",descriptor_ptr->name,device_offset,buffer); 581583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wrefresh (command_win); 582583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 583583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 584583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___set (char *command_line) 585583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 586583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 587583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 588583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oSince the dir object doesn't have variables, we provide the impression that it has here. ext2_dir_entry was not used 589583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'obecause it is of variable length. 590583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 591583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 592583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 593583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 594583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o int found=0; 595583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o unsigned char *ptr,buffer [80],variable [80],value [80],temp [80]; 5960f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o struct ext2_dir_entry_2 *dir_entry_ptr; 597efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 5980f31c737dbf999c90a0842e6a499416b8e1f0cb4Theodore Ts'o dir_entry_ptr=(struct ext2_dir_entry_2 *) (file_info.buffer+file_info.dir_entry_offset); 599efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 600583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (command_line,buffer); 601583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (*ptr==0) { 602583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Error - Missing arguments\n");refresh_command_win (); 603583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return; 604583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 605583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o parse_word (ptr,buffer); 606583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=strchr (buffer,'='); 607583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (ptr==NULL) { 608583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Error - Bad syntax\n");refresh_command_win ();return; 609583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 610583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strncpy (variable,buffer,ptr-buffer);variable [ptr-buffer]=0; 611583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strcpy (value,++ptr); 612583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 613583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (strcasecmp ("inode",variable)==0) { 614583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o found=1; 615583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dir_entry_ptr->inode=atol (value); 616583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Variable %s set to %lu\n",variable,dir_entry_ptr->inode);refresh_command_win (); 617583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 618583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 619583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 620583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (strcasecmp ("rec_len",variable)==0) { 621583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o found=1; 622583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dir_entry_ptr->rec_len=(unsigned int) atol (value); 623583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Variable %s set to %lu\n",variable,dir_entry_ptr->rec_len);refresh_command_win (); 624583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 625583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 626583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 627583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (strcasecmp ("name_len",variable)==0) { 628583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o found=1; 629583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dir_entry_ptr->name_len=(unsigned int) atol (value); 630583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Variable %s set to %lu\n",variable,dir_entry_ptr->name_len);refresh_command_win (); 631583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 632583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 633583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 634583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (strcasecmp ("name",variable)==0) { 635583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o found=1; 636583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (strlen (value) > dir_entry_ptr->name_len) { 637583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Error - Length of name greater then name_len\n"); 638583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o refresh_command_win ();return; 639583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 640583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strncpy (dir_entry_ptr->name,value,strlen (value)); 641583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Variable %s set to %s\n",variable,value);refresh_command_win (); 642583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 643583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 644efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 645583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (found) { 646583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wattrset (show_pad,A_REVERSE); 647583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strncpy (temp,dir_entry_ptr->name,dir_entry_ptr->name_len); 648583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o temp [dir_entry_ptr->name_len]=0; 649583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wmove (show_pad,file_info.dir_entry_num,0); 650583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (show_pad,"inode = %-8lu rec_len = %-4lu name_len = %-3lu name = %s\n", 651583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dir_entry_ptr->inode,dir_entry_ptr->rec_len,dir_entry_ptr->name_len,temp); 652583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wattrset (show_pad,A_NORMAL); 653583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o show_pad_info.line=file_info.dir_entry_num-show_pad_info.display_lines/2; 654583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o refresh_show_pad (); 655583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o show_dir_status (); 656583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 657efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 658583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o else { 659583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Error - Variable %s not found\n",variable); 660583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o refresh_command_win (); 661583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 662583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 663583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 664583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 665583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_dir___writedata (char *command_line) 666583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 667583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 668583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 669583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oWe need to override this since the data is not in type_data. Instead, we have to write the buffer which corresponds 670583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oto the current block. 671583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 672583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 673583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 674583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 675583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o low_write (file_info.buffer,file_system_info.block_size,file_info.global_block_offset); 676583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o return; 677583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 678