syscall_emul.cc (13570:b6484720c6a9) | syscall_emul.cc (13571:a320800ceccf) |
---|---|
1/* 2 * Copyright (c) 2003-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 1553 unchanged lines hidden (view full) --- 1562 /** 1563 * Malloced above. 1564 */ 1565 free(bufferArray); 1566 1567 return (sent_size < 0) ? -local_errno : sent_size; 1568} 1569 | 1/* 2 * Copyright (c) 2003-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 1553 unchanged lines hidden (view full) --- 1562 /** 1563 * Malloced above. 1564 */ 1565 free(bufferArray); 1566 1567 return (sent_size < 0) ? -local_errno : sent_size; 1568} 1569 |
1570SyscallReturn 1571getsockoptFunc(SyscallDesc *desc, int num, Process *p, ThreadContext *tc) 1572{ 1573 // union of all possible return value types from getsockopt 1574 union val { 1575 int i_val; 1576 long l_val; 1577 struct linger linger_val; 1578 struct timeval timeval_val; 1579 } val; 1580 1581 int index = 0; 1582 int tgt_fd = p->getSyscallArg(tc, index); 1583 int level = p->getSyscallArg(tc, index); 1584 int optname = p->getSyscallArg(tc, index); 1585 Addr valPtr = p->getSyscallArg(tc, index); 1586 Addr lenPtr = p->getSyscallArg(tc, index); 1587 1588 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]); 1589 if (!sfdp) 1590 return -EBADF; 1591 int sim_fd = sfdp->getSimFD(); 1592 1593 socklen_t len = sizeof(val); 1594 int status = getsockopt(sim_fd, level, optname, &val, &len); 1595 1596 if (status == -1) 1597 return -errno; 1598 1599 // copy val to valPtr and pass it on 1600 BufferArg valBuf(valPtr, sizeof(val)); 1601 memcpy(valBuf.bufferPtr(), &val, sizeof(val)); 1602 valBuf.copyOut(tc->getMemProxy()); 1603 1604 // copy len to lenPtr and pass it on 1605 BufferArg lenBuf(lenPtr, sizeof(len)); 1606 memcpy(lenBuf.bufferPtr(), &len, sizeof(len)); 1607 lenBuf.copyOut(tc->getMemProxy()); 1608 1609 return status; 1610} 1611 1612SyscallReturn 1613getsocknameFunc(SyscallDesc *desc, int num, Process *p, ThreadContext *tc) 1614{ 1615 int index = 0; 1616 int tgt_fd = p->getSyscallArg(tc, index); 1617 Addr addrPtr = p->getSyscallArg(tc, index); 1618 Addr lenPtr = p->getSyscallArg(tc, index); 1619 1620 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]); 1621 if (!sfdp) 1622 return -EBADF; 1623 int sim_fd = sfdp->getSimFD(); 1624 1625 // lenPtr is an in-out paramenter: 1626 // sending the address length in, conveying the final length out 1627 1628 // Read in the value of len from the passed pointer. 1629 BufferArg lenBuf(lenPtr, sizeof(socklen_t)); 1630 lenBuf.copyIn(tc->getMemProxy()); 1631 socklen_t len = *(socklen_t *)lenBuf.bufferPtr(); 1632 1633 struct sockaddr sa; 1634 int status = getsockname(sim_fd, &sa, &len); 1635 1636 if (status == -1) 1637 return -errno; 1638 1639 // Copy address to addrPtr and pass it on. 1640 BufferArg addrBuf(addrPtr, sizeof(sa)); 1641 memcpy(addrBuf.bufferPtr(), &sa, sizeof(sa)); 1642 addrBuf.copyOut(tc->getMemProxy()); 1643 1644 // Copy len to lenPtr and pass it on. 1645 *(socklen_t *)lenBuf.bufferPtr() = len; 1646 lenBuf.copyOut(tc->getMemProxy()); 1647 1648 return status; 1649} 1650 1651SyscallReturn 1652getpeernameFunc(SyscallDesc *desc, int num, Process *p, ThreadContext *tc) 1653{ 1654 int index = 0; 1655 int tgt_fd = p->getSyscallArg(tc, index); 1656 Addr sockAddrPtr = p->getSyscallArg(tc, index); 1657 Addr addrlenPtr = p->getSyscallArg(tc, index); 1658 1659 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]); 1660 if (!sfdp) 1661 return -EBADF; 1662 int sim_fd = sfdp->getSimFD(); 1663 1664 BufferArg bufAddrlen(addrlenPtr, sizeof(unsigned)); 1665 bufAddrlen.copyIn(tc->getMemProxy()); 1666 BufferArg bufSock(sockAddrPtr, *(unsigned *)bufAddrlen.bufferPtr()); 1667 1668 int retval = getpeername(sim_fd, 1669 (struct sockaddr *)bufSock.bufferPtr(), 1670 (unsigned *)bufAddrlen.bufferPtr()); 1671 1672 if (retval != -1) { 1673 bufSock.copyOut(tc->getMemProxy()); 1674 bufAddrlen.copyOut(tc->getMemProxy()); 1675 } 1676 1677 return (retval == -1) ? -errno : retval; 1678} 1679 1680SyscallReturn 1681setsockoptFunc(SyscallDesc *desc, int num, Process *p, ThreadContext *tc) 1682{ 1683 int index = 0; 1684 int tgt_fd = p->getSyscallArg(tc, index); 1685 int level = p->getSyscallArg(tc, index); 1686 int optname = p->getSyscallArg(tc, index); 1687 Addr valPtr = p->getSyscallArg(tc, index); 1688 socklen_t len = p->getSyscallArg(tc, index); 1689 1690 BufferArg valBuf(valPtr, len); 1691 valBuf.copyIn(tc->getMemProxy()); 1692 1693 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]); 1694 if (!sfdp) 1695 return -EBADF; 1696 int sim_fd = sfdp->getSimFD(); 1697 1698 int status = setsockopt(sim_fd, level, optname, 1699 (struct sockaddr *)valBuf.bufferPtr(), len); 1700 1701 return (status == -1) ? -errno : status; 1702} 1703 |
|