📄 fastboot.c
字号:
*x = 0; val[0] = x + 1; for(count = 1; count < MAX_OPTIONS; count++) { x = strchr(val[count - 1],'|'); if (x == 0) break; *x = 0; val[count] = x + 1; } name = strip(name); for(n = 0; n < count; n++) val[n] = strip(val[n]); name = strip(name); if (name == 0) return -1; /* work around an unfortunate name mismatch */ if (!strcmp(name,"board")) name = "product"; out = malloc(sizeof(char*) * count); if (out == 0) return -1; for(n = 0; n < count; n++) { out[n] = strdup(strip(val[n])); if (out[n] == 0) return -1; } fb_queue_require(name, invert, n, out); return 0;}static void setup_requirements(char *data, unsigned sz){ char *s; s = data; while (sz-- > 0) { if(*s == '\n') { *s++ = 0; if (setup_requirement_line(data)) { die("out of memory"); } data = s; } else { s++; } }}void queue_info_dump(void){ fb_queue_notice("--------------------------------------------"); fb_queue_display("version-bootloader", "Bootloader Version..."); fb_queue_display("version-baseband", "Baseband Version....."); fb_queue_display("serialno", "Serial Number........"); fb_queue_notice("--------------------------------------------");}void do_update_signature(zipfile_t zip, char *fn){ void *data; unsigned sz; data = unzip_file(zip, fn, &sz); if (data == 0) return; fb_queue_download("signature", data, sz); fb_queue_command("signature", "installing signature");}void do_update(char *fn){ void *zdata; unsigned zsize; void *data; unsigned sz; zipfile_t zip; queue_info_dump(); zdata = load_file(fn, &zsize); if (zdata == 0) die("failed to load '%s'", fn); zip = init_zipfile(zdata, zsize); if(zip == 0) die("failed to access zipdata in '%s'"); data = unzip_file(zip, "android-info.txt", &sz); if (data == 0) { char *tmp; /* fallback for older zipfiles */ data = unzip_file(zip, "android-product.txt", &sz); if ((data == 0) || (sz < 1)) { die("update package has no android-info.txt or android-product.txt"); } tmp = malloc(sz + 128); if (tmp == 0) die("out of memory"); sprintf(tmp,"board=%sversion-baseband=0.66.04.19\n",(char*)data); data = tmp; sz = strlen(tmp); } setup_requirements(data, sz); data = unzip_file(zip, "boot.img", &sz); if (data == 0) die("update package missing boot.img"); do_update_signature(zip, "boot.sig"); fb_queue_flash("boot", data, sz); data = unzip_file(zip, "recovery.img", &sz); if (data != 0) { do_update_signature(zip, "recovery.sig"); fb_queue_flash("recovery", data, sz); } data = unzip_file(zip, "system.img", &sz); if (data == 0) die("update package missing system.img"); do_update_signature(zip, "system.sig"); fb_queue_flash("system", data, sz);}void do_send_signature(char *fn){ void *data; unsigned sz; char *xtn; xtn = strrchr(fn, '.'); if (!xtn) return; if (strcmp(xtn, ".img")) return; strcpy(xtn,".sig"); data = load_file(fn, &sz); strcpy(xtn,".img"); if (data == 0) return; fb_queue_download("signature", data, sz); fb_queue_command("signature", "installing signature");}void do_flashall(void){ char *fname; void *data; unsigned sz; queue_info_dump(); fname = find_item("info", product); if (fname == 0) die("cannot find android-info.txt"); data = load_file(fname, &sz); if (data == 0) die("could not load android-info.txt"); setup_requirements(data, sz); fname = find_item("boot", product); data = load_file(fname, &sz); if (data == 0) die("could not load boot.img"); do_send_signature(fname); fb_queue_flash("boot", data, sz); fname = find_item("recovery", product); data = load_file(fname, &sz); if (data != 0) { do_send_signature(fname); fb_queue_flash("recovery", data, sz); } fname = find_item("system", product); data = load_file(fname, &sz); if (data == 0) die("could not load system.img"); do_send_signature(fname); fb_queue_flash("system", data, sz); }#define skip(n) do { argc -= (n); argv += (n); } while (0)#define require(n) do { if (argc < (n)) usage(); } while (0)int do_oem_command(int argc, char **argv){ int i; char command[256]; if (argc <= 1) return 0; command[0] = 0; while(1) { strcat(command,*argv); skip(1); if(argc == 0) break; strcat(command," "); } fb_queue_command(command,""); return 0;}int main(int argc, char **argv){ int wants_wipe = 0; int wants_reboot = 0; int wants_reboot_bootloader = 0; void *data; unsigned sz; skip(1); if (argc == 0) { usage(); return 0; } if (!strcmp(*argv, "devices")) { list_devices(); return 0; } while (argc > 0) { if(!strcmp(*argv, "-w")) { wants_wipe = 1; skip(1); } else if(!strcmp(*argv, "-s")) { require(2); serial = argv[1]; skip(2); } else if(!strcmp(*argv, "-p")) { require(2); product = argv[1]; skip(2); } else if(!strcmp(*argv, "-c")) { require(2); cmdline = argv[1]; skip(2); } else if(!strcmp(*argv, "getvar")) { require(2); fb_queue_display(argv[1], argv[1]); skip(2); } else if(!strcmp(*argv, "erase")) { require(2); fb_queue_erase(argv[1]); skip(2); } else if(!strcmp(*argv, "signature")) { require(2); data = load_file(argv[1], &sz); if (data == 0) die("could not load '%s'", argv[1]); if (sz != 256) die("signature must be 256 bytes"); fb_queue_download("signature", data, sz); fb_queue_command("signature", "installing signature"); skip(2); } else if(!strcmp(*argv, "reboot")) { wants_reboot = 1; skip(1); } else if(!strcmp(*argv, "reboot-bootloader")) { wants_reboot_bootloader = 1; skip(1); } else if(!strcmp(*argv, "boot")) { char *kname = 0; char *rname = 0; skip(1); if (argc > 0) { kname = argv[0]; skip(1); } if (argc > 0) { rname = argv[0]; skip(1); } data = load_bootable_image(kname, rname, &sz, cmdline); if (data == 0) return 1; fb_queue_download("boot.img", data, sz); fb_queue_command("boot", "booting"); } else if(!strcmp(*argv, "flash")) { char *pname = argv[1]; char *fname = 0; require(2); if (argc > 2) { fname = argv[2]; skip(3); } else { fname = find_item(pname, product); skip(2); } if (fname == 0) die("cannot determine image filename for '%s'", pname); data = load_file(fname, &sz); if (data == 0) die("cannot load '%s'\n", fname); fb_queue_flash(pname, data, sz); } else if(!strcmp(*argv, "flash:raw")) { char *pname = argv[1]; char *kname = argv[2]; char *rname = 0; require(3); if(argc > 3) { rname = argv[3]; skip(4); } else { skip(3); } data = load_bootable_image(kname, rname, &sz, cmdline); if (data == 0) die("cannot load bootable image"); fb_queue_flash(pname, data, sz); } else if(!strcmp(*argv, "flashall")) { skip(1); do_flashall(); wants_reboot = 1; } else if(!strcmp(*argv, "update")) { if (argc > 1) { do_update(argv[1]); skip(2); } else { do_update("update.zip"); skip(1); } wants_reboot = 1; } else if(!strcmp(*argv, "oem")) { argc = do_oem_command(argc, argv); } else { usage(); } } if (wants_wipe) { fb_queue_erase("userdata"); fb_queue_erase("cache"); } if (wants_reboot) { fb_queue_reboot(); } else if (wants_reboot_bootloader) { fb_queue_command("reboot-bootloader", "rebooting into bootloader"); } usb = open_device(); fb_execute_queue(usb); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -