-
Notifications
You must be signed in to change notification settings - Fork 16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Expose who is using a board when it's blocked #79
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -25,6 +25,8 @@ | |
#include "status-cmd.h" | ||
#include "watch.h" | ||
|
||
const char *cdba_user; | ||
|
||
#define ARRAY_SIZE(x) ((sizeof(x)/sizeof((x)[0]))) | ||
|
||
#define device_has_control(_dev, _op) \ | ||
|
@@ -49,6 +51,7 @@ | |
static void device_lock(struct device *device) | ||
{ | ||
char lock[PATH_MAX]; | ||
char user[128] = { 0 }; | ||
int fd; | ||
int n; | ||
|
||
|
@@ -60,25 +63,49 @@ | |
if (fd >= 0) | ||
close(fd); | ||
|
||
fd = open(lock, O_RDONLY | O_CLOEXEC); | ||
fd = open(lock, O_RDWR | O_CLOEXEC); | ||
if (fd < 0) | ||
err(1, "failed to open lockfile %s", lock); | ||
|
||
/* Read current user out of the lockfile if there is one */ | ||
n = read(fd, user, sizeof(user)-1); | ||
if (n < 0) | ||
err(1, "failed to read lockfile %s", lock); | ||
/* Strip newline */ | ||
if (n) | ||
user[n-1] = '\0'; | ||
|
||
while (1) { | ||
char c; | ||
|
||
n = flock(fd, LOCK_EX | LOCK_NB); | ||
if (!n) | ||
return; | ||
break; | ||
|
||
warnx("board is in use, waiting..."); | ||
warnx("board is in use by %s, waiting...", user); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. User is not a constant, it needs to be re-read constantly when printing the message. Consider |
||
|
||
sleep(3); | ||
|
||
/* check that connection isn't gone */ | ||
if (read(STDIN_FILENO, &c, 1) == 0) | ||
errx(1, "connection is gone"); | ||
} | ||
|
||
/* Write our username to the lockfile */ | ||
n = snprintf(user, sizeof(user), "%s\n", cdba_user); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think skipping |
||
if (n >= (int)sizeof(user)) | ||
errx(1, "failed to build lockfile username"); | ||
|
||
if (ftruncate(fd, 0) < 0) | ||
err(1, "failed to truncate lockfile %s", lock); | ||
|
||
lseek(fd, 0, SEEK_SET); | ||
if (write(fd, user, n) < 0) | ||
Check warning Code scanning / CodeQL Exposure of system data to an unauthorized control sphere Medium
This operation exposes system data from
*call to getenv Error loading related location Loading This operation exposes system data from *call to getenv Error loading related location Loading |
||
err(1, "failed to write lockfile %s", lock); | ||
|
||
warnx("board locked by %s", cdba_user); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. debug message? |
||
|
||
fsync(fd); | ||
} | ||
|
||
static bool device_check_access(struct device *device, | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should happen under the read-lock (so that reading doesn't collide with unfinished write call). But then we don't want to give away exclusive lock on the file. Maybe it's better to have two files: one for the lock and another one for the username.