77 lines
2.6 KiB
C
77 lines
2.6 KiB
C
/* 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);
|
|
}
|