Page MenuHomeFreeBSD

D51027.id157640.diff
No OneTemporary

D51027.id157640.diff

diff --git a/usr.bin/lockf/lockf.c b/usr.bin/lockf/lockf.c
--- a/usr.bin/lockf/lockf.c
+++ b/usr.bin/lockf/lockf.c
@@ -62,35 +62,35 @@
"PIDs cannot be managed safely from a signal handler on this platform.");
static sig_atomic_t child = -1;
static int lockfd = -1;
-static int keep;
-static int fdlock;
+static bool keep;
+static bool fdlock;
static int status;
static bool termchild;
-static volatile sig_atomic_t timed_out;
+static sig_atomic_t timed_out;
/*
* Check if fdlock is implied by the given `lockname`. We'll write the fd that
* is represented by it out to ofd, and the caller is expected to do any
* necessary validation on it.
*/
-static int
+static bool
fdlock_implied(const char *name, long *ofd)
{
char *endp;
long fd;
if (strncmp(name, FDLOCK_PREFIX, sizeof(FDLOCK_PREFIX) - 1) != 0)
- return (0);
+ return (false);
/* Skip past the prefix. */
name += sizeof(FDLOCK_PREFIX) - 1;
errno = 0;
fd = strtol(name, &endp, 10);
if (errno != 0 || *endp != '\0')
- return (0);
+ return (false);
*ofd = fd;
- return (1);
+ return (true);
}
/*
@@ -103,40 +103,38 @@
.sa_handler = sigchld,
.sa_flags = SA_NOCLDSTOP,
};
- int ch, flags, silent, writepid;
+ const char *errstr;
long long waitsec;
+ int ch, flags;
union lock_subject subj;
sigset_t mask;
+ bool silent, writepid;
- silent = keep = writepid = 0;
+ silent = writepid = false;
flags = O_CREAT | O_RDONLY;
waitsec = -1; /* Infinite. */
while ((ch = getopt(argc, argv, "knpsTt:w")) != -1) {
switch (ch) {
case 'k':
- keep = 1;
+ keep = true;
break;
case 'n':
flags &= ~O_CREAT;
break;
case 's':
- silent = 1;
+ silent = true;
break;
case 'T':
termchild = true;
break;
case 't':
- {
- const char *errstr;
-
waitsec = strtonum(optarg, 0, UINT_MAX, &errstr);
if (errstr != NULL)
errx(EX_USAGE,
"invalid timeout \"%s\"", optarg);
- }
break;
case 'p':
- writepid = 1;
+ writepid = true;
flags |= O_TRUNC;
/* FALLTHROUGH */
case 'w':
@@ -162,7 +160,7 @@
* If there aren't any arguments left, then we must be in fdlock mode.
*/
if (argc == 0 && *lockname != '/') {
- fdlock = 1;
+ fdlock = true;
subj.subj_fd = -1;
} else {
fdlock = fdlock_implied(lockname, &subj.subj_fd);
@@ -227,13 +225,16 @@
*/
lockfd = acquire_lock(&subj, flags | O_NONBLOCK, silent);
while (lockfd == -1 && !timed_out && waitsec != 0) {
- if (keep || fdlock)
+ if (keep || fdlock) {
lockfd = acquire_lock(&subj, flags, silent);
- else {
+ } else {
wait_for_lock(lockname);
lockfd = acquire_lock(&subj, flags | O_NONBLOCK,
silent);
}
+
+ /* timed_out */
+ atomic_signal_fence(memory_order_acquire);
}
if (waitsec > 0)
alarm(0);
@@ -353,7 +354,7 @@
kill(child, sig);
cleanup();
signal(sig, SIG_DFL);
- if (kill(getpid(), sig) == -1)
+ if (raise(sig) == -1)
_Exit(EX_OSERR);
}
@@ -385,6 +386,7 @@
{
timed_out = 1;
+ atomic_signal_fence(memory_order_release);
}
static void

File Metadata

Mime Type
text/plain
Expires
Thu, Apr 2, 4:43 AM (15 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30704128
Default Alt Text
D51027.id157640.diff (2 KB)

Event Timeline