]>
Commit | Line | Data |
---|---|---|
528b2c61 | 1 | |
2 | /* | |
528b2c61 | 3 | * DEBUG: section 20 Storage Manager Swapfile Metadata |
4 | * AUTHOR: Kostas Anagnostakis | |
5 | * | |
6 | * SQUID Web Proxy Cache http://www.squid-cache.org/ | |
7 | * ---------------------------------------------------------- | |
8 | * | |
9 | * Squid is the result of efforts by numerous individuals from | |
10 | * the Internet community; see the CONTRIBUTORS file for full | |
11 | * details. Many organizations have provided support for Squid's | |
12 | * development; see the SPONSORS file for full details. Squid is | |
13 | * Copyrighted (C) 2001 by the Regents of the University of | |
14 | * California; see the COPYRIGHT file for full details. Squid | |
15 | * incorporates software developed and/or copyrighted by other | |
16 | * sources; see the CREDITS file for full details. | |
17 | * | |
18 | * This program is free software; you can redistribute it and/or modify | |
19 | * it under the terms of the GNU General Public License as published by | |
20 | * the Free Software Foundation; either version 2 of the License, or | |
21 | * (at your option) any later version. | |
26ac0430 | 22 | * |
528b2c61 | 23 | * This program is distributed in the hope that it will be useful, |
24 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
25 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
26 | * GNU General Public License for more details. | |
26ac0430 | 27 | * |
528b2c61 | 28 | * You should have received a copy of the GNU General Public License |
29 | * along with this program; if not, write to the Free Software | |
30 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. | |
31 | * | |
32 | */ | |
33 | ||
582c2af2 | 34 | #include "squid.h" |
528b2c61 | 35 | #include "MemObject.h" |
602d9612 A |
36 | #include "Store.h" |
37 | #include "StoreMeta.h" | |
528b2c61 | 38 | #include "StoreMetaMD5.h" |
602d9612 | 39 | #include "StoreMetaObjSize.h" |
528b2c61 | 40 | #include "StoreMetaSTD.h" |
47f6e231 | 41 | #include "StoreMetaSTDLFS.h" |
602d9612 | 42 | #include "StoreMetaURL.h" |
528b2c61 | 43 | #include "StoreMetaVary.h" |
44 | ||
45 | bool | |
46 | StoreMeta::validType(char type) | |
47 | { | |
48 | /* VOID is reserved, and new types have to be added as classes */ | |
b7f7b5a3 | 49 | if (type <= STORE_META_VOID || type >= STORE_META_END + 10) { |
fa84c01d | 50 | debugs(20, DBG_CRITICAL, "storeSwapMetaUnpack: bad type (" << type << ")!"); |
62e76326 | 51 | return false; |
528b2c61 | 52 | } |
62e76326 | 53 | |
b7f7b5a3 | 54 | /* Not yet implemented */ |
02f95cf0 | 55 | if (type >= STORE_META_END || |
26ac0430 AJ |
56 | type == STORE_META_STOREURL || |
57 | type == STORE_META_VARY_ID) { | |
b7f7b5a3 | 58 | debugs(20, 3, "storeSwapMetaUnpack: Not yet implemented (" << type << ") in disk metadata"); |
59 | return false; | |
60 | } | |
61 | ||
528b2c61 | 62 | /* Unused in any current squid code */ |
63 | if (type == STORE_META_KEY_URL || | |
62e76326 | 64 | type == STORE_META_KEY_SHA || |
65 | type == STORE_META_HITMETERING || | |
66 | type == STORE_META_VALID) { | |
fa84c01d | 67 | debugs(20, DBG_CRITICAL, "Obsolete and unused type (" << type << ") in disk metadata"); |
62e76326 | 68 | return false; |
528b2c61 | 69 | } |
62e76326 | 70 | |
528b2c61 | 71 | return true; |
72 | } | |
73 | ||
62e76326 | 74 | class IntRange |
75 | { | |
76 | ||
528b2c61 | 77 | public: |
26ac0430 | 78 | IntRange (int minimum, int maximum) : _min (minimum), _max (maximum) { |
62e76326 | 79 | if (_min > _max) { |
80 | int temp = _min; | |
81 | _min = _max; | |
82 | _max = temp; | |
83 | } | |
84 | } | |
85 | ||
26ac0430 | 86 | bool includes (int anInt) const { |
62e76326 | 87 | if (anInt < _min || anInt > _max) |
88 | return false; | |
89 | ||
90 | return true; | |
91 | } | |
92 | ||
528b2c61 | 93 | private: |
94 | int _min; | |
95 | int _max; | |
96 | }; | |
97 | ||
98 | const int StoreMeta::MinimumTLVLength = 0; | |
99 | const int StoreMeta::MaximumTLVLength = 1 << 16; | |
100 | ||
101 | bool | |
e4ae841b | 102 | StoreMeta::validLength(int aLength) const |
528b2c61 | 103 | { |
e4ae841b | 104 | if (!IntRange (MinimumTLVLength, MaximumTLVLength).includes(aLength)) { |
fa84c01d | 105 | debugs(20, DBG_CRITICAL, "storeSwapMetaUnpack: insane length (" << aLength << ")!"); |
62e76326 | 106 | return false; |
528b2c61 | 107 | } |
62e76326 | 108 | |
528b2c61 | 109 | return true; |
110 | } | |
111 | ||
528b2c61 | 112 | StoreMeta * |
113 | StoreMeta::Factory (char type, size_t len, void const *value) | |
114 | { | |
115 | if (!validType(type)) | |
116 | return NULL; | |
62e76326 | 117 | |
528b2c61 | 118 | StoreMeta *result; |
62e76326 | 119 | |
528b2c61 | 120 | switch (type) { |
62e76326 | 121 | |
122 | case STORE_META_KEY: | |
123 | result = new StoreMetaMD5; | |
124 | break; | |
125 | ||
126 | case STORE_META_URL: | |
127 | result = new StoreMetaURL; | |
128 | break; | |
129 | ||
130 | case STORE_META_STD: | |
131 | result = new StoreMetaSTD; | |
132 | break; | |
133 | ||
47f6e231 | 134 | case STORE_META_STD_LFS: |
135 | result = new StoreMetaSTDLFS; | |
136 | break; | |
137 | ||
26ac0430 AJ |
138 | case STORE_META_OBJSIZE: |
139 | result = new StoreMetaObjSize; | |
9e6e1d99 | 140 | break; |
141 | ||
62e76326 | 142 | case STORE_META_VARY_HEADERS: |
143 | result = new StoreMetaVary; | |
144 | break; | |
145 | ||
146 | default: | |
fa84c01d | 147 | debugs(20, DBG_CRITICAL, "Attempt to create unknown concrete StoreMeta"); |
62e76326 | 148 | return NULL; |
528b2c61 | 149 | } |
62e76326 | 150 | |
528b2c61 | 151 | if (!result->validLength(len)) { |
00d77d6b | 152 | delete result; |
62e76326 | 153 | return NULL; |
528b2c61 | 154 | } |
62e76326 | 155 | |
528b2c61 | 156 | result->length = len; |
157 | result->value = xmalloc(len); | |
41d00cd3 | 158 | memcpy(result->value, value, len); |
528b2c61 | 159 | return result; |
160 | } | |
161 | ||
162 | void | |
163 | StoreMeta::FreeList(StoreMeta **head) | |
164 | { | |
165 | StoreMeta *node; | |
62e76326 | 166 | |
528b2c61 | 167 | while ((node = *head) != NULL) { |
62e76326 | 168 | *head = node->next; |
169 | xfree(node->value); | |
00d77d6b | 170 | delete node; |
528b2c61 | 171 | } |
172 | } | |
173 | ||
174 | StoreMeta ** | |
175 | StoreMeta::Add(StoreMeta **tail, StoreMeta *aNode) | |
176 | { | |
177 | assert (*tail == NULL); | |
178 | *tail = aNode; | |
179 | return &aNode->next; /* return new tail pointer */ | |
180 | } | |
181 | ||
62e76326 | 182 | bool |
528b2c61 | 183 | StoreMeta::checkConsistency(StoreEntry *e) const |
184 | { | |
62e76326 | 185 | switch (getType()) { |
186 | ||
187 | case STORE_META_KEY: | |
188 | ||
189 | case STORE_META_URL: | |
190 | ||
191 | case STORE_META_VARY_HEADERS: | |
192 | assert(0); | |
193 | break; | |
194 | ||
195 | case STORE_META_STD: | |
196 | break; | |
197 | ||
47f6e231 | 198 | case STORE_META_STD_LFS: |
199 | break; | |
200 | ||
201 | case STORE_META_OBJSIZE: | |
26ac0430 | 202 | break; |
47f6e231 | 203 | |
62e76326 | 204 | default: |
e0236918 | 205 | debugs(20, DBG_IMPORTANT, "WARNING: got unused STORE_META type " << getType()); |
62e76326 | 206 | break; |
207 | } | |
208 | ||
528b2c61 | 209 | return true; |
210 | } |