Blame


1 be8b315d 2004-06-17 devnull #include <u.h>
2 be8b315d 2004-06-17 devnull #include <libc.h>
3 be8b315d 2004-06-17 devnull #include <auth.h>
4 be8b315d 2004-06-17 devnull
5 be8b315d 2004-06-17 devnull int
6 be8b315d 2004-06-17 devnull _attrfmt(Fmt *fmt)
7 be8b315d 2004-06-17 devnull {
8 be8b315d 2004-06-17 devnull char *b, buf[1024], *ebuf;
9 be8b315d 2004-06-17 devnull Attr *a;
10 be8b315d 2004-06-17 devnull
11 be8b315d 2004-06-17 devnull ebuf = buf+sizeof buf;
12 be8b315d 2004-06-17 devnull b = buf;
13 be8b315d 2004-06-17 devnull strcpy(buf, " ");
14 be8b315d 2004-06-17 devnull for(a=va_arg(fmt->args, Attr*); a; a=a->next){
15 be8b315d 2004-06-17 devnull if(a->name == nil)
16 be8b315d 2004-06-17 devnull continue;
17 be8b315d 2004-06-17 devnull switch(a->type){
18 be8b315d 2004-06-17 devnull case AttrQuery:
19 be8b315d 2004-06-17 devnull b = seprint(b, ebuf, " %q?", a->name);
20 be8b315d 2004-06-17 devnull break;
21 be8b315d 2004-06-17 devnull case AttrNameval:
22 be8b315d 2004-06-17 devnull b = seprint(b, ebuf, " %q=%q", a->name, a->val);
23 be8b315d 2004-06-17 devnull break;
24 be8b315d 2004-06-17 devnull case AttrDefault:
25 be8b315d 2004-06-17 devnull b = seprint(b, ebuf, " %q:=%q", a->name, a->val);
26 be8b315d 2004-06-17 devnull break;
27 be8b315d 2004-06-17 devnull }
28 be8b315d 2004-06-17 devnull }
29 be8b315d 2004-06-17 devnull return fmtstrcpy(fmt, buf+1);
30 be8b315d 2004-06-17 devnull }
31 be8b315d 2004-06-17 devnull
32 be8b315d 2004-06-17 devnull Attr*
33 be8b315d 2004-06-17 devnull _copyattr(Attr *a)
34 be8b315d 2004-06-17 devnull {
35 be8b315d 2004-06-17 devnull Attr **la, *na;
36 be8b315d 2004-06-17 devnull
37 be8b315d 2004-06-17 devnull na = nil;
38 be8b315d 2004-06-17 devnull la = &na;
39 be8b315d 2004-06-17 devnull for(; a; a=a->next){
40 be8b315d 2004-06-17 devnull *la = _mkattr(a->type, a->name, a->val, nil);
41 be8b315d 2004-06-17 devnull setmalloctag(*la, getcallerpc(&a));
42 be8b315d 2004-06-17 devnull la = &(*la)->next;
43 be8b315d 2004-06-17 devnull }
44 be8b315d 2004-06-17 devnull *la = nil;
45 be8b315d 2004-06-17 devnull return na;
46 be8b315d 2004-06-17 devnull }
47 be8b315d 2004-06-17 devnull
48 be8b315d 2004-06-17 devnull Attr*
49 be8b315d 2004-06-17 devnull _delattr(Attr *a, char *name)
50 be8b315d 2004-06-17 devnull {
51 be8b315d 2004-06-17 devnull Attr *fa;
52 be8b315d 2004-06-17 devnull Attr **la;
53 be8b315d 2004-06-17 devnull
54 be8b315d 2004-06-17 devnull for(la=&a; *la; ){
55 be8b315d 2004-06-17 devnull if(strcmp((*la)->name, name) == 0){
56 be8b315d 2004-06-17 devnull fa = *la;
57 be8b315d 2004-06-17 devnull *la = (*la)->next;
58 be8b315d 2004-06-17 devnull fa->next = nil;
59 be8b315d 2004-06-17 devnull _freeattr(fa);
60 be8b315d 2004-06-17 devnull }else
61 be8b315d 2004-06-17 devnull la=&(*la)->next;
62 be8b315d 2004-06-17 devnull }
63 be8b315d 2004-06-17 devnull return a;
64 be8b315d 2004-06-17 devnull }
65 be8b315d 2004-06-17 devnull
66 be8b315d 2004-06-17 devnull Attr*
67 be8b315d 2004-06-17 devnull _findattr(Attr *a, char *n)
68 be8b315d 2004-06-17 devnull {
69 be8b315d 2004-06-17 devnull for(; a; a=a->next)
70 be8b315d 2004-06-17 devnull if(strcmp(a->name, n) == 0 && a->type != AttrQuery)
71 be8b315d 2004-06-17 devnull return a;
72 be8b315d 2004-06-17 devnull return nil;
73 be8b315d 2004-06-17 devnull }
74 be8b315d 2004-06-17 devnull
75 be8b315d 2004-06-17 devnull void
76 be8b315d 2004-06-17 devnull _freeattr(Attr *a)
77 be8b315d 2004-06-17 devnull {
78 be8b315d 2004-06-17 devnull Attr *anext;
79 be8b315d 2004-06-17 devnull
80 be8b315d 2004-06-17 devnull for(; a; a=anext){
81 be8b315d 2004-06-17 devnull anext = a->next;
82 be8b315d 2004-06-17 devnull free(a->name);
83 be8b315d 2004-06-17 devnull free(a->val);
84 be8b315d 2004-06-17 devnull a->name = (void*)~0;
85 be8b315d 2004-06-17 devnull a->val = (void*)~0;
86 be8b315d 2004-06-17 devnull a->next = (void*)~0;
87 be8b315d 2004-06-17 devnull free(a);
88 be8b315d 2004-06-17 devnull }
89 be8b315d 2004-06-17 devnull }
90 be8b315d 2004-06-17 devnull
91 be8b315d 2004-06-17 devnull Attr*
92 be8b315d 2004-06-17 devnull _mkattr(int type, char *name, char *val, Attr *next)
93 be8b315d 2004-06-17 devnull {
94 be8b315d 2004-06-17 devnull Attr *a;
95 be8b315d 2004-06-17 devnull
96 be8b315d 2004-06-17 devnull a = malloc(sizeof(*a));
97 be8b315d 2004-06-17 devnull if(a==nil)
98 be8b315d 2004-06-17 devnull sysfatal("_mkattr malloc: %r");
99 be8b315d 2004-06-17 devnull a->type = type;
100 be8b315d 2004-06-17 devnull a->name = strdup(name);
101 be8b315d 2004-06-17 devnull a->val = strdup(val);
102 be8b315d 2004-06-17 devnull if(a->name==nil || a->val==nil)
103 be8b315d 2004-06-17 devnull sysfatal("_mkattr malloc: %r");
104 be8b315d 2004-06-17 devnull a->next = next;
105 be8b315d 2004-06-17 devnull setmalloctag(a, getcallerpc(&type));
106 be8b315d 2004-06-17 devnull return a;
107 be8b315d 2004-06-17 devnull }
108 be8b315d 2004-06-17 devnull
109 be8b315d 2004-06-17 devnull static Attr*
110 be8b315d 2004-06-17 devnull cleanattr(Attr *a)
111 be8b315d 2004-06-17 devnull {
112 be8b315d 2004-06-17 devnull Attr *fa;
113 be8b315d 2004-06-17 devnull Attr **la;
114 be8b315d 2004-06-17 devnull
115 be8b315d 2004-06-17 devnull for(la=&a; *la; ){
116 be8b315d 2004-06-17 devnull if((*la)->type==AttrQuery && _findattr(a, (*la)->name)){
117 be8b315d 2004-06-17 devnull fa = *la;
118 be8b315d 2004-06-17 devnull *la = (*la)->next;
119 be8b315d 2004-06-17 devnull fa->next = nil;
120 be8b315d 2004-06-17 devnull _freeattr(fa);
121 be8b315d 2004-06-17 devnull }else
122 be8b315d 2004-06-17 devnull la=&(*la)->next;
123 be8b315d 2004-06-17 devnull }
124 be8b315d 2004-06-17 devnull return a;
125 be8b315d 2004-06-17 devnull }
126 be8b315d 2004-06-17 devnull
127 be8b315d 2004-06-17 devnull Attr*
128 be8b315d 2004-06-17 devnull _parseattr(char *s)
129 be8b315d 2004-06-17 devnull {
130 be8b315d 2004-06-17 devnull char *p, *t, *tok[256];
131 be8b315d 2004-06-17 devnull int i, ntok, type;
132 be8b315d 2004-06-17 devnull Attr *a;
133 be8b315d 2004-06-17 devnull
134 52e5e85b 2005-02-13 devnull if(s == nil)
135 52e5e85b 2005-02-13 devnull return nil;
136 52e5e85b 2005-02-13 devnull
137 be8b315d 2004-06-17 devnull s = strdup(s);
138 be8b315d 2004-06-17 devnull if(s == nil)
139 be8b315d 2004-06-17 devnull sysfatal("_parseattr strdup: %r");
140 be8b315d 2004-06-17 devnull
141 be8b315d 2004-06-17 devnull ntok = tokenize(s, tok, nelem(tok));
142 be8b315d 2004-06-17 devnull a = nil;
143 be8b315d 2004-06-17 devnull for(i=ntok-1; i>=0; i--){
144 be8b315d 2004-06-17 devnull t = tok[i];
145 be8b315d 2004-06-17 devnull if(p = strchr(t, '=')){
146 be8b315d 2004-06-17 devnull *p++ = '\0';
147 cbeb0b26 2006-04-01 devnull /* if(p-2 >= t && p[-2] == ':'){ */
148 cbeb0b26 2006-04-01 devnull /* p[-2] = '\0'; */
149 cbeb0b26 2006-04-01 devnull /* type = AttrDefault; */
150 cbeb0b26 2006-04-01 devnull /* }else */
151 be8b315d 2004-06-17 devnull type = AttrNameval;
152 be8b315d 2004-06-17 devnull a = _mkattr(type, t, p, a);
153 be8b315d 2004-06-17 devnull setmalloctag(a, getcallerpc(&s));
154 be8b315d 2004-06-17 devnull }
155 be8b315d 2004-06-17 devnull else if(t[strlen(t)-1] == '?'){
156 be8b315d 2004-06-17 devnull t[strlen(t)-1] = '\0';
157 be8b315d 2004-06-17 devnull a = _mkattr(AttrQuery, t, "", a);
158 be8b315d 2004-06-17 devnull setmalloctag(a, getcallerpc(&s));
159 be8b315d 2004-06-17 devnull }else{
160 be8b315d 2004-06-17 devnull /* really a syntax error, but better to provide some indication */
161 be8b315d 2004-06-17 devnull a = _mkattr(AttrNameval, t, "", a);
162 be8b315d 2004-06-17 devnull setmalloctag(a, getcallerpc(&s));
163 be8b315d 2004-06-17 devnull }
164 be8b315d 2004-06-17 devnull }
165 be8b315d 2004-06-17 devnull free(s);
166 be8b315d 2004-06-17 devnull return cleanattr(a);
167 be8b315d 2004-06-17 devnull }
168 be8b315d 2004-06-17 devnull
169 be8b315d 2004-06-17 devnull char*
170 be8b315d 2004-06-17 devnull _strfindattr(Attr *a, char *n)
171 be8b315d 2004-06-17 devnull {
172 be8b315d 2004-06-17 devnull a = _findattr(a, n);
173 be8b315d 2004-06-17 devnull if(a == nil)
174 be8b315d 2004-06-17 devnull return nil;
175 be8b315d 2004-06-17 devnull return a->val;
176 be8b315d 2004-06-17 devnull }