diff options
author | Neal H Walfield <neal@cs.uml.edu> | 2019-10-30 00:03:13 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2019-10-30 00:04:40 +0100 |
commit | 3a8234d2440a464f5401b3444d454ac913d6b3d6 (patch) | |
tree | 409ff15b23279ea508c18fc4d1909da55fc9ca6e /libfshelp-tests/test-flock.c | |
parent | 14639382938714f07f76abd3d221c6d472710502 (diff) | |
download | hurd-3a8234d2440a464f5401b3444d454ac913d6b3d6.tar.gz hurd-3a8234d2440a464f5401b3444d454ac913d6b3d6.tar.bz2 hurd-3a8234d2440a464f5401b3444d454ac913d6b3d6.zip |
libfshelp-tests: Tests for file record locking
2019-03-04 Svante Signell <svante.signell@gmail.com>
* test-*.c: Update code, remove test results.
* README.new_tests: New file, summarize new test results.
2019-02-12 Svante Signell <svante.signell@gmail.com>
* test-*.c: Update code, add some test results.
* Makefile: Remove extra flags.
2019-02-01 Svante Signell <svante.signell@gmail.com>
* Update copyright years.
2016-05-23 Svante Signell <svante.signell@gmail.com>
* Makefile: Add sub-directory libfshelp-tests.
2018-12-07 Svante Signell <svante.signell@gmail.com>
* Update copyright years.
* locks.c(cmd_lock): Call fshelp_rlock_tweak()
with new last argument rendezvous = MACH_PORT_NULL.
2017-01-05 Svante Signell <svante.signell@gmail.com>
* Update copyright years and headers.
2016-12-28 Svante Signell <svante.signell@gmail.com>
* Makefile: test-flock.c, test-lockf.c and test-fcntl.c
* test-lockf.c: New file
* Rename set-flock.c, set-fcntl.c to test-flock.c test-fcntl.c
* TODO: Update README
2016-05-23 Svante Signell <svante.signell@gmail.com>
* Makefile: Link with pthread, add build of set-flock.c and set-fcntl.c
* define temporary CPP_FLAGS until glibc is updated
* set-flock.c, set-fcntl.c: New files.
* Fix typos in README
2001-04-11 Neal H Walfield <neal@cs.uml.edu>
* ChangeLog: New file, mentioning itself in this sentence.
* Makefile: New file.
* README: Likewise.
* fork.c: Likewise.
* locks: Likewise.
* locks-tests: Likewise.
* locks.c: Likewise.
* race.c: Likewise.
Diffstat (limited to 'libfshelp-tests/test-flock.c')
-rw-r--r-- | libfshelp-tests/test-flock.c | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/libfshelp-tests/test-flock.c b/libfshelp-tests/test-flock.c new file mode 100644 index 00000000..700aa25c --- /dev/null +++ b/libfshelp-tests/test-flock.c @@ -0,0 +1,170 @@ +/* test-flock.c: Test advisory open file locks, see flock(2) + Options: <see below> + + Copyright (C) 2016-2019 Free Software Foundation, Inc. + + Written by Svante Signell <svante.signell@gmail.com> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 3, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <error.h> +#include <errno.h> +#include <unistd.h> +#include <sys/file.h> + +/* Parse args */ +int parse_args (int argc, char **argv, char **file_name, + int *flags, char **flagsc, + int *op, char **opc, + int *sleep_time) +{ + int i, tmp; + char *str, *endptr; + + if (argc < 2) + error (1, 0, "Usage: %s file [flags] [operation] [sleep_time]\n\ + file : file name/device name\n\ + flags : r (O_RDONLY) | w (O_WRONLY) | rw (O_RDWR) : [w]\n\ + operation : s (LOCK_SH), x (LOCK_EX), u (LOCK_UN),\n\ + sn (LOCK_SH | LOCK_UN), xn (LOCK_EX | LOCK_UN) : [s]\n\ + sleep_time : st <number> : [st 10]\n", + argv[0]); + + *file_name = argv[1]; + for (i = 2; i < argc; i++) + { + str = argv[i]; + if (strncmp (str, "r", 2) == 0) + { + *flags = O_RDONLY; + *flagsc = "O_RDONLY"; + continue; + } + if (strncmp (str, "w", 2) == 0) + { + *flags = O_WRONLY; + *flagsc = "O_WRONLY"; + continue; + } + if (strncmp (str, "rw", 2) == 0) + { + *flags = O_RDWR; + *flagsc = "O_RDWR"; + continue; + } + if (strncmp (str, "s", 2) == 0) + { + *op = LOCK_SH; + *opc = "LOCK_SH"; + continue; + } + if (strncmp (str, "sn", 2) == 0) + { + *op = LOCK_SH | LOCK_NB; + *opc = "LOCK_SH | LOCK_NB"; + continue; + } + if (strncmp (str, "x", 2) == 0) + { + *op = LOCK_EX; + *opc = "LOCK_EX"; + continue; + } + if (strncmp (str, "xn", 2) == 0) + { + *op = LOCK_EX | LOCK_NB; + *opc = "LOCK_EX | LOCK_NB"; + continue; + } + if (strncmp (str, "u", 2) == 0) + { + *op = LOCK_UN; + *opc = "LOCK_UN"; + continue; + } + if (strncmp (str, "st", 2) == 0) + { + str = argv[++i]; + if (str) + { + errno = 0; + tmp = strtol (str, &endptr, 10); + if (tmp == 0 && errno != 0) + error (1, errno, "%s", str); + if (endptr == str) + error (1, EINVAL, "%s", str); + *sleep_time = tmp; + } + else + error (1, EINVAL, "%s", str); + continue; + } + error (1, EINVAL, "%s", str); + } + + return 0; +} + +int main (int argc, char **argv) +{ +#ifdef __GNU__ + error_t err; +#else + int err; +#endif + int fd, ret = -1; + char *file_name = NULL; + int flags = O_RDONLY; + char *flagsc = "O_RDONLY"; + int op = LOCK_SH; + char *opc = "LOCK_SH"; + int sleep_time = 10; + + ret = parse_args (argc, argv, &file_name, + &flags, &flagsc, + &op, &opc, + &sleep_time); + +#ifdef __GNU__ + printf ("test-flock: GNU/Hurd\n"); +#else + printf ("test-flock: GNU/Linux\n"); +#endif + + printf ("file = '%s', flags = %s\n", file_name, flagsc); + fd = open (file_name, flags); + if (fd < 0) + error (1, errno, "open"); + printf ("Opening '%s', fd = %d, ", file_name, fd); + printf ("operation = %s\n", opc); + printf ("Requesting lock\n"); + err = flock (fd, op); + if (err) + error (1, errno, "flock"); + + printf ("Got lock: sleep_time = %d seconds\n", sleep_time); + sleep (sleep_time); + + printf ("Closing '%s'\n", file_name); + close (fd); + + return ret; +} |