1671cd2188e2f224aaeac4955785199f228235719Ken Sumrall/*
2671cd2188e2f224aaeac4955785199f228235719Ken Sumrall * Copyright (C) 2010 The Android Open Source Project
3671cd2188e2f224aaeac4955785199f228235719Ken Sumrall *
4671cd2188e2f224aaeac4955785199f228235719Ken Sumrall * Licensed under the Apache License, Version 2.0 (the "License");
5671cd2188e2f224aaeac4955785199f228235719Ken Sumrall * you may not use this file except in compliance with the License.
6671cd2188e2f224aaeac4955785199f228235719Ken Sumrall * You may obtain a copy of the License at
7671cd2188e2f224aaeac4955785199f228235719Ken Sumrall *
8671cd2188e2f224aaeac4955785199f228235719Ken Sumrall *      http://www.apache.org/licenses/LICENSE-2.0
9671cd2188e2f224aaeac4955785199f228235719Ken Sumrall *
10671cd2188e2f224aaeac4955785199f228235719Ken Sumrall * Unless required by applicable law or agreed to in writing, software
11671cd2188e2f224aaeac4955785199f228235719Ken Sumrall * distributed under the License is distributed on an "AS IS" BASIS,
12671cd2188e2f224aaeac4955785199f228235719Ken Sumrall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13671cd2188e2f224aaeac4955785199f228235719Ken Sumrall * See the License for the specific language governing permissions and
14671cd2188e2f224aaeac4955785199f228235719Ken Sumrall * limitations under the License.
15671cd2188e2f224aaeac4955785199f228235719Ken Sumrall */
16671cd2188e2f224aaeac4955785199f228235719Ken Sumrall
17671cd2188e2f224aaeac4955785199f228235719Ken Sumrall#include <unistd.h>
18671cd2188e2f224aaeac4955785199f228235719Ken Sumrall#include <libgen.h>
19671cd2188e2f224aaeac4955785199f228235719Ken Sumrall#include <stdio.h>
20671cd2188e2f224aaeac4955785199f228235719Ken Sumrall#include <stdlib.h>
21671cd2188e2f224aaeac4955785199f228235719Ken Sumrall#include "ext4fixup.h"
22671cd2188e2f224aaeac4955785199f228235719Ken Sumrall
23671cd2188e2f224aaeac4955785199f228235719Ken Sumrallstatic void usage(char *me)
24671cd2188e2f224aaeac4955785199f228235719Ken Sumrall{
25671cd2188e2f224aaeac4955785199f228235719Ken Sumrall    fprintf(stderr, "%s: usage: %s [-vn] <image or block device>\n", me, me);
26671cd2188e2f224aaeac4955785199f228235719Ken Sumrall}
27671cd2188e2f224aaeac4955785199f228235719Ken Sumrall
28671cd2188e2f224aaeac4955785199f228235719Ken Sumrallint main(int argc, char **argv)
29671cd2188e2f224aaeac4955785199f228235719Ken Sumrall{
30671cd2188e2f224aaeac4955785199f228235719Ken Sumrall    int opt;
31671cd2188e2f224aaeac4955785199f228235719Ken Sumrall    int verbose = 0;
32671cd2188e2f224aaeac4955785199f228235719Ken Sumrall    int no_write = 0;
33671cd2188e2f224aaeac4955785199f228235719Ken Sumrall    char *fsdev;
34671cd2188e2f224aaeac4955785199f228235719Ken Sumrall    char *me;
357e5ff13c55eb29748c07768bd7134819cbcbd4b0Ken Sumrall    int stop_phase = 0, stop_loc = 0, stop_count = 0;
36671cd2188e2f224aaeac4955785199f228235719Ken Sumrall
37671cd2188e2f224aaeac4955785199f228235719Ken Sumrall    me = basename(argv[0]);
38671cd2188e2f224aaeac4955785199f228235719Ken Sumrall
397e5ff13c55eb29748c07768bd7134819cbcbd4b0Ken Sumrall    while ((opt = getopt(argc, argv, "vnd:")) != -1) {
40671cd2188e2f224aaeac4955785199f228235719Ken Sumrall        switch (opt) {
41671cd2188e2f224aaeac4955785199f228235719Ken Sumrall        case 'v':
42671cd2188e2f224aaeac4955785199f228235719Ken Sumrall            verbose = 1;
43671cd2188e2f224aaeac4955785199f228235719Ken Sumrall            break;
44671cd2188e2f224aaeac4955785199f228235719Ken Sumrall        case 'n':
45671cd2188e2f224aaeac4955785199f228235719Ken Sumrall            no_write = 1;
46671cd2188e2f224aaeac4955785199f228235719Ken Sumrall            break;
477e5ff13c55eb29748c07768bd7134819cbcbd4b0Ken Sumrall        case 'd':
487e5ff13c55eb29748c07768bd7134819cbcbd4b0Ken Sumrall            sscanf(optarg, "%d,%d,%d", &stop_phase, &stop_loc, &stop_count);
497e5ff13c55eb29748c07768bd7134819cbcbd4b0Ken Sumrall            break;
50671cd2188e2f224aaeac4955785199f228235719Ken Sumrall        }
51671cd2188e2f224aaeac4955785199f228235719Ken Sumrall    }
52671cd2188e2f224aaeac4955785199f228235719Ken Sumrall
53671cd2188e2f224aaeac4955785199f228235719Ken Sumrall    if (optind >= argc) {
54671cd2188e2f224aaeac4955785199f228235719Ken Sumrall        fprintf(stderr, "expected image or block device after options\n");
55671cd2188e2f224aaeac4955785199f228235719Ken Sumrall        usage(me);
56671cd2188e2f224aaeac4955785199f228235719Ken Sumrall        exit(EXIT_FAILURE);
57671cd2188e2f224aaeac4955785199f228235719Ken Sumrall    }
58671cd2188e2f224aaeac4955785199f228235719Ken Sumrall
59671cd2188e2f224aaeac4955785199f228235719Ken Sumrall    fsdev = argv[optind++];
60671cd2188e2f224aaeac4955785199f228235719Ken Sumrall
61671cd2188e2f224aaeac4955785199f228235719Ken Sumrall    if (optind < argc) {
62671cd2188e2f224aaeac4955785199f228235719Ken Sumrall        fprintf(stderr, "Unexpected argument: %s\n", argv[optind]);
63671cd2188e2f224aaeac4955785199f228235719Ken Sumrall        usage(me);
64671cd2188e2f224aaeac4955785199f228235719Ken Sumrall        exit(EXIT_FAILURE);
65671cd2188e2f224aaeac4955785199f228235719Ken Sumrall    }
66671cd2188e2f224aaeac4955785199f228235719Ken Sumrall
677e5ff13c55eb29748c07768bd7134819cbcbd4b0Ken Sumrall    return ext4fixup_internal(fsdev, verbose, no_write, stop_phase, stop_loc, stop_count);
68671cd2188e2f224aaeac4955785199f228235719Ken Sumrall}
69