platform_system_core/toolbox/umount.c

75 lines
1.5 KiB
C

#include <sys/mount.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <linux/loop.h>
// FIXME - only one loop mount is supported at a time
#define LOOP_DEVICE "/dev/block/loop0"
static int is_loop_mount(const char* path)
{
FILE* f;
int count;
char device[256];
char mount_path[256];
char rest[256];
int result = 0;
int path_length = strlen(path);
f = fopen("/proc/mounts", "r");
if (!f) {
fprintf(stdout, "could not open /proc/mounts\n");
return -1;
}
do {
count = fscanf(f, "%255s %255s %255s\n", device, mount_path, rest);
if (count == 3) {
if (strcmp(LOOP_DEVICE, device) == 0 && strcmp(path, mount_path) == 0) {
result = 1;
break;
}
}
} while (count == 3);
fclose(f);
return result;
}
int umount_main(int argc, char *argv[])
{
int loop, loop_fd;
if(argc != 2) {
fprintf(stderr,"umount <path>\n");
return 1;
}
loop = is_loop_mount(argv[1]);
if(umount(argv[1])){
fprintf(stderr,"failed.\n");
return 1;
}
if (loop) {
// free the loop device
loop_fd = open(LOOP_DEVICE, O_RDONLY);
if (loop_fd < -1) {
perror("open loop device failed");
return 1;
}
if (ioctl(loop_fd, LOOP_CLR_FD, 0) < 0) {
perror("ioctl LOOP_CLR_FD failed");
return 1;
}
close(loop_fd);
}
return 0;
}