| 1401 | } |
| 1402 | |
| 1403 | ssize_t |
| 1404 | lwip_send(int s, const void *data, size_t size, int flags) |
| 1405 | { |
| 1406 | struct lwip_sock *sock; |
| 1407 | err_t err; |
| 1408 | u8_t write_flags; |
| 1409 | size_t written; |
| 1410 | |
| 1411 | LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d, data=%p, size=%"SZT_F", flags=0x%x)\n", |
| 1412 | s, data, size, flags)); |
| 1413 | |
| 1414 | sock = get_socket(s); |
| 1415 | if (!sock) { |
| 1416 | return -1; |
| 1417 | } |
| 1418 | |
| 1419 | if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) { |
| 1420 | #if (LWIP_UDP || LWIP_RAW) |
| 1421 | done_socket(sock); |
| 1422 | return lwip_sendto(s, data, size, flags, NULL, 0); |
| 1423 | #else /* (LWIP_UDP || LWIP_RAW) */ |
| 1424 | sock_set_errno(sock, err_to_errno(ERR_ARG)); |
| 1425 | done_socket(sock); |
| 1426 | return -1; |
| 1427 | #endif /* (LWIP_UDP || LWIP_RAW) */ |
| 1428 | } |
| 1429 | |
| 1430 | write_flags = (u8_t)(NETCONN_COPY | |
| 1431 | ((flags & MSG_MORE) ? NETCONN_MORE : 0) | |
| 1432 | ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0)); |
| 1433 | written = 0; |
| 1434 | err = netconn_write_partly(sock->conn, data, size, write_flags, &written); |
| 1435 | |
| 1436 | LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d) err=%d written=%"SZT_F"\n", s, err, written)); |
| 1437 | sock_set_errno(sock, err_to_errno(err)); |
| 1438 | done_socket(sock); |
| 1439 | /* casting 'written' to ssize_t is OK here since the netconn API limits it to SSIZE_MAX */ |
| 1440 | return (err == ERR_OK ? (ssize_t)written : -1); |
| 1441 | } |
| 1442 | |
| 1443 | ssize_t |
| 1444 | lwip_sendmsg(int s, const struct msghdr *msg, int flags) |