<div dir="ltr"><div>You can simply put wpa_ctrl.c into your own project, it&#39;s license is BSD, so it will work nicely with proprietary or GPLed code. I&#39;m using that than in a C++/Qt4.x project, were I open the controlling interface via wpa_ctrl_open() and use that with a QSocketNotifier to react asynchronously.<br>
</div><div><br></div><div>I than made it compiled, with something like this (beware, this is a cut-and-paste patch, so probably whitespace damaged):</div><div><br></div><div><br></div><div><br><div><div>--- ../mkimage/hostap/src/common/wpa_ctrl.c<span class="" style="white-space:pre">        </span>2013-02-07 10:03:39.111172856 +0100</div>
<div>+++ wpa_ctrl.c<span class="" style="white-space:pre">        </span>2012-03-23 14:10:17.000000000 +0100</div><div>@@ -6,18 +6,23 @@</div><div>  * See README for more details.</div><div>  */</div><div> </div><div>+#ifdef ORIG</div>
<div> #include &quot;includes.h&quot;</div><div>+#else</div><div>+#include &lt;stdlib.h&gt;</div><div>+#include &lt;sys/types.h&gt;</div><div>+#include &lt;sys/socket.h&gt;</div><div>+#include &lt;unistd.h&gt;</div><div>+#include &lt;stdio.h&gt;</div>
<div>+#include &lt;errno.h&gt;</div><div>+#endif</div><div>+</div><div> </div><div> #ifdef CONFIG_CTRL_IFACE</div><div> </div><div> #ifdef CONFIG_CTRL_IFACE_UNIX</div><div> #include &lt;sys/un.h&gt;</div><div>-#include &lt;unistd.h&gt;</div>
<div>-#include &lt;fcntl.h&gt;</div><div> #endif /* CONFIG_CTRL_IFACE_UNIX */</div><div>-#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE</div><div>-#include &lt;netdb.h&gt;</div><div>-#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */</div><div>
 </div><div> #ifdef ANDROID</div><div> #include &lt;dirent.h&gt;</div><div>@@ -26,7 +31,41 @@</div><div> #endif /* ANDROID */</div><div> </div><div> #include &quot;wpa_ctrl.h&quot;</div><div>+#ifdef ORIG</div><div> #include &quot;common.h&quot;</div>
<div>+#else</div><div>+#define os_malloc(size) malloc(size)</div><div>+#define os_memset(s, c, n) memset(s, c, n)</div><div>+#define os_free(ptr) free(ptr)</div><div>+#define os_snprintf snprintf</div><div>+#define os_getpid getpid</div>
<div>+#define os_memcmp(s1, s2, n) memcmp(s1, s2, n)</div><div>+</div><div>+size_t os_strlcpy(char *dest, const char *src, size_t siz)</div><div>+{</div><div>+<span class="" style="white-space:pre">        </span>const char *s = src;</div>
<div>+<span class="" style="white-space:pre">        </span>size_t left = siz;</div><div>+</div><div>+<span class="" style="white-space:pre">        </span>if (left) {</div><div>+<span class="" style="white-space:pre">                </span>/* Copy string up to the maximum size of the dest buffer */</div>
<div>+<span class="" style="white-space:pre">                </span>while (--left != 0) {</div><div>+<span class="" style="white-space:pre">                        </span>if ((*dest++ = *s++) == &#39;\0&#39;)</div><div>+<span class="" style="white-space:pre">                                </span>break;</div>
<div>+<span class="" style="white-space:pre">                </span>}</div><div>+<span class="" style="white-space:pre">        </span>}</div><div>+</div><div>+<span class="" style="white-space:pre">        </span>if (left == 0) {</div><div>+<span class="" style="white-space:pre">                </span>/* Not enough room for the string; force NUL-termination */</div>
<div>+<span class="" style="white-space:pre">                </span>if (siz != 0)</div><div>+<span class="" style="white-space:pre">                        </span>*dest = &#39;\0&#39;;</div><div>+<span class="" style="white-space:pre">                </span>while (*s++)</div>
<div>+<span class="" style="white-space:pre">                        </span>; /* determine total src string length */</div><div>+<span class="" style="white-space:pre">        </span>}</div><div>+</div><div>+<span class="" style="white-space:pre">        </span>return s - src - 1;</div>
<div>+}</div><div>+#endif</div><div>+</div><div> </div><div> </div><div> #if defined(CONFIG_CTRL_IFACE_UNIX) || defined(CONFIG_CTRL_IFACE_UDP)</div></div><div><br></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
2013/5/10 John Beard <span dir="ltr">&lt;<a href="mailto:john.j.beard@gmail.com" target="_blank">john.j.beard@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<br>
<br>
I am hoping to use the wpa_ctrl socket interface to communicate with<br>
wpa_supplicant in order to get information about wifi signal strengths.<br>
<br>
I have tried to use the DBus interface, but I couldn&#39;t find much in the<br>
way of useful information about the library I was using (libdbus-c++)<br>
and when I asked further, I was told it is no longer usefully maintained<br>
and that I should look elsewhere. I&#39;d rather keep things smaller than<br>
pulling in big deps, so I don&#39;t really want to use something like GDBus.<br>
The control socket should be fine for my purposes, but I&#39;m having a bit<br>
of trouble using it.<br>
<br>
I can compile wpa_supplicant just fine, but I don&#39;t know how to compile<br>
into a library suitable for linking into my project. I looked in<br>
libutils.a, but that doesn&#39;t seem to have the wpa_ctrl_open() function<br>
in it.<br>
<br>
I can see how I can add my own code to the wpa_supplicant tree (like<br>
wpa_cli), but I&#39;m more looking to add to another project, rather than<br>
extend wpa_supplicant, and I couldn&#39;t see any likely-looking targets in<br>
the Makefiles.<br>
<br>
The minimal code that I am trying to get to work is below (wpa_ctrl.h is<br>
copied into my working dir for now):<br>
<br>
===============<br>
<br>
#include &lt;stdio.h&gt;<br>
#include &quot;wpa_ctrl.h&quot;<br>
<br>
#define CTRL_PATH &quot;/var/run/wpa_supplicant.pid&quot;<br>
<br>
int main(int argc, char** argv)<br>
{<br>
    struct wpa_ctrl* wpac;<br>
<br>
    wpac = wpa_ctrl_open(CTRL_PATH);<br>
<br>
    if (!wpac){<br>
        printf(&quot;Could not get ctrl interface!\n&quot;);<br>
        return -1;<br>
    }<br>
<br>
    return 0;<br>
}<br>
<br>
===============<br>
<br>
Could someone provide a quick pointer on how to correctly link against<br>
wpa_ctrl for control socket access to wpa_supplicant?<br>
<br>
Thanks and best regards,<br>
<br>
John Beard<br>
_______________________________________________<br>
HostAP mailing list<br>
<a href="mailto:HostAP@lists.shmoo.com">HostAP@lists.shmoo.com</a><br>
<a href="http://lists.shmoo.com/mailman/listinfo/hostap" target="_blank">http://lists.shmoo.com/mailman/listinfo/hostap</a><br>
</blockquote></div><br></div>