commit - cc336b75580d012c1caee58a252d1ad14b2cee23
commit + 54e67ea9ee6c2b00c43f759edc55b57b969c9e2d
blob - 3d9dfe7fbc301f36cd108d8416e97ff0a3406a46
blob + d36d25b7719cfcb5d661f96f30afd8f261662a6b
--- contrib/MacOSX/ngIRCd.xcodeproj/project.pbxproj
+++ contrib/MacOSX/ngIRCd.xcodeproj/project.pbxproj
FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FA322DC00CEF77CB001761B3 /* libz.dylib */; };
FA407F2E0DB159F400271AF1 /* ng_ipaddr.c in Sources */ = {isa = PBXBuildFile; fileRef = FA407F2C0DB159F400271AF1 /* ng_ipaddr.c */; };
FA85178C0FA061EC006A1F5A /* op.c in Sources */ = {isa = PBXBuildFile; fileRef = FA85178B0FA061EC006A1F5A /* op.c */; };
+ FA99428C10E82A27007F27ED /* proc.c in Sources */ = {isa = PBXBuildFile; fileRef = FA99428B10E82A27007F27ED /* proc.c */; };
FAA3D27B0F139CDC00B2447E /* conn-ssl.c in Sources */ = {isa = PBXBuildFile; fileRef = FAA3D2790F139CDC00B2447E /* conn-ssl.c */; };
FAE5CC2E0CF2308A007D69B6 /* numeric.c in Sources */ = {isa = PBXBuildFile; fileRef = FAE5CC2D0CF2308A007D69B6 /* numeric.c */; };
/* End PBXBuildFile section */
FA407F380DB15AC700271AF1 /* GIT.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = GIT.txt; sourceTree = "<group>"; };
FA85178A0FA061EC006A1F5A /* op.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = op.h; sourceTree = "<group>"; };
FA85178B0FA061EC006A1F5A /* op.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = op.c; sourceTree = "<group>"; };
+ FA99428A10E82A27007F27ED /* proc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = proc.h; sourceTree = "<group>"; };
+ FA99428B10E82A27007F27ED /* proc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = proc.c; sourceTree = "<group>"; };
FAA3D2700F139CB300B2447E /* invite-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "invite-test.e"; sourceTree = "<group>"; };
FAA3D2710F139CB300B2447E /* join-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "join-test.e"; sourceTree = "<group>"; };
FAA3D2720F139CB300B2447E /* kick-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "kick-test.e"; sourceTree = "<group>"; };
FA85178B0FA061EC006A1F5A /* op.c */,
FA322D080CEF74B1001761B3 /* parse.c */,
FA322D090CEF74B1001761B3 /* parse.h */,
+ FA99428B10E82A27007F27ED /* proc.c */,
+ FA99428A10E82A27007F27ED /* proc.h */,
FA322D0A0CEF74B1001761B3 /* rendezvous.c */,
FA322D0B0CEF74B1001761B3 /* rendezvous.h */,
FA322D0C0CEF74B1001761B3 /* resolve.c */,
FA407F2E0DB159F400271AF1 /* ng_ipaddr.c in Sources */,
FAA3D27B0F139CDC00B2447E /* conn-ssl.c in Sources */,
FA85178C0FA061EC006A1F5A /* op.c in Sources */,
+ FA99428C10E82A27007F27ED /* proc.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
blob - f94f8d92f055f87fd4adc44c2d73527c77e97b55
blob + 2bce2924a644d64bbd4e2196312c297f16dc0869
--- src/ngircd/Makefile.am
+++ src/ngircd/Makefile.am
#
# ngIRCd -- The Next Generation IRC Daemon
-# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
+# Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
#
# 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
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
-# $Id: Makefile.am,v 1.51 2008/02/26 22:04:17 fw Exp $
-#
AUTOMAKE_OPTIONS = ../portab/ansi2knr
ngircd_SOURCES = ngircd.c array.c channel.c client.c conf.c conn.c conn-func.c \
conn-ssl.c conn-zip.c hash.c io.c irc.c irc-channel.c irc-info.c irc-login.c \
irc-mode.c irc-op.c irc-oper.c irc-server.c irc-write.c lists.c log.c \
- match.c op.c numeric.c parse.c rendezvous.c resolve.c
+ match.c op.c numeric.c parse.c proc.c rendezvous.c resolve.c
ngircd_LDFLAGS = -L../portab -L../tool -L../ipaddr
noinst_HEADERS = ngircd.h array.h channel.h client.h conf.h conf-ssl.h conn.h \
conn-func.h conn-ssl.h conn-zip.h hash.h io.h irc.h irc-channel.h \
irc-info.h irc-login.h irc-mode.h irc-op.h irc-oper.h irc-server.h \
- irc-write.h lists.h log.h match.h numeric.h op.h parse.h rendezvous.h \
- resolve.h defines.h messages.h
+ irc-write.h lists.h log.h match.h numeric.h op.h parse.h proc.h \
+ rendezvous.h resolve.h defines.h messages.h
clean-local:
rm -f check-version check-help lint.out
blob - f9db5c759262db3f399182379e285f5ee3580863
blob + 43b07b73518614ef26886e4a52662024707d21c6
--- src/ngircd/conf.c
+++ src/ngircd/conf.c
if( NGIRCd_Passive ) Server->flags = CONF_SFLAG_DISABLED;
- Resolve_Init(&Server->res_stat);
+ Proc_InitStruct(&Server->res_stat);
Server->conn_id = NONE;
memset(&Server->bind_addr, 0, sizeof(&Server->bind_addr));
} /* Init_Server_Struct */
blob - 5764d0f3556249441387bff87e452918b1049e2a
blob + 8e397fafcf437b9531b8e2d70294a018bf39ae16
--- src/ngircd/conf.h
+++ src/ngircd/conf.h
#include "portab.h"
#include "tool.h"
#include "ng_ipaddr.h"
-#include "resolve.h"
+#include "proc.h"
#include "conf-ssl.h"
UINT16 port; /* Server port */
int group; /* Group of server */
time_t lasttry; /* Last connect attempt */
- RES_STAT res_stat; /* Status of the resolver */
+ PROC_STAT res_stat; /* Status of the resolver */
int flags; /* Flags */
CONN_ID conn_id; /* ID of server connection or NONE */
ng_ipaddr_t bind_addr; /* source address to use for outgoing
blob - bfcb8d4bf3646d8e792272d89c3182f648dee184
blob + 495c54f1d81a34ec00505ad7695f56ca369b3bf5
--- src/ngircd/conn.c
+++ src/ngircd/conn.c
#include "imp.h"
#include <assert.h>
#ifdef PROTOTYPES
-# include <stdarg.h>
+# include <stdarg.h>
#else
-# include <varargs.h>
+# include <varargs.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include "array.h"
#include "defines.h"
-#include "resolve.h"
#include "exp.h"
#include "conn.h"
#include "imp.h"
#include "ngircd.h"
+#include "array.h"
#include "client.h"
#include "conf.h"
#include "conn-ssl.h"
#include "conn-zip.h"
#include "conn-func.h"
#include "log.h"
+#include "ng_ipaddr.h"
#include "parse.h"
+#include "proc.h"
+#include "resolve.h"
#include "tool.h"
#ifdef ZEROCONF
if (SSL_WantWrite(&My_Connections[i]))
continue; /* TLS/SSL layer needs to write data; deal with this first */
#endif
- if (Resolve_INPROGRESS(&My_Connections[i].res_stat)) {
+ if (Proc_InProgress(&My_Connections[i].res_stat)) {
/* Wait for completion of resolver sub-process ... */
io_event_del(My_Connections[i].sock,
IO_WANTREAD);
}
/* cancel running resolver */
- if (Resolve_INPROGRESS(&My_Connections[Idx].res_stat))
- Resolve_Shutdown(&My_Connections[Idx].res_stat);
+ if (Proc_InProgress(&My_Connections[Idx].res_stat))
+ Proc_Kill(&My_Connections[Idx].res_stat);
/* Servers: Modify time of next connect attempt? */
Conf_UnsetServer( Idx );
/* Okay, try to connect now */
Conf_Server[i].lasttry = time_now;
Conf_Server[i].conn_id = SERVER_WAIT;
- assert(Resolve_Getfd(&Conf_Server[i].res_stat) < 0);
+ assert(Proc_GetPipeFd(&Conf_Server[i].res_stat) < 0);
Resolve_Name(&Conf_Server[i].res_stat, Conf_Server[i].host, cb_Connect_to_Server);
}
} /* Check_Servers */
My_Connections[Idx].signon = now;
My_Connections[Idx].lastdata = now;
My_Connections[Idx].lastprivmsg = now;
- Resolve_Init(&My_Connections[Idx].res_stat);
+ Proc_InitStruct(&My_Connections[Idx].res_stat);
} /* Init_Conn_Struct */
LogDebug("Resolver: Got forward lookup callback on fd %d, events %d", fd, events);
for (i=0; i < MAX_SERVERS; i++) {
- if (Resolve_Getfd(&Conf_Server[i].res_stat) == fd )
+ if (Proc_GetPipeFd(&Conf_Server[i].res_stat) == fd )
break;
}
/* Search associated connection ... */
for( i = 0; i < Pool_Size; i++ ) {
if(( My_Connections[i].sock != NONE )
- && ( Resolve_Getfd(&My_Connections[i].res_stat) == r_fd ))
+ && (Proc_GetPipeFd(&My_Connections[i].res_stat) == r_fd))
break;
}
if( i >= Pool_Size ) {
blob - 96d1f33b144cc7151e7892ed12f13fefe33a82fc
blob + 2ca0d6289b992b88b76d38fd5ccba5f9d6541c85
--- src/ngircd/conn.h
+++ src/ngircd/conn.h
#ifdef CONN_MODULE
#include "defines.h"
-#include "resolve.h"
+#include "proc.h"
#include "array.h"
#include "tool.h"
#include "ng_ipaddr.h"
{
int sock; /* Socket handle */
ng_ipaddr_t addr; /* Client address */
- RES_STAT res_stat; /* Status of resolver process */
+ PROC_STAT res_stat; /* Status of resolver process */
char host[HOST_LEN]; /* Hostname */
array rbuf; /* Read buffer */
array wbuf; /* Write buffer */
blob - 18a29aa647eb6feb214a654375cde51856b86fdc
blob + e811e81b0b2a2bfa66eac927a2c8af4c60bdc4fb
--- src/ngircd/io.c
+++ src/ngircd/io.c
#ifdef IO_USE_SELECT
#include "defines.h" /* for conn.h */
-#include "conn.h" /* for CONN_IDX (needed by resolve.h) */
-#include "resolve.h" /* for RES_STAT (needed by conf.h) */
+#include "proc.h" /* for PROC_STAT (needed by conf.h) */
#include "conf.h" /* for Conf_MaxConnections */
static fd_set readers;
blob - /dev/null
blob + 5f3cadeb5f7eef30ba99d249f62fe00d2f789abd (mode 644)
--- /dev/null
+++ src/ngircd/proc.c
+/*
+ * ngIRCd -- The Next Generation IRC Daemon
+ * Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
+ *
+ * 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.
+ * Please read the file COPYING, README and AUTHORS for more information.
+ *
+ * Process management
+ */
+
+#include "portab.h"
+
+#include "imp.h"
+#include <assert.h>
+#include <errno.h>
+#include <signal.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "log.h"
+#include "io.h"
+
+#include "exp.h"
+#include "proc.h"
+
+/**
+ * Initialize process structure.
+ */
+GLOBAL void
+Proc_InitStruct (PROC_STAT *proc)
+{
+ assert(proc != NULL);
+ proc->pid = 0;
+ proc->pipe_fd = -1;
+}
+
+/**
+ * Fork a child process.
+ */
+GLOBAL pid_t
+Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short))
+{
+ pid_t pid;
+
+ assert(proc != NULL);
+ assert(pipefds != NULL);
+ assert(cbfunc != NULL);
+
+ if (pipe(pipefds) != 0) {
+ Log(LOG_ALERT, "Can't create output pipe for child process: %s!",
+ strerror(errno));
+ return -1;
+ }
+
+ pid = fork();
+ switch (pid) {
+ case -1:
+ /* Error on fork: */
+ Log(LOG_CRIT, "Can't fork child process: %s!", strerror(errno));
+ close(pipefds[0]);
+ close(pipefds[1]);
+ return -1;
+ case 0:
+ /* New child process: */
+ close(pipefds[0]);
+ return 0;
+ }
+
+ /* Old parent process: */
+ close(pipefds[1]);
+
+ if (!io_setnonblock(pipefds[0])
+ || !io_event_create(pipefds[0], IO_WANTREAD, cbfunc)) {
+ Log(LOG_CRIT, "Can't register callback for child process: %s!",
+ strerror(errno));
+ close(pipefds[0]);
+ return -1;
+ }
+
+ proc->pid = pid;
+ proc->pipe_fd = pipefds[0];
+ return pid;
+}
+
+/**
+ * Kill forked child process.
+ */
+GLOBAL void
+Proc_Kill(PROC_STAT *proc)
+{
+ assert(proc != NULL);
+ assert(proc->pipe_fd >= 0);
+
+ io_close(proc->pipe_fd);
+ kill(proc->pid, SIGTERM);
+ Proc_InitStruct(proc);
+}
+
+/* -eof- */
blob - /dev/null
blob + c342e1dfa568ab17c16eeb236d53a8e83ea15694 (mode 644)
--- /dev/null
+++ src/ngircd/proc.h
+/*
+ * ngIRCd -- The Next Generation IRC Daemon
+ * Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
+ *
+ * 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.
+ * Please read the file COPYING, README and AUTHORS for more information.
+ *
+ * Process management (header)
+ */
+
+#ifndef __proc_h__
+#define __proc_h__
+
+/* This struct must not be accessed directly! */
+typedef struct _Proc_Stat {
+ pid_t pid; /* PID of the child process or 0 if none */
+ int pipe_fd; /* Pipe file descriptor or -1 if none */
+} PROC_STAT;
+
+#define Proc_InProgress(x) ((x)->pid != 0)
+#define Proc_GetPipeFd(x) ((x)->pipe_fd)
+
+GLOBAL void Proc_InitStruct PARAMS((PROC_STAT *proc));
+
+GLOBAL pid_t Proc_Fork PARAMS((PROC_STAT *proc, int *pipefds,
+ void (*cbfunc)(int, short)));
+
+GLOBAL void Proc_Kill PARAMS((PROC_STAT *proc));
+
+#endif
+
+/* -eof- */
blob - bccf5180f65ce0b839db30e28105986d40d49f85
blob + e64688ec22e1c280c395282b9b7a3ef8d3154650
--- src/ngircd/resolve.c
+++ src/ngircd/resolve.c
#endif
#endif
+#include "array.h"
#include "conn.h"
#include "defines.h"
#include "log.h"
+#include "ng_ipaddr.h"
+#include "proc.h"
#include "exp.h"
#include "resolve.h"
static void Do_ResolveAddr PARAMS(( const ng_ipaddr_t *Addr, int Sock, int w_fd ));
static void Do_ResolveName PARAMS(( const char *Host, int w_fd ));
-static bool register_callback PARAMS((RES_STAT *s, void (*cbfunc)(int, short)));
#ifdef WANT_IPV6
extern bool Conf_ConnectIPv4;
extern bool Conf_ConnectIPv6;
#endif
-static pid_t
-Resolver_fork(int *pipefds)
-{
- pid_t pid;
- if (pipe(pipefds) != 0) {
- Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno ));
- return -1;
- }
-
- pid = fork();
- switch(pid) {
- case -1:
- Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
- close(pipefds[0]);
- close(pipefds[1]);
- return -1;
- case 0: /* child */
- close(pipefds[0]);
- Log_Init_Resolver( );
- return 0;
- }
- /* parent */
- close(pipefds[1]);
- return pid;
-}
-
-
/**
* Resolve IP (asynchronous!).
*/
GLOBAL bool
-Resolve_Addr(RES_STAT * s, const ng_ipaddr_t *Addr, int identsock,
+Resolve_Addr(PROC_STAT * s, const ng_ipaddr_t *Addr, int identsock,
void (*cbfunc) (int, short))
{
int pipefd[2];
assert(s != NULL);
- pid = Resolver_fork(pipefd);
+ pid = Proc_Fork(s, pipefd, cbfunc);
if (pid > 0) {
LogDebug("Resolver for %s created (PID %d).", ng_ipaddr_tostr(Addr), pid);
-
- s->pid = pid;
- s->resolver_fd = pipefd[0];
- return register_callback(s, cbfunc);
+ return true;
} else if( pid == 0 ) {
/* Sub process */
+ Log_Init_Resolver();
Do_ResolveAddr( Addr, identsock, pipefd[1]);
Log_Exit_Resolver( );
exit(0);
* Resolve hostname (asynchronous!).
*/
GLOBAL bool
-Resolve_Name( RES_STAT *s, const char *Host, void (*cbfunc)(int, short))
+Resolve_Name( PROC_STAT *s, const char *Host, void (*cbfunc)(int, short))
{
int pipefd[2];
pid_t pid;
assert(s != NULL);
- pid = Resolver_fork(pipefd);
+ pid = Proc_Fork(s, pipefd, cbfunc);
if (pid > 0) {
/* Main process */
#ifdef DEBUG
Log( LOG_DEBUG, "Resolver for \"%s\" created (PID %d).", Host, pid );
#endif
- s->pid = pid;
- s->resolver_fd = pipefd[0];
- return register_callback(s, cbfunc);
+ return true;
} else if( pid == 0 ) {
/* Sub process */
+ Log_Init_Resolver();
Do_ResolveName(Host, pipefd[1]);
Log_Exit_Resolver( );
exit(0);
} /* Resolve_Name */
-GLOBAL void
-Resolve_Init(RES_STAT *s)
-{
- assert(s != NULL);
- s->resolver_fd = -1;
- s->pid = 0;
-}
-
-
#if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETNAMEINFO)
#if !defined(WANT_IPV6) && defined(h_errno)
static char *
array_free(&IpAddrs);
} /* Do_ResolveName */
-
-
-static bool
-register_callback( RES_STAT *s, void (*cbfunc)(int, short))
-{
- assert(cbfunc != NULL);
- assert(s != NULL);
- assert(s->resolver_fd >= 0);
- if (io_setnonblock(s->resolver_fd) &&
- io_event_create(s->resolver_fd, IO_WANTREAD, cbfunc))
- return true;
- Log( LOG_CRIT, "Resolver: Could not register callback function: %s!", strerror(errno));
- close(s->resolver_fd);
- Resolve_Init(s);
- return false;
-}
-
-
-GLOBAL bool
-Resolve_Shutdown( RES_STAT *s)
-{
- bool ret = false;
-
- assert(s != NULL);
- assert(s->resolver_fd >= 0);
-
- if (s->resolver_fd >= 0)
- ret = io_close(s->resolver_fd);
-
- Resolve_Init(s);
- return ret;
-}
-
-
/**
* Read result of resolver sub-process from pipe
*/
GLOBAL size_t
-Resolve_Read( RES_STAT *s, void* readbuf, size_t buflen)
+Resolve_Read( PROC_STAT *s, void* readbuf, size_t buflen)
{
ssize_t bytes_read;
assert(buflen > 0);
/* Read result from pipe */
- bytes_read = read(s->resolver_fd, readbuf, buflen);
+ bytes_read = read(Proc_GetPipeFd(s), readbuf, buflen);
if (bytes_read < 0) {
if (errno == EAGAIN)
return 0;
else if (bytes_read == 0)
Log( LOG_DEBUG, "Resolver: Can't read result: EOF");
#endif
- Resolve_Shutdown(s);
+ Proc_Kill(s);
return (size_t)bytes_read;
}
blob - 8ff88c8b128ff8398b374c2f5dd78403818aece5
blob + 9759a2c4e43150ab8d196d984a0b0a9d08d38c77
--- src/ngircd/resolve.h
+++ src/ngircd/resolve.h
/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2010 by Alexander Barton (alex@barton.de)
*
* 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
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
- * $Id: resolve.h,v 1.14 2008/02/26 22:04:17 fw Exp $
- *
* Asynchronous resolver (header)
*/
-
#ifndef __resolve_h__
#define __resolve_h__
-#include "array.h"
-#include "tool.h"
-#include "ng_ipaddr.h"
+GLOBAL bool Resolve_Addr PARAMS((PROC_STAT * s, const ng_ipaddr_t * Addr,
+ int identsock, void (*cbfunc) (int, short)));
+GLOBAL bool Resolve_Name PARAMS((PROC_STAT * s, const char *Host,
+ void (*cbfunc) (int, short)));
+GLOBAL size_t Resolve_Read PARAMS((PROC_STAT * s, void *buf, size_t buflen));
-/* This struct must not be accessed directly */
-typedef struct _Res_Stat {
- pid_t pid; /* PID of resolver process */
- int resolver_fd; /* pipe fd for lookup result. */
-} RES_STAT;
-
-
-#define Resolve_Getfd(x) ((x)->resolver_fd)
-#define Resolve_INPROGRESS(x) ((x)->resolver_fd >= 0)
-
-GLOBAL bool Resolve_Addr PARAMS(( RES_STAT *s, const ng_ipaddr_t *Addr, int identsock, void (*cbfunc)(int, short)));
-GLOBAL bool Resolve_Name PARAMS(( RES_STAT *s, const char *Host, void (*cbfunc)(int, short) ));
-GLOBAL size_t Resolve_Read PARAMS(( RES_STAT *s, void *buf, size_t buflen));
-GLOBAL void Resolve_Init PARAMS(( RES_STAT *s));
-GLOBAL bool Resolve_Shutdown PARAMS(( RES_STAT *s));
-
#endif
+
/* -eof- */