| 179 | extern int getpongflags(enet_uint32 ip); |
| 180 | |
| 181 | void serverms(int mode, int numplayers, int minremain, char *smapname, int millis, const ENetAddress &localaddr, int *mnum, int *msend, int *mrec, int *cnum, int *csend, int *crec, int protocol_version, const char *servdesccur, int _interm) |
| 182 | { |
| 183 | flushmasteroutput(); |
| 184 | updatemasterserver(millis, localaddr.port, _interm); |
| 185 | |
| 186 | static ENetSocketSet sockset; |
| 187 | ENET_SOCKETSET_EMPTY(sockset); |
| 188 | ENetSocket maxsock = pongsock; |
| 189 | ENET_SOCKETSET_ADD(sockset, pongsock); |
| 190 | if(mastersock != ENET_SOCKET_NULL) |
| 191 | { |
| 192 | maxsock = max(maxsock, mastersock); |
| 193 | ENET_SOCKETSET_ADD(sockset, mastersock); |
| 194 | } |
| 195 | if(lansock != ENET_SOCKET_NULL) |
| 196 | { |
| 197 | maxsock = max(maxsock, lansock); |
| 198 | ENET_SOCKETSET_ADD(sockset, lansock); |
| 199 | } |
| 200 | if(enet_socketset_select(maxsock, &sockset, NULL, 0) <= 0) return; |
| 201 | |
| 202 | // reply all server info requests |
| 203 | static uchar data[MAXTRANS]; |
| 204 | ENetBuffer buf; |
| 205 | ENetAddress addr; |
| 206 | buf.data = data; |
| 207 | int len; |
| 208 | |
| 209 | loopi(2) |
| 210 | { |
| 211 | ENetSocket sock = i ? lansock : pongsock; |
| 212 | if(sock == ENET_SOCKET_NULL || !ENET_SOCKETSET_CHECK(sockset, sock)) continue; |
| 213 | |
| 214 | buf.dataLength = sizeof(data); |
| 215 | len = enet_socket_receive(sock, &addr, &buf, 1); |
| 216 | if(len < 0) continue; |
| 217 | |
| 218 | // ping & pong buf |
| 219 | ucharbuf pi(data, len), po(&data[len], sizeof(data)-len); |
| 220 | bool std = false; |
| 221 | if(getint(pi) != 0) // std pong |
| 222 | { |
| 223 | extern struct servercommandline scl; |
| 224 | (*mnum)++; *mrec += len; std = true; |
| 225 | putint(po, protocol_version); |
| 226 | putint(po, mode); |
| 227 | putint(po, numplayers); |
| 228 | putint(po, minremain); |
| 229 | sendstring(smapname, po); |
| 230 | sendstring(servdesccur, po); |
| 231 | putint(po, scl.maxclients); |
| 232 | putint(po, getpongflags(addr.host)); |
| 233 | if(pi.remaining()) |
| 234 | { |
| 235 | int query = getint(pi); |
| 236 | switch(query) |
| 237 | { |
| 238 | case EXTPING_NAMELIST: |
no test coverage detected