[Verse-cvs] [verse] SVN commit:[4526] Removed ip and port from VNetworkAddress ( too much dependent on IPv4).
Jiri Hnidek
jiri.hnidek at tul.cz
Tue Jul 15 10:55:49 CEST 2008
Revision: 4526
https://svn.blender.org//revision/?rev=4526&view=rev
Author: jiri
Date: 2008-07-15 10:55:40 +0200 (Tue, 15 Jul 2008)
Log Message:
-----------
Removed ip and port from VNetworkAddress (too much dependent on IPv4). I added sockaddr_in and sockaddr_in6 to this structure. Verse still works only with IPv4. Changes tested only on Linux.
Modified Paths:
--------------
branches/verse-pam-branch/SConstruct
branches/verse-pam-branch/v_connect.c
branches/verse-pam-branch/v_connection.c
branches/verse-pam-branch/v_connection.h
branches/verse-pam-branch/v_network.c
branches/verse-pam-branch/v_network.h
Modified: branches/verse-pam-branch/SConstruct
===================================================================
--- branches/verse-pam-branch/SConstruct 2008-07-08 11:41:15 UTC (rev 4525)
+++ branches/verse-pam-branch/SConstruct 2008-07-15 08:55:40 UTC (rev 4526)
@@ -40,6 +40,7 @@
platform_libs = ['ws2_32']
elif sys.platform == 'linux2':
print "Building on linux2"
+ debug_flags = ['-ggdb']
platform_libs = ['pam']
elif sys.platform == 'openbsd3':
print "Building on openbsd3"
Modified: branches/verse-pam-branch/v_connect.c
===================================================================
--- branches/verse-pam-branch/v_connect.c 2008-07-08 11:41:15 UTC (rev 4525)
+++ branches/verse-pam-branch/v_connect.c 2008-07-15 08:55:40 UTC (rev 4526)
@@ -121,7 +121,7 @@
#if defined(V_PRINT_SEND_COMMANDS)
char ip_string[32];
#endif
- session = v_con_connect(a.ip, a.port, V_CS_CONTACT);
+ session = v_con_connect(&a, V_CS_CONTACT);
#if defined(V_PRINT_SEND_COMMANDS)
v_n_get_address_string(&a, ip_string);
printf("send: %p = verse_send_connect(name = %s, pass = %s, address = %s (%s), expected_key = %p)\n", session, name, pass, address, ip_string, expected_key);
@@ -340,7 +340,7 @@
if(!v_n_set_network_address(&a, address))
return NULL;
- if(v_co_switch_connection(a.ip, a.port))
+ if(v_co_switch_connection(&a))
{
if(v_con_get_connect_stage() != V_CS_PENDING_DECISION)
return NULL;
@@ -378,13 +378,15 @@
v_send_hidden_connect_terminate(v_con_get_network_address(), v_noq_get_next_out_packet_id(v_con_get_network_queue()), bye);
else if(!v_n_set_network_address(&a, address))
return;
- else if(v_co_switch_connection(a.ip, a.port))
+ else if(v_co_switch_connection(&a))
v_send_hidden_connect_terminate(v_con_get_network_address(), v_noq_get_next_out_packet_id(v_con_get_network_queue()), bye);
if(v_con_get_connect_stage() != V_CS_PENDING_DECISION)
verse_session_destroy(v_con_get_network_queue());
}
+/* Evil PING stuff */
+
void verse_send_ping(const char *address, const char *message)
{
VNetworkAddress a;
@@ -425,15 +427,14 @@
}
typedef struct {
- uint32 ip;
- uint16 port;
char message[1400];
void *next;
+ VNetworkAddress address;
} VPingCommand;
static VPingCommand *v_ping_commands = NULL;
-boolean v_connect_unpack_ping(const char *buf, size_t buffer_length, uint32 ip, uint16 port)
+boolean v_connect_unpack_ping(const char *buf, size_t buffer_length, VNetworkAddress *address)
{
if(buffer_length > 5)
{
@@ -450,8 +451,7 @@
VPingCommand *pc;
pc = malloc(sizeof *pc);
- pc->ip = ip;
- pc->port = port;
+ memcpy(&pc->address, address, sizeof(VNetworkAddress));
vnp_raw_unpack_string(&buf[buffer_pos], pc->message,
sizeof pc->message, buffer_length - buffer_pos);
pc->next = v_ping_commands;
@@ -467,16 +467,13 @@
{
VPingCommand *cp;
void (* func_ping)(void *user_data, const char *address, const char *text);
- VNetworkAddress a;
char address[64];
func_ping = v_fs_get_user_func(5);
while(v_ping_commands != NULL)
{
cp = v_ping_commands->next;
- a.ip = v_ping_commands->ip;
- a.port = v_ping_commands->port;
- v_n_get_address_string(&a, address);
+ v_n_get_address_string(&v_ping_commands->address, address);
#if defined V_PRINT_RECEIVE_COMMANDS
printf("receive: verse_send_ping(address = %s message = %s ); callback = %p\n", address, v_ping_commands->message, v_fs_get_user_func(5));
#endif
Modified: branches/verse-pam-branch/v_connection.c
===================================================================
--- branches/verse-pam-branch/v_connection.c 2008-07-08 11:41:15 UTC (rev 4525)
+++ branches/verse-pam-branch/v_connection.c 2008-07-15 08:55:40 UTC (rev 4526)
@@ -94,7 +94,7 @@
extern void *v_create_ordered_storage(void);
extern void v_destroy_ordered_storage(void *data);
-void *v_con_connect(uint32 ip, uint16 port, VConnectStage stage) /* creates a new connection slot */
+void *v_con_connect(VNetworkAddress *address, VConnectStage stage) /* creates a new connection slot */
{
v_con_init(); /* init connections, if not done yet */
if((VConData.con_count - 1) % CONNECTION_CHUNK_SIZE == 0) /* do we need more slots for connections, then reallocate more space */
@@ -102,8 +102,7 @@
VConData.con[VConData.con_count].out_queue = v_noq_create_network_queue(); /* create a out queue fo all out going commands */
v_niq_clear(&VConData.con[VConData.con_count].in_queue); /* clear and init the que of incomming packets.*/
VConData.con[VConData.con_count].connected = FALSE; /* not yet propperly connected and should not accept commands yet */
- VConData.con[VConData.con_count].network_address.ip = ip; /* ip address of other side */
- VConData.con[VConData.con_count].network_address.port = port; /* port used by other side */
+ memcpy((char*)&VConData.con[VConData.con_count].network_address, (char*)address, sizeof(*address)); /* address and port of other side*/
VConData.con[VConData.con_count].avatar = 0; /* no avatar set yet*/
/* VConData.con[VConData.con_count].packet_id = 2;*/
VConData.con[VConData.con_count].destroy_flag = FALSE; /* this is a flag that is set once the connection is about to be destroyed.*/
@@ -145,15 +144,15 @@
return NULL;
}
-uint32 v_co_find_connection(uint32 ip, uint16 port) /* if a packet comes form a ip address what connection does it belong to? */
+uint32 v_co_find_connection(VNetworkAddress *address) /* if a packet comes from a ip address what connection does it belong to? */
{
unsigned int i;
for(i = 0; i < VConData.con_count; i++)
{
- if(ip == VConData.con[i].network_address.ip &&
- port == VConData.con[i].network_address.port &&
- VConData.con[i].destroy_flag == 0)
+ if(address->addr4.sin_addr.s_addr == VConData.con[i].network_address.addr4.sin_addr.s_addr &&
+ address->addr4.sin_port == VConData.con[i].network_address.addr4.sin_port &&
+ VConData.con[i].destroy_flag == 0)
{
return i;
}
@@ -161,12 +160,13 @@
return -1;
}
-boolean v_co_switch_connection(uint32 ip, uint16 port) /* switches to the current connection to one ip address if it exists */
+boolean v_co_switch_connection(VNetworkAddress *address) /* switches to the current connection to one ip address if it exists */
{
unsigned int i;
for(i = 0; i < VConData.con_count; i++)
{
- if(ip == VConData.con[i].network_address.ip && port == VConData.con[i].network_address.port)
+ if(address->addr4.sin_addr.s_addr == VConData.con[i].network_address.addr4.sin_addr.s_addr &&
+ address->addr4.sin_port == VConData.con[i].network_address.addr4.sin_port)
{
VConData.current_connection = i;
return TRUE;
@@ -192,7 +192,7 @@
extern void verse_send_packet_nak(uint32 packet_id);
extern void v_callback_connect_terminate(const char *bye);
-extern boolean v_connect_unpack_ping(const char *buf, size_t buffer_length, uint32 ip, uint16 port);
+extern boolean v_connect_unpack_ping(const char *buf, size_t buffer_length, VNetworkAddress *address);
extern void v_ping_update(void);
void v_fs_unpack_beginning(uint8 *data, unsigned int length);
@@ -211,7 +211,7 @@
size = v_n_receive_data(&address, buf, sizeof buf); /* Ask for incoming data from the network. */
while(size != -1 && size != 0) /* Did we get any data? */
{
- VConData.current_connection = v_co_find_connection(address.ip, address.port); /* Is there a connection matching the IP and port? */
+ VConData.current_connection = v_co_find_connection(&address); /* Is there a connection matching the IP and port? */
vnp_raw_unpack_uint32(buf, &packet_id); /* Unpack the ID of the packet. */
/* printf("got packet ID %u, %d bytes, connection %u\n", packet_id, size, VConData.current_connection);*/
if(VConData.current_connection < VConData.con_count &&
@@ -233,7 +233,7 @@
v_niq_timer_update(&VConData.con[VConData.current_connection].in_queue);
}
}
- else if(v_connect_unpack_ping(buf, size, address.ip, address.port)) /* Ping handled. */
+ else if(v_connect_unpack_ping(buf, size, &address)) /* Ping handled. */
;
else if(v_fs_func_accept_connections()) /* Do we accept connection-attempts? */
{
@@ -242,10 +242,10 @@
{
if(VConData.current_connection < VConData.con_count)
{
- VConData.con[VConData.current_connection].network_address.ip = 0;
+ VConData.con[VConData.current_connection].network_address.addr4.sin_addr.s_addr = 0;
VConData.con[VConData.current_connection].destroy_flag = TRUE; /* Destroy old connection if there is one. */
}
- v_con_connect(address.ip, address.port, V_CS_IDLE); /* Create a new connection. */
+ v_con_connect(&address, V_CS_IDLE); /* Create a new connection. */
v_unpack_connection(buf, size); /* Unpack the connection-attempt. */
}
}
Modified: branches/verse-pam-branch/v_connection.h
===================================================================
--- branches/verse-pam-branch/v_connection.h 2008-07-08 11:41:15 UTC (rev 4525)
+++ branches/verse-pam-branch/v_connection.h 2008-07-15 08:55:40 UTC (rev 4526)
@@ -53,10 +53,10 @@
extern unsigned int * v_con_get_network_expected_packet(void);
extern void * v_con_get_ordered_storage(void);
extern void * v_con_get_func_storage(void);
-extern void * v_con_connect(uint32 ip, uint16 port, VConnectStage stage);
+extern void * v_con_connect(VNetworkAddress *address, VConnectStage stage);
extern unsigned int v_con_get_network_address_count(void);
-extern boolean v_co_switch_connection(uint32 ip, uint16 port);
+extern boolean v_co_switch_connection(VNetworkAddress *address);
extern void v_con_inqueue_timer_update(void);
Modified: branches/verse-pam-branch/v_network.c
===================================================================
--- branches/verse-pam-branch/v_network.c 2008-07-08 11:41:15 UTC (rev 4525)
+++ branches/verse-pam-branch/v_network.c 2008-07-15 08:55:40 UTC (rev 4526)
@@ -122,9 +122,10 @@
struct hostent *he;
char *colon = NULL, *buf = NULL;
boolean ok = FALSE;
+ unsigned short port;
v_n_socket_create();
- address->port = VERSE_STD_CONNECT_TO_PORT;
+ port = VERSE_STD_CONNECT_TO_PORT;
/* If a port number is included, as indicated by a colon, we need to work a bit more. */
if((colon = strchr(host_name, ':')) != NULL)
{
@@ -140,8 +141,8 @@
host_name = buf;
if(sscanf(colon + 1, "%u", &tp) == 1)
{
- address->port = (unsigned short) tp;
- if(address->port != tp) /* Protect against overflow. */
+ port = (unsigned short) tp;
+ if(port != tp) /* Protect against overflow. */
host_name = NULL;
}
else
@@ -150,11 +151,19 @@
else
return FALSE;
}
- if(host_name != NULL && (he = gethostbyname(host_name)) != NULL)
+ if(host_name != NULL)
{
- memcpy(&address->ip, he->h_addr_list[0], he->h_length);
- address->ip = ntohl(address->ip);
- ok = TRUE;
+ if((he = gethostbyname2(host_name, AF_INET)) != NULL) {
+ printf("ipv4\n");
+ memset((char*)&address->addr4, 0, sizeof(struct sockaddr_in));
+ memcpy((char*)&address->addr4.sin_addr, he->h_addr_list[0], he->h_length);
+ address->addrtype = address->addr4.sin_family = he->h_addrtype;
+ address->addr4.sin_port = htons(port);
+ ok = TRUE;
+ }
+ else {
+ perror("gethostbyname2()");
+ }
}
if(buf != NULL)
free(buf);
@@ -170,11 +179,9 @@
if((sock = v_n_socket_create()) == -1 || length == 0)
return 0;
- address_in.sin_family = AF_INET; /* host byte order */
- address_in.sin_port = htons(address->port); /* short, network byte order */
- address_in.sin_addr.s_addr = htonl(address->ip);
- memset(&address_in.sin_zero, 0, sizeof address_in.sin_zero);
- ret = sendto(sock, data, length, 0, (struct sockaddr *) &address_in, sizeof(struct sockaddr_in));
+
+ ret = sendto(sock, data, length, 0, (struct sockaddr *) &address->addr4, sizeof(struct sockaddr_in));
+
if(ret < 0)
fprintf(stderr, "Socket sendto() of %u bytes failed, code %d (%s)\n", (unsigned int) length, errno, strerror(errno));
return ret;
@@ -218,10 +225,9 @@
address_in.sin_port = htons(my_port);
address_in.sin_addr.s_addr = INADDR_ANY;
len = recvfrom(v_n_socket_create(), data, length, 0, (struct sockaddr *) &address_in, &from_length);
- if(len > 0)
+ if(len > 0 && len!=-1)
{
- address->ip = ntohl(address_in.sin_addr.s_addr);
- address->port = ntohs(address_in.sin_port);
+ memcpy((char*)&address->addr4, (char*)&address_in, sizeof(struct sockaddr_in));
}
return len;
}
@@ -264,6 +270,8 @@
void v_n_get_address_string(const VNetworkAddress *address, char *string)
{
- sprintf(string, "%u.%u.%u.%u:%u", address->ip >> 24, (address->ip >> 16) & 0xff,
- (address->ip >> 8) & 0xff, address->ip & 0xff, address->port);
+ char str[32];
+ inet_ntop(AF_INET, &address->addr4.sin_addr, str, 32);
+ sprintf(string, "%s:%u", str, htons(address->addr4.sin_port));
}
+
Modified: branches/verse-pam-branch/v_network.h
===================================================================
--- branches/verse-pam-branch/v_network.h 2008-07-08 11:41:15 UTC (rev 4525)
+++ branches/verse-pam-branch/v_network.h 2008-07-15 08:55:40 UTC (rev 4526)
@@ -5,11 +5,15 @@
#if !defined V_NETWORK_H
#define V_NETWORK_H
+#include <netinet/in.h>
+
#define VERSE_STD_CONNECT_PORT 4950
typedef struct{
- unsigned int ip;
- unsigned short port;
+ /* IPv4 & IPv6 */
+ unsigned int addrtype;
+ struct sockaddr_in addr4;
+ struct sockaddr_in6 addr6;
}VNetworkAddress;
extern void v_n_set_port(unsigned short port);
More information about the Verse-cvs
mailing list