static bool nl_new(struct dionaea *d) { g_debug("%s", __PRETTY_FUNCTION__); nl_runtime.sock = nl_socket_alloc(); struct nl_sock *sock = nl_runtime.sock; nl_socket_disable_seq_check(sock); nl_socket_modify_cb(sock, NL_CB_VALID, NL_CB_CUSTOM, nl_event_input, NULL); nl_join_groups(sock, RTMGRP_LINK); int err; if ( (err = nl_connect(sock, NETLINK_ROUTE)) < 0) { g_error("Could not connect netlink (%s)", nl_geterror(err)); } nl_socket_add_membership(sock, RTNLGRP_LINK); nl_socket_add_membership(sock, RTNLGRP_NEIGH); nl_socket_add_membership(sock, RTNLGRP_IPV4_IFADDR); nl_socket_add_membership(sock, RTNLGRP_IPV6_IFADDR); if( (err=rtnl_neigh_alloc_cache(sock, &nl_runtime.neigh_cache)) != 0 ) { g_error("Could not allocate neigh cache! (%s)", nl_geterror(err)); } #if LIBNL_RTNL_LINK_ALLOC_CACHE_ARGC == 3 if( (err=rtnl_link_alloc_cache(sock, AF_UNSPEC, &nl_runtime.link_cache)) != 0 ) #elif LIBNL_RTNL_LINK_ALLOC_CACHE_ARGC == 2 if( (err=rtnl_link_alloc_cache(sock, &nl_runtime.link_cache)) != 0 ) #endif { g_error("Could not allocate link cache! (%s)", nl_geterror(err)); } if( (err=rtnl_addr_alloc_cache(sock, &nl_runtime.addr_cache)) != 0 ) { g_error("Could not allocate addr cache! (%s)", nl_geterror(err)); } nl_cache_mngt_provide(nl_runtime.neigh_cache); nl_cache_mngt_provide(nl_runtime.link_cache); nl_cache_mngt_provide(nl_runtime.addr_cache); nl_runtime.ihandler = ihandler_new("dionaea.connection.*.accept", nl_ihandler_cb, NULL); ev_io_init(&nl_runtime.io_in, nl_io_in_cb, nl_socket_get_fd(sock), EV_READ); ev_io_start(g_dionaea->loop, &nl_runtime.io_in); nl_runtime.link_addr_cache = g_hash_table_new(g_int_hash, g_int_equal); nl_cache_foreach(nl_runtime.link_cache, nl_obj_input, NULL); nl_cache_foreach(nl_runtime.addr_cache, nl_obj_input, NULL); return true; }
static bool curl_new(struct dionaea *d) { g_debug("%s", __PRETTY_FUNCTION__); struct lcfgx_tree_node *node; if( lcfgx_get_string(g_dionaea->config.root, &node, "downloads.dir") != LCFGX_PATH_FOUND_TYPE_OK ) { g_warning("missing downloads.dir in dionaea.conf"); return false; } curl_runtime.download_dir = g_strdup((char *)node->value.string.data); if( curl_global_init(CURL_GLOBAL_ALL) != 0 ) return false; curl_version_info_data *curlinfo; curlinfo = curl_version_info(CURLVERSION_NOW); GString *features = g_string_new(""); GString *protocols = g_string_new(""); if( curlinfo->features ) { struct curl_feature { const char *name; int bitmask; }; static const struct curl_feature feats[] = { {"c-ares", CURL_VERSION_ASYNCHDNS}, {"debug", CURL_VERSION_DEBUG}, #ifdef CURL_VERSION_CURLDEBUG {"debugmemory", CURL_VERSION_CURLDEBUG}, #endif {"gss", CURL_VERSION_GSSNEGOTIATE}, {"idn", CURL_VERSION_IDN}, {"ipv6", CURL_VERSION_IPV6}, {"largefile", CURL_VERSION_LARGEFILE}, {"ntlm", CURL_VERSION_NTLM}, {"spnego", CURL_VERSION_SPNEGO}, {"ssl", CURL_VERSION_SSL}, {"sspi", CURL_VERSION_SSPI}, {"krb4", CURL_VERSION_KERBEROS4}, {"libz", CURL_VERSION_LIBZ}, {"charconv", CURL_VERSION_CONV} }; for( unsigned int i=0; i<sizeof(feats)/sizeof(feats[0]); i++ ) if( curlinfo->features & feats[i].bitmask ) g_string_append_printf(features, ",%s", feats[i].name); } if( curlinfo->protocols ) for( const char * const *proto=curlinfo->protocols; *proto; ++proto ) g_string_append_printf(protocols, ",%s", *proto); g_info("curl version %s features:%s protocols:%s ", curlinfo->version, features->str+1, protocols->str+1); g_string_free(features, TRUE); g_string_free(protocols, TRUE); curl_runtime.multi = curl_multi_init(); ev_timer_init(&curl_runtime.timer_event, timer_cb, 0., 0.); curl_multi_setopt(curl_runtime.multi, CURLMOPT_SOCKETFUNCTION, curl_socketfunction_cb); curl_multi_setopt(curl_runtime.multi, CURLMOPT_SOCKETDATA, NULL); curl_multi_setopt(curl_runtime.multi, CURLMOPT_TIMERFUNCTION, multi_timer_cb); curl_multi_setopt(curl_runtime.multi, CURLMOPT_TIMERDATA, NULL); CURLMcode rc; do { rc = curl_multi_socket_all(curl_runtime.multi, &curl_runtime.active); } while( CURLM_CALL_MULTI_PERFORM == rc ); curl_runtime.download_ihandler = ihandler_new("dionaea.download.offer", curl_ihandler_cb, NULL); curl_runtime.upload_ihandler = ihandler_new("dionaea.upload.request", curl_ihandler_cb, NULL); return true; }