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