]> git.ipfire.org Git - thirdparty/squid.git/blame - src/store_swapmeta.cc
Renamed squid.h to squid-old.h and config.h to squid.h
[thirdparty/squid.git] / src / store_swapmeta.cc
CommitLineData
25535cbe 1
9cef6668 2/*
262a0e14 3 * $Id$
9cef6668 4 *
5 * DEBUG: section 20 Storage Manager Swapfile Metadata
6 * AUTHOR: Kostas Anagnostakis
7 *
2b6662ba 8 * SQUID Web Proxy Cache http://www.squid-cache.org/
9cef6668 9 * ----------------------------------------------------------
10 *
2b6662ba 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.
9cef6668 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 *
9cef6668 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 *
9cef6668 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
f7f3304a 36#include "squid-old.h"
e6ccf245 37#include "Store.h"
528b2c61 38#include "MemObject.h"
39#include "StoreMeta.h"
40#include "StoreMetaUnpacker.h"
f09f5b26 41
69c01cd7 42void
43storeSwapTLVFree(tlv * n)
f09f5b26 44{
69c01cd7 45 tlv *t;
62e76326 46
69c01cd7 47 while ((t = n) != NULL) {
62e76326 48 n = t->next;
49 xfree(t->value);
00d77d6b 50 delete t;
f09f5b26 51 }
f09f5b26 52}
53
69c01cd7 54/*
55 * Build a TLV list for a StoreEntry
56 */
57tlv *
58storeSwapMetaBuild(StoreEntry * e)
f09f5b26 59{
69c01cd7 60 tlv *TLV = NULL; /* we'll return this */
61 tlv **T = &TLV;
62 const char *url;
f66a9ef4 63 const char *vary;
10602161 64 assert(e->mem_obj != NULL);
aa1a691e 65 const int64_t objsize = e->mem_obj->expectedReplySize();
69c01cd7 66 assert(e->swap_status == SWAPOUT_WRITING);
3900307b 67 url = e->url();
bf8fe701 68 debugs(20, 3, "storeSwapMetaBuild: " << url );
c3031d67 69 tlv *t = StoreMeta::Factory (STORE_META_KEY,SQUID_MD5_DIGEST_LENGTH, e->key);
62e76326 70
528b2c61 71 if (!t) {
62e76326 72 storeSwapTLVFree(TLV);
73 return NULL;
528b2c61 74 }
62e76326 75
528b2c61 76 T = StoreMeta::Add(T, t);
47f6e231 77 t = StoreMeta::Factory(STORE_META_STD_LFS,STORE_HDR_METASIZE,&e->timestamp);
62e76326 78
528b2c61 79 if (!t) {
62e76326 80 storeSwapTLVFree(TLV);
81 return NULL;
528b2c61 82 }
62e76326 83
528b2c61 84 T = StoreMeta::Add(T, t);
85 t = StoreMeta::Factory(STORE_META_URL, strlen(url) + 1, url);
62e76326 86
528b2c61 87 if (!t) {
62e76326 88 storeSwapTLVFree(TLV);
89 return NULL;
528b2c61 90 }
62e76326 91
ffcd6c5f
HN
92
93 if (objsize >= 0) {
15f1c218
A
94 T = StoreMeta::Add(T, t);
95 t = StoreMeta::Factory(STORE_META_OBJSIZE, sizeof(objsize), &objsize);
ffcd6c5f 96
15f1c218
A
97 if (!t) {
98 storeSwapTLVFree(TLV);
99 return NULL;
100 }
ffcd6c5f
HN
101 }
102
528b2c61 103 T = StoreMeta::Add(T, t);
f66a9ef4 104 vary = e->mem_obj->vary_headers;
62e76326 105
528b2c61 106 if (vary) {
62e76326 107 t =StoreMeta::Factory(STORE_META_VARY_HEADERS, strlen(vary) + 1, vary);
108
109 if (!t) {
110 storeSwapTLVFree(TLV);
111 return NULL;
112 }
113
114 StoreMeta::Add (T, t);
528b2c61 115 }
62e76326 116
69c01cd7 117 return TLV;
f09f5b26 118}
119
69c01cd7 120char *
121storeSwapMetaPack(tlv * tlv_list, int *length)
f09f5b26 122{
e3ef2b09 123 int buflen = 0;
69c01cd7 124 tlv *t;
57d55dfa 125 int j = 0;
69c01cd7 126 char *buf;
127 assert(length != NULL);
128 buflen++; /* STORE_META_OK */
129 buflen += sizeof(int); /* size of header to follow */
62e76326 130
69c01cd7 131 for (t = tlv_list; t; t = t->next)
62e76326 132 buflen += sizeof(char) + sizeof(int) + t->length;
133
e6ccf245 134 buf = (char *)xmalloc(buflen);
62e76326 135
69c01cd7 136 buf[j++] = (char) STORE_META_OK;
62e76326 137
41d00cd3 138 memcpy(&buf[j], &buflen, sizeof(int));
62e76326 139
e3ef2b09 140 j += sizeof(int);
62e76326 141
69c01cd7 142 for (t = tlv_list; t; t = t->next) {
62e76326 143 buf[j++] = t->getType();
41d00cd3 144 memcpy(&buf[j], &t->length, sizeof(int));
62e76326 145 j += sizeof(int);
41d00cd3 146 memcpy(&buf[j], t->value, t->length);
62e76326 147 j += t->length;
f09f5b26 148 }
62e76326 149
e3ef2b09 150 assert((int) j == buflen);
151 *length = buflen;
69c01cd7 152 return buf;
f09f5b26 153}