17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier
4*9a747e4fSDavid du Colombier /*
5*9a747e4fSDavid du Colombier * Since the SSL device uses decimal file descriptors to name channels,
6*9a747e4fSDavid du Colombier * it is impossible for a user-level file server to stand in for the kernel device.
7*9a747e4fSDavid du Colombier * Thus we hard-code #D rather than use /net/ssl.
8*9a747e4fSDavid du Colombier */
9*9a747e4fSDavid du Colombier
107dd7cddfSDavid du Colombier int
pushssl(int fd,char * alg,char * secin,char * secout,int * cfd)117dd7cddfSDavid du Colombier pushssl(int fd, char *alg, char *secin, char *secout, int *cfd)
127dd7cddfSDavid du Colombier {
137dd7cddfSDavid du Colombier char buf[8];
147dd7cddfSDavid du Colombier char dname[64];
157dd7cddfSDavid du Colombier int n, data, ctl;
167dd7cddfSDavid du Colombier
17*9a747e4fSDavid du Colombier ctl = open("#D/ssl/clone", ORDWR);
187dd7cddfSDavid du Colombier if(ctl < 0)
197dd7cddfSDavid du Colombier return -1;
207dd7cddfSDavid du Colombier n = read(ctl, buf, sizeof(buf)-1);
217dd7cddfSDavid du Colombier if(n < 0)
227dd7cddfSDavid du Colombier goto error;
237dd7cddfSDavid du Colombier buf[n] = 0;
24*9a747e4fSDavid du Colombier sprint(dname, "#D/ssl/%s/data", buf);
257dd7cddfSDavid du Colombier data = open(dname, ORDWR);
267dd7cddfSDavid du Colombier if(data < 0)
277dd7cddfSDavid du Colombier goto error;
287dd7cddfSDavid du Colombier if(fprint(ctl, "fd %d", fd) < 0 ||
297dd7cddfSDavid du Colombier fprint(ctl, "secretin %s", secin) < 0 ||
307dd7cddfSDavid du Colombier fprint(ctl, "secretout %s", secout) < 0 ||
317dd7cddfSDavid du Colombier fprint(ctl, "alg %s", alg) < 0){
327dd7cddfSDavid du Colombier close(data);
337dd7cddfSDavid du Colombier goto error;
347dd7cddfSDavid du Colombier }
357dd7cddfSDavid du Colombier close(fd);
367dd7cddfSDavid du Colombier if(cfd != 0)
377dd7cddfSDavid du Colombier *cfd = ctl;
387dd7cddfSDavid du Colombier else
397dd7cddfSDavid du Colombier close(ctl);
407dd7cddfSDavid du Colombier return data;
417dd7cddfSDavid du Colombier error:
427dd7cddfSDavid du Colombier close(ctl);
437dd7cddfSDavid du Colombier return -1;
447dd7cddfSDavid du Colombier }
45