xref: /plan9/sys/src/cmd/auth/convbio.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
47dd7cddfSDavid du Colombier #include <ctype.h>
5*9a747e4fSDavid du Colombier #include "authcmdlib.h"
67dd7cddfSDavid du Colombier 
77dd7cddfSDavid du Colombier void
clrbio(Acctbio * a)87dd7cddfSDavid du Colombier clrbio(Acctbio *a)
97dd7cddfSDavid du Colombier {
107dd7cddfSDavid du Colombier 	int i;
117dd7cddfSDavid du Colombier 
127dd7cddfSDavid du Colombier 	if(a->user)
137dd7cddfSDavid du Colombier 		free(a->user);
147dd7cddfSDavid du Colombier 	if(a->name)
157dd7cddfSDavid du Colombier 		free(a->name);
167dd7cddfSDavid du Colombier 	if(a->dept)
177dd7cddfSDavid du Colombier 		free(a->dept);
187dd7cddfSDavid du Colombier 	for(i = 0; i < Nemail; i++)
197dd7cddfSDavid du Colombier 		if(a->email[i])
207dd7cddfSDavid du Colombier 			free(a->email[i]);
217dd7cddfSDavid du Colombier 	memset(a, 0, sizeof(Acctbio));
227dd7cddfSDavid du Colombier }
237dd7cddfSDavid du Colombier 
247dd7cddfSDavid du Colombier int
ordbio(Biobuf * b,Acctbio * a)257dd7cddfSDavid du Colombier ordbio(Biobuf *b, Acctbio *a)
267dd7cddfSDavid du Colombier {
277dd7cddfSDavid du Colombier 	char *p, *cp, *next;
287dd7cddfSDavid du Colombier 	int ne;
297dd7cddfSDavid du Colombier 
307dd7cddfSDavid du Colombier 	clrbio(a);
317dd7cddfSDavid du Colombier 	while(p = Brdline(b, '\n')){
327dd7cddfSDavid du Colombier 		if(*p == '\n')
337dd7cddfSDavid du Colombier 			continue;
347dd7cddfSDavid du Colombier 
357dd7cddfSDavid du Colombier 		p[Blinelen(b)-1] = 0;
367dd7cddfSDavid du Colombier 
377dd7cddfSDavid du Colombier 		/* get user */
387dd7cddfSDavid du Colombier 		for(cp = p; *cp && *cp != ' ' && *cp != '\t'; cp++)
397dd7cddfSDavid du Colombier 			;
407dd7cddfSDavid du Colombier 		a->user = malloc(cp - p + 1);
417dd7cddfSDavid du Colombier 		strncpy(a->user, p, cp - p);
427dd7cddfSDavid du Colombier 		a->user[cp - p] = 0;
437dd7cddfSDavid du Colombier 		p = cp;
447dd7cddfSDavid du Colombier 
457dd7cddfSDavid du Colombier 		/* get name */
467dd7cddfSDavid du Colombier 		while(*p == ' ' || *p == '\t')
477dd7cddfSDavid du Colombier 			p++;
487dd7cddfSDavid du Colombier 		for(cp = p; *cp; cp++){
497dd7cddfSDavid du Colombier 			if(isdigit(*cp) || *cp == '<'){
507dd7cddfSDavid du Colombier 				while(cp > p && *(cp-1) != ' ' && *(cp-1) != '\t')
517dd7cddfSDavid du Colombier 					cp--;
527dd7cddfSDavid du Colombier 				break;
537dd7cddfSDavid du Colombier 			}
547dd7cddfSDavid du Colombier 		}
557dd7cddfSDavid du Colombier 		next = cp;
567dd7cddfSDavid du Colombier 		while(cp > p && (*(cp-1) == ' ' || *(cp-1) == '\t'))
577dd7cddfSDavid du Colombier 			cp--;
587dd7cddfSDavid du Colombier 		a->name = malloc(cp - p + 1);
597dd7cddfSDavid du Colombier 		strncpy(a->name, p, cp - p);
607dd7cddfSDavid du Colombier 		a->name[cp - p] = 0;
617dd7cddfSDavid du Colombier 		p = next;
627dd7cddfSDavid du Colombier 
637dd7cddfSDavid du Colombier 		/* get dept */
647dd7cddfSDavid du Colombier 		for(cp = p; *cp; cp++){
657dd7cddfSDavid du Colombier 			if(*cp == '<')
667dd7cddfSDavid du Colombier 				break;
677dd7cddfSDavid du Colombier 		}
687dd7cddfSDavid du Colombier 		next = cp;
697dd7cddfSDavid du Colombier 		while(cp > p && (*(cp-1) == ' ' || *(cp-1) == '\t'))
707dd7cddfSDavid du Colombier 			cp--;
717dd7cddfSDavid du Colombier 		a->dept = malloc(cp - p + 1);
727dd7cddfSDavid du Colombier 		strncpy(a->dept, p, cp - p);
737dd7cddfSDavid du Colombier 		a->dept[cp - p] = 0;
747dd7cddfSDavid du Colombier 		p = next;
757dd7cddfSDavid du Colombier 
767dd7cddfSDavid du Colombier 		/* get emails */
777dd7cddfSDavid du Colombier 		ne = 0;
787dd7cddfSDavid du Colombier 		for(cp = p; *cp && ne < Nemail;){
797dd7cddfSDavid du Colombier 			if(*cp != '<'){
807dd7cddfSDavid du Colombier 				cp++;
817dd7cddfSDavid du Colombier 				continue;
827dd7cddfSDavid du Colombier 			}
837dd7cddfSDavid du Colombier 			p = ++cp;
847dd7cddfSDavid du Colombier 			while(*cp && *cp != '>')
857dd7cddfSDavid du Colombier 				cp++;
867dd7cddfSDavid du Colombier 			if(cp == p)
877dd7cddfSDavid du Colombier 				break;
887dd7cddfSDavid du Colombier 			a->email[ne] = malloc(cp - p + 1);
897dd7cddfSDavid du Colombier 			strncpy(a->email[ne], p, cp - p);
907dd7cddfSDavid du Colombier 			a->email[ne][cp-p] = 0;
917dd7cddfSDavid du Colombier 			ne++;
927dd7cddfSDavid du Colombier 		}
937dd7cddfSDavid du Colombier 		return 0;
947dd7cddfSDavid du Colombier 	}
957dd7cddfSDavid du Colombier 	return -1;
967dd7cddfSDavid du Colombier }
977dd7cddfSDavid du Colombier 
987dd7cddfSDavid du Colombier void
nwrbio(Biobuf * b,Acctbio * a)997dd7cddfSDavid du Colombier nwrbio(Biobuf *b, Acctbio *a)
1007dd7cddfSDavid du Colombier {
1017dd7cddfSDavid du Colombier 	int i;
1027dd7cddfSDavid du Colombier 
1037dd7cddfSDavid du Colombier 	if(a->postid == 0)
1047dd7cddfSDavid du Colombier 		a->postid = "";
1057dd7cddfSDavid du Colombier 	if(a->name == 0)
1067dd7cddfSDavid du Colombier 		a->name = "";
1077dd7cddfSDavid du Colombier 	if(a->dept == 0)
1087dd7cddfSDavid du Colombier 		a->dept = "";
1097dd7cddfSDavid du Colombier 	if(a->email[0] == 0)
1107dd7cddfSDavid du Colombier 		a->email[0] = strdup(a->user);
1117dd7cddfSDavid du Colombier 
1127dd7cddfSDavid du Colombier 	Bprint(b, "%s|%s|%s|%s|%s", a->user, a->user, a->name, a->dept, a->email[0]);
1137dd7cddfSDavid du Colombier 	for(i = 1; i < Nemail; i++){
1147dd7cddfSDavid du Colombier 		if(a->email[i] == 0)
1157dd7cddfSDavid du Colombier 			break;
1167dd7cddfSDavid du Colombier 		Bprint(b, "|%s", a->email[i]);
1177dd7cddfSDavid du Colombier 	}
1187dd7cddfSDavid du Colombier 	Bprint(b, "\n");
1197dd7cddfSDavid du Colombier }
1207dd7cddfSDavid du Colombier 
1217dd7cddfSDavid du Colombier void
main(void)1227dd7cddfSDavid du Colombier main(void)
1237dd7cddfSDavid du Colombier {
1247dd7cddfSDavid du Colombier 	Biobuf in, out;
1257dd7cddfSDavid du Colombier 	Acctbio a;
1267dd7cddfSDavid du Colombier 
1277dd7cddfSDavid du Colombier 	Binit(&in, 0, OREAD);
1287dd7cddfSDavid du Colombier 	Binit(&out, 1, OWRITE);
1297dd7cddfSDavid du Colombier 	while(ordbio(&in, &a) == 0)
1307dd7cddfSDavid du Colombier 		nwrbio(&out, &a);
1317dd7cddfSDavid du Colombier 	Bterm(&in);
1327dd7cddfSDavid du Colombier 	Bterm(&out);
1337dd7cddfSDavid du Colombier }
134