@samitouri / QOSamiQemu / commits / 7a1888ac45

bsd-user: Add do_ioctl_in6_ifreq_sockaddr_int function

Add special handler for IPv6 interface request ioctls that take a sockaddr_in6 structure as input and return an integer flag value, such as SIOCGIFAFLAG_IN6 and SIOCGIFALIFETIME_IN6. Signed-off-by: Stacey Son <sson@FreeBSD.org> Reviewed-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> Signed-off-by: Warner Losh <imp@bsdimp.com>

Stacey Son committed Mar 14, 2026 at 11:41 UTC 7a1888ac45ef12f378f88faba1dd205d6ec203a6
1 file changed +32
bsd-user/bsd-ioctl.c
+32
@@ -260,3 +260,35 @@ static void target_to_host_sockaddr_in6(struct sockaddr_in6 *hsa_in6,
260 memcpy(&hsa_in6->sin6_addr, &tsa_in6->sin6_addr, 16);
261 __get_user(hsa_in6->sin6_scope_id, &tsa_in6->sin6_scope_id);
262 }
263 +
264 +/*
265 + * For ioctl()'s such as SIOCGIFAFLAG_IN6 and SIOCGIFALIFETIME_IN6 that
266 + * passes a struct sockaddr_in6 in and gets an int out using
267 + * struct in6_ifreq.
268 + */
269 +static abi_long do_ioctl_in6_ifreq_sockaddr_int(const IOCTLEntry *ie,
270 + uint8_t *buf_temp, int fd, abi_long cmd, abi_long arg)
271 +{
272 + abi_long ret;
273 + struct target_in6_ifreq *tin6ifreq;
274 + struct target_sockaddr_in6 *tsa_in6;
275 + struct in6_ifreq hin6ifreq;
276 + struct sockaddr_in6 *hsa_in6 = &hin6ifreq.ifr_ifru.ifru_addr;
277 +
278 + tin6ifreq = lock_user(VERIFY_WRITE, arg, sizeof(*tin6ifreq), 1);
279 + if (tin6ifreq == NULL) {
280 + return -TARGET_EFAULT;
281 + }
282 + memcpy(hin6ifreq.ifr_name, tin6ifreq->ifr_name, IFNAMSIZ);
283 + tsa_in6 = &tin6ifreq->ifr_ifru.ifru_addr;
284 + target_to_host_sockaddr_in6(hsa_in6, tsa_in6);
285 +
286 + ret = get_errno(safe_ioctl(fd, ie->host_cmd, &hin6ifreq));
287 + if (!is_error(ret)) {
288 + put_user_s32(hin6ifreq.ifr_ifru.ifru_flags6,
289 + arg + offsetof(struct target_in6_ifreq, ifr_ifru.ifru_flags6));
290 + }
291 + unlock_user(tin6ifreq, arg, sizeof(*tin6ifreq));
292 +
293 + return ret;
294 +}