]> git.ipfire.org Git - thirdparty/squid.git/blame - src/StoreMeta.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / StoreMeta.cc
CommitLineData
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
45bool
46StoreMeta::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 74class IntRange
75{
76
528b2c61 77public:
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 93private:
94 int _min;
95 int _max;
96};
97
98const int StoreMeta::MinimumTLVLength = 0;
99const int StoreMeta::MaximumTLVLength = 1 << 16;
100
101bool
e4ae841b 102StoreMeta::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 112StoreMeta *
113StoreMeta::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
162void
163StoreMeta::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
174StoreMeta **
175StoreMeta::Add(StoreMeta **tail, StoreMeta *aNode)
176{
177 assert (*tail == NULL);
178 *tail = aNode;
179 return &aNode->next; /* return new tail pointer */
180}
181
62e76326 182bool
528b2c61 183StoreMeta::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}