コード例 #1
0
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;
}
コード例 #2
0
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;
}
コード例 #3
0
ファイル: mounts.c プロジェクト: APAR1992/recovery_cwm_cn
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;
}