refactor passwd file access code
[musl] / src / passwd / getpw_a.c
1 #include "pwf.h"
2 #include <pthread.h>
3
4 int __getpw_a(const char *name, uid_t uid, struct passwd *pw, char **buf, size_t *size, struct passwd **res)
5 {
6         FILE *f;
7         int cs;
8         int rv = 0;
9
10         *res = 0;
11
12         pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
13
14         f = fopen("/etc/passwd", "rbe");
15         if (!f) {
16                 rv = errno;
17                 goto done;
18         }
19
20         while (!(rv = __getpwent_a(f, pw, buf, size, res)) && *res) {
21                 if (name && !strcmp(name, (*res)->pw_name)
22                 || !name && (*res)->pw_uid == uid)
23                         break;
24         }
25         fclose(f);
26
27 done:
28         pthread_setcancelstate(cs, 0);
29         if (rv) errno = rv;
30         return rv;
31 }