annotate cli-runopts.c @ 447:278805938dcf

Patch from Nicolai Ehemann to try binding before going to the background, so that if it exits early (because something's already listening etc) then it will return an exitcode of 1.
author Matt Johnston <matt@ucc.asn.au>
date Thu, 19 Jul 2007 15:54:18 +0000
parents 2cd2edfa11ee
children 3e6c536bc023
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1 /*
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
2 * Dropbear - a SSH2 server
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
3 *
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
4 * Copyright (c) 2002,2003 Matt Johnston
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
5 * All rights reserved.
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
6 *
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
8 * of this software and associated documentation files (the "Software"), to deal
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
9 * in the Software without restriction, including without limitation the rights
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
11 * copies of the Software, and to permit persons to whom the Software is
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
12 * furnished to do so, subject to the following conditions:
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
13 *
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
14 * The above copyright notice and this permission notice shall be included in
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
15 * all copies or substantial portions of the Software.
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
16 *
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
23 * SOFTWARE. */
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
24
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
25 #include "includes.h"
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
26 #include "runopts.h"
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
27 #include "signkey.h"
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
28 #include "buffer.h"
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
29 #include "dbutil.h"
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
30 #include "algo.h"
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
31 #include "tcpfwd.h"
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
32
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
33 cli_runopts cli_opts; /* GLOBAL */
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
34
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
35 static void printhelp();
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
36 static void parsehostname(char* userhostarg);
68
eee77ac31ccc cleaning up the pubkey defines
Matt Johnston <matt@ucc.asn.au>
parents: 66
diff changeset
37 #ifdef ENABLE_CLI_PUBKEY_AUTH
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
38 static void loadidentityfile(const char* filename);
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
39 #endif
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
40 #ifdef ENABLE_CLI_ANYTCPFWD
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
41 static void addforward(char* str, struct TCPFwdList** fwdlist);
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
42 #endif
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
43
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
44 static void printhelp() {
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
45
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
46 fprintf(stderr, "Dropbear client v%s\n"
333
9341570412e5 mention a command in the help
Matt Johnston <matt@ucc.asn.au>
parents: 326
diff changeset
47 "Usage: %s [options] [user@]host [command]\n"
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
48 "Options are:\n"
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
49 "-p <remoteport>\n"
258
306499676384 * add -g (dbclient) and -a (dropbear) options for allowing non-local
Matt Johnston <matt@ucc.asn.au>
parents: 215
diff changeset
50 "-l <username>\n"
56
6f091656c100 newlines which weren't there
Matt Johnston <matt@ucc.asn.au>
parents: 47
diff changeset
51 "-t Allocate a pty\n"
6f091656c100 newlines which weren't there
Matt Johnston <matt@ucc.asn.au>
parents: 47
diff changeset
52 "-T Don't allocate a pty\n"
325
0e4f225b7e07 Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents: 258
diff changeset
53 "-N Don't run a remote command\n"
326
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
54 "-f Run in background after auth\n"
418
ab57ba0cb667 Add '-y' option to dbclient to accept the host key without checking
Matt Johnston <matt@ucc.asn.au>
parents: 412
diff changeset
55 "-y Always accept remote host key if unknown\n"
68
eee77ac31ccc cleaning up the pubkey defines
Matt Johnston <matt@ucc.asn.au>
parents: 66
diff changeset
56 #ifdef ENABLE_CLI_PUBKEY_AUTH
56
6f091656c100 newlines which weren't there
Matt Johnston <matt@ucc.asn.au>
parents: 47
diff changeset
57 "-i <identityfile> (multiple allowed)\n"
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
58 #endif
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
59 #ifdef ENABLE_CLI_LOCALTCPFWD
181
1916df7df911 * Add references in the manpages to the dbclient manpage
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
60 "-L <listenport:remotehost:remoteport> Local port forwarding\n"
258
306499676384 * add -g (dbclient) and -a (dropbear) options for allowing non-local
Matt Johnston <matt@ucc.asn.au>
parents: 215
diff changeset
61 "-g Allow remote hosts to connect to forwarded ports\n"
62
20563735e8b5 just checkpointing
Matt Johnston <matt@ucc.asn.au>
parents: 56
diff changeset
62 #endif
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
63 #ifdef ENABLE_CLI_REMOTETCPFWD
62
20563735e8b5 just checkpointing
Matt Johnston <matt@ucc.asn.au>
parents: 56
diff changeset
64 "-R <listenport:remotehost:remoteport> Remote port forwarding\n"
20563735e8b5 just checkpointing
Matt Johnston <matt@ucc.asn.au>
parents: 56
diff changeset
65 #endif
94
c85c88500ea6 DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents: 68
diff changeset
66 #ifdef DEBUG_TRACE
c85c88500ea6 DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents: 68
diff changeset
67 "-v verbose\n"
c85c88500ea6 DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents: 68
diff changeset
68 #endif
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
69 ,DROPBEAR_VERSION, cli_opts.progname);
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
70 }
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
71
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
72 void cli_getopts(int argc, char ** argv) {
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
73
46
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
74 unsigned int i, j;
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
75 char ** next = 0;
46
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
76 unsigned int cmdlen;
68
eee77ac31ccc cleaning up the pubkey defines
Matt Johnston <matt@ucc.asn.au>
parents: 66
diff changeset
77 #ifdef ENABLE_CLI_PUBKEY_AUTH
46
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
78 int nextiskey = 0; /* A flag if the next argument is a keyfile */
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
79 #endif
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
80 #ifdef ENABLE_CLI_LOCALTCPFWD
62
20563735e8b5 just checkpointing
Matt Johnston <matt@ucc.asn.au>
parents: 56
diff changeset
81 int nextislocal = 0;
20563735e8b5 just checkpointing
Matt Johnston <matt@ucc.asn.au>
parents: 56
diff changeset
82 #endif
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
83 #ifdef ENABLE_CLI_REMOTETCPFWD
62
20563735e8b5 just checkpointing
Matt Johnston <matt@ucc.asn.au>
parents: 56
diff changeset
84 int nextisremote = 0;
20563735e8b5 just checkpointing
Matt Johnston <matt@ucc.asn.au>
parents: 56
diff changeset
85 #endif
66
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
86 char* dummy = NULL; /* Not used for anything real */
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
87
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
88 /* see printhelp() for options */
40
b4874d772210 - Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents: 39
diff changeset
89 cli_opts.progname = argv[0];
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
90 cli_opts.remotehost = NULL;
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
91 cli_opts.remoteport = NULL;
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
92 cli_opts.username = NULL;
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
93 cli_opts.cmd = NULL;
325
0e4f225b7e07 Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents: 258
diff changeset
94 cli_opts.no_cmd = 0;
326
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
95 cli_opts.backgrounded = 0;
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
96 cli_opts.wantpty = 9; /* 9 means "it hasn't been touched", gets set later */
418
ab57ba0cb667 Add '-y' option to dbclient to accept the host key without checking
Matt Johnston <matt@ucc.asn.au>
parents: 412
diff changeset
97 cli_opts.always_accept_key = 0;
68
eee77ac31ccc cleaning up the pubkey defines
Matt Johnston <matt@ucc.asn.au>
parents: 66
diff changeset
98 #ifdef ENABLE_CLI_PUBKEY_AUTH
215
aad4b3f58556 rename PubkeyList to SignKeyList for clarity
Matt Johnston <matt@ucc.asn.au>
parents: 181
diff changeset
99 cli_opts.privkeys = NULL;
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
100 #endif
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
101 #ifdef ENABLE_CLI_LOCALTCPFWD
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
102 cli_opts.localfwds = NULL;
446
2cd2edfa11ee Just use /dev/urandom since that's what everyone ends up using anyway.
Matt Johnston <matt@ucc.asn.au>
parents: 442
diff changeset
103 opts.listen_fwd_all = 0;
62
20563735e8b5 just checkpointing
Matt Johnston <matt@ucc.asn.au>
parents: 56
diff changeset
104 #endif
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
105 #ifdef ENABLE_CLI_REMOTETCPFWD
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
106 cli_opts.remotefwds = NULL;
62
20563735e8b5 just checkpointing
Matt Johnston <matt@ucc.asn.au>
parents: 56
diff changeset
107 #endif
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
108 /* not yet
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
109 opts.ipv4 = 1;
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
110 opts.ipv6 = 1;
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
111 */
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
112
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
113 /* Iterate all the arguments */
46
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
114 for (i = 1; i < (unsigned int)argc; i++) {
68
eee77ac31ccc cleaning up the pubkey defines
Matt Johnston <matt@ucc.asn.au>
parents: 66
diff changeset
115 #ifdef ENABLE_CLI_PUBKEY_AUTH
46
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
116 if (nextiskey) {
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
117 /* Load a hostkey since the previous argument was "-i" */
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
118 loadidentityfile(argv[i]);
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
119 nextiskey = 0;
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
120 continue;
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
121 }
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
122 #endif
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
123 #ifdef ENABLE_CLI_REMOTETCPFWD
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
124 if (nextisremote) {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 134
diff changeset
125 TRACE(("nextisremote true"))
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
126 addforward(argv[i], &cli_opts.remotefwds);
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
127 nextisremote = 0;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
128 continue;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
129 }
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
130 #endif
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
131 #ifdef ENABLE_CLI_LOCALTCPFWD
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
132 if (nextislocal) {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 134
diff changeset
133 TRACE(("nextislocal true"))
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
134 addforward(argv[i], &cli_opts.localfwds);
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
135 nextislocal = 0;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
136 continue;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
137 }
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
138 #endif
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
139 if (next) {
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
140 /* The previous flag set a value to assign */
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
141 *next = argv[i];
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
142 if (*next == NULL) {
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
143 dropbear_exit("Invalid null argument");
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
144 }
46
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
145 next = NULL;
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
146 continue;
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
147 }
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
148
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
149 if (argv[i][0] == '-') {
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
150 /* A flag *waves* */
46
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
151
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
152 switch (argv[i][1]) {
418
ab57ba0cb667 Add '-y' option to dbclient to accept the host key without checking
Matt Johnston <matt@ucc.asn.au>
parents: 412
diff changeset
153 case 'y': /* always accept the remote hostkey */
ab57ba0cb667 Add '-y' option to dbclient to accept the host key without checking
Matt Johnston <matt@ucc.asn.au>
parents: 412
diff changeset
154 cli_opts.always_accept_key = 1;
ab57ba0cb667 Add '-y' option to dbclient to accept the host key without checking
Matt Johnston <matt@ucc.asn.au>
parents: 412
diff changeset
155 break;
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
156 case 'p': /* remoteport */
46
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
157 next = &cli_opts.remoteport;
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
158 break;
68
eee77ac31ccc cleaning up the pubkey defines
Matt Johnston <matt@ucc.asn.au>
parents: 66
diff changeset
159 #ifdef ENABLE_CLI_PUBKEY_AUTH
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
160 case 'i': /* an identityfile */
134
6b306ad5f5b5 -i works with scp now.
Matt Johnston <matt@ucc.asn.au>
parents: 105
diff changeset
161 /* Keep scp happy when it changes "-i file" to "-ifile" */
6b306ad5f5b5 -i works with scp now.
Matt Johnston <matt@ucc.asn.au>
parents: 105
diff changeset
162 if (strlen(argv[i]) > 2) {
6b306ad5f5b5 -i works with scp now.
Matt Johnston <matt@ucc.asn.au>
parents: 105
diff changeset
163 loadidentityfile(&argv[i][2]);
6b306ad5f5b5 -i works with scp now.
Matt Johnston <matt@ucc.asn.au>
parents: 105
diff changeset
164 } else {
6b306ad5f5b5 -i works with scp now.
Matt Johnston <matt@ucc.asn.au>
parents: 105
diff changeset
165 nextiskey = 1;
6b306ad5f5b5 -i works with scp now.
Matt Johnston <matt@ucc.asn.au>
parents: 105
diff changeset
166 }
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
167 break;
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
168 #endif
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
169 case 't': /* we want a pty */
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
170 cli_opts.wantpty = 1;
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
171 break;
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
172 case 'T': /* don't want a pty */
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
173 cli_opts.wantpty = 0;
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
174 break;
325
0e4f225b7e07 Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents: 258
diff changeset
175 case 'N':
0e4f225b7e07 Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents: 258
diff changeset
176 cli_opts.no_cmd = 1;
0e4f225b7e07 Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents: 258
diff changeset
177 break;
326
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
178 case 'f':
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
179 cli_opts.backgrounded = 1;
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
180 break;
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
181 #ifdef ENABLE_CLI_LOCALTCPFWD
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
182 case 'L':
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
183 nextislocal = 1;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
184 break;
258
306499676384 * add -g (dbclient) and -a (dropbear) options for allowing non-local
Matt Johnston <matt@ucc.asn.au>
parents: 215
diff changeset
185 case 'g':
306499676384 * add -g (dbclient) and -a (dropbear) options for allowing non-local
Matt Johnston <matt@ucc.asn.au>
parents: 215
diff changeset
186 opts.listen_fwd_all = 1;
306499676384 * add -g (dbclient) and -a (dropbear) options for allowing non-local
Matt Johnston <matt@ucc.asn.au>
parents: 215
diff changeset
187 break;
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
188 #endif
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
189 #ifdef ENABLE_CLI_REMOTETCPFWD
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
190 case 'R':
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
191 nextisremote = 1;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
192 break;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
193 #endif
66
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
194 case 'l':
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
195 next = &cli_opts.username;
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
196 break;
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
197 case 'h':
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
198 printhelp();
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
199 exit(EXIT_SUCCESS);
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
200 break;
442
d82a2a44c684 Add -u option to specify /dev/urandom instead
Matt Johnston <matt@ucc.asn.au>
parents: 418
diff changeset
201 case 'u':
446
2cd2edfa11ee Just use /dev/urandom since that's what everyone ends up using anyway.
Matt Johnston <matt@ucc.asn.au>
parents: 442
diff changeset
202 /* backwards compatibility with old urandom option */
442
d82a2a44c684 Add -u option to specify /dev/urandom instead
Matt Johnston <matt@ucc.asn.au>
parents: 418
diff changeset
203 break;
94
c85c88500ea6 DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents: 68
diff changeset
204 #ifdef DEBUG_TRACE
c85c88500ea6 DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents: 68
diff changeset
205 case 'v':
c85c88500ea6 DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents: 68
diff changeset
206 debug_trace = 1;
c85c88500ea6 DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents: 68
diff changeset
207 break;
c85c88500ea6 DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents: 68
diff changeset
208 #endif
66
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
209 case 'F':
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
210 case 'e':
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
211 case 'c':
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
212 case 'm':
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
213 case 'D':
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
214 #ifndef ENABLE_CLI_REMOTETCPFWD
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
215 case 'R':
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
216 #endif
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
217 #ifndef ENABLE_CLI_LOCALTCPFWD
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
218 case 'L':
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
219 #endif
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
220 case 'o':
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
221 case 'b':
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
222 next = &dummy;
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
223 default:
66
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
224 fprintf(stderr,
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
225 "WARNING: Ignoring unknown argument '%s'\n", argv[i]);
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
226 break;
46
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
227 } /* Switch */
105
68b84c20ca1e Fix for "-l" scp option
Matt Johnston <matt@ucc.asn.au>
parents: 94
diff changeset
228
68b84c20ca1e Fix for "-l" scp option
Matt Johnston <matt@ucc.asn.au>
parents: 94
diff changeset
229 /* Now we handle args where they might be "-luser" (no spaces)*/
68b84c20ca1e Fix for "-l" scp option
Matt Johnston <matt@ucc.asn.au>
parents: 94
diff changeset
230 if (next && strlen(argv[i]) > 2) {
68b84c20ca1e Fix for "-l" scp option
Matt Johnston <matt@ucc.asn.au>
parents: 94
diff changeset
231 *next = &argv[i][2];
68b84c20ca1e Fix for "-l" scp option
Matt Johnston <matt@ucc.asn.au>
parents: 94
diff changeset
232 next = NULL;
68b84c20ca1e Fix for "-l" scp option
Matt Johnston <matt@ucc.asn.au>
parents: 94
diff changeset
233 }
46
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
234
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
235 continue; /* next argument */
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
236
46
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
237 } else {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 134
diff changeset
238 TRACE(("non-flag arg: '%s'", argv[i]))
46
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
239
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
240 /* Either the hostname or commands */
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
241
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
242 if (cli_opts.remotehost == NULL) {
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
243
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
244 parsehostname(argv[i]);
46
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
245
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
246 } else {
46
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
247
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
248 /* this is part of the commands to send - after this we
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
249 * don't parse any more options, and flags are sent as the
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
250 * command */
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
251 cmdlen = 0;
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
252 for (j = i; j < (unsigned int)argc; j++) {
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
253 cmdlen += strlen(argv[j]) + 1; /* +1 for spaces */
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
254 }
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
255 /* Allocate the space */
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
256 cli_opts.cmd = (char*)m_malloc(cmdlen);
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
257 cli_opts.cmd[0] = '\0';
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
258
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
259 /* Append all the bits */
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
260 for (j = i; j < (unsigned int)argc; j++) {
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
261 strlcat(cli_opts.cmd, argv[j], cmdlen);
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
262 strlcat(cli_opts.cmd, " ", cmdlen);
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
263 }
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
264 /* It'll be null-terminated here */
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
265
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
266 /* We've eaten all the options and flags */
3bea78e1b175 Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
267 break;
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
268 }
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
269 }
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
270 }
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
271
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
272 if (cli_opts.remotehost == NULL) {
66
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
273 printhelp();
38c3146aa23d Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents: 64
diff changeset
274 exit(EXIT_FAILURE);
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
275 }
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
276
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
277 if (cli_opts.remoteport == NULL) {
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
278 cli_opts.remoteport = "22";
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
279 }
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
280
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
281 /* If not explicitly specified with -t or -T, we don't want a pty if
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
282 * there's a command, but we do otherwise */
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
283 if (cli_opts.wantpty == 9) {
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
284 if (cli_opts.cmd == NULL) {
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
285 cli_opts.wantpty = 1;
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
286 } else {
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
287 cli_opts.wantpty = 0;
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
288 }
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
289 }
326
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
290
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
291 if (cli_opts.backgrounded && cli_opts.cmd == NULL
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
292 && cli_opts.no_cmd == 0) {
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
293 dropbear_exit("command required for -f");
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
294 }
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
295 }
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
296
68
eee77ac31ccc cleaning up the pubkey defines
Matt Johnston <matt@ucc.asn.au>
parents: 66
diff changeset
297 #ifdef ENABLE_CLI_PUBKEY_AUTH
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
298 static void loadidentityfile(const char* filename) {
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
299
215
aad4b3f58556 rename PubkeyList to SignKeyList for clarity
Matt Johnston <matt@ucc.asn.au>
parents: 181
diff changeset
300 struct SignKeyList * nextkey;
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
301 sign_key *key;
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
302 int keytype;
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
303
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
304 key = new_sign_key();
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
305 keytype = DROPBEAR_SIGNKEY_ANY;
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
306 if ( readhostkey(filename, key, &keytype) != DROPBEAR_SUCCESS ) {
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
307
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
308 fprintf(stderr, "Failed loading keyfile '%s'\n", filename);
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
309 sign_key_free(key);
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
310
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
311 } else {
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
312
215
aad4b3f58556 rename PubkeyList to SignKeyList for clarity
Matt Johnston <matt@ucc.asn.au>
parents: 181
diff changeset
313 nextkey = (struct SignKeyList*)m_malloc(sizeof(struct SignKeyList));
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
314 nextkey->key = key;
215
aad4b3f58556 rename PubkeyList to SignKeyList for clarity
Matt Johnston <matt@ucc.asn.au>
parents: 181
diff changeset
315 nextkey->next = cli_opts.privkeys;
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
316 nextkey->type = keytype;
215
aad4b3f58556 rename PubkeyList to SignKeyList for clarity
Matt Johnston <matt@ucc.asn.au>
parents: 181
diff changeset
317 cli_opts.privkeys = nextkey;
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
318 }
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
319 }
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
320 #endif
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
321
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
322
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
323 /* Parses a [user@]hostname argument. userhostarg is the argv[i] corresponding
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
324 * - note that it will be modified */
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
325 static void parsehostname(char* orighostarg) {
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
326
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
327 uid_t uid;
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
328 struct passwd *pw = NULL;
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
329 char *userhostarg = NULL;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
330
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
331 /* We probably don't want to be editing argvs */
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
332 userhostarg = m_strdup(orighostarg);
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
333
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
334 cli_opts.remotehost = strchr(userhostarg, '@');
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
335 if (cli_opts.remotehost == NULL) {
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
336 /* no username portion, the cli-auth.c code can figure the
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
337 * local user's name */
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
338 cli_opts.remotehost = userhostarg;
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
339 } else {
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
340 cli_opts.remotehost[0] = '\0'; /* Split the user/host */
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
341 cli_opts.remotehost++;
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
342 cli_opts.username = userhostarg;
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
343 }
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
344
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
345 if (cli_opts.username == NULL) {
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
346 uid = getuid();
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
347
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
348 pw = getpwuid(uid);
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
349 if (pw == NULL || pw->pw_name == NULL) {
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
350 dropbear_exit("Unknown own user");
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
351 }
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
352
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
353 cli_opts.username = m_strdup(pw->pw_name);
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
354 }
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
355
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
356 if (cli_opts.remotehost[0] == '\0') {
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
357 dropbear_exit("Bad hostname");
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
358 }
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 46
diff changeset
359 }
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
360
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
361 #ifdef ENABLE_CLI_ANYTCPFWD
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
362 /* Turn a "listenport:remoteaddr:remoteport" string into into a forwarding
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
363 * set, and add it to the forwarding list */
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
364 static void addforward(char* origstr, struct TCPFwdList** fwdlist) {
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
365
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
366 char * listenport = NULL;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
367 char * connectport = NULL;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
368 char * connectaddr = NULL;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
369 struct TCPFwdList* newfwd = NULL;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
370 char * str = NULL;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
371
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 134
diff changeset
372 TRACE(("enter addforward"))
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
373
411
253958302381 Revert bogus fix, make a note that the var is meant to 'leak'
Matt Johnston <matt@ucc.asn.au>
parents: 407
diff changeset
374 /* We need to split the original argument up. This var
253958302381 Revert bogus fix, make a note that the var is meant to 'leak'
Matt Johnston <matt@ucc.asn.au>
parents: 407
diff changeset
375 is never free()d. */
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
376 str = m_strdup(origstr);
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
377
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
378 listenport = str;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
379
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
380 connectaddr = strchr(str, ':');
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
381 if (connectaddr == NULL) {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 134
diff changeset
382 TRACE(("connectaddr == NULL"))
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
383 goto fail;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
384 }
407
ea0929224294 Fix another leak found by Klocwork
Matt Johnston <matt@ucc.asn.au>
parents: 258
diff changeset
385 *connectaddr = '\0';
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
386 connectaddr++;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
387
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
388 connectport = strchr(connectaddr, ':');
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
389 if (connectport == NULL) {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 134
diff changeset
390 TRACE(("connectport == NULL"))
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
391 goto fail;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
392 }
407
ea0929224294 Fix another leak found by Klocwork
Matt Johnston <matt@ucc.asn.au>
parents: 258
diff changeset
393 *connectport = '\0';
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
394 connectport++;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
395
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
396 newfwd = (struct TCPFwdList*)m_malloc(sizeof(struct TCPFwdList));
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
397
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
398 /* Now we check the ports - note that the port ints are unsigned,
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
399 * the check later only checks for >= MAX_PORT */
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
400 newfwd->listenport = strtol(listenport, NULL, 10);
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
401 if (errno != 0) {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 134
diff changeset
402 TRACE(("bad listenport strtol"))
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
403 goto fail;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
404 }
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
405
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
406 newfwd->connectport = strtol(connectport, NULL, 10);
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
407 if (errno != 0) {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 134
diff changeset
408 TRACE(("bad connectport strtol"))
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
409 goto fail;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
410 }
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
411
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
412 newfwd->connectaddr = connectaddr;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
413
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
414 if (newfwd->listenport > 65535) {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 134
diff changeset
415 TRACE(("listenport > 65535"))
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
416 goto badport;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
417 }
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
418
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
419 if (newfwd->connectport > 65535) {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 134
diff changeset
420 TRACE(("connectport > 65535"))
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
421 goto badport;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
422 }
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
423
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
424 newfwd->next = *fwdlist;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
425 *fwdlist = newfwd;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
426
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 134
diff changeset
427 TRACE(("leave addforward: done"))
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
428 return;
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
429
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
430 fail:
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
431 dropbear_exit("Bad TCP forward '%s'", origstr);
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
432
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
433 badport:
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
434 dropbear_exit("Bad TCP port in '%s'", origstr);
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
435 }
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
436 #endif