]>
Commit | Line | Data |
---|---|---|
528b2c61 | 1 | |
2 | /* | |
262a0e14 | 3 | * $Id$ |
528b2c61 | 4 | * |
5 | * DEBUG: section 20 Storage Manager Swapfile Unpacker | |
6 | * AUTHOR: Robert Collins | |
7 | * | |
8 | * SQUID Web Proxy Cache http://www.squid-cache.org/ | |
9 | * ---------------------------------------------------------- | |
10 | * | |
11 | * Squid is the result of efforts by numerous individuals from | |
12 | * the Internet community; see the CONTRIBUTORS file for full | |
13 | * details. Many organizations have provided support for Squid's | |
14 | * development; see the SPONSORS file for full details. Squid is | |
15 | * Copyrighted (C) 2001 by the Regents of the University of | |
16 | * California; see the COPYRIGHT file for full details. Squid | |
17 | * incorporates software developed and/or copyrighted by other | |
18 | * sources; see the CREDITS file for full details. | |
19 | * | |
20 | * This program is free software; you can redistribute it and/or modify | |
21 | * it under the terms of the GNU General Public License as published by | |
22 | * the Free Software Foundation; either version 2 of the License, or | |
23 | * (at your option) any later version. | |
26ac0430 | 24 | * |
528b2c61 | 25 | * This program is distributed in the hope that it will be useful, |
26 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
27 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
28 | * GNU General Public License for more details. | |
26ac0430 | 29 | * |
528b2c61 | 30 | * You should have received a copy of the GNU General Public License |
31 | * along with this program; if not, write to the Free Software | |
32 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. | |
33 | * | |
34 | */ | |
35 | ||
36 | #include "squid.h" | |
37 | #include "StoreMetaUnpacker.h" | |
38 | #include "StoreMeta.h" | |
39 | ||
57d55dfa | 40 | int const StoreMetaUnpacker::MinimumBufferLength = sizeof(char) + sizeof(int); |
528b2c61 | 41 | |
42 | bool | |
43 | StoreMetaUnpacker::isBufferSane() | |
44 | { | |
45 | if (buf[0] != (char) STORE_META_OK) | |
62e76326 | 46 | return false; |
47 | ||
528b2c61 | 48 | /* |
49 | * sanity check on 'buflen' value. It should be at least big | |
50 | * enough to hold one type and one length. | |
51 | */ | |
52 | getBufferLength(); | |
62e76326 | 53 | |
7c209882 | 54 | if (*hdr_len < MinimumBufferLength) |
62e76326 | 55 | return false; |
56 | ||
528b2c61 | 57 | if (*hdr_len > buflen) |
62e76326 | 58 | return false; |
59 | ||
528b2c61 | 60 | return true; |
61 | } | |
62 | ||
63 | void | |
64 | StoreMetaUnpacker::getBufferLength() | |
65 | { | |
41d00cd3 | 66 | memcpy(hdr_len, &buf[1], sizeof(int)); |
528b2c61 | 67 | } |
68 | ||
69 | StoreMetaUnpacker::StoreMetaUnpacker (char const *aBuffer, ssize_t aLen, int *anInt) : buf (aBuffer), buflen(aLen), hdr_len(anInt), position(1 + sizeof(int)) | |
70 | { | |
71 | assert (aBuffer != NULL); | |
72 | } | |
73 | ||
74 | void | |
75 | StoreMetaUnpacker::getType() | |
76 | { | |
77 | type = buf[position++]; | |
78 | } | |
79 | ||
80 | void | |
81 | StoreMetaUnpacker::getLength() | |
82 | { | |
41d00cd3 | 83 | memcpy(&length, &buf[position], sizeof(int)); |
528b2c61 | 84 | position += sizeof(int); |
85 | } | |
86 | ||
87 | bool | |
88 | StoreMetaUnpacker::doOneEntry() | |
89 | { | |
90 | getType(); | |
91 | getLength(); | |
62e76326 | 92 | |
528b2c61 | 93 | if (position + length > *hdr_len) { |
bf8fe701 | 94 | debugs(20, 0, "storeSwapMetaUnpack: overflow!"); |
4a7a3d56 | 95 | debugs(20, 0, "\ttype=" << type << ", length=" << length << ", *hdr_len=" << *hdr_len << ", offset=" << position); |
528b2c61 | 96 | return false; |
97 | } | |
62e76326 | 98 | |
528b2c61 | 99 | StoreMeta *newNode = StoreMeta::Factory(type, length, &buf[position]); |
62e76326 | 100 | |
5b8ddb2a | 101 | if (newNode) |
26ac0430 | 102 | tail = StoreMeta::Add (tail, newNode); |
62e76326 | 103 | |
528b2c61 | 104 | position += length; |
62e76326 | 105 | |
528b2c61 | 106 | return true; |
107 | } | |
108 | ||
109 | bool | |
110 | StoreMetaUnpacker::moreToProcess() const | |
111 | { | |
7c209882 | 112 | return *hdr_len - position - MinimumBufferLength >= 0; |
528b2c61 | 113 | } |
114 | ||
115 | StoreMeta * | |
116 | StoreMetaUnpacker::createStoreMeta () | |
117 | { | |
118 | tlv *TLV = NULL; | |
119 | tail = &TLV; | |
120 | assert(hdr_len != NULL); | |
62e76326 | 121 | |
528b2c61 | 122 | if (!isBufferSane()) |
62e76326 | 123 | return NULL; |
124 | ||
528b2c61 | 125 | getBufferLength(); |
62e76326 | 126 | |
528b2c61 | 127 | assert (position == 1 + sizeof(int)); |
62e76326 | 128 | |
528b2c61 | 129 | while (moreToProcess()) { |
62e76326 | 130 | if (!doOneEntry()) |
131 | break; | |
528b2c61 | 132 | } |
62e76326 | 133 | |
528b2c61 | 134 | return TLV; |
135 | } |