xref: /illumos-gate/usr/src/test/libsec-tests/cmd/acl_from_text.c (revision 42920ac8f798accb1375a7faa38ddefa674abf63)
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