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