* Duplicate a struct passwd. */
| 602 | * Duplicate a struct passwd. |
| 603 | */ |
| 604 | struct passwd * |
| 605 | pw_dup(const struct passwd *pw) |
| 606 | { |
| 607 | char *dst; |
| 608 | struct passwd *npw; |
| 609 | ssize_t len; |
| 610 | |
| 611 | len = sizeof(*npw); |
| 612 | if (pw->pw_name != NULL) |
| 613 | len += strlen(pw->pw_name) + 1; |
| 614 | if (pw->pw_passwd != NULL) |
| 615 | len += strlen(pw->pw_passwd) + 1; |
| 616 | if (pw->pw_class != NULL) |
| 617 | len += strlen(pw->pw_class) + 1; |
| 618 | if (pw->pw_gecos != NULL) |
| 619 | len += strlen(pw->pw_gecos) + 1; |
| 620 | if (pw->pw_dir != NULL) |
| 621 | len += strlen(pw->pw_dir) + 1; |
| 622 | if (pw->pw_shell != NULL) |
| 623 | len += strlen(pw->pw_shell) + 1; |
| 624 | if ((npw = malloc((size_t)len)) == NULL) |
| 625 | return (NULL); |
| 626 | memcpy(npw, pw, sizeof(*npw)); |
| 627 | dst = (char *)npw + sizeof(*npw); |
| 628 | if (pw->pw_name != NULL) { |
| 629 | npw->pw_name = dst; |
| 630 | dst = stpcpy(npw->pw_name, pw->pw_name) + 1; |
| 631 | } |
| 632 | if (pw->pw_passwd != NULL) { |
| 633 | npw->pw_passwd = dst; |
| 634 | dst = stpcpy(npw->pw_passwd, pw->pw_passwd) + 1; |
| 635 | } |
| 636 | if (pw->pw_class != NULL) { |
| 637 | npw->pw_class = dst; |
| 638 | dst = stpcpy(npw->pw_class, pw->pw_class) + 1; |
| 639 | } |
| 640 | if (pw->pw_gecos != NULL) { |
| 641 | npw->pw_gecos = dst; |
| 642 | dst = stpcpy(npw->pw_gecos, pw->pw_gecos) + 1; |
| 643 | } |
| 644 | if (pw->pw_dir != NULL) { |
| 645 | npw->pw_dir = dst; |
| 646 | dst = stpcpy(npw->pw_dir, pw->pw_dir) + 1; |
| 647 | } |
| 648 | if (pw->pw_shell != NULL) { |
| 649 | npw->pw_shell = dst; |
| 650 | dst = stpcpy(npw->pw_shell, pw->pw_shell) + 1; |
| 651 | } |
| 652 | return (npw); |
| 653 | } |
| 654 | |
| 655 | #include "pw_scan.h" |
| 656 |