From 6bf364c8ae217fbb57f7768acd0c446213b88628 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Thu, 24 Jun 2004 15:26:34 +0000 Subject: [PATCH] * Updated the ig_tcp_server() function to allow binding to a single IP address. This is not yet used by anything. --- citadel/ChangeLog | 5 +++++ citadel/serv_extensions.c | 3 ++- citadel/sysdep.c | 35 ++++++++++++++++++++++------------- citadel/sysdep_decls.h | 2 +- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/citadel/ChangeLog b/citadel/ChangeLog index 0e7200b32..61c503f92 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -1,4 +1,8 @@ $Log$ + Revision 622.2 2004/06/24 15:26:33 ajc + * Updated the ig_tcp_server() function to allow binding to a single IP + address. This is not yet used by anything. + Revision 622.1 2004/06/24 02:34:39 ajc * serv_imap.c: when an IMAP socket breaks while a folder is selected, auto-expunge the folder before closing it. Fixes the "mysteriously @@ -5875,3 +5879,4 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant Fri Jul 10 1998 Art Cancro * Initial CVS import + diff --git a/citadel/serv_extensions.c b/citadel/serv_extensions.c index b10635097..e62655e1e 100644 --- a/citadel/serv_extensions.c +++ b/citadel/serv_extensions.c @@ -452,7 +452,8 @@ void CtdlRegisterServiceHook(int tcp_port, return; } else { - newfcn->msock = ig_tcp_server(tcp_port, config.c_maxsessions); + newfcn->msock = ig_tcp_server(NULL, tcp_port, + config.c_maxsessions); snprintf(message, sizeof message, "TCP port %d: ", tcp_port); } diff --git a/citadel/sysdep.c b/citadel/sysdep.c index 7d21eb0b2..1b89cb4d8 100644 --- a/citadel/sysdep.c +++ b/citadel/sysdep.c @@ -107,12 +107,12 @@ int syslog_facility = (-1); * log data sent through this function. BE CAREFUL! */ void lprintf(enum LogLevel loglevel, const char *format, ...) { - va_list arg_ptr; + va_list arg_ptr; char buf[SIZ]; - va_start(arg_ptr, format); - vsnprintf(buf, sizeof(buf), format, arg_ptr); - va_end(arg_ptr); + va_start(arg_ptr, format); + vsnprintf(buf, sizeof(buf), format, arg_ptr); + va_end(arg_ptr); if (syslog_facility >= 0) { if (loglevel <= verbosity) { @@ -275,7 +275,7 @@ void end_critical_section(int which_one) * a TCP port. The server shuts down if the bind fails. * */ -int ig_tcp_server(int port_number, int queue_len) +int ig_tcp_server(char *ip_addr, int port_number, int queue_len) { struct sockaddr_in sin; int s, i; @@ -286,8 +286,17 @@ int ig_tcp_server(int port_number, int queue_len) memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; - sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons((u_short)port_number); + if (ip_addr == NULL) { + sin.sin_addr.s_addr = INADDR_ANY; + } + else { + sin.sin_addr.s_addr = inet_addr(ip_addr); + } + + if (sin.sin_addr.s_addr == INADDR_NONE) { + sin.sin_addr.s_addr = INADDR_ANY; + } s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); @@ -448,7 +457,7 @@ DONE: ++num_sessions; /* * buffer_output() ... tell client_write to buffer all output until - * instructed to dump it all out later + * instructed to dump it all out later */ void buffer_output(void) { if (CC->buffering == 0) { @@ -529,15 +538,15 @@ void client_write(char *buf, int nbytes) /* * cprintf() ... Send formatted printable data to the client. It is - * implemented in terms of client_write() but remains in - * sysdep.c in case we port to somewhere without va_args... + * implemented in terms of client_write() but remains in + * sysdep.c in case we port to somewhere without va_args... */ void cprintf(const char *format, ...) { - va_list arg_ptr; - char buf[SIZ]; + va_list arg_ptr; + char buf[SIZ]; - va_start(arg_ptr, format); - if (vsnprintf(buf, sizeof buf, format, arg_ptr) == -1) + va_start(arg_ptr, format); + if (vsnprintf(buf, sizeof buf, format, arg_ptr) == -1) buf[sizeof buf - 2] = '\n'; client_write(buf, strlen(buf)); va_end(arg_ptr); diff --git a/citadel/sysdep_decls.h b/citadel/sysdep_decls.h index 008031e4a..d58124e12 100644 --- a/citadel/sysdep_decls.h +++ b/citadel/sysdep_decls.h @@ -44,7 +44,7 @@ void cprintf (const char *format, ...); void init_sysdep (void); void begin_critical_section (int which_one); void end_critical_section (int which_one); -int ig_tcp_server (int port_number, int queue_len); +int ig_tcp_server (char *ip_addr, int port_number, int queue_len); int ig_uds_server(char *sockpath, int queue_len); INLINE struct CitContext *MyContext (void); struct CitContext *CreateNewContext (void); -- 2.39.2