summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSami Kerola2016-05-07 13:50:01 +0200
committerSami Kerola2016-07-01 22:17:25 +0200
commitc1d0a95eea8a1e3f05d78f734f0c93ef97b6b7e5 (patch)
tree407c74809c8de1a0b7332445094100af93796ae8
parentwrite: improve function and variable names (diff)
downloadkernel-qcow2-util-linux-c1d0a95eea8a1e3f05d78f734f0c93ef97b6b7e5.tar.gz
kernel-qcow2-util-linux-c1d0a95eea8a1e3f05d78f734f0c93ef97b6b7e5.tar.xz
kernel-qcow2-util-linux-c1d0a95eea8a1e3f05d78f734f0c93ef97b6b7e5.zip
write: remove unnecessary utmp variables
glibc documentation tells getutent() calls are not thread safe, and recommends to copy the context of the structures when information is wished to be stored. This leads to excessive copying, that in this case is not relevant. write(1) is single threaded program and there is no reason to assume this would change in future. Reference: http://www.gnu.org/software/libc/manual/html_node/Manipulating-the-Database.html Signed-off-by: Sami Kerola <kerolasa@iki.fi>
-rw-r--r--term-utils/write.c28
1 files changed, 11 insertions, 17 deletions
diff --git a/term-utils/write.c b/term-utils/write.c
index 6bf15dd40..8288e9d32 100644
--- a/term-utils/write.c
+++ b/term-utils/write.c
@@ -126,17 +126,15 @@ static int check_tty(char *tty, int *tty_writeable, time_t *tty_atime, int showe
*/
static int check_utmp(const struct write_control *ctl)
{
- struct utmp u;
- struct utmp *uptr;
+ struct utmp *u;
int res = 1;
utmpname(_PATH_UTMP);
setutent();
- while ((uptr = getutent())) {
- memcpy(&u, uptr, sizeof(u));
- if (strncmp(ctl->dst_login, u.ut_user, sizeof(u.ut_user)) == 0 &&
- strncmp(ctl->dst_tty, u.ut_line, sizeof(u.ut_line)) == 0) {
+ while ((u = getutent())) {
+ if (strncmp(ctl->dst_login, u->ut_user, sizeof(u->ut_user)) == 0 &&
+ strncmp(ctl->dst_tty, u->ut_line, sizeof(u->ut_line)) == 0) {
res = 0;
break;
}
@@ -159,38 +157,34 @@ static int check_utmp(const struct write_control *ctl)
*/
static void search_utmp(struct write_control *ctl)
{
- struct utmp u;
- struct utmp *uptr;
+ struct utmp *u;
time_t best_atime = 0, tty_atime;
int num_ttys = 0, valid_ttys = 0, tty_writeable = 0, user_is_me = 0;
- char atty[sizeof(u.ut_line) + 1];
utmpname(_PATH_UTMP);
setutent();
- while ((uptr = getutent())) {
- memcpy(&u, uptr, sizeof(u));
- if (strncmp(ctl->dst_login, u.ut_user, sizeof(u.ut_user)) == 0) {
+ while ((u = getutent())) {
+ if (strncmp(ctl->dst_login, u->ut_user, sizeof(u->ut_user)) == 0) {
num_ttys++;
- xstrncpy(atty, u.ut_line, sizeof(atty));
- if (check_tty(atty, &tty_writeable, &tty_atime, 0))
+ if (check_tty(u->ut_line, &tty_writeable, &tty_atime, 0))
/* bad term? skip */
continue;
if (ctl->src_uid && !tty_writeable)
/* skip ttys with msgs off */
continue;
- if (strcmp(atty, ctl->src_tty) == 0) {
+ if (strcmp(u->ut_line, ctl->src_tty) == 0) {
user_is_me = 1;
/* don't write to yourself */
continue;
}
- if (u.ut_type != USER_PROCESS)
+ if (u->ut_type != USER_PROCESS)
/* it's not a valid entry */
continue;
valid_ttys++;
if (tty_atime > best_atime) {
best_atime = tty_atime;
- xstrncpy(ctl->dst_tty, atty, sizeof(ctl->dst_tty));
+ xstrncpy(ctl->dst_tty, u->ut_line, sizeof(ctl->dst_tty));
}
}
}