|  | /* | 
|  | * Copy WEP key to ethernet device. | 
|  | */ | 
|  |  | 
|  | #include "std.h" | 
|  | #include "dat.h" | 
|  |  | 
|  | static int | 
|  | wepclient(Conv *c) | 
|  | { | 
|  | char *dev, buf[128], *p, *kp; | 
|  | Key *k; | 
|  | int ret, fd, cfd; | 
|  |  | 
|  | fd = cfd = -1; | 
|  | ret = -1; | 
|  | dev = nil; | 
|  |  | 
|  | if((k = keylookup("%A !key1?", c->attr)) == nil | 
|  | && (k = keylookup("%A !key2?", c->attr)) == nil | 
|  | && (k = keylookup("%A !key3?", c->attr)) == nil){ | 
|  | werrstr("cannot find wep keys"); | 
|  | goto out; | 
|  | } | 
|  | if(convreadm(c, &dev) < 0) | 
|  | return -1; | 
|  | if(dev[0] != '#' || dev[1] != 'l'){ | 
|  | werrstr("not an ethernet device: %s", dev); | 
|  | goto out; | 
|  | } | 
|  | snprint(buf, sizeof buf, "%s!0", dev); | 
|  | if((fd = dial(buf, 0, 0, &cfd)) < 0) | 
|  | goto out; | 
|  | if(!(p = strfindattr(k->privattr, kp="!key1")) | 
|  | && !(p = strfindattr(k->privattr, kp="key2")) | 
|  | && !(p = strfindattr(k->privattr, kp="key3"))){ | 
|  | werrstr("lost key"); | 
|  | goto out; | 
|  | } | 
|  | if(fprint(cfd, "%s %q", kp+1, p) < 0) | 
|  | goto out; | 
|  | if((p = strfindattr(k->attr, "essid")) != nil | 
|  | && fprint(cfd, "essid %q", p) < 0) | 
|  | goto out; | 
|  | if(fprint(cfd, "crypt on") < 0) | 
|  | goto out; | 
|  | ret = 0; | 
|  |  | 
|  | out: | 
|  | free(dev); | 
|  | if(cfd >= 0) | 
|  | close(cfd); | 
|  | if(fd >= 0) | 
|  | close(fd); | 
|  | keyclose(k); | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | static int | 
|  | wepcheck(Key *k) | 
|  | { | 
|  | if(strfindattr(k->privattr, "!key1") == nil | 
|  | && strfindattr(k->privattr, "!key2") == nil | 
|  | && strfindattr(k->privattr, "!key3") == nil){ | 
|  | werrstr("need !key1, !key2, or !key3 attribute"); | 
|  | return -1; | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static Role weproles[] = { | 
|  | "client",	wepclient, | 
|  | 0 | 
|  | }; | 
|  |  | 
|  | Proto wep = | 
|  | { | 
|  | "wep", | 
|  | weproles, | 
|  | nil, | 
|  | wepcheck, | 
|  | nil | 
|  | }; |