diff --git a/ext2ed/ChangeLog b/ext2ed/ChangeLog index 1b15737a..85ac5606 100644 --- a/ext2ed/ChangeLog +++ b/ext2ed/ChangeLog @@ -1,4 +1,17 @@ -2002-05-11 +2002-05-11 + + * win.c, main.c, general_com.c: Use e2fsprogs's version + information for the program banner. + + * ext2ed.h, init.c, general_com.c: Add a field_type parameter, and + use specialized routines for showing and setting ints, uints, + and characeter strings. + + * ext2.descriptors: Updated with newer superblock descriptor; use + __u32 and __u16 instead of unsigned long and unsigned + short. Add data structures for direcctory indexing code. + +2002-05-11 * ext2ed.h: Remove VAR_DIR, and replace it with ETC_DIR. (/var/lib is no longer a politically correct location for diff --git a/ext2ed/Makefile.in b/ext2ed/Makefile.in index c41938c2..d6e82c1e 100644 --- a/ext2ed/Makefile.in +++ b/ext2ed/Makefile.in @@ -19,6 +19,12 @@ DOC_DIR = $datadir/doc/ext2ed XTRA_CFLAGS = $(FLAGS) -DETC_DIR=\"$(root_sysconfdir)\" -I/usr/include/readline LIBS = -lreadline -lncurses +SRCS= $(srcdir)/main.c $(srcdir)/init.c $(srcdir)/general_com.c \ + $(srcdir)/inode_com.c $(srcdir)/dir_com.c $(srcdir)/super_com.c \ + $(srcdir)/disk.c $(srcdir)/win.c $(srcdir)/group_com.c \ + $(srcdir)/file_com.c $(srcdir)/blockbitmap_com.c \ + $(srcdir)/ext2_com.c $(srcdir)/inodebitmap_com.c + OBJS= main.o init.o general_com.o inode_com.o dir_com.o super_com.o \ disk.o win.o group_com.o file_com.o blockbitmap_com.o ext2_com.o \ inodebitmap_com.o @@ -75,3 +81,15 @@ install: ext2ed # Makefile dependencies follow. This must be the last section in # the Makefile.in file # +main.o: $(srcdir)/main.c $(srcdir)/ext2ed.h +general_com.o: $(srcdir)/general_com.c $(srcdir)/ext2ed.h +inode_com.o: $(srcdir)/inode_com.c $(srcdir)/ext2ed.h +dir_com.o: $(srcdir)/dir_com.c $(srcdir)/ext2ed.h +super_com.o: $(srcdir)/super_com.c $(srcdir)/ext2ed.h +disk.o: $(srcdir)/disk.c $(srcdir)/ext2ed.h +win.o: $(srcdir)/win.c $(srcdir)/ext2ed.h +group_com.o: $(srcdir)/group_com.c $(srcdir)/ext2ed.h +file_com.o: $(srcdir)/file_com.c $(srcdir)/ext2ed.h +blockbitmap_com.o: $(srcdir)/blockbitmap_com.c $(srcdir)/ext2ed.h +ext2_com.o: $(srcdir)/ext2_com.c $(srcdir)/ext2ed.h +inodebitmap_com.o: $(srcdir)/inodebitmap_com.c $(srcdir)/ext2ed.h diff --git a/ext2ed/ext2.descriptors b/ext2ed/ext2.descriptors index 9d107faa..bf927b02 100644 --- a/ext2ed/ext2.descriptors +++ b/ext2ed/ext2.descriptors @@ -57,325 +57,313 @@ struct ext2_acl_entry /* Access Control List Entry */ struct ext2_group_desc { - unsigned long bg_block_bitmap; /* Blocks bitmap block */ - unsigned long bg_inode_bitmap; /* Inodes bitmap block */ - unsigned long bg_inode_table; /* Inodes table block */ - unsigned short bg_free_blocks_count; /* Free blocks count */ - unsigned short bg_free_inodes_count; /* Free inodes count */ - unsigned short bg_used_dirs_count; /* Directories count */ - unsigned short bg_pad; - unsigned long bg_reserved[0]; - unsigned long bg_reserved[1]; - unsigned long bg_reserved[2]; + __u32 bg_block_bitmap; /* Blocks bitmap block */ + __u32 bg_inode_bitmap; /* Inodes bitmap block */ + __u32 bg_inode_table; /* Inodes table block */ + __u16 bg_free_blocks_count; /* Free blocks count */ + __u16 bg_free_inodes_count; /* Free inodes count */ + __u16 bg_used_dirs_count; /* Directories count */ + __u16 bg_pad; + __u32 bg_reserved[0]; + __u32 bg_reserved[1]; + __u32 bg_reserved[2]; }; /* * Structure of an inode on the disk */ struct ext2_inode { - unsigned short i_mode; /* File mode */ - unsigned short i_uid; /* Owner Uid */ - unsigned long i_size; /* Size in bytes */ - unsigned long i_atime; /* Access time */ - unsigned long i_ctime; /* Creation time */ - unsigned long i_mtime; /* Modification time */ - unsigned long i_dtime; /* Deletion Time */ - unsigned short i_gid; /* Group Id */ - unsigned short i_links_count; /* Links count */ - unsigned long i_blocks; /* Blocks count */ - unsigned long i_flags; /* File flags */ - unsigned long l_i_reserved1; - unsigned long i_block[0]; /* Pointers to blocks */ - unsigned long i_block[1]; /* Pointers to blocks */ - unsigned long i_block[2]; /* Pointers to blocks */ - unsigned long i_block[3]; /* Pointers to blocks */ - unsigned long i_block[4]; /* Pointers to blocks */ - unsigned long i_block[5]; /* Pointers to blocks */ - unsigned long i_block[6]; /* Pointers to blocks */ - unsigned long i_block[7]; /* Pointers to blocks */ - unsigned long i_block[8]; /* Pointers to blocks */ - unsigned long i_block[9]; /* Pointers to blocks */ - unsigned long i_block[10]; /* Pointers to blocks */ - unsigned long i_block[11]; /* Pointers to blocks */ - unsigned long i_block[12]; /* Pointers to blocks */ - unsigned long i_block[13]; /* Pointers to blocks */ - unsigned long i_block[14]; /* Pointers to blocks */ - unsigned long i_version; /* File version (for NFS) */ - unsigned long i_file_acl; /* File ACL */ - unsigned long i_dir_acl; /* Directory ACL */ - unsigned long i_faddr; /* Fragment address */ - unsigned char l_i_frag; /* Fragment number */ - unsigned char l_i_fsize; /* Fragment size */ - unsigned short i_pad1; - unsigned long l_i_reserved2[0]; - unsigned long l_i_reserved2[1]; + __u16 i_mode; /* File mode */ + __u16 i_uid; /* Owner Uid */ + __u32 i_size; /* Size in bytes */ + __u32 i_atime; /* Access time */ + __u32 i_ctime; /* Creation time */ + __u32 i_mtime; /* Modification time */ + __u32 i_dtime; /* Deletion Time */ + __u16 i_gid; /* Group Id */ + __u16 i_links_count; /* Links count */ + __u32 i_blocks; /* Blocks count */ + __u32 i_flags; /* File flags */ + __u32 l_i_reserved1; + __u32 i_block[0]; /* Pointers to blocks */ + __u32 i_block[1]; /* Pointers to blocks */ + __u32 i_block[2]; /* Pointers to blocks */ + __u32 i_block[3]; /* Pointers to blocks */ + __u32 i_block[4]; /* Pointers to blocks */ + __u32 i_block[5]; /* Pointers to blocks */ + __u32 i_block[6]; /* Pointers to blocks */ + __u32 i_block[7]; /* Pointers to blocks */ + __u32 i_block[8]; /* Pointers to blocks */ + __u32 i_block[9]; /* Pointers to blocks */ + __u32 i_block[10]; /* Pointers to blocks */ + __u32 i_block[11]; /* Pointers to blocks */ + __u32 i_block[12]; /* Pointers to blocks */ + __u32 i_block[13]; /* Pointers to blocks */ + __u32 i_block[14]; /* Pointers to blocks */ + __u32 i_version; /* File version (for NFS) */ + __u32 i_file_acl; /* File ACL */ + __u32 i_dir_acl; /* Directory ACL */ + __u32 i_faddr; /* Fragment address */ + __u8 l_i_frag; /* Fragment number */ + __u8 l_i_fsize; /* Fragment size */ + __u16 i_pad1; + __u16 l_i_uid_high; /* these 2 fields */ + __u16 l_i_gid_high; /* were reserved2[0] */ + __u32 l_i_reserved2; }; /* * Structure of the super block */ struct ext2_super_block { - unsigned long s_inodes_count; /* Inodes count */ - unsigned long s_blocks_count; /* Blocks count */ - unsigned long s_r_blocks_count; /* Reserved blocks count */ - unsigned long s_free_blocks_count; /* Free blocks count */ - unsigned long s_free_inodes_count; /* Free inodes count */ - unsigned long s_first_data_block; /* First Data Block */ - unsigned long s_log_block_size; /* Block size */ - long s_log_frag_size; /* Fragment size */ - unsigned long s_blocks_per_group; /* # Blocks per group */ - unsigned long s_frags_per_group; /* # Fragments per group */ - unsigned long s_inodes_per_group; /* # Inodes per group */ - unsigned long s_mtime; /* Mount time */ - unsigned long s_wtime; /* Write time */ - unsigned short s_mnt_count; /* Mount count */ - short s_max_mnt_count; /* Maximal mount count */ - unsigned short s_magic; /* Magic signature */ - unsigned short s_state; /* File system state */ - unsigned short s_errors; /* Behaviour when detecting errors */ - unsigned short s_pad; - unsigned long s_lastcheck; /* time of last check */ - unsigned long s_checkinterval; /* max. time between checks */ - unsigned long s_creator_os; /* OS */ - unsigned long s_rev_level; /* Revision level */ - unsigned short s_def_resuid; - unsigned short s_deg_resgid; + __u32 s_inodes_count; /* Inodes count */ + __u32 s_blocks_count; /* Blocks count */ + __u32 s_r_blocks_count; /* Reserved blocks count */ + __u32 s_free_blocks_count; /* Free blocks count */ + __u32 s_free_inodes_count; /* Free inodes count */ + __u32 s_first_data_block; /* First Data Block */ + __u32 s_log_block_size; /* Block size */ + __s32 s_log_frag_size; /* Fragment size */ + __u32 s_blocks_per_group; /* # Blocks per group */ + __u32 s_frags_per_group; /* # Fragments per group */ + __u32 s_inodes_per_group; /* # Inodes per group */ + __u32 s_mtime; /* Mount time */ + __u32 s_wtime; /* Write time */ + __u16 s_mnt_count; /* Mount count */ + __s16 s_max_mnt_count; /* Maximal mount count */ + __u16 s_magic; /* Magic signature */ + __u16 s_state; /* File system state */ + __u16 s_errors; /* Behaviour when detecting errors */ + __u16 s_minor_rev_level; /* minor revision level */ + __u32 s_lastcheck; /* time of last check */ + __u32 s_checkinterval; /* max. time between checks */ + __u32 s_creator_os; /* OS */ + __u32 s_rev_level; /* Revision level */ + __u16 s_def_resuid; /* Default uid for reserved blocks */ + __u16 s_def_resgid; /* Default gid for reserved blocks */ + __u32 s_first_ino; /* First non-reserved inode */ + __u16 s_inode_size; /* size of inode structure */ + __u16 s_block_group_nr; /* block group # of this superblock */ + __u32 s_feature_compat; /* compatible feature set */ + __u32 s_feature_incompat; /* incompatible feature set */ + __u32 s_feature_ro_compat; /* readonly-compatible feature set */ + char[16] s_uuid; /* 128-bit uuid for volume */ + char[16] s_volume_name; /* volume name */ + char[64] s_last_mounted; /* directory where last mounted */ + __u32 s_algorithm_usage_bitmap; /* For compression */ + /* + * Performance hints. Directory preallocation should only + * happen if the EXT2_FEATURE_COMPAT_DIR_PREALLOC flag is on. + */ + __u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/ + __u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */ + __u16 s_padding1; + /* + * Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set. + */ + char[16] s_journal_uuid; /* uuid of journal superblock */ + __u32 s_journal_inum; /* inode number of journal file */ + __u32 s_journal_dev; /* device number of journal file */ + __u32 s_last_orphan; /* start of list of inodes to delete */ - unsigned long s_reserved[0]; /* Padding to the end of the block */ - unsigned long s_reserved[1]; - unsigned long s_reserved[2]; - unsigned long s_reserved[3]; - unsigned long s_reserved[4]; - unsigned long s_reserved[5]; - unsigned long s_reserved[6]; - unsigned long s_reserved[7]; - unsigned long s_reserved[8]; - unsigned long s_reserved[9]; - unsigned long s_reserved[10]; - unsigned long s_reserved[11]; - unsigned long s_reserved[12]; - unsigned long s_reserved[13]; - unsigned long s_reserved[14]; - unsigned long s_reserved[15]; - unsigned long s_reserved[16]; - unsigned long s_reserved[17]; - unsigned long s_reserved[18]; - unsigned long s_reserved[19]; - unsigned long s_reserved[20]; - unsigned long s_reserved[21]; - unsigned long s_reserved[22]; - unsigned long s_reserved[23]; - unsigned long s_reserved[24]; - unsigned long s_reserved[25]; - unsigned long s_reserved[26]; - unsigned long s_reserved[27]; - unsigned long s_reserved[28]; - unsigned long s_reserved[29]; - unsigned long s_reserved[30]; - unsigned long s_reserved[31]; - unsigned long s_reserved[32]; - unsigned long s_reserved[33]; - unsigned long s_reserved[34]; - unsigned long s_reserved[35]; - unsigned long s_reserved[36]; - unsigned long s_reserved[37]; - unsigned long s_reserved[38]; - unsigned long s_reserved[39]; - unsigned long s_reserved[40]; - unsigned long s_reserved[41]; - unsigned long s_reserved[42]; - unsigned long s_reserved[43]; - unsigned long s_reserved[44]; - unsigned long s_reserved[45]; - unsigned long s_reserved[46]; - unsigned long s_reserved[47]; - unsigned long s_reserved[48]; - unsigned long s_reserved[49]; - unsigned long s_reserved[50]; - unsigned long s_reserved[51]; - unsigned long s_reserved[52]; - unsigned long s_reserved[53]; - unsigned long s_reserved[54]; - unsigned long s_reserved[55]; - unsigned long s_reserved[56]; - unsigned long s_reserved[57]; - unsigned long s_reserved[58]; - unsigned long s_reserved[59]; - unsigned long s_reserved[60]; - unsigned long s_reserved[61]; - unsigned long s_reserved[62]; - unsigned long s_reserved[63]; - unsigned long s_reserved[64]; - unsigned long s_reserved[65]; - unsigned long s_reserved[66]; - unsigned long s_reserved[67]; - unsigned long s_reserved[68]; - unsigned long s_reserved[69]; - unsigned long s_reserved[70]; - unsigned long s_reserved[71]; - unsigned long s_reserved[72]; - unsigned long s_reserved[73]; - unsigned long s_reserved[74]; - unsigned long s_reserved[75]; - unsigned long s_reserved[76]; - unsigned long s_reserved[77]; - unsigned long s_reserved[78]; - unsigned long s_reserved[79]; - unsigned long s_reserved[80]; - unsigned long s_reserved[81]; - unsigned long s_reserved[82]; - unsigned long s_reserved[83]; - unsigned long s_reserved[84]; - unsigned long s_reserved[85]; - unsigned long s_reserved[86]; - unsigned long s_reserved[87]; - unsigned long s_reserved[88]; - unsigned long s_reserved[89]; - unsigned long s_reserved[90]; - unsigned long s_reserved[91]; - unsigned long s_reserved[92]; - unsigned long s_reserved[93]; - unsigned long s_reserved[94]; - unsigned long s_reserved[95]; - unsigned long s_reserved[96]; - unsigned long s_reserved[97]; - unsigned long s_reserved[98]; - unsigned long s_reserved[99]; - unsigned long s_reserved[100]; - unsigned long s_reserved[101]; - unsigned long s_reserved[102]; - unsigned long s_reserved[103]; - unsigned long s_reserved[104]; - unsigned long s_reserved[105]; - unsigned long s_reserved[106]; - unsigned long s_reserved[107]; - unsigned long s_reserved[108]; - unsigned long s_reserved[109]; - unsigned long s_reserved[110]; - unsigned long s_reserved[111]; - unsigned long s_reserved[112]; - unsigned long s_reserved[113]; - unsigned long s_reserved[114]; - unsigned long s_reserved[115]; - unsigned long s_reserved[116]; - unsigned long s_reserved[117]; - unsigned long s_reserved[118]; - unsigned long s_reserved[119]; - unsigned long s_reserved[120]; - unsigned long s_reserved[121]; - unsigned long s_reserved[122]; - unsigned long s_reserved[123]; - unsigned long s_reserved[124]; - unsigned long s_reserved[125]; - unsigned long s_reserved[126]; - unsigned long s_reserved[127]; - unsigned long s_reserved[128]; - unsigned long s_reserved[129]; - unsigned long s_reserved[130]; - unsigned long s_reserved[131]; - unsigned long s_reserved[132]; - unsigned long s_reserved[133]; - unsigned long s_reserved[134]; - unsigned long s_reserved[135]; - unsigned long s_reserved[136]; - unsigned long s_reserved[137]; - unsigned long s_reserved[138]; - unsigned long s_reserved[139]; - unsigned long s_reserved[140]; - unsigned long s_reserved[141]; - unsigned long s_reserved[142]; - unsigned long s_reserved[143]; - unsigned long s_reserved[144]; - unsigned long s_reserved[145]; - unsigned long s_reserved[146]; - unsigned long s_reserved[147]; - unsigned long s_reserved[148]; - unsigned long s_reserved[149]; - unsigned long s_reserved[150]; - unsigned long s_reserved[151]; - unsigned long s_reserved[152]; - unsigned long s_reserved[153]; - unsigned long s_reserved[154]; - unsigned long s_reserved[155]; - unsigned long s_reserved[156]; - unsigned long s_reserved[157]; - unsigned long s_reserved[158]; - unsigned long s_reserved[159]; - unsigned long s_reserved[160]; - unsigned long s_reserved[161]; - unsigned long s_reserved[162]; - unsigned long s_reserved[163]; - unsigned long s_reserved[164]; - unsigned long s_reserved[165]; - unsigned long s_reserved[166]; - unsigned long s_reserved[167]; - unsigned long s_reserved[168]; - unsigned long s_reserved[169]; - unsigned long s_reserved[170]; - unsigned long s_reserved[171]; - unsigned long s_reserved[172]; - unsigned long s_reserved[173]; - unsigned long s_reserved[174]; - unsigned long s_reserved[175]; - unsigned long s_reserved[176]; - unsigned long s_reserved[177]; - unsigned long s_reserved[178]; - unsigned long s_reserved[179]; - unsigned long s_reserved[180]; - unsigned long s_reserved[181]; - unsigned long s_reserved[182]; - unsigned long s_reserved[183]; - unsigned long s_reserved[184]; - unsigned long s_reserved[185]; - unsigned long s_reserved[186]; - unsigned long s_reserved[187]; - unsigned long s_reserved[188]; - unsigned long s_reserved[189]; - unsigned long s_reserved[190]; - unsigned long s_reserved[191]; - unsigned long s_reserved[192]; - unsigned long s_reserved[193]; - unsigned long s_reserved[194]; - unsigned long s_reserved[195]; - unsigned long s_reserved[196]; - unsigned long s_reserved[197]; - unsigned long s_reserved[198]; - unsigned long s_reserved[199]; - unsigned long s_reserved[200]; - unsigned long s_reserved[201]; - unsigned long s_reserved[202]; - unsigned long s_reserved[203]; - unsigned long s_reserved[204]; - unsigned long s_reserved[205]; - unsigned long s_reserved[206]; - unsigned long s_reserved[207]; - unsigned long s_reserved[208]; - unsigned long s_reserved[209]; - unsigned long s_reserved[210]; - unsigned long s_reserved[211]; - unsigned long s_reserved[212]; - unsigned long s_reserved[213]; - unsigned long s_reserved[214]; - unsigned long s_reserved[215]; - unsigned long s_reserved[216]; - unsigned long s_reserved[217]; - unsigned long s_reserved[218]; - unsigned long s_reserved[219]; - unsigned long s_reserved[220]; - unsigned long s_reserved[221]; - unsigned long s_reserved[222]; - unsigned long s_reserved[223]; - unsigned long s_reserved[224]; - unsigned long s_reserved[225]; - unsigned long s_reserved[226]; - unsigned long s_reserved[227]; - unsigned long s_reserved[228]; - unsigned long s_reserved[229]; - unsigned long s_reserved[230]; - unsigned long s_reserved[231]; - unsigned long s_reserved[232]; - unsigned long s_reserved[233]; - unsigned long s_reserved[234]; + + __u32 s_reserved[0]; /* Padding to the end of the block */ + __u32 s_reserved[1]; + __u32 s_reserved[2]; + __u32 s_reserved[3]; + __u32 s_reserved[4]; + __u32 s_reserved[5]; + __u32 s_reserved[6]; + __u32 s_reserved[7]; + __u32 s_reserved[8]; + __u32 s_reserved[9]; + __u32 s_reserved[10]; + __u32 s_reserved[11]; + __u32 s_reserved[12]; + __u32 s_reserved[13]; + __u32 s_reserved[14]; + __u32 s_reserved[15]; + __u32 s_reserved[16]; + __u32 s_reserved[17]; + __u32 s_reserved[18]; + __u32 s_reserved[19]; + __u32 s_reserved[20]; + __u32 s_reserved[21]; + __u32 s_reserved[22]; + __u32 s_reserved[23]; + __u32 s_reserved[24]; + __u32 s_reserved[25]; + __u32 s_reserved[26]; + __u32 s_reserved[27]; + __u32 s_reserved[28]; + __u32 s_reserved[29]; + __u32 s_reserved[30]; + __u32 s_reserved[31]; + __u32 s_reserved[32]; + __u32 s_reserved[33]; + __u32 s_reserved[34]; + __u32 s_reserved[35]; + __u32 s_reserved[36]; + __u32 s_reserved[37]; + __u32 s_reserved[38]; + __u32 s_reserved[39]; + __u32 s_reserved[40]; + __u32 s_reserved[41]; + __u32 s_reserved[42]; + __u32 s_reserved[43]; + __u32 s_reserved[44]; + __u32 s_reserved[45]; + __u32 s_reserved[46]; + __u32 s_reserved[47]; + __u32 s_reserved[48]; + __u32 s_reserved[49]; + __u32 s_reserved[50]; + __u32 s_reserved[51]; + __u32 s_reserved[52]; + __u32 s_reserved[53]; + __u32 s_reserved[54]; + __u32 s_reserved[55]; + __u32 s_reserved[56]; + __u32 s_reserved[57]; + __u32 s_reserved[58]; + __u32 s_reserved[59]; + __u32 s_reserved[60]; + __u32 s_reserved[61]; + __u32 s_reserved[62]; + __u32 s_reserved[63]; + __u32 s_reserved[64]; + __u32 s_reserved[65]; + __u32 s_reserved[66]; + __u32 s_reserved[67]; + __u32 s_reserved[68]; + __u32 s_reserved[69]; + __u32 s_reserved[70]; + __u32 s_reserved[71]; + __u32 s_reserved[72]; + __u32 s_reserved[73]; + __u32 s_reserved[74]; + __u32 s_reserved[75]; + __u32 s_reserved[76]; + __u32 s_reserved[77]; + __u32 s_reserved[78]; + __u32 s_reserved[79]; + __u32 s_reserved[80]; + __u32 s_reserved[81]; + __u32 s_reserved[82]; + __u32 s_reserved[83]; + __u32 s_reserved[84]; + __u32 s_reserved[85]; + __u32 s_reserved[86]; + __u32 s_reserved[87]; + __u32 s_reserved[88]; + __u32 s_reserved[89]; + __u32 s_reserved[90]; + __u32 s_reserved[91]; + __u32 s_reserved[92]; + __u32 s_reserved[93]; + __u32 s_reserved[94]; + __u32 s_reserved[95]; + __u32 s_reserved[96]; + __u32 s_reserved[97]; + __u32 s_reserved[98]; + __u32 s_reserved[99]; + __u32 s_reserved[100]; + __u32 s_reserved[101]; + __u32 s_reserved[102]; + __u32 s_reserved[103]; + __u32 s_reserved[104]; + __u32 s_reserved[105]; + __u32 s_reserved[106]; + __u32 s_reserved[107]; + __u32 s_reserved[108]; + __u32 s_reserved[109]; + __u32 s_reserved[110]; + __u32 s_reserved[111]; + __u32 s_reserved[112]; + __u32 s_reserved[113]; + __u32 s_reserved[114]; + __u32 s_reserved[115]; + __u32 s_reserved[116]; + __u32 s_reserved[117]; + __u32 s_reserved[118]; + __u32 s_reserved[119]; + __u32 s_reserved[120]; + __u32 s_reserved[121]; + __u32 s_reserved[122]; + __u32 s_reserved[123]; + __u32 s_reserved[124]; + __u32 s_reserved[125]; + __u32 s_reserved[126]; + __u32 s_reserved[127]; + __u32 s_reserved[128]; + __u32 s_reserved[129]; + __u32 s_reserved[130]; + __u32 s_reserved[131]; + __u32 s_reserved[132]; + __u32 s_reserved[133]; + __u32 s_reserved[134]; + __u32 s_reserved[135]; + __u32 s_reserved[136]; + __u32 s_reserved[137]; + __u32 s_reserved[138]; + __u32 s_reserved[139]; + __u32 s_reserved[140]; + __u32 s_reserved[141]; + __u32 s_reserved[142]; + __u32 s_reserved[143]; + __u32 s_reserved[144]; + __u32 s_reserved[145]; + __u32 s_reserved[146]; + __u32 s_reserved[147]; + __u32 s_reserved[148]; + __u32 s_reserved[149]; + __u32 s_reserved[150]; + __u32 s_reserved[151]; + __u32 s_reserved[152]; + __u32 s_reserved[153]; + __u32 s_reserved[154]; + __u32 s_reserved[155]; + __u32 s_reserved[156]; + __u32 s_reserved[157]; + __u32 s_reserved[158]; + __u32 s_reserved[159]; + __u32 s_reserved[160]; + __u32 s_reserved[161]; + __u32 s_reserved[162]; + __u32 s_reserved[163]; + __u32 s_reserved[164]; + __u32 s_reserved[165]; + __u32 s_reserved[166]; + __u32 s_reserved[167]; + __u32 s_reserved[168]; + __u32 s_reserved[169]; + __u32 s_reserved[170]; + __u32 s_reserved[171]; + __u32 s_reserved[172]; + __u32 s_reserved[173]; + __u32 s_reserved[174]; + __u32 s_reserved[175]; + __u32 s_reserved[176]; + __u32 s_reserved[177]; + __u32 s_reserved[178]; + __u32 s_reserved[179]; + __u32 s_reserved[180]; + __u32 s_reserved[181]; + __u32 s_reserved[182]; + __u32 s_reserved[183]; + __u32 s_reserved[184]; + __u32 s_reserved[185]; + __u32 s_reserved[186]; + __u32 s_reserved[187]; + __u32 s_reserved[188]; + __u32 s_reserved[189]; + __u32 s_reserved[190]; + __u32 s_reserved[191]; + __u32 s_reserved[192]; + __u32 s_reserved[193]; + __u32 s_reserved[194]; + __u32 s_reserved[195]; + __u32 s_reserved[196]; }; The following is actually not used, due to the variable length of the @@ -387,9 +375,9 @@ name field. EXT2ED handles directories through the type "dir" below. /* struct ext2_dir_entry { */ /* - unsigned long inode; /* Inode number */ - unsigned short rec_len; /* Directory entry length */ - unsigned short name_len; /* Name length */ + __u32 inode; /* Inode number */ + __u16 rec_len; /* Directory entry length */ + __u16 name_len; /* Name length */ char name[EXT2_NAME_LEN]; /* File name */ }; */ @@ -405,3 +393,584 @@ struct block_bitmap { struct inode_bitmap { }; + +struct ext2_dx_root_node { + __u32 dot_inode; + __u16 dot_rec_len; + __u8 dot_name_len; + __u8 dot_file_type; + char[4] dot_name; + __u32 dot_dot_inode; + __u16 dot_dot_rec_len; + __u8 dot_dot_name_len; + __u8 dot_dot_file_type; + char[4] dot_dot_name; + __u32 reserved_zero; + __u8 hash_version; /* 0 now, 1 at release */ + __u8 info_length; /* 8 */ + __u8 indirect_levels; + __u8 unused_flags; + __u16 limit; + __u16 count; + __u32 block[0]; + __u32 hash[1]; + __u32 block[1]; + __u32 hash[2]; + __u32 block[2]; + __u32 hash[3]; + __u32 block[3]; + __u32 hash[4]; + __u32 block[4]; + __u32 hash[5]; + __u32 block[5]; + __u32 hash[6]; + __u32 block[6]; + __u32 hash[7]; + __u32 block[7]; + __u32 hash[8]; + __u32 block[8]; + __u32 hash[9]; + __u32 block[9]; + __u32 hash[10]; + __u32 block[10]; + __u32 hash[11]; + __u32 block[11]; + __u32 hash[12]; + __u32 block[12]; + __u32 hash[13]; + __u32 block[13]; + __u32 hash[14]; + __u32 block[14]; + __u32 hash[15]; + __u32 block[15]; + __u32 hash[16]; + __u32 block[16]; + __u32 hash[17]; + __u32 block[17]; + __u32 hash[18]; + __u32 block[18]; + __u32 hash[19]; + __u32 block[19]; + __u32 hash[20]; + __u32 block[20]; + __u32 hash[21]; + __u32 block[21]; + __u32 hash[22]; + __u32 block[22]; + __u32 hash[23]; + __u32 block[23]; + __u32 hash[24]; + __u32 block[24]; + __u32 hash[25]; + __u32 block[25]; + __u32 hash[26]; + __u32 block[26]; + __u32 hash[27]; + __u32 block[27]; + __u32 hash[28]; + __u32 block[28]; + __u32 hash[29]; + __u32 block[29]; + __u32 hash[30]; + __u32 block[30]; + __u32 hash[31]; + __u32 block[31]; + __u32 hash[32]; + __u32 block[32]; + __u32 hash[33]; + __u32 block[33]; + __u32 hash[34]; + __u32 block[34]; + __u32 hash[35]; + __u32 block[35]; + __u32 hash[36]; + __u32 block[36]; + __u32 hash[37]; + __u32 block[37]; + __u32 hash[38]; + __u32 block[38]; + __u32 hash[39]; + __u32 block[39]; + __u32 hash[40]; + __u32 block[40]; + __u32 hash[41]; + __u32 block[41]; + __u32 hash[42]; + __u32 block[42]; + __u32 hash[43]; + __u32 block[43]; + __u32 hash[44]; + __u32 block[44]; + __u32 hash[45]; + __u32 block[45]; + __u32 hash[46]; + __u32 block[46]; + __u32 hash[47]; + __u32 block[47]; + __u32 hash[48]; + __u32 block[48]; + __u32 hash[49]; + __u32 block[49]; + __u32 hash[50]; + __u32 block[50]; + __u32 hash[51]; + __u32 block[51]; + __u32 hash[52]; + __u32 block[52]; + __u32 hash[53]; + __u32 block[53]; + __u32 hash[54]; + __u32 block[54]; + __u32 hash[55]; + __u32 block[55]; + __u32 hash[56]; + __u32 block[56]; + __u32 hash[57]; + __u32 block[57]; + __u32 hash[58]; + __u32 block[58]; + __u32 hash[59]; + __u32 block[59]; + __u32 hash[60]; + __u32 block[60]; + __u32 hash[61]; + __u32 block[61]; + __u32 hash[62]; + __u32 block[62]; + __u32 hash[63]; + __u32 block[63]; + __u32 hash[64]; + __u32 block[64]; + __u32 hash[65]; + __u32 block[65]; + __u32 hash[66]; + __u32 block[66]; + __u32 hash[67]; + __u32 block[67]; + __u32 hash[68]; + __u32 block[68]; + __u32 hash[69]; + __u32 block[69]; + __u32 hash[70]; + __u32 block[70]; + __u32 hash[71]; + __u32 block[71]; + __u32 hash[72]; + __u32 block[72]; + __u32 hash[73]; + __u32 block[73]; + __u32 hash[74]; + __u32 block[74]; + __u32 hash[75]; + __u32 block[75]; + __u32 hash[76]; + __u32 block[76]; + __u32 hash[77]; + __u32 block[77]; + __u32 hash[78]; + __u32 block[78]; + __u32 hash[79]; + __u32 block[79]; + __u32 hash[80]; + __u32 block[80]; + __u32 hash[81]; + __u32 block[81]; + __u32 hash[82]; + __u32 block[82]; + __u32 hash[83]; + __u32 block[83]; + __u32 hash[84]; + __u32 block[84]; + __u32 hash[85]; + __u32 block[85]; + __u32 hash[86]; + __u32 block[86]; + __u32 hash[87]; + __u32 block[87]; + __u32 hash[88]; + __u32 block[88]; + __u32 hash[89]; + __u32 block[89]; + __u32 hash[80]; + __u32 block[80]; + __u32 hash[81]; + __u32 block[81]; + __u32 hash[82]; + __u32 block[82]; + __u32 hash[83]; + __u32 block[83]; + __u32 hash[84]; + __u32 block[84]; + __u32 hash[85]; + __u32 block[85]; + __u32 hash[86]; + __u32 block[86]; + __u32 hash[87]; + __u32 block[87]; + __u32 hash[88]; + __u32 block[88]; + __u32 hash[89]; + __u32 block[89]; + __u32 hash[90]; + __u32 block[90]; + __u32 hash[91]; + __u32 block[91]; + __u32 hash[92]; + __u32 block[92]; + __u32 hash[93]; + __u32 block[93]; + __u32 hash[94]; + __u32 block[94]; + __u32 hash[95]; + __u32 block[95]; + __u32 hash[96]; + __u32 block[96]; + __u32 hash[97]; + __u32 block[97]; + __u32 hash[98]; + __u32 block[98]; + __u32 hash[99]; + __u32 block[99]; + __u32 hash[100]; + __u32 block[100]; + __u32 hash[101]; + __u32 block[101]; + __u32 hash[102]; + __u32 block[102]; + __u32 hash[103]; + __u32 block[103]; + __u32 hash[104]; + __u32 block[104]; + __u32 hash[105]; + __u32 block[105]; + __u32 hash[106]; + __u32 block[106]; + __u32 hash[107]; + __u32 block[107]; + __u32 hash[108]; + __u32 block[108]; + __u32 hash[109]; + __u32 block[109]; + __u32 hash[110]; + __u32 block[110]; + __u32 hash[111]; + __u32 block[111]; + __u32 hash[112]; + __u32 block[112]; + __u32 hash[113]; + __u32 block[113]; + __u32 hash[114]; + __u32 block[114]; + __u32 hash[115]; + __u32 block[115]; + __u32 hash[116]; + __u32 block[116]; + __u32 hash[117]; + __u32 block[117]; + __u32 hash[118]; + __u32 block[118]; + __u32 hash[119]; + __u32 block[119]; + __u32 hash[120]; + __u32 block[120]; + __u32 hash[121]; + __u32 block[121]; + __u32 hash[122]; + __u32 block[122]; + __u32 hash[123]; + __u32 block[123]; + __u32 hash[124]; + __u32 block[124]; + __u32 hash[125]; + __u32 block[125]; + __u32 hash[126]; + __u32 block[126]; + __u32 hash[127]; + __u32 block[127]; +}; + +struct ext2_dx_int_node { + __u32 fake_inode; + __u16 fake_rec_len; + __u8 fake_name_len; + __u8 fake_file_type; + __u16 limit; + __u16 count; + __u32 block[0]; + __u32 hash[1]; + __u32 block[1]; + __u32 hash[2]; + __u32 block[2]; + __u32 hash[3]; + __u32 block[3]; + __u32 hash[4]; + __u32 block[4]; + __u32 hash[5]; + __u32 block[5]; + __u32 hash[6]; + __u32 block[6]; + __u32 hash[7]; + __u32 block[7]; + __u32 hash[8]; + __u32 block[8]; + __u32 hash[9]; + __u32 block[9]; + __u32 hash[10]; + __u32 block[10]; + __u32 hash[11]; + __u32 block[11]; + __u32 hash[12]; + __u32 block[12]; + __u32 hash[13]; + __u32 block[13]; + __u32 hash[14]; + __u32 block[14]; + __u32 hash[15]; + __u32 block[15]; + __u32 hash[16]; + __u32 block[16]; + __u32 hash[17]; + __u32 block[17]; + __u32 hash[18]; + __u32 block[18]; + __u32 hash[19]; + __u32 block[19]; + __u32 hash[20]; + __u32 block[20]; + __u32 hash[21]; + __u32 block[21]; + __u32 hash[22]; + __u32 block[22]; + __u32 hash[23]; + __u32 block[23]; + __u32 hash[24]; + __u32 block[24]; + __u32 hash[25]; + __u32 block[25]; + __u32 hash[26]; + __u32 block[26]; + __u32 hash[27]; + __u32 block[27]; + __u32 hash[28]; + __u32 block[28]; + __u32 hash[29]; + __u32 block[29]; + __u32 hash[30]; + __u32 block[30]; + __u32 hash[31]; + __u32 block[31]; + __u32 hash[32]; + __u32 block[32]; + __u32 hash[33]; + __u32 block[33]; + __u32 hash[34]; + __u32 block[34]; + __u32 hash[35]; + __u32 block[35]; + __u32 hash[36]; + __u32 block[36]; + __u32 hash[37]; + __u32 block[37]; + __u32 hash[38]; + __u32 block[38]; + __u32 hash[39]; + __u32 block[39]; + __u32 hash[40]; + __u32 block[40]; + __u32 hash[41]; + __u32 block[41]; + __u32 hash[42]; + __u32 block[42]; + __u32 hash[43]; + __u32 block[43]; + __u32 hash[44]; + __u32 block[44]; + __u32 hash[45]; + __u32 block[45]; + __u32 hash[46]; + __u32 block[46]; + __u32 hash[47]; + __u32 block[47]; + __u32 hash[48]; + __u32 block[48]; + __u32 hash[49]; + __u32 block[49]; + __u32 hash[50]; + __u32 block[50]; + __u32 hash[51]; + __u32 block[51]; + __u32 hash[52]; + __u32 block[52]; + __u32 hash[53]; + __u32 block[53]; + __u32 hash[54]; + __u32 block[54]; + __u32 hash[55]; + __u32 block[55]; + __u32 hash[56]; + __u32 block[56]; + __u32 hash[57]; + __u32 block[57]; + __u32 hash[58]; + __u32 block[58]; + __u32 hash[59]; + __u32 block[59]; + __u32 hash[60]; + __u32 block[60]; + __u32 hash[61]; + __u32 block[61]; + __u32 hash[62]; + __u32 block[62]; + __u32 hash[63]; + __u32 block[63]; + __u32 hash[64]; + __u32 block[64]; + __u32 hash[65]; + __u32 block[65]; + __u32 hash[66]; + __u32 block[66]; + __u32 hash[67]; + __u32 block[67]; + __u32 hash[68]; + __u32 block[68]; + __u32 hash[69]; + __u32 block[69]; + __u32 hash[70]; + __u32 block[70]; + __u32 hash[71]; + __u32 block[71]; + __u32 hash[72]; + __u32 block[72]; + __u32 hash[73]; + __u32 block[73]; + __u32 hash[74]; + __u32 block[74]; + __u32 hash[75]; + __u32 block[75]; + __u32 hash[76]; + __u32 block[76]; + __u32 hash[77]; + __u32 block[77]; + __u32 hash[78]; + __u32 block[78]; + __u32 hash[79]; + __u32 block[79]; + __u32 hash[80]; + __u32 block[80]; + __u32 hash[81]; + __u32 block[81]; + __u32 hash[82]; + __u32 block[82]; + __u32 hash[83]; + __u32 block[83]; + __u32 hash[84]; + __u32 block[84]; + __u32 hash[85]; + __u32 block[85]; + __u32 hash[86]; + __u32 block[86]; + __u32 hash[87]; + __u32 block[87]; + __u32 hash[88]; + __u32 block[88]; + __u32 hash[89]; + __u32 block[89]; + __u32 hash[80]; + __u32 block[80]; + __u32 hash[81]; + __u32 block[81]; + __u32 hash[82]; + __u32 block[82]; + __u32 hash[83]; + __u32 block[83]; + __u32 hash[84]; + __u32 block[84]; + __u32 hash[85]; + __u32 block[85]; + __u32 hash[86]; + __u32 block[86]; + __u32 hash[87]; + __u32 block[87]; + __u32 hash[88]; + __u32 block[88]; + __u32 hash[89]; + __u32 block[89]; + __u32 hash[90]; + __u32 block[90]; + __u32 hash[91]; + __u32 block[91]; + __u32 hash[92]; + __u32 block[92]; + __u32 hash[93]; + __u32 block[93]; + __u32 hash[94]; + __u32 block[94]; + __u32 hash[95]; + __u32 block[95]; + __u32 hash[96]; + __u32 block[96]; + __u32 hash[97]; + __u32 block[97]; + __u32 hash[98]; + __u32 block[98]; + __u32 hash[99]; + __u32 block[99]; + __u32 hash[100]; + __u32 block[100]; + __u32 hash[101]; + __u32 block[101]; + __u32 hash[102]; + __u32 block[102]; + __u32 hash[103]; + __u32 block[103]; + __u32 hash[104]; + __u32 block[104]; + __u32 hash[105]; + __u32 block[105]; + __u32 hash[106]; + __u32 block[106]; + __u32 hash[107]; + __u32 block[107]; + __u32 hash[108]; + __u32 block[108]; + __u32 hash[109]; + __u32 block[109]; + __u32 hash[110]; + __u32 block[110]; + __u32 hash[111]; + __u32 block[111]; + __u32 hash[112]; + __u32 block[112]; + __u32 hash[113]; + __u32 block[113]; + __u32 hash[114]; + __u32 block[114]; + __u32 hash[115]; + __u32 block[115]; + __u32 hash[116]; + __u32 block[116]; + __u32 hash[117]; + __u32 block[117]; + __u32 hash[118]; + __u32 block[118]; + __u32 hash[119]; + __u32 block[119]; + __u32 hash[120]; + __u32 block[120]; + __u32 hash[121]; + __u32 block[121]; + __u32 hash[122]; + __u32 block[122]; + __u32 hash[123]; + __u32 block[123]; + __u32 hash[124]; + __u32 block[124]; + __u32 hash[125]; + __u32 block[125]; + __u32 hash[126]; + __u32 block[126]; + __u32 hash[127]; + __u32 block[127]; +}; + + diff --git a/ext2ed/ext2ed.h b/ext2ed/ext2ed.h index 1e3af18a..3b165e7b 100644 --- a/ext2ed/ext2ed.h +++ b/ext2ed/ext2ed.h @@ -93,12 +93,17 @@ struct struct_descriptor { /* Describes an object */ unsigned char name [60]; unsigned short fields_num; unsigned char field_names [MAX_FIELDS][80]; + unsigned char field_types [MAX_FIELDS]; unsigned short field_lengths [MAX_FIELDS]; unsigned short field_positions [MAX_FIELDS]; struct struct_commands type_commands; struct struct_descriptor *prev,*next; }; +#define FIELD_TYPE_INT 1 +#define FIELD_TYPE_UINT 2 +#define FIELD_TYPE_CHAR 3 + struct struct_type_data { /* The object's data is usually here */ long offset_in_block; diff --git a/ext2ed/general_com.c b/ext2ed/general_com.c index 21fd30bb..efcd3e23 100644 --- a/ext2ed/general_com.c +++ b/ext2ed/general_com.c @@ -19,6 +19,7 @@ Copyright (C) 1995 Gadi Oxman #include #include "ext2ed.h" +#include "../version.h" void help (char *command_line) @@ -85,7 +86,7 @@ void help (char *command_line) wprintw (show_pad,"\n\n");max_line+=2; - wprintw (show_pad,"EXT2ED ver %d.%d (%s)\n",version_major,version_minor,revision_date); + wprintw (show_pad,"EXT2ED ver %s (%s)\n",E2FSPROGS_VERSION, E2FSPROGS_DATE); wprintw (show_pad,"Copyright (C) 1995 Gadi Oxman\n"); wprintw (show_pad,"Reviewed 2001 Christian Bac\n"); wprintw (show_pad,"EXT2ED is hereby placed under the terms of the GNU General Public License.\n\n"); @@ -275,13 +276,97 @@ void set_offset (char *command_line) type_data.offset_in_block=0; } +void set_int(short len, void *ptr, char *name, char *value) +{ + char *char_ptr; + short *short_ptr; + long *long_ptr; + long v; + char *tmp; + + v = strtol(value, &tmp, 0); + if (*tmp) { + wprintw( command_win, "Bad value - %s\n", value); + return; + } + switch (len) { + case 1: + char_ptr = (char *) ptr; + *char_ptr = v; + break; + case 2: + short_ptr = (short *) ptr; + *short_ptr = v; + break; + case 4: + long_ptr = (long *) ptr; + *long_ptr = v; + break; + default: + wprintw (command_win, + "set_int: unsupported length: %d\n", len); + return; + } + wprintw (command_win, "Variable %s set to %s\n", + name, value); +} + +void set_uint(short len, void *ptr, char *name, char *value) +{ + unsigned char *char_ptr; + unsigned short *short_ptr; + unsigned long *long_ptr; + unsigned long v; + char *tmp; + + v = strtoul(value, &tmp, 0); + if (*tmp) { + wprintw( command_win, "Bad value - %s\n", value); + return; + } + switch (len) { + case 1: + char_ptr = (unsigned char *) ptr; + *char_ptr = v; + break; + case 2: + short_ptr = (unsigned short *) ptr; + *short_ptr = v; + break; + case 4: + long_ptr = (unsigned long *) ptr; + *long_ptr = v; + break; + default: + wprintw (command_win, + "set_uint: unsupported length: %d\n", len); + return; + } + wprintw (command_win, "Variable %s set to %s\n", + name, value); +} + +void set_char(short len, void *ptr, char *name, char *value) +{ + if (strlen(value)+1 > len) { + wprintw( command_win, "Value %s too big for field\n", + name, len); + return; + } + memset(ptr, 0, len); + strcpy((char *) ptr, value); + wprintw (command_win, "Variable %s set to %s\n", + name, value); +} + + void set (char *command_line) { unsigned short *int_ptr; unsigned char *char_ptr; unsigned long *long_ptr,offset=0; - int i,found=0; + int i,len, found=0; char *ptr,buffer [80],variable [80],value [80]; if (device_handle==NULL) { @@ -315,24 +400,24 @@ void set (char *command_line) if (strcmp (current_type->field_names [i],variable)==0) { found=1; ptr=type_data.u.buffer+offset; - switch (current_type->field_lengths [i]) { - case 1: - char_ptr=(unsigned char *) ptr; - *char_ptr=(char) atoi (value); - wprintw (command_win,"Variable %s set to %u\n",variable,*char_ptr);refresh_command_win (); - break; - case 2: - int_ptr=(unsigned short *) ptr; - *int_ptr=atoi (value); - wprintw (command_win,"Variable %s set to %u\n",variable,*int_ptr);refresh_command_win (); - break; - - case 4: - long_ptr=(unsigned long *) ptr; - *long_ptr=atol (value); - wprintw (command_win,"Variable %s set to %lu\n",variable,*long_ptr);refresh_command_win (); - break; + len = current_type->field_lengths [i]; + switch (current_type->field_types [i]) { + case FIELD_TYPE_INT: + set_int(len, ptr, variable, value); + break; + case FIELD_TYPE_UINT: + set_uint(len, ptr, variable, value); + break; + case FIELD_TYPE_CHAR: + set_char(len, ptr, variable, value); + break; + default: + wprintw (command_win, + "set: unhandled type %d\n", + current_type->field_types [i]); + break; } + refresh_command_win (); } offset+=current_type->field_lengths [i]; } @@ -446,11 +531,95 @@ void set_type (char *command_line) } } +void show_int(short len, void *ptr) +{ + long temp; + char *format; + switch (len) { + case 1: + temp = *((char *) ptr); + format = "%3d (0x%02x)\n"; + break; + case 2: + temp = *((short *) ptr); + format = "%d (0x%x)\n"; + break; + case 4: + temp = *((long *) ptr); + format = "%d\n"; + break; + default: + wprintw (show_pad, "unimplemented\n"); + return; + } + wprintw(show_pad, format, temp, temp); +} + +void show_uint(short len, void *ptr) +{ + unsigned long temp; + char *format; + + switch (len) { + case 1: + temp = *((unsigned char *) ptr); + temp = temp & 0xFF; + format = "%3u (0x%02x)\n"; + break; + case 2: + temp = *((unsigned short *) ptr); + temp = temp & 0xFFFF; + format = "%u (0x%x)\n"; + break; + case 4: + temp = (unsigned long) *((unsigned long *) ptr); + format = "%u\n"; + break; + default: + wprintw (show_pad, "unimplemented\n"); + return; + } + wprintw(show_pad, format, temp, temp); +} + +void show_char(short len, void *ptr) +{ + unsigned char *cp = (unsigned char *) ptr; + unsigned char ch; + int i,j; + + wprintw(show_pad, "\""); + + for (i=0; i < len; i++) { + ch = *cp++; + if (ch == 0) { + for (j=i+1; j < len; j++) + if (cp[j-i]) + break; + if (j == len) + break; + } + if (ch > 128) { + wprintw(show_pad, "M-"); + ch -= 128; + } + if ((ch < 32) || (ch == 0x7f)) { + wprintw(show_pad, "^"); + ch ^= 0x40; /* ^@, ^A, ^B; ^? for DEL */ + } + wprintw(show_pad, "%c", ch); + } + + wprintw(show_pad, "\"\n"); +} + + + void show (char *command_line) { - unsigned int i,l,temp_int; + unsigned int i,l,len,temp_int; unsigned long offset=0,temp_long; unsigned char temp_char,*ch_ptr; void *ptr; @@ -502,29 +671,23 @@ void show (char *command_line) for (i=0;ifields_num;i++) { wprintw (show_pad,"%-20s = ",current_type->field_names [i]); ptr=type_data.u.buffer+offset; - switch (current_type->field_lengths [i]) { - case 1: - temp_char=*((unsigned char *) ptr); - wprintw (show_pad,"%3u (0x%02x",temp_char,temp_char); - if (temp_char>=' ' && temp_char<='z') - wprintw (show_pad," , %c)\n",temp_char); - else - wprintw (show_pad,")\n"); - - offset ++;l++; - break; - case 2: - temp_int=*((unsigned short *) ptr); - wprintw (show_pad,"%u (0x%x)\n",temp_int,temp_int); - offset +=2;l++; - break; - case 4: - temp_long=*((unsigned long *) ptr); - wprintw (show_pad,"%lu\n",temp_long); - offset +=4;l++; - break; + len = current_type->field_lengths[i]; + switch (current_type->field_types[i]) { + case FIELD_TYPE_INT: + show_int(len, ptr); + break; + case FIELD_TYPE_UINT: + show_uint(len, ptr); + break; + case FIELD_TYPE_CHAR: + show_char(len, ptr); + break; + default: + wprintw (show_pad, "unimplemented\n"); + break; } -/* offset+=current_type->field_lengths [i]; */ + offset+=len; + l++; } current_type->length=offset; show_pad_info.max_line=l-1; diff --git a/ext2ed/init.c b/ext2ed/init.c index 1beb851e..6ee1d372 100644 --- a/ext2ed/init.c +++ b/ext2ed/init.c @@ -185,57 +185,74 @@ struct struct_descriptor *add_new_descriptor (char *name) { struct struct_descriptor *ptr; + ptr = malloc (sizeof (struct struct_descriptor)); + if (ptr == NULL) { + printf ("Error - Can not allocate memory - Quitting\n"); + exit (1); + } + memset(ptr, 0, sizeof(struct struct_descriptor)); + ptr->prev = ptr->next = NULL; + strcpy (ptr->name,name); + ptr->length=0; + ptr->fields_num=0; if (first_type==NULL) { - first_type=last_type=ptr=(struct struct_descriptor *) malloc (sizeof (struct struct_descriptor)); - if (ptr==NULL) { - printf ("Error - Can not allocate memory - Quitting\n"); - exit (1); - } - ptr->prev=ptr->next=NULL; - strcpy (ptr->name,name); - ptr->length=0; - ptr->fields_num=0; - ptr->type_commands.last_command=-1; - fill_type_commands (ptr); - } - else { - ptr=(struct struct_descriptor *) malloc (sizeof (struct struct_descriptor)); - if (ptr==NULL) { - printf ("Error - Can not allocate memory - Quitting\n"); - exit (1); - } - ptr->prev=last_type;last_type->next=ptr;last_type=ptr; - strcpy (ptr->name,name); - ptr->length=0; - ptr->fields_num=0; - ptr->type_commands.last_command=-1; - fill_type_commands (ptr); + first_type = last_type = ptr; + } else { + ptr->prev = last_type; last_type->next = ptr; last_type=ptr; } + ptr->type_commands.last_command=-1; + fill_type_commands (ptr); return (ptr); } +struct type_table { + char *name; + int field_type; + int len; +}; + +struct type_table type_table[] = { + { "long", FIELD_TYPE_INT, 4 }, + { "short", FIELD_TYPE_INT, 2 }, + { "char", FIELD_TYPE_CHAR, 1 }, + { "__u32", FIELD_TYPE_UINT, 4 }, + { "__s32", FIELD_TYPE_INT, 4 }, + { "__u16", FIELD_TYPE_UINT, 2 }, + { "__s16", FIELD_TYPE_INT, 2 }, + { "__u8", FIELD_TYPE_UINT, 1 }, + { "__s8", FIELD_TYPE_INT, 1 }, + { 0, 0, 0 } +}; + void add_new_variable (struct struct_descriptor *ptr,char *v_type,char *v_name) { - short len=1; + short len=1; + char field_type=FIELD_TYPE_INT; + struct type_table *p; strcpy (ptr->field_names [ptr->fields_num],v_name); ptr->field_positions [ptr->fields_num]=ptr->length; - - if (strcasecmp (v_type,"long")==0) len=4; - if (strcasecmp (v_type,"__u32")==0) len=4; - if (strcasecmp (v_type,"__s32")==0) len=4; - if (strcasecmp (v_type,"__u16")==0) len=2; - if (strcasecmp (v_type,"__s16")==0) len=2; - if (strcasecmp (v_type,"short")==0) len=2; - if (strcasecmp (v_type,"int")==0) len=2; + for (p = type_table; p->name; p++) { + if (strcmp(v_type, p->name) == 0) { + len = p->len; + field_type = p->field_type; + break; + } + } + if (p->name == 0) { + if (strncmp(v_type, "char[", 5) == 0) { + len = atoi(v_type+5); + field_type = FIELD_TYPE_CHAR; + } else { + printf("Unknown type %s for field %s\n", v_type, v_name); + exit(1); + } + } - if (strcasecmp (v_type,"__u8")==0) len=1; - if (strcasecmp (v_type,"__s8")==0) len=1; - if (strcasecmp (v_type,"char")==0) len=1; - - ptr->field_lengths [ptr->fields_num]=len; + ptr->field_lengths [ptr->fields_num] = len; + ptr->field_types [ptr->fields_num] = field_type; ptr->length+=len; ptr->fields_num++; diff --git a/ext2ed/main.c b/ext2ed/main.c index 367c4eae..5ea116bd 100644 --- a/ext2ed/main.c +++ b/ext2ed/main.c @@ -77,8 +77,6 @@ struct struct_inode_bitmap_info inode_bitmap_info; /* Used by inodebitmap_com.c int redraw_request=0; /* Is set by a signal handler to handle terminal */ /* screen size change. */ -int version_major=0,version_minor=2; -char revision_date [80]="April 5 2001"; char email_address [80]="tgud@tochnapc2.technion.ac.il"; int main (void) diff --git a/ext2ed/win.c b/ext2ed/win.c index 76ba1977..55fa23c3 100644 --- a/ext2ed/win.c +++ b/ext2ed/win.c @@ -24,6 +24,7 @@ Copyright (C) 1995 Gadi Oxman #include #include "ext2ed.h" +#include "../version.h" struct struct_pad_info show_pad_info; WINDOW *title_win,*show_win,*command_win,*show_pad; @@ -60,7 +61,7 @@ void init_windows (void) } box (title_win,0,0); - sprintf (title_string,"EXT2ED - Extended-2 File System editor ver %d.%d (%s)",version_major,version_minor,revision_date); + sprintf (title_string,"EXT2ED - Extended-2 File System editor ver %s (%s)", E2FSPROGS_VERSION, E2FSPROGS_DATE); wmove (title_win,TITLE_WIN_LINES/2,(COLS-strlen (title_string))/2); wprintw (title_win,title_string);