1*42920ac8SGordon Ross /*
2*42920ac8SGordon Ross * This file and its contents are supplied under the terms of the
3*42920ac8SGordon Ross * Common Development and Distribution License ("CDDL"), version 1.0.
4*42920ac8SGordon Ross * You may only use this file in accordance with the terms of version
5*42920ac8SGordon Ross * 1.0 of the CDDL.
6*42920ac8SGordon Ross *
7*42920ac8SGordon Ross * A full copy of the text of the CDDL should have accompanied this
8*42920ac8SGordon Ross * source. A copy of the CDDL is also available via the Internet at
9*42920ac8SGordon Ross * http://www.illumos.org/license/CDDL.
10*42920ac8SGordon Ross */
11*42920ac8SGordon Ross
12*42920ac8SGordon Ross /*
13*42920ac8SGordon Ross * Copyright 2024 RackTop Systems, Inc.
14*42920ac8SGordon Ross */
15*42920ac8SGordon Ross
16*42920ac8SGordon Ross /*
17*42920ac8SGordon Ross * Test program for libsec:acl_fromtext
18*42920ac8SGordon Ross */
19*42920ac8SGordon Ross
20*42920ac8SGordon Ross #include <sys/types.h>
21*42920ac8SGordon Ross #include <sys/acl.h>
22*42920ac8SGordon Ross
23*42920ac8SGordon Ross #include <stdarg.h>
24*42920ac8SGordon Ross #include <stdio.h>
25*42920ac8SGordon Ross #include <stdlib.h>
26*42920ac8SGordon Ross #include <string.h>
27*42920ac8SGordon Ross #include <errno.h>
28*42920ac8SGordon Ross #include <unistd.h>
29*42920ac8SGordon Ross
30*42920ac8SGordon Ross extern char *acl_strerror(int);
31*42920ac8SGordon Ross extern acl_t acl_canned;
32*42920ac8SGordon Ross
33*42920ac8SGordon Ross int
acl_compare(acl_t * lib,acl_t * ref)34*42920ac8SGordon Ross acl_compare(acl_t *lib, acl_t *ref)
35*42920ac8SGordon Ross {
36*42920ac8SGordon Ross ace_t *lib_acep;
37*42920ac8SGordon Ross ace_t *ref_acep;
38*42920ac8SGordon Ross int errs;
39*42920ac8SGordon Ross int i;
40*42920ac8SGordon Ross
41*42920ac8SGordon Ross if (lib->acl_type != ref->acl_type) {
42*42920ac8SGordon Ross fprintf(stderr, "acl_type = %d (expected %d)\n",
43*42920ac8SGordon Ross lib->acl_type, ref->acl_type);
44*42920ac8SGordon Ross return (-1);
45*42920ac8SGordon Ross }
46*42920ac8SGordon Ross if (lib->acl_cnt != ref->acl_cnt) {
47*42920ac8SGordon Ross fprintf(stderr, "acl_cnt = %d (expected %d)\n",
48*42920ac8SGordon Ross lib->acl_cnt, ref->acl_cnt);
49*42920ac8SGordon Ross return (-1);
50*42920ac8SGordon Ross }
51*42920ac8SGordon Ross if (lib->acl_entry_size != ref->acl_entry_size) {
52*42920ac8SGordon Ross fprintf(stderr, "acl_entry_size = %d (expected %d)\n",
53*42920ac8SGordon Ross lib->acl_entry_size, ref->acl_entry_size);
54*42920ac8SGordon Ross return (-1);
55*42920ac8SGordon Ross }
56*42920ac8SGordon Ross
57*42920ac8SGordon Ross lib_acep = lib->acl_aclp;
58*42920ac8SGordon Ross ref_acep = ref->acl_aclp;
59*42920ac8SGordon Ross errs = 0;
60*42920ac8SGordon Ross for (i = 0; i < lib->acl_cnt; i++) {
61*42920ac8SGordon Ross if (lib_acep->a_who != ref_acep->a_who) {
62*42920ac8SGordon Ross fprintf(stderr, "ace[%d].a_who = %u"
63*42920ac8SGordon Ross " (expected %u)\n", i,
64*42920ac8SGordon Ross lib_acep->a_who,
65*42920ac8SGordon Ross ref_acep->a_who);
66*42920ac8SGordon Ross errs++;
67*42920ac8SGordon Ross }
68*42920ac8SGordon Ross if (lib_acep->a_access_mask != ref_acep->a_access_mask) {
69*42920ac8SGordon Ross fprintf(stderr, "ace[%d].a_access_mask = 0x%x"
70*42920ac8SGordon Ross " (expected 0x%x)\n", i,
71*42920ac8SGordon Ross lib_acep->a_access_mask,
72*42920ac8SGordon Ross ref_acep->a_access_mask);
73*42920ac8SGordon Ross errs++;
74*42920ac8SGordon Ross }
75*42920ac8SGordon Ross if (lib_acep->a_flags != ref_acep->a_flags) {
76*42920ac8SGordon Ross fprintf(stderr, "ace[%d].a_flags = %u"
77*42920ac8SGordon Ross " (expected %u)\n", i,
78*42920ac8SGordon Ross lib_acep->a_flags,
79*42920ac8SGordon Ross ref_acep->a_flags);
80*42920ac8SGordon Ross errs++;
81*42920ac8SGordon Ross }
82*42920ac8SGordon Ross if (lib_acep->a_type != ref_acep->a_type) {
83*42920ac8SGordon Ross fprintf(stderr, "ace[%d].a_type = %u"
84*42920ac8SGordon Ross " (expected %u)\n", i,
85*42920ac8SGordon Ross lib_acep->a_type,
86*42920ac8SGordon Ross ref_acep->a_type);
87*42920ac8SGordon Ross errs++;
88*42920ac8SGordon Ross }
89*42920ac8SGordon Ross lib_acep++;
90*42920ac8SGordon Ross ref_acep++;
91*42920ac8SGordon Ross }
92*42920ac8SGordon Ross return (errs);
93*42920ac8SGordon Ross }
94*42920ac8SGordon Ross
95*42920ac8SGordon Ross int
main(int argc,char ** argv)96*42920ac8SGordon Ross main(int argc, char **argv)
97*42920ac8SGordon Ross {
98*42920ac8SGordon Ross acl_t *aclp = NULL; /* acl info */
99*42920ac8SGordon Ross char *str;
100*42920ac8SGordon Ross char *p;
101*42920ac8SGordon Ross int i, err;
102*42920ac8SGordon Ross
103*42920ac8SGordon Ross for (i = 1; i < argc; i++) {
104*42920ac8SGordon Ross /*
105*42920ac8SGordon Ross * Allow input with newlines instead of commas.
106*42920ac8SGordon Ross */
107*42920ac8SGordon Ross str = strdup(argv[i]);
108*42920ac8SGordon Ross if (str == NULL) {
109*42920ac8SGordon Ross perror("strdup");
110*42920ac8SGordon Ross return (1);
111*42920ac8SGordon Ross }
112*42920ac8SGordon Ross for (p = str; *p != '\0'; p++) {
113*42920ac8SGordon Ross if (*p == '\n')
114*42920ac8SGordon Ross *p = ',';
115*42920ac8SGordon Ross }
116*42920ac8SGordon Ross
117*42920ac8SGordon Ross err = acl_fromtext(str, &aclp);
118*42920ac8SGordon Ross if (err != 0) {
119*42920ac8SGordon Ross fprintf(stderr, "acl_fromtext(%s): %s\n",
120*42920ac8SGordon Ross str, acl_strerror(err));
121*42920ac8SGordon Ross return (1);
122*42920ac8SGordon Ross }
123*42920ac8SGordon Ross
124*42920ac8SGordon Ross if (acl_compare(aclp, &acl_canned) != 0) {
125*42920ac8SGordon Ross fprintf(stderr, "compare failed on: %s\n", str);
126*42920ac8SGordon Ross return (1);
127*42920ac8SGordon Ross }
128*42920ac8SGordon Ross
129*42920ac8SGordon Ross acl_free(aclp);
130*42920ac8SGordon Ross aclp = NULL;
131*42920ac8SGordon Ross }
132*42920ac8SGordon Ross
133*42920ac8SGordon Ross return (0);
134*42920ac8SGordon Ross }
135