{"id":2222532,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2222532/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260412-ioctl-v1-11-1d998a460560@bsdimp.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.1/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260412-ioctl-v1-11-1d998a460560@bsdimp.com>","date":"2026-04-12T16:02:34","name":"[11/17] bsd-user: Add bsd-ioctl.c infrastructure and termios conversion","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"abaa69f90b03b10e687997d3688b01d4a6fd9b03","submitter":{"id":1896,"url":"http://patchwork.ozlabs.org/api/1.1/people/1896/?format=json","name":"Warner Losh","email":"imp@bsdimp.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260412-ioctl-v1-11-1d998a460560@bsdimp.com/mbox/","series":[{"id":499616,"url":"http://patchwork.ozlabs.org/api/1.1/series/499616/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=499616","date":"2026-04-12T16:02:24","name":"bsd-user: upstream ioctl","version":1,"mbox":"http://patchwork.ozlabs.org/series/499616/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2222532/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2222532/checks/","tags":{},"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=bsdimp-com.20251104.gappssmtp.com\n header.i=@bsdimp-com.20251104.gappssmtp.com header.a=rsa-sha256\n header.s=20251104 header.b=dhynwrnG;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4ftwP11kWCz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 13 Apr 2026 02:05:25 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wBxID-0006VU-Bx; Sun, 12 Apr 2026 12:04:13 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <imp@bsdimp.com>) id 1wBxHx-0006Rc-QM\n for qemu-devel@nongnu.org; Sun, 12 Apr 2026 12:04:02 -0400","from mail-oa1-x31.google.com ([2001:4860:4864:20::31])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <imp@bsdimp.com>) id 1wBxHq-0004WY-Jh\n for qemu-devel@nongnu.org; Sun, 12 Apr 2026 12:03:54 -0400","by mail-oa1-x31.google.com with SMTP id\n 586e51a60fabf-4152698e745so1337179fac.1\n for <qemu-devel@nongnu.org>; Sun, 12 Apr 2026 09:03:48 -0700 (PDT)","from rebo.bsdimp.com ([50.253.99.174])\n by smtp.gmail.com with ESMTPSA id\n 586e51a60fabf-423ddbee0fesm6457006fac.17.2026.04.12.09.03.45\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Sun, 12 Apr 2026 09:03:46 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1776009827; x=1776614627;\n darn=nongnu.org;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:from:to:cc:subject:date:message-id\n :reply-to; bh=OG67MzhAjbi8mtn9vqr3Qx3q3JjHQoONM9JlGgCF1mM=;\n b=dhynwrnGypFQorpn8JLg7JGtk9gQJp+3DQn6d8ynQcdhwd0b4fcXWT/1detyUK1mOi\n AabZ3SEjua4DZ4gg2lmTPQYxDSM28mQjy3/Vp7pCa+6JK9JFu7tQkvZQe85JJtlmvflK\n z1v6GMBP6b/OdF3NfnCjoV/zcJ5ZC4f1t92FP3IpHMoeAt+apjfKUQcdvbLJLvy/8uus\n G2AphCU32oNATRCLK2xDRnME5YTm8qIuma4CqgmnJXqj2xcSxHtmzPjByHpRDiat1PN/\n 7XFjbs6E4XWqBbg5WaDHbntG8pFbNY3r7zIvNN2PSZ8dAHmTnIcWpugrIMy2phaJ5Zf1\n 5tTA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776009827; x=1776614627;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to\n :cc:subject:date:message-id:reply-to;\n bh=OG67MzhAjbi8mtn9vqr3Qx3q3JjHQoONM9JlGgCF1mM=;\n b=TLfTWJZTxN2XiZXdcEDZY4vYUC6zXTedn9UAS9ly+8irYHUY7KUpiq2JzPWb4e008G\n cuo043NG7oovBXLMthvYKV2Dw0VRGfJEhKmcJSs5+b3hJEddP2v9gXjHSEERsHLWiy/i\n kMTDg0S+rYVztsI1/+Q4zavJamgFFN0FLq2OWhZfg3SRyvTY0NzYgjfRvHbRuvubAQb1\n IFwUCFdVqFp13a9xYelpMQFOFTRTdLO+flOxXELAPMDN1kDXD9VibtCrIfJseEA/+ZJe\n LwVwCrqipW2eEfKb13qMl4FCMkWjwrDYaKBBuslyOXMfcWHug4MVdSty0bcLehwp7eYl\n oqHg==","X-Gm-Message-State":"AOJu0YzAMUG2NbdAcPtjSW3LUje10hdrNkQo5TNsaTiqyT2LMRxRGtlR\n hxAV/vK2o9Q7wyOQbN0jSxfaJ/AU/AMfTKJUcmnSK8tgAmMgAljVIMdkXZWTN8gyGkx/iD39obH\n urH+Wp3E=","X-Gm-Gg":"AeBDiesU5r8Uv3FE4mSgWH/yDyVQHpcihTjeODgfxtrziDI/LDJ+15JXbCzX1iNAwJj\n BB+CWxXd98dMfcVKLuE6WBGP3tWmQMPF1jaIsPCAP/5hSNOSi0wAxKsyNKOpEY1qmhTXiANeT1T\n ZgEEU4qos4848JIsJtjma1pl+0GJynXGYtd1B1qyYuA9k5VXxoYAivxfbc+svmhyOH3zND9EwZB\n ielzT8pKht/9AQqcAfjrYadfDqQOJ/YTMYNYuU5rX9Xhotyr6wExUyrKRJKw0YFfobvW/peO748\n M+fK0U2KZ/bZsXJfi+RGUCxAorb4hAHXaycaukP2G60apIlgjBrgu7SjYdkS6OTQIov5vO77wJ6\n hr/+ZlZ9ip4jCMeB05YbT3nXXXOo/0WfjyCeR43I4ROX3r8i7cFLufIjhAEJbS2+4CsVCz3BwX6\n +PKO+mb0quQw==","X-Received":"by 2002:a05:6820:1b18:b0:68b:cadc:4340 with SMTP id\n 006d021491bc7-68be604a404mr4863543eaf.18.1776009827198;\n Sun, 12 Apr 2026 09:03:47 -0700 (PDT)","From":"Warner Losh <imp@bsdimp.com>","Date":"Sun, 12 Apr 2026 10:02:34 -0600","Subject":"[PATCH 11/17] bsd-user: Add bsd-ioctl.c infrastructure and termios\n conversion","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"8bit","Message-Id":"<20260412-ioctl-v1-11-1d998a460560@bsdimp.com>","References":"<20260412-ioctl-v1-0-1d998a460560@bsdimp.com>","In-Reply-To":"<20260412-ioctl-v1-0-1d998a460560@bsdimp.com>","To":"qemu-devel@nongnu.org","Cc":"Kyle Evans <kevans@freebsd.org>, Warner Losh <imp@bsdimp.com>,\n \"Stacey D. Son\" <sson@freebsd.org>, Sean Bruno <sbruno@FreeBSD.org>,\n Kyle Evans <kevans@FreeBSD.org>","X-Mailer":"b4 0.14.3","X-Developer-Signature":"v=1; a=openpgp-sha256; l=8449; i=imp@bsdimp.com;\n h=from:subject:message-id; bh=bk41F2WqzI69O5FRTdWBtdF3GnnfoknoNTPXwZvfnHA=;\n b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBp28IgfarNv73DL2k9PA4oni8enRnPDBde/ocOO\n pT7rY7TnqaJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCadvCIAAKCRBsHNEofbAR\n AAZsD/0QZM7SZw5CgkQjthEuauGAQBp0w7Y3fvJKI4hDejHee15hIq1k8If2Nda1YS1D/j/HfmC\n yns0z79ERPkQBL8MCpnic/rIpdCHgAYACWIGjhYrZy+yCWT5BSOu0btmxtUpR1HYNTaj8SJAPND\n g5P7nlySaXwwJDjxpv6QrgeTFD0THybnPtid5g4cH+Jc+CnT9QMfxWWNgd+Zh/RQo8V7q8Alejd\n 97qtM2g+/lOFe02rApnEgGgGEqzrpFleqGyBlCwJlu+s2BBWFPELWe/DvHXyBLuroKpppH2+K1+\n /lJBJmHKopu/E4ZrnZ9ckRfOwDSeJTQaNxn0ea15RUcPvHmatSKJkaeoEzRCeCJKS3+ZSfZJhsk\n Hm4tbu53DHwHjCIOW9eweofjkdEiXl+HnT3gKCVnJ7mWPhF5i7SBySsiVijA4WUBPLcvf3ce8mK\n 2M7HORS6YqPmSwlOdA8ZoyB/alU1job4vdwle375DmscvWt3VXtjc6o9zHBWerOEHgI6k2+avci\n NqtxNpCBCEz8gDiS9k06lkhLXdSVzm3fjDfVK8aIdcrnVQ2LKWqA1fGeDLv8u32JEVcYPYhOOfp\n WxctC9mXqM8LJ40UajB1r0yOfZPetTrWkzhy5H0THI5ikbUuGBJMeWnaoGCG3m19UXCg1XT5QHh\n BxRpS34u8Z5qmHg==","X-Developer-Key":"i=imp@bsdimp.com; a=openpgp;\n fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100","Received-SPF":"none client-ip=2001:4860:4864:20::31;\n envelope-from=imp@bsdimp.com; helo=mail-oa1-x31.google.com","X-Spam_score_int":"-18","X-Spam_score":"-1.9","X-Spam_bar":"-","X-Spam_report":"(-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n SPF_NONE=0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"},"content":"Add initial bsd-ioctl.c file with termios conversion functions,\nstructure type definitions, and ioctl table infrastructure.\nIncludes target_to_host_termios and host_to_target_termios for\nterminal I/O control conversion, along with the ioctl dispatch\ntable framework.\n\nStyle complains about STRUCT and STRUCT_SPECIAL defines:\n  ● checkpatch.pl: 197: ERROR: Macros with complex values should be enclosed in parenthesis\n  ● checkpatch.pl: 198: ERROR: Macros with complex values should be enclosed in parenthesis\nbut that's fine. We are doing weird things with macros, and it's fine.\nWe can't put parens or do while (0) around these since they are table\nbuilding macros for files that are included multiple times.\n\nSigned-off-by: Stacey D. Son <sson@freebsd.org>\nSigned-off-by: Warner Losh <imp@bsdimp.com>\nSigned-off-by: Sean Bruno <sbruno@FreeBSD.org>\nSigned-off-by: Kyle Evans <kevans@FreeBSD.org>\n---\n bsd-user/bsd-ioctl.c | 221 +++++++++++++++++++++++++++++++++++++++++++++++++++\n 1 file changed, 221 insertions(+)","diff":"diff --git a/bsd-user/bsd-ioctl.c b/bsd-user/bsd-ioctl.c\nnew file mode 100644\nindex 0000000000..32fa9c3d33\n--- /dev/null\n+++ b/bsd-user/bsd-ioctl.c\n@@ -0,0 +1,221 @@\n+/*\n+ * BSD ioctl(2) emulation\n+ *\n+ * Copyright (c) 2013-2015 Stacey D. Son\n+ *\n+ * SPDX-License-Identifier: GPL-2.0-or-later\n+ */\n+#include \"qemu/osdep.h\"\n+\n+#include <sys/types.h>\n+#include <sys/param.h>\n+#include <sys/disk.h>\n+#include <sys/ioccom.h>\n+#include <sys/ioctl.h>\n+#include <sys/sockio.h>\n+#include <sys/_termios.h>\n+#include <sys/ttycom.h>\n+#include <sys/filio.h>\n+\n+#include <crypto/cryptodev.h>\n+\n+#include <net/ethernet.h>\n+#include <net/if.h>\n+#include <net/if_var.h>\n+#include <net/if_types.h>\n+#include <net/route.h>\n+#include <net/if_dl.h>\n+#include <net/if_gif.h>\n+#include <net/if_gre.h>\n+#include <net/if_lagg.h>\n+#include <net/if_media.h>\n+#include <net/pfvar.h>\n+#include <net/if_pfsync.h>\n+#include <net/ethernet.h>\n+#include <netinet/icmp6.h>\n+#include <netinet/in.h>\n+#include <netinet/ip_carp.h>\n+#include <netinet6/in6_var.h>\n+#include <netinet6/nd6.h>\n+#include <net80211/ieee80211_ioctl.h>\n+\n+#include <stdio.h>\n+\n+#include \"qemu.h\"\n+\n+#include \"syscall_defs.h\"\n+#include \"bsd-ioctl.h\"\n+#include \"os-ioctl-cryptodev.h\"\n+#include \"os-ioctl-disk.h\"\n+#include \"os-ioctl-filio.h\"\n+#include \"os-ioctl-in6_var.h\"\n+#include \"os-ioctl-sockio.h\"\n+#include \"os-ioctl-ttycom.h\"\n+\n+static void target_to_host_termios(void *dst, const void *src)\n+{\n+    struct termios *host = dst;\n+    const struct target_termios *target = src;\n+\n+    host->c_iflag = target_to_host_bitmask(tswap32(target->c_iflag), iflag_tbl);\n+    host->c_oflag = target_to_host_bitmask(tswap32(target->c_oflag), oflag_tbl);\n+    host->c_cflag = target_to_host_bitmask(tswap32(target->c_cflag), cflag_tbl);\n+    host->c_lflag = target_to_host_bitmask(tswap32(target->c_lflag), lflag_tbl);\n+\n+    memset(host->c_cc, 0, sizeof(host->c_cc));\n+    host->c_cc[VEOF] = target->c_cc[TARGET_VEOF];\n+    host->c_cc[VEOL] = target->c_cc[TARGET_VEOL];\n+#ifdef VEOL2\n+    host->c_cc[VEOL2] = target->c_cc[TARGET_VEOL2];\n+#endif\n+    host->c_cc[VERASE] = target->c_cc[TARGET_VERASE];\n+#ifdef VWERASE\n+    host->c_cc[VWERASE] = target->c_cc[TARGET_VWERASE];\n+#endif\n+    host->c_cc[VKILL] = target->c_cc[TARGET_VKILL];\n+#ifdef VREPRINT\n+    host->c_cc[VREPRINT] = target->c_cc[TARGET_VREPRINT];\n+#endif\n+#ifdef VERASE2\n+    host->c_cc[VERASE2] = target->c_cc[TARGET_VERASE2];\n+#endif\n+    host->c_cc[VINTR] = target->c_cc[TARGET_VINTR];\n+    host->c_cc[VQUIT] = target->c_cc[TARGET_VQUIT];\n+    host->c_cc[VSUSP] = target->c_cc[TARGET_VSUSP];\n+#ifdef VDSUSP\n+    host->c_cc[VDSUSP] = target->c_cc[TARGET_VDSUSP];\n+#endif\n+    host->c_cc[VSTART] = target->c_cc[TARGET_VSTART];\n+    host->c_cc[VSTOP] = target->c_cc[TARGET_VSTOP];\n+#ifdef VLNEXT\n+    host->c_cc[VLNEXT] = target->c_cc[TARGET_VLNEXT];\n+#endif\n+#ifdef VDISCARD\n+    host->c_cc[VDISCARD] = target->c_cc[TARGET_VDISCARD];\n+#endif\n+    host->c_cc[VMIN] = target->c_cc[TARGET_VMIN];\n+    host->c_cc[VTIME] = target->c_cc[TARGET_VTIME];\n+#ifdef VSTATUS\n+    host->c_cc[VSTATUS] = target->c_cc[TARGET_VSTATUS];\n+#endif\n+\n+    host->c_ispeed = tswap32(target->c_ispeed);\n+    host->c_ospeed = tswap32(target->c_ospeed);\n+}\n+\n+static void host_to_target_termios(void *dst, const void *src)\n+{\n+    struct target_termios *target = dst;\n+    const struct termios *host = src;\n+\n+    target->c_iflag = tswap32(host_to_target_bitmask(host->c_iflag, iflag_tbl));\n+    target->c_oflag = tswap32(host_to_target_bitmask(host->c_oflag, oflag_tbl));\n+    target->c_cflag = tswap32(host_to_target_bitmask(host->c_cflag, cflag_tbl));\n+    target->c_lflag = tswap32(host_to_target_bitmask(host->c_lflag, lflag_tbl));\n+\n+    memset(target->c_cc, 0, sizeof(target->c_cc));\n+    target->c_cc[TARGET_VEOF] = host->c_cc[VEOF];\n+    target->c_cc[TARGET_VEOL] = host->c_cc[VEOL];\n+#ifdef VEOL2\n+    target->c_cc[TARGET_VEOL2] = host->c_cc[VEOL2];\n+#endif\n+    target->c_cc[TARGET_VERASE] = host->c_cc[VERASE];\n+#ifdef VWERASE\n+    target->c_cc[TARGET_VWERASE] = host->c_cc[VWERASE];\n+#endif\n+    target->c_cc[TARGET_VKILL] = host->c_cc[VKILL];\n+#ifdef VREPRINT\n+    target->c_cc[TARGET_VREPRINT] = host->c_cc[VREPRINT];\n+#endif\n+#ifdef VERASE2\n+    target->c_cc[TARGET_VERASE2] = host->c_cc[VERASE2];\n+#endif\n+    target->c_cc[TARGET_VINTR] = host->c_cc[VINTR];\n+    target->c_cc[TARGET_VQUIT] = host->c_cc[VQUIT];\n+    target->c_cc[TARGET_VSUSP] = host->c_cc[VSUSP];\n+#ifdef VDSUSP\n+    target->c_cc[TARGET_VDSUSP] = host->c_cc[VDSUSP];\n+#endif\n+    target->c_cc[TARGET_VSTART] = host->c_cc[VSTART];\n+    target->c_cc[TARGET_VSTOP] = host->c_cc[VSTOP];\n+#ifdef VLNEXT\n+    target->c_cc[TARGET_VLNEXT] = host->c_cc[VLNEXT];\n+#endif\n+#ifdef VDISCARD\n+    target->c_cc[TARGET_VDISCARD] = host->c_cc[VDISCARD];\n+#endif\n+    target->c_cc[TARGET_VMIN] = host->c_cc[VMIN];\n+    target->c_cc[TARGET_VTIME] = host->c_cc[VTIME];\n+#ifdef VSTATUS\n+    target->c_cc[TARGET_VSTATUS] = host->c_cc[VSTATUS];\n+#endif\n+\n+    target->c_ispeed = tswap32(host->c_ispeed);\n+    target->c_ospeed = tswap32(host->c_ospeed);\n+}\n+\n+static const StructEntry struct_termios_def = {\n+    .convert = { host_to_target_termios, target_to_host_termios },\n+    .size = { sizeof(struct target_termios), sizeof(struct termios) },\n+    .align = { __alignof__(struct target_termios),\n+        __alignof__(struct termios) },\n+};\n+\n+\n+/* ioctl structure type definitions */\n+#define STRUCT(name, ...) STRUCT_ ## name,\n+#define STRUCT_SPECIAL(name) STRUCT_ ## name,\n+enum {\n+#include \"os-ioctl-types.h\"\n+STRUCT_MAX\n+};\n+#undef STRUCT\n+#undef STRUCT_SPECIAL\n+\n+#define STRUCT(name, ...) \\\n+    static const argtype struct_ ## name ## _def[] = { __VA_ARGS__, TYPE_NULL };\n+#define STRUCT_SPECIAL(name)\n+#include \"os-ioctl-types.h\"\n+#undef STRUCT\n+#undef STRUCT_SPECIAL\n+\n+\n+struct IOCTLEntry;\n+\n+typedef abi_long do_ioctl_fn(const struct IOCTLEntry *ie, uint8_t *buf_temp,\n+                int fd, abi_long cmd, abi_long arg);\n+\n+struct IOCTLEntry {\n+    unsigned int target_cmd;\n+    unsigned int host_cmd;\n+    const char *name;\n+    int access;\n+    do_ioctl_fn *do_ioctl;\n+    const argtype arg_type[5];\n+};\n+typedef struct IOCTLEntry IOCTLEntry;\n+\n+#define MAX_STRUCT_SIZE 4096\n+\n+static abi_long do_ioctl_unsupported(__unused const IOCTLEntry *ie,\n+                                     __unused uint8_t *buf_temp,\n+                                     __unused int fd, __unused abi_long cmd,\n+                                     __unused abi_long arg);\n+\n+static abi_long do_ioctl_in6_ifreq_sockaddr_int(const IOCTLEntry *ie,\n+        uint8_t *buf_temp, int fd, abi_long cmd, abi_long arg);\n+\n+static IOCTLEntry ioctl_entries[] = {\n+#define IOC_    0x0000\n+#define IOC_R   0x0001\n+#define IOC_W   0x0002\n+#define IOC_RW  (IOC_R | IOC_W)\n+#define IOCTL(cmd, access, ...) \\\n+    { TARGET_ ## cmd, cmd, #cmd, access, 0, { __VA_ARGS__ } },\n+#define IOCTL_SPECIAL(cmd, access, dofn, ...) \\\n+    { TARGET_ ## cmd, cmd, #cmd, access, dofn, { __VA_ARGS__ } },\n+#define IOCTL_SPECIAL_UNIMPL(cmd, access, dofn, ...) \\\n+    { TARGET_ ## cmd, 0, #cmd, access, dofn, { __VA_ARGS__ } },\n+#include \"os-ioctl-cmds.h\"\n+    { 0, 0 },\n+};\n","prefixes":["11/17"]}