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