aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/auth/factotum/wep.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/auth/factotum/wep.c')
-rw-r--r--src/cmd/auth/factotum/wep.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/cmd/auth/factotum/wep.c b/src/cmd/auth/factotum/wep.c
new file mode 100644
index 00000000..1d516db2
--- /dev/null
+++ b/src/cmd/auth/factotum/wep.c
@@ -0,0 +1,83 @@
+/*
+ * 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
+};