Snapshot of the current changes.
[ntbtls.git] / src / ntbtls-cli.c
1 /* ntbtls-cli.h - NTBTLS client test program
2  * Copyright (C) 2014 g10 Code GmbH
3  *
4  * This file is part of NTBTLS
5  *
6  * NTBTLS is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * NTBTLS is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <config.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <stdarg.h>
24
25 #include "ntbtls.h"
26
27 #define PGMNAME "ntbtls-cli"
28
29 static int verbose;
30 static int errorcount;
31
32 \f
33 /*
34  * Reporting functions.
35  */
36 static void
37 die (const char *format, ...)
38 {
39   va_list arg_ptr ;
40
41   fflush (stdout);
42 #ifdef HAVE_FLOCKFILE
43   flockfile (stderr);
44 #endif
45   fprintf (stderr, "%s: ", PGMNAME);
46   va_start (arg_ptr, format) ;
47   vfprintf (stderr, format, arg_ptr);
48   va_end (arg_ptr);
49   if (*format && format[strlen(format)-1] != '\n')
50     putc ('\n', stderr);
51 #ifdef HAVE_FLOCKFILE
52   funlockfile (stderr);
53 #endif
54   exit (1);
55 }
56
57
58 static void
59 fail (const char *format, ...)
60 {
61   va_list arg_ptr;
62
63   fflush (stdout);
64 #ifdef HAVE_FLOCKFILE
65   flockfile (stderr);
66 #endif
67   fprintf (stderr, "%s: ", PGMNAME);
68   va_start (arg_ptr, format);
69   vfprintf (stderr, format, arg_ptr);
70   va_end (arg_ptr);
71   if (*format && format[strlen(format)-1] != '\n')
72     putc ('\n', stderr);
73 #ifdef HAVE_FLOCKFILE
74   funlockfile (stderr);
75 #endif
76   errorcount++;
77   if (errorcount >= 50)
78     die ("stopped after 50 errors.");
79 }
80
81
82 static void
83 info (const char *format, ...)
84 {
85   va_list arg_ptr;
86
87   if (!verbose)
88     return;
89 #ifdef HAVE_FLOCKFILE
90   flockfile (stderr);
91 #endif
92   fprintf (stderr, "%s: ", PGMNAME);
93   va_start (arg_ptr, format);
94   vfprintf (stderr, format, arg_ptr);
95   if (*format && format[strlen(format)-1] != '\n')
96     putc ('\n', stderr);
97   va_end (arg_ptr);
98 #ifdef HAVE_FLOCKFILE
99   funlockfile (stderr);
100 #endif
101 }
102
103
104
105 \f
106 static void
107 simple_client (void)
108 {
109   ggp_error_t err;
110   ntbtls_t tls;
111
112
113   err = ntbtls_init (&tls);
114   if (err)
115     die ("ntbtls_init failed: %s %s\n",
116          gpg_strerror (err), gpg_strsource (err));
117
118   err = ntbtls_set_transport (tls, instream, outstream);
119   if (err)
120     die ("ntbtls_set_transport failed: %s <%s>\n"
121          gpg_strerror (err), gpg_strsource (err));
122
123   info ("starting handshake");
124   while ((err = ntbtls_handshake (tls)))
125     {
126       info ("handshake error: %s <%s>", gpg_strerror (err),gpg_strsource (err));
127       switch (gpg_err_code (err))
128         {
129         }
130       die ("handshake failed");
131     }
132   info ("handshake done");
133 }
134
135
136
137 int
138 main (int argc, char **argv)
139 {
140   int last_argc = -1;
141
142   if (argc)
143     { argc--; argv++; }
144   while (argc && last_argc != argc )
145     {
146       last_argc = argc;
147       if (!strcmp (*argv, "--"))
148         {
149           argc--; argv++;
150           break;
151         }
152       else if (!strcmp (*argv, "--verbose"))
153         {
154           verbose = 1;
155           argc--; argv++;
156         }
157       else if (strncmp (*argv, "--", 2))
158         die ("Invalid option '%s'\n", *argv);
159     }
160
161   simple_client ();
162 }