xref: /plan9-contrib/sys/src/cmd/auth/lib/rdbio.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #include <u.h>
2*219b2ee8SDavid du Colombier #include <libc.h>
3*219b2ee8SDavid du Colombier #include <bio.h>
4*219b2ee8SDavid du Colombier #include <ctype.h>
5*219b2ee8SDavid du Colombier #include <auth.h>
6*219b2ee8SDavid du Colombier #include "authsrv.h"
7*219b2ee8SDavid du Colombier 
8*219b2ee8SDavid du Colombier void
9*219b2ee8SDavid du Colombier clrbio(Acctbio *a)
10*219b2ee8SDavid du Colombier {
11*219b2ee8SDavid du Colombier 	int i;
12*219b2ee8SDavid du Colombier 
13*219b2ee8SDavid du Colombier 	if(a->user)
14*219b2ee8SDavid du Colombier 		free(a->user);
15*219b2ee8SDavid du Colombier 	if(a->name)
16*219b2ee8SDavid du Colombier 		free(a->name);
17*219b2ee8SDavid du Colombier 	if(a->dept)
18*219b2ee8SDavid du Colombier 		free(a->dept);
19*219b2ee8SDavid du Colombier 	for(i = 0; i < Nemail; i++)
20*219b2ee8SDavid du Colombier 		if(a->email[i])
21*219b2ee8SDavid du Colombier 			free(a->email[i]);
22*219b2ee8SDavid du Colombier 	memset(a, 0, sizeof(Acctbio));
23*219b2ee8SDavid du Colombier }
24*219b2ee8SDavid du Colombier 
25*219b2ee8SDavid du Colombier void
26*219b2ee8SDavid du Colombier rdbio(char *file, char *user, Acctbio *a)
27*219b2ee8SDavid du Colombier {
28*219b2ee8SDavid du Colombier 	Biobuf *b;
29*219b2ee8SDavid du Colombier 	char *p, *cp, *next;
30*219b2ee8SDavid du Colombier 	int ne, ulen;
31*219b2ee8SDavid du Colombier 
32*219b2ee8SDavid du Colombier 	memset(a, 0, sizeof(Acctbio));
33*219b2ee8SDavid du Colombier 	b = Bopen(file, OREAD);
34*219b2ee8SDavid du Colombier 	if(b == 0)
35*219b2ee8SDavid du Colombier 		return;
36*219b2ee8SDavid du Colombier 	ulen = strlen(user);
37*219b2ee8SDavid du Colombier 	while(p = Brdline(b, '\n')){
38*219b2ee8SDavid du Colombier 		if(strncmp(p, user, ulen) != 0)
39*219b2ee8SDavid du Colombier 			continue;
40*219b2ee8SDavid du Colombier 		if(p[ulen] && p[ulen] != ' ' && p[ulen] != '\t')
41*219b2ee8SDavid du Colombier 			continue;
42*219b2ee8SDavid du Colombier 
43*219b2ee8SDavid du Colombier 		p[Blinelen(b)-1] = 0;
44*219b2ee8SDavid du Colombier 		p += ulen;
45*219b2ee8SDavid du Colombier 		clrbio(a);
46*219b2ee8SDavid du Colombier 
47*219b2ee8SDavid du Colombier 		/* get name */
48*219b2ee8SDavid du Colombier 		while(*p == ' ' || *p == '\t')
49*219b2ee8SDavid du Colombier 			p++;
50*219b2ee8SDavid du Colombier 		for(cp = p; *cp; cp++){
51*219b2ee8SDavid du Colombier 			if(isdigit(*cp) || *cp == '<'){
52*219b2ee8SDavid du Colombier 				while(cp > p && *(cp-1) != ' ' && *(cp-1) != '\t')
53*219b2ee8SDavid du Colombier 					cp--;
54*219b2ee8SDavid du Colombier 				break;
55*219b2ee8SDavid du Colombier 			}
56*219b2ee8SDavid du Colombier 		}
57*219b2ee8SDavid du Colombier 		next = cp;
58*219b2ee8SDavid du Colombier 		while(cp > p && (*(cp-1) == ' ' || *(cp-1) == '\t'))
59*219b2ee8SDavid du Colombier 			cp--;
60*219b2ee8SDavid du Colombier 		a->name = malloc(cp - p + 1);
61*219b2ee8SDavid du Colombier 		strncpy(a->name, p, cp - p);
62*219b2ee8SDavid du Colombier 		a->name[cp - p] = 0;
63*219b2ee8SDavid du Colombier 		p = next;
64*219b2ee8SDavid du Colombier 
65*219b2ee8SDavid du Colombier 		/* get dept */
66*219b2ee8SDavid du Colombier 		for(cp = p; *cp; cp++){
67*219b2ee8SDavid du Colombier 			if(*cp == '<')
68*219b2ee8SDavid du Colombier 				break;
69*219b2ee8SDavid du Colombier 		}
70*219b2ee8SDavid du Colombier 		next = cp;
71*219b2ee8SDavid du Colombier 		while(cp > p && (*(cp-1) == ' ' || *(cp-1) == '\t'))
72*219b2ee8SDavid du Colombier 			cp--;
73*219b2ee8SDavid du Colombier 		a->dept = malloc(cp - p + 1);
74*219b2ee8SDavid du Colombier 		strncpy(a->dept, p, cp - p);
75*219b2ee8SDavid du Colombier 		a->dept[cp - p] = 0;
76*219b2ee8SDavid du Colombier 		p = next;
77*219b2ee8SDavid du Colombier 
78*219b2ee8SDavid du Colombier 		/* get emails */
79*219b2ee8SDavid du Colombier 		ne = 0;
80*219b2ee8SDavid du Colombier 		for(cp = p; *cp && ne < Nemail;){
81*219b2ee8SDavid du Colombier 			if(*cp != '<'){
82*219b2ee8SDavid du Colombier 				cp++;
83*219b2ee8SDavid du Colombier 				continue;
84*219b2ee8SDavid du Colombier 			}
85*219b2ee8SDavid du Colombier 			p = ++cp;
86*219b2ee8SDavid du Colombier 			while(*cp && *cp != '>')
87*219b2ee8SDavid du Colombier 				cp++;
88*219b2ee8SDavid du Colombier 			if(cp == p)
89*219b2ee8SDavid du Colombier 				break;
90*219b2ee8SDavid du Colombier 			a->email[ne] = malloc(cp - p + 1);
91*219b2ee8SDavid du Colombier 			strncpy(a->email[ne], p, cp - p);
92*219b2ee8SDavid du Colombier 			a->email[ne][cp-p] = 0;
93*219b2ee8SDavid du Colombier 			ne++;
94*219b2ee8SDavid du Colombier 		}
95*219b2ee8SDavid du Colombier 	}
96*219b2ee8SDavid du Colombier 	a->user = strdup(user);
97*219b2ee8SDavid du Colombier 	Bterm(b);
98*219b2ee8SDavid du Colombier }
99