diff --git a/libs/libplatforminfo/Makefile b/libs/libplatforminfo/Makefile new file mode 100644 index 0000000..3dc93a7 --- /dev/null +++ b/libs/libplatforminfo/Makefile @@ -0,0 +1,39 @@ +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/target.mk + +PKG_NAME:=libplatforminfo +PKG_VERSION:=1 +CMAKE_INSTALL:=1 + +PKG_LICENSE:=BSD-2-Clause + +PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk + +define Package/libplatforminfo + SECTION:=libs + CATEGORY:=Libraries + TITLE:=Platform information library + DEPENDS:=@(TARGET_ar71xx_generic||TARGET_ar71xx_nand||TARGET_mpc85xx_generic||TARGET_x86_generic||TARGET_x86_kvm_guest||TARGET_x86_64||TARGET_x86_xen_domu||TARGET_ramips_rt305x||TARGET_brcm2708_bcm2708||TARGET_brcm2708_bcm2709||TARGET_sunxi) +endef + +CMAKE_OPTIONS += \ + -DCMAKE_BUILD_TYPE:String="MINSIZEREL" \ + -DTARGET:STRING="$(BOARD)" \ + -DSUBTARGET:STRING="$(SUBTARGET)" + + + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) ./src/* $(PKG_BUILD_DIR)/ +endef + +define Package/libplatforminfo/install + $(INSTALL_DIR) $(1)/usr/lib + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/libplatforminfo.so $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,libplatforminfo)) diff --git a/libs/libplatforminfo/src/CMakeLists.txt b/libs/libplatforminfo/src/CMakeLists.txt new file mode 100644 index 0000000..54fd7bd --- /dev/null +++ b/libs/libplatforminfo/src/CMakeLists.txt @@ -0,0 +1,36 @@ +cmake_minimum_required(VERSION 2.6) +project(LIBPLATFORMINFO C) + +set(LIBDIR "lib${LIB_SUFFIX}") + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) + +set(TARGET "" CACHE STRING "OpenWrt target") +set(SUBTARGET "" CACHE STRING "OpenWrt subtarget") + +add_definitions(-DTARGET=${TARGET}) + +if(SUBTARGET) + set(FULL_TARGET "${TARGET}-${SUBTARGET}") + + add_definitions(-DSUBTARGET=${SUBTARGET} -DTARGET_${TARGET}_${SUBTARGET}) +else(SUBTARGET) + set(FULL_TARGET "${TARGET}") + + add_definitions(-DTARGET_${TARGET}) +endif(SUBTARGET) + +add_library(platforminfo SHARED + common.c + targets/${FULL_TARGET}.c +) +set_target_properties(platforminfo PROPERTIES + COMPILE_FLAGS "-Wall -std=c99 -D_GNU_SOURCE" +) +install(TARGETS platforminfo + ARCHIVE DESTINATION ${LIBDIR} + LIBRARY DESTINATION ${LIBDIR} +) + + +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/libplatforminfo.h DESTINATION include) diff --git a/libs/libplatforminfo/src/common.c b/libs/libplatforminfo/src/common.c new file mode 100644 index 0000000..51755ee --- /dev/null +++ b/libs/libplatforminfo/src/common.c @@ -0,0 +1,46 @@ +/* + Copyright (c) 2015, 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. +*/ + + +#include + +#include + + +#define _STRINGIFY(s) #s +#define STRINGIFY(s) _STRINGIFY(s) + + +const char * platforminfo_get_target(void) { + return STRINGIFY(TARGET); +} + +const char * platforminfo_get_subtarget(void) { +#ifdef SUBTARGET + return STRINGIFY(SUBTARGET); +#else + return NULL; +#endif +} diff --git a/libs/libplatforminfo/src/common.h b/libs/libplatforminfo/src/common.h new file mode 100644 index 0000000..11667b1 --- /dev/null +++ b/libs/libplatforminfo/src/common.h @@ -0,0 +1,92 @@ +/* + Copyright (c) 2015, 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. +*/ + + +#pragma once + + +#include +#include +#include +#include +#include + + +__attribute__((unused)) static char * read_line(const char *filename) { + FILE *f = fopen(filename, "r"); + if (!f) + return NULL; + + char *line = NULL; + size_t len = 0; + + ssize_t r = getline(&line, &len, f); + + fclose(f); + + if (r >= 0) { + len = strlen(line); + + if (len && line[len-1] == '\n') + line[len-1] = 0; + } + else { + free(line); + line = NULL; + } + + return line; +} + +__attribute__((unused)) static void sanitize_image_name(char **outp, char *in) { + char *out = malloc(strlen(in) + 1); + *outp = out; + + bool dot = false, dash = false; + + for (; *in; in++) { + if (*in == '.') { + dot = true; + continue; + } + + if (*in != '+' && !isalnum(*in)) { + dash = true; + continue; + } + + if (dash) + *out++ = '-'; + else if (dot) + *out++ = '.'; + + dash = false; + dot = false; + + *out++ = tolower(*in); + } + + *out = 0; +} diff --git a/libs/libplatforminfo/src/include/libplatforminfo.h b/libs/libplatforminfo/src/include/libplatforminfo.h new file mode 100644 index 0000000..b08830d --- /dev/null +++ b/libs/libplatforminfo/src/include/libplatforminfo.h @@ -0,0 +1,36 @@ +/* + Copyright (c) 2015, 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. +*/ + + +#ifndef _LIBPLATFORMINFO_H_ +#define _LIBPLATFORMINFO_H_ + +const char * platforminfo_get_target(void); +const char * platforminfo_get_subtarget(void); +const char * platforminfo_get_board_name(void); +const char * platforminfo_get_model(void); +const char * platforminfo_get_image_name(void); + +#endif /* _LIBPLATFORMINFO_H_ */ diff --git a/libs/libplatforminfo/src/targets/ar71xx-generic.c b/libs/libplatforminfo/src/targets/ar71xx-generic.c new file mode 120000 index 0000000..fb7d9ea --- /dev/null +++ b/libs/libplatforminfo/src/targets/ar71xx-generic.c @@ -0,0 +1 @@ +template/default.c \ No newline at end of file diff --git a/libs/libplatforminfo/src/targets/ar71xx-nand.c b/libs/libplatforminfo/src/targets/ar71xx-nand.c new file mode 120000 index 0000000..fb7d9ea --- /dev/null +++ b/libs/libplatforminfo/src/targets/ar71xx-nand.c @@ -0,0 +1 @@ +template/default.c \ No newline at end of file diff --git a/libs/libplatforminfo/src/targets/brcm2708-bcm2708.c b/libs/libplatforminfo/src/targets/brcm2708-bcm2708.c new file mode 120000 index 0000000..fb7d9ea --- /dev/null +++ b/libs/libplatforminfo/src/targets/brcm2708-bcm2708.c @@ -0,0 +1 @@ +template/default.c \ No newline at end of file diff --git a/libs/libplatforminfo/src/targets/brcm2708-bcm2709.c b/libs/libplatforminfo/src/targets/brcm2708-bcm2709.c new file mode 120000 index 0000000..fb7d9ea --- /dev/null +++ b/libs/libplatforminfo/src/targets/brcm2708-bcm2709.c @@ -0,0 +1 @@ +template/default.c \ No newline at end of file diff --git a/libs/libplatforminfo/src/targets/mpc85xx-generic.c b/libs/libplatforminfo/src/targets/mpc85xx-generic.c new file mode 120000 index 0000000..fb7d9ea --- /dev/null +++ b/libs/libplatforminfo/src/targets/mpc85xx-generic.c @@ -0,0 +1 @@ +template/default.c \ No newline at end of file diff --git a/libs/libplatforminfo/src/targets/ramips-rt305x.c b/libs/libplatforminfo/src/targets/ramips-rt305x.c new file mode 120000 index 0000000..fb7d9ea --- /dev/null +++ b/libs/libplatforminfo/src/targets/ramips-rt305x.c @@ -0,0 +1 @@ +template/default.c \ No newline at end of file diff --git a/libs/libplatforminfo/src/targets/sunxi.c b/libs/libplatforminfo/src/targets/sunxi.c new file mode 120000 index 0000000..fb7d9ea --- /dev/null +++ b/libs/libplatforminfo/src/targets/sunxi.c @@ -0,0 +1 @@ +template/default.c \ No newline at end of file diff --git a/libs/libplatforminfo/src/targets/template/default.c b/libs/libplatforminfo/src/targets/template/default.c new file mode 100644 index 0000000..232495a --- /dev/null +++ b/libs/libplatforminfo/src/targets/template/default.c @@ -0,0 +1,64 @@ +/* + Copyright (c) 2015, 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. +*/ + + +#include +#include "../common.h" + + +static char * board_name = NULL; +static char * model = NULL; +static char * image_name = NULL; + + +__attribute__((constructor)) static void init(void) { + board_name = read_line("/tmp/sysinfo/board_name"); + model = read_line("/tmp/sysinfo/model"); + + sanitize_image_name(&image_name, model); +} + +__attribute__((destructor)) static void deinit(void) { + free(board_name); + free(model); + free(image_name); + + board_name = NULL; + model = NULL; + image_name = NULL; +} + + +const char * platforminfo_get_board_name(void) { + return board_name; +} + +const char * platforminfo_get_model(void) { + return model; +} + +const char * platforminfo_get_image_name(void) { + return image_name; +} diff --git a/libs/libplatforminfo/src/targets/template/x86.c b/libs/libplatforminfo/src/targets/template/x86.c new file mode 100644 index 0000000..0ddafeb --- /dev/null +++ b/libs/libplatforminfo/src/targets/template/x86.c @@ -0,0 +1,107 @@ +/* + Copyright (c) 2015, 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. +*/ + + +#include +#include "../common.h" + + +#define _STRINGIFY(s) #s +#define STRINGIFY(s) _STRINGIFY(s) + + +static char * model = NULL; + + +__attribute__((constructor)) static void init(void) { + FILE *f = fopen("/proc/cpuinfo", "r"); + if (!f) + return; + + char *line = NULL; + size_t len = 0; + + while (getline(&line, &len, f) >= 0 && !model) { + if (strncmp(line, "model name", 10)) + continue; + + bool colon = false; + + char *p; + for (p = line + 10; *p; p++) { + if (isblank(*p)) + continue; + + if (!colon) { + if (*p == ':') { + colon = true; + continue; + } + else { + break; + } + } + + size_t len = strlen(p); + if (len && p[len-1] == '\n') + p[len-1] = 0; + + model = strdup(p); + break; + } + } + + free(line); + fclose(f); +} + +__attribute__((destructor)) static void deinit(void) { + free(model); + + model = NULL; +} + + +const char * platforminfo_get_board_name(void) { + return NULL; +} + +const char * platforminfo_get_model(void) { + return model; +} + +const char * platforminfo_get_image_name(void) { +#if defined(TARGET_x86_generic) + return "x86-generic"; +#elif defined(TARGET_x86_kvm_guest) + return "x86-kvm"; +#elif defined(TARGET_x86_xen_domu) + return "x86-xen"; +#elif defined(TARGET_x86_64) + return "x86-64"; +#else +#error Unknown x86 subtarget +#endif +} diff --git a/libs/libplatforminfo/src/targets/x86-64.c b/libs/libplatforminfo/src/targets/x86-64.c new file mode 120000 index 0000000..c6233a6 --- /dev/null +++ b/libs/libplatforminfo/src/targets/x86-64.c @@ -0,0 +1 @@ +template/x86.c \ No newline at end of file diff --git a/libs/libplatforminfo/src/targets/x86-generic.c b/libs/libplatforminfo/src/targets/x86-generic.c new file mode 120000 index 0000000..c6233a6 --- /dev/null +++ b/libs/libplatforminfo/src/targets/x86-generic.c @@ -0,0 +1 @@ +template/x86.c \ No newline at end of file diff --git a/libs/libplatforminfo/src/targets/x86-kvm_guest.c b/libs/libplatforminfo/src/targets/x86-kvm_guest.c new file mode 120000 index 0000000..c6233a6 --- /dev/null +++ b/libs/libplatforminfo/src/targets/x86-kvm_guest.c @@ -0,0 +1 @@ +template/x86.c \ No newline at end of file diff --git a/libs/libplatforminfo/src/targets/x86-xen_domu.c b/libs/libplatforminfo/src/targets/x86-xen_domu.c new file mode 120000 index 0000000..c6233a6 --- /dev/null +++ b/libs/libplatforminfo/src/targets/x86-xen_domu.c @@ -0,0 +1 @@ +template/x86.c \ No newline at end of file