| /* |
| * 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 |
| }; |