unlinkd.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:4k
- /*
- * $Id: unlinkd.c,v 1.29 1998/12/02 05:07:26 wessels Exp $
- *
- * DEBUG: section 12 Unlink Daemon
- * AUTHOR: Duane Wessels
- *
- * SQUID Internet Object Cache http://squid.nlanr.net/Squid/
- * ----------------------------------------------------------
- *
- * Squid is the result of efforts by numerous individuals from the
- * Internet community. Development is led by Duane Wessels of the
- * National Laboratory for Applied Network Research and funded by the
- * National Science Foundation. Squid is Copyrighted (C) 1998 by
- * Duane Wessels and the University of California San Diego. Please
- * see the COPYRIGHT file for full details. Squid incorporates
- * software developed and/or copyrighted by other sources. Please see
- * the CREDITS file for full details.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
- *
- */
- #ifdef UNLINK_DAEMON
- /* This is the external unlinkd process */
- #include "config.h"
- #if HAVE_LIBC_H
- #include <libc.h>
- #endif
- #if HAVE_UNISTD_H
- #include <unistd.h>
- #endif
- #if HAVE_STDLIB_H
- #include <stdlib.h>
- #endif
- #if HAVE_STDIO_H
- #include <stdio.h>
- #endif
- #ifdef HAVE_STRING_H
- #include <string.h>
- #endif
- #ifdef HAVE_STRINGS_H
- #include <strings.h>
- #endif
- #define UNLINK_BUF_LEN 1024
- int
- main(int argc, char *argv[])
- {
- char buf[UNLINK_BUF_LEN];
- char *t;
- setbuf(stdin, NULL);
- while (fgets(buf, UNLINK_BUF_LEN, stdin)) {
- if ((t = strchr(buf, 'n')))
- *t = ' ';
- #if USE_TRUNCATE_NOT_UNLINK
- truncate(buf, 0);
- #else
- unlink(buf);
- #endif
- }
- exit(0);
- }
- #else /* UNLINK_DAEMON */
- /* This code gets linked to Squid */
- #include "squid.h"
- #if USE_UNLINKD
- static int unlinkd_wfd = -1;
- static int unlinkd_rfd = -1;
- #endif
- void
- unlinkdUnlink(const char *path)
- {
- #if USE_UNLINKD
- char *buf;
- int l;
- if (unlinkd_wfd < 0) {
- debug_trap("unlinkdUnlink: unlinkd_wfd < 0");
- safeunlink(path, 0);
- return;
- }
- l = strlen(path) + 1;
- buf = xcalloc(1, l + 1);
- strcpy(buf, path);
- strcat(buf, "n");
- file_write(unlinkd_wfd,
- -1,
- buf,
- l,
- NULL, /* Handler */
- NULL, /* Handler-data */
- xfree);
- Counter.unlink.requests++;
- #endif
- }
- void
- unlinkdClose(void)
- {
- #if USE_UNLINKD
- assert(unlinkd_wfd > -1);
- debug(12, 1) ("Closing unlinkd pipe on FD %dn", unlinkd_wfd);
- file_close(unlinkd_wfd);
- if (unlinkd_wfd != unlinkd_rfd)
- file_close(unlinkd_rfd);
- unlinkd_wfd = -1;
- unlinkd_rfd = -1;
- #endif
- }
- void
- unlinkdInit(void)
- {
- #if USE_UNLINKD
- int x;
- char *args[2];
- struct timeval slp;
- args[0] = "(unlinkd)";
- args[1] = NULL;
- #if HAVE_POLL && defined(_SQUID_OSF_)
- /* pipes and poll() don't get along on DUNIX -DW */
- x = ipcCreate(IPC_TCP_SOCKET,
- #else
- x = ipcCreate(IPC_FIFO,
- #endif
- Config.Program.unlinkd,
- args,
- "unlinkd",
- &unlinkd_rfd,
- &unlinkd_wfd);
- if (x < 0)
- fatal("Failed to create unlinkd subprocess");
- slp.tv_sec = 0;
- slp.tv_usec = 250000;
- select(0, NULL, NULL, NULL, &slp);
- fd_note(unlinkd_wfd, "squid -> unlinkd");
- fd_note(unlinkd_rfd, "unlinkd -> squid");
- commSetTimeout(unlinkd_rfd, -1, NULL, NULL);
- commSetTimeout(unlinkd_wfd, -1, NULL, NULL);
- commSetNonBlocking(unlinkd_wfd);
- commSetNonBlocking(unlinkd_rfd);
- debug(12, 1) ("Unlinkd pipe opened on FD %dn", unlinkd_wfd);
- #endif
- }
- #endif /* ndef UNLINK_DAEMON */