| 1394 | } |
| 1395 | |
| 1396 | static int |
| 1397 | sysctl_all(int *oid, int len) |
| 1398 | { |
| 1399 | int name1[22], name2[22]; |
| 1400 | int i, j; |
| 1401 | size_t l1, l2; |
| 1402 | |
| 1403 | name1[0] = CTL_SYSCTL; |
| 1404 | name1[1] = (oid != NULL || Nflag || dflag || tflag) ? |
| 1405 | CTL_SYSCTL_NEXTNOSKIP : CTL_SYSCTL_NEXT; |
| 1406 | l1 = 2; |
| 1407 | if (len) { |
| 1408 | memcpy(name1 + 2, oid, len * sizeof(int)); |
| 1409 | l1 += len; |
| 1410 | } else { |
| 1411 | name1[2] = CTL_KERN; |
| 1412 | l1++; |
| 1413 | } |
| 1414 | for (;;) { |
| 1415 | l2 = sizeof(name2); |
| 1416 | j = sysctl(name1, l1, name2, &l2, 0, 0); |
| 1417 | if (j < 0) { |
| 1418 | if (errno == ENOENT) |
| 1419 | return (0); |
| 1420 | else |
| 1421 | err(1, "sysctl(getnext) %d %zu", j, l2); |
| 1422 | } |
| 1423 | |
| 1424 | l2 /= sizeof(int); |
| 1425 | |
| 1426 | if (len < 0 || l2 < (unsigned int)len) |
| 1427 | return (0); |
| 1428 | |
| 1429 | if (memcmp(name2, oid, len * sizeof(int)) != 0) |
| 1430 | return (0); |
| 1431 | |
| 1432 | i = show_var(name2, l2, true); |
| 1433 | if (!i && !bflag) |
| 1434 | putchar('\n'); |
| 1435 | |
| 1436 | memcpy(name1 + 2, name2, l2 * sizeof(int)); |
| 1437 | l1 = 2 + l2; |
| 1438 | } |
| 1439 | } |