]> git.ipfire.org Git - thirdparty/squid.git/blob - src/store_swapmeta.cc
Cleanup: zap CVS Id tags
[thirdparty/squid.git] / src / store_swapmeta.cc
1
2 /*
3 * $Id$
4 *
5 * DEBUG: section 20 Storage Manager Swapfile Metadata
6 * AUTHOR: Kostas Anagnostakis
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.
24 *
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.
29 *
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 "Store.h"
38 #include "MemObject.h"
39 #include "StoreMeta.h"
40 #include "StoreMetaUnpacker.h"
41
42 void
43 storeSwapTLVFree(tlv * n)
44 {
45 tlv *t;
46
47 while ((t = n) != NULL) {
48 n = t->next;
49 xfree(t->value);
50 delete t;
51 }
52 }
53
54 /*
55 * Build a TLV list for a StoreEntry
56 */
57 tlv *
58 storeSwapMetaBuild(StoreEntry * e)
59 {
60 tlv *TLV = NULL; /* we'll return this */
61 tlv **T = &TLV;
62 const char *url;
63 const char *vary;
64 assert(e->mem_obj != NULL);
65 assert(e->swap_status == SWAPOUT_WRITING);
66 url = e->url();
67 debugs(20, 3, "storeSwapMetaBuild: " << url );
68 tlv *t = StoreMeta::Factory (STORE_META_KEY,SQUID_MD5_DIGEST_LENGTH, e->key);
69
70 if (!t) {
71 storeSwapTLVFree(TLV);
72 return NULL;
73 }
74
75 T = StoreMeta::Add(T, t);
76 t = StoreMeta::Factory(STORE_META_STD_LFS,STORE_HDR_METASIZE,&e->timestamp);
77
78 if (!t) {
79 storeSwapTLVFree(TLV);
80 return NULL;
81 }
82
83 T = StoreMeta::Add(T, t);
84 t = StoreMeta::Factory(STORE_META_URL, strlen(url) + 1, url);
85
86 if (!t) {
87 storeSwapTLVFree(TLV);
88 return NULL;
89 }
90
91 T = StoreMeta::Add(T, t);
92 vary = e->mem_obj->vary_headers;
93
94 if (vary) {
95 t =StoreMeta::Factory(STORE_META_VARY_HEADERS, strlen(vary) + 1, vary);
96
97 if (!t) {
98 storeSwapTLVFree(TLV);
99 return NULL;
100 }
101
102 StoreMeta::Add (T, t);
103 }
104
105 return TLV;
106 }
107
108 char *
109 storeSwapMetaPack(tlv * tlv_list, int *length)
110 {
111 int buflen = 0;
112 tlv *t;
113 int j = 0;
114 char *buf;
115 assert(length != NULL);
116 buflen++; /* STORE_META_OK */
117 buflen += sizeof(int); /* size of header to follow */
118
119 for (t = tlv_list; t; t = t->next)
120 buflen += sizeof(char) + sizeof(int) + t->length;
121
122 buf = (char *)xmalloc(buflen);
123
124 buf[j++] = (char) STORE_META_OK;
125
126 xmemcpy(&buf[j], &buflen, sizeof(int));
127
128 j += sizeof(int);
129
130 for (t = tlv_list; t; t = t->next) {
131 buf[j++] = t->getType();
132 xmemcpy(&buf[j], &t->length, sizeof(int));
133 j += sizeof(int);
134 xmemcpy(&buf[j], t->value, t->length);
135 j += t->length;
136 }
137
138 assert((int) j == buflen);
139 *length = buflen;
140 return buf;
141 }