Changeset 4398
- Timestamp:
- 10/01/06 23:27:30 (2 years ago)
- Files:
-
- trackerd/trunk/trackerd/clients.c (modified) (2 diffs)
- trackerd/trunk/trackerd/commands.c (modified) (10 diffs)
- trackerd/trunk/trackerd/servers.c (modified) (18 diffs)
- trackerd/trunk/trackerd/servers.h (modified) (2 diffs)
- trackerd/trunk/trackerd/tracker.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trackerd/trunk/trackerd/clients.c
r3947 r4398 59 59 60 60 wt_client_t * wt_client_alloc(void) { 61 wt_client_t *client; 62 63 client = wi_runtime_create_instance(wt_client_runtime_id, sizeof(wt_client_t)); 64 65 client->buffer_size = WT_CLIENT_BUFFER_INITIAL_SIZE; 66 client->buffer = wi_malloc(client->buffer_size); 67 68 return client; 61 return wi_runtime_create_instance(wt_client_runtime_id, sizeof(wt_client_t)); 69 62 } 70 63 … … 72 65 73 66 wt_client_t * wt_client_init_with_socket(wt_client_t *client, wi_socket_t *socket) { 67 client->buffer_size = WT_CLIENT_BUFFER_INITIAL_SIZE; 68 client->buffer = wi_malloc(client->buffer_size); 74 69 client->socket = wi_retain(socket); 75 70 client->state = WT_CLIENT_STATE_CONNECTED; trackerd/trunk/trackerd/commands.c
r4397 r4398 248 248 void wt_cmd_hello(wi_array_t *arguments) { 249 249 wt_client_t *client = wt_client(); 250 wi_string_t *string;251 250 252 251 if(client->state != WT_CLIENT_STATE_CONNECTED) … … 263 262 } 264 263 265 string = wi_date_iso8601_string(wt_start_date);266 267 264 wt_reply(200, WI_STR("%#@%c%#@%c%#@%c%#@%c%#@"), 268 265 wt_server_version_string, WT_FIELD_SEPARATOR, … … 270 267 wt_settings.name, WT_FIELD_SEPARATOR, 271 268 wt_settings.description, WT_FIELD_SEPARATOR, 272 string);269 wi_date_iso8601_string(wt_start_date)); 273 270 274 271 client->state = WT_CLIENT_STATE_SAID_HELLO; … … 287 284 wi_address_t *address, *hostaddress; 288 285 wi_url_t *url; 289 wi_string_t * string, *hostname;286 wi_string_t *hostname; 290 287 wt_server_t *server; 291 288 unsigned int bandwidth; … … 364 361 if(wt_settings.reverselookup) { 365 362 /* reverse look up and compare to hostname */ 366 string = wi_address_hostname(address); 367 passed = wi_is_equal(string, hostname); 368 wi_release(string); 369 370 if(!passed) { 363 if(!wi_is_equal(wi_address_hostname(address), hostname)) { 371 364 /* reverse lookup failed */ 372 365 if(wt_settings.strictlookup) { … … 412 405 if(server) { 413 406 if(server->port == wi_url_port(url)) { 414 /* re -register existing server with same port*/415 wt_server _clear(server);416 w i_retain(server);407 /* remove existing server in preparation for re-registration */ 408 wt_servers_remove_stats_for_server(server); 409 wt_servers_remove_server(server); 417 410 } else { 418 411 /* multiple servers from the same IP allowed? */ 419 if(wt_settings.allowmultiple) { 420 server = NULL; 421 } else { 412 if(!wt_settings.allowmultiple) { 422 413 wt_reply(530, WI_STR("Address Registered")); 423 414 wi_log_warn(WI_STR("Register from %@ as \"%@\" URL %@ denied: %s"), … … 430 421 } 431 422 432 /* add new server */433 if(!server)434 server = wt_server_init(wt_server_alloc());435 436 423 /* rewrite URL if host verification failed */ 437 424 if(failed) { … … 445 432 } 446 433 447 /* set values */ 448 string = wi_string_init_random_string_with_length(wi_string_alloc(), 1024); 449 server->key = wi_retain(wi_string_sha1(string)); 450 wi_release(string); 451 434 /* create new server */ 435 server = wt_server_init(wt_server_alloc()); 436 server->key = wi_retain(wi_string_sha1(wi_autorelease(wi_string_init_random_string_with_length(wi_string_alloc(), 1024)))); 452 437 server->port = wi_url_port(url); 453 438 server->bandwidth = bandwidth; … … 462 447 server->url = wi_copy(wi_url_string(url)); 463 448 449 wt_servers_add_server(server); 450 wt_servers_add_stats_for_server(server); 451 464 452 /* reply 700 */ 465 453 wt_reply(700, WI_STR("%@"), server->key); … … 476 464 477 465 static void wt_cmd_servers(wi_array_t *arguments) { 478 wi_enumerator_t *enumerator;479 wt_server_t *server;480 481 466 /* reply all servers */ 482 wi_array_rdlock(wt_servers); 483 484 enumerator = wi_array_data_enumerator(wt_servers); 485 486 while((server = wi_enumerator_next_data(enumerator))) { 487 wt_reply(720, WI_STR("%@%c%@%c%@%c%u%c%u%c%u%c%u%c%u%c%llu%c%@"), 488 server->category, WT_FIELD_SEPARATOR, 489 server->url, WT_FIELD_SEPARATOR, 490 server->name, WT_FIELD_SEPARATOR, 491 server->users, WT_FIELD_SEPARATOR, 492 server->bandwidth, WT_FIELD_SEPARATOR, 493 server->guest, WT_FIELD_SEPARATOR, 494 server->download, WT_FIELD_SEPARATOR, 495 server->files, WT_FIELD_SEPARATOR, 496 server->size, WT_FIELD_SEPARATOR, 497 server->description); 498 } 499 500 wi_array_unlock(wt_servers); 501 502 wt_reply(721, WI_STR("Done")); 467 wt_servers_reply_server_list(); 503 468 504 469 /* update status */ trackerd/trunk/trackerd/servers.c
r4397 r4398 36 36 #include "servers.h" 37 37 #include "settings.h" 38 #include "tracker.h" 38 39 39 40 #define WT_SERVER_MAGIC "WTSV" … … 82 83 static wi_timer_t *wt_servers_timer; 83 84 84 wi_array_t*wt_servers;85 static wi_hash_t *wt_servers; 85 86 86 87 static wi_runtime_id_t wt_server_runtime_id = WI_RUNTIME_ID_NULL; … … 98 99 wt_server_runtime_id = wi_runtime_register_class(&wt_server_runtime_class); 99 100 100 wt_servers = wi_ array_init(wi_array_alloc());101 wt_servers = wi_hash_init(wi_hash_alloc()); 101 102 102 103 wt_servers_lock = wi_lock_init(wi_lock_alloc()); … … 130 131 wi_time_interval_t interval, update; 131 132 unsigned int version, count = 0; 133 wi_boolean_t loaded = false; 132 134 133 135 wi_lock_lock(wt_servers_lock); 136 134 137 fp = fopen(wi_string_cstring(wt_settings.servers), "r"); 135 138 … … 159 162 interval = wi_time_interval(); 160 163 161 wi_array_wrlock(wt_servers);162 164 while((fread(&server_packed, sizeof(wt_server_packed_t), 1, fp)) > 0) { 163 165 update = server_packed.update_time > 0 ? server_packed.update_time : server_packed.register_time; … … 165 167 if(interval - update < wt_settings.minupdatetime) { 166 168 server = wt_server_init_with_packed(wt_server_alloc(), server_packed); 167 168 wi_lock_lock(wt_status_lock); 169 wt_current_servers++; 170 wt_current_users += server->users; 171 wt_current_files += server->files; 172 wt_current_size += server->size; 173 wi_lock_unlock(wt_status_lock); 174 175 wi_array_add_data(wt_servers, server); 169 wt_servers_add_server(server); 170 wt_servers_add_stats_for_server(server); 176 171 wi_release(server); 177 172 178 count++;173 loaded = true; 179 174 } 180 175 } 181 wi_array_unlock(wt_servers); 182 183 if(count > 0) { 176 177 if(loaded) { 184 178 wi_lock_lock(wt_status_lock); 185 179 wt_write_status(true); … … 221 215 fwrite(&version, 4, 1, fp); 222 216 223 wi_ array_rdlock(wt_servers);224 225 enumerator = wi_ array_data_enumerator(wt_servers);217 wi_hash_rdlock(wt_servers); 218 219 enumerator = wi_hash_data_enumerator(wt_servers); 226 220 227 221 while((server = wi_enumerator_next_data(enumerator))) { … … 230 224 } 231 225 232 wi_ array_unlock(wt_servers);226 wi_hash_unlock(wt_servers); 233 227 234 228 fclose(fp); … … 241 235 242 236 static void wt_update_servers(wi_timer_t *timer) { 237 wi_enumerator_t *enumerator; 238 wi_array_t *servers; 243 239 wt_server_t *server; 240 void *key; 244 241 wi_time_interval_t interval, update; 245 wi_boolean_t changed = false; 246 uint32_t i, count; 247 248 wi_array_rdlock(wt_servers); 242 243 servers = wi_array_init(wi_array_alloc()); 244 interval = wi_time_interval(); 245 246 wi_hash_wrlock(wt_servers); 247 248 enumerator = wi_hash_key_enumerator(wt_servers); 249 250 while((key = wi_enumerator_next_data(enumerator))) { 251 server = wi_hash_data_for_key(wt_servers, key); 252 update = server->update_time > 0.0 ? server->update_time : server->register_time; 249 253 250 count = wi_array_count(wt_servers);251 interval = wi_time_interval();252 253 for(i = 0; i < count; i++) {254 server = WI_ARRAY(wt_servers, i);255 update = server->update_time > 0.0 ? server->update_time : server->register_time;256 257 254 if(interval - update > wt_settings.minupdatetime) { 255 wi_array_add_data(servers, key); 256 258 257 wi_log_warn(WI_STR("Deleting \"%@\" with URL %@: Last update %.0f seconds ago considered too slow"), 259 server->name, server->url, interval - update);258 server->name, server->url, interval - update); 260 259 261 260 wt_servers_remove_stats_for_server(server); 262 263 wi_array_remove_data_at_index(wt_servers, i);264 265 count--;266 i--;267 changed = true;268 261 } 269 262 } 270 271 wi_array_unlock(wt_servers); 272 273 if(changed) { 263 264 enumerator = wi_array_data_enumerator(servers); 265 266 while((key = wi_enumerator_next_data(enumerator))) 267 wi_hash_remove_data_for_key(wt_servers, key); 268 269 wi_hash_unlock(wt_servers); 270 271 if(wi_array_count(servers) > 0) { 274 272 wi_lock_lock(wt_status_lock); 275 273 wt_write_status(true); … … 278 276 wt_write_servers(); 279 277 } 278 279 wi_release(servers); 280 280 } 281 281 … … 283 283 284 284 #pragma mark - 285 286 void wt_servers_add_server(wt_server_t *server) { 287 wi_hash_wrlock(wt_servers); 288 wi_hash_set_data_for_key(wt_servers, server, server->key); 289 wi_hash_unlock(wt_servers); 290 } 291 292 293 294 void wt_servers_remove_server(wt_server_t *server) { 295 wi_hash_wrlock(wt_servers); 296 wi_hash_remove_data_for_key(wt_servers, server->key); 297 wi_hash_unlock(wt_servers); 298 } 299 300 285 301 286 302 wt_server_t * wt_servers_server_with_ip(wi_string_t *ip) { … … 288 304 wt_server_t *server, *value = NULL; 289 305 290 wi_ array_rdlock(wt_servers);291 292 enumerator = wi_ array_data_enumerator(wt_servers);306 wi_hash_rdlock(wt_servers); 307 308 enumerator = wi_hash_data_enumerator(wt_servers); 293 309 294 310 while((server = wi_enumerator_next_data(enumerator))) { … … 300 316 } 301 317 302 wi_ array_unlock(wt_servers);318 wi_hash_unlock(wt_servers); 303 319 304 320 return value; … … 308 324 309 325 wt_server_t * wt_servers_server_with_key(wi_string_t *key) { 310 wi_enumerator_t *enumerator; 311 wt_server_t *server, *value = NULL; 312 313 wi_array_rdlock(wt_servers); 314 315 enumerator = wi_array_data_enumerator(wt_servers); 316 317 while((server = wi_enumerator_next_data(enumerator))) { 318 if(wi_is_equal(server->key, key)) { 319 value = server; 320 321 break; 322 } 323 } 324 325 wi_array_unlock(wt_servers); 326 327 return value; 326 wt_server_t *server; 327 328 wi_hash_rdlock(wt_servers); 329 server = wi_retain(wi_hash_data_for_key(wt_servers, key)); 330 wi_hash_unlock(wt_servers); 331 332 return wi_autorelease(server); 328 333 } 329 334 … … 354 359 #pragma mark - 355 360 361 void wt_servers_reply_server_list(void) { 362 wi_enumerator_t *enumerator; 363 wt_server_t *server; 364 365 wi_hash_rdlock(wt_servers); 366 367 enumerator = wi_hash_data_enumerator(wt_servers); 368 369 while((server = wi_enumerator_next_data(enumerator))) { 370 wt_reply(720, WI_STR("%@%c%@%c%@%c%u%c%u%c%u%c%u%c%u%c%llu%c%@"), 371 server->category, WT_FIELD_SEPARATOR, 372 server->url, WT_FIELD_SEPARATOR, 373 server->name, WT_FIELD_SEPARATOR, 374 server->users, WT_FIELD_SEPARATOR, 375 server->bandwidth, WT_FIELD_SEPARATOR, 376 server->guest, WT_FIELD_SEPARATOR, 377 server->download, WT_FIELD_SEPARATOR, 378 server->files, WT_FIELD_SEPARATOR, 379 server->size, WT_FIELD_SEPARATOR, 380 server->description); 381 } 382 383 wi_hash_unlock(wt_servers); 384 385 wt_reply(721, WI_STR("Done")); 386 } 387 388 389 356 390 wi_boolean_t wt_servers_category_is_valid(wi_string_t *category) { 357 391 wi_file_t *file; … … 392 426 393 427 wt_server_t * wt_server_init(wt_server_t *server) { 394 wi_array_wrlock(wt_servers);395 wi_array_add_data(wt_servers, server);396 wi_array_unlock(wt_servers);397 398 wi_lock_lock(wt_status_lock);399 wt_current_servers++;400 wt_write_status(true);401 wi_lock_unlock(wt_status_lock);402 403 428 return server; 404 429 } … … 406 431 407 432 408 void wt_server_clear(wt_server_t *server) { 409 wi_release(server->key); 410 wi_release(server->ip); 411 wi_release(server->category); 412 wi_release(server->url); 413 wi_release(server->name); 414 wi_release(server->description); 415 } 416 417 418 419 static void wt_server_dealloc(wi_runtime_instance_t *instance) { 420 wt_server_t *server = (wt_server_t *) instance; 421 422 wt_server_clear(server); 423 } 424 425 426 427 #pragma mark - 428 429 wt_server_t * wt_server_init_with_packed(wt_server_t *server, wt_server_packed_t server_packed) { 433 static wt_server_t * wt_server_init_with_packed(wt_server_t *server, wt_server_packed_t server_packed) { 430 434 server->key = wi_string_init_with_cstring(wi_string_alloc(), server_packed.key); 431 435 server->update_time = server_packed.update_time; … … 451 455 452 456 453 wt_server_packed_t wt_server_packed(wt_server_t *server) { 457 static void wt_server_dealloc(wi_runtime_instance_t *instance) { 458 wt_server_t *server = (wt_server_t *) instance; 459 460 wi_release(server->key); 461 wi_release(server->ip); 462 wi_release(server->category); 463 wi_release(server->url); 464 wi_release(server->name); 465 wi_release(server->description); 466 } 467 468 469 470 #pragma mark - 471 472 static wt_server_packed_t wt_server_packed(wt_server_t *server) { 454 473 wt_server_packed_t server_packed; 455 474 trackerd/trunk/trackerd/servers.h
r4397 r4398 62 62 void wt_write_servers(void); 63 63 64 void wt_servers_add_server(wt_server_t *); 65 void wt_servers_remove_server(wt_server_t *); 64 66 wt_server_t * wt_servers_server_with_ip(wi_string_t *); 65 67 wt_server_t * wt_servers_server_with_key(wi_string_t *); … … 67 69 void wt_servers_remove_stats_for_server(wt_server_t *); 68 70 71 void wt_servers_reply_server_list(void); 69 72 wi_boolean_t wt_servers_category_is_valid(wi_string_t *); 70 73 71 74 wt_server_t * wt_server_alloc(void); 72 75 wt_server_t * wt_server_init(wt_server_t *); 73 void wt_server_clear(wt_server_t *);74 75 76 extern wi_array_t *wt_servers;77 76 78 77 #endif /* WT_SERVERS_H */ trackerd/trunk/trackerd/tracker.c
r4397 r4398 317 317 318 318 wt_servers_remove_stats_for_server(server); 319 320 wi_array_wrlock(wt_servers); 321 wi_array_remove_data(wt_servers, server); 322 wi_array_unlock(wt_servers); 323 324 wi_lock_lock(wt_status_lock); 325 wt_write_status(true); 326 wi_lock_unlock(wt_status_lock); 319 wt_servers_remove_server(server); 327 320 328 321 wt_write_servers();
