From: Felix Fietkau Date: Mon, 28 Jan 2008 02:14:00 +0000 (+0100) Subject: add shared locking for uci_load X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fuci.git;a=commitdiff_plain;h=c77adc6e931ca6a669c6798b7839c6af18882f05 add shared locking for uci_load --- diff --git a/file.c b/file.c index 601fef5..4a56b8a 100644 --- a/file.c +++ b/file.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -531,6 +532,7 @@ int uci_load(struct uci_context *ctx, const char *name, struct uci_package **pac char *filename; bool confpath; FILE *file; + int fd; UCI_HANDLE_ERR(ctx); UCI_ASSERT(ctx, name != NULL); @@ -554,14 +556,24 @@ int uci_load(struct uci_context *ctx, const char *name, struct uci_package **pac UCI_THROW(ctx, UCI_ERR_NOTFOUND); } - file = fopen(filename, "r"); + fd = open(filename, O_RDONLY); if (filename != name) free(filename); + flock(fd, LOCK_SH); + file = fdopen(fd, "r"); if (!file) UCI_THROW(ctx, UCI_ERR_IO); - return uci_import(ctx, file, name, package); + ctx->errno = 0; + UCI_TRAP_SAVE(ctx, done); + uci_import(ctx, file, name, package); + UCI_TRAP_RESTORE(ctx); + +done: + flock(fd, LOCK_UN); + fclose(file); + return ctx->errno; } /*