Date: Sat, 21 Jun 2014 03:40:32 -0700 From: John-Mark Gurney <jmg@funkthat.com> To: John Baldwin <jhb@freebsd.org> Cc: rpaulo@freebsd.org, freebsd-arch@freebsd.org Subject: Re: conflict between netif and pccard_ether... Message-ID: <20140621104031.GM31367@funkthat.com> In-Reply-To: <201406190917.16458.jhb@freebsd.org> References: <20140618231318.GH31367@funkthat.com> <201406190917.16458.jhb@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
John Baldwin wrote this message on Thu, Jun 19, 2014 at 09:17 -0400:
> On Wednesday, June 18, 2014 7:13:18 pm John-Mark Gurney wrote:
> > So, I recently was trying to figure out why wireless on my notebook
> > wouldn't work.. I would boot up the machine w/o the wireless
> > configured, uncomment the lines in rc.conf, and then run
> > "service netif start"...
> >
> > Wireless would associate, but when disconnect... After some
> > investigation, it turns out that two copies of wpa_supplicant are
> > being launched... I believe one from netif, and another from
> > pccard_ether launched by devd...
> >
> > The issue is that both netif and pccard_ether "claim" ownership of
> > them. pccard_ether will ignore the ifconfig_ line if NOAUTO is
> > specified. IMO, we need to make one or the other "own" configuring
> > and launching the interface...
> >
> > There is also the issue that wpa_sup doesn't use proper locking on
> > the pidfile and allows two copies to be launched... My thoughts
> > is to convert it to pidfile to fix this issue the easiest...
>
> I think this is actually the best fix. dhclient handles this correctly for
> this reason.
>
> > Comments? Suggestions?
>
> We had a thread a few months ago about this very topic and I committed changes
> to the rc.d scripts that I then had to revert because it broke other use
> cases. Having the redundant start be harmless is the simplest way to handle
> this.
Ok, I converted wpa_supplicant to use pidfile(3), and it successfully
fixes the issue I had... I get the error that wpa_supplicant is already
running... It looks like in my case, devd was beating out netif in
launching wpa_sup...
I've attached the patch...
--
John-Mark Gurney Voice: +1 415 225 5579
"All that I will do, has been done, All that I have, has not."
[-- Attachment #2 --]
diff --git a/contrib/wpa/src/utils/os_unix.c b/contrib/wpa/src/utils/os_unix.c
index 23a93be..7a779f6 100644
--- a/contrib/wpa/src/utils/os_unix.c
+++ b/contrib/wpa/src/utils/os_unix.c
@@ -153,23 +153,34 @@ static int os_daemon(int nochdir, int noclose)
#endif /* __APPLE__ */
+#include <err.h>
+#include <libutil.h>
+#include <stdint.h>
+
int os_daemonize(const char *pid_file)
{
#if defined(__uClinux__) || defined(__sun__)
return -1;
#else /* defined(__uClinux__) || defined(__sun__) */
+ pid_t otherpid;
+ struct pidfh *pfh;
+
+ pfh = pidfile_open(pid_file, 0600, &otherpid);
+ if (pfh == NULL) {
+ if (errno == EEXIST) {
+ errx(1, "Daemon already running, pid: %jd.",
+ (intmax_t)otherpid);
+ }
+ warn("Cannot open or create pidfile.");
+ }
+
if (os_daemon(0, 0)) {
perror("daemon");
+ pidfile_remove(pfh);
return -1;
}
- if (pid_file) {
- FILE *f = fopen(pid_file, "w");
- if (f) {
- fprintf(f, "%u\n", getpid());
- fclose(f);
- }
- }
+ pidfile_write(pfh);
return -0;
#endif /* defined(__uClinux__) || defined(__sun__) */
diff --git a/usr.sbin/wpa/wpa_supplicant/Makefile b/usr.sbin/wpa/wpa_supplicant/Makefile
index 11cccf3..673a04d 100644
--- a/usr.sbin/wpa/wpa_supplicant/Makefile
+++ b/usr.sbin/wpa/wpa_supplicant/Makefile
@@ -49,8 +49,8 @@ CFLAGS+=-DCONFIG_BACKEND_FILE \
-DCONFIG_GAS \
-DPKCS12_FUNCS
#CFLAGS+= -g
-DPADD+= ${LIBPCAP}
-LDADD+= -lpcap
+DPADD+= ${LIBPCAP} ${LIBUTIL}
+LDADD+= -lpcap -lutil
# User customizations to the wpa_supplicant build environment
CFLAGS+=${WPA_SUPPLICANT_CFLAGS}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20140621104031.GM31367>
