-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path_VNC_1_Version.c
120 lines (91 loc) · 1.93 KB
/
_VNC_1_Version.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
** SPDX-License-Identifier: GPL-3.0-or-later
** Copyright (c) 2023-2024 Rene W. Olsen <[email protected]>
*/
// --
#include "RVNCd.h"
// --
int VNC_Version( struct Config *cfg )
{
char *buf;
int rejected;
int ver;
int rev;
int rc;
buf = cfg->NetSend_SendBuffer;
rejected = TRUE;
if ( DoVerbose )
{
Log_PrintF( cfg, LOGTYPE_Info, "Negociating protocol version" );
}
// --- Version Exchange
/**/ if ( cfg->cfg_Disk_Settings.Protocol37 )
{
ver = 3;
rev = 7;
}
else // ( cfg->cfg_Disk_Settings.Protocol33 )
{
ver = 3;
rev = 3;
}
// "RFB 003.003\n" - 12 bytes exactly
sprintf( buf, "RFB %03d.%03d\n", ver, rev );
if ( DoVerbose )
{
Log_PrintF( cfg, LOGTYPE_Info, ". Maximum version supported by server v%ld.%ld", ver, rev );
}
rc = myNetSend( cfg, buf, 12 );
if ( rc <= 0 )
{
goto bailout;
}
rc = myNetRead( cfg, buf, 12, MSG_WAITALL );
if ( rc <= 0 )
{
goto bailout;
}
buf[12] = 0;
ver = 0;
rev = 0;
sscanf( buf, "RFB %d.%d\n", &ver, &rev );
if ( DoVerbose )
{
Log_PrintF( cfg, LOGTYPE_Info, ". Client requested version v%ld.%ld", ver, rev );
}
/**/ if (( ver == 3 ) && ( rev == 3 ))
{
if ( ! cfg->cfg_Disk_Settings.Protocol33 )
{
Log_PrintF( cfg, LOGTYPE_Warning, "Protocol v3.3 not enabled" );
goto bailout;
}
if ( DoVerbose )
{
Log_PrintF( cfg, LOGTYPE_Info, ". Protocol version v%ld.%ld selected", ver, rev );
}
cfg->NetSend_ClientProtocol = VNCProtocol_33;
}
else if (( ver == 3 ) && ( rev == 7 ))
{
if ( ! cfg->cfg_Disk_Settings.Protocol37 )
{
Log_PrintF( cfg, LOGTYPE_Warning, "Protocol v3.7 not enabled" );
goto bailout;
}
if ( DoVerbose )
{
Log_PrintF( cfg, LOGTYPE_Info, ". Protocol version v%ld.%ld selected", ver, rev );
}
cfg->NetSend_ClientProtocol = VNCProtocol_37;
}
else
{
Log_PrintF( cfg, LOGTYPE_Error, "Unsupported version v%ld.%ld", ver, rev );
goto bailout;
}
rejected = FALSE;
bailout:
return( rejected );
}
// --