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

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: unlinkd.c,v 1.29 1998/12/02 05:07:26 wessels Exp $
  3.  *
  4.  * DEBUG: section 12    Unlink Daemon
  5.  * AUTHOR: Duane Wessels
  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. #ifdef UNLINK_DAEMON
  35. /* This is the external unlinkd process */
  36. #include "config.h"
  37. #if HAVE_LIBC_H
  38. #include <libc.h>
  39. #endif
  40. #if HAVE_UNISTD_H
  41. #include <unistd.h>
  42. #endif
  43. #if HAVE_STDLIB_H
  44. #include <stdlib.h>
  45. #endif
  46. #if HAVE_STDIO_H
  47. #include <stdio.h>
  48. #endif
  49. #ifdef HAVE_STRING_H
  50. #include <string.h>
  51. #endif
  52. #ifdef HAVE_STRINGS_H
  53. #include <strings.h>
  54. #endif
  55. #define UNLINK_BUF_LEN 1024
  56. int
  57. main(int argc, char *argv[])
  58. {
  59.     char buf[UNLINK_BUF_LEN];
  60.     char *t;
  61.     setbuf(stdin, NULL);
  62.     while (fgets(buf, UNLINK_BUF_LEN, stdin)) {
  63. if ((t = strchr(buf, 'n')))
  64.     *t = '';
  65. #if USE_TRUNCATE_NOT_UNLINK
  66. truncate(buf, 0);
  67. #else
  68. unlink(buf);
  69. #endif
  70.     }
  71.     exit(0);
  72. }
  73. #else /* UNLINK_DAEMON */
  74. /* This code gets linked to Squid */
  75. #include "squid.h"
  76. #if USE_UNLINKD
  77. static int unlinkd_wfd = -1;
  78. static int unlinkd_rfd = -1;
  79. #endif
  80. void
  81. unlinkdUnlink(const char *path)
  82. {
  83. #if USE_UNLINKD
  84.     char *buf;
  85.     int l;
  86.     if (unlinkd_wfd < 0) {
  87. debug_trap("unlinkdUnlink: unlinkd_wfd < 0");
  88. safeunlink(path, 0);
  89. return;
  90.     }
  91.     l = strlen(path) + 1;
  92.     buf = xcalloc(1, l + 1);
  93.     strcpy(buf, path);
  94.     strcat(buf, "n");
  95.     file_write(unlinkd_wfd,
  96. -1,
  97. buf,
  98. l,
  99. NULL, /* Handler */
  100. NULL, /* Handler-data */
  101. xfree);
  102.     Counter.unlink.requests++;
  103. #endif
  104. }
  105. void
  106. unlinkdClose(void)
  107. {
  108. #if USE_UNLINKD
  109.     assert(unlinkd_wfd > -1);
  110.     debug(12, 1) ("Closing unlinkd pipe on FD %dn", unlinkd_wfd);
  111.     file_close(unlinkd_wfd);
  112.     if (unlinkd_wfd != unlinkd_rfd)
  113. file_close(unlinkd_rfd);
  114.     unlinkd_wfd = -1;
  115.     unlinkd_rfd = -1;
  116. #endif
  117. }
  118. void
  119. unlinkdInit(void)
  120. {
  121. #if USE_UNLINKD
  122.     int x;
  123.     char *args[2];
  124.     struct timeval slp;
  125.     args[0] = "(unlinkd)";
  126.     args[1] = NULL;
  127. #if HAVE_POLL && defined(_SQUID_OSF_)
  128.     /* pipes and poll() don't get along on DUNIX -DW */
  129.     x = ipcCreate(IPC_TCP_SOCKET,
  130. #else
  131.     x = ipcCreate(IPC_FIFO,
  132. #endif
  133. Config.Program.unlinkd,
  134. args,
  135. "unlinkd",
  136. &unlinkd_rfd,
  137. &unlinkd_wfd);
  138.     if (x < 0)
  139. fatal("Failed to create unlinkd subprocess");
  140.     slp.tv_sec = 0;
  141.     slp.tv_usec = 250000;
  142.     select(0, NULL, NULL, NULL, &slp);
  143.     fd_note(unlinkd_wfd, "squid -> unlinkd");
  144.     fd_note(unlinkd_rfd, "unlinkd -> squid");
  145.     commSetTimeout(unlinkd_rfd, -1, NULL, NULL);
  146.     commSetTimeout(unlinkd_wfd, -1, NULL, NULL);
  147.     commSetNonBlocking(unlinkd_wfd);
  148.     commSetNonBlocking(unlinkd_rfd);
  149.     debug(12, 1) ("Unlinkd pipe opened on FD %dn", unlinkd_wfd);
  150. #endif
  151. }
  152. #endif /* ndef UNLINK_DAEMON */