I'm not sure what you're trying to accomplish but this is not the approach I'd take for expanding chan_sip. My advice is to simply put your system.c into channels/sip. This will automatically link it into the binary chan_sip module, but allow you to keep your source code in a separate file. I believe MODULEINFO (for any added dependencies) and possibly a call to your init/cleanup would be the only changes you'd need to make in chan_sip.c. All non-static symbols in chan_sip.c and channels/sip/*.c are available across all sources of chan_sip.so without needing chan_sip.exports.in or AST_MODFLAG_GLOBAL_SYMBOLS.
The only exception is if you need to call chan_sip functions from another existing module, then you will have to export the symbols. To do this you have to tell the linker (via chan_sip.exports.in) and you have to tell the module loader. AST_MODULE_INFO at the very end of chan_sip.c would need AST_MODFLAG_GLOBAL_SYMBOLS so the module loader knows to share the globals: AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "Session Initiation Protocol (SIP)", On Fri, Dec 9, 2016 at 10:50 AM, Julian Fleischhauer < [email protected]> wrote: > I could resolve the XML and pcap issues, but still have problems > concerning "sip_get_header()". I don't want to rename the function since > it's a frequently used function in chan_sip.c, I therefore defined an . > exports.in file. I don't know if Mr. Michelson understood me correctly, > but I think chan_sip.c exports "sip_get_header()" (doesn't it?) so I > modified *chan_sip.exports.in <http://chan_sip.exports.in>* so it looks > like > { > global: > LINKER_SYMBOL_PREFIXsip_get_header; // I also tried > LINKER_SYMBOL_PREFIXsip_*; > LINKER_SYMBOL_PREFIX_IO_stdin_used; > local: > *; > }; > But it doesn't work. I did the same with *system.exports.in > <http://system.exports.in>*, without success. > > > Sorry for the badly formatted last mail. I will post the updated file > structure again below. > > *sip.h* > const char *sip_get_header(const struct sip_request *req, const char > *name); > > *system.h* > #include "asterisk/netsock2.h" > > void ast_some_function(struct sip_pvt *p, struct ast_sockaddr *addr); > > *system.c* > #include "asterisk/system.h" > #include "asterisk/sip.h" > > void ast_some_function(struct sip_pvt *p, struct ast_sockaddr *addr) > { > ast_copy_string(touser, sip_get_header(req, "To"), > strlen(sip_get_header(req, "To")) + 1); > } > > *chan_sip.c* > #include "asterisk/system.h" > #include "asterisk/sip.h" > > ast_some_function(p, addr); > > > Best regards, > Julian Fleischhauer > > 2016-12-06 18:35 GMT+01:00 Mark Michelson <[email protected]>: > >> On 12/05/2016 04:53 PM, Julian Fleischhauer wrote: >> >>> Hey all, >>> >>> I have a problem using a custom C-file. The error ouput received when >>> compiling is given below. >>> >>> error output >>> .../system.c:1330: undefined reference to `XML_ParserCreate' >>> ... >>> .../system.c:1465: undefined reference to `sip_get_header' >>> ... >>> .../system.c:1608: undefined reference to `pcap_lookupnet' >>> ... >>> >>> >>> Before, I had all code in chan_sip.c. I want to transfer the code into a >>> separate file (system.c) now. The dependencies given below MODULEINFO are >>> customly set and worked fine when used in chan_sip.c. Can anyone figure out >>> if something else has to be added somewhere? The code is quoted below: >>> >>> sip.h >>> const char *sip_get_header(const struct sip_request *req, const char >>> *name); >>> >>> system.h >>> #include "asterisk/netsock2.h" >>> >>> void ast_some_function(struct sip_pvt *p, struct ast_sockaddr *addr); >>> >>> system.c >>> /*** MODULEINFO >>> <depend>sqlite3</depend> >>> <depend>expat</depend> >>> <depend>pcap</depend> >>> <support_level>extended</support_level> >>> ***/ >>> >>> #include "asterisk/system.h" >>> #include "asterisk/sip.h" >>> >>> void ast_some_function(struct sip_pvt *p, struct ast_sockaddr *addr) >>> { >>> xmlParser = XML_ParserCreate(NULL); >>> ... >>> ast_copy_string(touser, sip_get_header(req, "To"), >>> strlen(sip_get_header(req, "To"))+1); >>> ... >>> pcap_lookupnet(pcapDev, &netp, &maskp, errbuf); >>> } >>> >>> chan_sip.c >>> #include "asterisk/system.h" >>> #include "asterisk/sip.h" >>> >>> ast_some_function(p, addr); >>> >>> >>> Thank you for any help! >>> >>> Regards, >>> Juliannn >>> >>> I can explain why sip_get_header() is causing a problem. In order for >> functions to be callable from other modules, they need to be explicitly >> exported. This is why you'll see files like res/res_agi.exports.in, >> which define functions that can be called globally from that module. You >> have a couple of options here: >> >> * Define a .exports.in file for your system.c file that exports the >> sip_get_header() function. >> * Change "sip_get_header()" to "ast_sip_get_header()". Assuming that >> system.c is in the main/ directory, there is a project-wide exports file >> that makes it so any function starting with "ast" can be called externally. >> >> Regarding the XML and pcap issues, the issues are either that >> * You're not #including the necessary files. >> * The libraries are not being linked during compilation. >> >> The first problem is easy to fix: just #include the right files :). The >> second problem is a bit more tricky because you'll need to dig into >> Makefiles and try to figure out how libraries get linked when Asterisk is >> built. >> >> >> -- >> _____________________________________________________________________ >> -- Bandwidth and Colocation Provided by http://www.api-digital.com -- >> >> asterisk-dev mailing list >> To UNSUBSCRIBE or update options visit: >> http://lists.digium.com/mailman/listinfo/asterisk-dev >> >> > > -- > _____________________________________________________________________ > -- Bandwidth and Colocation Provided by http://www.api-digital.com -- > > asterisk-dev mailing list > To UNSUBSCRIBE or update options visit: > http://lists.digium.com/mailman/listinfo/asterisk-dev >
-- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- asterisk-dev mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/asterisk-dev
