sockaddr_in locaddr, struct sockaddr_in peeraddr, int proto,
void *sockid, int result) {
int version;
int rand;
int is_loc_IP;
pmesg* pmptr=0;
pmesg pm;
int payload_offset=0,is_last_chunk=0,psize=0;
char* payload_data=0;
*result = 0;
if ( !server_parse_recvd_packet(&pm, recvbuf, recvbuflen, 1, locaddr,
proto, sockid) ) goto EXIT;
version = get_payload_version();
/* server's version == client's version */
if ( (version & 0x7FFFFFFFu) == (pm.payload_version & 0x7FFFFFFFu) ) {
if ( pm.payload_offset || pm.payload_data ) goto EXIT;
}
/* server's version is greater, server sending file */
else if ( (version & 0x7FFFFFFFu) > (pm.payload_version & 0x7FFFFFFFu) ) {
if (pm.payload_data) goto EXIT;
if (version > 0 ) {
payload_offset = pm.payload_offset;
proto == 6 ? rand = critical_generate_random() % 3073 + 1024 : rand =
critical_generate_random() % 513 + 512;
fetch_payload_from_registry((int)&rem_payload_len, (unsigned int *)&psize,
pm.payload_offset, payload_data, rand);
if (!psize) goto EXIT;
is_last_chunk = rem_payload_len <= 0;
}
/* proto is UDP && and its not ack ack packet && location bit is set in
control word */
if ( proto == 17 && pm.payload_offset && (*(recvbuf + 8) & 8) ) pmptr = ±
}
/* server's version is smaller, receive file from client */
else {
if ( pm.payload_offset && !pm.payload_data ) goto EXIT;
if (!pm.payload_data ) {
/* proto is UDP && location bit is set in control word */
if (proto == 17 && *(recvbuf + 8) & 8 ) pmptr = (int)±
goto GENERATE_MESSAGE;
}
if ( pm.payload_version < 0) goto EXIT;
if (!(pm.is_last_chunk & 1) && pm.payload_size < (((proto != 6) - 1) &
0x200) + 512) goto EXIT;
ushort lport = 0;
if (proto == 6) lport = locaddr.sin_port;
result = create_temp_file(pm.payload_offset != 0, locadrr.sin_addr.s_addr, lport,
peeraddr.sin_addr.s_addr, peeraddr.sin_port, proto, version &
0x7FFFFFFF, pm.payload_version & 0x7FFFFFFF);
if (result == -1) goto EXIT;
if (!call_iterative_rsa_decrypt(pm.payload_size, pm.payload_offset, result,
pm.payload_offset, pm.payload_data, pm.is_last_chunk&1)
|| pm.is_last_chunk&1) goto EXIT;
/* acknowledgement packet */
payload_offset = pm.payload_offset + pm.payload_size;
}
GENERATE_MESSAGE:
is_loc_IP = check_if_peer_IP_in_local_subnet(locaddr.sin_addr.s_addr);
generate_new_message(sentmsgbuf, result, 0, is_loc_IP, proto, pmptr, version,
payload_offset, is_last_chunk, psize, payload_data, 0);
return;
EXIT:
*result = 0;
}
SOURCE
LISTING 12: P2P server packet handler