blob: 07296502ba2f22aa9cc1ff59ebcbe4fad3dfa653 [file] [log] [blame]
Pierre-Hugues Husson9c37ec02018-07-23 15:32:31 +02001#!/system/bin/sh
2
3if [ -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
10fi
11
12#init.rc hooks are based on "0" (non-configfs) or "1" (configfs), so set it to 2 so that noone is triggered
13if [ -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"
43fi
44
45umount /dev/old-system
46setprop service.adb.root 1
47
48if [ "$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
86else
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 &
108fi
109
110
111death() {
112 sleep 180
113 reboot
114}
115
116dev="$(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 Husson6b9cb2a2018-07-23 22:16:46 +0200119[ -z "$devbase" ] && devbase="$(echo $dev | sed -nE 's;(/dev/block/.*/)USERDATA;\1;p')"
120for i in system system_a SYSTEM;do
Pierre-Hugues Husson9c37ec02018-07-23 15:32:31 +0200121 v="$devbase/$i"
122 [ -b "$v" ] && system="$v"
123done
124#Failed...
125[ -z "$system" ] && death
126
127blockdev --setrw "$system"
128
129size="$(sed -En '2s/^([0-9]+) .*/\1/p' /cache/phh/block.map)"
130block_size="$(sed -En '2s/.* ([0-9]*)$/\1/p' /cache/phh/block.map)"
131n_ranges="$(sed -n 3p /cache/phh/block.map)"
132block_id=0
133for 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))
140done
141
142sync
143reboot