* @brief Sends data to a specific address using a socket. * * This system call is used to send data from a socket to a specified address. It is commonly * used with connectionless sockets (e.g., UDP) but can also be used with connection-oriented * sockets if the destination address needs to be overridden. * * @param[in] socket The socket descriptor used for sending data. It must be valid a
| 6048 | * @see sys_send(), sys_sendmsg(), sys_recvfrom() |
| 6049 | */ |
| 6050 | sysret_t sys_sendto(int socket, const void *dataptr, size_t size, int flags, |
| 6051 | const struct musl_sockaddr *to, socklen_t tolen) |
| 6052 | { |
| 6053 | int flgs = 0; |
| 6054 | #ifdef ARCH_MM_MMU |
| 6055 | int ret = -1; |
| 6056 | void *kmem = RT_NULL; |
| 6057 | #endif |
| 6058 | |
| 6059 | flgs = netflags_muslc_2_lwip(flags); |
| 6060 | #ifdef ARCH_MM_MMU |
| 6061 | if (!size) |
| 6062 | { |
| 6063 | return -EINVAL; |
| 6064 | } |
| 6065 | |
| 6066 | if (!lwp_user_accessable((void *)dataptr, size)) |
| 6067 | { |
| 6068 | return -EFAULT; |
| 6069 | } |
| 6070 | |
| 6071 | kmem = kmem_get(size); |
| 6072 | if (!kmem) |
| 6073 | { |
| 6074 | return -ENOMEM; |
| 6075 | } |
| 6076 | |
| 6077 | lwp_get_from_user(kmem, (void *)dataptr, size); |
| 6078 | |
| 6079 | if (to) |
| 6080 | { |
| 6081 | struct sockaddr sa; |
| 6082 | sockaddr_tolwip(to, &sa); |
| 6083 | |
| 6084 | ret = sendto(socket, kmem, size, flgs, &sa, tolen); |
| 6085 | } |
| 6086 | else |
| 6087 | { |
| 6088 | ret = sendto(socket, kmem, size, flgs, NULL, tolen); |
| 6089 | } |
| 6090 | |
| 6091 | if (ret < 0) |
| 6092 | { |
| 6093 | ret = GET_ERRNO(); |
| 6094 | } |
| 6095 | |
| 6096 | kmem_put(kmem); |
| 6097 | |
| 6098 | return ret; |
| 6099 | #else |
| 6100 | int ret; |
| 6101 | if (to) |
| 6102 | { |
| 6103 | struct sockaddr sa; |
| 6104 | sockaddr_tolwip(to, &sa); |
| 6105 | |
| 6106 | ret = sendto(socket, dataptr, size, flgs, &sa, tolen); |
| 6107 | } |
nothing calls this directly
no test coverage detected