From 441debc4c7ac19fb3d3305a5aff21c3bb989c9b9 Mon Sep 17 00:00:00 2001 From: Lars Kellogg-Stedman Date: Tue, 27 Feb 2018 11:24:58 -0500 Subject: [PATCH] teach fiche about binding to a specific address Add the -L option which permits fiche to bind to a specific local address rather than INADDR_ANY. --- README.md | 2 +- fiche.c | 7 +++++-- fiche.h | 5 +++++ main.c | 13 ++++++++++--- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1ccc738..2e62b86 100644 --- a/README.md +++ b/README.md @@ -137,7 +137,7 @@ To use fiche you have to have netcat installed. You probably already have it - t ``` usage: fiche [-D6epbsdSolBuw]. - [-d domain] [-p port] [-s slug size] + [-d domain] [-L listen_addr ] [-p port] [-s slug size] [-o output directory] [-B buffer size] [-u user name] [-l log file] [-b banlist] [-w whitelist] [-S] ``` diff --git a/fiche.c b/fiche.c index c0bbe8d..99d140d 100644 --- a/fiche.c +++ b/fiche.c @@ -197,6 +197,8 @@ void fiche_init(Fiche_Settings *settings) { "example.com", // output dir "code", + // listen_addr + "0.0.0.0", // port 9999, // slug length @@ -442,7 +444,7 @@ static int start_server(Fiche_Settings *settings) { // Prepare address and port handler struct sockaddr_in address; address.sin_family = AF_INET; - address.sin_addr.s_addr = INADDR_ANY; + address.sin_addr.s_addr = inet_addr(settings->listen_addr); address.sin_port = htons(settings->port); // Bind to port @@ -457,7 +459,8 @@ static int start_server(Fiche_Settings *settings) { return -1; } - print_status("Server started listening on port: %d.", settings->port); + print_status("Server started listening on: %s:%d.", + settings->listen_addr, settings->port); print_separator(); // Run dispatching loop diff --git a/fiche.h b/fiche.h index 9b4cf47..b1c97a2 100644 --- a/fiche.h +++ b/fiche.h @@ -43,6 +43,11 @@ typedef struct Fiche_Settings { */ char *output_dir_path; + /** + * @brief Address on which fiche is waiting for connections + */ + char *listen_addr; + /** * @brief Port on which fiche is waiting for connections */ diff --git a/main.c b/main.c index 1d977a6..da503c0 100644 --- a/main.c +++ b/main.c @@ -44,7 +44,7 @@ int main(int argc, char **argv) { // Parse input arguments int c; - while ((c = getopt(argc, argv, "D6eSp:b:s:d:o:l:B:u:w:")) != -1) { + while ((c = getopt(argc, argv, "D6eSL:p:b:s:d:o:l:B:u:w:")) != -1) { switch (c) { // domain @@ -61,6 +61,13 @@ int main(int argc, char **argv) { } break; + // listen_addr + case 'L': + { + fs.listen_addr = optarg; + } + break; + // slug size case 's': { @@ -120,8 +127,8 @@ int main(int argc, char **argv) { // Display help in case of any unsupported argument default: { - printf("usage: fiche [-dpsSoBulbw].\n"); - printf(" [-d domain] [-p port] [-s slug size]\n"); + printf("usage: fiche [-dLpsSoBulbw].\n"); + printf(" [-d domain] [-L listen_addr] [-p port] [-s slug size]\n"); printf(" [-o output directory] [-B buffer size] [-u user name]\n"); printf(" [-l log file] [-b banlist] [-w whitelist] [-S]\n"); return 0;