29 enum MC_RPCCMD_NUMBERS
31 MC_RPCCMD_INIT = 0x00,
47 MC_RPCCMD_CHECK_BLOCK,
48 MC_RPCCMD_ERASE_BLOCK = 0x0E,
53 static const int mcRpcCmd[2][17] =
126 unsigned int m_size1;
127 unsigned int m_size2;
130 unsigned char m_data1[16];
131 unsigned char m_data2[16];
132 unsigned char m_padding[16];
137 int m_end_parameter[48];
138 char m_cur_dir[1024];
156 unsigned int m_current_command;
166 MC_INTERFACE_SIO2 = 0,
187 #define LIBMC_PRE_CHECK_FLAG_ONLY_TYPE 1
189 static inline int libmc_pre_rpc_impl(
const libmc_target_desc_t *target,
int flags,
int only_type)
192 if (!target->m_interface_data->m_client_data.server)
195 if ((flags & LIBMC_PRE_CHECK_FLAG_ONLY_TYPE) != 0 && target->m_interface_data->m_mc_rpc_type != only_type)
198 if (target->m_interface_data->m_current_command != MC_FUNC_NONE)
199 return target->m_interface_data->m_current_command;
203 #define LIBMC_PRE_RPC(target, flags, only_type) \
206 cur_ret = libmc_pre_rpc_impl(target, flags, only_type); \
211 static inline int libmc_post_rpc(
const libmc_target_desc_t *target,
int cmd,
int desc_param_or_name_param, SifRpcEndFunc_t end_function,
void *end_param)
217 &target->m_interface_data->m_client_data,
218 mcRpcCmd[target->m_interface_data->m_mc_rpc_type][cmd],
220 desc_param_or_name_param ? (
void *)&(target->m_interface_data->m_name_desc_param.m_desc_param) : (
void *)&(target->m_interface_data->m_name_desc_param.m_name_param),
221 desc_param_or_name_param ?
sizeof(target->m_interface_data->m_name_desc_param.m_desc_param) :
sizeof(target->m_interface_data->m_name_desc_param.m_name_param),
222 &(target->m_interface_data->m_rpc_rdata.m_result),
223 sizeof(target->m_interface_data->m_rpc_rdata.m_result),
230 target->m_interface_data->m_current_command = cmd;
234 static inline void libmc_setup_target(
libmc_target_desc_t *target,
int interface,
int port,
int slot,
int fd)
236 target->m_interface_data = &(g_libmc_internal_data.m_interface_data[interface]);
237 target->m_interface = interface;
238 target->m_port = port;
239 target->m_slot = slot;
254 *(ep->m_p_type) = ptr->type;
257 *(ep->m_p_free) = ptr->free;
260 *(ep->m_p_format) = (ptr->type == MC_TYPE_NONE || *(ep->m_p_result) == -2) ? 0 : 1;
272 *(ep->m_p_type) = ptr->type;
275 *(ep->m_p_free) = ptr->free;
278 *(ep->m_p_format) = ptr->formatted;
291 for (i = 0, dest = (u8*)ptr->dest1; i < ptr->size1; i++)
292 dest[i] = ptr->src1[i];
293 for (i = 0, dest = (u8*)ptr->dest2; i < ptr->size2; i++)
294 dest[i] = ptr->src2[i];
307 for (i = 0, dest = (u8*)ptr->dest1; i < ptr->size1; i++)
308 dest[i] = ptr->src1[i];
309 for (i = 0, dest = (u8*)ptr->dest2; i < ptr->size2; i++)
310 dest[i] = ptr->src2[i];
320 char *currentDir = ep->m_extra_send_recv_param->m_cur_dir;
321 len = strlen(currentDir);
323 len = strlen(currentDir+1023);
324 memcpy(ep->m_dst_cur_dir, currentDir, len);
325 *(currentDir+len) = 0;
328 static void libmc_ReadAlignFunction(
void *arg)
332 unsigned int misaligned;
334 if ((misaligned=(
unsigned int)data->m_dest1&0xF)!=0)
336 memcpy(UNCACHED_SEG(data->m_dest1), UNCACHED_SEG(data->m_data1),
sizeof(data->m_data1)-misaligned);
337 memcpy(UNCACHED_SEG((
unsigned int)data->m_dest1+(
sizeof(data->m_data1)-misaligned)), UNCACHED_SEG((
unsigned int)data->m_data1+(
sizeof(data->m_data1)-misaligned)+0x1F0), misaligned);
345 int ret, err, rpc_id;
346 const mcRpcStat_t *rpcStat = (
const mcRpcStat_t*)UNCACHED_SEG(&target->m_interface_data->m_rpc_rdata.m_rpcStat);
349 libmc_rpc_reset(NULL);
350 switch (target->m_interface)
352 case MC_INTERFACE_SIO2:
356 case MC_INTERFACE_DEV9:
361 if (target->m_interface_data->m_client_data.server)
369 if ((ret=sceSifBindRpc(&target->m_interface_data->m_client_data, rpc_id, 0)) < 0)
372 printf(
"libmc: bind error\n");
377 if (target->m_interface_data->m_client_data.server == NULL)
380 while (target->m_interface_data->m_client_data.server == NULL);
388 target->m_interface_data->m_name_desc_param.m_desc_param.fd = 0xFFFFFFFF;
389 sceSifCallRpc(&target->m_interface_data->m_client_data, mcRpcCmd[MC_TYPE_XMC][MC_RPCCMD_FLUSH], 0, &(target->m_interface_data->m_name_desc_param.m_desc_param),
sizeof(target->m_interface_data->m_name_desc_param.m_desc_param), &target->m_interface_data->m_rpc_rdata, 4, NULL, NULL);
390 sceSifCallRpc(&target->m_interface_data->m_client_data, mcRpcCmd[MC_TYPE_MC][MC_RPCCMD_FLUSH], 0, &(target->m_interface_data->m_name_desc_param.m_desc_param),
sizeof(target->m_interface_data->m_name_desc_param.m_desc_param), &target->m_interface_data->m_rpc_rdata, 4, NULL, NULL);
392 printf(
"libmc: using XMCMAN & XMCSERV\n");
397 target->m_interface_data->m_mc_rpc_type = MC_TYPE_XMC;
399 if ((ret = sceSifCallRpc(&target->m_interface_data->m_client_data, mcRpcCmd[target->m_interface_data->m_mc_rpc_type][MC_RPCCMD_INIT], 0, &(target->m_interface_data->m_name_desc_param.m_desc_param),
sizeof(target->m_interface_data->m_name_desc_param.m_desc_param), &target->m_interface_data->m_rpc_rdata, 12, NULL, NULL)) < 0)
403 printf(
"libmc: initialisation error\n");
409 if (!err && rpcStat->result == sceMcResDeniedPermit)
417 if (rpcStat->mcserv_version < 0x205)
420 printf(
"libmc: mcserv is too old (%x)\n", rpcStat->mcserv_version);
426 if (rpcStat->mcman_version < 0x206)
429 printf(
"libmc: mcman is too old (%x)\n", rpcStat->mcman_version);
437 ret = rpcStat->result;
440 if (err && rpcStat->result == sceMcResDeniedPermit)
445 target->m_interface_data->m_mc_rpc_type = MC_TYPE_MC;
447 printf(
"libmc: using MCMAN & MCSERV\n");
450 target->m_interface_data->m_name_desc_param.m_desc_param.offset = -217;
453 if ((ret = sceSifCallRpc(&target->m_interface_data->m_client_data, mcRpcCmd[target->m_interface_data->m_mc_rpc_type][MC_RPCCMD_INIT], 0, &(target->m_interface_data->m_name_desc_param.m_desc_param),
sizeof(target->m_interface_data->m_name_desc_param.m_desc_param), &target->m_interface_data->m_rpc_rdata, 4, NULL, NULL)) < 0)
457 printf(
"libmc: initialisation error\n");
463 if (!err && rpcStat->result == sceMcResDeniedPermit)
470 ret = target->m_interface_data->m_rpc_rdata.m_result;
476 libmc_rpc_reset(target);
481 target->m_interface_data->m_current_command = MC_FUNC_NONE;
485 static int libmc_rpc_get_info(
const libmc_target_desc_t *target,
int* type,
int* free,
int* format)
487 LIBMC_PRE_RPC(target, 0, 0);
490 target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
491 target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
492 if (target->m_interface_data->m_mc_rpc_type == MC_TYPE_MC)
494 target->m_interface_data->m_name_desc_param.m_desc_param.size = (type) ? 1 : 0;
495 target->m_interface_data->m_name_desc_param.m_desc_param.offset = (free) ? 1 : 0;
496 target->m_interface_data->m_name_desc_param.m_desc_param.origin = (format) ? 1 : 0;
500 target->m_interface_data->m_name_desc_param.m_desc_param.size = (format) ? 1 : 0;
501 target->m_interface_data->m_name_desc_param.m_desc_param.offset = (free) ? 1 : 0;
502 target->m_interface_data->m_name_desc_param.m_desc_param.origin = (type) ? 1 : 0;
504 target->m_interface_data->m_name_desc_param.m_desc_param.param = target->m_interface_data->m_extra_send_recv_param.m_end_parameter;
505 target->m_interface_data->m_extra_end_param.m_p_type = type;
506 target->m_interface_data->m_extra_end_param.m_p_free = free;
507 target->m_interface_data->m_extra_end_param.m_p_format = format;
508 sceSifWriteBackDCache(target->m_interface_data->m_extra_send_recv_param.m_end_parameter,
sizeof(target->m_interface_data->m_extra_send_recv_param.m_end_parameter));
509 target->m_interface_data->m_extra_end_param.m_extra_send_recv_param = UNCACHED_SEG(&target->m_interface_data->m_extra_send_recv_param);
510 target->m_interface_data->m_extra_end_param.m_p_result = UNCACHED_SEG(&target->m_interface_data->m_rpc_rdata.m_result);
512 return libmc_post_rpc(target, MC_RPCCMD_GET_INFO, 1, (target->m_interface_data->m_mc_rpc_type == MC_TYPE_MC) ? (SifRpcEndFunc_t)
mcGetInfoApdxOld : (SifRpcEndFunc_t)
mcGetInfoApdxNew, &target->m_interface_data->m_extra_end_param);
517 LIBMC_PRE_RPC(target, 0, 0);
520 target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
521 target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
522 target->m_interface_data->m_name_desc_param.m_name_param.m_flags = mode;
523 strlcpy(target->m_interface_data->m_name_desc_param.m_name_param.m_name, name,
sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name));
525 return libmc_post_rpc(target, MC_RPCCMD_OPEN, 0, NULL, NULL);
530 LIBMC_PRE_RPC(target, 0, 0);
533 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
535 return libmc_post_rpc(target, MC_RPCCMD_CLOSE, 1, NULL, NULL);
540 LIBMC_PRE_RPC(target, 0, 0);
543 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
544 target->m_interface_data->m_name_desc_param.m_desc_param.offset = offset;
545 target->m_interface_data->m_name_desc_param.m_desc_param.origin = origin;
547 return libmc_post_rpc(target, MC_RPCCMD_SEEK, 1, NULL, NULL);
552 LIBMC_PRE_RPC(target, 0, 0);
555 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
556 target->m_interface_data->m_name_desc_param.m_desc_param.size = size;
557 target->m_interface_data->m_name_desc_param.m_desc_param.buffer = buffer;
558 target->m_interface_data->m_name_desc_param.m_desc_param.param = target->m_interface_data->m_extra_send_recv_param.m_end_parameter;
559 sceSifWriteBackDCache(buffer, size);
560 sceSifWriteBackDCache(target->m_interface_data->m_extra_send_recv_param.m_end_parameter,
sizeof(target->m_interface_data->m_extra_send_recv_param.m_end_parameter));
561 target->m_interface_data->m_extra_end_param.m_extra_send_recv_param = UNCACHED_SEG(&target->m_interface_data->m_extra_send_recv_param);
563 return libmc_post_rpc(target, MC_RPCCMD_READ, 1, (target->m_interface_data->m_mc_rpc_type == MC_TYPE_MC) ? (SifRpcEndFunc_t)
mcReadFixAlignOld : (SifRpcEndFunc_t)
mcReadFixAlignNew, &target->m_interface_data->m_extra_end_param);
566 static int libmc_rpc_write(
const libmc_target_desc_t *target,
const void *buffer,
int size)
570 LIBMC_PRE_RPC(target, 0, 0);
573 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
576 target->m_interface_data->m_name_desc_param.m_desc_param.size = 0;
577 target->m_interface_data->m_name_desc_param.m_desc_param.origin = size;
578 target->m_interface_data->m_name_desc_param.m_desc_param.buffer = 0;
582 target->m_interface_data->m_name_desc_param.m_desc_param.size = size - ( ((int)((
const u8 *)buffer-1) & 0xFFFFFFF0) - (int)((
const u8 *)buffer-16) );
583 target->m_interface_data->m_name_desc_param.m_desc_param.origin = ( ((int)((
const u8 *)buffer-1) & 0xFFFFFFF0) - (int)((
const u8 *)buffer-16) );
584 target->m_interface_data->m_name_desc_param.m_desc_param.buffer = (
void*)((
int)(
const u8 *)buffer + ( ((
int)((
const u8 *)buffer-1) & 0xFFFFFFF0) - (
int)((
const u8 *)buffer-16) ));
586 for (i = 0; i < target->m_interface_data->m_name_desc_param.m_desc_param.origin; i++)
588 target->m_interface_data->m_name_desc_param.m_desc_param.data[i] = *(
char*)((
const u8 *)buffer+i);
592 return libmc_post_rpc(target, MC_RPCCMD_WRITE, 1, NULL, NULL);
597 LIBMC_PRE_RPC(target, 0, 0);
600 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
602 return libmc_post_rpc(target, MC_RPCCMD_FLUSH, 1, NULL, NULL);
609 ret = libmc_rpc_open(target, name, 0x40);
611 target->m_interface_data->m_current_command = MC_FUNC_MK_DIR;
615 static int libmc_rpc_chdir(
const libmc_target_desc_t *target,
const char* newDir,
char* currentDir)
617 LIBMC_PRE_RPC(target, 0, 0);
620 target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
621 target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
622 target->m_interface_data->m_name_desc_param.m_name_param.m_curdir = target->m_interface_data->m_extra_send_recv_param.m_cur_dir;
623 strlcpy(target->m_interface_data->m_name_desc_param.m_name_param.m_name, newDir,
sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name));
624 sceSifWriteBackDCache(target->m_interface_data->m_extra_send_recv_param.m_cur_dir,
sizeof(target->m_interface_data->m_extra_send_recv_param.m_cur_dir));
625 target->m_interface_data->m_extra_end_param.m_dst_cur_dir = currentDir;
626 target->m_interface_data->m_extra_end_param.m_extra_send_recv_param = UNCACHED_SEG(&target->m_interface_data->m_extra_send_recv_param);
628 return libmc_post_rpc(target, MC_RPCCMD_CH_DIR, 0, (SifRpcEndFunc_t)
mcStoreDir, &target->m_interface_data->m_extra_end_param);
633 LIBMC_PRE_RPC(target, 0, 0);
636 target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
637 target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
638 target->m_interface_data->m_name_desc_param.m_name_param.m_flags = mode;
639 target->m_interface_data->m_name_desc_param.m_name_param.m_maxent = maxent;
640 target->m_interface_data->m_name_desc_param.m_name_param.m_mcT = table;
641 strlcpy(target->m_interface_data->m_name_desc_param.m_name_param.m_name, name,
sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name));
644 return libmc_post_rpc(target, MC_RPCCMD_GET_DIR, 0, NULL, NULL);
649 LIBMC_PRE_RPC(target, 0, 0);
652 target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
653 target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
654 target->m_interface_data->m_name_desc_param.m_name_param.m_flags = flags;
655 target->m_interface_data->m_name_desc_param.m_name_param.m_mcT = &(target->m_interface_data->m_extra_send_recv_param.m_file_info_buff);
656 memcpy(&(target->m_interface_data->m_extra_send_recv_param.m_file_info_buff),
info,
sizeof(
sceMcTblGetDir));
658 strlcpy(target->m_interface_data->m_name_desc_param.m_name_param.m_name, name,
sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name));
661 return libmc_post_rpc(target, MC_RPCCMD_SET_INFO, 0, NULL, NULL);
666 LIBMC_PRE_RPC(target, 0, 0);
669 target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
670 target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
671 target->m_interface_data->m_name_desc_param.m_name_param.m_flags = 0;
672 strlcpy(target->m_interface_data->m_name_desc_param.m_name_param.m_name, name,
sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name));
674 return libmc_post_rpc(target, MC_RPCCMD_DELETE, 0, NULL, NULL);
679 LIBMC_PRE_RPC(target, 0, 0);
682 target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
683 target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
685 return libmc_post_rpc(target, MC_RPCCMD_FORMAT, 1, NULL, NULL);
690 LIBMC_PRE_RPC(target, 0, 0);
693 target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
694 target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
696 return libmc_post_rpc(target, MC_RPCCMD_UNFORMAT, 1, NULL, NULL);
701 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_XMC);
704 target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
705 target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
706 strlcpy(target->m_interface_data->m_name_desc_param.m_name_param.m_name, path,
sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name));
708 return libmc_post_rpc(target, MC_RPCCMD_GET_ENT, 0, NULL, NULL);
711 static int libmc_rpc_rename(
const libmc_target_desc_t *target,
const char* oldName,
const char* newName)
714 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_XMC);
717 target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
718 target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
719 target->m_interface_data->m_name_desc_param.m_name_param.m_flags = 0x10;
720 target->m_interface_data->m_name_desc_param.m_name_param.m_mcT = &(target->m_interface_data->m_extra_send_recv_param.m_file_info_buff);
721 strlcpy(target->m_interface_data->m_name_desc_param.m_name_param.m_name, oldName,
sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name));
722 strlcpy((
char*)target->m_interface_data->m_extra_send_recv_param.m_file_info_buff.EntryName, newName,
sizeof(target->m_interface_data->m_extra_send_recv_param.m_file_info_buff.EntryName));
725 return libmc_post_rpc(target, MC_RPCCMD_SET_INFO, 0, NULL, NULL);
730 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_MC);
732 target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
733 target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
734 target->m_interface_data->m_name_desc_param.m_desc_param.offset = block;
735 target->m_interface_data->m_name_desc_param.m_desc_param.origin = mode;
737 return libmc_post_rpc(target, MC_RPCCMD_ERASE_BLOCK, 1, NULL, NULL);
740 static int libmc_rpc_read_page(
const libmc_target_desc_t *target,
unsigned int page,
void *buffer)
742 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_MC);
744 target->m_interface_data->m_name_desc_param.m_desc_param.fd = page;
745 target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
746 target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
747 target->m_interface_data->m_name_desc_param.m_desc_param.buffer = buffer;
748 target->m_interface_data->m_name_desc_param.m_desc_param.param = &(target->m_interface_data->m_extra_send_recv_param.m_page_read_align_data);
750 sceSifWriteBackDCache(buffer, 0x200);
752 return libmc_post_rpc(target, MC_RPCCMD_READ_PAGE, 1, &libmc_ReadAlignFunction, UNCACHED_SEG(&target->m_interface_data->m_extra_send_recv_param));
755 static int libmc_rpc_write_page(
const libmc_target_desc_t *target,
int page,
const void *buffer)
759 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_MC);
761 target->m_interface_data->m_name_desc_param.m_desc_param.fd = page;
762 target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
763 target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
764 target->m_interface_data->m_name_desc_param.m_desc_param.buffer = (
void*)buffer;
766 sceSifWriteBackDCache((
void*)buffer, 512);
768 if ((misaligned=(
unsigned int)buffer&0xF)!=0)
770 memcpy(target->m_interface_data->m_name_desc_param.m_desc_param.data, buffer, 16-misaligned);
771 memcpy((
void*)(target->m_interface_data->m_name_desc_param.m_desc_param.data+(16-misaligned)), (
void*)((
const u8 *)buffer+(16-misaligned)+0x1F0), misaligned);
774 return libmc_post_rpc(target, MC_RPCCMD_WRITE_PAGE, 1, NULL, NULL);
781 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_XMC);
786 return libmc_post_rpc(target, MC_RPCCMD_CHG_PRITY, 1, NULL, NULL);
789 static int libmc_rpc_sync(
const libmc_target_desc_t *target,
int mode,
int *cmd,
int *result)
794 if (target->m_interface_data->m_current_command == MC_FUNC_NONE)
798 funcIsExecuting = sceSifCheckStatRpc(&target->m_interface_data->m_client_data);
803 while (sceSifCheckStatRpc(&target->m_interface_data->m_client_data))
806 for (i=0; i<100000; i++)
815 *cmd = target->m_interface_data->m_current_command;
818 if (funcIsExecuting == 1)
822 target->m_interface_data->m_current_command = MC_FUNC_NONE;
826 *result = target->m_interface_data->m_rpc_rdata.m_result;
835 memset(&(target->m_interface_data->m_client_data), 0,
sizeof(target->m_interface_data->m_client_data));
840 for (i = 0; i < (
sizeof(g_libmc_internal_data.m_interface_data)/
sizeof(g_libmc_internal_data.m_interface_data[0])); i += 1)
842 memset(&(g_libmc_internal_data.m_interface_data[i].m_client_data), 0,
sizeof(g_libmc_internal_data.m_interface_data[i].m_client_data));
853 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
854 return libmc_rpc_init(&target);
857 int mcGetInfo(
int port,
int slot,
int* type,
int* free,
int* format)
861 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
862 return libmc_rpc_get_info(&target, type, free, format);
865 int mcOpen(
int port,
int slot,
const char *name,
int mode)
869 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
870 return libmc_rpc_open(&target, name, mode);
877 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
878 return libmc_rpc_close(&target);
881 int mcSeek(
int fd,
int offset,
int origin)
885 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
886 return libmc_rpc_seek(&target, offset, origin);
889 int mcRead(
int fd,
void *buffer,
int size)
893 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
894 return libmc_rpc_read(&target, buffer, size);
897 int mcWrite(
int fd,
const void *buffer,
int size)
901 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
902 return libmc_rpc_write(&target, buffer, size);
909 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
910 return libmc_rpc_flush(&target);
913 int mcMkDir(
int port,
int slot,
const char* name)
917 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
918 return libmc_rpc_mkdir(&target, name);
921 int mcChdir(
int port,
int slot,
const char* newDir,
char* currentDir)
925 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
926 return libmc_rpc_chdir(&target, newDir, currentDir);
933 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
934 return libmc_rpc_getdir(&target, name, mode, maxent, table);
941 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
942 return libmc_rpc_setfileinfo(&target, name,
info, flags);
949 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
950 return libmc_rpc_delete(&target, name);
957 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
958 return libmc_rpc_format(&target);
965 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
966 return libmc_rpc_unformat(&target);
973 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
974 return libmc_rpc_get_ent_space(&target, path);
977 int mcRename(
int port,
int slot,
const char* oldName,
const char* newName)
981 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
982 return libmc_rpc_rename(&target, oldName, newName);
989 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
990 return libmc_rpc_erase_block(&target, block, mode);
993 int mcReadPage(
int port,
int slot,
unsigned int page,
void *buffer)
997 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
998 return libmc_rpc_read_page(&target, page, buffer);
1005 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
1006 return libmc_rpc_write_page(&target, page, buffer);
1013 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
1014 return libmc_rpc_change_thread_priority(&target, level);
1021 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
1022 return libmc_rpc_sync(&target, mode, cmd, result);
1029 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
1030 return libmc_rpc_reset(&target);
1038 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1039 return libmc_rpc_init(&target);
1046 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1047 return libmc_rpc_get_info(&target, type, free, format);
1050 int xfromOpen(
int port,
int slot,
const char *name,
int mode)
1054 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1055 return libmc_rpc_open(&target, name, mode);
1062 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1063 return libmc_rpc_close(&target);
1070 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1071 return libmc_rpc_seek(&target, offset, origin);
1078 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1079 return libmc_rpc_read(&target, buffer, size);
1086 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1087 return libmc_rpc_write(&target, buffer, size);
1094 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1095 return libmc_rpc_flush(&target);
1102 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1103 return libmc_rpc_mkdir(&target, name);
1106 int xfromChdir(
int port,
int slot,
const char* newDir,
char* currentDir)
1110 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1111 return libmc_rpc_chdir(&target, newDir, currentDir);
1118 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1119 return libmc_rpc_getdir(&target, name, mode, maxent, table);
1126 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1127 return libmc_rpc_setfileinfo(&target, name,
info, flags);
1134 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1135 return libmc_rpc_delete(&target, name);
1142 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1143 return libmc_rpc_format(&target);
1150 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1151 return libmc_rpc_unformat(&target);
1158 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1159 return libmc_rpc_get_ent_space(&target, path);
1162 int xfromRename(
int port,
int slot,
const char* oldName,
const char* newName)
1166 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1167 return libmc_rpc_rename(&target, oldName, newName);
1174 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1175 return libmc_rpc_erase_block(&target, block, mode);
1182 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1183 return libmc_rpc_read_page(&target, page, buffer);
1190 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1191 return libmc_rpc_write_page(&target, page, buffer);
1198 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1199 return libmc_rpc_change_thread_priority(&target, level);
1206 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1207 return libmc_rpc_sync(&target, mode, cmd, result);
1214 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1215 return libmc_rpc_reset(&target);