void icmpOpen(void) { #if USE_ICMP char *args[2]; int x; int rfd; int wfd; args[0] = "(pinger)"; args[1] = NULL; x = ipcCreate(IPC_UDP_SOCKET, Config.Program.pinger, args, "Pinger Socket", &rfd, &wfd); if (x < 0) return; assert(rfd == wfd); icmp_sock = rfd; commSetSelect(icmp_sock, COMM_SELECT_READ, icmpRecv, NULL, 0); commSetTimeout(icmp_sock, -1, NULL, NULL); debug(29, 1) ("Pinger socket opened on FD %d\n", icmp_sock); #endif }
void icmpOpen(void) { #if USE_ICMP const char *args[2]; int rfd; int wfd; args[0] = "(pinger)"; args[1] = NULL; pid = ipcCreate(IPC_DGRAM, Config.Program.pinger, args, "Pinger Socket", &rfd, &wfd, &hIpc); if (pid < 0) return; assert(rfd == wfd); icmp_sock = rfd; fd_note(icmp_sock, "pinger"); commSetSelect(icmp_sock, COMM_SELECT_READ, icmpRecv, NULL, 0); commSetTimeout(icmp_sock, -1, NULL, NULL); debug(37, 1) ("Pinger socket opened on FD %d\n", icmp_sock); #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); /* * unlinkd_rfd should already be non-blocking because of * ipcCreate. We change unlinkd_wfd to blocking mode because * we never want to lose an unlink request, and we don't have * code to retry if we get EWOULDBLOCK. Unfortunately, we can * do this only for the IPC_FIFO case. */ assert(fd_table[unlinkd_rfd].flags.nonblocking); if (FD_PIPE == fd_table[unlinkd_wfd].type) commUnsetNonBlocking(unlinkd_wfd); debug(12, 1) ("Unlinkd pipe opened on FD %d\n", unlinkd_wfd); #else debug(12, 1) ("Unlinkd is disabled\n"); #endif }
void unlinkdInit(void) { const char *args[2]; struct timeval slp; args[0] = "(unlinkd)"; args[1] = NULL; #if (HAVE_POLL && defined(_SQUID_OSF_)) || defined(_SQUID_MSWIN_) /* pipes and poll() don't get along on DUNIX -DW */ /* On Windows select() will fail on a pipe */ pid = ipcCreate(IPC_STREAM, #else /* We currently need to use FIFO.. see below */ pid = ipcCreate(IPC_FIFO, #endif Config.Program.unlinkd, args, "unlinkd", &unlinkd_rfd, &unlinkd_wfd, &hIpc); if (pid < 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); /* * unlinkd_rfd should already be non-blocking because of * ipcCreate. We change unlinkd_wfd to blocking mode because * we never want to lose an unlink request, and we don't have * code to retry if we get EWOULDBLOCK. Unfortunately, we can * do this only for the IPC_FIFO case. */ assert(fd_table[unlinkd_rfd].flags.nonblocking); if (FD_PIPE == fd_table[unlinkd_wfd].type) commUnsetNonBlocking(unlinkd_wfd); debug(2, 1) ("Unlinkd pipe opened on FD %d\n", unlinkd_wfd); }
void helperOpenServers(helper * hlp) { char *s; char *progname; char *shortname; char *procname; const char *args[HELPER_MAX_ARGS]; char fd_note_buf[FD_DESC_SZ]; helper_server *srv; int nargs = 0; int k; int x; int rfd; int wfd; wordlist *w; if (hlp->cmdline == NULL) return; progname = hlp->cmdline->key; if ((s = strrchr(progname, '/'))) shortname = xstrdup(s + 1); else shortname = xstrdup(progname); debug(84, 1) ("helperOpenServers: Starting %d '%s' processes\n", hlp->n_to_start, shortname); procname = xmalloc(strlen(shortname) + 3); snprintf(procname, strlen(shortname) + 3, "(%s)", shortname); args[nargs++] = procname; for (w = hlp->cmdline->next; w && nargs < HELPER_MAX_ARGS; w = w->next) args[nargs++] = w->key; args[nargs++] = NULL; assert(nargs <= HELPER_MAX_ARGS); for (k = 0; k < hlp->n_to_start; k++) { getCurrentTime(); rfd = wfd = -1; x = ipcCreate(hlp->ipc_type, progname, args, shortname, &rfd, &wfd); if (x < 0) { debug(84, 1) ("WARNING: Cannot run '%s' process.\n", progname); continue; } hlp->n_running++; srv = cbdataAlloc(helper_server); srv->pid = x; srv->flags.alive = 1; srv->index = k; srv->rfd = rfd; srv->wfd = wfd; srv->buf = memAllocate(MEM_8K_BUF); srv->buf_sz = 8192; srv->offset = 0; srv->parent = hlp; cbdataLock(hlp); /* lock because of the parent backlink */ dlinkAddTail(srv, &srv->link, &hlp->servers); if (rfd == wfd) { snprintf(fd_note_buf, FD_DESC_SZ, "%s #%d", shortname, k + 1); fd_note(rfd, fd_note_buf); } else { snprintf(fd_note_buf, FD_DESC_SZ, "reading %s #%d", shortname, k + 1); fd_note(rfd, fd_note_buf); snprintf(fd_note_buf, FD_DESC_SZ, "writing %s #%d", shortname, k + 1); fd_note(wfd, fd_note_buf); } commSetNonBlocking(rfd); if (wfd != rfd) commSetNonBlocking(wfd); comm_add_close_handler(rfd, helperServerFree, srv); } hlp->last_restart = squid_curtime; safe_free(shortname); safe_free(procname); helperKickQueue(hlp); }