在hyperscan使用过程中,调用流模式或者块模式进行匹配之后,经常需要一个回调函数来告知使用者匹配的结果,这样回调函数onMatch就应运而生。
首先我们先来看一下定义
typedef int( * match_event_handler)(unsigned int id, unsigned long long from, unsigned long long to, unsigned int flags, void *context)
从定义我们可以看出,回调函数包含的参数包括:索引,从哪里开始,到哪里结束,标志位,用户提供给匹配函数的指针。
通过设置,用户可以将指针指向预先设置好的结构体,以便将匹配结果输出。
调用hs_scan(),hs_scan_vector()或hs_scan_stream()函数(或其他可以产生匹配的流调用)的应用程序必须提供与定义类型匹配的回调函数。 只要在执行扫描期间匹配位于目标数据中,就会调用此回调函数。匹配的详细信息作为参数传递给回调函数,回调函数应返回一个值,指示是否应继续匹配目标数据。如果扫描调用不需要回调,则可以使用NULL以抑制匹配结果生成。
此回调函数不应尝试在同一个流上调用Hyperscan API函数,也不应尝试重用为导致触发它的API调用分配的临时空间。使用完全独立的参数再次调用Hyperscan库应该可以工作(例如,在新流中扫描不同的数据库并使用新的临时空间),但重用流状态和/或暂存空间等数据结构将产生未定义的行为。
返回值
如果匹配应该停止,则为非零,否则为零。如果在流模式下执行扫描并返回非零值,则对该流的任何后续hs_scan_stream()调用将立即返回HS_SCAN_TERMINATED。
参数
id:匹配的表达式的ID号。如果表达式是使用hs_compile()编译的单个表达式,则此值将为零。
FROM: 如果为当前模式启用了匹配开始标志,则该参数将设置为模式的匹配开始,假设匹配值的开始位于由SOM_HORIZON模式之一选择的当前“匹配范围的开始”内标志。 如果匹配开始值位于此范围之外(仅在SOM_HORIZON值不是HS_MODE_SOM_HORIZON_LARGE时可能),则from值将设置为HS_OFFSET_PAST_HORIZON。 如果未对给定模式启用匹配开始标志,则此参数将设置为零。
to:与表达式匹配的最后一个字节后的偏移量。
flags:目前尚未使用。
context:用户提供给hs_scan(),hs_scan_vector()或hs_scan_stream()函数的指针。