| 2584 | } |
| 2585 | |
| 2586 | int |
| 2587 | kern_readlinkat(struct thread *td, int fd, const char *path, |
| 2588 | enum uio_seg pathseg, char *buf, enum uio_seg bufseg, size_t count) |
| 2589 | { |
| 2590 | struct vnode *vp; |
| 2591 | struct nameidata nd; |
| 2592 | int error; |
| 2593 | |
| 2594 | if (count > IOSIZE_MAX) |
| 2595 | return (EINVAL); |
| 2596 | |
| 2597 | NDINIT_AT(&nd, LOOKUP, NOFOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1, |
| 2598 | pathseg, path, fd, td); |
| 2599 | |
| 2600 | if ((error = namei(&nd)) != 0) |
| 2601 | return (error); |
| 2602 | NDFREE_NOTHING(&nd); |
| 2603 | vp = nd.ni_vp; |
| 2604 | |
| 2605 | error = kern_readlink_vp(vp, buf, bufseg, count, td); |
| 2606 | vput(vp); |
| 2607 | |
| 2608 | return (error); |
| 2609 | } |
| 2610 | |
| 2611 | /* |
| 2612 | * Helper function to readlink from a vnode |
no test coverage detected