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
_iovfprint(va_list * arg)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
iovfprint(Ioproc * io,int fd,char * fmt,va_list arg)28 iovfprint(Ioproc *io, int fd, char *fmt, va_list arg)
29 {
30 return iocall(io, _iovfprint, fd, fmt, arg);
31 }
32
33 int
ioprint(Ioproc * io,int fd,char * fmt,...)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
_iotlsdial(va_list * arg)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 /* does no good, so far anyway */
66 // conn.chain = readcertchain("/sys/lib/ssl/vsignss.pem");
67
68 tfd = tlsClient(fd, &conn);
69 close(fd);
70 if(tfd < 0)
71 fprint(2, "%s: tlsClient: %r\n", argv0);
72 else {
73 /* BUG: check cert here? */
74 if(conn.cert)
75 free(conn.cert);
76 }
77 return tfd;
78 }
79
80 int
iotlsdial(Ioproc * io,char * addr,char * local,char * dir,int * cfdp,int usetls)81 iotlsdial(Ioproc *io, char *addr, char *local, char *dir, int *cfdp, int usetls)
82 {
83 return iocall(io, _iotlsdial, addr, local, dir, cfdp, usetls);
84 }
85