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