From 59ba39ae960714b31ef2c5aa4711ff21b5497c1f Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 29 Jul 2014 04:31:29 +0200 Subject: [PATCH] Add new package libpacketmark, a LD_PRELOAD library to manipulate packet marks --- libs/libpacketmark/Makefile | 34 +++++++++++++++ libs/libpacketmark/src/Makefile | 4 ++ libs/libpacketmark/src/libpacketmark.c | 60 ++++++++++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 libs/libpacketmark/Makefile create mode 100644 libs/libpacketmark/src/Makefile create mode 100644 libs/libpacketmark/src/libpacketmark.c diff --git a/libs/libpacketmark/Makefile b/libs/libpacketmark/Makefile new file mode 100644 index 0000000..6e359a0 --- /dev/null +++ b/libs/libpacketmark/Makefile @@ -0,0 +1,34 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=libpacketmark +PKG_VERSION:=1 + +PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/libpacketmark + SECTION:=libs + CATEGORY:=Libraries + TITLE:=Set default packet mark via LD_PRELOAD + DEPENDS:= +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) ./src/* $(PKG_BUILD_DIR)/ +endef + +define Build/Configure +endef + +define Build/Compile + CFLAGS="$(TARGET_CFLAGS)" CPPFLAGS="$(TARGET_CPPFLAGS)" $(MAKE) -C $(PKG_BUILD_DIR) $(TARGET_CONFIGURE_OPTS) +endef + +define Package/libpacketmark/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_BUILD_DIR)/libpacketmark.so $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,libpacketmark)) diff --git a/libs/libpacketmark/src/Makefile b/libs/libpacketmark/src/Makefile new file mode 100644 index 0000000..40e0d35 --- /dev/null +++ b/libs/libpacketmark/src/Makefile @@ -0,0 +1,4 @@ +all: libpacketmark.so + +libpacketmark.so: libpacketmark.c + $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -Wall -nostartfiles -shared -fPIC -o $@ $^ -ldl $(LDLIBS) diff --git a/libs/libpacketmark/src/libpacketmark.c b/libs/libpacketmark/src/libpacketmark.c new file mode 100644 index 0000000..4cc3fae --- /dev/null +++ b/libs/libpacketmark/src/libpacketmark.c @@ -0,0 +1,60 @@ +/* + Copyright (c) 2014, Matthias Schiffer + 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. +*/ + + +#define _GNU_SOURCE + +#include +#include +#include + +#include +#include + + +static int mark; +static int (*socket_real)(int domain, int type, int protocol); + + +void _init(void) { + const char *str = getenv("LIBPACKETMARK_MARK"); + if (str) + mark = atoi(str); + + socket_real = dlsym(RTLD_NEXT, "socket"); +} + + +int socket(int domain, int type, int protocol) { + int fd = socket_real(domain, type, protocol); + + if (fd >= 0) { + int errno_save = errno; + setsockopt(fd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)); + errno = errno_save; + } + + return fd; +}