xref: /aosp_15_r20/external/musl/src/passwd/getpwent_a.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
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