1fb7f0c93SDavid du Colombier /*
2fb7f0c93SDavid du Colombier * The caller supplies the device, we do the flavoring. There
3fb7f0c93SDavid du Colombier * are no phases, everything happens in the init routine.
4fb7f0c93SDavid du Colombier */
5fb7f0c93SDavid du Colombier
6fb7f0c93SDavid du Colombier #include "dat.h"
7fb7f0c93SDavid du Colombier
8fb7f0c93SDavid du Colombier typedef struct State State;
9fb7f0c93SDavid du Colombier struct State
10fb7f0c93SDavid du Colombier {
11fb7f0c93SDavid du Colombier Key *key;
12fb7f0c93SDavid du Colombier };
13fb7f0c93SDavid du Colombier
14fb7f0c93SDavid du Colombier enum
15fb7f0c93SDavid du Colombier {
16fb7f0c93SDavid du Colombier HavePass,
17fb7f0c93SDavid du Colombier };
18fb7f0c93SDavid du Colombier
19fb7f0c93SDavid du Colombier static int
wepinit(Proto *,Fsstate * fss)20fb7f0c93SDavid du Colombier wepinit(Proto*, Fsstate *fss)
21fb7f0c93SDavid du Colombier {
22fb7f0c93SDavid du Colombier int ret;
23fb7f0c93SDavid du Colombier Key *k;
24*260f7b65SDavid du Colombier Keyinfo ki;
25fb7f0c93SDavid du Colombier State *s;
26fb7f0c93SDavid du Colombier
27fb7f0c93SDavid du Colombier /* find a key with at least one password */
28*260f7b65SDavid du Colombier mkkeyinfo(&ki, fss, nil);
29*260f7b65SDavid du Colombier ret = findkey(&k, &ki, "!key1?");
30fb7f0c93SDavid du Colombier if(ret != RpcOk)
31*260f7b65SDavid du Colombier ret = findkey(&k, &ki, "!key2?");
32fb7f0c93SDavid du Colombier if(ret != RpcOk)
33*260f7b65SDavid du Colombier ret = findkey(&k, &ki, "!key3?");
34fb7f0c93SDavid du Colombier if(ret != RpcOk)
35fb7f0c93SDavid du Colombier return ret;
36fb7f0c93SDavid du Colombier
37fb7f0c93SDavid du Colombier setattrs(fss->attr, k->attr);
38fb7f0c93SDavid du Colombier s = emalloc(sizeof(*s));
39fb7f0c93SDavid du Colombier s->key = k;
40fb7f0c93SDavid du Colombier fss->ps = s;
41fb7f0c93SDavid du Colombier fss->phase = HavePass;
42fb7f0c93SDavid du Colombier
43fb7f0c93SDavid du Colombier return RpcOk;
44fb7f0c93SDavid du Colombier }
45fb7f0c93SDavid du Colombier
46fb7f0c93SDavid du Colombier static void
wepclose(Fsstate * fss)47fb7f0c93SDavid du Colombier wepclose(Fsstate *fss)
48fb7f0c93SDavid du Colombier {
49fb7f0c93SDavid du Colombier State *s;
50fb7f0c93SDavid du Colombier
51fb7f0c93SDavid du Colombier s = fss->ps;
52fb7f0c93SDavid du Colombier if(s->key)
53fb7f0c93SDavid du Colombier closekey(s->key);
54fb7f0c93SDavid du Colombier free(s);
55fb7f0c93SDavid du Colombier }
56fb7f0c93SDavid du Colombier
57fb7f0c93SDavid du Colombier static int
wepread(Fsstate * fss,void *,uint *)58fb7f0c93SDavid du Colombier wepread(Fsstate *fss, void*, uint*)
59fb7f0c93SDavid du Colombier {
60fb7f0c93SDavid du Colombier return phaseerror(fss, "read");
61fb7f0c93SDavid du Colombier }
62fb7f0c93SDavid du Colombier
63fb7f0c93SDavid du Colombier static int
wepwrite(Fsstate * fss,void * va,uint n)64fb7f0c93SDavid du Colombier wepwrite(Fsstate *fss, void *va, uint n)
65fb7f0c93SDavid du Colombier {
66fb7f0c93SDavid du Colombier char *data = va;
67fb7f0c93SDavid du Colombier State *s;
68fb7f0c93SDavid du Colombier char dev[64];
69fb7f0c93SDavid du Colombier int fd, cfd;
70fb7f0c93SDavid du Colombier int rv;
71fb7f0c93SDavid du Colombier char *p;
72fb7f0c93SDavid du Colombier
73fb7f0c93SDavid du Colombier /* get the device */
74fb7f0c93SDavid du Colombier if(n > sizeof(dev)-5){
75fb7f0c93SDavid du Colombier werrstr("device too long");
76fb7f0c93SDavid du Colombier return RpcErrstr;
77fb7f0c93SDavid du Colombier }
78fb7f0c93SDavid du Colombier memmove(dev, data, n);
79fb7f0c93SDavid du Colombier dev[n] = 0;
80fb7f0c93SDavid du Colombier s = fss->ps;
81fb7f0c93SDavid du Colombier
82fb7f0c93SDavid du Colombier /* legal? */
83fb7f0c93SDavid du Colombier if(dev[0] != '#' || dev[1] != 'l'){
84fb7f0c93SDavid du Colombier werrstr("%s not an ether device", dev);
85fb7f0c93SDavid du Colombier return RpcErrstr;
86fb7f0c93SDavid du Colombier }
87fb7f0c93SDavid du Colombier strcat(dev, "!0");
88fb7f0c93SDavid du Colombier fd = dial(dev, 0, 0, &cfd);
89fb7f0c93SDavid du Colombier if(fd < 0)
90fb7f0c93SDavid du Colombier return RpcErrstr;
91fb7f0c93SDavid du Colombier
92fb7f0c93SDavid du Colombier /* flavor it with passwords, essid, and turn on wep */
93fb7f0c93SDavid du Colombier rv = RpcErrstr;
94fb7f0c93SDavid du Colombier p = _strfindattr(s->key->privattr, "!key1");
95fb7f0c93SDavid du Colombier if(p != nil)
96fb7f0c93SDavid du Colombier if(fprint(cfd, "key1 %s", p) < 0)
97fb7f0c93SDavid du Colombier goto out;
98fb7f0c93SDavid du Colombier p = _strfindattr(s->key->privattr, "!key2");
99fb7f0c93SDavid du Colombier if(p != nil)
100fb7f0c93SDavid du Colombier if(fprint(cfd, "key2 %s", p) < 0)
101fb7f0c93SDavid du Colombier goto out;
102fb7f0c93SDavid du Colombier p = _strfindattr(s->key->privattr, "!key3");
103fb7f0c93SDavid du Colombier if(p != nil)
104fb7f0c93SDavid du Colombier if(fprint(cfd, "key3 %s", p) < 0)
105fb7f0c93SDavid du Colombier goto out;
106fb7f0c93SDavid du Colombier p = _strfindattr(fss->attr, "essid");
107fb7f0c93SDavid du Colombier if(p != nil)
108fb7f0c93SDavid du Colombier if(fprint(cfd, "essid %s", p) < 0)
109fb7f0c93SDavid du Colombier goto out;
110fb7f0c93SDavid du Colombier if(fprint(cfd, "crypt on") < 0)
111fb7f0c93SDavid du Colombier goto out;
112fb7f0c93SDavid du Colombier rv = RpcOk;
113fb7f0c93SDavid du Colombier out:
114fb7f0c93SDavid du Colombier close(fd);
115fb7f0c93SDavid du Colombier close(cfd);
116fb7f0c93SDavid du Colombier return rv;
117fb7f0c93SDavid du Colombier }
118fb7f0c93SDavid du Colombier
119fb7f0c93SDavid du Colombier Proto wep =
120fb7f0c93SDavid du Colombier {
121fb7f0c93SDavid du Colombier .name= "wep",
122fb7f0c93SDavid du Colombier .init= wepinit,
123fb7f0c93SDavid du Colombier .write= wepwrite,
124fb7f0c93SDavid du Colombier .read= wepread,
125fb7f0c93SDavid du Colombier .close= wepclose,
126fb7f0c93SDavid du Colombier .addkey= replacekey,
127fb7f0c93SDavid du Colombier .keyprompt= "!key1? !key2? !key3? essid?",
128fb7f0c93SDavid du Colombier };
129