int fstyp_mod_ident(fstyp_mod_handle_t handle) { fstyp_ntfs_t *h = (fstyp_ntfs_t *)handle; if(h->vol == NULL) { h->vol = ntfs_volume_startup(h->dev, NTFS_MNT_RDONLY); if (h->vol == NULL) { free(h); return 1; } } return 0; }
dir_partition_t dir_partition_ntfs_init(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const int verbose, const int expert) { #if defined(HAVE_LIBNTFS) || defined(HAVE_LIBNTFS3G) struct ntfs_device *dev; my_data_t *my_data=NULL; ntfs_volume *vol=NULL; #ifdef NTFS_LOG_LEVEL_VERBOSE ntfs_log_set_levels(NTFS_LOG_LEVEL_VERBOSE); ntfs_log_set_handler(ntfs_log_handler_stderr); #endif dev = ntfs_device_alloc("/", 0, &ntfs_device_testdisk_io_ops, NULL); if (dev) { my_data=(my_data_t *)MALLOC(sizeof(*my_data)); my_data->partition=partition; my_data->disk_car=disk_car; my_data->offset=0; dev->d_private=my_data; /* Call ntfs_device_mount() to do the actual mount. */ #ifdef MS_RDONLY vol = ntfs_device_mount(dev, MS_RDONLY); #else vol = ntfs_device_mount(dev, NTFS_MNT_RDONLY); #endif #ifdef HAVE_NTFS_VOLUME_STARTUP if(!vol) { #ifdef MS_RDONLY vol = ntfs_volume_startup(dev, MS_RDONLY); #else vol = ntfs_volume_startup(dev, NTFS_MNT_RDONLY); #endif if(vol) { log_warning("NTFS filesystem needs to be repaired.\n"); } } #endif } if (!vol) { free(my_data); ntfs_device_free(dev); return DIR_PART_EIO; } if (vol->flags & VOLUME_IS_DIRTY) { log_warning("NTFS Volume is dirty.\n"); } { struct ntfs_dir_struct *ls=(struct ntfs_dir_struct *)MALLOC(sizeof(*ls)); ls->dir_list=NULL; ls->vol=vol; ls->my_data=my_data; ls->dir_data=dir_data; #ifdef HAVE_ICONV if ((ls->cd = iconv_open("UTF-8", "UTF-16LE")) == (iconv_t)(-1)) { log_error("ntfs_ucstoutf8: iconv_open failed\n"); } #endif strncpy(dir_data->current_directory,"/",sizeof(dir_data->current_directory)); dir_data->current_inode=FILE_root; dir_data->param=FLAG_LIST_ADS; if(expert!=0) dir_data->param|=FLAG_LIST_SYSTEM; dir_data->verbose=verbose; dir_data->capabilities=CAPA_LIST_ADS; dir_data->get_dir=&ntfs_dir; dir_data->copy_file=&ntfs_copy; dir_data->close=&dir_partition_ntfs_close; dir_data->local_dir=NULL; dir_data->private_dir_data=ls; } return DIR_PART_OK; #else return DIR_PART_ENOSYS; #endif }