xref: /plan9-contrib/sys/src/cmd/webfs/io.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <ip.h>
5 #include <plumb.h>
6 #include <thread.h>
7 #include <fcall.h>
8 #include <9p.h>
9 #include <mp.h>
10 #include <libsec.h>
11 #include "dat.h"
12 #include "fns.h"
13 
14 static long
15 _iovfprint(va_list *arg)
16 {
17 	int fd;
18 	char *fmt;
19 	va_list arg2;
20 
21 	fd = va_arg(*arg, int);
22 	fmt = va_arg(*arg, char*);
23 	arg2 = va_arg(*arg, va_list);
24 	return vfprint(fd, fmt, arg2);
25 }
26 
27 int
28 iovfprint(Ioproc *io, int fd, char *fmt, va_list arg)
29 {
30 	return iocall(io, _iovfprint, fd, fmt, arg);
31 }
32 
33 int
34 ioprint(Ioproc *io, int fd, char *fmt, ...)
35 {
36 	int n;
37 	va_list arg;
38 
39 	va_start(arg, fmt);
40 	n = iovfprint(io, fd, fmt, arg);
41 	va_end(arg);
42 	return n;
43 }
44 
45 static long
46 _iotlsdial(va_list *arg)
47 {
48 	char *addr, *local, *dir;
49 	int *cfdp, fd, tfd, usetls;
50 	TLSconn conn;
51 
52 	addr = va_arg(*arg, char*);
53 	local = va_arg(*arg, char*);
54 	dir = va_arg(*arg, char*);
55 	cfdp = va_arg(*arg, int*);
56 	usetls = va_arg(*arg, int);
57 
58 	fd = dial(addr, local, dir, cfdp);
59 	if(fd < 0)
60 		return -1;
61 	if(!usetls)
62 		return fd;
63 
64 	memset(&conn, 0, sizeof conn);
65 	tfd = tlsClient(fd, &conn);
66 	if(tfd < 0){
67 		print("tls %r\n");
68 		close(fd);
69 		return -1;
70 	}
71 	/* BUG: check cert here? */
72 	if(conn.cert)
73 		free(conn.cert);
74 	close(fd);
75 	return tfd;
76 }
77 
78 int
79 iotlsdial(Ioproc *io, char *addr, char *local, char *dir, int *cfdp, int usetls)
80 {
81 	return iocall(io, _iotlsdial, addr, local, dir, cfdp, usetls);
82 }
83