From 767b36e286295b8572933487b31ceb301e0a43f9 Mon Sep 17 00:00:00 2001 Message-Id: <767b36e286295b8572933487b31ceb301e0a43f9.1715338452.git.mdw@distorted.org.uk> From: Mark Wooding Date: Fri, 16 May 2003 12:09:03 +0000 Subject: [PATCH] Allow binding to a chosen address. Organization: Straylight/Edgeware From: mdw --- peer.c | 12 ++++++++---- tripe.c | 19 +++++++++++++++---- tripe.h | 10 +++++++--- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/peer.c b/peer.c index e1362e9b..9a2fc591 100644 --- a/peer.c +++ b/peer.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: peer.c,v 1.7 2003/04/15 14:12:05 mdw Exp $ + * $Id: peer.c,v 1.8 2003/05/16 12:09:03 mdw Exp $ * * Communication with the peer * @@ -29,6 +29,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: peer.c,v $ + * Revision 1.8 2003/05/16 12:09:03 mdw + * Allow binding to a chosen address. + * * Revision 1.7 2003/04/15 14:12:05 mdw * Insert a newline to improve readability. * @@ -276,14 +279,15 @@ const addr *p_addr(peer *p) { return (&p->peer); } /* --- @p_init@ --- * * - * Arguments: @unsigned port@ = port number to listen to + * Arguments: @struct in_addr addr@ = address to bind to + * @unsigned port@ = port number to listen to * * Returns: --- * * Use: Initializes the peer system; creates the socket. */ -void p_init(unsigned port) +void p_init(struct in_addr addr, unsigned port) { int fd; struct sockaddr_in sin; @@ -301,7 +305,7 @@ void p_init(unsigned port) die(EXIT_FAILURE, "socket creation failed: %s", strerror(errno)); BURN(sin); sin.sin_family = AF_INET; - sin.sin_addr.s_addr = INADDR_ANY; + sin.sin_addr = addr; sin.sin_port = htons(port); if (bind(fd, (struct sockaddr *)&sin, sizeof(sin))) die(EXIT_FAILURE, "bind failed: %s", strerror(errno)); diff --git a/tripe.c b/tripe.c index 9e225659..e0985966 100644 --- a/tripe.c +++ b/tripe.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: tripe.c,v 1.9 2003/04/15 14:11:09 mdw Exp $ + * $Id: tripe.c,v 1.10 2003/05/16 12:09:03 mdw Exp $ * * Main program * @@ -29,6 +29,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: tripe.c,v $ + * Revision 1.10 2003/05/16 12:09:03 mdw + * Allow binding to a chosen address. + * * Revision 1.9 2003/04/15 14:11:09 mdw * Rationalize the behaviour of the `-G' and `-U' options. * @@ -151,6 +154,7 @@ int main(int argc, char *argv[]) const char *dir = "/var/lib/tripe"; const char *p; unsigned port = 0; + struct in_addr baddr = { INADDR_ANY }; unsigned f = 0; uid_t u = -1; gid_t g = -1; @@ -175,6 +179,7 @@ int main(int argc, char *argv[]) { "setuid", OPTF_ARGREQ, 0, 'U' }, { "gid", OPTF_ARGREQ, 0, 'G' }, { "setgid", OPTF_ARGREQ, 0, 'G' }, + { "bind-address", OPTF_ARGREQ, 0, 'b' }, { "port", OPTF_ARGREQ, 0, 'p' }, { "directory", OPTF_ARGREQ, 0, 'd' }, { "priv-keyring", OPTF_ARGREQ, 0, 'k' }, @@ -188,7 +193,7 @@ int main(int argc, char *argv[]) { 0, 0, 0, 0 } }; - int i = mdwopt(argc, argv, "hvu DU:G: p:d:k:K:t:a:" T("T:"), + int i = mdwopt(argc, argv, "hvu DU:G: b:p:d:k:K:t:a:" T("T:"), opts, 0, 0, 0); if (i < 0) break; @@ -232,7 +237,13 @@ int main(int argc, char *argv[]) die(EXIT_FAILURE, "group `%s' not found", optarg); g = gr->gr_gid; } break; - + + case 'b': { + struct hostent *h = gethostbyname(optarg); + if (!h) + die(EXIT_FAILURE, "unknown host name `%s'", optarg); + memcpy(&baddr, h->h_addr, sizeof(struct in_addr)); + } break; case 'p': { char *p; unsigned long i = strtoul(optarg, &p, 0); @@ -289,7 +300,7 @@ int main(int argc, char *argv[]) rand_seed(RAND_GLOBAL, RMD160_HASHSZ); signal(SIGPIPE, SIG_IGN); tun_init(); - p_init(port); + p_init(baddr, port); if (!(f & f_daemon)) a_create(STDIN_FILENO, STDOUT_FILENO); if (g != (gid_t)-1) { diff --git a/tripe.h b/tripe.h index 3c0a1541..1f73d6ba 100644 --- a/tripe.h +++ b/tripe.h @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: tripe.h,v 1.14 2003/04/06 10:36:33 mdw Exp $ + * $Id: tripe.h,v 1.15 2003/05/16 12:09:03 mdw Exp $ * * Main header file for TrIPE * @@ -29,6 +29,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: tripe.h,v $ + * Revision 1.15 2003/05/16 12:09:03 mdw + * Allow binding to a chosen address. + * * Revision 1.14 2003/04/06 10:36:33 mdw * Rearrange so as not to include Linux headers unless we need to. * @@ -893,14 +896,15 @@ extern const addr *p_addr(peer */*p*/); /* --- @p_init@ --- * * - * Arguments: @unsigned port@ = port number to listen to + * Arguments: @struct in_addr addr@ = address to bind to + * @unsigned port@ = port number to listen to * * Returns: --- * * Use: Initializes the peer system; creates the socket. */ -extern void p_init(unsigned /*port*/); +extern void p_init(struct in_addr /*addr*/, unsigned /*port*/); /* --- @p_port@ --- * * -- [mdw]