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 /* 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 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