1 | /* |
1 | /* |
2 | * static char *rcsid_metaserver_c = |
2 | * static char *rcsid_metaserver_c = |
3 | * "$Id: metaserver.C,v 1.1 2006/08/13 17:16:06 elmex Exp $"; |
3 | * "$Id: metaserver.C,v 1.2 2006/08/29 08:01:38 root Exp $"; |
4 | */ |
4 | */ |
5 | |
5 | |
6 | /* |
6 | /* |
7 | CrossFire, A Multiplayer game for X-windows |
7 | CrossFire, A Multiplayer game for X-windows |
8 | |
8 | |
… | |
… | |
56 | */ |
56 | */ |
57 | void metaserver_init(void) |
57 | void metaserver_init(void) |
58 | { |
58 | { |
59 | |
59 | |
60 | #ifdef WIN32 /* ***win32 metaserver_init(): init win32 socket */ |
60 | #ifdef WIN32 /* ***win32 metaserver_init(): init win32 socket */ |
61 | struct hostent *hostbn; |
61 | struct hostent *hostbn; |
62 | int temp = 1; |
62 | int temp = 1; |
63 | #endif |
63 | #endif |
64 | |
64 | |
65 | if (!settings.meta_on) { |
65 | if (!settings.meta_on) { |
66 | metafd=-1; |
66 | metafd=-1; |
67 | return; |
67 | return; |
68 | } |
68 | } |
69 | |
69 | |
70 | if (isdigit(settings.meta_server[0])) |
70 | if (isdigit(settings.meta_server[0])) |
71 | sock.sin_addr.s_addr = inet_addr(settings.meta_server); |
71 | sock.sin_addr.s_addr = inet_addr(settings.meta_server); |
72 | else { |
72 | else { |
73 | struct hostent *hostbn = gethostbyname(settings.meta_server); |
73 | struct hostent *hostbn = gethostbyname(settings.meta_server); |
74 | if (hostbn == NULL) { |
74 | if (hostbn == NULL) { |
75 | LOG(llevDebug,"metaserver_init: Unable to resolve hostname %s\n", settings.meta_server); |
75 | LOG(llevDebug,"metaserver_init: Unable to resolve hostname %s\n", settings.meta_server); |
76 | return; |
76 | return; |
77 | } |
77 | } |
78 | memcpy(&sock.sin_addr, hostbn->h_addr, hostbn->h_length); |
78 | memcpy(&sock.sin_addr, hostbn->h_addr, hostbn->h_length); |
79 | } |
79 | } |
80 | #ifdef WIN32 /* ***win32 metaserver_init(): init win32 socket */ |
80 | #ifdef WIN32 /* ***win32 metaserver_init(): init win32 socket */ |
81 | ioctlsocket(metafd, FIONBIO , &temp); |
81 | ioctlsocket(metafd, FIONBIO , &temp); |
82 | #else |
82 | #else |
83 | fcntl(metafd, F_SETFL, O_NONBLOCK); |
83 | fcntl(metafd, F_SETFL, O_NONBLOCK); |
84 | #endif |
84 | #endif |
85 | if ((metafd=socket(AF_INET, SOCK_DGRAM, 0))==-1) { |
85 | if ((metafd=socket(AF_INET, SOCK_DGRAM, 0))==-1) { |
86 | LOG(llevDebug,"metaserver_init: Unable to create socket, err %d\n", errno); |
86 | LOG(llevDebug,"metaserver_init: Unable to create socket, err %d\n", errno); |
87 | return; |
87 | return; |
88 | } |
88 | } |
89 | sock.sin_family = AF_INET; |
89 | sock.sin_family = AF_INET; |
90 | sock.sin_port = htons(settings.meta_port); |
90 | sock.sin_port = htons(settings.meta_port); |
91 | |
91 | |
92 | /* No hostname specified, so lets try to figure one out */ |
92 | /* No hostname specified, so lets try to figure one out */ |
93 | if (settings.meta_host[0]==0) { |
93 | if (settings.meta_host[0]==0) { |
94 | char hostname[MAX_BUF], domain[MAX_BUF]; |
94 | char hostname[MAX_BUF], domain[MAX_BUF]; |
95 | if (gethostname(hostname, MAX_BUF-1)) { |
95 | if (gethostname(hostname, MAX_BUF-1)) { |
96 | LOG(llevDebug,"metaserver_init: gethostname failed - will not report hostname\n"); |
96 | LOG(llevDebug,"metaserver_init: gethostname failed - will not report hostname\n"); |
97 | return; |
97 | return; |
98 | } |
98 | } |
99 | |
99 | |
100 | #ifdef WIN32 /* ***win32 metaserver_init(): gethostbyname! */ |
100 | #ifdef WIN32 /* ***win32 metaserver_init(): gethostbyname! */ |
101 | hostbn = gethostbyname(hostname); |
101 | hostbn = gethostbyname(hostname); |
102 | if (hostbn != (struct hostent *) NULL) /* quick hack */ |
102 | if (hostbn != (struct hostent *) NULL) /* quick hack */ |
103 | memcpy(domain, hostbn->h_addr, hostbn->h_length); |
103 | memcpy(domain, hostbn->h_addr, hostbn->h_length); |
104 | |
104 | |
105 | if (hostbn == (struct hostent *) NULL) { |
105 | if (hostbn == (struct hostent *) NULL) { |
106 | #else |
106 | #else |
107 | if (getdomainname(domain, MAX_BUF-1)) { |
107 | if (getdomainname(domain, MAX_BUF-1)) { |
108 | #endif /* win32 */ |
108 | #endif /* win32 */ |
109 | LOG(llevDebug,"metaserver_init: getdomainname failed - will not report hostname\n"); |
109 | LOG(llevDebug,"metaserver_init: getdomainname failed - will not report hostname\n"); |
110 | return; |
110 | return; |
111 | } |
111 | } |
112 | /* Potential overrun here but unlikely to occur */ |
112 | /* Potential overrun here but unlikely to occur */ |
113 | sprintf(settings.meta_host,"%s.%s", hostname, domain); |
113 | sprintf(settings.meta_host,"%s.%s", hostname, domain); |
114 | } |
114 | } |
115 | } |
115 | } |
116 | |
116 | |
117 | /** |
117 | /** |
118 | * Updates our info in the metaserver |
118 | * Updates our info in the metaserver |
… | |
… | |
139 | //if (pl->socket.is_bot) continue; |
139 | //if (pl->socket.is_bot) continue; |
140 | num_players++; |
140 | num_players++; |
141 | } |
141 | } |
142 | |
142 | |
143 | sprintf(data,"%s|%d|%s|%s|%d|%d|%ld", settings.meta_host, num_players, VERSION "+", |
143 | sprintf(data,"%s|%d|%s|%s|%d|%d|%ld", settings.meta_host, num_players, VERSION "+", |
144 | settings.meta_comment, cst_tot.ibytes, cst_tot.obytes, |
144 | settings.meta_comment, cst_tot.ibytes, cst_tot.obytes, |
145 | (long)time(NULL) - cst_tot.time_start); |
145 | (long)time(NULL) - cst_tot.time_start); |
146 | if (sendto(metafd, data, strlen(data), 0, (struct sockaddr *)&sock, sizeof(sock))<0) { |
146 | if (sendto(metafd, data, strlen(data), 0, (struct sockaddr *)&sock, sizeof(sock))<0) { |
147 | LOG(llevDebug,"metaserver_update: sendto failed, err = %d\n", errno); |
147 | LOG(llevDebug,"metaserver_update: sendto failed, err = %d\n", errno); |
148 | } |
148 | } |
149 | } |
149 | } |
150 | |
150 | |