119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * set_fields.c --- set a superblock value 33984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 2000, 2001, 2002, 2003, 2004 by Theodore Ts'o. 53984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %Begin-Header% 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This file may be redistributed under the terms of the GNU Public 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * License. 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %End-Header% 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define _XOPEN_SOURCE 600 /* for inclusion of strptime() and strtoull */ 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_STRTOULL 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define STRTOULL strtoull 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define STRTOULL strtoul 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h> 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdlib.h> 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <ctype.h> 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h> 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <strings.h> 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <time.h> 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h> 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/stat.h> 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_ERRNO_H 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <errno.h> 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 323984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#if HAVE_STRINGS_H 333984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#include <strings.h> 343984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#endif 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h> 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <utime.h> 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "debugfs.h" 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "uuid/uuid.h" 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2p/e2p.h" 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic struct ext2_super_block set_sb; 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic struct ext2_inode set_inode; 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic struct ext2_group_desc set_gd; 453984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtstatic dgrp_t set_bg; 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic ext2_ino_t set_ino; 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int array_idx; 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define FLAG_ARRAY 0x0001 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct field_set_info { 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *name; 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void *ptr; 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned int size; 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t (*func)(struct field_set_info *info, char *arg); 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int flags; 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int max_idx; 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}; 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t parse_uint(struct field_set_info *info, char *arg); 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t parse_int(struct field_set_info *info, char *arg); 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t parse_string(struct field_set_info *info, char *arg); 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t parse_uuid(struct field_set_info *info, char *arg); 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t parse_hashalg(struct field_set_info *info, char *arg); 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t parse_time(struct field_set_info *info, char *arg); 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t parse_bmap(struct field_set_info *info, char *arg); 673984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtstatic errcode_t parse_gd_csum(struct field_set_info *info, char *arg); 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic struct field_set_info super_fields[] = { 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "inodes_count", &set_sb.s_inodes_count, 4, parse_uint }, 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "blocks_count", &set_sb.s_blocks_count, 4, parse_uint }, 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "r_blocks_count", &set_sb.s_r_blocks_count, 4, parse_uint }, 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "free_blocks_count", &set_sb.s_free_blocks_count, 4, parse_uint }, 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "free_inodes_count", &set_sb.s_free_inodes_count, 4, parse_uint }, 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "first_data_block", &set_sb.s_first_data_block, 4, parse_uint }, 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "log_block_size", &set_sb.s_log_block_size, 4, parse_uint }, 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "log_frag_size", &set_sb.s_log_frag_size, 4, parse_int }, 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "blocks_per_group", &set_sb.s_blocks_per_group, 4, parse_uint }, 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "frags_per_group", &set_sb.s_frags_per_group, 4, parse_uint }, 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "inodes_per_group", &set_sb.s_inodes_per_group, 4, parse_uint }, 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "mtime", &set_sb.s_mtime, 4, parse_time }, 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "wtime", &set_sb.s_wtime, 4, parse_time }, 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "mnt_count", &set_sb.s_mnt_count, 2, parse_uint }, 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "max_mnt_count", &set_sb.s_max_mnt_count, 2, parse_int }, 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* s_magic */ 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "state", &set_sb.s_state, 2, parse_uint }, 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "errors", &set_sb.s_errors, 2, parse_uint }, 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "minor_rev_level", &set_sb.s_minor_rev_level, 2, parse_uint }, 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "lastcheck", &set_sb.s_lastcheck, 4, parse_time }, 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "checkinterval", &set_sb.s_checkinterval, 4, parse_uint }, 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "creator_os", &set_sb.s_creator_os, 4, parse_uint }, 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "rev_level", &set_sb.s_rev_level, 4, parse_uint }, 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "def_resuid", &set_sb.s_def_resuid, 2, parse_uint }, 9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "def_resgid", &set_sb.s_def_resgid, 2, parse_uint }, 9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "first_ino", &set_sb.s_first_ino, 4, parse_uint }, 9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "inode_size", &set_sb.s_inode_size, 2, parse_uint }, 9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "block_group_nr", &set_sb.s_block_group_nr, 2, parse_uint }, 9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "feature_compat", &set_sb.s_feature_compat, 4, parse_uint }, 9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "feature_incompat", &set_sb.s_feature_incompat, 4, parse_uint }, 1003984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt { "feature_ro_compat", &set_sb.s_feature_ro_compat, 4, parse_uint }, 10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "uuid", &set_sb.s_uuid, 16, parse_uuid }, 10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "volume_name", &set_sb.s_volume_name, 16, parse_string }, 10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "last_mounted", &set_sb.s_last_mounted, 64, parse_string }, 10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "lastcheck", &set_sb.s_lastcheck, 4, parse_uint }, 1053984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt { "algorithm_usage_bitmap", &set_sb.s_algorithm_usage_bitmap, 10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4, parse_uint }, 10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "prealloc_blocks", &set_sb.s_prealloc_blocks, 1, parse_uint }, 10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "prealloc_dir_blocks", &set_sb.s_prealloc_dir_blocks, 1, 10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project parse_uint }, 11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "reserved_gdt_blocks", &set_sb.s_reserved_gdt_blocks, 2, 11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project parse_uint }, 11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "journal_uuid", &set_sb.s_journal_uuid, 16, parse_uuid }, 11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "journal_inum", &set_sb.s_journal_inum, 4, parse_uint }, 11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "journal_dev", &set_sb.s_journal_dev, 4, parse_uint }, 11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "last_orphan", &set_sb.s_last_orphan, 4, parse_uint }, 11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "hash_seed", &set_sb.s_hash_seed, 16, parse_uuid }, 11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "def_hash_version", &set_sb.s_def_hash_version, 1, parse_hashalg }, 11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "jnl_backup_type", &set_sb.s_jnl_backup_type, 1, parse_uint }, 11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "desc_size", &set_sb.s_desc_size, 2, parse_uint }, 12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "default_mount_opts", &set_sb.s_default_mount_opts, 4, parse_uint }, 12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "first_meta_bg", &set_sb.s_first_meta_bg, 4, parse_uint }, 12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "mkfs_time", &set_sb.s_mkfs_time, 4, parse_time }, 1233984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt { "jnl_blocks", &set_sb.s_jnl_blocks[0], 4, parse_uint, FLAG_ARRAY, 12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17 }, 12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "blocks_count_hi", &set_sb.s_blocks_count_hi, 4, parse_uint }, 12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "r_blocks_count_hi", &set_sb.s_r_blocks_count_hi, 4, parse_uint }, 12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "min_extra_isize", &set_sb.s_min_extra_isize, 2, parse_uint }, 12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "want_extra_isize", &set_sb.s_want_extra_isize, 2, parse_uint }, 12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "flags", &set_sb.s_flags, 4, parse_uint }, 13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "raid_stride", &set_sb.s_raid_stride, 2, parse_uint }, 13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "min_extra_isize", &set_sb.s_min_extra_isize, 4, parse_uint }, 13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "mmp_interval", &set_sb.s_mmp_interval, 2, parse_uint }, 13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "mmp_block", &set_sb.s_mmp_block, 8, parse_uint }, 13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "raid_stripe_width", &set_sb.s_raid_stripe_width, 4, parse_uint }, 1353984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt { "log_groups_per_flex", &set_sb.s_log_groups_per_flex, 1, parse_uint }, 1363984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt { "kbytes_written", &set_sb.s_kbytes_written, 8, parse_uint }, 13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { 0, 0, 0, 0 } 13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}; 13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic struct field_set_info inode_fields[] = { 14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "inodes_count", &set_sb.s_inodes_count, 4, parse_uint }, 14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "mode", &set_inode.i_mode, 2, parse_uint }, 14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "uid", &set_inode.i_uid, 2, parse_uint }, 14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "size", &set_inode.i_size, 4, parse_uint }, 14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "atime", &set_inode.i_atime, 4, parse_time }, 14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "ctime", &set_inode.i_ctime, 4, parse_time }, 14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "mtime", &set_inode.i_mtime, 4, parse_time }, 14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "dtime", &set_inode.i_dtime, 4, parse_time }, 14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "gid", &set_inode.i_gid, 2, parse_uint }, 15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "links_count", &set_inode.i_links_count, 2, parse_uint }, 15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "blocks", &set_inode.i_blocks, 4, parse_uint }, 15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "flags", &set_inode.i_flags, 4, parse_uint }, 15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "version", &set_inode.osd1.linux1.l_i_version, 4, parse_uint }, 15419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "translator", &set_inode.osd1.hurd1.h_i_translator, 4, parse_uint }, 1553984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt { "block", &set_inode.i_block[0], 4, parse_uint, FLAG_ARRAY, 15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_NDIR_BLOCKS }, 15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "block[IND]", &set_inode.i_block[EXT2_IND_BLOCK], 4, parse_uint }, 15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "block[DIND]", &set_inode.i_block[EXT2_DIND_BLOCK], 4, parse_uint }, 15919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "block[TIND]", &set_inode.i_block[EXT2_TIND_BLOCK], 4, parse_uint }, 16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "generation", &set_inode.i_generation, 4, parse_uint }, 16119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "file_acl", &set_inode.i_file_acl, 4, parse_uint }, 1623984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt { "file_acl_high", &set_inode.osd2.linux2.l_i_file_acl_high, 2, 1633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt parse_uint }, 16419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "dir_acl", &set_inode.i_dir_acl, 4, parse_uint }, 16519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "size_high", &set_inode.i_size_high, 4, parse_uint }, 16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "faddr", &set_inode.i_faddr, 4, parse_uint }, 16719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "blocks_hi", &set_inode.osd2.linux2.l_i_blocks_hi, 2, parse_uint }, 16819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "frag", &set_inode.osd2.hurd2.h_i_frag, 1, parse_uint }, 16919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "fsize", &set_inode.osd2.hurd2.h_i_fsize, 1, parse_uint }, 17019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "uid_high", &set_inode.osd2.linux2.l_i_uid_high, 2, parse_uint }, 17119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "gid_high", &set_inode.osd2.linux2.l_i_gid_high, 2, parse_uint }, 17219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "author", &set_inode.osd2.hurd2.h_i_author, 4, parse_uint }, 17319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "bmap", NULL, 4, parse_bmap, FLAG_ARRAY }, 17419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { 0, 0, 0, 0 } 17519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}; 17619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic struct field_set_info ext2_bg_fields[] = { 17819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "block_bitmap", &set_gd.bg_block_bitmap, 4, parse_uint }, 17919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "inode_bitmap", &set_gd.bg_inode_bitmap, 4, parse_uint }, 18019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "inode_table", &set_gd.bg_inode_table, 4, parse_uint }, 18119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "free_blocks_count", &set_gd.bg_free_blocks_count, 2, parse_uint }, 18219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "free_inodes_count", &set_gd.bg_free_inodes_count, 2, parse_uint }, 18319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "used_dirs_count", &set_gd.bg_used_dirs_count, 2, parse_uint }, 18419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "flags", &set_gd.bg_flags, 2, parse_uint }, 18519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "reserved", &set_gd.bg_reserved, 2, parse_uint, FLAG_ARRAY, 2 }, 18619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { "itable_unused", &set_gd.bg_itable_unused, 2, parse_uint }, 1873984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt { "checksum", &set_gd.bg_checksum, 2, parse_gd_csum }, 18819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { 0, 0, 0, 0 } 18919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}; 19019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 19119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 19219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic struct field_set_info *find_field(struct field_set_info *fields, 19319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *field) 19419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 19519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct field_set_info *ss; 19619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *prefix; 19719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *arg, *delim, *idx, *tmp; 19819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int prefix_len; 19919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 20019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fields == super_fields) 20119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project prefix = "s_"; 20219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (fields == inode_fields) 20319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project prefix = "i_"; 20419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 20519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project prefix = "bg_"; 20619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project prefix_len = strlen(prefix); 20719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (strncmp(field, prefix, prefix_len) == 0) 20819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project field += prefix_len; 20919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 21019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project arg = malloc(strlen(field)+1); 21119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!arg) 21219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return NULL; 21319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strcpy(arg, field); 21419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 21519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project idx = strchr(arg, '['); 21619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (idx) { 21719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *idx++ = 0; 21819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project delim = idx + strlen(idx) - 1; 21919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!*idx || *delim != ']') 22019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project idx = 0; 22119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 22219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *delim = 0; 22319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 2243984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt /* 22519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Can we parse the number? 22619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 22719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (idx) { 22819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project array_idx = strtol(idx, &tmp, 0); 22919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*tmp) 23019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project idx = 0; 23119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 23219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 23319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (ss = fields ; ss->name ; ss++) { 23419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ss->flags & FLAG_ARRAY) { 23519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!idx || (strcmp(ss->name, arg) != 0)) 23619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project continue; 23719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ss->max_idx > 0 && array_idx >= ss->max_idx) 23819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project continue; 23919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 24019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (strcmp(ss->name, field) != 0) 24119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project continue; 24219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 2433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt free(arg); 24419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return ss; 24519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 2463984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt free(arg); 24719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return NULL; 24819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 24919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 25019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t parse_uint(struct field_set_info *info, char *arg) 25119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 25219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long long num, limit; 25319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *tmp; 25419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project union { 25519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __u64 *ptr64; 25619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __u32 *ptr32; 25719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __u16 *ptr16; 25819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __u8 *ptr8; 25919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } u; 26019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 26119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project u.ptr8 = (__u8 *) info->ptr; 26219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (info->flags & FLAG_ARRAY) 26319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project u.ptr8 += array_idx * info->size; 26419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 26519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errno = 0; 26619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project num = STRTOULL(arg, &tmp, 0); 26719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*tmp || errno) { 26819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "Couldn't parse '%s' for field %s.\n", 26919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project arg, info->name); 27019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EINVAL; 27119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 27219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project limit = ~0ULL >> ((8 - info->size) * 8); 27319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (num > limit) { 27419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "Value '%s' exceeds field %s maximum %llu.\n", 27519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project arg, info->name, limit); 27619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EINVAL; 27719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 27819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project switch (info->size) { 27919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 8: 28019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *u.ptr64 = num; 28119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 28219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 4: 28319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *u.ptr32 = num; 28419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 28519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 2: 28619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *u.ptr16 = num; 28719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 28819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 1: 28919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *u.ptr8 = num; 29019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 29119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 29219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 29319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 29419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 29519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t parse_int(struct field_set_info *info, char *arg) 29619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 29719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project long num; 29819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *tmp; 29919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __s32 *ptr32; 30019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __s16 *ptr16; 30119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __s8 *ptr8; 30219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 30319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project num = strtol(arg, &tmp, 0); 30419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*tmp) { 30519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "Couldn't parse '%s' for field %s.\n", 30619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project arg, info->name); 30719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EINVAL; 30819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 30919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project switch (info->size) { 31019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 4: 31119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ptr32 = (__s32 *) info->ptr; 31219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *ptr32 = num; 31319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 31419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 2: 31519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ptr16 = (__s16 *) info->ptr; 31619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *ptr16 = num; 31719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 31819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 1: 31919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ptr8 = (__s8 *) info->ptr; 32019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *ptr8 = num; 32119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 32219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 32319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 32419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 32519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 32619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t parse_string(struct field_set_info *info, char *arg) 32719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 32819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *cp = (char *) info->ptr; 32919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 33019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (strlen(arg) >= info->size) { 33119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "Error maximum size for %s is %d.\n", 33219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project info->name, info->size); 33319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EINVAL; 33419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 33519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strcpy(cp, arg); 33619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 33719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 33819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 33919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t parse_time(struct field_set_info *info, char *arg) 34019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 34119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project time_t t; 34219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __u32 *ptr32; 34319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 34419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ptr32 = (__u32 *) info->ptr; 34519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 34619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project t = string_to_time(arg); 34719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 34819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (t == ((time_t) -1)) { 34919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "Couldn't parse '%s' for field %s.\n", 35019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project arg, info->name); 35119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EINVAL; 35219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 35319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *ptr32 = t; 35419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 35519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 35619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 35719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t parse_uuid(struct field_set_info *info, char *arg) 35819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 35919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned char * p = (unsigned char *) info->ptr; 3603984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 36119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((strcasecmp(arg, "null") == 0) || 36219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (strcasecmp(arg, "clear") == 0)) { 36319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project uuid_clear(p); 36419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else if (strcasecmp(arg, "time") == 0) { 36519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project uuid_generate_time(p); 36619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else if (strcasecmp(arg, "random") == 0) { 36719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project uuid_generate(p); 36819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else if (uuid_parse(arg, p)) { 36919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "Invalid UUID format: %s\n", arg); 37019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EINVAL; 37119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 37219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 37319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 37419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 37519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t parse_hashalg(struct field_set_info *info, char *arg) 37619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 37719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int hashv; 37819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned char *p = (unsigned char *) info->ptr; 37919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 38019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project hashv = e2p_string2hash(arg); 38119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (hashv < 0) { 38219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "Invalid hash algorithm: %s\n", arg); 38319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EINVAL; 38419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 38519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *p = hashv; 38619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 38719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 38819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 38919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t parse_bmap(struct field_set_info *info, char *arg) 39019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 39119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long num; 39219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t blk; 39319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 39419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *tmp; 39519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 39619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project num = strtoul(arg, &tmp, 0); 39719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*tmp) { 39819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "Couldn't parse '%s' for field %s.\n", 39919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project arg, info->name); 40019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EINVAL; 40119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 40219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk = num; 40319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4043984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt retval = ext2fs_bmap(current_fs, set_ino, &set_inode, 0, BMAP_SET, 40519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project array_idx, &blk); 40619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 40719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("set_inode", retval, "while setting block map"); 40819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 40919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 41019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 41119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4123984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtstatic errcode_t parse_gd_csum(struct field_set_info *info, char *arg) 4133984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 4143984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 4153984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (strcmp(arg, "calc") == 0) { 4163984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_group_desc_csum_set(current_fs, set_bg); 4173984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt set_gd = current_fs->group_desc[set_bg]; 4183984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("Checksum set to 0x%04x\n", 4193984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt current_fs->group_desc[set_bg].bg_checksum); 4203984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return 0; 4213984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 4223984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 4233984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return parse_uint(info, arg); 4243984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 42519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 42619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void print_possible_fields(struct field_set_info *fields) 42719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 42819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct field_set_info *ss; 42919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *type, *cmd; 43019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project FILE *f; 43119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char name[40], idx[40]; 43219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 43319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fields == super_fields) { 43419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project type = "Superblock"; 43519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cmd = "set_super_value"; 43619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else if (fields == inode_fields) { 43719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project type = "Inode"; 43819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cmd = "set_inode"; 43919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 44019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project type = "Block group descriptor"; 44119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cmd = "set_block_group"; 44219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 44319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project f = open_pager(); 44419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 44519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(f, "%s fields supported by the %s command:\n", type, cmd); 44619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 44719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (ss = fields ; ss->name ; ss++) { 44819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project type = "unknown"; 44919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ss->func == parse_string) 45019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project type = "string"; 45119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (ss->func == parse_int) 45219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project type = "integer"; 45319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (ss->func == parse_uint) 45419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project type = "unsigned integer"; 45519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (ss->func == parse_uuid) 45619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project type = "UUID"; 45719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (ss->func == parse_hashalg) 45819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project type = "hash algorithm"; 45919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (ss->func == parse_time) 46019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project type = "date/time"; 46119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (ss->func == parse_bmap) 46219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project type = "set physical->logical block map"; 46319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strcpy(name, ss->name); 46419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ss->flags & FLAG_ARRAY) { 4653984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (ss->max_idx > 0) 46619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sprintf(idx, "[%d]", ss->max_idx); 46719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 46819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strcpy(idx, "[]"); 46919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strcat(name, idx); 47019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 47119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(f, "\t%-20s\t%s\n", name, type); 47219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 47319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close_pager(f); 47419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 47519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 47619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 47719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_set_super(int argc, char *argv[]) 47819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 47919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *usage = "<field> <value>\n" 48019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "\t\"set_super_value -l\" will list the names of " 48119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "superblock fields\n\twhich can be set."; 48219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project static struct field_set_info *ss; 4833984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 48419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((argc == 2) && !strcmp(argv[1], "-l")) { 48519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_possible_fields(super_fields); 48619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 48719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 48819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 48919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_args_process(argc, argv, 3, 3, "set_super_value", 49019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project usage, CHECK_FS_RW)) 49119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 49219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 49319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((ss = find_field(super_fields, argv[1])) == 0) { 49419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "invalid field specifier: %s", argv[1]); 49519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 49619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 49719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project set_sb = *current_fs->super; 49819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ss->func(ss, argv[2]) == 0) { 49919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *current_fs->super = set_sb; 50019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_super_dirty(current_fs); 50119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 50219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 50319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 50419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_set_inode(int argc, char *argv[]) 50519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 50619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *usage = "<inode> <field> <value>\n" 50719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "\t\"set_inode_field -l\" will list the names of " 50819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "the fields in an ext2 inode\n\twhich can be set."; 50919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project static struct field_set_info *ss; 5103984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 51119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((argc == 2) && !strcmp(argv[1], "-l")) { 51219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_possible_fields(inode_fields); 51319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 51419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 51519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 51619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_args_process(argc, argv, 4, 4, "set_inode", 51719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project usage, CHECK_FS_RW)) 51819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 51919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 52019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((ss = find_field(inode_fields, argv[2])) == 0) { 52119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "invalid field specifier: %s", argv[2]); 52219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 52319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 52419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 52519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project set_ino = string_to_inode(argv[1]); 52619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!set_ino) 52719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 52819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 52919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_read_inode(set_ino, &set_inode, argv[1])) 53019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 53119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 53219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ss->func(ss, argv[3]) == 0) { 53319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (debugfs_write_inode(set_ino, &set_inode, argv[1])) 53419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 53519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 53619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 53719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 53819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_set_block_group_descriptor(int argc, char *argv[]) 53919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 54019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *usage = "<bg number> <field> <value>\n" 54119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "\t\"set_block_group_descriptor -l\" will list the names of " 54219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "the fields in a block group descriptor\n\twhich can be set."; 54319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct field_set_info *ss; 54419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *end; 54519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 54619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((argc == 2) && !strcmp(argv[1], "-l")) { 54719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_possible_fields(ext2_bg_fields); 54819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 54919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 55019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 55119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (common_args_process(argc, argv, 4, 4, "set_block_group_descriptor", 55219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project usage, CHECK_FS_RW)) 55319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 55419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 55519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project set_bg = strtoul(argv[1], &end, 0); 55619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*end) { 55719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "invalid block group number: %s", argv[1]); 55819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 55919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 56019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 56119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (set_bg >= current_fs->group_desc_count) { 56219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "block group number too big: %d", set_bg); 56319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 56419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 56519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 56619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 56719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((ss = find_field(ext2_bg_fields, argv[2])) == 0) { 56819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], 0, "invalid field specifier: %s", argv[2]); 56919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 57019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 57119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 57219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project set_gd = current_fs->group_desc[set_bg]; 57319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 57419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ss->func(ss, argv[3]) == 0) { 57519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project current_fs->group_desc[set_bg] = set_gd; 57619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_super_dirty(current_fs); 57719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 57819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 579