]> git.ipfire.org Git - thirdparty/squid.git/blob - src/store_swapmeta.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / store_swapmeta.cc
1 /*
2 * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9 /* DEBUG: section 20 Storage Manager Swapfile Metadata */
10
11 #include "squid.h"
12 #include "md5.h"
13 #include "MemObject.h"
14 #include "Store.h"
15 #include "StoreMeta.h"
16 #include "StoreMetaUnpacker.h"
17
18 #if HAVE_SYS_WAIT_H
19 #include <sys/wait.h>
20 #endif
21
22 void
23 storeSwapTLVFree(tlv * n)
24 {
25 tlv *t;
26
27 while ((t = n) != NULL) {
28 n = t->next;
29 xfree(t->value);
30 delete t;
31 }
32 }
33
34 /*
35 * Build a TLV list for a StoreEntry
36 */
37 tlv *
38 storeSwapMetaBuild(StoreEntry * e)
39 {
40 tlv *TLV = NULL; /* we'll return this */
41 tlv **T = &TLV;
42 const char *url;
43 const char *vary;
44 assert(e->mem_obj != NULL);
45 const int64_t objsize = e->mem_obj->expectedReplySize();
46 assert(e->swap_status == SWAPOUT_WRITING);
47
48 // e->mem_obj->request may be nil in this context
49 if (e->mem_obj->request)
50 url = e->mem_obj->request->storeId();
51 else
52 url = e->url();
53
54 debugs(20, 3, "storeSwapMetaBuild URL: " << url);
55
56 tlv *t = StoreMeta::Factory (STORE_META_KEY,SQUID_MD5_DIGEST_LENGTH, e->key);
57
58 if (!t) {
59 storeSwapTLVFree(TLV);
60 return NULL;
61 }
62
63 T = StoreMeta::Add(T, t);
64 t = StoreMeta::Factory(STORE_META_STD_LFS,STORE_HDR_METASIZE,&e->timestamp);
65
66 if (!t) {
67 storeSwapTLVFree(TLV);
68 return NULL;
69 }
70
71 T = StoreMeta::Add(T, t);
72 t = StoreMeta::Factory(STORE_META_URL, strlen(url) + 1, url);
73
74 if (!t) {
75 storeSwapTLVFree(TLV);
76 return NULL;
77 }
78
79 if (objsize >= 0) {
80 T = StoreMeta::Add(T, t);
81 t = StoreMeta::Factory(STORE_META_OBJSIZE, sizeof(objsize), &objsize);
82
83 if (!t) {
84 storeSwapTLVFree(TLV);
85 return NULL;
86 }
87 }
88
89 T = StoreMeta::Add(T, t);
90 vary = e->mem_obj->vary_headers;
91
92 if (vary) {
93 t =StoreMeta::Factory(STORE_META_VARY_HEADERS, strlen(vary) + 1, vary);
94
95 if (!t) {
96 storeSwapTLVFree(TLV);
97 return NULL;
98 }
99
100 StoreMeta::Add (T, t);
101 }
102
103 return TLV;
104 }
105
106 char *
107 storeSwapMetaPack(tlv * tlv_list, int *length)
108 {
109 int buflen = 0;
110 tlv *t;
111 int j = 0;
112 char *buf;
113 assert(length != NULL);
114 ++buflen; /* STORE_META_OK */
115 buflen += sizeof(int); /* size of header to follow */
116
117 for (t = tlv_list; t; t = t->next)
118 buflen += sizeof(char) + sizeof(int) + t->length;
119
120 buf = (char *)xmalloc(buflen);
121
122 buf[j] = (char) STORE_META_OK;
123 ++j;
124
125 memcpy(&buf[j], &buflen, sizeof(int));
126
127 j += sizeof(int);
128
129 for (t = tlv_list; t; t = t->next) {
130 buf[j] = t->getType();
131 ++j;
132 memcpy(&buf[j], &t->length, sizeof(int));
133 j += sizeof(int);
134 memcpy(&buf[j], t->value, t->length);
135 j += t->length;
136 }
137
138 assert((int) j == buflen);
139 *length = buflen;
140 return buf;
141 }
142