aboutsummaryrefslogtreecommitdiffstats
path: root/src/checksum
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2009-06-22 12:47:09 +0200
committerMartin Willi <martin@strongswan.org>2009-06-22 15:47:18 +0200
commit67a7bb02ef539154fc187fa17c024d380a665b09 (patch)
treec91e55c594cc4ed5c3f290dfb5f1fba543141d0b /src/checksum
parente4e6a77a803c7acca408b54801fd369f172ba9fe (diff)
downloadstrongswan-67a7bb02ef539154fc187fa17c024d380a665b09.tar.bz2
strongswan-67a7bb02ef539154fc187fa17c024d380a665b09.tar.xz
moved checksum_builder/libchechsum to top srcdir to respect build order
Diffstat (limited to 'src/checksum')
-rw-r--r--src/checksum/.gitignore2
-rw-r--r--src/checksum/Makefile.am17
-rw-r--r--src/checksum/checksum_builder.c114
3 files changed, 133 insertions, 0 deletions
diff --git a/src/checksum/.gitignore b/src/checksum/.gitignore
new file mode 100644
index 000000000..9956b9d01
--- /dev/null
+++ b/src/checksum/.gitignore
@@ -0,0 +1,2 @@
+checksum.c
+checksum_builder
diff --git a/src/checksum/Makefile.am b/src/checksum/Makefile.am
new file mode 100644
index 000000000..aaed128dc
--- /dev/null
+++ b/src/checksum/Makefile.am
@@ -0,0 +1,17 @@
+ipsec_LTLIBRARIES = libchecksum.la
+noinst_PROGRAMS = checksum_builder
+
+libchecksum_la_SOURCES = checksum.c
+
+checksum_builder_SOURCES = checksum_builder.c
+checksum_builder_LDADD = $(top_builddir)/src/libstrongswan/libstrongswan.la
+
+BUILT_SOURCES = checksum.c
+CLEANFILES = checksum.c checksum_builder
+INCLUDES = -I$(top_srcdir)/src/libstrongswan
+AM_CFLAGS = -rdynamic
+
+libs = $(shell find $(top_builddir)/src -name 'libstrongswan*.so')
+
+checksum.c : checksum_builder $(libs)
+ ./checksum_builder $(libs) > checksum.c
diff --git a/src/checksum/checksum_builder.c b/src/checksum/checksum_builder.c
new file mode 100644
index 000000000..b917e1128
--- /dev/null
+++ b/src/checksum/checksum_builder.c
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2009 Martin Willi
+ * Hochschule fuer Technik Rapperswil, Switzerland
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <dlfcn.h>
+
+#include <library.h>
+
+/* we need to fake some charon symbols to dlopen() its plugins */
+void *eap_type_names, *auth_class_names, *charon, *protocol_id_names,
+*action_names, *ipsec_mode_names, *ike_sa_state_names, *child_sa_state_names,
+*proposal_create_default, *peer_cfg_create, *ike_cfg_create, *child_cfg_create,
+*traffic_selector_create_dynamic, *callback_job_create, *delete_ike_sa_job_create,
+*eap_type_from_string, *auth_cfg_create, *proposal_create_from_string,
+*traffic_selector_create_from_subnet, *traffic_selector_create_from_bytes,
+*eap_payload_create_data, *ike_sa_create, *child_sa_create, *policy_dir_names,
+*controller_cb_empty, *proposal_create, *ipcomp_transform_names,
+*traffic_selector_create_from_string, *update_sa_job_create, *ike_sa_id_create,
+*rekey_child_sa_job_create, *roam_job_create, *migrate_job_create,
+*acquire_job_create, *delete_child_sa_job_create, *debug_names;
+
+int main(int argc, char* argv[])
+{
+ int i;
+ integrity_checker_t *integrity;
+
+ /* avoid confusing leak reports in build process */
+ setenv("LEAK_DETECTIVE_DISABLE", "1", 0);
+ library_init(NULL);
+ atexit(library_deinit);
+
+ integrity = integrity_checker_create(NULL);
+
+ printf("/**\n");
+ printf(" * checksums of files and loaded code segments.\n");
+ printf(" * created by %s\n", argv[0]);
+ printf(" */\n");
+ printf("\n");
+ printf("#include <library.h>\n");
+ printf("\n");
+ printf("integrity_checksum_t checksums[] = {\n");
+ for (i = 1; i < argc; i++)
+ {
+ char *name, *path, *sname;
+ void *handle, *symbol;
+ u_int32_t fsum, ssum;
+
+ path = argv[i];
+
+ if ((name = strstr(path, "libstrongswan-")))
+ {
+ name = strdup(name + strlen("libstrongswan-"));
+ name[strlen(name) - 3] = '"';
+ name[strlen(name) - 2] = ',';
+ name[strlen(name) - 1] = '\0';
+ sname = "plugin_create";
+ }
+ else if (strstr(path, "libstrongswan.so"))
+ {
+ name = strdup("libstrongswan\",");
+ sname = "library_init";
+ }
+ else
+ {
+ fprintf(stderr, "don't know how to handle '%s', ignored", path);
+ continue;
+ }
+
+ fsum = integrity->build_file(integrity, path);
+ ssum = 0;
+ handle = dlopen(path, RTLD_LAZY);
+ if (handle)
+ {
+ symbol = dlsym(handle, sname);
+ if (symbol)
+ {
+ ssum = integrity->build_segment(integrity, symbol);
+ }
+ else
+ {
+ fprintf(stderr, "symbol lookup failed: %s\n", dlerror());
+ }
+ dlclose(handle);
+ }
+ else
+ {
+ fprintf(stderr, "dlopen failed: %s\n", dlerror());
+ }
+
+ printf("\t{\"%-20s0x%08x, 0x%08x},\n", name, fsum, ssum);
+ free(name);
+ }
+ printf("};\n");
+ printf("\n");
+ printf("int checksum_count = countof(checksums);\n");
+ printf("\n");
+ integrity->destroy(integrity);
+
+ exit(0);
+}
+