I thought the whole point of the va_start, va_end, va_arg and va_copy macros was to make variadic functions portable.  (At least that&#39;s what it done said on that there inter-web thingy.)  It&#39;s really sad if it doesn&#39;t actually work that way.  :-)<br>
<br>I ran it for a little while with if(1), and it seemed to work fine, but that was with a very mundane scenario.<br><br><br><div class="gmail_quote">On Mon, Dec 13, 2010 at 9:30 AM, Anthony Minessale <span dir="ltr">&lt;<a href="mailto:anthony.minessale@gmail.com">anthony.minessale@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">va_copy is not portable either =D welcome to C<br>
<br>
I think this code has evolved to the point at which i don&#39;t think its<br>
even possible for this to happen anyway.<br>
I am going to try running it without the test at all.<br>
<br>
commit dfecc914876b164ce64c53c4f048aa38ed65d9c5<br>
Author: Anthony Minessale &lt;<a href="mailto:anthm@freeswitch.org">anthm@freeswitch.org</a>&gt;<br>
Date:   Mon Dec 13 11:20:12 2010 -0600<br>
<div><div></div><div class="h5"><br>
<br>
On Mon, Dec 13, 2010 at 1:10 AM, Tom C &lt;<a href="mailto:mel0torme@gmail.com">mel0torme@gmail.com</a>&gt; wrote:<br>
&gt; I was attempting to build FreeSwitch on a Dockstar running Debian Squeeze,<br>
&gt; and ran into the sofia.c logger() compile problem as described here:<br>
&gt; <a href="http://jira.freeswitch.org/browse/FS-802" target="_blank">http://jira.freeswitch.org/browse/FS-802</a><br>
&gt;<br>
&gt; The offered solution was to downgrade GCC, but being a Linux newbie, I<br>
&gt; didn&#39;t know how to do that. So I decided to figure out what the problem<br>
&gt; really is.<br>
&gt;<br>
&gt; After learning waaaay too much about va_list, I see that the logger()<br>
&gt; function in sofia.c assumes that va_list will always be a pointer.  But on<br>
&gt; different platforms, va_list can be an array or a struct.  On the Dockstar<br>
&gt; (with Debian Squeeze and GCC 4.4), va_list is apparently a struct.<br>
&gt;<br>
&gt; I made the following modifications to logger() to make it truly portable,<br>
&gt; and it compiles and runs fine on my DockStar, my Debian Lenny x86.  (My<br>
&gt; Windows build is having bigger problems.)  But I&#39;m no C guru, so someone<br>
&gt; needs to thoroughly examine my code before anyone else takes it as gospel.<br>
&gt; Am I actually checking what needs to be checked with the va_arg() macro?<br>
&gt; Changing it to if(1) worked too, after all.<br>
&gt;<br>
&gt;<br>
&gt; ORIGINAL logger() in sofia.c, to make it easy to see what I changed.<br>
&gt; static void logger(void *logarg, char const *fmt, va_list ap)<br>
&gt; {<br>
&gt; /* gcc 4.4 gets mad at us for testing if (ap) so let&#39;s try to work around<br>
&gt; it....*/<br>
&gt; void *ap_ptr = (void *) (intptr_t) ap;  //Error now occurs here, because ap<br>
&gt; is a struct.<br>
&gt; if (!fmt) return;<br>
&gt; if (ap_ptr) {  //Error used to occur here, before attempted fix above.<br>
&gt;    switch_log_vprintf(SWITCH_CHANNEL_LOG_CLEAN,<br>
&gt; mod_sofia_globals.tracelevel, fmt, ap);<br>
&gt; } else {<br>
&gt;    switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, mod_sofia_globals.tracelevel,<br>
&gt; &quot;%s&quot;, fmt);<br>
&gt; }<br>
&gt; }<br>
&gt;<br>
&gt;<br>
&gt; My MODIFIED logger() function, additions and changes labelled with DOCKSTAR:<br>
&gt;<br>
&gt; static<br>
&gt;<br>
&gt; void logger(void *logarg, char const *fmt, va_list ap)<br>
&gt; {<br>
&gt; va_list temp_ap;  //DOCKSTAR: Added line (replacing previous ap_ptr cast).<br>
&gt;<br>
&gt; if (!fmt) return;<br>
&gt;<br>
&gt; va_copy(temp_ap, ap); //DOCKSTAR: Added Line. Make copy of &quot;ap&quot; so va_arg()<br>
&gt; macro doesn&#39;t move pointer.<br>
&gt;<br>
&gt; if (va_arg(temp_ap, int)) {  //DOCKSTAR: Modified, get first argument from<br>
&gt; ap, check non-null.<br>
&gt;      switch_log_vprintf(SWITCH_CHANNEL_LOG_CLEAN,<br>
&gt; mod_sofia_globals.tracelevel, fmt, ap);<br>
&gt; } else {<br>
&gt;      switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN,<br>
&gt; mod_sofia_globals.tracelevel, &quot;%s&quot;, fmt);<br>
&gt; }<br>
&gt;<br>
&gt; va_end(temp_ap);  //DOCKSTAR: Added line.  Release our copy of &quot;ap&quot;.<br>
&gt; }<br>
&gt;<br>
</div></div><div class="im">&gt; _______________________________________________<br>
&gt; FreeSWITCH-users mailing list<br>
&gt; <a href="mailto:FreeSWITCH-users@lists.freeswitch.org">FreeSWITCH-users@lists.freeswitch.org</a><br>
&gt; <a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
&gt; UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
&gt; <a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
&gt;<br>
&gt;<br>
<br>
<br>
<br>
</div>--<br>
Anthony Minessale II<br>
<br>
FreeSWITCH <a href="http://www.freeswitch.org/" target="_blank">http://www.freeswitch.org/</a><br>
ClueCon <a href="http://www.cluecon.com/" target="_blank">http://www.cluecon.com/</a><br>
Twitter: <a href="http://twitter.com/FreeSWITCH_wire" target="_blank">http://twitter.com/FreeSWITCH_wire</a><br>
<br>
AIM: anthm<br>
<a href="mailto:MSN%3Aanthony_minessale@hotmail.com">MSN:anthony_minessale@hotmail.com</a><br>
GTALK/JABBER/<a href="mailto:PAYPAL%3Aanthony.minessale@gmail.com">PAYPAL:anthony.minessale@gmail.com</a><br>
IRC: <a href="http://irc.freenode.net" target="_blank">irc.freenode.net</a> #freeswitch<br>
<br>
FreeSWITCH Developer Conference<br>
<a href="mailto:sip%3A888@conference.freeswitch.org">sip:888@conference.freeswitch.org</a><br>
<a href="mailto:googletalk%3Aconf%2B888@conference.freeswitch.org">googletalk:conf+888@conference.freeswitch.org</a><br>
pstn:+19193869900<br>
<div><div></div><div class="h5"><br>
_______________________________________________<br>
FreeSWITCH-users mailing list<br>
<a href="mailto:FreeSWITCH-users@lists.freeswitch.org">FreeSWITCH-users@lists.freeswitch.org</a><br>
<a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
<a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
</div></div></blockquote></div><br>