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