int unmount_mounted_volume(const MountedVolume *volume) { /* Intentionally pass NULL to umount if the caller tries * to unmount a volume they already unmounted using this * function. */ int ret = umount(volume->mount_point); if (ret == 0) { free_volume_internals(volume, 1); return 0; } return ret; }
int scan_mounted_volumes () { char buf[2048]; const char *bufp; int fd; ssize_t nbytes; if (g_mounts_state.volumes == NULL) { const int numv = 32; MountedVolume *volumes = malloc (numv * sizeof (*volumes)); if (volumes == NULL) { errno = ENOMEM; return -1; } g_mounts_state.volumes = volumes; g_mounts_state.volumes_allocd = numv; memset (volumes, 0, numv * sizeof (*volumes)); } else { /* Free the old volume strings. */ int i; for (i = 0; i < g_mounts_state.volume_count; i++) { free_volume_internals (&g_mounts_state.volumes[i], 1); } } g_mounts_state.volume_count = 0; /* Open and read the file contents. */ fd = open (PROC_MOUNTS_FILENAME, O_RDONLY); if (fd < 0) { goto bail; } nbytes = read (fd, buf, sizeof (buf) - 1); close (fd); if (nbytes < 0) { goto bail; } buf[nbytes] = '\0'; /* Parse the contents of the file, which looks like: * * # cat /proc/mounts * rootfs / rootfs rw 0 0 * /dev/pts /dev/pts devpts rw 0 0 * /proc /proc proc rw 0 0 * /sys /sys sysfs rw 0 0 * /dev/block/mtdblock4 /system yaffs2 rw,nodev,noatime,nodiratime 0 0 * /dev/block/mtdblock5 /data yaffs2 rw,nodev,noatime,nodiratime 0 0 * /dev/block/mmcblk0p1 /sdcard vfat rw,sync,dirsync,fmask=0000,dmask=0000,codepage=cp437,iocharset=iso8859-1,utf8 0 0 * * The zeroes at the end are dummy placeholder fields to make the * output match Linux's /etc/mtab, but don't represent anything here. */ bufp = buf; while (nbytes > 0) { char device[64]; char mount_point[64]; char filesystem[64]; char flags[128]; int matches; /* %as is a gnu extension that malloc()s a string for each field. */ matches = sscanf (bufp, "%63s %63s %63s %127s", device, mount_point, filesystem, flags); if (matches == 4) { device[sizeof (device) - 1] = '\0'; mount_point[sizeof (mount_point) - 1] = '\0'; filesystem[sizeof (filesystem) - 1] = '\0'; flags[sizeof (flags) - 1] = '\0'; MountedVolume *v = &g_mounts_state.volumes[g_mounts_state. volume_count++]; v->device = strdup (device); v->mount_point = strdup (mount_point); v->filesystem = strdup (filesystem); v->flags = strdup (flags); } else { printf ("matches was %d on <<%.40s>>\n", matches, bufp); } /* Eat the line. */ while (nbytes > 0 && *bufp != '\n') { bufp++; nbytes--; } if (nbytes > 0) { bufp++; nbytes--; } } return 0; bail: //TODO: free the strings we've allocated. g_mounts_state.volume_count = 0; return -1; }
int unmount_mounted_volume(const MountedVolume *volume) { /* Intentionally pass NULL to umount if the caller tries * to unmount a volume they already unmounted using this * function. */ int ret = umount(volume->mount_point); if (ret == 0) { free_volume_internals(volume, 1); return 0; } #if 1 //wschen 2012-10-23 else { DIR *dir, *dir1; int fd; int len, len1; char buf[1024]; char buf1[1024]; char pid[1024]; char file_path[1024]; struct dirent *ptr, *ptr1; printf("%s\n", strerror(errno)); dir = opendir("/proc/"); if (dir) { while ((ptr = readdir(dir)) != NULL) { if (ptr->d_name[0] >= '0' && ptr->d_name[0] <= '9') { snprintf(pid, sizeof(pid), "/proc/%s/cmdline", ptr->d_name); fd = open(pid, O_RDONLY); len1 = 0; if (fd) { len1 = read(fd, buf1, sizeof(buf1)); close(fd); snprintf(pid, sizeof(pid), "/proc/%s/fd", ptr->d_name); dir1 = opendir(pid); if (dir1) { while ((ptr1 = readdir(dir1)) != NULL) { snprintf(file_path, sizeof(file_path), "/proc/%s/fd/%s", ptr->d_name, ptr1->d_name); len = readlink(file_path, buf, sizeof(buf)); if (len != -1) { buf[len] = '\0'; if (strstr(buf, volume->mount_point) == buf) { if (len1) { printf("process(%s):%s\n", ptr->d_name, buf1); } printf("found:%s\n", buf); } } } closedir(dir1); } } } } closedir(dir); } } #endif return ret; }