chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Assume that /proc/meminfo can be missing
[elogind.git]
/
src
/
shared
/
utmp-wtmp.c
diff --git
a/src/shared/utmp-wtmp.c
b/src/shared/utmp-wtmp.c
index 046fb584fb08cb18506f89ffc1d0a68eca03f313..5d88405e13b471fff0b8184d98627ad4d105aaa4 100644
(file)
--- a/
src/shared/utmp-wtmp.c
+++ b/
src/shared/utmp-wtmp.c
@@
-33,7
+33,7
@@
#include "utmp-wtmp.h"
int utmp_get_runlevel(int *runlevel, int *previous) {
#include "utmp-wtmp.h"
int utmp_get_runlevel(int *runlevel, int *previous) {
- struct utmpx
lookup, *found
;
+ struct utmpx
*found, lookup = { .ut_type = RUN_LVL }
;
int r;
const char *e;
int r;
const char *e;
@@
-66,9
+66,6
@@
int utmp_get_runlevel(int *runlevel, int *previous) {
setutxent();
setutxent();
- zero(lookup);
- lookup.ut_type = RUN_LVL;
-
if (!(found = getutxid(&lookup)))
r = -errno;
else {
if (!(found = getutxid(&lookup)))
r = -errno;
else {
@@
-77,15
+74,11
@@
int utmp_get_runlevel(int *runlevel, int *previous) {
a = found->ut_pid & 0xFF;
b = (found->ut_pid >> 8) & 0xFF;
a = found->ut_pid & 0xFF;
b = (found->ut_pid >> 8) & 0xFF;
- if (a < 0 || b < 0)
- r = -EIO;
- else {
- *runlevel = a;
+ *runlevel = a;
+ if (previous)
+ *previous = b;
- if (previous)
- *previous = b;
- r = 0;
- }
+ r = 0;
}
endutxent();
}
endutxent();
@@
-106,14
+99,12
@@
static void init_timestamp(struct utmpx *store, usec_t t) {
}
static void init_entry(struct utmpx *store, usec_t t) {
}
static void init_entry(struct utmpx *store, usec_t t) {
- struct utsname uts;
+ struct utsname uts
= {}
;
assert(store);
init_timestamp(store, t);
assert(store);
init_timestamp(store, t);
- zero(uts);
-
if (uname(&uts) >= 0)
strncpy(store->ut_host, uts.release, sizeof(store->ut_host));
if (uname(&uts) >= 0)
strncpy(store->ut_host, uts.release, sizeof(store->ut_host));
@@
-199,7
+190,7
@@
int utmp_put_reboot(usec_t t) {
return write_entry_both(&store);
}
return write_entry_both(&store);
}
-static const char *sanitize_id(const char *id) {
+
_pure_
static const char *sanitize_id(const char *id) {
size_t l;
assert(id);
size_t l;
assert(id);
@@
-296,7
+287,7
@@
int utmp_put_runlevel(int runlevel, int previous) {
#define TIMEOUT_MSEC 50
static int write_to_terminal(const char *tty, const char *message) {
#define TIMEOUT_MSEC 50
static int write_to_terminal(const char *tty, const char *message) {
-
int fd, r
;
+
_cleanup_close_ int fd = -1
;
const char *p;
size_t left;
usec_t end;
const char *p;
size_t left;
usec_t end;
@@
-304,14
+295,10
@@
static int write_to_terminal(const char *tty, const char *message) {
assert(tty);
assert(message);
assert(tty);
assert(message);
- if ((fd = open(tty, O_WRONLY|O_NDELAY|O_NOCTTY|O_CLOEXEC)) < 0)
+ fd = open(tty, O_WRONLY|O_NDELAY|O_NOCTTY|O_CLOEXEC);
+ if (fd < 0 || !isatty(fd))
return -errno;
return -errno;
- if (!isatty(fd)) {
- r = -errno;
- goto finish;
- }
-
p = message;
left = strlen(message);
p = message;
left = strlen(message);
@@
-319,36
+306,31
@@
static int write_to_terminal(const char *tty, const char *message) {
while (left > 0) {
ssize_t n;
while (left > 0) {
ssize_t n;
- struct pollfd pollfd;
+ struct pollfd pollfd = {
+ .fd = fd,
+ .events = POLLOUT,
+ };
usec_t t;
int k;
t = now(CLOCK_MONOTONIC);
usec_t t;
int k;
t = now(CLOCK_MONOTONIC);
- if (t >= end) {
- r = -ETIME;
- goto finish;
- }
-
- zero(pollfd);
- pollfd.fd = fd;
- pollfd.events = POLLOUT;
+ if (t >= end)
+ return -ETIME;
- if ((k = poll(&pollfd, 1, (end - t) / USEC_PER_MSEC)) < 0)
+ k = poll(&pollfd, 1, (end - t) / USEC_PER_MSEC);
+ if (k < 0)
return -errno;
return -errno;
- if (k <= 0) {
- r = -ETIME;
- goto finish;
- }
-
- if ((n = write(fd, p, left)) < 0) {
+ if (k == 0)
+ return -ETIME;
+ n = write(fd, p, left);
+ if (n < 0) {
if (errno == EAGAIN)
continue;
if (errno == EAGAIN)
continue;
- r = -errno;
- goto finish;
+ return -errno;
}
assert((size_t) n <= left);
}
assert((size_t) n <= left);
@@
-357,12
+339,7
@@
static int write_to_terminal(const char *tty, const char *message) {
left -= n;
}
left -= n;
}
- r = 0;
-
-finish:
- close_nointr_nofail(fd);
-
- return r;
+ return 0;
}
int utmp_wall(const char *message, bool (*match_tty)(const char *tty)) {
}
int utmp_wall(const char *message, bool (*match_tty)(const char *tty)) {
@@
-403,10
+380,12
@@
int utmp_wall(const char *message, bool (*match_tty)(const char *tty)) {
if (u->ut_type != USER_PROCESS || u->ut_user[0] == 0)
continue;
if (u->ut_type != USER_PROCESS || u->ut_user[0] == 0)
continue;
+ /* this access is fine, because strlen("/dev/") << 32 (UT_LINESIZE) */
if (path_startswith(u->ut_line, "/dev/"))
path = u->ut_line;
else {
if (path_startswith(u->ut_line, "/dev/"))
path = u->ut_line;
else {
- if (asprintf(&buf, "/dev/%s", u->ut_line) < 0) {
+ if (asprintf(&buf, "/dev/%.*s",
+ (int) sizeof(u->ut_line), u->ut_line) < 0) {
r = -ENOMEM;
goto finish;
}
r = -ENOMEM;
goto finish;
}