1*8ccd4a63SDavid du Colombier #include <u.h>
2*8ccd4a63SDavid du Colombier #include <libc.h>
3*8ccd4a63SDavid du Colombier
4*8ccd4a63SDavid du Colombier /*
5*8ccd4a63SDavid du Colombier * Since the SSL device uses decimal file descriptors to name channels,
6*8ccd4a63SDavid du Colombier * it is impossible for a user-level file server to stand in for the kernel device.
7*8ccd4a63SDavid du Colombier * Thus we hard-code #D rather than use /net/ssl.
8*8ccd4a63SDavid du Colombier */
9*8ccd4a63SDavid du Colombier
10*8ccd4a63SDavid du Colombier int
pushssl(int fd,char * alg,char * secin,char * secout,int * cfd)11*8ccd4a63SDavid du Colombier pushssl(int fd, char *alg, char *secin, char *secout, int *cfd)
12*8ccd4a63SDavid du Colombier {
13*8ccd4a63SDavid du Colombier char buf[8];
14*8ccd4a63SDavid du Colombier char dname[64];
15*8ccd4a63SDavid du Colombier int n, data, ctl;
16*8ccd4a63SDavid du Colombier
17*8ccd4a63SDavid du Colombier ctl = open("#D/ssl/clone", ORDWR);
18*8ccd4a63SDavid du Colombier if(ctl < 0)
19*8ccd4a63SDavid du Colombier return -1;
20*8ccd4a63SDavid du Colombier n = read(ctl, buf, sizeof(buf)-1);
21*8ccd4a63SDavid du Colombier if(n < 0)
22*8ccd4a63SDavid du Colombier goto error;
23*8ccd4a63SDavid du Colombier buf[n] = 0;
24*8ccd4a63SDavid du Colombier sprint(dname, "#D/ssl/%s/data", buf);
25*8ccd4a63SDavid du Colombier data = open(dname, ORDWR);
26*8ccd4a63SDavid du Colombier if(data < 0)
27*8ccd4a63SDavid du Colombier goto error;
28*8ccd4a63SDavid du Colombier if(fprint(ctl, "fd %d", fd) < 0 ||
29*8ccd4a63SDavid du Colombier fprint(ctl, "secretin %s", secin) < 0 ||
30*8ccd4a63SDavid du Colombier fprint(ctl, "secretout %s", secout) < 0 ||
31*8ccd4a63SDavid du Colombier fprint(ctl, "alg %s", alg) < 0){
32*8ccd4a63SDavid du Colombier close(data);
33*8ccd4a63SDavid du Colombier goto error;
34*8ccd4a63SDavid du Colombier }
35*8ccd4a63SDavid du Colombier close(fd);
36*8ccd4a63SDavid du Colombier if(cfd != 0)
37*8ccd4a63SDavid du Colombier *cfd = ctl;
38*8ccd4a63SDavid du Colombier else
39*8ccd4a63SDavid du Colombier close(ctl);
40*8ccd4a63SDavid du Colombier return data;
41*8ccd4a63SDavid du Colombier error:
42*8ccd4a63SDavid du Colombier close(ctl);
43*8ccd4a63SDavid du Colombier return -1;
44*8ccd4a63SDavid du Colombier }
45