| 1501 | } |
| 1502 | |
| 1503 | int |
| 1504 | kern_proc_out(struct proc *p, struct sbuf *sb, int flags) |
| 1505 | { |
| 1506 | struct thread *td; |
| 1507 | struct kinfo_proc ki; |
| 1508 | #ifdef COMPAT_FREEBSD32 |
| 1509 | struct kinfo_proc32 ki32; |
| 1510 | #endif |
| 1511 | int error; |
| 1512 | |
| 1513 | PROC_LOCK_ASSERT(p, MA_OWNED); |
| 1514 | MPASS(FIRST_THREAD_IN_PROC(p) != NULL); |
| 1515 | |
| 1516 | error = 0; |
| 1517 | fill_kinfo_proc(p, &ki); |
| 1518 | if ((flags & KERN_PROC_NOTHREADS) != 0) { |
| 1519 | #ifdef COMPAT_FREEBSD32 |
| 1520 | if ((flags & KERN_PROC_MASK32) != 0) { |
| 1521 | freebsd32_kinfo_proc_out(&ki, &ki32); |
| 1522 | if (sbuf_bcat(sb, &ki32, sizeof(ki32)) != 0) |
| 1523 | error = ENOMEM; |
| 1524 | } else |
| 1525 | #endif |
| 1526 | if (sbuf_bcat(sb, &ki, sizeof(ki)) != 0) |
| 1527 | error = ENOMEM; |
| 1528 | } else { |
| 1529 | FOREACH_THREAD_IN_PROC(p, td) { |
| 1530 | fill_kinfo_thread(td, &ki, 1); |
| 1531 | #ifdef COMPAT_FREEBSD32 |
| 1532 | if ((flags & KERN_PROC_MASK32) != 0) { |
| 1533 | freebsd32_kinfo_proc_out(&ki, &ki32); |
| 1534 | if (sbuf_bcat(sb, &ki32, sizeof(ki32)) != 0) |
| 1535 | error = ENOMEM; |
| 1536 | } else |
| 1537 | #endif |
| 1538 | if (sbuf_bcat(sb, &ki, sizeof(ki)) != 0) |
| 1539 | error = ENOMEM; |
| 1540 | if (error != 0) |
| 1541 | break; |
| 1542 | } |
| 1543 | } |
| 1544 | PROC_UNLOCK(p); |
| 1545 | return (error); |
| 1546 | } |
| 1547 | |
| 1548 | static int |
| 1549 | sysctl_out_proc(struct proc *p, struct sysctl_req *req, int flags) |
no test coverage detected