]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/tlssrv.c
417855339f222b877f4f60d2a6a6e790afbb4df4
[plan9front.git] / sys / src / cmd / tlssrv.c
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <mp.h>
5 #include <libsec.h>
6
7 char *remotesys = "";
8 char *logfile = nil;
9 int debug = 0;
10
11 static int
12 reporter(char *fmt, ...)
13 {
14         va_list ap;
15         char buf[2000];
16
17         va_start(ap, fmt);
18         if(logfile){
19                 vsnprint(buf, sizeof buf, fmt, ap);
20                 syslog(0, logfile, "%s tls reports %s", remotesys, buf);
21         }else{
22                 fprint(2, "%s: %s tls reports ", argv0, remotesys);
23                 vfprint(2, fmt, ap);
24                 fprint(2, "\n");
25         }
26         va_end(ap);
27         return 0;
28 }
29
30 void
31 usage(void)
32 {
33         fprint(2, "usage: tlssrv -c cert [-D] [-l logfile] [-r remotesys] [cmd args...]\n");
34         fprint(2, "  after  auth/secretpem key.pem > /mnt/factotum/ctl\n");
35         exits("usage");
36 }
37
38 void
39 main(int argc, char *argv[])
40 {
41         TLSconn *conn;
42         char *cert;
43         int fd;
44
45         cert = nil;
46         ARGBEGIN{
47         case 'D':
48                 debug++;
49                 break;
50         case 'c':
51                 cert = EARGF(usage());
52                 break;
53         case 'l':
54                 logfile = EARGF(usage());
55                 break;
56         case 'r':
57                 remotesys = EARGF(usage());
58                 break;
59         default:
60                 usage();
61         }ARGEND
62
63         if(cert == nil)
64                 sysfatal("no certificate specified");
65         conn = (TLSconn*)mallocz(sizeof *conn, 1);
66         if(conn == nil)
67                 sysfatal("out of memory");
68         conn->chain = readcertchain(cert);
69         if(conn->chain == nil)
70                 sysfatal("can't read certificate %s", cert);
71         conn->cert = conn->chain->pem;
72         conn->certlen = conn->chain->pemlen;
73         conn->chain = conn->chain->next;
74         if(debug)
75                 conn->trace = reporter;
76
77         fd = tlsServer(1, conn);
78         if(fd < 0){
79                 reporter("failed: %r");
80                 exits(0);
81         }
82         if(debug)
83                 reporter("open");
84
85         dup(fd, 0);
86         dup(fd, 1);
87
88         if(*argv == nil)
89                 *--argv = "/bin/cat";
90
91         exec(*argv, argv);
92         reporter("can't exec %s: %r", *argv);
93         exits("exec");
94 }