PROJECT(sf_dynamic_initialize_lib)

macro(sf_dynamic_preproc_lib targetFile)
	add_custom_command(
		OUTPUT ${targetFile}
		COMMAND "${CMAKE_COMMAND}" -E copy "${snortSrcRoot}/dynamic-plugins/sf_preproc_example/sf_dynamic_preproc_lib.c" ${targetFile}
		DEPENDS ${snortSrcRoot}/dynamic-plugins/sf_preproc_example/sf_dynamic_preproc_lib.c
	)	
endmacro(sf_dynamic_preproc_lib)

add_definitions(-DSF_SNORT_PREPROC_DLL -DACTIVE_RESPONSE)

set(sf_dynamicInitializeDest "${CMAKE_CURRENT_BINARY_DIR}/include" CACHE INTERNAL "-" FORCE)

KERIO_TARGET(sf_dynamic_initialize_lib static)

set (copyFiles
	preprocids.h
	profiler.h
	cpuclock.h
	pcap_pkthdr32.h
	snort_bounds.h
	sf_types.h
	rule_option_types.h
	event.h
	dynamic-plugins/sf_dynamic_common.h
	dynamic-plugins/sf_dynamic_engine.h
	dynamic-plugins/sf_dynamic_define.h
	dynamic-plugins/sf_dynamic_meta.h
	#dynamic-plugins/sf_preproc_example/sf_dynamic_preproc_lib.c
	dynamic-plugins/sf_preproc_example/sf_dynamic_preproc_lib.h
	sfutil/sfghash.h
	sfutil/sfhashfcn.h
	sfutil/bitop.h
	sfutil/sf_ip.h
	sfutil/sf_ip.c
	sfutil/sf_ipvar.h
	sfutil/sf_vartable.h
	sfutil/sfrt.h
	sfutil/sfrt.c
	sfutil/sfrt_dir.h
	sfutil/sfrt_dir.c
	sfutil/sfrt_flat.h
	sfutil/sfrt_flat.c
	sfutil/sfrt_flat_dir.h
	sfutil/sfrt_flat_dir.c
	sfutil/sfrt_trie.h
	sfutil/segment_mem.c
	sfutil/segment_mem.h
	sfutil/util_unfold.h
	sfutil/util_unfold.c
	sfutil/sf_base64decode.h
	sfutil/sf_base64decode.c
	sfutil/sf_email_attach_decode.h
	sfutil/Unified2_common.h
#	dynamic-plugins/sf_engine/examples/sfsnort_dynamic_detection_lib.c
	dynamic-plugins/sf_engine/examples/sfsnort_dynamic_detection_lib.h
	dynamic-plugins/sf_engine/sf_snort_packet.h
	sf_protocols.h
	dynamic-plugins/sf_engine/sf_snort_plugin_api.h
	dynamic-plugins/sf_engine/sf_decompression.h
	plugin_enum.h
	control/sfcontrol.h
	idle_processing.h
	sfutil/sf_seqnums.h
	file-process/file_api.h
	file-process/libs/file_lib.h
	
	file-process/libs/file_config.h
	file-process/file_service_config.h
)

foreach (srcFile ${copyFiles})
	get_filename_component(destFile ${srcFile} NAME)
	set (destFile ${sf_dynamicInitializeDest}/${destFile})

	add_custom_command(
		OUTPUT ${destFile}
		COMMAND "${CMAKE_COMMAND}" -E make_directory ${sf_dynamicInitializeDest}
		COMMAND "${CMAKE_COMMAND}" -E copy "${snortSrcRoot}/${srcFile}" "${destFile}"
		DEPENDS ${snortSrcRoot}/${srcFile}
	)

	set (sf_dynamic_initialize_lib_SOURCES ${sf_dynamic_initialize_lib_SOURCES} ${destFile})
endforeach (srcFile ${copyFiles})

set (massageFiles
	obfuscation.h
	dynamic-plugins/sf_dynamic_preprocessor.h
	preprocessors/stream_api.h
	preprocessors/str_search.h
)

