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