| 454 | } |
| 455 | |
| 456 | static int |
| 457 | kern_extattr_get_path(struct thread *td, const char *path, int attrnamespace, |
| 458 | const char *uattrname, void *data, size_t nbytes, int follow) |
| 459 | { |
| 460 | struct nameidata nd; |
| 461 | char attrname[EXTATTR_MAXNAMELEN + 1]; |
| 462 | int error; |
| 463 | |
| 464 | AUDIT_ARG_VALUE(attrnamespace); |
| 465 | error = copyinstr(uattrname, attrname, sizeof(attrname), NULL); |
| 466 | if (error) |
| 467 | return (error); |
| 468 | AUDIT_ARG_TEXT(attrname); |
| 469 | |
| 470 | NDINIT(&nd, LOOKUP, follow | AUDITVNODE1, UIO_USERSPACE, path, td); |
| 471 | error = namei(&nd); |
| 472 | if (error) |
| 473 | return (error); |
| 474 | NDFREE(&nd, NDF_ONLY_PNBUF); |
| 475 | |
| 476 | error = extattr_get_vp(nd.ni_vp, attrnamespace, attrname, data, |
| 477 | nbytes, td); |
| 478 | |
| 479 | vrele(nd.ni_vp); |
| 480 | return (error); |
| 481 | } |
| 482 | |
| 483 | /* |
| 484 | * extattr_delete_vp(): Delete a named extended attribute on a file or |
no test coverage detected