• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /***
2   This file is part of PulseAudio.
3 
4   Copyright 2009 Ted Percival
5 
6   PulseAudio is free software; you can redistribute it and/or modify
7   it under the terms of the GNU Lesser General Public License as
8   published by the Free Software Foundation; either version 2.1 of the
9   License, or (at your option) any later version.
10 
11   PulseAudio is distributed in the hope that it will be useful, but
12   WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14   Lesser General Public License for more details.
15 
16   You should have received a copy of the GNU Lesser General Public
17   License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
18 ***/
19 
20 #include <config.h>
21 
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <sys/types.h>
26 #include <pwd.h>
27 #include <grp.h>
28 #include <errno.h>
29 
30 #include <check.h>
31 
32 #include <pulsecore/usergroup.h>
33 #include <pulsecore/core-util.h>
34 
load_reference_structs(struct group ** gr,struct passwd ** pw)35 static int load_reference_structs(struct group **gr, struct passwd **pw) {
36     setpwent();
37     *pw = getpwent();
38     endpwent();
39 
40     setgrent();
41     *gr = getgrent();
42     endgrent();
43 
44     return (*gr && *pw) ? 0 : 1;
45 }
46 
compare_group(const struct group * a,const struct group * b)47 static int compare_group(const struct group *a, const struct group *b) {
48     char **amem, **bmem;
49 
50     if (!pa_streq(a->gr_name, b->gr_name)) {
51         fprintf(stderr, "Group name mismatch: [%s] [%s]\n", a->gr_name, b->gr_name);
52         return 1;
53     }
54 
55     if (!pa_streq(a->gr_passwd, b->gr_passwd)) {
56         fprintf(stderr, "Group password mismatch: [%s] [%s]\n", a->gr_passwd, b->gr_passwd);
57         return 1;
58     }
59 
60     if (a->gr_gid != b->gr_gid) {
61         fprintf(stderr, "Gid mismatch: [%lu] [%lu]\n", (unsigned long) a->gr_gid, (unsigned long) b->gr_gid);
62         return 1;
63     }
64 
65     /* XXX: Assuming the group ordering is identical. */
66     for (amem = a->gr_mem, bmem = b->gr_mem; *amem && *bmem; ++amem, ++bmem) {
67         if (!pa_streq(*amem, *bmem)) {
68             fprintf(stderr, "Group member mismatch: [%s] [%s]\n", *amem, *bmem);
69             return 1;
70         }
71     }
72 
73     if (*amem || *bmem) {
74         fprintf(stderr, "Mismatched group count\n");
75         return 1;
76     }
77 
78     return 0;
79 }
80 
compare_passwd(const struct passwd * a,const struct passwd * b)81 static int compare_passwd(const struct passwd *a, const struct passwd *b) {
82     if (!pa_streq(a->pw_name, b->pw_name)) {
83         fprintf(stderr, "pw_name mismatch: [%s] [%s]\n", a->pw_name, b->pw_name);
84         return 1;
85     }
86 
87     if (!pa_streq(a->pw_passwd, b->pw_passwd)) {
88         fprintf(stderr, "pw_passwd mismatch: [%s] [%s]\n", a->pw_passwd, b->pw_passwd);
89         return 1;
90     }
91 
92     if (a->pw_uid != b->pw_uid) {
93         fprintf(stderr, "pw_uid mismatch: [%lu] [%lu]\n", (unsigned long) a->pw_uid, (unsigned long) b->pw_uid);
94         return 1;
95     }
96 
97     if (a->pw_gid != b->pw_gid) {
98         fprintf(stderr, "pw_gid mismatch: [%lu] [%lu]\n", (unsigned long) a->pw_gid, (unsigned long) b->pw_gid);
99         return 1;
100     }
101 
102     if (!pa_streq(a->pw_gecos, b->pw_gecos)) {
103         fprintf(stderr, "pw_gecos mismatch: [%s] [%s]\n", a->pw_gecos, b->pw_gecos);
104         return 1;
105     }
106 
107     if (!pa_streq(a->pw_dir, b->pw_dir)) {
108         fprintf(stderr, "pw_dir mismatch: [%s] [%s]\n", a->pw_dir, b->pw_dir);
109         return 1;
110     }
111 
112     if (!pa_streq(a->pw_shell, b->pw_shell)) {
113         fprintf(stderr, "pw_shell mismatch: [%s] [%s]\n", a->pw_shell, b->pw_shell);
114         return 1;
115     }
116 
117     return 0;
118 }
119 
START_TEST(usergroup_test)120 START_TEST (usergroup_test) {
121     struct group *gr;
122     struct passwd *pw;
123     struct group *reference_group = NULL;
124     struct passwd *reference_passwd = NULL;
125 
126     fail_if(load_reference_structs(&reference_group, &reference_passwd));
127 
128     errno = 0;
129     gr = pa_getgrgid_malloc(reference_group->gr_gid);
130     fail_if(compare_group(reference_group, gr));
131     pa_getgrgid_free(gr);
132 
133     errno = 0;
134     gr = pa_getgrnam_malloc(reference_group->gr_name);
135     fail_if(compare_group(reference_group, gr));
136     pa_getgrnam_free(gr);
137 
138     errno = 0;
139     pw = pa_getpwuid_malloc(reference_passwd->pw_uid);
140     fail_if(compare_passwd(reference_passwd, pw));
141     pa_getpwuid_free(pw);
142 
143     errno = 0;
144     pw = pa_getpwnam_malloc(reference_passwd->pw_name);
145     fail_if(compare_passwd(reference_passwd, pw));
146     pa_getpwnam_free(pw);
147 }
148 END_TEST
149 
main(int argc,char * argv[])150 int main(int argc, char *argv[]) {
151     int failed = 0;
152     Suite *s;
153     TCase *tc;
154     SRunner *sr;
155 
156     s = suite_create("Usergroup");
157     tc = tcase_create("usergroup");
158     tcase_add_test(tc, usergroup_test);
159     suite_add_tcase(s, tc);
160 
161     sr = srunner_create(s);
162     srunner_run_all(sr, CK_NORMAL);
163     failed = srunner_ntests_failed(sr);
164     srunner_free(sr);
165 
166     return (failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
167 }
168