+static int sysctl_oldcvt(void *holdp, size_t *holdlen, uint32_t kind)
+{
+ switch (kind & CTLTYPE) {
+ case CTLTYPE_INT:
+ case CTLTYPE_UINT:
+ *(uint32_t *)holdp = tswap32(*(uint32_t *)holdp);
+ break;
+
+#ifdef TARGET_ABI32
+ case CTLTYPE_LONG:
+ case CTLTYPE_ULONG:
+ /*
+ * If the sysctl has a type of long/ulong but seems to be bigger than
+ * these data types, its probably an array. Double check that its
+ * evenly divisible by the size of long and convert holdp to a series
of
+ * 32bit elements instead, adjusting holdlen to the new size.
+ */
+ if ((*holdlen > sizeof(abi_ulong)) &&
+ ((*holdlen % sizeof(abi_ulong)) == 0)) {
+ int array_size = *holdlen / sizeof(long);
+ int i;
+ if (holdp) {
+ for (i = 0; i < array_size; i++) {
+ ((uint32_t *)holdp)[i] = tswap32(((long *)holdp)[i]);
+ }
+ *holdlen = array_size * sizeof(abi_ulong);
+ } else {
+ *holdlen = sizeof(abi_ulong);
+ }
+ } else {
+ *(uint32_t *)holdp = tswap32(*(long *)holdp);
+ *holdlen = sizeof(uint32_t);