161 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <signal.h>
 | |
| #include <stdlib.h>
 | |
| #include <unistd.h>
 | |
| #include <sys/wait.h>
 | |
| 
 | |
| #include "flashutils/flashutils.h"
 | |
| 
 | |
| int the_flash_type = UNKNOWN;
 | |
| 
 | |
| int device_flash_type()
 | |
| {
 | |
|     if (the_flash_type == UNKNOWN) {
 | |
|         if (access("/dev/block/bml1", F_OK) == 0) {
 | |
|             the_flash_type = BML;
 | |
|         } else if (access("/proc/emmc", F_OK) == 0) {
 | |
|             the_flash_type = MMC;
 | |
|         } else if (access("/proc/mtd", F_OK) == 0) {
 | |
|             the_flash_type = MTD;
 | |
|         } else {
 | |
|             the_flash_type = UNSUPPORTED;
 | |
|         }
 | |
|     }
 | |
|     return the_flash_type;
 | |
| }
 | |
| 
 | |
| char* get_default_filesystem()
 | |
| {
 | |
|     return device_flash_type() == MMC ? "ext3" : "yaffs2";
 | |
| }
 | |
| 
 | |
| // This was pulled from bionic: The default system command always looks
 | |
| // for shell in /system/bin/sh. This is bad.
 | |
| #define _PATH_BSHELL "/sbin/sh"
 | |
| 
 | |
| extern char **environ;
 | |
| int
 | |
| __system(const char *command)
 | |
| {
 | |
|   pid_t pid;
 | |
|     sig_t intsave, quitsave;
 | |
|     sigset_t mask, omask;
 | |
|     int pstat;
 | |
|     char *argp[] = {"sh", "-c", NULL, NULL};
 | |
| 
 | |
|     if (!command)        /* just checking... */
 | |
|         return(1);
 | |
| 
 | |
|     argp[2] = (char *)command;
 | |
| 
 | |
|     sigemptyset(&mask);
 | |
|     sigaddset(&mask, SIGCHLD);
 | |
|     sigprocmask(SIG_BLOCK, &mask, &omask);
 | |
|     switch (pid = vfork()) {
 | |
|     case -1:            /* error */
 | |
|         sigprocmask(SIG_SETMASK, &omask, NULL);
 | |
|         return(-1);
 | |
|     case 0:                /* child */
 | |
|         sigprocmask(SIG_SETMASK, &omask, NULL);
 | |
|         execve(_PATH_BSHELL, argp, environ);
 | |
|     _exit(127);
 | |
|   }
 | |
| 
 | |
|     intsave = (sig_t)  bsd_signal(SIGINT, SIG_IGN);
 | |
|     quitsave = (sig_t) bsd_signal(SIGQUIT, SIG_IGN);
 | |
|     pid = waitpid(pid, (int *)&pstat, 0);
 | |
|     sigprocmask(SIG_SETMASK, &omask, NULL);
 | |
|     (void)bsd_signal(SIGINT, intsave);
 | |
|     (void)bsd_signal(SIGQUIT, quitsave);
 | |
|     return (pid == -1 ? -1 : pstat);
 | |
| }
 | |
| 
 | |
| int restore_raw_partition(const char *partition, const char *filename)
 | |
| {
 | |
|     int type = device_flash_type();
 | |
|     switch (type) {
 | |
|         case MTD:
 | |
|             return cmd_mtd_restore_raw_partition(partition, filename);
 | |
|         case MMC:
 | |
|             return cmd_mmc_restore_raw_partition(partition, filename);
 | |
|         case BML:
 | |
|             return cmd_bml_restore_raw_partition(partition, filename);
 | |
|         default:
 | |
|             return -1;
 | |
|     }
 | |
| }
 | |
| 
 | |
| int backup_raw_partition(const char *partition, const char *filename)
 | |
| {
 | |
|     int type = device_flash_type();
 | |
|     switch (type) {
 | |
|         case MTD:
 | |
|             return cmd_mtd_backup_raw_partition(partition, filename);
 | |
|         case MMC:
 | |
|             return cmd_mmc_backup_raw_partition(partition, filename);
 | |
|         case BML:
 | |
|             return cmd_bml_backup_raw_partition(partition, filename);
 | |
|         default:
 | |
|             return -1;
 | |
|     }
 | |
| }
 | |
| 
 | |
| int erase_raw_partition(const char *partition)
 | |
| {
 | |
|     int type = device_flash_type();
 | |
|     switch (type) {
 | |
|         case MTD:
 | |
|             return cmd_mtd_erase_raw_partition(partition);
 | |
|         case MMC:
 | |
|             return cmd_mmc_erase_raw_partition(partition);
 | |
|         case BML:
 | |
|             return cmd_bml_erase_raw_partition(partition);
 | |
|         default:
 | |
|             return -1;
 | |
|     }
 | |
| }
 | |
| 
 | |
| int erase_partition(const char *partition, const char *filesystem)
 | |
| {
 | |
|     int type = device_flash_type();
 | |
|     switch (type) {
 | |
|         case MTD:
 | |
|             return cmd_mtd_erase_partition(partition, filesystem);
 | |
|         case MMC:
 | |
|             return cmd_mmc_erase_partition(partition, filesystem);
 | |
|         case BML:
 | |
|             return cmd_bml_erase_partition(partition, filesystem);
 | |
|         default:
 | |
|             return -1;
 | |
|     }
 | |
| }
 | |
| 
 | |
| int mount_partition(const char *partition, const char *mount_point, const char *filesystem, int read_only)
 | |
| {
 | |
|     int type = device_flash_type();
 | |
|     switch (type) {
 | |
|         case MTD:
 | |
|             return cmd_mtd_mount_partition(partition, mount_point, filesystem, read_only);
 | |
|         case MMC:
 | |
|             return cmd_mmc_mount_partition(partition, mount_point, filesystem, read_only);
 | |
|         case BML:
 | |
|             return cmd_bml_mount_partition(partition, mount_point, filesystem, read_only);
 | |
|         default:
 | |
|             return -1;
 | |
|     }
 | |
| }
 | |
| 
 | |
| int get_partition_device(const char *partition, char *device)
 | |
| {
 | |
|     int type = device_flash_type();
 | |
|     switch (type) {
 | |
|         case MTD:
 | |
|             return cmd_mtd_get_partition_device(partition, device);
 | |
|         case MMC:
 | |
|             return cmd_mmc_get_partition_device(partition, device);
 | |
|         case BML:
 | |
|             return cmd_bml_get_partition_device(partition, device);
 | |
|         default:
 | |
|             return -1;
 | |
|     }
 | |
| }
 |