apr_memcache.c (302408) | apr_memcache.c (362181) |
---|---|
1/* Licensed to the Apache Software Foundation (ASF) under one or more 2 * contributor license agreements. See the NOTICE file distributed with 3 * this work for additional information regarding copyright ownership. 4 * The ASF licenses this file to You under the Apache License, Version 2.0 5 * (the "License"); you may not use this file except in compliance with 6 * the License. You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 --- 342 unchanged lines hidden (view full) --- 351 352 rv = apr_socket_create(&conn->sock, family, SOCK_STREAM, 0, np); 353 354 if (rv != APR_SUCCESS) { 355 apr_pool_destroy(np); 356 return rv; 357 } 358 | 1/* Licensed to the Apache Software Foundation (ASF) under one or more 2 * contributor license agreements. See the NOTICE file distributed with 3 * this work for additional information regarding copyright ownership. 4 * The ASF licenses this file to You under the Apache License, Version 2.0 5 * (the "License"); you may not use this file except in compliance with 6 * the License. You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 --- 342 unchanged lines hidden (view full) --- 351 352 rv = apr_socket_create(&conn->sock, family, SOCK_STREAM, 0, np); 353 354 if (rv != APR_SUCCESS) { 355 apr_pool_destroy(np); 356 return rv; 357 } 358 |
359 conn->buffer = apr_palloc(conn->p, BUFFER_SIZE); | 359 conn->buffer = apr_palloc(conn->p, BUFFER_SIZE + 1); |
360 conn->blen = 0; 361 conn->ms = ms; 362 363 rv = conn_connect(conn); 364 if (rv != APR_SUCCESS) { 365 apr_pool_destroy(np); 366 } 367 else { --- 355 unchanged lines hidden (view full) --- 723 return storage_cmd_write(mc, 724 MC_REPLACE, MC_REPLACE_LEN, 725 key, 726 data, data_size, 727 timeout, flags); 728 729} 730 | 360 conn->blen = 0; 361 conn->ms = ms; 362 363 rv = conn_connect(conn); 364 if (rv != APR_SUCCESS) { 365 apr_pool_destroy(np); 366 } 367 else { --- 355 unchanged lines hidden (view full) --- 723 return storage_cmd_write(mc, 724 MC_REPLACE, MC_REPLACE_LEN, 725 key, 726 data, data_size, 727 timeout, flags); 728 729} 730 |
731/* 732 * Parses a decimal size from size_str, returning the value in *size. 733 * Returns 1 if parsing was successful, 0 if parsing failed. 734 */ 735static int parse_size(const char *size_str, apr_size_t *size) 736{ 737 char *endptr; 738 long size_as_long; 739 740 errno = 0; 741 size_as_long = strtol(size_str, &endptr, 10); 742 if ((size_as_long < 0) || (errno != 0) || (endptr == size_str) || 743 (endptr[0] != ' ' && (endptr[0] != '\r' || endptr[1] != '\n'))) { 744 return 0; 745 } 746 747 *size = (unsigned long)size_as_long; 748 return 1; 749} 750 |
|
731APU_DECLARE(apr_status_t) 732apr_memcache_getp(apr_memcache_t *mc, 733 apr_pool_t *p, 734 const char *key, 735 char **baton, 736 apr_size_t *new_length, 737 apr_uint16_t *flags_) 738{ --- 52 unchanged lines hidden (view full) --- 791 flags = apr_strtok(NULL, " ", &last); 792 flags = apr_strtok(NULL, " ", &last); 793 794 if (flags_) { 795 *flags_ = atoi(flags); 796 } 797 798 length = apr_strtok(NULL, " ", &last); | 751APU_DECLARE(apr_status_t) 752apr_memcache_getp(apr_memcache_t *mc, 753 apr_pool_t *p, 754 const char *key, 755 char **baton, 756 apr_size_t *new_length, 757 apr_uint16_t *flags_) 758{ --- 52 unchanged lines hidden (view full) --- 811 flags = apr_strtok(NULL, " ", &last); 812 flags = apr_strtok(NULL, " ", &last); 813 814 if (flags_) { 815 *flags_ = atoi(flags); 816 } 817 818 length = apr_strtok(NULL, " ", &last); |
799 if (length) { 800 len = strtol(length, (char **)NULL, 10); | 819 if (!length || !parse_size(length, &len)) { 820 ms_bad_conn(ms, conn); 821 apr_memcache_disable_server(mc, ms); 822 return APR_EGENERAL; |
801 } | 823 } |
802 803 if (len == 0 ) { 804 *new_length = 0; 805 *baton = NULL; 806 } | |
807 else { 808 apr_bucket_brigade *bbb; 809 apr_bucket *e; 810 811 /* eat the trailing \r\n */ 812 rv = apr_brigade_partition(conn->bb, len+2, &e); | 824 else { 825 apr_bucket_brigade *bbb; 826 apr_bucket *e; 827 828 /* eat the trailing \r\n */ 829 rv = apr_brigade_partition(conn->bb, len+2, &e); |
813 | |
814 if (rv != APR_SUCCESS) { 815 ms_bad_conn(ms, conn); 816 apr_memcache_disable_server(mc, ms); 817 return rv; 818 } 819 820 bbb = apr_brigade_split(conn->bb, e); 821 822 rv = apr_brigade_pflatten(conn->bb, baton, &len, p); | 830 if (rv != APR_SUCCESS) { 831 ms_bad_conn(ms, conn); 832 apr_memcache_disable_server(mc, ms); 833 return rv; 834 } 835 836 bbb = apr_brigade_split(conn->bb, e); 837 838 rv = apr_brigade_pflatten(conn->bb, baton, &len, p); |
823 | |
824 if (rv != APR_SUCCESS) { 825 ms_bad_conn(ms, conn); | 839 if (rv != APR_SUCCESS) { 840 ms_bad_conn(ms, conn); |
826 apr_memcache_disable_server(mc, ms); | |
827 return rv; 828 } 829 830 rv = apr_brigade_destroy(conn->bb); 831 if (rv != APR_SUCCESS) { 832 ms_bad_conn(ms, conn); | 841 return rv; 842 } 843 844 rv = apr_brigade_destroy(conn->bb); 845 if (rv != APR_SUCCESS) { 846 ms_bad_conn(ms, conn); |
833 apr_memcache_disable_server(mc, ms); | |
834 return rv; 835 } 836 837 conn->bb = bbb; 838 839 *new_length = len - 2; 840 (*baton)[*new_length] = '\0'; 841 } 842 843 rv = get_server_line(conn); 844 if (rv != APR_SUCCESS) { 845 ms_bad_conn(ms, conn); 846 apr_memcache_disable_server(mc, ms); 847 return rv; 848 } 849 850 if (strncmp(MS_END, conn->buffer, MS_END_LEN) != 0) { | 847 return rv; 848 } 849 850 conn->bb = bbb; 851 852 *new_length = len - 2; 853 (*baton)[*new_length] = '\0'; 854 } 855 856 rv = get_server_line(conn); 857 if (rv != APR_SUCCESS) { 858 ms_bad_conn(ms, conn); 859 apr_memcache_disable_server(mc, ms); 860 return rv; 861 } 862 863 if (strncmp(MS_END, conn->buffer, MS_END_LEN) != 0) { |
851 rv = APR_EGENERAL; | 864 ms_bad_conn(ms, conn); 865 apr_memcache_disable_server(mc, ms); 866 return APR_EGENERAL; |
852 } 853 } 854 else if (strncmp(MS_END, conn->buffer, MS_END_LEN) == 0) { 855 rv = APR_NOTFOUND; 856 } 857 else { | 867 } 868 } 869 else if (strncmp(MS_END, conn->buffer, MS_END_LEN) == 0) { 870 rv = APR_NOTFOUND; 871 } 872 else { |
858 rv = APR_EGENERAL; | 873 ms_bad_conn(ms, conn); 874 apr_memcache_disable_server(mc, ms); 875 return APR_EGENERAL; |
859 } 860 861 ms_release_conn(ms, conn); 862 863 return rv; 864} 865 866APU_DECLARE(apr_status_t) --- 486 unchanged lines hidden (view full) --- 1353 1354 if (strncmp(MS_VALUE, conn->buffer, MS_VALUE_LEN) == 0) { 1355 char *key; 1356 char *flags; 1357 char *length; 1358 char *last; 1359 char *data; 1360 apr_size_t len = 0; | 876 } 877 878 ms_release_conn(ms, conn); 879 880 return rv; 881} 882 883APU_DECLARE(apr_status_t) --- 486 unchanged lines hidden (view full) --- 1370 1371 if (strncmp(MS_VALUE, conn->buffer, MS_VALUE_LEN) == 0) { 1372 char *key; 1373 char *flags; 1374 char *length; 1375 char *last; 1376 char *data; 1377 apr_size_t len = 0; |
1378 apr_bucket *e = NULL; |
|
1361 1362 key = apr_strtok(conn->buffer, " ", &last); /* just the VALUE, ignore */ 1363 key = apr_strtok(NULL, " ", &last); 1364 flags = apr_strtok(NULL, " ", &last); | 1379 1380 key = apr_strtok(conn->buffer, " ", &last); /* just the VALUE, ignore */ 1381 key = apr_strtok(NULL, " ", &last); 1382 flags = apr_strtok(NULL, " ", &last); |
1365 1366 | |
1367 length = apr_strtok(NULL, " ", &last); | 1383 length = apr_strtok(NULL, " ", &last); |
1368 if (length) { 1369 len = strtol(length, (char **) NULL, 10); | 1384 1385 if (!length || !parse_size(length, &len)) { 1386 rv = APR_EGENERAL; |
1370 } | 1387 } |
1388 else { 1389 /* eat the trailing \r\n */ 1390 rv = apr_brigade_partition(conn->bb, len+2, &e); 1391 } 1392 if (rv != APR_SUCCESS) { 1393 apr_pollset_remove (pollset, &activefds[i]); 1394 mget_conn_result(TRUE, FALSE, rv, mc, ms, conn, 1395 server_query, values, server_queries); 1396 queries_sent--; 1397 continue; 1398 } |
|
1371 1372 value = apr_hash_get(values, key, strlen(key)); | 1399 1400 value = apr_hash_get(values, key, strlen(key)); |
1373 1374 | |
1375 if (value) { | 1401 if (value) { |
1376 if (len != 0) { 1377 apr_bucket_brigade *bbb; 1378 apr_bucket *e; 1379 1380 /* eat the trailing \r\n */ 1381 rv = apr_brigade_partition(conn->bb, len+2, &e); 1382 1383 if (rv != APR_SUCCESS) { 1384 apr_pollset_remove (pollset, &activefds[i]); 1385 mget_conn_result(FALSE, FALSE, rv, mc, ms, conn, 1386 server_query, values, server_queries); 1387 queries_sent--; 1388 continue; 1389 } 1390 1391 bbb = apr_brigade_split(conn->bb, e); 1392 1393 rv = apr_brigade_pflatten(conn->bb, &data, &len, data_pool); 1394 1395 if (rv != APR_SUCCESS) { 1396 apr_pollset_remove (pollset, &activefds[i]); 1397 mget_conn_result(FALSE, FALSE, rv, mc, ms, conn, 1398 server_query, values, server_queries); 1399 queries_sent--; 1400 continue; 1401 } 1402 1403 rv = apr_brigade_destroy(conn->bb); 1404 if (rv != APR_SUCCESS) { 1405 apr_pollset_remove (pollset, &activefds[i]); 1406 mget_conn_result(FALSE, FALSE, rv, mc, ms, conn, 1407 server_query, values, server_queries); 1408 queries_sent--; 1409 continue; 1410 } 1411 1412 conn->bb = bbb; 1413 1414 value->len = len - 2; 1415 data[value->len] = '\0'; 1416 value->data = data; | 1402 apr_bucket_brigade *bbb; 1403 1404 bbb = apr_brigade_split(conn->bb, e); 1405 1406 rv = apr_brigade_pflatten(conn->bb, &data, &len, data_pool); 1407 if (rv != APR_SUCCESS) { 1408 apr_pollset_remove (pollset, &activefds[i]); 1409 mget_conn_result(TRUE, FALSE, rv, mc, ms, conn, 1410 server_query, values, server_queries); 1411 queries_sent--; 1412 continue; |
1417 } | 1413 } |
1418 | 1414 1415 rv = apr_brigade_destroy(conn->bb); 1416 if (rv != APR_SUCCESS) { 1417 apr_pollset_remove (pollset, &activefds[i]); 1418 mget_conn_result(TRUE, FALSE, rv, mc, ms, conn, 1419 server_query, values, server_queries); 1420 queries_sent--; 1421 continue; 1422 } 1423 1424 conn->bb = bbb; 1425 1426 value->len = len - 2; 1427 data[value->len] = '\0'; 1428 value->data = data; 1429 |
1419 value->status = rv; 1420 value->flags = atoi(flags); | 1430 value->status = rv; 1431 value->flags = atoi(flags); |
1421 | 1432 |
1422 /* stay on the server */ 1423 i--; | 1433 /* stay on the server */ 1434 i--; |
1424 | |
1425 } 1426 else { | 1435 } 1436 else { |
1427 /* TODO: Server Sent back a key I didn't ask for or my 1428 * hash is corrupt */ | 1437 /* Server Sent back a key I didn't ask for or my 1438 * hash is corrupt */ 1439 rv = APR_EGENERAL; |
1429 } 1430 } 1431 else if (strncmp(MS_END, conn->buffer, MS_END_LEN) == 0) { 1432 /* this connection is done */ 1433 apr_pollset_remove (pollset, &activefds[i]); 1434 ms_release_conn(ms, conn); 1435 apr_hash_set(server_queries, &ms, sizeof(ms), NULL); | 1440 } 1441 } 1442 else if (strncmp(MS_END, conn->buffer, MS_END_LEN) == 0) { 1443 /* this connection is done */ 1444 apr_pollset_remove (pollset, &activefds[i]); 1445 ms_release_conn(ms, conn); 1446 apr_hash_set(server_queries, &ms, sizeof(ms), NULL); |
1436 | |
1437 queries_sent--; 1438 } 1439 else { 1440 /* unknown reply? */ 1441 rv = APR_EGENERAL; 1442 } | 1447 queries_sent--; 1448 } 1449 else { 1450 /* unknown reply? */ 1451 rv = APR_EGENERAL; 1452 } |
1443 | 1453 if (rv != APR_SUCCESS) { 1454 apr_pollset_remove (pollset, &activefds[i]); 1455 mget_conn_result(TRUE, FALSE, rv, mc, ms, conn, 1456 server_query, values, server_queries); 1457 queries_sent--; 1458 } |
1444 } /* /for */ 1445 } /* /while */ 1446 1447 query_hash_index = apr_hash_first(temp_pool, server_queries); 1448 while (query_hash_index) { 1449 void *v; 1450 apr_hash_this(query_hash_index, NULL, NULL, &v); 1451 server_query = v; --- 258 unchanged lines hidden --- | 1459 } /* /for */ 1460 } /* /while */ 1461 1462 query_hash_index = apr_hash_first(temp_pool, server_queries); 1463 while (query_hash_index) { 1464 void *v; 1465 apr_hash_this(query_hash_index, NULL, NULL, &v); 1466 server_query = v; --- 258 unchanged lines hidden --- |