more close-on-exec fixes, mostly using new "e" flag to fopen
[musl] / src / passwd / getpwent.c
1 #include "pwf.h"
2
3 static FILE *f;
4
5 void setpwent()
6 {
7         if (f) fclose(f);
8         f = 0;
9 }
10
11 weak_alias(setpwent, endpwent);
12
13 struct passwd *getpwent()
14 {
15         static char *line;
16         static struct passwd pw;
17         size_t size=0;
18         if (!f) f = fopen("/etc/passwd", "rbe");
19         if (!f) return 0;
20         return __getpwent_a(f, &pw, &line, &size);
21 }
22
23 struct passwd *getpwuid(uid_t uid)
24 {
25         struct passwd *pw;
26         int errno_saved;
27         setpwent();
28         while ((pw=getpwent()) && pw->pw_uid != uid);
29         errno_saved = errno;
30         endpwent();
31         errno = errno_saved;
32         return pw;
33 }
34
35 struct passwd *getpwnam(const char *name)
36 {
37         struct passwd *pw;
38         int errno_saved;
39         setpwent();
40         while ((pw=getpwent()) && strcmp(pw->pw_name, name));
41         errno_saved = errno;
42         endpwent();
43         errno = errno_saved;
44         return pw;
45 }