diff options
Diffstat (limited to 'tests/bugs/bug-834465.c')
-rw-r--r-- | tests/bugs/bug-834465.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/bugs/bug-834465.c b/tests/bugs/bug-834465.c new file mode 100644 index 000000000..61d3deac0 --- /dev/null +++ b/tests/bugs/bug-834465.c @@ -0,0 +1,61 @@ +#include <sys/file.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +int +main (int argc, char *argv[]) +{ + int fd = -1; + char *filename = NULL; + struct flock lock = {0, }; + int i = 0; + int ret = -1; + + if (argc != 2) { + fprintf (stderr, "Usage: %s <filename> ", argv[0]); + goto out; + } + + filename = argv[1]; + + fd = open (filename, O_RDWR | O_CREAT, 0); + if (fd < 0) { + fprintf (stderr, "open (%s) failed (%s)\n", filename, + strerror (errno)); + goto out; + } + + lock.l_type = F_WRLCK; + lock.l_whence = SEEK_SET; + lock.l_start = 1; + lock.l_len = 1; + + while (i < 100) { + lock.l_type = F_WRLCK; + ret = fcntl (fd, F_SETLK, &lock); + if (ret < 0) { + fprintf (stderr, "fcntl setlk failed (%s)\n", + strerror (errno)); + goto out; + } + + lock.l_type = F_UNLCK; + ret = fcntl (fd, F_SETLK, &lock); + if (ret < 0) { + fprintf (stderr, "fcntl setlk failed (%s)\n", + strerror (errno)); + goto out; + } + + i++; + } + + ret = 0; + +out: + return ret; +} |