+void
+print_privilege(priv)
+ struct privilege *priv;
+{
+ struct cmndspec *cs;
+ struct member *m;
+ struct privilege *p;
+ struct cmndtag tags;
+
+ for (p = priv; p != NULL; p = p->next) {
+ if (p != priv)
+ fputs(" : ", stdout);
+ tq_foreach_fwd(&p->hostlist, m) {
+ if (m != tq_first(&p->hostlist))
+ fputs(", ", stdout);
+ print_member(m);
+ }
+ fputs(" = ", stdout);
+ tags.nopasswd = tags.noexec = UNSPEC;
+ tq_foreach_fwd(&p->cmndlist, cs) {
+ if (cs != tq_first(&p->cmndlist))
+ fputs(", ", stdout);
+ /* XXX - runasgrouplist too */
+ if (!tq_empty(&cs->runasuserlist)) {
+ fputs("(", stdout);
+ tq_foreach_fwd(&cs->runasuserlist, m) {
+ if (m != tq_first(&cs->runasuserlist))
+ fputs(", ", stdout);
+ print_member(m);
+ }
+ fputs(") ", stdout);
+ }
+#ifdef HAVE_SELINUX
+ if (cs->role)
+ printf("ROLE=%s ", cs->role);
+ if (cs->type)
+ printf("TYPE=%s ", cs->type);
+#endif /* HAVE_SELINUX */
+ if (cs->tags.nopasswd != UNSPEC && cs->tags.nopasswd != tags.nopasswd)
+ printf("%sPASSWD: ", cs->tags.nopasswd ? "NO" : "");
+ if (cs->tags.noexec != UNSPEC && cs->tags.noexec != tags.noexec)
+ printf("%sEXEC: ", cs->tags.noexec ? "NO" : "");
+ print_member(cs->cmnd);
+ memcpy(&tags, &cs->tags, sizeof(tags));
+ }
+ }
+}