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>
6 be8b315d 2004-06-17 devnull _attrfmt(Fmt *fmt)
8 be8b315d 2004-06-17 devnull char *b, buf[1024], *ebuf;
11 be8b315d 2004-06-17 devnull ebuf = buf+sizeof 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);
21 be8b315d 2004-06-17 devnull case AttrNameval:
22 be8b315d 2004-06-17 devnull b = seprint(b, ebuf, " %q=%q", a->name, a->val);
24 be8b315d 2004-06-17 devnull case AttrDefault:
25 be8b315d 2004-06-17 devnull b = seprint(b, ebuf, " %q:=%q", a->name, a->val);
29 be8b315d 2004-06-17 devnull return fmtstrcpy(fmt, buf+1);
33 be8b315d 2004-06-17 devnull _copyattr(Attr *a)
35 be8b315d 2004-06-17 devnull Attr **la, *na;
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;
44 be8b315d 2004-06-17 devnull *la = nil;
45 be8b315d 2004-06-17 devnull return na;
49 be8b315d 2004-06-17 devnull _delattr(Attr *a, char *name)
51 be8b315d 2004-06-17 devnull Attr *fa;
52 be8b315d 2004-06-17 devnull Attr **la;
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);
61 be8b315d 2004-06-17 devnull la=&(*la)->next;
63 be8b315d 2004-06-17 devnull return a;
67 be8b315d 2004-06-17 devnull _findattr(Attr *a, char *n)
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;
76 be8b315d 2004-06-17 devnull _freeattr(Attr *a)
78 be8b315d 2004-06-17 devnull Attr *anext;
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;
92 be8b315d 2004-06-17 devnull _mkattr(int type, char *name, char *val, Attr *next)
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;
109 be8b315d 2004-06-17 devnull static Attr*
110 be8b315d 2004-06-17 devnull cleanattr(Attr *a)
112 be8b315d 2004-06-17 devnull Attr *fa;
113 be8b315d 2004-06-17 devnull Attr **la;
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);
122 be8b315d 2004-06-17 devnull la=&(*la)->next;
124 be8b315d 2004-06-17 devnull return a;
128 be8b315d 2004-06-17 devnull _parseattr(char *s)
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;
134 52e5e85b 2005-02-13 devnull if(s == nil)
135 52e5e85b 2005-02-13 devnull return nil;
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");
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));
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));
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));
165 be8b315d 2004-06-17 devnull free(s);
166 be8b315d 2004-06-17 devnull return cleanattr(a);
170 be8b315d 2004-06-17 devnull _strfindattr(Attr *a, char *n)
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;