]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/auth/convbio.c
python: update python build configuration to new ape capabilities like getaddrinfo...
[plan9front.git] / sys / src / cmd / auth / convbio.c
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <ctype.h>
5 #include "authcmdlib.h"
6
7 void
8 clrbio(Acctbio *a)
9 {
10         int i;
11
12         if(a->user)
13                 free(a->user);
14         if(a->name)
15                 free(a->name);
16         if(a->dept)
17                 free(a->dept);
18         for(i = 0; i < Nemail; i++)
19                 if(a->email[i])
20                         free(a->email[i]);
21         memset(a, 0, sizeof(Acctbio));
22 }
23
24 int
25 ordbio(Biobuf *b, Acctbio *a)
26 {
27         char *p, *cp, *next;
28         int ne;
29
30         clrbio(a);
31         while(p = Brdline(b, '\n')){
32                 if(*p == '\n')
33                         continue;
34
35                 p[Blinelen(b)-1] = 0;
36
37                 /* get user */
38                 for(cp = p; *cp && *cp != ' ' && *cp != '\t'; cp++)
39                         ;
40                 a->user = malloc(cp - p + 1);
41                 strncpy(a->user, p, cp - p);
42                 a->user[cp - p] = 0;
43                 p = cp;
44
45                 /* get name */
46                 while(*p == ' ' || *p == '\t')
47                         p++;
48                 for(cp = p; *cp; cp++){
49                         if(isdigit(*cp) || *cp == '<'){
50                                 while(cp > p && *(cp-1) != ' ' && *(cp-1) != '\t')
51                                         cp--;
52                                 break;
53                         }
54                 }
55                 next = cp;
56                 while(cp > p && (*(cp-1) == ' ' || *(cp-1) == '\t'))
57                         cp--;
58                 a->name = malloc(cp - p + 1);
59                 strncpy(a->name, p, cp - p);
60                 a->name[cp - p] = 0;
61                 p = next;
62
63                 /* get dept */
64                 for(cp = p; *cp; cp++){
65                         if(*cp == '<')
66                                 break;
67                 }
68                 next = cp;
69                 while(cp > p && (*(cp-1) == ' ' || *(cp-1) == '\t'))
70                         cp--;
71                 a->dept = malloc(cp - p + 1);
72                 strncpy(a->dept, p, cp - p);
73                 a->dept[cp - p] = 0;
74                 p = next;
75
76                 /* get emails */
77                 ne = 0;
78                 for(cp = p; *cp && ne < Nemail;){       
79                         if(*cp != '<'){
80                                 cp++;
81                                 continue;
82                         }
83                         p = ++cp;
84                         while(*cp && *cp != '>')
85                                 cp++;
86                         if(cp == p)
87                                 break;
88                         a->email[ne] = malloc(cp - p + 1);
89                         strncpy(a->email[ne], p, cp - p);
90                         a->email[ne][cp-p] = 0;
91                         ne++;
92                 }
93                 return 0;
94         }
95         return -1;
96 }
97
98 void
99 nwrbio(Biobuf *b, Acctbio *a)
100 {
101         int i;
102
103         if(a->postid == 0)
104                 a->postid = "";
105         if(a->name == 0)
106                 a->name = "";
107         if(a->dept == 0)
108                 a->dept = "";
109         if(a->email[0] == 0)
110                 a->email[0] = strdup(a->user);
111
112         Bprint(b, "%s|%s|%s|%s|%s", a->user, a->user, a->name, a->dept, a->email[0]);
113         for(i = 1; i < Nemail; i++){
114                 if(a->email[i] == 0)
115                         break;
116                 Bprint(b, "|%s", a->email[i]);
117         }
118         Bprint(b, "\n");
119 }
120
121 void
122 main(void)
123 {
124         Biobuf in, out;
125         Acctbio a;
126
127         Binit(&in, 0, OREAD);
128         Binit(&out, 1, OWRITE);
129         while(ordbio(&in, &a) == 0)
130                 nwrbio(&out, &a);
131         Bterm(&in);
132         Bterm(&out);
133 }