15a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner/* 25a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner * Copyright (C) 2010 The Android Open Source Project 35a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner * 45a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner * Licensed under the Apache License, Version 2.0 (the "License"); 55a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner * you may not use this file except in compliance with the License. 65a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner * You may obtain a copy of the License at 75a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner * 85a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner * http://www.apache.org/licenses/LICENSE-2.0 95a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner * 105a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner * Unless required by applicable law or agreed to in writing, software 115a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner * distributed under the License is distributed on an "AS IS" BASIS, 125a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner * See the License for the specific language governing permissions and 145a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner * limitations under the License. 155a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner */ 165a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 175a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner#include <unistd.h> 185a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner#include <libgen.h> 195a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner#include <stdio.h> 205a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner#include <stdlib.h> 215a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner#include "ext4fixup.h" 225a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 235a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerstatic void usage(char *me) 245a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner{ 255a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner fprintf(stderr, "%s: usage: %s [-vn] <image or block device>\n", me, me); 265a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner} 275a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 285a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerint main(int argc, char **argv) 295a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner{ 305a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner int opt; 315a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner int verbose = 0; 325a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner int no_write = 0; 335a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner char *fsdev; 345a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner char *me; 355a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner int stop_phase = 0, stop_loc = 0, stop_count = 0; 365a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 375a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner me = basename(argv[0]); 385a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 395a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner while ((opt = getopt(argc, argv, "vnd:")) != -1) { 405a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner switch (opt) { 415a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner case 'v': 425a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner verbose = 1; 435a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner break; 445a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner case 'n': 455a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner no_write = 1; 465a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner break; 475a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner case 'd': 485a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner sscanf(optarg, "%d,%d,%d", &stop_phase, &stop_loc, &stop_count); 495a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner break; 505a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner } 515a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner } 525a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 535a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner if (optind >= argc) { 545a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner fprintf(stderr, "expected image or block device after options\n"); 555a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner usage(me); 565a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner exit(EXIT_FAILURE); 575a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner } 585a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 595a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner fsdev = argv[optind++]; 605a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 615a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner if (optind < argc) { 625a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner fprintf(stderr, "Unexpected argument: %s\n", argv[optind]); 635a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner usage(me); 645a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner exit(EXIT_FAILURE); 655a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner } 665a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 675a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner return ext4fixup_internal(fsdev, verbose, no_write, stop_phase, stop_loc, stop_count); 685a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner} 69