Diff

Differences From Artifact [587760a488]:

To Artifact [50828f4f41]:


268
269
270
271
272
273
274

275
276
277
278
279
280
281
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282







+







static const struct ssh_kex *kex = NULL;
static const struct ssh_signkey *hostkey = NULL;
int (*ssh_get_password)(const char *prompt, char *str, int maxlen) = NULL;

static char *savedhost;
static int savedport;
static int ssh_send_ok;
static int ssh_echoing, ssh_editing;

static tree234 *ssh_channels;           /* indexed by local id */
static struct ssh_channel *mainchan;   /* primary session channel */

static enum {
    SSH_STATE_PREPACKET,
    SSH_STATE_BEFORE_SIZE,
1836
1837
1838
1839
1840
1841
1842

1843
1844


1845
1846
1847
1848
1849
1850
1851
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855







+


+
+







        ssh_state = SSH_STATE_INTERMED;
        do { crReturnV; } while (!ispkt);
        if (pktin.type != SSH1_SMSG_SUCCESS && pktin.type != SSH1_SMSG_FAILURE) {
            bombout(("Protocol confusion"));
            crReturnV;
        } else if (pktin.type == SSH1_SMSG_FAILURE) {
            c_write("Server refused to allocate pty\r\n", 32);
            ssh_editing = ssh_echoing = 1;
        }
	logevent("Allocated pty");
    } else {
        ssh_editing = ssh_echoing = 1;
    }

    if (cfg.compression) {
        send_packet(SSH1_CMSG_REQUEST_COMPRESSION, PKT_INT, 6, PKT_END);
        do { crReturnV; } while (!ispkt);
        if (pktin.type != SSH1_SMSG_SUCCESS && pktin.type != SSH1_SMSG_FAILURE) {
            bombout(("Protocol confusion"));
1867
1868
1869
1870
1871
1872
1873

1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880

1881
1882
1883
1884
1885
1886
1887







+


-








    ssh_state = SSH_STATE_SESSION;
    if (size_needed)
	ssh_size();
    if (eof_needed)
        ssh_special(TS_EOF);

    ldisc_send(NULL, 0);               /* cause ldisc to notice changes */
    ssh_send_ok = 1;
    ssh_channels = newtree234(ssh_channelcmp);
    begin_session();
    while (1) {
	crReturnV;
	if (ispkt) {
	    if (pktin.type == SSH1_SMSG_STDOUT_DATA ||
                pktin.type == SSH1_SMSG_STDERR_DATA) {
		long len = GET_32BIT(pktin.body);
		from_backend(pktin.type == SSH1_SMSG_STDERR_DATA,
2739
2740
2741
2742
2743
2744
2745

2746
2747
2748


2749
2750
2751
2752
2753
2754
2755
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762







+



+
+








        if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) {
            if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) {
                bombout(("Server got confused by pty request"));
                crReturnV;
            }
            c_write("Server refused to allocate pty\r\n", 32);
            ssh_editing = ssh_echoing = 1;
        } else {
            logevent("Allocated pty");
        }
    } else {
        ssh_editing = ssh_echoing = 1;
    }

    /*
     * Start a shell or a remote command.
     */
    ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
    ssh2_pkt_adduint32(mainchan->remoteid); /* recipient channel */
2789
2790
2791
2792
2793
2794
2795

2796
2797
2798
2799
2800
2801
2802
2803
2804
2796
2797
2798
2799
2800
2801
2802
2803
2804

2805
2806
2807
2808
2809
2810
2811







+

-







	ssh_size();
    if (eof_needed)
        ssh_special(TS_EOF);

    /*
     * Transfer data!
     */
    ldisc_send(NULL, 0);               /* cause ldisc to notice changes */
    ssh_send_ok = 1;
    begin_session();
    while (1) {
        static int try_send;
	crReturnV;
        try_send = FALSE;
	if (ispkt) {
	    if (pktin.type == SSH2_MSG_CHANNEL_DATA ||
                pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA) {
3001
3002
3003
3004
3005
3006
3007


3008
3009
3010
3011
3012
3013
3014
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023







+
+







	
#ifdef MSCRYPTOAPI
    if(crypto_startup() == 0)
	return "Microsoft high encryption pack not installed!";
#endif

    ssh_send_ok = 0;
    ssh_editing = 0;
    ssh_echoing = 0;

    p = connect_to_host(host, port, realhost);
    if (p != NULL)
	return p;

    return NULL;
}
3095
3096
3097
3098
3099
3100
3101






3102
3103
3104
3105
3106
3107
3108
3109

3110
3111
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127







+
+
+
+
+
+








+


        /* do nothing */
    }
}

static Socket ssh_socket(void) { return s; }

static int ssh_sendok(void) { return ssh_send_ok; }

static int ssh_ldisc(int option) {
    if (option == LD_ECHO) return ssh_echoing;
    if (option == LD_EDIT) return ssh_editing;
    return FALSE;
}

Backend ssh_backend = {
    ssh_init,
    ssh_send,
    ssh_size,
    ssh_special,
    ssh_socket,
    ssh_sendok,
    ssh_ldisc,
    22
};