(ql: Qiling, sockfd: int, msg_addr: int, flags: int)
| 696 | |
| 697 | |
| 698 | def ql_syscall_recvmsg(ql: Qiling, sockfd: int, msg_addr: int, flags: int): |
| 699 | sock = get_opened_socket(ql.os, sockfd) |
| 700 | |
| 701 | if isinstance(sock, int): |
| 702 | return sock |
| 703 | |
| 704 | abits = ql.arch.bits |
| 705 | endian = ql.arch.endian |
| 706 | |
| 707 | msghdr = make_msghdr(abits, endian) |
| 708 | msg = msghdr.load_from(ql.mem, msg_addr) |
| 709 | |
| 710 | try: |
| 711 | # TODO: handle the addr |
| 712 | data, ancdata, mflags, addr = sock.recvmsg(msg.msg_namelen, msg.msg_controllen, flags) |
| 713 | except ConnectionError: |
| 714 | return -1 |
| 715 | |
| 716 | iovec = make_iovec(abits, endian) |
| 717 | iovec_addr = msg.msg_iov |
| 718 | written = 0 |
| 719 | |
| 720 | for _ in range(msg.msg_iovlen): |
| 721 | with iovec.ref(ql.mem, iovec_addr) as obj: |
| 722 | size = min(obj.iov_len, len(data) - written) |
| 723 | ql.mem.write(obj.iov_base, data[written:written + size]) |
| 724 | |
| 725 | written += size |
| 726 | iovec_addr += iovec.sizeof() |
| 727 | |
| 728 | cmsghdr = make_cmsghdr(abits, endian) |
| 729 | cmsg_addr = msg.msg_control |
| 730 | |
| 731 | for cmsg_level, cmsg_type, cmsg_data in ancdata: |
| 732 | with cmsghdr.ref(ql.mem, cmsg_addr) as obj: |
| 733 | obj.cmsg_len = len(cmsg_data) |
| 734 | obj.cmsg_level = cmsg_level |
| 735 | obj.cmsg_type = cmsg_type |
| 736 | |
| 737 | cmsg_addr += cmsghdr.sizeof() |
| 738 | |
| 739 | ql.mem.write(cmsg_addr, cmsg_data) |
| 740 | cmsg_addr += len(cmsg_data) |
| 741 | |
| 742 | msg.msg_flags = mflags |
| 743 | msg.save_to(ql.mem, msg_addr) |
| 744 | |
| 745 | return len(data) |
| 746 | |
| 747 | |
| 748 | def ql_syscall_recvfrom(ql: Qiling, sockfd: int, buf: int, length: int, flags: int, addr: int, addrlen: int): |
nothing calls this directly
no test coverage detected