blob: 92c60760ba5262a9737af6251c9d68734b4d9a3e [file] [log] [blame]
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -08001
2#include <sys/mount.h>
3#include <sys/stat.h>
4#include <fcntl.h>
5#include <stdio.h>
6#include <string.h>
7#include <unistd.h>
8#include <linux/loop.h>
9
10// FIXME - only one loop mount is supported at a time
11#define LOOP_DEVICE "/dev/block/loop0"
12
13static int is_loop_mount(const char* path)
14{
15 FILE* f;
16 int count;
17 char device[256];
18 char mount_path[256];
19 char rest[256];
20 int result = 0;
21 int path_length = strlen(path);
22
23 f = fopen("/proc/mounts", "r");
24 if (!f) {
25 fprintf(stdout, "could not open /proc/mounts\n");
26 return -1;
27 }
28
29 do {
30 count = fscanf(f, "%255s %255s %255s\n", device, mount_path, rest);
31 if (count == 3) {
32 if (strcmp(LOOP_DEVICE, device) == 0 && strcmp(path, mount_path) == 0) {
33 result = 1;
34 break;
35 }
36 }
37 } while (count == 3);
38
39 fclose(f);
40 return result;
41}
42
43int umount_main(int argc, char *argv[])
44{
45 int loop, loop_fd;
46
47 if(argc != 2) {
48 fprintf(stderr,"umount <path>\n");
49 return 1;
50 }
51
52 loop = is_loop_mount(argv[1]);
53 if(umount(argv[1])){
54 fprintf(stderr,"failed.\n");
55 return 1;
56 }
57
58 if (loop) {
59 // free the loop device
60 loop_fd = open(LOOP_DEVICE, O_RDONLY);
61 if (loop_fd < -1) {
62 perror("open loop device failed");
63 return 1;
64 }
65 if (ioctl(loop_fd, LOOP_CLR_FD, 0) < 0) {
66 perror("ioctl LOOP_CLR_FD failed");
67 return 1;
68 }
69
70 close(loop_fd);
71 }
72
73 return 0;
74}