From shollenbeck at verisign.com Mon Feb 2 12:14:33 2015 From: shollenbeck at verisign.com (Hollenbeck, Scott) Date: Mon, 2 Feb 2015 12:14:33 +0000 Subject: [getdns-users] SWIG, PHP, and Undefined Functions Message-ID: <831693C2CDA2E849A7D7A712B24E257F49F35C83@BRN1WNEXMBX01.vcorp.ad.vrsn.com> I've been playing around with SWIG (http://www.swig.org/) in an attempt to create PHP language bindings for getdns. I've been able to build a PHP extension, but when I try to use it I get an "undefined function" error: Fatal error: Call to undefined function getdns_context_create() in /path/getdns.php on line 679 These is the result of print_r(get_extension_funcs("getdns")): Array ( [0] => getdns_address [1] => getdns_address_sync [2] => getdns_hostname [3] => getdns_hostname_sync [4] => getdns_service [5] => getdns_service_sync [6] => getdns_general [7] => getdns_general_sync [8] => getdns_dict_destroy [9] => swig_getdns_alter_newobject [10] => swig_getdns_get_newobject ) Here's some of what nm reports (note the undefined symbols): sah at sah-vb:~/projects/getdns/src/php$ nm getdns.so|grep context U getdns_context_create U getdns_context_create_with_extended_memory_functions U getdns_context_create_with_memory_functions U getdns_context_destroy My swig interface file: %module getdns %{ /* Put headers and other declarations here. */ #include #include %} %include %include Here's how I'm building the extension: swig -php -outcurrentdir -I/usr/local/include/getdns ../getdns.i gcc `php-config --includes` -fPIC -c -I/usr/local/include/getdns getdns_wrap.c gcc getdns_wrap.o -o getdns.so -shared -L/usr/local/lib -lgetdns I wrote a small C program that works just fine using the same getdns shared library. I'm pretty sure I'm missing something obvious in the way I set up my SWIG interface and the code it produces, but I'm a SWIG noob - what did I miss? Scott From willem at nlnetlabs.nl Mon Feb 2 13:03:30 2015 From: willem at nlnetlabs.nl (Willem Toorop) Date: Mon, 02 Feb 2015 14:03:30 +0100 Subject: [getdns-users] SWIG, PHP, and Undefined Functions In-Reply-To: <831693C2CDA2E849A7D7A712B24E257F49F35C83@BRN1WNEXMBX01.vcorp.ad.vrsn.com> References: <831693C2CDA2E849A7D7A712B24E257F49F35C83@BRN1WNEXMBX01.vcorp.ad.vrsn.com> Message-ID: <54CF75A2.60000@nlnetlabs.nl> Hi Scott, Exactly repeating your steps works with me: php > include('getdns.php'); php > print_r(get_extension_funcs("getdns")); Array ( [0] => getdns_bindata_size_set [1] => getdns_bindata_size_get [2] => getdns_bindata_data_set [3] => getdns_bindata_data_get [4] => new_getdns_bindata [5] => getdns_strerror [6] => getdns_list_get_length [7] => getdns_list_get_data_type [8] => getdns_list_get_dict [9] => getdns_list_get_list [10] => getdns_list_get_bindata [11] => getdns_list_get_int [12] => getdns_dict_get_names [13] => getdns_dict_get_data_type [14] => getdns_dict_get_dict [15] => getdns_dict_get_list [16] => getdns_dict_get_bindata [17] => getdns_dict_get_int [18] => getdns_list_create [19] => getdns_list_create_with_context [20] => getdns_list_create_with_memory_functions [21] => getdns_list_create_with_extended_memory_functions [22] => getdns_list_destroy [23] => getdns_list_set_dict [24] => getdns_list_set_list [25] => getdns_list_set_bindata [26] => getdns_list_set_int [27] => getdns_dict_create [28] => getdns_dict_create_with_context [29] => getdns_dict_create_with_memory_functions [30] => getdns_dict_create_with_extended_memory_functions [31] => getdns_dict_destroy [32] => getdns_dict_set_dict [33] => getdns_dict_set_list [34] => getdns_dict_set_bindata [35] => getdns_dict_set_int [36] => getdns_dict_remove_name [37] => getdns_general [38] => getdns_address [39] => getdns_hostname [40] => getdns_service [41] => getdns_context_create [42] => getdns_context_create_with_memory_functions [43] => getdns_context_create_with_extended_memory_functions [44] => getdns_context_destroy [45] => getdns_cancel_callback [46] => getdns_general_sync [47] => getdns_address_sync [48] => getdns_hostname_sync [49] => getdns_service_sync [50] => getdns_convert_dns_name_to_fqdn [51] => getdns_convert_fqdn_to_dns_name [52] => getdns_convert_ulabel_to_alabel [53] => getdns_convert_alabel_to_ulabel [54] => getdns_validate_dnssec [55] => getdns_pretty_print_dict [56] => getdns_display_ip_address [57] => getdns_context_set_context_update_callback [58] => getdns_context_set_resolution_type [59] => getdns_context_set_namespaces [60] => getdns_context_set_dns_transport [61] => getdns_context_set_limit_outstanding_queries [62] => getdns_context_set_timeout [63] => getdns_context_set_follow_redirects [64] => getdns_context_set_dns_root_servers [65] => getdns_context_set_append_name [66] => getdns_context_set_suffix [67] => getdns_context_set_dnssec_trust_anchors [68] => getdns_context_set_dnssec_allowed_skew [69] => getdns_context_set_upstream_recursive_servers [70] => getdns_context_set_edns_maximum_udp_payload_size [71] => getdns_context_set_edns_extended_rcode [72] => getdns_context_set_edns_version [73] => getdns_context_set_edns_do_bit [74] => getdns_context_set_memory_functions [75] => getdns_context_set_extended_memory_functions [76] => getdns_context_get_api_information [77] => getdns_root_trust_anchor [78] => getdns_context_set_return_dnssec_status [79] => getdns_dict_util_set_string [80] => getdns_dict_util_get_string [81] => getdns_context_set_use_threads [82] => getdns_context_get_num_pending_requests [83] => getdns_context_process_async [84] => getdns_eventloop_event_userarg_set [85] => getdns_eventloop_event_userarg_get [86] => getdns_eventloop_event_read_cb_set [87] => getdns_eventloop_event_read_cb_get [88] => getdns_eventloop_event_write_cb_set [89] => getdns_eventloop_event_write_cb_get [90] => getdns_eventloop_event_timeout_cb_set [91] => getdns_eventloop_event_timeout_cb_get [92] => getdns_eventloop_event_ev_set [93] => getdns_eventloop_event_ev_get [94] => new_getdns_eventloop_event [95] => getdns_eventloop_event_init [96] => getdns_eventloop_vmt_set [97] => getdns_eventloop_vmt_get [98] => new_getdns_eventloop [99] => getdns_eventloop_vmt_cleanup_set [100] => getdns_eventloop_vmt_cleanup_get [101] => getdns_eventloop_vmt_schedule_set [102] => getdns_eventloop_vmt_schedule_get [103] => getdns_eventloop_vmt_clear_set [104] => getdns_eventloop_vmt_clear_get [105] => getdns_eventloop_vmt_run_set [106] => getdns_eventloop_vmt_run_get [107] => getdns_eventloop_vmt_run_once_set [108] => getdns_eventloop_vmt_run_once_get [109] => new_getdns_eventloop_vmt [110] => getdns_context_set_eventloop [111] => getdns_context_detach_eventloop [112] => getdns_context_run [113] => swig_getdns_alter_newobject [114] => swig_getdns_get_newobject ) Maybe it mattered that I had /usr/local/lib in my LD_LIBRARY_PATH though. But this very direct approach doesn't give me an usable php interface yet. I guess you have to work around the pass by reference style of returning values (besides the return code). php > $c = NULL; php > $r = getdns_context_create($c,1); php > print "$r\n"; (i.e. 311 == GETDNS_RETURN_INVALID_PARAMETER) php > $r = getdns_context_create(&$c,1); PHP Fatal error: Call-time pass-by-reference has been removed in php shell code on line 1 Cheers, -- Willem Op 02-02-15 om 13:14 schreef Hollenbeck, Scott: > I've been playing around with SWIG (http://www.swig.org/) in an attempt to create PHP language bindings for getdns. I've been able to build a PHP extension, but when I try to use it I get an "undefined function" error: > > Fatal error: Call to undefined function getdns_context_create() in /path/getdns.php on line 679 > > These is the result of print_r(get_extension_funcs("getdns")): > > Array > ( > [0] => getdns_address > [1] => getdns_address_sync > [2] => getdns_hostname > [3] => getdns_hostname_sync > [4] => getdns_service > [5] => getdns_service_sync > [6] => getdns_general > [7] => getdns_general_sync > [8] => getdns_dict_destroy > [9] => swig_getdns_alter_newobject > [10] => swig_getdns_get_newobject > ) > > Here's some of what nm reports (note the undefined symbols): > > sah at sah-vb:~/projects/getdns/src/php$ nm getdns.so|grep context > U getdns_context_create > U getdns_context_create_with_extended_memory_functions > U getdns_context_create_with_memory_functions > U getdns_context_destroy > > My swig interface file: > > %module getdns > %{ > /* Put headers and other declarations here. */ > #include > #include > %} > > %include > %include > > Here's how I'm building the extension: > > swig -php -outcurrentdir -I/usr/local/include/getdns ../getdns.i > gcc `php-config --includes` -fPIC -c -I/usr/local/include/getdns getdns_wrap.c > gcc getdns_wrap.o -o getdns.so -shared -L/usr/local/lib -lgetdns > > I wrote a small C program that works just fine using the same getdns shared library. I'm pretty sure I'm missing something obvious in the way I set up my SWIG interface and the code it produces, but I'm a SWIG noob - what did I miss? > > Scott > > _______________________________________________ > Users mailing list > Users at getdnsapi.net > http://getdnsapi.net/mailman/listinfo/users > From shollenbeck at verisign.com Mon Feb 2 13:09:22 2015 From: shollenbeck at verisign.com (Hollenbeck, Scott) Date: Mon, 2 Feb 2015 13:09:22 +0000 Subject: [getdns-users] SWIG, PHP, and Undefined Functions In-Reply-To: <54CF75A2.60000@nlnetlabs.nl> References: <831693C2CDA2E849A7D7A712B24E257F49F35C83@BRN1WNEXMBX01.vcorp.ad.vrsn.com> <54CF75A2.60000@nlnetlabs.nl> Message-ID: <831693C2CDA2E849A7D7A712B24E257F49F35E83@BRN1WNEXMBX01.vcorp.ad.vrsn.com> > -----Original Message----- > From: Users [mailto:users-bounces at getdnsapi.net] On Behalf Of Willem > Toorop > Sent: Monday, February 02, 2015 8:04 AM > To: users at getdnsapi.net > Subject: Re: [getdns-users] SWIG, PHP, and Undefined Functions > > Hi Scott, > > Exactly repeating your steps works with me: [snip] > Maybe it mattered that I had /usr/local/lib in my LD_LIBRARY_PATH > though. Strange, so do I: $ echo $LD_LIBRARY_PATH /usr/local/lib $ Still, your result suggests an environment issue on my side. That's helpful - thanks. > But this very direct approach doesn't give me an usable php interface > yet. I guess you have to work around the pass by reference style of > returning values (besides the return code). > > php > $c = NULL; > php > $r = getdns_context_create($c,1); > php > print "$r\n"; > > (i.e. 311 == GETDNS_RETURN_INVALID_PARAMETER) > > php > $r = getdns_context_create(&$c,1); > PHP Fatal error: Call-time pass-by-reference has been removed in php > shell code on line 1 I hope to deal with those issues when I get there... ;) Scott From melinda.shore at nomountain.net Mon Feb 2 21:18:35 2015 From: melinda.shore at nomountain.net (Melinda Shore) Date: Mon, 02 Feb 2015 12:18:35 -0900 Subject: [getdns-users] SWIG, PHP, and Undefined Functions In-Reply-To: <831693C2CDA2E849A7D7A712B24E257F49F35E83@BRN1WNEXMBX01.vcorp.ad.vrsn.com> References: <831693C2CDA2E849A7D7A712B24E257F49F35C83@BRN1WNEXMBX01.vcorp.ad.vrsn.com> <54CF75A2.60000@nlnetlabs.nl> <831693C2CDA2E849A7D7A712B24E257F49F35E83@BRN1WNEXMBX01.vcorp.ad.vrsn.com> Message-ID: <54CFE9AB.7010703@nomountain.net> On 2/2/15 4:09 AM, Hollenbeck, Scott wrote: > I hope to deal with those issues when I get there... ;) FWIW I looked at using SWIG for the Python bindings and concluded that it would not save effort, just redistribute it. Melinda -- Melinda Shore No Mountain Software melinda.shore at nomountain.net "Software longa, hardware brevis."