@@ -99,183 +99,78 @@
99 99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
100 100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static char zDefaultSshCmd[] = "ssh -e none -T";
101 101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
102 102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
103 103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Generate a random SSH link problem keyword
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int random_probe(char *zProbe, int nProbe){
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned r[4];
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_randomness(sizeof(r), r);
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_snprintf(nProbe, zProbe, "probe-%08x%08x%08x%08x",
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- r[0], r[1], r[2], r[3]);
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return (int)strlen(zProbe);
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Bring up an SSH link. This involves sending some "echo" commands and
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** get back appropriate responses. The point is to move past the MOTD and
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** verify that the link is working.
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void transport_ssh_startup(void){
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zIn; /* An input line received back from remote */
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nWait; /* Number of times waiting for the MOTD */
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char zProbe[40]; /* Text of the random probe */
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nProbe; /* Size of probe message */
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nIn; /* Size of input */
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static const int nBuf = 10000; /* Size of input buffer */
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zIn = fossil_malloc(nBuf);
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nProbe = random_probe(zProbe, sizeof(zProbe));
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fprintf(sshOut, "echo %s\n", zProbe);
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fflush(sshOut);
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.fSshTrace ){
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- printf("Sent: [echo %s]\n", zProbe);
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fflush(stdout);
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(zIn, '*', nProbe);
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(nWait=1; nWait<=10; nWait++){
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sshin_read(zIn+nProbe, nBuf-nProbe);
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.fSshTrace ){
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- printf("Got back-----------------------------------------------\n"
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "%s\n"
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "-------------------------------------------------------\n",
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zIn+nProbe);
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( strstr(zIn, zProbe) ) break;
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_sleep(100*nWait);
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nIn = (int)strlen(zIn);
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memcpy(zIn, zIn+(nIn-nProbe), nProbe);
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.fSshTrace ){
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- printf("Fetching more text. Looking for [%s]...\n", zProbe);
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fflush(stdout);
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nProbe = random_probe(zProbe, sizeof(zProbe));
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fprintf(sshOut, "echo %s\n", zProbe);
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fflush(sshOut);
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.fSshTrace ){
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- printf("Sent: [echo %s]\n", zProbe);
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fflush(stdout);
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sshin_read(zIn, nBuf);
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zIn[0]==0 ){
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_sleep(250);
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sshin_read(zIn, nBuf);
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.fSshTrace ){
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- printf("Got back-----------------------------------------------\n"
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "%s\n"
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "-------------------------------------------------------\n", zIn);
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( memcmp(zIn, zProbe, nProbe)!=0 ){
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pclose2(sshIn, sshOut, sshPid);
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_fatal("ssh connection failed: [%s]", zIn);
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_free(zIn);
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Global initialization of the transport layer
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void transport_global_startup(void){
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.urlIsSsh ){
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Only SSH requires a global initialization. For SSH we need to create
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** and run an SSH command to talk to the remote machine.
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zSsh; /* The base SSH command */
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob zCmd; /* The SSH command */
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zHost; /* The host name to contact */
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n; /* Size of prefix string */
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zSsh = db_get("ssh-command", zDefaultSshCmd);
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_init(&zCmd, zSsh, -1);
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.urlPort!=g.urlDfltPort ){
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef __MINGW32__
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&zCmd, " -P %d", g.urlPort);
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&zCmd, " -p %d", g.urlPort);
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_force_newline();
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_print("%s", blob_str(&zCmd)); /* Show the base of the SSH command */
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.urlUser && g.urlUser[0] ){
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zHost = mprintf("%s@%s", g.urlUser, g.urlName);
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef __MINGW32__
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Only win32 (and specifically PLINK.EXE) support the -pw option */
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.urlPasswd && g.urlPasswd[0] ){
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob pw;
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_zero(&pw);
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.urlPasswd[0]=='*' ){
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zPrompt;
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zPrompt = mprintf("Password for [%s]: ", zHost);
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- prompt_for_password(zPrompt, &pw, 0);
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- free(zPrompt);
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_init(&pw, g.urlPasswd, -1);
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(&zCmd, " -pw ", -1);
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- shell_escape(&zCmd, blob_str(&pw));
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&pw);
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_print(" -pw ********"); /* Do not show the password text */
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zHost = mprintf("%s", g.urlName);
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- n = blob_size(&zCmd);
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(&zCmd, " ", 1);
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- shell_escape(&zCmd, zHost);
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.urlShell ){
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&zCmd, " %s", g.urlShell);
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if defined(FOSSIL_ENABLE_SSH_FAR_SIDE)
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* The following works. But only if the fossil on the remote side
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is recent enough to support the test-ssh-far-side command. That
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** command was added on 2013-02-06. We will leave this turned off
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** until most fossil servers have upgraded to that version or a later
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** version. The sync will still work as long as the shell on the far
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** side is bash and not tcsh. And if the default far side shell is
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** tcsh, then the shell=/bin/bash query parameter can be used as a
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** work-around. Enable this code after about a year...
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&zCmd, " exec %s test-ssh-far-side", g.urlFossil);
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_print("%s\n", blob_str(&zCmd)+n); /* Show tail of SSH command */
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- free(zHost);
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- popen2(blob_str(&zCmd), &sshIn, &sshOut, &sshPid);
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sshPid==0 ){
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_fatal("cannot start ssh tunnel using [%b]", &zCmd);
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&zCmd);
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- transport_ssh_startup();
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** COMMAND: test-ssh-far-side
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Read lines of input text, one by one, and evaluate each line using
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** system(). The ssh: sync protocol uses this on the far side of the
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** SSH link.
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void test_ssh_far_side_cmd(void){
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i = 0;
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int got;
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char zLine[5000];
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( i<sizeof(zLine) ){
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- got = read(0, zLine+i, 1);
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( got==0 ) return;
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zLine[i]=='\n' ){
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zLine[i] = 0;
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- system(zLine);
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- i = 0;
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- i++;
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SSH initialization of the transport layer
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int transport_ssh_open(void){
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* For SSH we need to create and run SSH fossil http
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to talk to the remote machine.
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zSsh; /* The base SSH command */
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob zCmd; /* The SSH command */
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zHost; /* The host name to contact */
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n; /* Size of prefix string */
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zSsh = db_get("ssh-command", zDefaultSshCmd);
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&zCmd, zSsh, -1);
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.urlPort!=g.urlDfltPort ){
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef __MINGW32__
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&zCmd, " -P %d", g.urlPort);
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&zCmd, " -p %d", g.urlPort);
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_force_newline();
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("%s", blob_str(&zCmd)); /* Show the base of the SSH command */
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.urlUser && g.urlUser[0] ){
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zHost = mprintf("%s@%s", g.urlUser, g.urlName);
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef __MINGW32__
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Only win32 (and specifically PLINK.EXE) support the -pw option */
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.urlPasswd && g.urlPasswd[0] ){
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob pw;
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&pw);
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.urlPasswd[0]=='*' ){
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zPrompt;
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zPrompt = mprintf("Password for [%s]: ", zHost);
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ prompt_for_password(zPrompt, &pw, 0);
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(zPrompt);
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&pw, g.urlPasswd, -1);
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&zCmd, " -pw ", -1);
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ shell_escape(&zCmd, blob_str(&pw));
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&pw);
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print(" -pw ********"); /* Do not show the password text */
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zHost = mprintf("%s", g.urlName);
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ n = blob_size(&zCmd);
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&zCmd, " ", 1);
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ shell_escape(&zCmd, zHost);
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.fSshFossilCmd && g.fSshFossilCmd[0] ){
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&zCmd, " ", 1);
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ shell_escape(&zCmd, mprintf("%s", g.fSshFossilCmd));
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&zCmd, " fossil", 7);
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&zCmd, " http", 5);
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.urlPath && g.urlPath[0] ){
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&zCmd, " ", 1);
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ shell_escape(&zCmd, mprintf("%s", g.urlPath));
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("%s\n", blob_str(&zCmd)+n); /* Show tail of SSH command */
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(zHost);
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ popen2(blob_str(&zCmd), &sshIn, &sshOut, &sshPid);
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sshPid==0 ){
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ socket_set_errmsg("cannot start ssh tunnel using [%b]", &zCmd);
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&zCmd);
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return sshPid==0;
277 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
278 173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
279 174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
280 175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Open a connection to the server. The server is defined by the following
281 176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** global variables:
@@ -288,19 +183,12 @@
288 183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
289 184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int transport_open(void){
290 185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = 0;
291 186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( transport.isOpen==0 ){
292 187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.urlIsSsh ){
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob cmd;
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_zero(&cmd);
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- shell_escape(&cmd, g.urlFossil);
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(&cmd, " test-http ", -1);
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- shell_escape(&cmd, g.urlPath);
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fprintf(sshOut, "%s || true\n", blob_str(&cmd));
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fflush(sshOut);
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.fSshTrace ) printf("Sent: [%s]\n", blob_str(&cmd));
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&cmd);
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = transport_ssh_open();
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==0 ) transport.isOpen = 1;
302 190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( g.urlIsHttps ){
303 191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef FOSSIL_ENABLE_SSL
304 192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = ssl_open();
305 193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==0 ) transport.isOpen = 1;
306 194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
@@ -340,11 +228,11 @@
340 228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( transport.pLog ){
341 229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fclose(transport.pLog);
342 230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
transport.pLog = 0;
343 231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
344 232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.urlIsSsh ){
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* No-op */
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ transport_ssh_close();
346 234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( g.urlIsHttps ){
347 235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef FOSSIL_ENABLE_SSL
348 236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ssl_close();
349 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
350 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( g.urlIsFile ){
@@ -399,13 +287,11 @@
399 287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
400 288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine is called when the outbound message is complete and
401 289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** it is time to being receiving a reply.
402 290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
403 291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void transport_flip(void){
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.urlIsSsh ){
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fprintf(sshOut, "\n\n");
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( g.urlIsFile ){
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.urlIsFile ){
407 293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zCmd;
408 294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fclose(transport.pFile);
409 295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zCmd = mprintf("\"%s\" http \"%s\" \"%s\" \"%s\" 127.0.0.1 --localauth",
410 296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.nameOfExe, g.urlName, transport.zOutFile, transport.zInFile
411 297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
@@ -582,19 +468,23 @@
582 468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.fSshTrace ) printf("Got line: [%s]\n", &transport.pBuf[iStart]);
583 469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return &transport.pBuf[iStart];
584 470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
585 471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
586 472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void transport_global_shutdown(void){
587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.urlIsSsh && sshPid ){
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*printf("Closing SSH tunnel: ");*/
589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fflush(stdout);
590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pclose2(sshIn, sshOut, sshPid);
591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sshPid = 0;
592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ transport_ssh_close();
593 474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.urlIsHttps ){
594 475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef FOSSIL_ENABLE_SSL
595 476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ssl_global_shutdown();
596 477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
597 478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
598 479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
socket_global_shutdown();
599 480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
600 481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void transport_ssh_close(void){
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.urlIsSsh && sshPid ){
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*printf("Closing SSH tunnel: ");*/
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fflush(stdout);
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pclose2(sshIn, sshOut, sshPid);
488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sshPid = 0;
489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
601 491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!