| /* SPDX-License-Identifier: LGPL-2.1+ */ |
| |
| #include "format-util.h" |
| #include "group-record-show.h" |
| #include "strv.h" |
| #include "user-util.h" |
| #include "userdb.h" |
| |
| void group_record_show(GroupRecord *gr, bool show_full_user_info) { |
| int r; |
| |
| printf(" Group name: %s\n", |
| group_record_group_name_and_realm(gr)); |
| |
| printf(" Disposition: %s\n", user_disposition_to_string(group_record_disposition(gr))); |
| |
| if (gr->last_change_usec != USEC_INFINITY) { |
| char buf[FORMAT_TIMESTAMP_MAX]; |
| printf(" Last Change: %s\n", format_timestamp(buf, sizeof(buf), gr->last_change_usec)); |
| } |
| |
| if (gid_is_valid(gr->gid)) |
| printf(" GID: " GID_FMT "\n", gr->gid); |
| |
| if (show_full_user_info) { |
| _cleanup_(userdb_iterator_freep) UserDBIterator *iterator = NULL; |
| |
| r = membershipdb_by_group(gr->group_name, 0, &iterator); |
| if (r < 0) { |
| errno = -r; |
| printf(" Members: (can't acquire: %m)"); |
| } else { |
| const char *prefix = " Members:"; |
| |
| for (;;) { |
| _cleanup_free_ char *user = NULL; |
| |
| r = membershipdb_iterator_get(iterator, &user, NULL); |
| if (r == -ESRCH) |
| break; |
| if (r < 0) { |
| errno = -r; |
| printf("%s (can't iterate: %m\n", prefix); |
| break; |
| } |
| |
| printf("%s %s\n", prefix, user); |
| prefix = " "; |
| } |
| } |
| } else { |
| const char *prefix = " Members:"; |
| char **i; |
| |
| STRV_FOREACH(i, gr->members) { |
| printf("%s %s\n", prefix, *i); |
| prefix = " "; |
| } |
| } |
| |
| if (!strv_isempty(gr->administrators)) { |
| const char *prefix = " Admins:"; |
| char **i; |
| |
| STRV_FOREACH(i, gr->administrators) { |
| printf("%s %s\n", prefix, *i); |
| prefix = " "; |
| } |
| } |
| |
| if (!strv_isempty(gr->hashed_password)) |
| printf(" Passwords: %zu\n", strv_length(gr->hashed_password)); |
| |
| if (gr->service) |
| printf(" Service: %s\n", gr->service); |
| } |