Awesome, thanks Danomi! Dave
On 9/28/16, Danomi Manchego <danomimanchego...@gmail.com> wrote: > So that concurrent access on systems with multiple > network interfaces correctly update the ifstate file. > > Signed-off-by: Danomi Manchego <danomimanchego...@gmail.com> > --- > networking/ifupdown.c | 31 +++++++++++++++++++++++++++++++ > 1 file changed, 31 insertions(+) > > diff --git a/networking/ifupdown.c b/networking/ifupdown.c > index b0bc0d7..1902c42 100644 > --- a/networking/ifupdown.c > +++ b/networking/ifupdown.c > @@ -1196,6 +1196,29 @@ static llist_t *find_iface_state(llist_t *state_list, > const char *iface) > return NULL; > } > > +static FILE *open_ifstate_lock_file(void) > +{ > + FILE *fp = fopen_for_write("/var/lock/ifupdown.lock"); > + > + if (fp) { > + struct flock fl; > + fl.l_type = F_WRLCK; > + fl.l_whence = SEEK_SET; > + fl.l_start = 0; > + fl.l_len = 0; > + fcntl(fileno(fp), F_SETLKW, &fl); > + } > + > + return fp; > +} > + > +static void close_ifstate_lock_file(FILE *fp) > +{ > + if (fp) { > + fclose(fp); > + } > +} > + > /* read the previous state from the state file */ > static llist_t *read_iface_state(void) > { > @@ -1276,9 +1299,14 @@ int ifupdown_main(int argc UNUSED_PARAM, char > **argv) > } > > if (!FORCE) { > + > + FILE *state_lock_fp = open_ifstate_lock_file(); > + > llist_t *state_list = read_iface_state(); > const llist_t *iface_state = > find_iface_state(state_list, iface); > > + close_ifstate_lock_file(state_lock_fp); > + > if (cmds == iface_up) { > /* ifup */ > if (iface_state) { > @@ -1348,6 +1376,7 @@ int ifupdown_main(int argc UNUSED_PARAM, char **argv) > any_failures = 1; > } else if (!NO_ACT) { > /* update the state file */ > + FILE *state_lock_fp = open_ifstate_lock_file(); > FILE *state_fp; > llist_t *state; > llist_t *state_list = read_iface_state(); > @@ -1378,6 +1407,8 @@ int ifupdown_main(int argc UNUSED_PARAM, char **argv) > } > fclose(state_fp); > llist_free(state_list, free); > + > + close_ifstate_lock_file(state_lock_fp); > } > next: > free(iface); > -- > 1.9.1 > > _______________________________________________ > busybox mailing list > busybox@busybox.net > http://lists.busybox.net/mailman/listinfo/busybox > _______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox