Pierre-Hugues Husson | 9c37ec0 | 2018-07-23 15:32:31 +0200 | [diff] [blame] | 1 | #!/system/bin/sh |
| 2 | |
| 3 | if [ -z "$cache_log" ];then |
| 4 | if [ -f /cache/phh/flash ];then |
| 5 | rm -f /cache/phh/flash |
| 6 | else |
| 7 | exit 0 |
| 8 | fi |
| 9 | cache_log=1 exec /system/bin/sh -x "$0" > /cache/phh/logs 2>&1 |
| 10 | fi |
| 11 | |
| 12 | #init.rc hooks are based on "0" (non-configfs) or "1" (configfs), so set it to 2 so that noone is triggered |
| 13 | if [ -z "$nosystem" ];then |
| 14 | configfs="$(getprop sys.usb.configfs)" |
| 15 | export configfs |
| 16 | setprop sys.usb.configfs 2 |
| 17 | setprop service.adb.tcp.port 5555 |
| 18 | |
| 19 | mount -o private,recursive rootfs / |
| 20 | |
| 21 | mkdir /dev/new-system/ |
| 22 | chmod 0755 /dev/new-system |
| 23 | mkdir /dev/old-system |
| 24 | |
| 25 | cp -R --preserve=all /system/lib64 /dev/new-system/lib64 |
| 26 | cp -R --preserve=all /system/lib /dev/new-system/lib |
| 27 | cp -R --preserve=all /system/bin /dev/new-system/bin |
| 28 | cp -R --preserve=all /system/xbin /dev/new-system/xbin |
| 29 | cp -R --preserve=all /system/etc /dev/new-system/etc |
| 30 | |
| 31 | getprop | \ |
| 32 | grep -e restarting -e running | \ |
| 33 | sed -nE -e 's/\[([^]]*).*/\1/g' -e 's/init.svc.(.*)/\1/p' | |
| 34 | while read svc ;do |
| 35 | setprop ctl.stop $svc |
| 36 | done |
| 37 | |
| 38 | setenforce 0 |
| 39 | umount /sbin/adbd |
| 40 | mount -o move /system /dev/old-system |
| 41 | /dev/new-system/bin/busybox_phh mount -o bind /dev/new-system /system |
| 42 | nosystem=1 exec /system/bin/sh -x "$0" |
| 43 | fi |
| 44 | |
| 45 | umount /dev/old-system |
| 46 | setprop service.adb.root 1 |
| 47 | |
| 48 | if [ "$configfs" == 1 ];then |
| 49 | mount -t configfs none /config |
| 50 | rm -Rf /config/usb_gadget |
| 51 | mkdir -p /config/usb_gadget/g1 |
| 52 | |
| 53 | echo 0x12d1 > /config/usb_gadget/g1/idVendor |
| 54 | echo 0x103A > /config/usb_gadget/g1/idProduct |
| 55 | mkdir -p /config/usb_gadget/g1/strings/0x409 |
| 56 | echo phh > /config/usb_gadget/g1/strings/0x409/serialnumber |
| 57 | echo phh > /config/usb_gadget/g1/strings/0x409/manufacturer |
| 58 | echo phh > /config/usb_gadget/g1/strings/0x409/product |
| 59 | |
| 60 | mkdir /config/usb_gadget/g1/functions/ffs.adb |
| 61 | mkdir /config/usb_gadget/g1/functions/mtp.gs0 |
| 62 | mkdir /config/usb_gadget/g1/functions/ptp.gs1 |
| 63 | |
| 64 | mkdir /config/usb_gadget/g1/configs/c.1/ |
| 65 | mkdir /config/usb_gadget/g1/configs/c.1/strings/0x409 |
| 66 | echo 'ADB MTP' > /config/usb_gadget/g1/configs/c.1/strings/0x409/configuration |
| 67 | |
| 68 | mkdir /dev/usb-ffs |
| 69 | chmod 0770 /dev/usb-ffs |
| 70 | chown shell:shell /dev/usb-ffs |
| 71 | mkdir /dev/usb-ffs/adb/ |
| 72 | chmod 0770 /dev/usb-ffs/adb |
| 73 | chown shell:shell /dev/usb-ffs/adb |
| 74 | |
| 75 | mount -t functionfs -o uid=2000,gid=2000 adb /dev/usb-ffs/adb |
| 76 | |
| 77 | /dev/new-system/bin/adbd & |
| 78 | |
| 79 | sleep 1 |
| 80 | echo none > /config/usb_gadget/g1/UDC |
| 81 | ln -s /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/c.1/f1 |
| 82 | echo ff100000.dwc3 > /config/usb_gadget/g1/UDC |
| 83 | |
| 84 | sleep 2 |
| 85 | echo 2 > /sys/devices/virtual/android_usb/android0/port_mode |
| 86 | else |
| 87 | mkdir /dev/usb-ffs |
| 88 | chmod 0770 /dev/usb-ffs |
| 89 | chown shell:shell /dev/usb-ffs |
| 90 | mkdir /dev/usb-ffs/adb/ |
| 91 | chmod 0770 /dev/usb-ffs/adb |
| 92 | chown shell:shell /dev/usb-ffs/adb |
| 93 | |
| 94 | mount -t functionfs -o uid=2000,gid=2000 adb /dev/usb-ffs/adb |
| 95 | echo adb > /sys/class/android_usb/android0/f_ffs/aliases |
| 96 | setprop sys.usb.config adb |
| 97 | |
| 98 | echo 0 > /sys/class/android_usb/android0/enable |
| 99 | echo 18d1 > /sys/class/android_usb/android0/idVendor |
| 100 | echo 4EE7 > /sys/class/android_usb/android0/idProduct 4EE7 |
| 101 | echo adb > /sys/class/android_usb/android0/functions |
| 102 | getprop ro.boot.serialno |tr -d '\n' |cat > /sys/class/android_usb/android0/iSerial |
| 103 | echo phh > /sys/class/android_usb/android0/iManufacturer |
| 104 | echo phh > /sys/class/android_usb/android0/iProduct |
| 105 | echo 1 > /sys/class/android_usb/android0/enable |
| 106 | |
| 107 | /dev/new-system/bin/adbd & |
| 108 | fi |
| 109 | |
| 110 | |
| 111 | death() { |
| 112 | sleep 180 |
| 113 | reboot |
| 114 | } |
| 115 | |
| 116 | dev="$(sed -n 1p /cache/phh/block.map)" |
| 117 | devbase="$(echo $dev | sed -nE 's;(/dev/block/.*/)userdata;\1;p')" |
| 118 | [ -z "$devbase" ] && devbase="$(echo $dev | sed -nE 's;(/dev/block/.*/)data;\1;p')" |
Pierre-Hugues Husson | 6b9cb2a | 2018-07-23 22:16:46 +0200 | [diff] [blame] | 119 | [ -z "$devbase" ] && devbase="$(echo $dev | sed -nE 's;(/dev/block/.*/)USERDATA;\1;p')" |
| 120 | for i in system system_a SYSTEM;do |
Pierre-Hugues Husson | 9c37ec0 | 2018-07-23 15:32:31 +0200 | [diff] [blame] | 121 | v="$devbase/$i" |
| 122 | [ -b "$v" ] && system="$v" |
| 123 | done |
| 124 | #Failed... |
| 125 | [ -z "$system" ] && death |
| 126 | |
| 127 | blockdev --setrw "$system" |
| 128 | |
| 129 | size="$(sed -En '2s/^([0-9]+) .*/\1/p' /cache/phh/block.map)" |
| 130 | block_size="$(sed -En '2s/.* ([0-9]*)$/\1/p' /cache/phh/block.map)" |
| 131 | n_ranges="$(sed -n 3p /cache/phh/block.map)" |
| 132 | block_id=0 |
| 133 | for i in $(seq 1 $n_ranges);do |
| 134 | range_start="$(sed -En $((i+3))'s/^([0-9]+) .*/\1/p' /cache/phh/block.map)" |
| 135 | range_end="$(sed -En $((i+3))'s/^.* ([0-9]+)$/\1/p' /cache/phh/block.map)" |
| 136 | n_blocks=$((range_end-range_start)) |
| 137 | busybox_phh dd bs=$block_size skip=$range_start seek=$block_id count=$n_blocks if=$dev of=$system |
| 138 | |
| 139 | block_id=$((block_id+n_blocks)) |
| 140 | done |
| 141 | |
| 142 | sync |
| 143 | reboot |