1*c9945492SAndroid Build Coastguard Worker #include "pwf.h"
2*c9945492SAndroid Build Coastguard Worker #include <pthread.h>
3*c9945492SAndroid Build Coastguard Worker
atou(char ** s)4*c9945492SAndroid Build Coastguard Worker static unsigned atou(char **s)
5*c9945492SAndroid Build Coastguard Worker {
6*c9945492SAndroid Build Coastguard Worker unsigned x;
7*c9945492SAndroid Build Coastguard Worker for (x=0; **s-'0'<10U; ++*s) x=10*x+(**s-'0');
8*c9945492SAndroid Build Coastguard Worker return x;
9*c9945492SAndroid Build Coastguard Worker }
10*c9945492SAndroid Build Coastguard Worker
__getpwent_a(FILE * f,struct passwd * pw,char ** line,size_t * size,struct passwd ** res)11*c9945492SAndroid Build Coastguard Worker int __getpwent_a(FILE *f, struct passwd *pw, char **line, size_t *size, struct passwd **res)
12*c9945492SAndroid Build Coastguard Worker {
13*c9945492SAndroid Build Coastguard Worker ssize_t l;
14*c9945492SAndroid Build Coastguard Worker char *s;
15*c9945492SAndroid Build Coastguard Worker int rv = 0;
16*c9945492SAndroid Build Coastguard Worker int cs;
17*c9945492SAndroid Build Coastguard Worker pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
18*c9945492SAndroid Build Coastguard Worker for (;;) {
19*c9945492SAndroid Build Coastguard Worker if ((l=getline(line, size, f)) < 0) {
20*c9945492SAndroid Build Coastguard Worker rv = ferror(f) ? errno : 0;
21*c9945492SAndroid Build Coastguard Worker free(*line);
22*c9945492SAndroid Build Coastguard Worker *line = 0;
23*c9945492SAndroid Build Coastguard Worker pw = 0;
24*c9945492SAndroid Build Coastguard Worker break;
25*c9945492SAndroid Build Coastguard Worker }
26*c9945492SAndroid Build Coastguard Worker line[0][l-1] = 0;
27*c9945492SAndroid Build Coastguard Worker
28*c9945492SAndroid Build Coastguard Worker s = line[0];
29*c9945492SAndroid Build Coastguard Worker pw->pw_name = s++;
30*c9945492SAndroid Build Coastguard Worker if (!(s = strchr(s, ':'))) continue;
31*c9945492SAndroid Build Coastguard Worker
32*c9945492SAndroid Build Coastguard Worker *s++ = 0; pw->pw_passwd = s;
33*c9945492SAndroid Build Coastguard Worker if (!(s = strchr(s, ':'))) continue;
34*c9945492SAndroid Build Coastguard Worker
35*c9945492SAndroid Build Coastguard Worker *s++ = 0; pw->pw_uid = atou(&s);
36*c9945492SAndroid Build Coastguard Worker if (*s != ':') continue;
37*c9945492SAndroid Build Coastguard Worker
38*c9945492SAndroid Build Coastguard Worker *s++ = 0; pw->pw_gid = atou(&s);
39*c9945492SAndroid Build Coastguard Worker if (*s != ':') continue;
40*c9945492SAndroid Build Coastguard Worker
41*c9945492SAndroid Build Coastguard Worker *s++ = 0; pw->pw_gecos = s;
42*c9945492SAndroid Build Coastguard Worker if (!(s = strchr(s, ':'))) continue;
43*c9945492SAndroid Build Coastguard Worker
44*c9945492SAndroid Build Coastguard Worker *s++ = 0; pw->pw_dir = s;
45*c9945492SAndroid Build Coastguard Worker if (!(s = strchr(s, ':'))) continue;
46*c9945492SAndroid Build Coastguard Worker
47*c9945492SAndroid Build Coastguard Worker *s++ = 0; pw->pw_shell = s;
48*c9945492SAndroid Build Coastguard Worker break;
49*c9945492SAndroid Build Coastguard Worker }
50*c9945492SAndroid Build Coastguard Worker pthread_setcancelstate(cs, 0);
51*c9945492SAndroid Build Coastguard Worker *res = pw;
52*c9945492SAndroid Build Coastguard Worker if (rv) errno = rv;
53*c9945492SAndroid Build Coastguard Worker return rv;
54*c9945492SAndroid Build Coastguard Worker }
55