foreach (massageSrcFile ${massageFiles})
	get_filename_component(massageDestFile ${massageSrcFile} NAME)
	set (massageDestFile ${sf_dynamicInitializeDest}/${massageDestFile})

	add_custom_command(
		OUTPUT ${massageDestFile}
		COMMAND "${CMAKE_COMMAND}" -E make_directory ${sf_dynamicInitializeDest}
		COMMAND "${sedCommand}" -e \"s/Packet /SFSnortPacket /\" -e \"s/SnortPktHdr /SFSnortPktHdr /\" -e \"s/decode\\.h/sf_snort_packet.h/\" -e \"/sfportobject\\.h/d\" -e \"s/PortObject \\*/void */g\" "${snortSrcRoot}/${massageSrcFile}" > "${massageDestFile}"
		DEPENDS ${snortSrcRoot}/${massageSrcFile}
	)

	set (sf_dynamic_initialize_lib_SOURCES ${sf_dynamic_initialize_lib_SOURCES} ${massageDestFile})
endforeach (massageSrcFile ${massageFiles})

set(errMsgAndPolicyTweakedFiles
	mempool.h
	mempool.c
	sf_sdlist.h
	sf_sdlist_types.h
	sf_sdlist.c
	sfutil/sf_email_attach_decode.c
)

foreach (massageSrcFile ${errMsgAndPolicyTweakedFiles})
	get_filename_component(massageDestFile ${massageSrcFile} NAME)
	set (massageDestFile ${sf_dynamicInitializeDest}/${massageDestFile})

	add_custom_command(
		OUTPUT ${massageDestFile}
		COMMAND "${CMAKE_COMMAND}" -E make_directory ${sf_dynamicInitializeDest}
		COMMAND "${sedCommand}" -e \"s/ErrorMessage/_dpd.errMsg/\" -e \"s/LogMessage /_dpd.logMsg /\" -e \"/util.h/d\" ${snortSrcRoot}/${massageSrcFile} > "${massageDestFile}.PartiallySeded"
		COMMAND "${sedCommand}" -e \"/SharedObjectAddStarts/d\" -e \"/SharedObjectAddEnds/d\" -e \"/SharedObjectDeleteBegins/,/SharedObjectDeleteEnds/d\" -e \"s/getDefaultPolicy\(\)/_dpd.getDefaultPolicy\(\)/\" -e \"s/SnortStrnStr/_dpd.SnortStrnStr/\" "${massageDestFile}.PartiallySeded" > ${massageDestFile}
		DEPENDS ${snortSrcRoot}/${massageSrcFile}
	)

	set (sf_dynamic_initialize_lib_SOURCES ${sf_dynamic_initialize_lib_SOURCES} ${massageDestFile})
endforeach (massageSrcFile ${errMsgAndPolicyTweakedFiles})

set(policyTweakedFiles
	sfutil/sfPolicyUserData.c
	sfutil/sfPolicyUserData.h
	sfutil/sfPolicy.h
)

foreach (massageSrcFile ${policyTweakedFiles})
	get_filename_component(massageDestFile ${massageSrcFile} NAME)
	set (massageDestFile ${sf_dynamicInitializeDest}/${massageDestFile})

	add_custom_command(
		OUTPUT ${massageDestFile}
		COMMAND "${CMAKE_COMMAND}" -E make_directory ${sf_dynamicInitializeDest}
		COMMAND "${sedCommand}" -e \"/SharedObjectAddStarts/d\" -e \"/SharedObjectAddEnds/d\" -e \"/SharedObjectDeleteBegins/,/SharedObjectDeleteEnds/d\" -e \"s/getDefaultPolicy\(\)/_dpd.getDefaultPolicy\(\)/\" -e \"s/SnortStrnStr/_dpd.SnortStrnStr/\" ${snortSrcRoot}/${massageSrcFile} > ${massageDestFile}
		DEPENDS ${snortSrcRoot}/${massageSrcFile}
	)

	set (sf_dynamic_initialize_lib_SOURCES ${sf_dynamic_initialize_lib_SOURCES} ${massageDestFile})
endforeach (massageSrcFile ${policyTweakedFiles})

set (nodistPreprocFiles
	dynamic-preprocessors/libs/sf_preproc_info.h
)

set(extraDist
	dynamic-examples/dynamic-rule/detection_lib_meta.h
)

set(additionalCopyFiles
	${nodistPreprocFiles}
	${extraDist}
)

foreach (srcFile ${additionalCopyFiles})
	get_filename_component(destFile ${srcFile} NAME)
	set (destFile ${sf_dynamicInitializeDest}/${destFile})
	
	add_custom_command(
		OUTPUT ${destFile}
		COMMAND "${CMAKE_COMMAND}" -E make_directory ${sf_dynamicInitializeDest}
		COMMAND "${CMAKE_COMMAND}" -E copy "${snortSrcRoot}/${srcFile}" "${destFile}"
		DEPENDS ${snortSrcRoot}/${srcFile}
	)

	set (sf_dynamic_initialize_lib_SOURCES ${sf_dynamic_initialize_lib_SOURCES} ${destFile})
