store_swapmeta.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:4k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: store_swapmeta.c,v 1.7 1998/07/22 20:54:04 wessels Exp $
  3.  *
  4.  * DEBUG: section 20    Storage Manager Swapfile Metadata
  5.  * AUTHOR: Kostas Anagnostakis
  6.  *
  7.  * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/
  8.  * ----------------------------------------------------------
  9.  *
  10.  *  Squid is the result of efforts by numerous individuals from the
  11.  *  Internet community.  Development is led by Duane Wessels of the
  12.  *  National Laboratory for Applied Network Research and funded by the
  13.  *  National Science Foundation.  Squid is Copyrighted (C) 1998 by
  14.  *  Duane Wessels and the University of California San Diego.  Please
  15.  *  see the COPYRIGHT file for full details.  Squid incorporates
  16.  *  software developed and/or copyrighted by other sources.  Please see
  17.  *  the CREDITS file for full details.
  18.  *
  19.  *  This program is free software; you can redistribute it and/or modify
  20.  *  it under the terms of the GNU General Public License as published by
  21.  *  the Free Software Foundation; either version 2 of the License, or
  22.  *  (at your option) any later version.
  23.  *  
  24.  *  This program is distributed in the hope that it will be useful,
  25.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  26.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27.  *  GNU General Public License for more details.
  28.  *  
  29.  *  You should have received a copy of the GNU General Public License
  30.  *  along with this program; if not, write to the Free Software
  31.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
  32.  *
  33.  */
  34. #include "squid.h"
  35. static tlv **
  36. storeSwapTLVAdd(int type, const void *ptr, size_t len, tlv ** tail)
  37. {
  38.     tlv *t = xcalloc(1, sizeof(tlv));
  39.     t->type = (char) type;
  40.     t->length = (int) len;
  41.     t->value = xmalloc(len);
  42.     xmemcpy(t->value, ptr, len);
  43.     *tail = t;
  44.     return &t->next; /* return new tail pointer */
  45. }
  46. void
  47. storeSwapTLVFree(tlv * n)
  48. {
  49.     tlv *t;
  50.     while ((t = n) != NULL) {
  51. n = t->next;
  52. xfree(t->value);
  53. xfree(t);
  54.     }
  55. }
  56. /*
  57.  * Build a TLV list for a StoreEntry
  58.  */
  59. tlv *
  60. storeSwapMetaBuild(StoreEntry * e)
  61. {
  62.     MemObject *mem = e->mem_obj;
  63.     tlv *TLV = NULL; /* we'll return this */
  64.     tlv **T = &TLV;
  65.     const char *url;
  66.     assert(mem != NULL);
  67.     assert(e->swap_status == SWAPOUT_WRITING);
  68.     url = storeUrl(e);
  69.     debug(20, 3) ("storeSwapMetaBuild: %sn", url);
  70.     T = storeSwapTLVAdd(STORE_META_KEY, e->key, MD5_DIGEST_CHARS, T);
  71.     T = storeSwapTLVAdd(STORE_META_STD, &e->timestamp, STORE_HDR_METASIZE, T);
  72.     T = storeSwapTLVAdd(STORE_META_URL, url, strlen(url) + 1, T);
  73.     return TLV;
  74. }
  75. char *
  76. storeSwapMetaPack(tlv * tlv_list, int *length)
  77. {
  78.     int buflen = 0;
  79.     tlv *t;
  80.     off_t j = 0;
  81.     char *buf;
  82.     assert(length != NULL);
  83.     buflen++; /* STORE_META_OK */
  84.     buflen += sizeof(int); /* size of header to follow */
  85.     for (t = tlv_list; t; t = t->next)
  86. buflen += sizeof(char) + sizeof(int) + t->length;
  87.     buflen++; /* STORE_META_END */
  88.     buf = xmalloc(buflen);
  89.     buf[j++] = (char) STORE_META_OK;
  90.     xmemcpy(&buf[j], &buflen, sizeof(int));
  91.     j += sizeof(int);
  92.     for (t = tlv_list; t; t = t->next) {
  93. buf[j++] = (char) t->type;
  94. xmemcpy(&buf[j], &t->length, sizeof(int));
  95. j += sizeof(int);
  96. xmemcpy(&buf[j], t->value, t->length);
  97. j += t->length;
  98.     }
  99.     buf[j++] = (char) STORE_META_END;
  100.     assert((int) j == buflen);
  101.     *length = buflen;
  102.     return buf;
  103. }
  104. tlv *
  105. storeSwapMetaUnpack(const char *buf, int *hdr_len)
  106. {
  107.     tlv *TLV; /* we'll return this */
  108.     tlv **T = &TLV;
  109.     char type;
  110.     int length;
  111.     int buflen;
  112.     off_t j = 0;
  113.     assert(buf != NULL);
  114.     assert(hdr_len != NULL);
  115.     if (buf[j++] != (char) STORE_META_OK)
  116. return NULL;
  117.     xmemcpy(&buflen, &buf[j], sizeof(int));
  118.     j += sizeof(int);
  119.     assert(buflen > (sizeof(char) + sizeof(int)));
  120.     while (buflen - j > (sizeof(char) + sizeof(int))) {
  121. type = buf[j++];
  122. xmemcpy(&length, &buf[j], sizeof(int));
  123. j += sizeof(int);
  124. if (j + length > buflen) {
  125.     debug(20, 0) ("storeSwapMetaUnpack: overflow!n");
  126.     debug(20, 0) ("ttype=%d, length=%d, buflen=%d, offset=%dn",
  127. type, length, buflen, (int) j);
  128.     break;
  129. }
  130. T = storeSwapTLVAdd(type, &buf[j], (size_t) length, T);
  131. j += length;
  132.     }
  133.     *hdr_len = buflen;
  134.     return TLV;
  135. }