make passwd/group functions safe against cancellation in stdio
[musl] / src / passwd / getpwent_a.c
1 #include "pwf.h"
2 #include <pthread.h>
3
4 struct passwd *__getpwent_a(FILE *f, struct passwd *pw, char **line, size_t *size)
5 {
6         ssize_t l;
7         char *s;
8         int cs;
9         pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
10         for (;;) {
11                 if ((l=getline(line, size, f)) < 0) {
12                         free(*line);
13                         *line = 0;
14                         pw = 0;
15                         break;
16                 }
17                 line[0][l-1] = 0;
18
19                 s = line[0];
20                 pw->pw_name = s++;
21                 if (!(s = strchr(s, ':'))) continue;
22
23                 *s++ = 0; pw->pw_passwd = s;
24                 if (!(s = strchr(s, ':'))) continue;
25
26                 *s++ = 0; pw->pw_uid = atoi(s);
27                 if (!(s = strchr(s, ':'))) continue;
28
29                 *s++ = 0; pw->pw_gid = atoi(s);
30                 if (!(s = strchr(s, ':'))) continue;
31
32                 *s++ = 0; pw->pw_gecos = s;
33                 if (!(s = strchr(s, ':'))) continue;
34
35                 *s++ = 0; pw->pw_dir = s;
36                 if (!(s = strchr(s, ':'))) continue;
37
38                 *s++ = 0; pw->pw_shell = s;
39                 break;
40         }
41         pthread_setcancelstate(cs, 0);
42         return pw;
43 }