endforeach (srcFile ${additionalCopyFiles})

set (copyTreeNodeHeaders
	treenodes.h
	signature.h
)

foreach (srcFile ${copyTreeNodeHeaders})
	get_filename_component(destFile ${srcFile} NAME)
	set (destFile ${sf_dynamicInitializeDest}/${destFile})
	
	add_custom_command(
		OUTPUT ${destFile}
		COMMAND "${CMAKE_COMMAND}" -E make_directory ${sf_dynamicInitializeDest}
		COMMAND "${sedCommand}" -f ${CMAKE_CURRENT_SOURCE_DIR}/treenodes.sed ${snortSrcRoot}/${srcFile} > ${destFile}
		DEPENDS ${snortSrcRoot}/${srcFile}
	)

	set (sf_dynamic_initialize_lib_SOURCES ${sf_dynamic_initialize_lib_SOURCES} ${destFile})
endforeach (srcFile ${copyTreeNodeHeaders})

add_custom_command(
	OUTPUT ${sf_dynamicInitializeDest}/snort_debug.h
	COMMAND "${CMAKE_COMMAND}" -E make_directory ${sf_dynamicInitializeDest}
	COMMAND "${sedCommand}" -e \"s/DebugMessageFile = /*_dpd.debugMsgFile = /\" -e \"s/DebugMessageLine = /*_dpd.debugMsgLine = /\" -e \"s/\; DebugMessageFunc${dollarSign}/\; _dpd.debugMsg/\" -e \"s/\; DebugWideMessageFunc${dollarSign}/\; _dpd.debugWideMsg/\" ${snortSrcRoot}/snort_debug.h > ${sf_dynamicInitializeDest}/snort_debug.h
	DEPENDS ${snortSrcRoot}/snort_debug.h
)

add_custom_command(
	OUTPUT ${sf_dynamicInitializeDest}/ipv6_port.h
	COMMAND "${CMAKE_COMMAND}" -E make_directory ${sf_dynamicInitializeDest}
	COMMAND "${sedCommand}" -e \"s/->iph->ip_src/->ip4_header->source/\" -e \"s/->iph->ip_dst/->ip4_header->destination/\" -e \"s/->iph->/->ip4_header->/\" -e \"s/->iph${dollarSign}${dollarSign}/->ip4_header/\" -e \"s/orig_iph/orig_ip4_header/\" -e \"s/ip_verhl/version_headerlength/\" -e \"s/ip_tos/type_service/\" -e \"s/ip_len/data_length/\" -e \"s/ip_id/identifier/\" -e \"s/ip_off/offset/\" -e \"s/ip_ttl/time_to_live/\" -e \"s/ip_proto/proto/\" -e \"s/ip_csum/checksum/\" -e \"s/p->iph${dollarSign}/p->ip4_header/\" ${snortSrcRoot}/ipv6_port.h > ${sf_dynamicInitializeDest}/ipv6_port.h
	DEPENDS ${snortSrcRoot}/ipv6_port.h
)

set (sf_dynamic_initialize_lib_SOURCES
	${sf_dynamic_initialize_lib_SOURCES}
	${sf_dynamicInitializeDest}/snort_debug.h
	${sf_dynamicInitializeDest}/ipv6_port.h
	${sf_dynamicInitializeDest}/str_search.h
	${sf_dynamicInitializeDest}/stream_api.h
)
set_source_files_properties(${sf_dynamic_initialize_lib_SOURCES} PROPERTIES GENERATED true)

KERIO_ADD_INCLUDES_DIR(sf_dynamic_initialize_lib ${sf_dynamicInitializeDest})
KERIO_ADD_INCLUDES_DIR(sf_dynamic_initialize_lib ${daqIncludeDest})
configHIncludeDir(${PROJECT_NAME})

KERIO_TARGET_DONE(sf_dynamic_initialize_lib)

add_subdirectory(libs)
add_subdirectory(dcerpc2)
add_subdirectory(dns)
add_subdirectory(smtp)
add_subdirectory(ftptelnet)
add_subdirectory(ssh)
add_subdirectory(ssl)
add_subdirectory(imap)
add_subdirectory(pop)
add_subdirectory(sip)
