MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / lwip_sendmsg

Function lwip_sendmsg

components/net/lwip/lwip-2.1.2/src/api/sockets.c:1443–1604  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1441}
1442
1443ssize_t
1444lwip_sendmsg(int s, const struct msghdr *msg, int flags)
1445{
1446 struct lwip_sock *sock;
1447#if LWIP_TCP
1448 u8_t write_flags;
1449 size_t written;
1450#endif
1451 err_t err = ERR_OK;
1452
1453 sock = get_socket(s);
1454 if (!sock) {
1455 return -1;
1456 }
1457
1458 LWIP_ERROR("lwip_sendmsg: invalid msghdr", msg != NULL,
1459 sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
1460 LWIP_ERROR("lwip_sendmsg: invalid msghdr iov", msg->msg_iov != NULL,
1461 sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
1462 LWIP_ERROR("lwip_sendmsg: maximum iovs exceeded", (msg->msg_iovlen > 0) && (msg->msg_iovlen <= IOV_MAX),
1463 sock_set_errno(sock, EMSGSIZE); done_socket(sock); return -1;);
1464 LWIP_ERROR("lwip_sendmsg: unsupported flags", (flags & ~(MSG_DONTWAIT | MSG_MORE)) == 0,
1465 sock_set_errno(sock, EOPNOTSUPP); done_socket(sock); return -1;);
1466
1467 LWIP_UNUSED_ARG(msg->msg_control);
1468 LWIP_UNUSED_ARG(msg->msg_controllen);
1469 LWIP_UNUSED_ARG(msg->msg_flags);
1470
1471 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
1472#if LWIP_TCP
1473 write_flags = (u8_t)(NETCONN_COPY |
1474 ((flags & MSG_MORE) ? NETCONN_MORE : 0) |
1475 ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0));
1476
1477 written = 0;
1478 err = netconn_write_vectors_partly(sock->conn, (struct netvector *)msg->msg_iov, (u16_t)msg->msg_iovlen, write_flags, &written);
1479 sock_set_errno(sock, err_to_errno(err));
1480 done_socket(sock);
1481 /* casting 'written' to ssize_t is OK here since the netconn API limits it to SSIZE_MAX */
1482 return (err == ERR_OK ? (ssize_t)written : -1);
1483#else /* LWIP_TCP */
1484 sock_set_errno(sock, err_to_errno(ERR_ARG));
1485 done_socket(sock);
1486 return -1;
1487#endif /* LWIP_TCP */
1488 }
1489 /* else, UDP and RAW NETCONNs */
1490#if LWIP_UDP || LWIP_RAW
1491 {
1492 struct netbuf chain_buf;
1493 int i;
1494 ssize_t size = 0;
1495
1496 LWIP_UNUSED_ARG(flags);
1497 LWIP_ERROR("lwip_sendmsg: invalid msghdr name", (((msg->msg_name == NULL) && (msg->msg_namelen == 0)) ||
1498 IS_SOCK_ADDR_LEN_VALID(msg->msg_namelen)),
1499 sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
1500

Callers 3

lwip_writevFunction · 0.70
test_sockets_msgapi_tcpFunction · 0.50

Calls 12

done_socketFunction · 0.85
get_socketFunction · 0.70
err_to_errnoFunction · 0.70
netconn_typeEnum · 0.70
netbuf_allocFunction · 0.70
netconn_sendFunction · 0.70
netbuf_freeFunction · 0.70
inet_chksum_pbufFunction · 0.50
pbuf_allocFunction · 0.50
pbuf_freeFunction · 0.50
pbuf_catFunction · 0.50

Tested by 2

test_sockets_msgapi_tcpFunction · 0.40