-
Notifications
You must be signed in to change notification settings - Fork 5
/
negotiation.c
70 lines (57 loc) · 1.64 KB
/
negotiation.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
This file is part of QuasselC.
QuasselC is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3.0 of the License, or (at your option) any later version.
QuasselC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with QuasselC. If not, see <http://www.gnu.org/licenses/>.
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <iconv.h>
#include "quasselc.h"
#include "export.h"
int quassel_negotiate(GIOChannel* h, int ssl) {
uint32_t magic = 0x42b33f00;
magic |= !!ssl; //SSL
magic |= 2; //Compression
magic = htonl(magic);
write_io(h, (char*)&magic, sizeof(magic));
//Send supported protocols
{
//Legacy protocol
uint32_t v = 1;
v = htonl(v);
write_io(h, (char*)&v, sizeof(v));
//End of list
v = 1 << 31;
v = htonl(v);
write_io(h, (char*)&v, sizeof(v));
}
//Read answer
uint32_t response;
while(!read_io(h, (char*)&response, sizeof(response)));
response = ntohl(response);
//No support for legacy protocol
if( (response&0xff)!= 1)
return 0;
if( (response>>24) & 1) {
//switch to ssl
}
if( (response>>24) & 2) {
//switch and compression
extern int useCompression;
useCompression = 1;
}
return 1;
}