void adb_init_usb(void) { mkdir_with_perms("/dev/usb-ffs", 0770, "shell", "shell"); mkdir_with_perms("/dev/usb-ffs/adb", 0770, "shell", "shell"); mount("adb", "/dev/usb-ffs/adb", "functionfs", 0, "uid=2000,gid=2000"); sleep(10); write_file("/sys/class/android_usb/android0/enable", "0"); char serial[64] = { 0 }; adb_get_serial(serial, sizeof(serial)); // this vid and pid is used in TWRP, CWM and AOSP recovery // for all devices, so I guess it is universal write_file("/sys/class/android_usb/android0/idVendor", "18d1"); write_file("/sys/class/android_usb/android0/idProduct", "d001"); write_file("/sys/class/android_usb/android0/f_ffs/aliases", "adb"); write_file("/sys/class/android_usb/android0/functions", "adb"); write_file("/sys/class/android_usb/android0/iManufacturer", PRODUCT_MANUFACTURER); write_file("/sys/class/android_usb/android0/iProduct", PRODUCT_MODEL); write_file("/sys/class/android_usb/android0/iSerial", serial); write_file("/sys/class/android_usb/android0/f_adb/on", "1"); write_file("/sys/class/android_usb/android0/f_mtp/on", "0"); write_file("/sys/class/android_usb/android0/enable", "1"); write_file("/sys/devices/platform/android_usb/usb_function_switch", "3"); }
int mkdir_recursive_with_perms(const char *pathname, mode_t mode, const char *owner, const char *group) { char buf[128]; const char *slash; const char *p = pathname; int width; int ret; struct stat info; while ((slash = strchr(p, '/')) != NULL) { width = slash - pathname; p = slash + 1; if (width < 0) break; if (width == 0) continue; if ((unsigned int)width > sizeof(buf) - 1) { ERROR("path too long for mkdir_recursive\n"); return -1; } memcpy(buf, pathname, width); buf[width] = 0; if (stat(buf, &info) != 0) { ret = mkdir_with_perms(buf, mode, owner, group); if (ret && errno != EEXIST) return ret; } } ret = mkdir(pathname, mode); if (ret && errno != EEXIST) return ret; return 0; }