diff --git a/src/configfsisomanager.cpp b/src/configfsisomanager.cpp index a6f1bdc..8d971a3 100644 --- a/src/configfsisomanager.cpp +++ b/src/configfsisomanager.cpp @@ -11,109 +11,120 @@ bool supported() { - return fs_mount_point((char*)"configfs") != nullptr; + return fs_mount_point((char *)"configfs") != nullptr; } -char *get_gadget_root() +char* get_gadget_root() { - char *configFsRoot = fs_mount_point((char*)"configfs"); - char *usbGadgetRoot = strjin(configFsRoot, (char*)"/usb_gadget/"); - char *gadgetRoot = nullptr; + char *configFsRoot = fs_mount_point((char *)"configfs"); + char *usbGadgetRoot = strjin(configFsRoot, (char *)"/usb_gadget/"); + char *gadgetRoot = nullptr; - struct dirent *entry = nullptr; - DIR *dp = nullptr; - dp = opendir(usbGadgetRoot); - if (dp != nullptr) - while ((entry = readdir(dp))) - { - if (entry->d_name[0] != '.') - { - char *gadget = strjin(usbGadgetRoot, entry->d_name); - if (sysfs_read(strjin(gadget, (char*)"/UDC")) != nullptr) - { - gadgetRoot = gadget; - break; - } - } - } - return gadgetRoot; + struct dirent *entry = nullptr; + DIR *dp = nullptr; + + dp = opendir(usbGadgetRoot); + + if (dp != nullptr) + while ((entry = readdir(dp))) + { + if (entry->d_name[0] != '.') + { + char *gadget = strjin(usbGadgetRoot, entry->d_name); + + if (sysfs_read(strjin(gadget, (char *)"/UDC")) != nullptr) + { + gadgetRoot = gadget; + break; + } + } + } + return gadgetRoot; } -char *get_config_root() +char* get_config_root() { - char *gadgetRoot = get_gadget_root(); - if (gadgetRoot == nullptr) - { - return nullptr; - } - char *usbConfigRoot = strjin(gadgetRoot, (char*)"/configs/"); - char *configRoot = nullptr; + char *gadgetRoot = get_gadget_root(); - struct dirent *entry = nullptr; - DIR *dp = nullptr; - dp = opendir(usbConfigRoot); - if (dp != nullptr) - while ((entry = readdir(dp))) - { - if (entry->d_name[0] != '.') - { - configRoot = strjin(usbConfigRoot, entry->d_name); - break; - } - } - return configRoot; + if (gadgetRoot == nullptr) + { + return nullptr; + } + char *usbConfigRoot = strjin(gadgetRoot, (char *)"/configs/"); + char *configRoot = nullptr; + + struct dirent *entry = nullptr; + DIR *dp = nullptr; + + dp = opendir(usbConfigRoot); + + if (dp != nullptr) + while ((entry = readdir(dp))) + { + if (entry->d_name[0] != '.') + { + configRoot = strjin(usbConfigRoot, entry->d_name); + break; + } + } + return configRoot; } void mount_iso(char *iso_path, char *cdrom, char *ro) { - char *gadgetRoot = get_gadget_root(); - if (gadgetRoot == nullptr) - { - printf("No active gadget found\n"); - return; - } - char *configRoot = get_config_root(); - char *udc = get_udc(); - char *functionRoot = strjin(gadgetRoot, (char*)"/functions"); - char *massStorageRoot = strjin(functionRoot, (char*)"/mass_storage.0"); - char *lunRoot = strjin(massStorageRoot, (char*)"/lun.0"); - - char *stallFile = strjin(massStorageRoot, (char*)"/stall"); - char *udcFile = strjin(gadgetRoot, (char*)"/UDC"); - char *lunFile = strjin(lunRoot, (char*)"/file"); - char *lunCdRom = strjin(lunRoot, (char*)"/cdrom"); - char *lunRo = strjin(lunRoot, (char*)"/ro"); + char *gadgetRoot = get_gadget_root(); - set_udc((char*)"", gadgetRoot); - - if (!isdir(massStorageRoot)) - { - mkdir(massStorageRoot, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); - } - if (!isdir(strjin(configRoot, (char*)"/mass_storage.0"))) - { - symlink(massStorageRoot, strjin(configRoot, (char*)"/mass_storage.0")); - } - sysfs_write(lunFile, iso_path); - sysfs_write(lunCdRom, cdrom); - sysfs_write(lunRo, ro); + if (gadgetRoot == nullptr) + { + printf("No active gadget found\n"); + return; + } + char *configRoot = get_config_root(); + char *udc = get_udc(); + char *functionRoot = strjin(gadgetRoot, (char *)"/functions"); + char *massStorageRoot = strjin(functionRoot, (char *)"/mass_storage.0"); + char *lunRoot = strjin(massStorageRoot, (char *)"/lun.0"); - set_udc(udc, gadgetRoot); + char *stallFile = strjin(massStorageRoot, (char *)"/stall"); + char *udcFile = strjin(gadgetRoot, (char *)"/UDC"); + char *lunFile = strjin(lunRoot, (char *)"/file"); + char *lunCdRom = strjin(lunRoot, (char *)"/cdrom"); + char *lunRo = strjin(lunRoot, (char *)"/ro"); + + set_udc((char *)"", gadgetRoot); + + if (!isdir(massStorageRoot)) + { + mkdir(massStorageRoot, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + } + + if (!isdir(strjin(configRoot, (char *)"/mass_storage.0"))) + { + symlink(massStorageRoot, strjin(configRoot, (char *)"/mass_storage.0")); + } + sysfs_write(lunFile, iso_path); + sysfs_write(lunCdRom, cdrom); + sysfs_write(lunRo, ro); + + set_udc(udc, gadgetRoot); } void set_udc(char *udc, char *gadget) { - char *udcFile = strjin(gadget, (char*)"/UDC"); - sysfs_write(udcFile, udc); + char *udcFile = strjin(gadget, (char *)"/UDC"); + + sysfs_write(udcFile, udc); } -char *get_udc() +char* get_udc() { - char *gadget_root = get_gadget_root(); - if (gadget_root == nullptr) - { - return nullptr; - } - char *udcFile = strjin(gadget_root, (char*)"/UDC"); - return sysfs_read(udcFile); + char *gadget_root = get_gadget_root(); + + if (gadget_root == nullptr) + { + return nullptr; + } + char *udcFile = strjin(gadget_root, (char *)"/UDC"); + + return sysfs_read(udcFile); } diff --git a/src/include/configfsisomanager.h b/src/include/configfsisomanager.h index 02bfc6b..ddaece7 100644 --- a/src/include/configfsisomanager.h +++ b/src/include/configfsisomanager.h @@ -1,12 +1,16 @@ #ifndef CONFIGFSISOMANAGER_H #define CONFIGFSISOMANAGER_H -bool supported(); -char *get_gadget_root(); -char *get_config_root(); +bool supported(); +char* get_gadget_root(); +char* get_config_root(); -void mount_iso(char *iso_path, char *cdrom, char *ro); -void set_udc(char *udc, char *gadget); -char *get_udc(); +void mount_iso(char *iso_path, + char *cdrom, + char *ro); +void umount_iso(); +void set_udc(char *udc, + char *gadget); +char* get_udc(); -#endif +#endif // ifndef CONFIGFSISOMANAGER_H diff --git a/src/include/util.h b/src/include/util.h index 830c779..ac51ba3 100644 --- a/src/include/util.h +++ b/src/include/util.h @@ -1,11 +1,12 @@ #ifndef UTIL_H #define UTIL_H -char *fs_mount_point(char *filesystem_type); -char *strjin(char *w1, char *w2); -bool isdir(char *path); -char *sysfs_read(char *path); -void sysfs_write(char *path, char *content); - -#endif +char* fs_mount_point(char *filesystem_type); +char* strjin(char *w1, + char *w2); +bool isdir(char *path); +char* sysfs_read(char *path); +void sysfs_write(char *path, + char *content); +#endif // ifndef UTIL_H diff --git a/src/main.cpp b/src/main.cpp index 6640a49..1e879e0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,55 +3,59 @@ #include #include -int main(int argc, char* argv[]){ - char *iso_target = argv[1]; - char *cdrom = (char*)"0"; - char *ro = (char*)"1"; - for (int i = 1; i < argc; i++) - { - if (strcmp(argv[i], "-rw") == 0) - { - ro = (char*)"0"; - } - else if (strcmp(argv[i], "-cdrom") == 0) - { - cdrom = (char*)"1"; - } - else - { - iso_target = argv[i]; - } - } +int main(int argc, char *argv[]) +{ + char *iso_target = argv[1]; + char *cdrom = (char *)"0"; + char *ro = (char *)"1"; - if (argc == 1) - { - printf("Usage:\n"); - printf("cdrom [FILE]... [OPTION]...\n"); - printf("Mounts the given FILE as a bootable device using configfs.\n"); - printf("Run without any arguments to unmount any mounted files and display this help message.\n\n"); + for (int i = 1; i < argc; i++) + { + if (strcmp(argv[i], "-rw") == 0) + { + ro = (char *)"0"; + } + else if (strcmp(argv[i], "-cdrom") == 0) + { + cdrom = (char *)"1"; + } + else + { + iso_target = argv[i]; + } + } - printf("Optional arguments:\n"); - printf("-rw\t Mounts the file in read write mode.\n"); - printf("-cdrom\t Mounts the file as a cdrom.\n\n"); - printf("UMOUNT:\n"); - } - else - { - printf("MOUNT:\n"); - } + if (argc == 1) + { + printf("Usage:\n"); + printf("cdrom [FILE]... [OPTION]...\n"); + printf("Mounts the given FILE as a bootable device using configfs.\n"); + printf( + "Run without any arguments to unmount any mounted files and display this help message.\n\n"); - if (!supported()) - { - printf("Device does not support configfs usb gadget\n"); - return 1; - } - if (getuid() != 0) - { - printf("Permission denied\n"); - return 1; - } + printf("Optional arguments:\n"); + printf("-rw\t Mounts the file in read write mode.\n"); + printf("-cdrom\t Mounts the file as a cdrom.\n\n"); + printf("UMOUNT:\n"); + } + else + { + printf("MOUNT:\n"); + } - mount_iso(iso_target, cdrom, ro); + if (!supported()) + { + printf("Device does not support configfs usb gadget\n"); + return 1; + } - return 0; + if (getuid() != 0) + { + printf("Permission denied\n"); + return 1; + } + + mount_iso(iso_target, cdrom, ro); + + return 0; } diff --git a/src/util.cpp b/src/util.cpp index b2cb142..5cf5fb1 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1,7 +1,7 @@ -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include @@ -11,74 +11,82 @@ #include #include -char *fs_mount_point(char *filesystem_type) { - struct mntent *ent; - FILE *mounts; - char *mount_point = nullptr; +char* fs_mount_point(char *filesystem_type) +{ + struct mntent *ent; + FILE *mounts; + char *mount_point = nullptr; - mounts = setmntent("/proc/mounts", "r"); - while (nullptr != (ent = getmntent(mounts))) { - if (strcmp(ent->mnt_fsname, filesystem_type) == 0) - { - mount_point = ent->mnt_dir; - break; - } - } + mounts = setmntent("/proc/mounts", "r"); - // Alternate search location on Android - if (mount_point == nullptr) - { - const char *alt_usb_gadget = "/config/usb_gadget"; - DIR *dir = opendir(alt_usb_gadget); - if (dir) - { - mount_point = (char*)"/config"; - } - } - return mount_point; + while (nullptr != (ent = getmntent(mounts))) + { + if (strcmp(ent->mnt_fsname, filesystem_type) == 0) + { + mount_point = ent->mnt_dir; + break; + } + } + + // Alternate search location on Android + if (mount_point == nullptr) + { + const char *alt_usb_gadget = "/config/usb_gadget"; + DIR *dir = opendir(alt_usb_gadget); + + if (dir) + { + mount_point = (char *)"/config"; + } + } + return mount_point; } -char *strjin(char *w1, char *w2) +char* strjin(char *w1, char *w2) { - char *s = new char[strlen(w1)+strlen(w2)+1]; - strcpy(s, w1); - strcat(s, w2); - return s; + char *s = new char[strlen(w1) + strlen(w2) + 1]; + + strcpy(s, w1); + strcat(s, w2); + return s; } bool isdir(char *path) { - struct stat sb; - if (stat(path, &sb) == 0) - return true; - else - return false; + struct stat sb; + + if (stat(path, &sb) == 0) + return true; + else + return false; } void sysfs_write(char *path, char *content) { - printf("Write: %s -> %s\n", content, path); - std::ofstream sysfsFile(path); - sysfsFile << content << std::endl; - sysfsFile.close(); + printf("Write: %s -> %s\n", content, path); + std::ofstream sysfsFile(path); + sysfsFile << content << std::endl; + sysfsFile.close(); } -char *sysfs_read(char *path) +char* sysfs_read(char *path) { - std::string value; - std::ifstream sysfsFile(path); - if (!sysfsFile.is_open()) - { - return nullptr; - } - sysfsFile >> value; - sysfsFile.close(); - if (value.empty()) - { - return nullptr; - } - char *result = new char[value.length() + 1]; - strcpy(result, value.c_str()); - return result; - + std::string value; + std::ifstream sysfsFile(path); + + if (!sysfsFile.is_open()) + { + return nullptr; + } + sysfsFile >> value; + sysfsFile.close(); + + if (value.empty()) + { + return nullptr; + } + char *result = new char[value.length() + 1]; + + strcpy(result, value.c_str()); + return result; }