| ︙ | | |
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
|
+
|
if( g.urlIsSsh ){
/* Only SSH requires a global initialization. For SSH we need to create
** and run an SSH command to talk to the remote machine.
*/
const char *zSsh; /* The base SSH command */
Blob zCmd; /* The SSH command */
char *zHost; /* The host name to contact */
int n; /* Size of prefix string */
zSsh = db_get("ssh-command", zDefaultSshCmd);
blob_init(&zCmd, zSsh, -1);
if( g.urlPort!=g.urlDfltPort ){
#ifdef __MINGW32__
blob_appendf(&zCmd, " -P %d", g.urlPort);
#else
|
| ︙ | | |
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
|
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
|
+
+
-
+
|
blob_reset(&pw);
fossil_print(" -pw ********"); /* Do not show the password text */
}
#endif
}else{
zHost = mprintf("%s", g.urlName);
}
n = blob_size(&zCmd);
blob_append(&zCmd, " ", 1);
shell_escape(&zCmd, zHost);
if( g.urlShell ) blob_appendf(&zCmd, " %s", g.urlShell);
fossil_print(" %s\n", zHost); /* Show the conclusion of the SSH command */
fossil_print("%s\n", blob_str(&zCmd)+n); /* Show tail of SSH command */
free(zHost);
popen2(blob_str(&zCmd), &sshIn, &sshOut, &sshPid);
if( sshPid==0 ){
fossil_fatal("cannot start ssh tunnel using [%b]", &zCmd);
}
blob_reset(&zCmd);
transport_ssh_startup();
|
| ︙ | | |
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
|
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
|
-
-
+
+
|
if( transport.isOpen==0 ){
if( g.urlIsSsh ){
Blob cmd;
blob_zero(&cmd);
shell_escape(&cmd, g.urlFossil);
blob_append(&cmd, " test-http ", -1);
shell_escape(&cmd, g.urlPath);
/* printf("%s\n", blob_str(&cmd)); fflush(stdout); */
fprintf(sshOut, "%s\n", blob_str(&cmd));
fprintf(sshOut, "%s || true\n", blob_str(&cmd));
fflush(sshOut);
if( g.fSshTrace ) printf("Sent: [%s]\n", blob_str(&cmd));
blob_reset(&cmd);
}else if( g.urlIsHttps ){
#ifdef FOSSIL_ENABLE_SSL
rc = ssl_open();
if( rc==0 ) transport.isOpen = 1;
#else
socket_set_errmsg("HTTPS: Fossil has been compiled without SSL support");
|
| ︙ | | |
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
|
404
405
406
407
408
409
410
411
412
413
414
415
416
417
|
-
|
*/
static int transport_fetch(char *zBuf, int N){
int got;
if( sshIn ){
int x;
int wanted = N;
got = 0;
/* printf("want %d bytes...\n", wanted); fflush(stdout); */
while( wanted>0 ){
x = read(sshIn, &zBuf[got], wanted);
if( x<=0 ) break;
got += x;
wanted -= x;
}
}else if( g.urlIsHttps ){
|
| ︙ | | |
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
|
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
|
+
+
-
+
+
|
** Return the number of bytes actually received.
*/
int transport_receive(char *zBuf, int N){
int onHand; /* Bytes current held in the transport buffer */
int nByte = 0; /* Bytes of content received */
onHand = transport.nUsed - transport.iCursor;
if( g.fSshTrace){
printf("Reading %d bytes with %d on hand... ", N, onHand);
/* printf("request %d with %d on hand\n", N, onHand); fflush(stdout); */
fflush(stdout);
}
if( onHand>0 ){
int toMove = onHand;
if( toMove>N ) toMove = N;
/* printf("bytes on hand: %d of %d\n", toMove, N); fflush(stdout); */
memcpy(zBuf, &transport.pBuf[transport.iCursor], toMove);
transport.iCursor += toMove;
if( transport.iCursor>=transport.nUsed ){
|
| ︙ | | |
458
459
460
461
462
463
464
465
466
467
468
469
470
471
|
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
|
+
|
if( N>0 ){
int got = transport_fetch(zBuf, N);
if( got>0 ){
nByte += got;
transport.nRcvd += got;
}
}
if( g.fSshTrace ) printf("Got %d bytes\n", nByte);
return nByte;
}
/*
** Load up to N new bytes of content into the transport.pBuf buffer.
** The buffer itself might be moved. And the transport.iCursor value
** might be reset to 0.
|
| ︙ | | |
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
|
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
|
-
+
|
transport.pBuf[i] = 0;
i--;
}
break;
}
i++;
}
/* printf("Got line: [%s]\n", &transport.pBuf[iStart]); */
if( g.fSshTrace ) printf("Got line: [%s]\n", &transport.pBuf[iStart]);
return &transport.pBuf[iStart];
}
void transport_global_shutdown(void){
if( g.urlIsSsh && sshPid ){
/*printf("Closing SSH tunnel: ");*/
fflush(stdout);
|
| ︙ | | |