⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fastboot.c

📁 Android 一些工具
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) 2008 The Android Open Source Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: *  * Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. *  * Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the  *    distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#include <string.h>#include <errno.h>#include <fcntl.h>#include <unistd.h>#include <limits.h>#include <ctype.h>#include <sys/time.h>#include <bootimg.h>#include <zipfile/zipfile.h>#include "fastboot.h"static usb_handle *usb = 0;static const char *serial = 0;static const char *product = 0;static const char *cmdline = 0;static int wipe_data = 0;void die(const char *fmt, ...){    va_list ap;    va_start(ap, fmt);    fprintf(stderr,"error: ");    vfprintf(stderr, fmt, ap);    fprintf(stderr,"\n");    va_end(ap);    exit(1);}    void get_my_path(char *path);char *find_item(const char *item, const char *product){    char *dir;    char *fn;    char path[PATH_MAX + 128];    if(!strcmp(item,"boot")) {        fn = "boot.img";    } else if(!strcmp(item,"recovery")) {        fn = "recovery.img";    } else if(!strcmp(item,"system")) {        fn = "system.img";    } else if(!strcmp(item,"userdata")) {        fn = "userdata.img";    } else if(!strcmp(item,"info")) {        fn = "android-info.txt";    } else {        fprintf(stderr,"unknown partition '%s'\n", item);        return 0;    }    if(product) {        get_my_path(path);        sprintf(path + strlen(path),                "../../../target/product/%s/%s", product, fn);        return strdup(path);    }            dir = getenv("ANDROID_PRODUCT_OUT");    if((dir == 0) || (dir[0] == 0)) {        die("neither -p product specified nor ANDROID_PRODUCT_OUT set");        return 0;    }        sprintf(path, "%s/%s", dir, fn);    return strdup(path);}#ifdef _WIN32void *load_file(const char *fn, unsigned *_sz);#elsevoid *load_file(const char *fn, unsigned *_sz){    char *data;    int sz;    int fd;    data = 0;    fd = open(fn, O_RDONLY);    if(fd < 0) return 0;    sz = lseek(fd, 0, SEEK_END);    if(sz < 0) goto oops;    if(lseek(fd, 0, SEEK_SET) != 0) goto oops;    data = (char*) malloc(sz);    if(data == 0) goto oops;    if(read(fd, data, sz) != sz) goto oops;    close(fd);    if(_sz) *_sz = sz;    return data;oops:    close(fd);    if(data != 0) free(data);    return 0;}#endifint match_fastboot(usb_ifc_info *info){    if((info->dev_vendor != 0x18d1) &&       (info->dev_vendor != 0x0bb4)) return -1;    if(info->ifc_class != 0xff) return -1;    if(info->ifc_subclass != 0x42) return -1;    if(info->ifc_protocol != 0x03) return -1;    // require matching serial number if a serial number is specified    // at the command line with the -s option.    if (serial && strcmp(serial, info->serial_number) != 0) return -1;    return 0;}int list_devices_callback(usb_ifc_info *info){    if (match_fastboot(info) == 0) {        char* serial = info->serial_number;        if (!serial[0]) {            serial = "????????????";        }        // output compatible with "adb devices"        printf("%s\tfastboot\n", serial);    }    return -1;}usb_handle *open_device(void){    static usb_handle *usb = 0;    int announce = 1;    if(usb) return usb;        for(;;) {        usb = usb_open(match_fastboot);        if(usb) return usb;        if(announce) {            announce = 0;                fprintf(stderr,"< waiting for device >\n");        }        sleep(1);    }}void list_devices(void) {    // We don't actually open a USB device here,    // just getting our callback called so we can    // list all the connected devices.    usb_open(list_devices_callback);}void usage(void){    fprintf(stderr,/*           1234567890123456789012345678901234567890123456789012345678901234567890123456 */            "usage: fastboot [ <option> ] <command>\n"            "\n"            "commands:\n"            "  update <filename>                        reflash device from update.zip\n"            "  flashall                                 'flash boot' + 'flash system'\n"            "  flash <partition> [ <filename> ]         write a file to a flash partition\n"            "  erase <partition>                        erase a flash partition\n"            "  getvar <variable>                        display a bootloader variable\n"            "  boot <kernel> [ <ramdisk> ]              download and boot kernel\n"            "  flash:raw boot <kernel> [ <ramdisk> ]    create bootimage and flash it\n"            "  devices                                  list all connected devices\n"            "  reboot                                   reboot device normally\n"            "  reboot-bootloader                        reboot device into bootloader\n"            "\n"            "options:\n"            "  -w                                       erase userdata and cache\n"            "  -s <serial number>                       specify device serial number\n"            "  -p <product>                             specify product name\n"            "  -c <cmdline>                             override kernel commandline\n"        );    exit(1);}void *load_bootable_image(const char *kernel, const char *ramdisk,                           unsigned *sz, const char *cmdline){    void *kdata = 0, *rdata = 0;    unsigned ksize = 0, rsize = 0;    void *bdata;    unsigned bsize;    if(kernel == 0) {        fprintf(stderr, "no image specified\n");        return 0;    }    kdata = load_file(kernel, &ksize);    if(kdata == 0) {        fprintf(stderr, "cannot load '%s'\n", kernel);        return 0;    }            /* is this actually a boot image? */    if(!memcmp(kdata, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {        if(cmdline) bootimg_set_cmdline((boot_img_hdr*) kdata, cmdline);                if(ramdisk) {            fprintf(stderr, "cannot boot a boot.img *and* ramdisk\n");            return 0;        }                *sz = ksize;        return kdata;    }    if(ramdisk) {        rdata = load_file(ramdisk, &rsize);        if(rdata == 0) {            fprintf(stderr,"cannot load '%s'\n", ramdisk);            return  0;        }    }    fprintf(stderr,"creating boot image...\n");    bdata = mkbootimg(kdata, ksize, rdata, rsize, 0, 0, 2048, &bsize);    if(bdata == 0) {        fprintf(stderr,"failed to create boot.img\n");        return 0;    }    if(cmdline) bootimg_set_cmdline((boot_img_hdr*) bdata, cmdline);    fprintf(stderr,"creating boot image - %d bytes\n", bsize);    *sz = bsize;        return bdata;}void *unzip_file(zipfile_t zip, const char *name, unsigned *sz){    void *data;    zipentry_t entry;    unsigned datasz;        entry = lookup_zipentry(zip, name);    if (entry == NULL) {        fprintf(stderr, "archive does not contain '%s'\n", name);        return 0;    }    *sz = get_zipentry_size(entry);    datasz = *sz * 1.001;    data = malloc(datasz);    if(data == 0) {        fprintf(stderr, "failed to allocate %d bytes\n", *sz);        return 0;    }    if (decompress_zipentry(entry, data, datasz)) {        fprintf(stderr, "failed to unzip '%s' from archive\n", name);        free(data);        return 0;    }    return data;}static char *strip(char *s){    int n;    while(*s && isspace(*s)) s++;    n = strlen(s);    while(n-- > 0) {        if(!isspace(s[n])) break;        s[n] = 0;    }    return s;}#define MAX_OPTIONS 32static int setup_requirement_line(char *name){    char *val[MAX_OPTIONS];    const char **out;    unsigned n, count;    char *x;    int invert = 0;        if (!strncmp(name, "reject ", 7)) {        name += 7;        invert = 1;    } else if (!strncmp(name, "require ", 8)) {        name += 8;        invert = 0;    }    x = strchr(name, '=');    if (x == 0) return 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -