From c111e07c4ac6e276c9399b56ca8fe342d78c96cc Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 8 Mar 2012 20:55:58 +0100 Subject: Moved some code --- src/CMakeLists.txt | 2 +- src/fastd.c | 182 ---------------------------------------------- src/fastd.h | 4 + src/method_null.c | 25 ++++--- src/peer.c | 1 - src/peer.h | 4 - src/printf.c | 209 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 227 insertions(+), 200 deletions(-) create mode 100644 src/printf.c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f4e3701..044ec80 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,2 +1,2 @@ -add_executable(fastd fastd.c handshake.c method_null.c peer.c queue.c task.c) +add_executable(fastd fastd.c handshake.c method_null.c peer.c printf.c queue.c task.c) target_link_libraries(fastd rt) diff --git a/src/fastd.c b/src/fastd.c index cd1f1df..dd6d2fa 100644 --- a/src/fastd.c +++ b/src/fastd.c @@ -46,188 +46,6 @@ extern fastd_method fastd_method_null; -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wformat-security" - -void fastd_printf(const fastd_context *ctx, const char *format, ...) { - va_list ap; - va_start(ap, format); - - char *format_dup = strdup(format); - char *str; - for (str = format_dup; *str; str++) { - if (*str != '%') { - fputc(*str, stderr); - continue; - } - - int len, flag_l = 0, flag_L = 0, flag_j = 0, flag_z = 0, flag_t = 0; - - for(len = 1; str[len]; len++) { - char last; - bool finished = true; - char addr_buf[INET6_ADDRSTRLEN]; - void *p; - fastd_eth_addr *eth_addr; - - switch (str[len]) { - case 'l': - flag_l++; - finished = false; - break; - - case 'L': - flag_L++; - finished = false; - break; - - case 'j': - flag_j++; - finished = false; - break; - - case 'z': - flag_z++; - finished = false; - break; - - case 't': - flag_t++; - finished = false; - break; - - case '%': - fputc('%', stderr); - break; - - case 'd': - case 'i': - case 'o': - case 'u': - case 'x': - case 'X': - last = str[len+1]; - str[len+1] = 0; - - if (flag_j) - fprintf(stderr, str, va_arg(ap, intmax_t)); - else if (flag_z) - fprintf(stderr, str, va_arg(ap, size_t)); - else if (flag_t) - fprintf(stderr, str, va_arg(ap, ptrdiff_t)); - else if (flag_l == 0) - fprintf(stderr, str, va_arg(ap, int)); - else if (flag_l == 1) - fprintf(stderr, str, va_arg(ap, long)); - else - fprintf(stderr, str, va_arg(ap, long long)); - - str[len+1] = last; - break; - - case 'e': - case 'f': - case 'F': - case 'g': - case 'G': - case 'a': - case 'A': - last = str[len+1]; - str[len+1] = 0; - - if (flag_L) - fprintf(stderr, str, va_arg(ap, long double)); - else - fprintf(stderr, str, va_arg(ap, double)); - - str[len+1] = last; - break; - - case 'c': - last = str[len+1]; - str[len+1] = 0; - - fprintf(stderr, str, va_arg(ap, int)); - - str[len+1] = last; - break; - - case 's': - case 'p': - last = str[len+1]; - str[len+1] = 0; - - fprintf(stderr, str, va_arg(ap, void*)); - - str[len+1] = last; - break; - - case 'm': - last = str[len+1]; - str[len+1] = 0; - - fprintf(stderr, str); - - str[len+1] = last; - break; - - case 'I': - p = va_arg(ap, void*); - - if (p) { - if (inet_ntop(flag_l ? AF_INET6 : AF_INET, p, addr_buf, sizeof(addr_buf))) - fprintf(stderr, "%s", addr_buf); - } - else { - fprintf(stderr, "(null)"); - } - break; - - case 'E': - eth_addr = va_arg(ap, fastd_eth_addr*); - - if (eth_addr) { - fprintf(stderr, "%02x:%02x:%02x:%02x:%02x:%02x", - eth_addr->data[0], eth_addr->data[1], eth_addr->data[2], - eth_addr->data[3], eth_addr->data[4], eth_addr->data[5]); - } - else { - fprintf(stderr, "(null)"); - } - break; - - case 'P': - p = va_arg(ap, void*); - - if (p) { - char* str = ctx->conf->method->peer_str(ctx, (fastd_peer*)p); - fprintf(stderr, "%s", str); - free(str); - } - else { - fprintf(stderr, "(null)"); - } - break; - - default: - finished = false; - } - - if (finished) { - str += len; - break; - } - } - } - - free(format_dup); - - va_end(ap); -} - -#pragma GCC diagnostic pop - - static void init_tuntap(fastd_context *ctx) { struct ifreq ifr; diff --git a/src/fastd.h b/src/fastd.h index 93ebf95..fa0fa98 100644 --- a/src/fastd.h +++ b/src/fastd.h @@ -52,6 +52,10 @@ struct _fastd_buffer { size_t len; }; +struct _fastd_eth_addr { + uint8_t data[ETH_ALEN]; +}; + struct _fastd_method { const char *name; diff --git a/src/method_null.c b/src/method_null.c index 62be501..eb9ff64 100644 --- a/src/method_null.c +++ b/src/method_null.c @@ -24,6 +24,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + #define _GNU_SOURCE #include "fastd.h" @@ -34,7 +35,7 @@ -static bool null_check_config(fastd_context *ctx, const fastd_config *conf) { +static bool method_check_config(fastd_context *ctx, const fastd_config *conf) { if (conf->n_floating > 1) { pr_error(ctx, "with method `null' use can't define more than one floating peer"); return false; @@ -43,11 +44,11 @@ static bool null_check_config(fastd_context *ctx, const fastd_config *conf) { return true; } -static size_t null_max_packet_size(fastd_context *ctx) { +static size_t method_max_packet_size(fastd_context *ctx) { return fastd_max_packet_size(ctx); } -static char* null_peer_str(const fastd_context *ctx, const fastd_peer *peer) { +static char* method_peer_str(const fastd_context *ctx, const fastd_peer *peer) { char addr_buf[INET6_ADDRSTRLEN] = ""; char *ret; @@ -80,11 +81,11 @@ static char* null_peer_str(const fastd_context *ctx, const fastd_peer *peer) { return NULL; } -static void null_init(fastd_context *ctx, fastd_peer *peer) { +static void method_init(fastd_context *ctx, fastd_peer *peer) { fastd_task_put_send(ctx, peer, fastd_buffer_alloc(0, 0, 0)); } -static void null_handle_recv(fastd_context *ctx, fastd_peer *peer, fastd_buffer buffer) { +static void method_handle_recv(fastd_context *ctx, fastd_peer *peer, fastd_buffer buffer) { if (!fastd_peer_is_established(peer)) { fastd_peer_set_established(ctx, peer); } @@ -110,7 +111,7 @@ static void null_handle_recv(fastd_context *ctx, fastd_peer *peer, fastd_buffer fastd_buffer_free(buffer); } -static void null_send(fastd_context *ctx, fastd_peer *peer, fastd_buffer buffer) { +static void method_send(fastd_context *ctx, fastd_peer *peer, fastd_buffer buffer) { fastd_task_put_send(ctx, peer, buffer); } @@ -118,13 +119,13 @@ static void null_send(fastd_context *ctx, fastd_peer *peer, fastd_buffer buffer) const fastd_method fastd_method_null = { .name = "null", - .check_config = null_check_config, + .check_config = method_check_config, - .max_packet_size = null_max_packet_size, + .max_packet_size = method_max_packet_size, - .peer_str = null_peer_str, + .peer_str = method_peer_str, - .init = null_init, - .handle_recv = null_handle_recv, - .send = null_send, + .init = method_init, + .handle_recv = method_handle_recv, + .send = method_send, }; diff --git a/src/peer.c b/src/peer.c index baebebb..98eebe9 100644 --- a/src/peer.c +++ b/src/peer.c @@ -63,7 +63,6 @@ static inline void reset_peer(fastd_context *ctx, fastd_peer *peer) { ctx->n_eth_addr -= deleted; fastd_task_delete_peer(ctx, peer); - } static inline void setup_peer(fastd_context *ctx, fastd_peer *peer) { diff --git a/src/peer.h b/src/peer.h index 4668243..696dae6 100644 --- a/src/peer.h +++ b/src/peer.h @@ -56,10 +56,6 @@ struct _fastd_peer_config { fastd_peer_address address; }; -struct _fastd_eth_addr { - uint8_t data[ETH_ALEN]; -}; - struct _fastd_peer_eth_addr { fastd_eth_addr addr; fastd_peer *peer; diff --git a/src/printf.c b/src/printf.c new file mode 100644 index 0000000..72bc941 --- /dev/null +++ b/src/printf.c @@ -0,0 +1,209 @@ +/* + Copyright (c) 2012, Matthias Schiffer + Partly based on QuickTun Copyright (c) 2010, Ivo Smits . + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "fastd.h" + +#include + + +#pragma GCC diagnostic ignored "-Wformat-security" + +void fastd_printf(const fastd_context *ctx, const char *format, ...) { + va_list ap; + va_start(ap, format); + + char *format_dup = strdup(format); + char *str; + for (str = format_dup; *str; str++) { + if (*str != '%') { + fputc(*str, stderr); + continue; + } + + int len, flag_l = 0, flag_L = 0, flag_j = 0, flag_z = 0, flag_t = 0; + + for(len = 1; str[len]; len++) { + char last; + bool finished = true; + char addr_buf[INET6_ADDRSTRLEN]; + void *p; + fastd_eth_addr *eth_addr; + + switch (str[len]) { + case 'l': + flag_l++; + finished = false; + break; + + case 'L': + flag_L++; + finished = false; + break; + + case 'j': + flag_j++; + finished = false; + break; + + case 'z': + flag_z++; + finished = false; + break; + + case 't': + flag_t++; + finished = false; + break; + + case '%': + fputc('%', stderr); + break; + + case 'd': + case 'i': + case 'o': + case 'u': + case 'x': + case 'X': + last = str[len+1]; + str[len+1] = 0; + + if (flag_j) + fprintf(stderr, str, va_arg(ap, intmax_t)); + else if (flag_z) + fprintf(stderr, str, va_arg(ap, size_t)); + else if (flag_t) + fprintf(stderr, str, va_arg(ap, ptrdiff_t)); + else if (flag_l == 0) + fprintf(stderr, str, va_arg(ap, int)); + else if (flag_l == 1) + fprintf(stderr, str, va_arg(ap, long)); + else + fprintf(stderr, str, va_arg(ap, long long)); + + str[len+1] = last; + break; + + case 'e': + case 'f': + case 'F': + case 'g': + case 'G': + case 'a': + case 'A': + last = str[len+1]; + str[len+1] = 0; + + if (flag_L) + fprintf(stderr, str, va_arg(ap, long double)); + else + fprintf(stderr, str, va_arg(ap, double)); + + str[len+1] = last; + break; + + case 'c': + last = str[len+1]; + str[len+1] = 0; + + fprintf(stderr, str, va_arg(ap, int)); + + str[len+1] = last; + break; + + case 's': + case 'p': + last = str[len+1]; + str[len+1] = 0; + + fprintf(stderr, str, va_arg(ap, void*)); + + str[len+1] = last; + break; + + case 'm': + last = str[len+1]; + str[len+1] = 0; + + fprintf(stderr, str); + + str[len+1] = last; + break; + + case 'I': + p = va_arg(ap, void*); + + if (p) { + if (inet_ntop(flag_l ? AF_INET6 : AF_INET, p, addr_buf, sizeof(addr_buf))) + fprintf(stderr, "%s", addr_buf); + } + else { + fprintf(stderr, "(null)"); + } + break; + + case 'E': + eth_addr = va_arg(ap, fastd_eth_addr*); + + if (eth_addr) { + fprintf(stderr, "%02x:%02x:%02x:%02x:%02x:%02x", + eth_addr->data[0], eth_addr->data[1], eth_addr->data[2], + eth_addr->data[3], eth_addr->data[4], eth_addr->data[5]); + } + else { + fprintf(stderr, "(null)"); + } + break; + + case 'P': + p = va_arg(ap, void*); + + if (p) { + char* str = ctx->conf->method->peer_str(ctx, (fastd_peer*)p); + fprintf(stderr, "%s", str); + free(str); + } + else { + fprintf(stderr, "(null)"); + } + break; + + default: + finished = false; + } + + if (finished) { + str += len; + break; + } + } + } + + free(format_dup); + + va_end(ap); +} -- cgit v1.2.3