[PATCH 1/1] ifupdown: add write lock around ifstate access
David Henderson
dhenderson at digital-pipe.com
Thu Sep 29 12:53:45 UTC 2016
Awesome, thanks Danomi!
Dave
On 9/28/16, Danomi Manchego <danomimanchego123 at gmail.com> wrote:
> So that concurrent access on systems with multiple
> network interfaces correctly update the ifstate file.
>
> Signed-off-by: Danomi Manchego <danomimanchego123 at 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 at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
>
More information about the busybox
mailing list