xref: /plan9/sys/src/libc/9sys/pushssl.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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