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

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: whois.c,v 1.9 1999/01/15 06:11:47 wessels Exp $
  3.  *
  4.  * DEBUG: section 75    WHOIS protocol
  5.  * AUTHOR: Duane Wessels, 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. #define WHOIS_PORT 43
  36. typedef struct {
  37.     StoreEntry *entry;
  38.     request_t *request;
  39.     FwdState *fwd;
  40. } WhoisState;
  41. static PF whoisClose;
  42. static PF whoisTimeout;
  43. static PF whoisReadReply;
  44. /* PUBLIC */
  45. void
  46. whoisStart(FwdState * fwd)
  47. {
  48.     WhoisState *p = xcalloc(1, sizeof(*p));
  49.     int fd = fwd->server_fd;
  50.     char *buf;
  51.     size_t l;
  52.     p->request = fwd->request;
  53.     p->entry = fwd->entry;
  54.     p->fwd = fwd;
  55.     cbdataAdd(p, cbdataXfree, 0);
  56.     storeLockObject(p->entry);
  57.     comm_add_close_handler(fd, whoisClose, p);
  58.     l = strLen(p->request->urlpath) + 3;
  59.     buf = xmalloc(l);
  60.     snprintf(buf, l, "%srn", strBuf(p->request->urlpath) + 1);
  61.     comm_write(fd, buf, strlen(buf), NULL, p, xfree);
  62.     commSetSelect(fd, COMM_SELECT_READ, whoisReadReply, p, 0);
  63.     commSetTimeout(fd, Config.Timeout.read, whoisTimeout, p);
  64. }
  65. /* PRIVATE */
  66. static void
  67. whoisTimeout(int fd, void *data)
  68. {
  69.     WhoisState *p = data;
  70.     debug(75, 1) ("whoisTimeout: %sn", storeUrl(p->entry));
  71.     whoisClose(fd, p);
  72. }
  73. static void
  74. whoisReadReply(int fd, void *data)
  75. {
  76.     WhoisState *p = data;
  77.     StoreEntry *entry = p->entry;
  78.     char *buf = memAllocate(MEM_4K_BUF);
  79.     int len;
  80.     Counter.syscalls.sock.reads++;
  81.     len = read(fd, buf, 4095);
  82.     buf[len] = '';
  83.     debug(75, 3) ("whoisReadReply: FD %d read %d bytesn", fd, len);
  84.     debug(75, 5) ("{%s}n", buf);
  85.     if (len > 0) {
  86. fd_bytes(fd, len, FD_READ);
  87. kb_incr(&Counter.server.all.kbytes_in, len);
  88. kb_incr(&Counter.server.http.kbytes_in, len);
  89. storeAppend(entry, buf, len);
  90. commSetSelect(fd, COMM_SELECT_READ, whoisReadReply, p, Config.Timeout.read);
  91.     } else if (len < 0) {
  92. debug(50, 2) ("whoisReadReply: FD %d: read failure: %s.n",
  93.     fd, xstrerror());
  94. if (ignoreErrno(errno)) {
  95.     commSetSelect(fd, COMM_SELECT_READ, whoisReadReply, p, Config.Timeout.read);
  96. } else if (entry->mem_obj->inmem_hi == 0) {
  97.     ErrorState *err;
  98.     err = errorCon(ERR_READ_ERROR, HTTP_INTERNAL_SERVER_ERROR);
  99.     err->xerrno = errno;
  100.     fwdFail(p->fwd, err);
  101.     comm_close(fd);
  102. } else {
  103.     comm_close(fd);
  104. }
  105.     } else {
  106. fwdComplete(p->fwd);
  107. debug(75, 3) ("whoisReadReply: Done: %sn", storeUrl(entry));
  108. comm_close(fd);
  109.     }
  110.     memFree(buf, MEM_4K_BUF);
  111. }
  112. static void
  113. whoisClose(int fd, void *data)
  114. {
  115.     WhoisState *p = data;
  116.     debug(75, 3) ("whoisClose: FD %dn", fd);
  117.     storeUnlockObject(p->entry);
  118.     cbdataFree(p);
  119. }