119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * debugfs.c --- a program which allows you to attach an ext2fs 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * filesystem and play with it. 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1993 Theodore Ts'o. This file may be redistributed 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * under the terms of the GNU Public License. 73984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Modifications by Robert Sanders <gt8134b@prism.gatech.edu> 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h> 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdlib.h> 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <ctype.h> 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h> 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <time.h> 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_GETOPT_H 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <getopt.h> 193984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#else 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern int optind; 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern char *optarg; 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_ERRNO_H 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <errno.h> 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h> 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h> 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/stat.h> 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "et/com_err.h" 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ss/ss.h" 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "debugfs.h" 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "uuid/uuid.h" 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2p/e2p.h" 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <ext2fs/ext2_ext_attr.h> 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "../version.h" 393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#include "jfs_user.h" 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern ss_request_table debug_cmds; 423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtss_request_table *extra_cmds; 433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtconst char *debug_prog_name; 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectext2_filsys current_fs = NULL; 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectext2_ino_t root, cwd; 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void open_filesystem(char *device, int open_flags, blk_t superblock, 493984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt blk_t blocksize, int catastrophic, 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *data_filename) 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int retval; 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project io_channel data_io = 0; 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (superblock != 0 && blocksize == 0) { 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(device, 0, "if you specify the superblock, you must also specify the block size"); 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project current_fs = NULL; 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (data_filename) { 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((open_flags & EXT2_FLAG_IMAGE_FILE) == 0) { 633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err(device, 0, 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "The -d option is only valid when reading an e2image file"); 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project current_fs = NULL; 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = unix_io_manager->open(data_filename, 0, &data_io); 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(data_filename, 0, "while opening data source"); 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project current_fs = NULL; 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (catastrophic && (open_flags & EXT2_FLAG_RW)) { 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(device, 0, 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "opening read-only because of catastrophic mode"); 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project open_flags &= ~EXT2_FLAG_RW; 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 813984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_open(device, open_flags, superblock, blocksize, 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unix_io_manager, ¤t_fs); 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(device, retval, "while opening filesystem"); 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project current_fs = NULL; 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (catastrophic) 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(device, 0, "catastrophic mode - not reading inode or group bitmaps"); 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else { 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_read_inode_bitmap(current_fs); 9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(device, retval, "while reading inode bitmap"); 9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_read_block_bitmap(current_fs); 9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(device, retval, "while reading block bitmap"); 10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (data_io) { 10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_set_data_io(current_fs, data_io); 10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 1083984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err(device, retval, 10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "while setting data source"); 11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project root = cwd = EXT2_ROOT_INO; 11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrout: 11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_close(current_fs); 11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(device, retval, "while trying to close filesystem"); 12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project current_fs = NULL; 12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_open_filesys(int argc, char **argv) 12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int c, err; 12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int catastrophic = 0; 12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t superblock = 0; 12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t blocksize = 0; 13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int open_flags = EXT2_FLAG_SOFTSUPP_FEATURES; 13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *data_filename = 0; 1323984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project reset_getopt(); 1348558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall while ((c = getopt (argc, argv, "iwfecb:s:d:D")) != EOF) { 13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project switch (c) { 13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'i': 13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project open_flags |= EXT2_FLAG_IMAGE_FILE; 13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'w': 14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project open_flags |= EXT2_FLAG_RW; 14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'f': 14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project open_flags |= EXT2_FLAG_FORCE; 14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'e': 14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project open_flags |= EXT2_FLAG_EXCLUSIVE; 14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'c': 14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project catastrophic = 1; 15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'd': 15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project data_filename = optarg; 15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 1548558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall case 'D': 1558558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall open_flags |= EXT2_FLAG_DIRECT_IO; 1568558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall break; 15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'b': 15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blocksize = parse_ulong(optarg, argv[0], 15919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "block size", &err); 16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (err) 16119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 16219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 16319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 's': 16419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project superblock = parse_ulong(optarg, argv[0], 16519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "superblock number", &err); 16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (err) 16719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 16819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 16919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project default: 17019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto print_usage; 17119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 17219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 17319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (optind != argc-1) { 17419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto print_usage; 17519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 17619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (check_fs_not_open(argv[0])) 17719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 17819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project open_filesystem(argv[optind], open_flags, 1793984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt superblock, blocksize, catastrophic, 18019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project data_filename); 18119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 18219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 18319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectprint_usage: 18419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "%s: Usage: open [-s superblock] [-b blocksize] " 18519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "[-c] [-w] <device>\n", argv[0]); 18619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 18719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 18819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_lcd(int argc, char **argv) 18919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 19019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (argc != 2) { 19119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Usage: %s %s", argv[0], "<native dir>"); 19219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 19319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 19419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 19519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (chdir(argv[1]) == -1) { 19619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], errno, 19719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "while trying to change native directory to %s", 19819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project argv[1]); 19919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 20019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 20119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 20219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 20319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void close_filesystem(NOARGS) 20419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 20519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int retval; 2063984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 20719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (current_fs->flags & EXT2_FLAG_IB_DIRTY) { 20819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_write_inode_bitmap(current_fs); 20919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 21019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ext2fs_write_inode_bitmap", retval, 0); 21119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 21219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (current_fs->flags & EXT2_FLAG_BB_DIRTY) { 21319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_write_block_bitmap(current_fs); 21419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 21519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ext2fs_write_block_bitmap", retval, 0); 21619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 21719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_close(current_fs); 21819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 21919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ext2fs_close", retval, 0); 22019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project current_fs = NULL; 22119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 22219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 22319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 22419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_close_filesys(int argc, char **argv) 22519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 2263984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int c; 2273984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 2283984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (check_fs_open(argv[0])) 22919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 2303984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 2313984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt reset_getopt(); 2323984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt while ((c = getopt (argc, argv, "a")) != EOF) { 2333984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt switch (c) { 2343984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt case 'a': 2353984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt current_fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY; 2363984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt break; 2373984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt default: 2383984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt goto print_usage; 2393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 2403984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 2413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 2423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (argc > optind) { 2433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt print_usage: 2443984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err(0, 0, "Usage: close_filesys [-a]"); 2453984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return; 2463984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 2473984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 24819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close_filesystem(); 24919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 25019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 25119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_init_filesys(int argc, char **argv) 25219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 25319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_super_block param; 25419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 25519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int err; 2563984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 25719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_args_process(argc, argv, 3, 3, "initialize", 25819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "<device> <blocksize>", CHECK_FS_NOTOPEN)) 25919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 26019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 26119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memset(¶m, 0, sizeof(struct ext2_super_block)); 26219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project param.s_blocks_count = parse_ulong(argv[2], argv[0], 26319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "blocks count", &err); 26419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (err) 26519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 26619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_initialize(argv[1], 0, ¶m, 26719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unix_io_manager, ¤t_fs); 26819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 26919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[1], retval, "while initializing filesystem"); 27019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project current_fs = NULL; 27119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 27219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 27319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project root = cwd = EXT2_ROOT_INO; 27419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 27519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 27619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 27719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void print_features(struct ext2_super_block * s, FILE *f) 27819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 27919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int i, j, printed=0; 28019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __u32 *mask = &s->s_feature_compat, m; 28119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 28219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs("Filesystem features:", f); 28319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i=0; i <3; i++,mask++) { 28419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (j=0,m=1; j < 32; j++, m<<=1) { 28519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*mask & m) { 28619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(f, " %s", e2p_feature2string(i, m)); 28719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printed++; 28819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 28919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 29019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 29119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (printed == 0) 29219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs("(none)", f); 29319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs("\n", f); 29419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 29519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 29619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void print_bg_opts(struct ext2_group_desc *gdp, int mask, 29719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *str, int *first, FILE *f) 29819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 29919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (gdp->bg_flags & mask) { 30019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*first) { 30119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(" [", f); 30219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *first = 0; 30319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else 30419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(", ", f); 30519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(str, f); 30619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 30719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 30819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 30919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_show_super_stats(int argc, char *argv[]) 31019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 31119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dgrp_t i; 31219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project FILE *out; 31319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_group_desc *gdp; 31419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int c, header_only = 0; 3153984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int numdirs = 0, first, gdt_csum; 31619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 31719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project reset_getopt(); 31819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while ((c = getopt (argc, argv, "h")) != EOF) { 31919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project switch (c) { 32019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'h': 32119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project header_only++; 32219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 32319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project default: 32419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto print_usage; 32519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 32619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 32719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (optind != argc) { 32819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto print_usage; 32919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 33019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (check_fs_open(argv[0])) 33119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 33219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project out = open_pager(); 33319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 33419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project list_super2(current_fs->super, out); 33519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i=0; i < current_fs->group_desc_count; i++) 33619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project numdirs += current_fs->group_desc[i].bg_used_dirs_count; 33719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "Directories: %d\n", numdirs); 3383984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 33919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (header_only) { 34019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close_pager(out); 34119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 34219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 3433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 3443984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt gdt_csum = EXT2_HAS_RO_COMPAT_FEATURE(current_fs->super, 3453984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT4_FEATURE_RO_COMPAT_GDT_CSUM); 34619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project gdp = ¤t_fs->group_desc[0]; 34719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i = 0; i < current_fs->group_desc_count; i++, gdp++) { 34819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, " Group %2d: block bitmap at %u, " 34919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "inode bitmap at %u, " 35019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "inode table at %u\n" 35119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project " %d free %s, " 35219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "%d free %s, " 3533984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt "%d used %s%s", 35419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project i, gdp->bg_block_bitmap, 35519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project gdp->bg_inode_bitmap, gdp->bg_inode_table, 35619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project gdp->bg_free_blocks_count, 35719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project gdp->bg_free_blocks_count != 1 ? "blocks" : "block", 35819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project gdp->bg_free_inodes_count, 35919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project gdp->bg_free_inodes_count != 1 ? "inodes" : "inode", 36019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project gdp->bg_used_dirs_count, 36119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project gdp->bg_used_dirs_count != 1 ? "directories" 3623984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt : "directory", gdt_csum ? ", " : "\n"); 3633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (gdt_csum) 3643984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(out, "%d unused %s\n", 3653984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt gdp->bg_itable_unused, 3663984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt gdp->bg_itable_unused != 1 ? "inodes":"inode"); 36719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project first = 1; 36819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_bg_opts(gdp, EXT2_BG_INODE_UNINIT, "Inode not init", 36919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &first, out); 37019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_bg_opts(gdp, EXT2_BG_BLOCK_UNINIT, "Block not init", 37119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &first, out); 3723984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (gdt_csum) { 3733984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(out, "%sChecksum 0x%04x", 3743984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt first ? " [":", ", gdp->bg_checksum); 3753984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt first = 0; 3763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 37719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!first) 37819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs("]\n", out); 37919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 38019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close_pager(out); 38119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 38219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectprint_usage: 38319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "%s: Usage: show_super [-h]\n", argv[0]); 38419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 38519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3863984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtvoid do_dirty_filesys(int argc EXT2FS_ATTR((unused)), 38719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char **argv EXT2FS_ATTR((unused))) 38819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 38919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (check_fs_open(argv[0])) 39019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 39119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (check_fs_read_write(argv[0])) 39219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 39319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 39419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (argv[1] && !strcmp(argv[1], "-clean")) 39519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project current_fs->super->s_state |= EXT2_VALID_FS; 39619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 39719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project current_fs->super->s_state &= ~EXT2_VALID_FS; 39819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_super_dirty(current_fs); 39919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 40019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 40119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct list_blocks_struct { 40219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project FILE *f; 40319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project e2_blkcnt_t total; 40419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t first_block, last_block; 40519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project e2_blkcnt_t first_bcnt, last_bcnt; 40619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project e2_blkcnt_t first; 40719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}; 40819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 40919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void finish_range(struct list_blocks_struct *lb) 41019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 41119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (lb->first_block == 0) 41219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 41319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (lb->first) 41419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project lb->first = 0; 41519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 41619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(lb->f, ", "); 41719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (lb->first_block == lb->last_block) 41819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(lb->f, "(%lld):%u", 41919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (long long)lb->first_bcnt, lb->first_block); 42019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 42119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(lb->f, "(%lld-%lld):%u-%u", 42219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (long long)lb->first_bcnt, (long long)lb->last_bcnt, 42319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project lb->first_block, lb->last_block); 42419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project lb->first_block = 0; 42519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 42619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4273984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtstatic int list_blocks_proc(ext2_filsys fs EXT2FS_ATTR((unused)), 4283984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt blk_t *blocknr, e2_blkcnt_t blockcnt, 42919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t ref_block EXT2FS_ATTR((unused)), 4303984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int ref_offset EXT2FS_ATTR((unused)), 43119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void *private) 43219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 43319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct list_blocks_struct *lb = (struct list_blocks_struct *) private; 43419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 43519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project lb->total++; 43619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blockcnt >= 0) { 43719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 43819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * See if we can add on to the existing range (if it exists) 43919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 44019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (lb->first_block && 44119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (lb->last_block+1 == *blocknr) && 44219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (lb->last_bcnt+1 == blockcnt)) { 44319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project lb->last_block = *blocknr; 44419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project lb->last_bcnt = blockcnt; 44519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 44619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 44719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 44819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Start a new range. 44919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 45019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project finish_range(lb); 45119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project lb->first_block = lb->last_block = *blocknr; 45219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project lb->first_bcnt = lb->last_bcnt = blockcnt; 45319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 45419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 45519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 45619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Not a normal block. Always force a new range. 45719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 45819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project finish_range(lb); 45919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (lb->first) 46019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project lb->first = 0; 46119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 46219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(lb->f, ", "); 46319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blockcnt == -1) 46419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(lb->f, "(IND):%u", *blocknr); 46519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (blockcnt == -2) 46619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(lb->f, "(DIND):%u", *blocknr); 46719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (blockcnt == -3) 46819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(lb->f, "(TIND):%u", *blocknr); 46919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 47019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 47119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 47219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void dump_xattr_string(FILE *out, const char *str, int len) 47319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 47419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int printable = 0; 47519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int i; 4763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 47719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* check: is string "printable enough?" */ 47819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i = 0; i < len; i++) 47919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (isprint(str[i])) 48019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printable++; 48119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 48219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (printable <= len*7/8) 48319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printable = 0; 48419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 48519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i = 0; i < len; i++) 48619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (printable) 48719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, isprint(str[i]) ? "%c" : "\\%03o", 48819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (unsigned char)str[i]); 48919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 49019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "%02x ", (unsigned char)str[i]); 49119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 49219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4933984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtstatic void internal_dump_inode_extra(FILE *out, 49419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *prefix EXT2FS_ATTR((unused)), 4953984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2_ino_t inode_num EXT2FS_ATTR((unused)), 49619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_inode_large *inode) 49719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 49819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_ext_attr_entry *entry; 49919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __u32 *magic; 50019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *start, *end; 50119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned int storage_size; 50219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 50319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "Size of extra inode fields: %u\n", inode->i_extra_isize); 50419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (inode->i_extra_isize > EXT2_INODE_SIZE(current_fs->super) - 50519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_GOOD_OLD_INODE_SIZE) { 50619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "invalid inode->i_extra_isize (%u)\n", 50719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode->i_extra_isize); 50819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 50919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 51019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project storage_size = EXT2_INODE_SIZE(current_fs->super) - 51119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_GOOD_OLD_INODE_SIZE - 51219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode->i_extra_isize; 51319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project magic = (__u32 *)((char *)inode + EXT2_GOOD_OLD_INODE_SIZE + 51419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode->i_extra_isize); 51519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*magic == EXT2_EXT_ATTR_MAGIC) { 51619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "Extended attributes stored in inode body: \n"); 51719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project end = (char *) inode + EXT2_INODE_SIZE(current_fs->super); 51819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project start = (char *) magic + sizeof(__u32); 51919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project entry = (struct ext2_ext_attr_entry *) start; 52019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (!EXT2_EXT_IS_LAST_ENTRY(entry)) { 52119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_ext_attr_entry *next = 52219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_EXT_ATTR_NEXT(entry); 52319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (entry->e_value_size > storage_size || 52419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (char *) next >= end) { 52519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "invalid EA entry in inode\n"); 52619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 52719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 52819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, " "); 5293984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt dump_xattr_string(out, EXT2_EXT_ATTR_NAME(entry), 53019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project entry->e_name_len); 53119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, " = \""); 53219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dump_xattr_string(out, start + entry->e_value_offs, 53319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project entry->e_value_size); 53419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "\" (%u)\n", entry->e_value_size); 53519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project entry = next; 53619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 53719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 53819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 53919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 54019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void dump_blocks(FILE *f, const char *prefix, ext2_ino_t inode) 54119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 54219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct list_blocks_struct lb; 54319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 54419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(f, "%sBLOCKS:\n%s", prefix, prefix); 54519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project lb.total = 0; 54619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project lb.first_block = 0; 54719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project lb.f = f; 54819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project lb.first = 1; 5493984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_block_iterate2(current_fs, inode, BLOCK_FLAG_READ_ONLY, NULL, 55019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project list_blocks_proc, (void *)&lb); 55119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project finish_range(&lb); 55219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (lb.total) 55319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(f, "\n%sTOTAL: %lld\n", prefix, (long long)lb.total); 55419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(f,"\n"); 55519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 55619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5573984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtstatic int int_log10(unsigned long long arg) 5583984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 5593984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int l = 0; 5603984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 5613984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt arg = arg / 10; 5623984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt while (arg) { 5633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt l++; 5643984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt arg = arg / 10; 5653984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 5663984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return l; 5673984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 5683984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 5693984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#define DUMP_LEAF_EXTENTS 0x01 5703984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#define DUMP_NODE_EXTENTS 0x02 5713984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#define DUMP_EXTENT_TABLE 0x04 5723984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 5733984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtstatic void dump_extents(FILE *f, const char *prefix, ext2_ino_t ino, 5743984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int flags, int logical_width, int physical_width) 5753984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 5763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2_extent_handle_t handle; 5773984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt struct ext2fs_extent extent; 5783984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt struct ext2_extent_info info; 5793984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int op = EXT2_EXTENT_ROOT; 5803984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt unsigned int printed = 0; 5813984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt errcode_t errcode; 5823984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 5833984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt errcode = ext2fs_extent_open(current_fs, ino, &handle); 5843984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (errcode) 5853984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return; 5863984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 5873984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (flags & DUMP_EXTENT_TABLE) 5883984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(f, "Level Entries %*s %*s Length Flags\n", 5893984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt (logical_width*2)+3, "Logical", 5903984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt (physical_width*2)+3, "Physical"); 5913984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt else 5923984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(f, "%sEXTENTS:\n%s", prefix, prefix); 5933984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 5943984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt while (1) { 5953984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt errcode = ext2fs_extent_get(handle, op, &extent); 5963984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 5973984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (errcode) 5983984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt break; 5993984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 6003984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt op = EXT2_EXTENT_NEXT; 6013984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 6023984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (extent.e_flags & EXT2_EXTENT_FLAGS_SECOND_VISIT) 6033984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt continue; 6043984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 6053984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (extent.e_flags & EXT2_EXTENT_FLAGS_LEAF) { 6063984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if ((flags & DUMP_LEAF_EXTENTS) == 0) 6073984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt continue; 6083984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } else { 6093984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if ((flags & DUMP_NODE_EXTENTS) == 0) 6103984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt continue; 6113984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 6123984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 6133984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt errcode = ext2fs_extent_get_info(handle, &info); 6143984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (errcode) 6153984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt continue; 6163984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 6173984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (!(extent.e_flags & EXT2_EXTENT_FLAGS_LEAF)) { 6183984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (extent.e_flags & EXT2_EXTENT_FLAGS_SECOND_VISIT) 6193984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt continue; 6203984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 6213984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (flags & DUMP_EXTENT_TABLE) { 6223984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(f, "%2d/%2d %3d/%3d %*llu - %*llu " 6233984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt "%*llu%*s %6u\n", 6243984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt info.curr_level, info.max_depth, 6253984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt info.curr_entry, info.num_entries, 6263984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt logical_width, 6273984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_lblk, 6283984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt logical_width, 6293984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_lblk + (extent.e_len - 1), 6303984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt physical_width, 6313984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_pblk, 6323984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt physical_width+3, "", extent.e_len); 6333984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt continue; 6343984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 6353984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 6368558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall fprintf(f, "%s(ETB%d):%lld", 6378558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall printed ? ", " : "", info.curr_level, 6383984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_pblk); 6393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printed = 1; 6403984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt continue; 6413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 6423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 6433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (flags & DUMP_EXTENT_TABLE) { 6443984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(f, "%2d/%2d %3d/%3d %*llu - %*llu " 6453984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt "%*llu - %*llu %6u %s\n", 6463984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt info.curr_level, info.max_depth, 6473984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt info.curr_entry, info.num_entries, 6483984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt logical_width, 6493984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_lblk, 6503984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt logical_width, 6513984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_lblk + (extent.e_len - 1), 6523984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt physical_width, 6533984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_pblk, 6543984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt physical_width, 6553984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_pblk + (extent.e_len - 1), 6563984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_len, 6573984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT ? 6583984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt "Uninit" : ""); 6593984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt continue; 6603984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 6613984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 6623984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (extent.e_len == 0) 6633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt continue; 6643984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt else if (extent.e_len == 1) 6653984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(f, 6668558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall "%s(%lld%s):%lld", 6673984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printed ? ", " : "", 6683984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_lblk, 6693984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT ? 6708558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall "[u]" : "", 6713984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_pblk); 6723984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt else 6733984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(f, 6748558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall "%s(%lld-%lld%s):%lld-%lld", 6753984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printed ? ", " : "", 6763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_lblk, 6773984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_lblk + (extent.e_len - 1), 6783984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT ? 6798558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall "[u]" : "", 6803984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_pblk, 6813984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt extent.e_pblk + (extent.e_len - 1)); 6823984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printed = 1; 6833984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 6843984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (printed) 6853984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(f, "\n"); 6863984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 68719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 68819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid internal_dump_inode(FILE *out, const char *prefix, 68919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t inode_num, struct ext2_inode *inode, 69019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int do_dump_blocks) 69119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 69219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *i_type; 69319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char frag, fsize; 69419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int os = current_fs->super->s_creator_os; 6953984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt struct ext2_inode_large *large_inode; 6963984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int is_large_inode = 0; 6973984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 6983984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (EXT2_INODE_SIZE(current_fs->super) > EXT2_GOOD_OLD_INODE_SIZE) 6993984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt is_large_inode = 1; 7003984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt large_inode = (struct ext2_inode_large *) inode; 7013984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 70219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (LINUX_S_ISDIR(inode->i_mode)) i_type = "directory"; 70319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (LINUX_S_ISREG(inode->i_mode)) i_type = "regular"; 70419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (LINUX_S_ISLNK(inode->i_mode)) i_type = "symlink"; 70519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (LINUX_S_ISBLK(inode->i_mode)) i_type = "block special"; 70619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (LINUX_S_ISCHR(inode->i_mode)) i_type = "character special"; 70719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (LINUX_S_ISFIFO(inode->i_mode)) i_type = "FIFO"; 70819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (LINUX_S_ISSOCK(inode->i_mode)) i_type = "socket"; 70919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else i_type = "bad type"; 71019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "%sInode: %u Type: %s ", prefix, inode_num, i_type); 7113984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(out, "%sMode: %04o Flags: 0x%x\n", 7123984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt prefix, inode->i_mode & 0777, inode->i_flags); 7133984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (is_large_inode && large_inode->i_extra_isize >= 24) { 7143984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(out, "%sGeneration: %u Version: 0x%08x:%08x\n", 7153984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt prefix, inode->i_generation, large_inode->i_version_hi, 7163984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt inode->osd1.linux1.l_i_version); 7173984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } else { 7183984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(out, "%sGeneration: %u Version: 0x%08x\n", prefix, 7193984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt inode->i_generation, inode->osd1.linux1.l_i_version); 7203984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 72119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "%sUser: %5d Group: %5d Size: ", 72219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project prefix, inode_uid(*inode), inode_gid(*inode)); 72319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (LINUX_S_ISREG(inode->i_mode)) { 72419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long long i_size = (inode->i_size | 72519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ((unsigned long long)inode->i_size_high << 32)); 72619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 72719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "%llu\n", i_size); 72819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else 72919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "%d\n", inode->i_size); 73019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (os == EXT2_OS_HURD) 73119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, 73219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "%sFile ACL: %d Directory ACL: %d Translator: %d\n", 73319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project prefix, 73419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode->i_file_acl, LINUX_S_ISDIR(inode->i_mode) ? inode->i_dir_acl : 0, 73519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode->osd1.hurd1.h_i_translator); 73619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 7373984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(out, "%sFile ACL: %llu Directory ACL: %d\n", 73819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project prefix, 7393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt inode->i_file_acl | ((long long) 7403984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt (inode->osd2.linux2.l_i_file_acl_high) << 32), 7413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt LINUX_S_ISDIR(inode->i_mode) ? inode->i_dir_acl : 0); 7423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (os == EXT2_OS_LINUX) 74319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "%sLinks: %d Blockcount: %llu\n", 7443984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt prefix, inode->i_links_count, 7453984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt (((unsigned long long) 7463984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt inode->osd2.linux2.l_i_blocks_hi << 32)) + 74719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode->i_blocks); 74819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 74919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "%sLinks: %d Blockcount: %u\n", 75019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project prefix, inode->i_links_count, inode->i_blocks); 75119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project switch (os) { 75219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case EXT2_OS_HURD: 75319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project frag = inode->osd2.hurd2.h_i_frag; 75419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fsize = inode->osd2.hurd2.h_i_fsize; 75519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 75619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project default: 75719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project frag = fsize = 0; 75819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 75919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "%sFragment: Address: %d Number: %d Size: %d\n", 76019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project prefix, inode->i_faddr, frag, fsize); 7613984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (is_large_inode && large_inode->i_extra_isize >= 24) { 7623984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(out, "%s ctime: 0x%08x:%08x -- %s", prefix, 7633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt inode->i_ctime, large_inode->i_ctime_extra, 7643984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt time_to_string(inode->i_ctime)); 7653984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(out, "%s atime: 0x%08x:%08x -- %s", prefix, 7663984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt inode->i_atime, large_inode->i_atime_extra, 7673984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt time_to_string(inode->i_atime)); 7683984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(out, "%s mtime: 0x%08x:%08x -- %s", prefix, 7693984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt inode->i_mtime, large_inode->i_mtime_extra, 7703984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt time_to_string(inode->i_mtime)); 7713984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(out, "%scrtime: 0x%08x:%08x -- %s", prefix, 7723984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt large_inode->i_crtime, large_inode->i_crtime_extra, 7733984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt time_to_string(large_inode->i_crtime)); 7743984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } else { 7753984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(out, "%sctime: 0x%08x -- %s", prefix, inode->i_ctime, 7763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt time_to_string(inode->i_ctime)); 7773984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(out, "%satime: 0x%08x -- %s", prefix, inode->i_atime, 7783984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt time_to_string(inode->i_atime)); 7793984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(out, "%smtime: 0x%08x -- %s", prefix, inode->i_mtime, 7803984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt time_to_string(inode->i_mtime)); 7813984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 7823984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (inode->i_dtime) 78319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "%sdtime: 0x%08x -- %s", prefix, inode->i_dtime, 78419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project time_to_string(inode->i_dtime)); 78519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (EXT2_INODE_SIZE(current_fs->super) > EXT2_GOOD_OLD_INODE_SIZE) 78619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project internal_dump_inode_extra(out, prefix, inode_num, 78719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (struct ext2_inode_large *) inode); 78819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (LINUX_S_ISLNK(inode->i_mode) && ext2fs_inode_data_blocks(current_fs,inode) == 0) 78919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "%sFast_link_dest: %.*s\n", prefix, 79019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (int) inode->i_size, (char *)inode->i_block); 79119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (LINUX_S_ISBLK(inode->i_mode) || LINUX_S_ISCHR(inode->i_mode)) { 79219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int major, minor; 79319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *devnote; 79419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 79519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (inode->i_block[0]) { 79619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project major = (inode->i_block[0] >> 8) & 255; 79719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project minor = inode->i_block[0] & 255; 79819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project devnote = ""; 79919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 80019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project major = (inode->i_block[1] & 0xfff00) >> 8; 8013984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt minor = ((inode->i_block[1] & 0xff) | 80219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ((inode->i_block[1] >> 12) & 0xfff00)); 80319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project devnote = "(New-style) "; 80419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 8053984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(out, "%sDevice major/minor number: %02d:%02d (hex %02x:%02x)\n", 80619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project devnote, major, minor, major, minor); 8073984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } else if (do_dump_blocks) { 8083984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (inode->i_flags & EXT4_EXTENTS_FL) 8093984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt dump_extents(out, prefix, inode_num, 8108558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall DUMP_LEAF_EXTENTS|DUMP_NODE_EXTENTS, 0, 0); 8113984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt else 8123984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt dump_blocks(out, prefix, inode_num); 81319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 81419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 81519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 81619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void dump_inode(ext2_ino_t inode_num, struct ext2_inode *inode) 81719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 81819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project FILE *out; 8193984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 82019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project out = open_pager(); 82119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project internal_dump_inode(out, "", inode_num, inode, 1); 82219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close_pager(out); 82319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 82419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 82519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_stat(int argc, char *argv[]) 82619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 82719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t inode; 82819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_inode * inode_buf; 82919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 83019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (check_fs_open(argv[0])) 83119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 83219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 83319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode_buf = (struct ext2_inode *) 83419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project malloc(EXT2_INODE_SIZE(current_fs->super)); 83519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!inode_buf) { 83619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "do_stat: can't allocate buffer\n"); 83719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 83819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 83919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 84019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_inode_args_process(argc, argv, &inode, 0)) { 84119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project free(inode_buf); 84219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 84319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 84419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 84519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_read_inode_full(inode, inode_buf, argv[0], 84619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_INODE_SIZE(current_fs->super))) { 84719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project free(inode_buf); 84819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 84919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 85019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 85119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dump_inode(inode, inode_buf); 85219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project free(inode_buf); 85319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 85419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 85519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 8563984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtvoid do_dump_extents(int argc, char *argv[]) 8573984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 8583984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt struct ext2_inode inode; 8593984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2_ino_t ino; 8603984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt FILE *out; 8613984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int c, flags = 0; 8623984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int logical_width; 8633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int physical_width; 8643984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 8653984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt reset_getopt(); 8663984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt while ((c = getopt(argc, argv, "nl")) != EOF) { 8673984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt switch (c) { 8683984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt case 'n': 8693984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt flags |= DUMP_NODE_EXTENTS; 8703984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt break; 8713984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt case 'l': 8723984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt flags |= DUMP_LEAF_EXTENTS; 8733984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt break; 8743984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 8753984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 8763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 8773984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (argc != optind+1) { 8783984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt print_usage: 8793984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err(0, 0, "Usage: dump_extents [-n] [-l] file"); 8803984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return; 8813984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 8823984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 8833984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (flags == 0) 8843984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt flags = DUMP_NODE_EXTENTS | DUMP_LEAF_EXTENTS; 8853984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt flags |= DUMP_EXTENT_TABLE; 8863984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 8873984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (check_fs_open(argv[0])) 8883984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return; 8893984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 8903984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ino = string_to_inode(argv[optind]); 8913984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (ino == 0) 8923984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return; 8933984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 8943984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (debugfs_read_inode(ino, &inode, argv[0])) 8953984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return; 8963984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 8973984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if ((inode.i_flags & EXT4_EXTENTS_FL) == 0) { 8983984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(stderr, "%s: does not uses extent block maps\n", 8993984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt argv[optind]); 9003984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return; 9013984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 9023984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 9033984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt logical_width = int_log10(((inode.i_size | 9043984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt (__u64) inode.i_size_high << 32) + 9053984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt current_fs->blocksize - 1) / 9063984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt current_fs->blocksize) + 1; 9073984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (logical_width < 5) 9083984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt logical_width = 5; 9093984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt physical_width = int_log10(current_fs->super->s_blocks_count) + 1; 9103984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (physical_width < 5) 9113984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt physical_width = 5; 9123984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 9133984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt out = open_pager(); 9143984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt dump_extents(out, "", ino, flags, logical_width, physical_width); 9153984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt close_pager(out); 9163984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return; 9173984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 9183984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 91919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_chroot(int argc, char *argv[]) 92019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 92119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t inode; 92219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int retval; 92319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 92419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_inode_args_process(argc, argv, &inode, 0)) 92519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 92619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 92719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_check_directory(current_fs, inode); 92819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 92919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[1], retval, 0); 93019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 93119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 93219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project root = inode; 93319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 93419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 93519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_clri(int argc, char *argv[]) 93619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 93719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t inode; 93819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_inode inode_buf; 93919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 94019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_inode_args_process(argc, argv, &inode, CHECK_FS_RW)) 94119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 94219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 94319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_read_inode(inode, &inode_buf, argv[0])) 94419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 94519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memset(&inode_buf, 0, sizeof(inode_buf)); 94619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_write_inode(inode, &inode_buf, argv[0])) 94719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 94819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 94919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 95019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_freei(int argc, char *argv[]) 95119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 95219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t inode; 95319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 95419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_inode_args_process(argc, argv, &inode, 95519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project CHECK_FS_RW | CHECK_FS_BITMAPS)) 95619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 95719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 95819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!ext2fs_test_inode_bitmap(current_fs->inode_map,inode)) 95919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Warning: inode already clear"); 96019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_unmark_inode_bitmap(current_fs->inode_map,inode); 96119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_ib_dirty(current_fs); 96219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 96319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 96419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_seti(int argc, char *argv[]) 96519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 96619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t inode; 96719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 96819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_inode_args_process(argc, argv, &inode, 96919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project CHECK_FS_RW | CHECK_FS_BITMAPS)) 97019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 97119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 97219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ext2fs_test_inode_bitmap(current_fs->inode_map,inode)) 97319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Warning: inode already set"); 97419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_inode_bitmap(current_fs->inode_map,inode); 97519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_ib_dirty(current_fs); 97619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 97719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 97819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_testi(int argc, char *argv[]) 97919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 98019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t inode; 98119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 98219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_inode_args_process(argc, argv, &inode, CHECK_FS_BITMAPS)) 98319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 98419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 98519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ext2fs_test_inode_bitmap(current_fs->inode_map,inode)) 98619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Inode %u is marked in use\n", inode); 98719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 98819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Inode %u is not in use\n", inode); 98919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 99019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 99119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_freeb(int argc, char *argv[]) 99219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 99319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t block; 99419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t count = 1; 99519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 99619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_block_args_process(argc, argv, &block, &count)) 99719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 99819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (check_fs_read_write(argv[0])) 99919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 100019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (count-- > 0) { 100119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!ext2fs_test_block_bitmap(current_fs->block_map,block)) 100219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Warning: block %u already clear", 100319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project block); 100419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_unmark_block_bitmap(current_fs->block_map,block); 100519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project block++; 100619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 100719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_bb_dirty(current_fs); 100819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 100919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 101019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_setb(int argc, char *argv[]) 101119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 101219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t block; 101319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t count = 1; 101419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 101519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_block_args_process(argc, argv, &block, &count)) 101619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 101719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (check_fs_read_write(argv[0])) 101819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 101919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (count-- > 0) { 102019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ext2fs_test_block_bitmap(current_fs->block_map,block)) 102119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Warning: block %u already set", 102219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project block); 102319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_block_bitmap(current_fs->block_map,block); 102419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project block++; 102519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 102619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_bb_dirty(current_fs); 102719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 102819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 102919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_testb(int argc, char *argv[]) 103019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 103119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t block; 103219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t count = 1; 103319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 103419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_block_args_process(argc, argv, &block, &count)) 103519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 103619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (count-- > 0) { 103719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ext2fs_test_block_bitmap(current_fs->block_map,block)) 103819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Block %u marked in use\n", block); 103919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 104019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Block %u not in use\n", block); 104119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project block++; 104219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 104319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 104419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 104519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void modify_u8(char *com, const char *prompt, 104619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *format, __u8 *val) 104719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 104819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char buf[200]; 104919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long v; 105019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *tmp; 105119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 105219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sprintf(buf, format, *val); 105319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("%30s [%s] ", prompt, buf); 10543984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (!fgets(buf, sizeof(buf), stdin)) 10553984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return; 105619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (buf[strlen (buf) - 1] == '\n') 105719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project buf[strlen (buf) - 1] = '\0'; 105819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!buf[0]) 105919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 106019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project v = strtoul(buf, &tmp, 0); 106119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*tmp) 106219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(com, 0, "Bad value - %s", buf); 106319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 106419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *val = v; 106519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 106619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 106719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void modify_u16(char *com, const char *prompt, 106819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *format, __u16 *val) 106919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 107019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char buf[200]; 107119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long v; 107219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *tmp; 107319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 107419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sprintf(buf, format, *val); 107519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("%30s [%s] ", prompt, buf); 10763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (!fgets(buf, sizeof(buf), stdin)) 10773984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return; 107819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (buf[strlen (buf) - 1] == '\n') 107919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project buf[strlen (buf) - 1] = '\0'; 108019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!buf[0]) 108119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 108219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project v = strtoul(buf, &tmp, 0); 108319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*tmp) 108419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(com, 0, "Bad value - %s", buf); 108519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 108619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *val = v; 108719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 108819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 108919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void modify_u32(char *com, const char *prompt, 109019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *format, __u32 *val) 109119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 109219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char buf[200]; 109319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long v; 109419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *tmp; 109519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 109619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sprintf(buf, format, *val); 109719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("%30s [%s] ", prompt, buf); 10983984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (!fgets(buf, sizeof(buf), stdin)) 10993984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return; 110019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (buf[strlen (buf) - 1] == '\n') 110119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project buf[strlen (buf) - 1] = '\0'; 110219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!buf[0]) 110319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 110419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project v = strtoul(buf, &tmp, 0); 110519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*tmp) 110619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(com, 0, "Bad value - %s", buf); 110719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 110819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *val = v; 110919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 111019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 111119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 111219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_modify_inode(int argc, char *argv[]) 111319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 111419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_inode inode; 111519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t inode_num; 111619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int i; 111719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned char *frag, *fsize; 111819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char buf[80]; 111919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int os; 112019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *hex_format = "0x%x"; 112119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *octal_format = "0%o"; 112219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *decimal_format = "%d"; 112319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *unsignedlong_format = "%lu"; 11243984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 112519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_inode_args_process(argc, argv, &inode_num, CHECK_FS_RW)) 112619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 112719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 112819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project os = current_fs->super->s_creator_os; 112919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 113019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_read_inode(inode_num, &inode, argv[1])) 113119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 11323984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 113319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u16(argv[0], "Mode", octal_format, &inode.i_mode); 113419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u16(argv[0], "User ID", decimal_format, &inode.i_uid); 113519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u16(argv[0], "Group ID", decimal_format, &inode.i_gid); 113619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "Size", unsignedlong_format, &inode.i_size); 113719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "Creation time", decimal_format, &inode.i_ctime); 113819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "Modification time", decimal_format, &inode.i_mtime); 113919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "Access time", decimal_format, &inode.i_atime); 114019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "Deletion time", decimal_format, &inode.i_dtime); 114119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u16(argv[0], "Link count", decimal_format, &inode.i_links_count); 114219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (os == EXT2_OS_LINUX) 11433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt modify_u16(argv[0], "Block count high", unsignedlong_format, 114419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &inode.osd2.linux2.l_i_blocks_hi); 114519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "Block count", unsignedlong_format, &inode.i_blocks); 114619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "File flags", hex_format, &inode.i_flags); 114719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "Generation", hex_format, &inode.i_generation); 114819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if 0 114919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "Reserved1", decimal_format, &inode.i_reserved1); 115019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 115119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "File acl", decimal_format, &inode.i_file_acl); 115219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (LINUX_S_ISDIR(inode.i_mode)) 115319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "Directory acl", decimal_format, &inode.i_dir_acl); 115419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 115519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "High 32bits of size", decimal_format, &inode.i_size_high); 115619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 115719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (os == EXT2_OS_HURD) 115819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "Translator Block", 115919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project decimal_format, &inode.osd1.hurd1.h_i_translator); 11603984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 116119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "Fragment address", decimal_format, &inode.i_faddr); 116219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project switch (os) { 116319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case EXT2_OS_HURD: 116419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project frag = &inode.osd2.hurd2.h_i_frag; 116519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fsize = &inode.osd2.hurd2.h_i_fsize; 116619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 116719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project default: 116819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project frag = fsize = 0; 116919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 117019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (frag) 117119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u8(argv[0], "Fragment number", decimal_format, frag); 117219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fsize) 117319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u8(argv[0], "Fragment size", decimal_format, fsize); 117419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 117519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i=0; i < EXT2_NDIR_BLOCKS; i++) { 117619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sprintf(buf, "Direct Block #%d", i); 117719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], buf, decimal_format, &inode.i_block[i]); 117819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 117919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "Indirect Block", decimal_format, 11803984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt &inode.i_block[EXT2_IND_BLOCK]); 118119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "Double Indirect Block", decimal_format, 118219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &inode.i_block[EXT2_DIND_BLOCK]); 118319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project modify_u32(argv[0], "Triple Indirect Block", decimal_format, 118419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &inode.i_block[EXT2_TIND_BLOCK]); 118519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_write_inode(inode_num, &inode, argv[1])) 118619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 118719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 118819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 118919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_change_working_dir(int argc, char *argv[]) 119019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 119119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t inode; 119219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int retval; 11933984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 119419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_inode_args_process(argc, argv, &inode, 0)) 119519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 119619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 119719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_check_directory(current_fs, inode); 119819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 119919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[1], retval, 0); 120019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 120119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 120219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cwd = inode; 120319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 120419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 120519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 120619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_print_working_directory(int argc, char *argv[]) 120719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 120819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int retval; 120919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *pathname = NULL; 12103984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 121119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_args_process(argc, argv, 1, 1, 121219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "print_working_directory", "", 0)) 121319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 121419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 121519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_get_pathname(current_fs, cwd, 0, &pathname); 121619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 121719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], retval, 121819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "while trying to get pathname of cwd"); 121919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 122019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("[pwd] INODE: %6u PATH: %s\n", 122119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cwd, pathname ? pathname : "NULL"); 122219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (pathname) { 122319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project free(pathname); 122419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project pathname = NULL; 122519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 122619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_get_pathname(current_fs, root, 0, &pathname); 122719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 122819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], retval, 122919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "while trying to get pathname of root"); 123019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 123119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("[root] INODE: %6u PATH: %s\n", 123219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project root, pathname ? pathname : "NULL"); 123319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (pathname) { 123419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project free(pathname); 123519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project pathname = NULL; 123619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 123719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 123819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 123919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 124019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 124119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Given a mode, return the ext2 file type 124219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 124319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int ext2_file_type(unsigned int mode) 124419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 124519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (LINUX_S_ISREG(mode)) 124619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EXT2_FT_REG_FILE; 124719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 124819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (LINUX_S_ISDIR(mode)) 124919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EXT2_FT_DIR; 12503984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 125119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (LINUX_S_ISCHR(mode)) 125219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EXT2_FT_CHRDEV; 12533984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 125419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (LINUX_S_ISBLK(mode)) 125519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EXT2_FT_BLKDEV; 12563984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 125719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (LINUX_S_ISLNK(mode)) 125819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EXT2_FT_SYMLINK; 125919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 126019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (LINUX_S_ISFIFO(mode)) 126119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EXT2_FT_FIFO; 12623984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 126319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (LINUX_S_ISSOCK(mode)) 126419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EXT2_FT_SOCK; 12653984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 126619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 126719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 126819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 126919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void make_link(char *sourcename, char *destname) 127019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 127119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t ino; 127219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_inode inode; 127319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int retval; 127419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t dir; 12753984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt char *dest, *cp, *base_name; 127619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 127719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 127819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Get the source inode 127919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 128019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ino = string_to_inode(sourcename); 128119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!ino) 128219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 12833984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt base_name = strrchr(sourcename, '/'); 12843984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (base_name) 12853984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt base_name++; 128619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 12873984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt base_name = sourcename; 128819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 128919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Figure out the destination. First see if it exists and is 12903984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * a directory. 129119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 129219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (! (retval=ext2fs_namei(current_fs, root, cwd, destname, &dir))) 12933984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt dest = base_name; 129419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else { 129519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 129619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * OK, it doesn't exist. See if it is 129719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * '<dir>/basename' or 'basename' 129819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 129919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cp = strrchr(destname, '/'); 130019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (cp) { 130119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *cp = 0; 130219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dir = string_to_inode(destname); 130319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!dir) 130419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 130519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dest = cp+1; 130619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 130719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dir = cwd; 130819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dest = destname; 130919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 131019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 131119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 131219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_read_inode(ino, &inode, sourcename)) 131319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 13143984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 13153984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt retval = ext2fs_link(current_fs, dir, dest, ino, 131619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_file_type(inode.i_mode)); 131719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 131819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("make_link", retval, 0); 131919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 132019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 132119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 132219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 132319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_link(int argc, char *argv[]) 132419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 132519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_args_process(argc, argv, 3, 3, "link", 132619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "<source file> <dest_name>", CHECK_FS_RW)) 132719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 132819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 132919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project make_link(argv[1], argv[2]); 133019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 133119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 133219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int mark_blocks_proc(ext2_filsys fs, blk_t *blocknr, 13333984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int blockcnt EXT2FS_ATTR((unused)), 133419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void *private EXT2FS_ATTR((unused))) 133519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 133619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t block; 133719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 133819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project block = *blocknr; 133919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_block_alloc_stats(fs, block, +1); 134019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 134119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 134219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 134319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_undel(int argc, char *argv[]) 134419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 134519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t ino; 134619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_inode inode; 134719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 134819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_args_process(argc, argv, 2, 3, "undelete", 134919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "<inode_num> [dest_name]", 135019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project CHECK_FS_RW | CHECK_FS_BITMAPS)) 135119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 135219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 135319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ino = string_to_inode(argv[1]); 135419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!ino) 135519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 135619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 135719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_read_inode(ino, &inode, argv[1])) 135819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 135919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 136019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ext2fs_test_inode_bitmap(current_fs->inode_map, ino)) { 136119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[1], 0, "Inode is not marked as deleted"); 136219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 136319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 136419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 136519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 136619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * XXX this function doesn't handle changing the links count on the 13673984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * parent directory when undeleting a directory. 136819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 136919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_links_count = LINUX_S_ISDIR(inode.i_mode) ? 2 : 1; 137019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_dtime = 0; 137119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 137219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_write_inode(ino, &inode, argv[0])) 137319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 137419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 13753984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_block_iterate(current_fs, ino, BLOCK_FLAG_READ_ONLY, NULL, 137619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mark_blocks_proc, NULL); 137719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 137819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_inode_alloc_stats2(current_fs, ino, +1, 0); 137919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 138019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (argc > 2) 138119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project make_link(argv[1], argv[2]); 138219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 138319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 138419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void unlink_file_by_name(char *filename) 138519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 138619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int retval; 138719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t dir; 13883984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt char *base_name; 13893984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 13903984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt base_name = strrchr(filename, '/'); 13913984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (base_name) { 13923984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt *base_name++ = '\0'; 139319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dir = string_to_inode(filename); 139419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!dir) 139519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 139619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 139719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dir = cwd; 13983984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt base_name = filename; 139919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 14003984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt retval = ext2fs_unlink(current_fs, dir, base_name, 0, 0); 140119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 140219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("unlink_file_by_name", retval, 0); 140319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 140419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 140519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 140619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_unlink(int argc, char *argv[]) 140719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 140819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_args_process(argc, argv, 2, 2, "link", 140919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "<pathname>", CHECK_FS_RW)) 141019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 141119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 141219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unlink_file_by_name(argv[1]); 141319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 141419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 141519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_find_free_block(int argc, char *argv[]) 141619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 141719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t free_blk, goal, first_free = 0; 141819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int count; 141919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 142019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *tmp; 14213984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 142219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((argc > 3) || (argc==2 && *argv[1] == '?')) { 142319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Usage: find_free_block [count [goal]]"); 142419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 142519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 142619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (check_fs_open(argv[0])) 142719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 142819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 142919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (argc > 1) { 143019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project count = strtol(argv[1],&tmp,0); 143119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*tmp) { 143219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Bad count - %s", argv[1]); 143319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 143419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 143519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else 143619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project count = 1; 143719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 143819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (argc > 2) { 143919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goal = strtol(argv[2], &tmp, 0); 144019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*tmp) { 144119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Bad goal - %s", argv[1]); 144219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 144319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 144419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 144519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 144619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goal = current_fs->super->s_first_data_block; 144719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 144819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Free blocks found: "); 14493984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt free_blk = goal - 1; 145019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (count-- > 0) { 145119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_new_block(current_fs, free_blk + 1, 0, 145219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &free_blk); 145319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (first_free) { 145419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (first_free == free_blk) 145519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 145619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else 145719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project first_free = free_blk; 145819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 145919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ext2fs_new_block", retval, 0); 146019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 146119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else 146219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("%u ", free_blk); 146319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 146419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("\n"); 146519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 146619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 146719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_find_free_inode(int argc, char *argv[]) 146819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 146919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t free_inode, dir; 147019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int mode; 147119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int retval; 147219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *tmp; 14733984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 147419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (argc > 3 || (argc>1 && *argv[1] == '?')) { 147519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Usage: find_free_inode [dir] [mode]"); 147619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 147719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 147819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (check_fs_open(argv[0])) 147919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 148019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 148119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (argc > 1) { 148219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dir = strtol(argv[1], &tmp, 0); 148319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*tmp) { 148419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Bad dir - %s", argv[1]); 148519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 148619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 148719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 148819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 148919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dir = root; 149019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (argc > 2) { 149119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mode = strtol(argv[2], &tmp, 0); 149219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*tmp) { 149319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Bad mode - %s", argv[2]); 149419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 149519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 149619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else 149719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mode = 010755; 149819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 149919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_new_inode(current_fs, dir, mode, 0, &free_inode); 150019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 150119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ext2fs_new_inode", retval, 0); 150219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 150319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Free inode found: %u\n", free_inode); 150419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 150519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 150619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t copy_file(int fd, ext2_ino_t newfile) 150719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 150819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_file_t e2_file; 150919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 151019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int got; 151119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned int written; 151219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char buf[8192]; 151319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *ptr; 151419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 151519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_file_open(current_fs, newfile, 151619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_FILE_WRITE, &e2_file); 151719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 151819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 151919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 152019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (1) { 152119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project got = read(fd, buf, sizeof(buf)); 152219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (got == 0) 152319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 152419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (got < 0) { 152519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = errno; 152619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto fail; 152719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 152819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ptr = buf; 152919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (got > 0) { 153019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_file_write(e2_file, ptr, 153119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project got, &written); 153219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 153319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto fail; 153419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 153519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project got -= written; 153619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ptr += written; 153719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 153819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 153919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_file_close(e2_file); 154019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 154119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 154219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectfail: 154319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (void) ext2fs_file_close(e2_file); 154419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 154519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 154619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 154719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 154819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_write(int argc, char *argv[]) 154919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 155019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int fd; 155119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct stat statbuf; 155219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t newfile; 155319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 155419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_inode inode; 155519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 155619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_args_process(argc, argv, 3, 3, "write", 155719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "<native file> <new file>", CHECK_FS_RW)) 155819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 155919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 156019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fd = open(argv[1], O_RDONLY); 156119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fd < 0) { 156219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[1], errno, 0); 156319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 156419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 156519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fstat(fd, &statbuf) < 0) { 156619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[1], errno, 0); 156719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close(fd); 156819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 156919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 157019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 157119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_namei(current_fs, root, cwd, argv[2], &newfile); 157219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval == 0) { 157319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "The file '%s' already exists\n", argv[2]); 157419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close(fd); 157519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 157619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 157719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 157819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_new_inode(current_fs, cwd, 010755, 0, &newfile); 157919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 158019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], retval, 0); 158119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close(fd); 158219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 158319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 158419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Allocated inode: %u\n", newfile); 158519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_link(current_fs, cwd, argv[2], newfile, 158619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_FT_REG_FILE); 158719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval == EXT2_ET_DIR_NO_SPACE) { 158819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_expand_dir(current_fs, cwd); 158919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 159019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], retval, "while expanding directory"); 15913984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt close(fd); 159219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 159319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 159419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_link(current_fs, cwd, argv[2], newfile, 159519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_FT_REG_FILE); 159619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 159719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 159819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[2], retval, 0); 159919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close(fd); 160019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 160119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 160219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ext2fs_test_inode_bitmap(current_fs->inode_map,newfile)) 160319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Warning: inode already set"); 160419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_inode_alloc_stats2(current_fs, newfile, +1, 0); 160519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memset(&inode, 0, sizeof(inode)); 160619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_mode = (statbuf.st_mode & ~LINUX_S_IFMT) | LINUX_S_IFREG; 16073984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt inode.i_atime = inode.i_ctime = inode.i_mtime = 160819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project current_fs->now ? current_fs->now : time(0); 160919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_links_count = 1; 161019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_size = statbuf.st_size; 16113984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (current_fs->super->s_feature_incompat & 16123984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT3_FEATURE_INCOMPAT_EXTENTS) 16133984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt inode.i_flags |= EXT4_EXTENTS_FL; 161419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_write_new_inode(newfile, &inode, argv[0])) { 161519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close(fd); 161619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 161719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 161819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (LINUX_S_ISREG(inode.i_mode)) { 161919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = copy_file(fd, newfile); 162019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 162119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("copy_file", retval, 0); 162219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 162319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close(fd); 162419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 162519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 162619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_mknod(int argc, char *argv[]) 162719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 162819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long mode, major, minor; 162919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t newfile; 163019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 163119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_inode inode; 163219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int filetype, nr; 163319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 163419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (check_fs_open(argv[0])) 163519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 163619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (argc < 3 || argv[2][1]) { 163719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project usage: 163819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Usage: mknod <name> [p| [c|b] <major> <minor>]"); 163919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 164019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 164119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mode = minor = major = 0; 164219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project switch (argv[2][0]) { 164319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'p': 164419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mode = LINUX_S_IFIFO; 164519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project filetype = EXT2_FT_FIFO; 164619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project nr = 3; 164719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 164819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'c': 164919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mode = LINUX_S_IFCHR; 165019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project filetype = EXT2_FT_CHRDEV; 165119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project nr = 5; 165219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 165319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'b': 165419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mode = LINUX_S_IFBLK; 165519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project filetype = EXT2_FT_BLKDEV; 165619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project nr = 5; 165719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 165819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project default: 165919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project filetype = 0; 166019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project nr = 0; 166119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 166219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (nr == 5) { 166319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project major = strtoul(argv[3], argv+3, 0); 166419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project minor = strtoul(argv[4], argv+4, 0); 166519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (major > 65535 || minor > 65535 || argv[3][0] || argv[4][0]) 166619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project nr = 0; 166719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 166819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (argc != nr) 166919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto usage; 167019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (check_fs_read_write(argv[0])) 167119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 167219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_new_inode(current_fs, cwd, 010755, 0, &newfile); 167319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 167419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], retval, 0); 167519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 167619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 167719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Allocated inode: %u\n", newfile); 167819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_link(current_fs, cwd, argv[1], newfile, filetype); 167919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval == EXT2_ET_DIR_NO_SPACE) { 168019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_expand_dir(current_fs, cwd); 168119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 168219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], retval, "while expanding directory"); 168319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 168419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 168519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_link(current_fs, cwd, argv[1], newfile, 168619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project filetype); 168719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 168819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 168919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[1], retval, 0); 169019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 169119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 169219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ext2fs_test_inode_bitmap(current_fs->inode_map,newfile)) 169319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Warning: inode already set"); 169419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_inode_bitmap(current_fs->inode_map, newfile); 169519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_ib_dirty(current_fs); 169619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memset(&inode, 0, sizeof(inode)); 169719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_mode = mode; 16983984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt inode.i_atime = inode.i_ctime = inode.i_mtime = 169919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project current_fs->now ? current_fs->now : time(0); 170019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((major < 256) && (minor < 256)) { 170119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_block[0] = major*256+minor; 170219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_block[1] = 0; 170319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 170419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_block[0] = 0; 170519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_block[1] = (minor & 0xff) | (major << 8) | ((minor & ~0xff) << 12); 170619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 170719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_links_count = 1; 170819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_write_new_inode(newfile, &inode, argv[0])) 170919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 171019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 171119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 171219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_mkdir(int argc, char *argv[]) 171319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 171419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *cp; 171519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t parent; 171619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *name; 171719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 171819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 171919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_args_process(argc, argv, 2, 2, "mkdir", 172019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "<filename>", CHECK_FS_RW)) 172119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 172219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 172319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cp = strrchr(argv[1], '/'); 172419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (cp) { 172519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *cp = 0; 172619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project parent = string_to_inode(argv[1]); 172719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!parent) { 172819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[1], ENOENT, 0); 172919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 173019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 173119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project name = cp+1; 173219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 173319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project parent = cwd; 173419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project name = argv[1]; 173519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 173619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 173719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecttry_again: 173819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_mkdir(current_fs, parent, 0, name); 173919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval == EXT2_ET_DIR_NO_SPACE) { 174019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_expand_dir(current_fs, parent); 174119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 17423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err(argv[0], retval, "while expanding directory"); 174319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 174419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 174519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto try_again; 174619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 174719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 174819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ext2fs_mkdir", retval, 0); 174919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 175019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 175119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 175219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 175319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 175419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int release_blocks_proc(ext2_filsys fs, blk_t *blocknr, 17553984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int blockcnt EXT2FS_ATTR((unused)), 175619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void *private EXT2FS_ATTR((unused))) 175719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 175819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t block; 175919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 176019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project block = *blocknr; 176119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_block_alloc_stats(fs, block, -1); 176219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 176319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 176419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 176519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void kill_file_by_inode(ext2_ino_t inode) 176619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 176719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_inode inode_buf; 176819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 176919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_read_inode(inode, &inode_buf, 0)) 177019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 177119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode_buf.i_dtime = current_fs->now ? current_fs->now : time(0); 177219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_write_inode(inode, &inode_buf, 0)) 177319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 177419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!ext2fs_inode_has_valid_blocks(&inode_buf)) 177519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 177619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17773984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_block_iterate(current_fs, inode, BLOCK_FLAG_READ_ONLY, NULL, 177819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project release_blocks_proc, NULL); 177919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("\n"); 178019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_inode_alloc_stats2(current_fs, inode, -1, 178119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project LINUX_S_ISDIR(inode_buf.i_mode)); 178219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 178319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 178419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 178519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_kill_file(int argc, char *argv[]) 178619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 178719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t inode_num; 178819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 178919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_inode_args_process(argc, argv, &inode_num, CHECK_FS_RW)) 179019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 179119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 179219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project kill_file_by_inode(inode_num); 179319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 179419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 179519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_rm(int argc, char *argv[]) 179619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 179719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int retval; 179819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t inode_num; 179919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_inode inode; 180019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 180119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_args_process(argc, argv, 2, 2, "rm", 180219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "<filename>", CHECK_FS_RW)) 180319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 180419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 180519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_namei(current_fs, root, cwd, argv[1], &inode_num); 180619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 180719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], retval, "while trying to resolve filename"); 180819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 180919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 181019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 181119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_read_inode(inode_num, &inode, argv[0])) 181219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 181319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 181419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (LINUX_S_ISDIR(inode.i_mode)) { 181519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "file is a directory"); 181619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 181719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 181819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 181919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project --inode.i_links_count; 182019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_write_inode(inode_num, &inode, argv[0])) 182119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 182219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 182319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unlink_file_by_name(argv[1]); 182419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (inode.i_links_count == 0) 182519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project kill_file_by_inode(inode_num); 182619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 182719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 182819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct rd_struct { 182919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t parent; 183019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int empty; 183119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}; 183219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 183319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int rmdir_proc(ext2_ino_t dir EXT2FS_ATTR((unused)), 183419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int entry EXT2FS_ATTR((unused)), 183519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_dir_entry *dirent, 183619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int offset EXT2FS_ATTR((unused)), 183719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int blocksize EXT2FS_ATTR((unused)), 183819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *buf EXT2FS_ATTR((unused)), 183919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void *private) 184019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 184119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct rd_struct *rds = (struct rd_struct *) private; 184219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 184319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (dirent->inode == 0) 184419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 184519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (((dirent->name_len&0xFF) == 1) && (dirent->name[0] == '.')) 184619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 184719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (((dirent->name_len&0xFF) == 2) && (dirent->name[0] == '.') && 184819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (dirent->name[1] == '.')) { 184919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project rds->parent = dirent->inode; 185019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 185119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 185219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project rds->empty = 0; 185319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 185419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 18553984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 185619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_rmdir(int argc, char *argv[]) 185719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 185819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int retval; 185919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t inode_num; 186019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_inode inode; 186119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct rd_struct rds; 186219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 186319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_args_process(argc, argv, 2, 2, "rmdir", 186419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "<filename>", CHECK_FS_RW)) 186519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 186619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 186719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_namei(current_fs, root, cwd, argv[1], &inode_num); 186819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 186919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], retval, "while trying to resolve filename"); 187019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 187119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 187219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 187319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_read_inode(inode_num, &inode, argv[0])) 187419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 187519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 187619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!LINUX_S_ISDIR(inode.i_mode)) { 187719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "file is not a directory"); 187819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 187919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 188019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 188119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project rds.parent = 0; 188219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project rds.empty = 1; 188319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 188419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_dir_iterate2(current_fs, inode_num, 0, 188519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 0, rmdir_proc, &rds); 188619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 188719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], retval, "while iterating over directory"); 188819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 188919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 189019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (rds.empty == 0) { 189119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "directory not empty"); 189219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 189319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 189419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 189519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_links_count = 0; 189619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_write_inode(inode_num, &inode, argv[0])) 189719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 189819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 189919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unlink_file_by_name(argv[1]); 190019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project kill_file_by_inode(inode_num); 190119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 190219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (rds.parent) { 190319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_read_inode(rds.parent, &inode, argv[0])) 190419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 190519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (inode.i_links_count > 1) 190619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_links_count--; 190719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_write_inode(rds.parent, &inode, argv[0])) 190819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 190919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 191019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 191119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 19123984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtvoid do_show_debugfs_params(int argc EXT2FS_ATTR((unused)), 191319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *argv[] EXT2FS_ATTR((unused))) 191419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 191519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project FILE *out = stdout; 191619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 191719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (current_fs) 191819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "Open mode: read-%s\n", 191919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project current_fs->flags & EXT2_FLAG_RW ? "write" : "only"); 192019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "Filesystem in use: %s\n", 192119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project current_fs ? current_fs->device_name : "--none--"); 192219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 192319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 192419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_expand_dir(int argc, char *argv[]) 192519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 192619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t inode; 192719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int retval; 192819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 192919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_inode_args_process(argc, argv, &inode, CHECK_FS_RW)) 193019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 193119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 193219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_expand_dir(current_fs, inode); 193319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 193419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ext2fs_expand_dir", retval, 0); 193519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 193619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 193719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 193819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_features(int argc, char *argv[]) 193919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 194019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int i; 19413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 194219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (check_fs_open(argv[0])) 194319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 194419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 194519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((argc != 1) && check_fs_read_write(argv[0])) 194619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 194719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i=1; i < argc; i++) { 194819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (e2p_edit_feature(argv[i], 194919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ¤t_fs->super->s_feature_compat, 0)) 195019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Unknown feature: %s\n", 195119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project argv[i]); 195219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 195319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_super_dirty(current_fs); 195419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 195519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_features(current_fs->super, stdout); 195619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 195719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 195819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_bmap(int argc, char *argv[]) 195919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 196019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t ino; 196119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t blk, pblk; 196219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int err; 196319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t errcode; 19643984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 196519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_args_process(argc, argv, 3, 3, argv[0], 196619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "<file> logical_blk", 0)) 196719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 196819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 196919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ino = string_to_inode(argv[1]); 197019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!ino) 197119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 197219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk = parse_ulong(argv[2], argv[0], "logical_block", &err); 197319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 197419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode = ext2fs_bmap(current_fs, ino, 0, 0, 0, blk, &pblk); 197519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (errcode) { 197619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("argv[0]", errcode, 197719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "while mapping logical block %u\n", blk); 197819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 197919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 198019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("%u\n", pblk); 198119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 198219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 198319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_imap(int argc, char *argv[]) 198419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 198519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t ino; 198619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long group, block, block_nr, offset; 198719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 198819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_args_process(argc, argv, 2, 2, argv[0], 198919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "<file>", 0)) 199019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 199119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ino = string_to_inode(argv[1]); 199219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!ino) 199319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 199419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 199519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project group = (ino - 1) / EXT2_INODES_PER_GROUP(current_fs->super); 199619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project offset = ((ino - 1) % EXT2_INODES_PER_GROUP(current_fs->super)) * 199719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_INODE_SIZE(current_fs->super); 199819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project block = offset >> EXT2_BLOCK_SIZE_BITS(current_fs->super); 199919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!current_fs->group_desc[(unsigned)group].bg_inode_table) { 200019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Inode table for group %lu is missing\n", 200119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project group); 200219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 200319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 20043984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt block_nr = current_fs->group_desc[(unsigned)group].bg_inode_table + 200519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project block; 200619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project offset &= (EXT2_BLOCK_SIZE(current_fs->super) - 1); 200719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 200819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Inode %d is part of block group %lu\n" 200919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "\tlocated at block %lu, offset 0x%04lx\n", ino, group, 201019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project block_nr, offset); 201119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 201219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 201319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 201419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_set_current_time(int argc, char *argv[]) 201519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 201619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project time_t now; 201719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 201819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_args_process(argc, argv, 2, 2, argv[0], 201919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "<time>", 0)) 202019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 202119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 202219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project now = string_to_time(argv[1]); 202319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (now == ((time_t) -1)) { 202419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "Couldn't parse argument as a time: %s\n", 202519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project argv[1]); 202619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 202719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 202819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 202919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Setting current time to %s\n", time_to_string(now)); 203019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project current_fs->now = now; 203119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 203219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 203319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 20343984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtstatic int find_supp_feature(__u32 *supp, int feature_type, char *name) 20353984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 20363984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int compat, bit, ret; 20373984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt unsigned int feature_mask; 20383984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 20393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (name) { 20403984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (feature_type == E2P_FS_FEATURE) 20413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ret = e2p_string2feature(name, &compat, &feature_mask); 20423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt else 20433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ret = e2p_jrnl_string2feature(name, &compat, 20443984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt &feature_mask); 20453984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (ret) 20463984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return ret; 20473984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 20483984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (!(supp[compat] & feature_mask)) 20493984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return 1; 20503984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } else { 20513984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt for (compat = 0; compat < 3; compat++) { 20523984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt for (bit = 0, feature_mask = 1; bit < 32; 20533984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt bit++, feature_mask <<= 1) { 20543984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (supp[compat] & feature_mask) { 20553984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (feature_type == E2P_FS_FEATURE) 20563984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(stdout, " %s", 20573984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt e2p_feature2string(compat, 20583984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt feature_mask)); 20593984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt else 20603984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(stdout, " %s", 20613984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt e2p_jrnl_feature2string(compat, 20623984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt feature_mask)); 20633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 20643984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 20653984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 20663984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(stdout, "\n"); 20673984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 20683984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 20693984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return 0; 20703984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 20713984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 20723984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtvoid do_supported_features(int argc, char *argv[]) 20733984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 20743984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int ret; 20753984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt __u32 supp[3] = { EXT2_LIB_FEATURE_COMPAT_SUPP, 20763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT2_LIB_FEATURE_INCOMPAT_SUPP, 20773984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT2_LIB_FEATURE_RO_COMPAT_SUPP }; 20783984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt __u32 jrnl_supp[3] = { JFS_KNOWN_COMPAT_FEATURES, 20793984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt JFS_KNOWN_INCOMPAT_FEATURES, 20803984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt JFS_KNOWN_ROCOMPAT_FEATURES }; 20813984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 20823984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (argc > 1) { 20833984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ret = find_supp_feature(supp, E2P_FS_FEATURE, argv[1]); 20843984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (ret) { 20853984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ret = find_supp_feature(jrnl_supp, E2P_JOURNAL_FEATURE, 20863984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt argv[1]); 20873984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 20883984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (ret) 20893984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err(argv[0], 0, "Unknown feature: %s\n", argv[1]); 20903984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt else 20913984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(stdout, "Supported feature: %s\n", argv[1]); 20923984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } else { 20933984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(stdout, "Supported features:"); 20943984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ret = find_supp_feature(supp, E2P_FS_FEATURE, NULL); 20953984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ret = find_supp_feature(jrnl_supp, E2P_JOURNAL_FEATURE, NULL); 20963984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 20973984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 20983984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 209919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int source_file(const char *cmd_file, int sci_idx) 210019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 210119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project FILE *f; 210219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char buf[256]; 210319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *cp; 210419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int exit_status = 0; 210519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int retval; 210619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 210719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (strcmp(cmd_file, "-") == 0) 210819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project f = stdin; 210919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else { 211019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project f = fopen(cmd_file, "r"); 211119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!f) { 211219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project perror(cmd_file); 211319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 211419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 211519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 21163984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fflush(stdout); 21173984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fflush(stderr); 211819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project setbuf(stdout, NULL); 211919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project setbuf(stderr, NULL); 212019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (!feof(f)) { 212119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fgets(buf, sizeof(buf), f) == NULL) 212219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 212319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cp = strchr(buf, '\n'); 212419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (cp) 212519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *cp = 0; 212619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cp = strchr(buf, '\r'); 212719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (cp) 212819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *cp = 0; 212919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("debugfs: %s\n", buf); 213019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ss_execute_line(sci_idx, buf); 213119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 213219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ss_perror(sci_idx, retval, buf); 213319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit_status++; 213419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 213519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 21363984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (f != stdin) 21373984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fclose(f); 213819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return exit_status; 213919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 214019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 214119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint main(int argc, char **argv) 214219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 214319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int retval; 214419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int sci_idx; 21453984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt const char *usage = "Usage: %s [-b blocksize] [-s superblock] [-f cmd_file] [-R request] [-V] [[-w] [-c] device]"; 214619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int c; 214719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int open_flags = EXT2_FLAG_SOFTSUPP_FEATURES; 214819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *request = 0; 214919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int exit_status = 0; 215019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *cmd_file = 0; 215119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t superblock = 0; 215219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t blocksize = 0; 215319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int catastrophic = 0; 215419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *data_filename = 0; 21553984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 21563984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (debug_prog_name == 0) 21573984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt debug_prog_name = "debugfs"; 21583984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 215919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project add_error_table(&et_ext2_error_table); 21603984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf (stderr, "%s %s (%s)\n", debug_prog_name, 21613984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt E2FSPROGS_VERSION, E2FSPROGS_DATE); 216219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 21638558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall while ((c = getopt (argc, argv, "iwcR:f:b:s:Vd:D")) != EOF) { 216419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project switch (c) { 216519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'R': 216619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project request = optarg; 216719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 216819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'f': 216919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cmd_file = optarg; 217019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 217119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'd': 217219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project data_filename = optarg; 217319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 217419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'i': 217519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project open_flags |= EXT2_FLAG_IMAGE_FILE; 217619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 217719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'w': 217819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project open_flags |= EXT2_FLAG_RW; 217919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 21808558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall case 'D': 21818558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall open_flags |= EXT2_FLAG_DIRECT_IO; 21828558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall break; 218319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'b': 21843984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt blocksize = parse_ulong(optarg, argv[0], 218519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "block size", 0); 218619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 218719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 's': 21883984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt superblock = parse_ulong(optarg, argv[0], 218919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "superblock number", 0); 219019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 219119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'c': 219219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project catastrophic = 1; 219319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 219419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'V': 219519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Print version number and exit */ 219619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "\tUsing %s\n", 219719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project error_message(EXT2_ET_BASE)); 219819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(0); 219919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project default: 22003984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err(argv[0], 0, usage, debug_prog_name); 220119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 1; 220219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 220319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 220419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (optind < argc) 220519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project open_filesystem(argv[optind], open_flags, 220619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project superblock, blocksize, catastrophic, 220719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project data_filename); 22083984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 22093984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt sci_idx = ss_create_invocation(debug_prog_name, "0.0", (char *) NULL, 221019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &debug_cmds, &retval); 221119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 221219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ss_perror(sci_idx, retval, "creating invocation"); 221319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 221419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 221519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ss_get_readline(sci_idx); 221619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 221719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (void) ss_add_request_table (sci_idx, &ss_std_requests, 1, &retval); 221819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 221919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ss_perror(sci_idx, retval, "adding standard requests"); 222019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit (1); 222119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 22223984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (extra_cmds) 22233984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ss_add_request_table (sci_idx, extra_cmds, 1, &retval); 22243984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (retval) { 22253984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ss_perror(sci_idx, retval, "adding extra requests"); 22263984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt exit (1); 22273984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 222819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (request) { 222919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = 0; 223019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ss_execute_line(sci_idx, request); 223119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 223219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ss_perror(sci_idx, retval, request); 223319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit_status++; 223419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 223519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else if (cmd_file) { 223619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit_status = source_file(cmd_file, sci_idx); 223719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 223819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ss_listen(sci_idx); 223919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 224019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 22413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ss_delete_invocation(sci_idx); 22423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 224319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (current_fs) 224419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close_filesystem(); 22453984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 224619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project remove_error_table(&et_ext2_error_table); 224719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return exit_status; 224819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 2249