static int copy_to_remote(const char *lname, const char *rname) { int code = 0; int fn = s_open_file(rname, NULL, false); if ( fn != -1 ) { linput_t *li = open_linput(lname, false); if ( li != NULL ) { size_t size = qlsize(li); if ( size > 0 ) { char *buf = (char *)qalloc(size); qlread(li, buf, size); if ( s_write_file(fn, 0, buf, size) != ssize_t(size) ) code = qerrcode(); } close_linput(li); } else { code = qerrcode(); } s_close_file(fn); #if DEBUGGER_ID == DEBUGGER_ID_X86_IA32_LINUX_USER // chmod +x s_ioctl(0, rname, strlen(rname)+1, NULL, 0); #endif } else { code = qerrcode(); } return code; }
//-------------------------------------------------------------------------- ssize_t idaapi rpc_debmod_t::dbg_read_file(int fn, uint32 off, void *buf, size_t size) { bytevec_t req = prepare_rpc_packet(RPC_READ_FILE); append_dd(req, fn); append_dd(req, off); append_dd(req, (uint32)size); rpc_packet_t *rp = process_request(req); if ( rp == NULL ) return -1; const uchar *answer = (uchar *)(rp+1); const uchar *end = answer + rp->length; int32 rsize = extract_long(&answer, end); if ( size != rsize ) qerrcode(extract_long(&answer, end)); if ( rsize > 0 ) { if ( rsize > size ) error("rpc_read_file: protocol error"); extract_memory(&answer, end, buf, rsize); } qfree(rp); return rsize; }
//-------------------------------------------------------------------------- int idaapi rpc_debmod_t::dbg_open_file(const char *file, uint32 *fsize, bool readonly) { bytevec_t req = prepare_rpc_packet(RPC_OPEN_FILE); append_str(req, file); append_dd(req, readonly); rpc_packet_t *rp = process_request(req); if ( rp == NULL ) return -1; const uchar *answer = (uchar *)(rp+1); const uchar *end = answer + rp->length; int fn = extract_long(&answer, end); if ( fn != -1 ) { if ( fsize != NULL && readonly ) *fsize = extract_long(&answer, end); } else { qerrcode(extract_long(&answer, end)); } qfree(rp); return fn; }
//-------------------------------------------------------------------------- ssize_t idaapi rpc_debmod_t::dbg_write_file(int fn, uint32 off, const void *buf, size_t size) { bytevec_t req = prepare_rpc_packet(RPC_WRITE_FILE); append_dd(req, fn); append_dd(req, off); append_dd(req, (uint32)size); append_memory(req, buf, size); rpc_packet_t *rp = process_request(req); if ( rp == NULL ) return -1; const uchar *answer = (uchar *)(rp+1); const uchar *end = answer + rp->length; int32 rsize = extract_long(&answer, end); if ( size != rsize ) qerrcode(extract_long(&answer, end)); qfree(rp); return rsize; }