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