static int mp_disk_detach_proc() { int vol_num, tot_vol_num = 0; int ret; DM_DEBUG("Enter %s() ...\n", __FUNCTION__); ret = dm_ioctl(DM_CMD1_GET_VOL_NUM, DM_CMD_PARAM(MNT_TYPE_USB, 0, 0), &vol_num, sizeof(int)); if (ret == 0 && vol_num > 0) tot_vol_num += vol_num; ret = dm_ioctl(DM_CMD1_GET_VOL_NUM, DM_CMD_PARAM(MNT_TYPE_SD, 0, 0), &vol_num, sizeof(int)); if (ret == 0 && vol_num > 0) tot_vol_num += vol_num; ret = dm_ioctl(DM_CMD1_GET_VOL_NUM, DM_CMD_PARAM(MNT_TYPE_IDE, 0, 0), &vol_num, sizeof(int)); if (ret == 0 && vol_num > 0) tot_vol_num += vol_num; ret = dm_ioctl(DM_CMD1_GET_VOL_NUM, DM_CMD_PARAM(MNT_TYPE_SATA, 0, 0), &vol_num, sizeof(int)); if (ret == 0 && vol_num > 0) tot_vol_num += vol_num; if (tot_vol_num <= 0) { ap_udisk_close(); } return 0; }
static int win_removable_disk_info_init() { int dm_ret, i, disk_ns = 0; UINT64 disk_size; for (i = 0; i < MAX_USB_DISK_NUM; ++i) { dm_ret = dm_ioctl(DM_CMD2_GET_DISK_SIZE, DM_CMD_PARAM(MNT_TYPE_USB, i, 0), &disk_size, sizeof(UINT64)); if (dm_ret == 0) { r_disk_info[disk_ns].disk_type = MNT_TYPE_USB; r_disk_info[disk_ns].disk_idx = i; r_disk_info[disk_ns].disk_size = disk_size; disk_ns++; } } for (i = 0; i < MAX_SD_DISK_NUM; ++i) { dm_ret = dm_ioctl(DM_CMD2_GET_DISK_SIZE, DM_CMD_PARAM(MNT_TYPE_SD, i, 0), &disk_size, sizeof(UINT64)); if (dm_ret == 0) { r_disk_info[disk_ns].disk_type = MNT_TYPE_SD; r_disk_info[disk_ns].disk_idx = i; r_disk_info[disk_ns].disk_size = disk_size; disk_ns++; } } for (i = 0; i < MAX_SATA_DISK_NUM; ++i) { dm_ret = dm_ioctl(DM_CMD2_GET_DISK_SIZE, DM_CMD_PARAM(MNT_TYPE_SATA, i, 0), &disk_size, sizeof(UINT64)); if (dm_ret == 0) { r_disk_info[disk_ns].disk_type = MNT_TYPE_SATA; r_disk_info[disk_ns].disk_idx = i; r_disk_info[disk_ns].disk_size = disk_size; disk_ns++; } } disk_num = disk_ns; return disk_ns; }
// TODO: implement this function in win_filelist.c static int win_mp_detach_proc() { char cur_disk_name[8]; BOOL b_exit_win_mp = FALSE; int disk_type = 0, disk_idx = 0, dm_ret = 0, vol_num = 0; if ((mp_get_cur_disk_name(cur_disk_name, 8) == 0) && (STRLEN(cur_disk_name) == 3)) { disk_type = diskNamePrefix2Type(cur_disk_name); disk_idx = (int)cur_disk_name[2] - 'a'; dm_ret = dm_ioctl(DM_CMD2_GET_VOL_NUM, DM_CMD_PARAM(disk_type, disk_idx, 0), &vol_num, sizeof(int)); if (dm_ret != 0 || vol_num <= 0) win_delete_all_filelist(); } if (!mp_in_win_filelist()) return 0; DM_DEBUG("%s() system_state: %d\n", __FUNCTION__, system_state); if (!ap_mp_is_ready()) // exit menu, if all disks are detached { b_exit_win_mp = TRUE; } else if ((mp_get_cur_disk_name(cur_disk_name, 8) == 0) && (STRLEN(cur_disk_name) == 3)) { if (dm_ret != 0 || vol_num <= 0) { b_exit_win_mp = TRUE; } } else { b_exit_win_mp = TRUE; } if (b_exit_win_mp) { DM_DEBUG("disk detach in Media Player, enter main menu\n"); // Alert here:Clear all menus may cuase unpredictable result,must be tested api_osd_mode_change(OSD_NO_SHOW); ap_clear_all_menus(); //clear all menu & Hidden osd show menu_stack_pop_all(); if(api_get_usb_unmount_flag()==0) //-a by wangyang 2011-12-26 image_restore_vpo_rect(); api_set_usb_unmount_flag(0); ap_clear_all_message(); system_state = SYS_STATE_NORMAL; ap_send_msg(CTRL_MSG_SUBTYPE_CMD_ENTER_ROOT,(UINT32)&g_win_mainmenu, FALSE); } }
static void *dm_dev_ioctl(int fd, int ioc, struct dm_ioctl *dm) { struct stat st; int r; r = fstat(fd, &st); if (r < 0) { perror("fstat"); exit(1); } dm->dev = st.st_rdev; return dm_ioctl(ioc, dm); }
static void dm_init(void) { control_fd = open(CONTROL_PATH, O_RDWR); if (control_fd < 0) { perror("Cannot open " CONTROL_PATH); exit(1); } struct dm_ioctl dm = { }; if (!dm_ioctl(DM_VERSION, &dm)) { perror("ioctl"); exit(1); } if (dm.version[0] != DM_VERSION_MAJOR) { fprintf(stderr, "Unsupported device mapper interface"); exit(1); } }
static int ioctl_decode(struct tcb *tcp) { const unsigned int code = tcp->u_arg[1]; const kernel_ulong_t arg = tcp->u_arg[2]; switch (_IOC_TYPE(code)) { #if defined(ALPHA) || defined(POWERPC) case 'f': { int ret = file_ioctl(tcp, code, arg); if (ret != RVAL_DECODED) return ret; } case 't': case 'T': return term_ioctl(tcp, code, arg); #else /* !ALPHA */ case 'f': return file_ioctl(tcp, code, arg); case 0x54: #endif /* !ALPHA */ return term_ioctl(tcp, code, arg); case 0x89: return sock_ioctl(tcp, code, arg); case 'p': return rtc_ioctl(tcp, code, arg); case 0x03: return hdio_ioctl(tcp, code, arg); case 0x12: return block_ioctl(tcp, code, arg); case 'X': return fs_x_ioctl(tcp, code, arg); case 0x22: return scsi_ioctl(tcp, code, arg); case 'L': return loop_ioctl(tcp, code, arg); case 'M': return mtd_ioctl(tcp, code, arg); case 'o': case 'O': return ubi_ioctl(tcp, code, arg); case 'V': return v4l2_ioctl(tcp, code, arg); case '=': return ptp_ioctl(tcp, code, arg); #ifdef HAVE_LINUX_INPUT_H case 'E': return evdev_ioctl(tcp, code, arg); #endif #ifdef HAVE_LINUX_USERFAULTFD_H case 0xaa: return uffdio_ioctl(tcp, code, arg); #endif #ifdef HAVE_LINUX_BTRFS_H case 0x94: return btrfs_ioctl(tcp, code, arg); #endif #ifdef HAVE_LINUX_DM_IOCTL_H case 0xfd: return dm_ioctl(tcp, code, arg); #endif default: break; } return 0; }
BOOL usb_remove_safely_by_hotkey() { int disk_num, tot_disk_num = 0; char disk_name[8]; int ret; UINT32 choice; UINT8 disk_sel; UINT8 back_saved; POBJECT_HEAD topmenu; ret = dm_ioctl(DM_CMD1_GET_DISK_NUM, DM_CMD_PARAM(MNT_TYPE_USB, 0, 0), &disk_num, sizeof(int)); if (ret == 0 && disk_num > 0) tot_disk_num += disk_num; ret = dm_ioctl(DM_CMD1_GET_DISK_NUM, DM_CMD_PARAM(MNT_TYPE_SD, 0, 0), &disk_num, sizeof(int)); if (ret == 0 && disk_num > 0) tot_disk_num += disk_num; ret = dm_ioctl(DM_CMD1_GET_DISK_NUM, DM_CMD_PARAM(MNT_TYPE_SATA, 0, 0), &disk_num, sizeof(int)); if (ret == 0 && disk_num > 0) tot_disk_num += disk_num; if (tot_disk_num <= 0) { return TRUE; } api_inc_wnd_count(); ID timer_id = win_compopup_start_send_key_timer(V_KEY_EXIT, 10000, TIMER_ALARM); // exit popup if no action in 5s choice = win_disk_operate_open(OPERATE_TYPE_DISK_REMOVE, &disk_sel); api_stop_timer(&timer_id); if ((topmenu = menu_stack_get_top()) != NULL) OSD_TrackObject(topmenu, C_DRAW_SIGN_EVN_FLG | C_UPDATE_ALL); if (!choice) { api_dec_wnd_count(); return TRUE; } else { win_removable_disk_get_name_str(disk_sel, disk_name); } #ifdef DVR_PVR_SUPPORT enum PVR_DISKMODE pvr_mode; char rec_vol[16], tms_vol[16]; struct statvfs buf; pvr_mode = pvr_get_cur_mode(rec_vol, tms_vol); if (api_pvr_is_record_active() && (STRLEN(rec_vol) == 9) && (strncmp(disk_name, &rec_vol[5], 3) == 0)) { win_compopup_init(WIN_POPUP_TYPE_OK); win_compopup_set_msg("USB safely remove error, please stop recording first!", NULL, 0); win_compopup_open_ext(&back_saved); api_dec_wnd_count(); return TRUE; } if (api_pvr_is_playing()) { BOOL b_can_remove = TRUE; if ((pvr_info.pvr_state == PVR_STATE_TMS_PLAY) && (STRLEN(tms_vol) == 9) && (strncmp(disk_name, &tms_vol[5], 3) == 0)) { b_can_remove = FALSE; } else if ((pvr_info.pvr_state != PVR_STATE_TMS_PLAY) && (STRLEN(rec_vol) == 9) && (strncmp(disk_name, &rec_vol[5], 3) == 0)) { b_can_remove = FALSE; } if (!b_can_remove) { win_compopup_init(WIN_POPUP_TYPE_OK); win_compopup_set_msg("USB safely remove error, please stop playing first!", NULL, 0); win_compopup_open_ext(&back_saved); api_dec_wnd_count(); return TRUE; } } if (pvr_info.pvr_state == PVR_STATE_TMS) { api_pvr_tms_proc(FALSE); fs_sync(tms_vol); } #endif #ifdef USB_SUPPORT_HUB /* remove disk */ int disk_type = diskNamePrefix2Type(disk_name); if (disk_type == MNT_TYPE_USB) { char dev_path[16]; int node_id, fd; sprintf(dev_path, "/dev/%s", disk_name); fd = fs_open(dev_path, O_RDONLY, 0); ret = fs_ioctl(fd, IOCTL_GET_NODEID, &node_id, sizeof(int)); fs_close(fd); if (ret == 0) usbd_safely_remove_ex(node_id); } #ifdef SDIO_SUPPORT else if (disk_type == MNT_TYPE_SD) { sd_notify(0); } #endif #ifdef SATA_SUPPORT else if (disk_type == MNT_TYPE_SATA) { sata_notify(0, 0); } #endif #else usbd_safely_remove(); #endif api_dec_wnd_count(); return TRUE; }