chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fsck: make fsck idempotent
[elogind.git]
/
src
/
util.c
diff --git
a/src/util.c
b/src/util.c
index 12c19b353b0f0e9b5883baacfca7ee681742db40..58f67b0d15b86b860ca2bb9bbe08ac8d40541b53 100644
(file)
--- a/
src/util.c
+++ b/
src/util.c
@@
-1681,6
+1681,8
@@
bool ignore_file(const char *filename) {
return
filename[0] == '.' ||
streq(filename, "lost+found") ||
return
filename[0] == '.' ||
streq(filename, "lost+found") ||
+ streq(filename, "aquota.user") ||
+ streq(filename, "aquota.group") ||
endswith(filename, "~") ||
endswith(filename, ".rpmnew") ||
endswith(filename, ".rpmsave") ||
endswith(filename, "~") ||
endswith(filename, ".rpmnew") ||
endswith(filename, ".rpmsave") ||
@@
-2247,26
+2249,34
@@
int acquire_terminal(const char *name, bool fail, bool force, bool ignore_tiocst
assert(notify >= 0);
for (;;) {
assert(notify >= 0);
for (;;) {
-
struct inotify_event e
;
+
uint8_t inotify_buffer[sizeof(struct inotify_event) + FILENAME_MAX]
;
ssize_t l;
ssize_t l;
+ struct inotify_event *e;
- if ((l = read(notify, &
e, sizeof(e))) != sizeof(e)
) {
+ if ((l = read(notify, &
inotify_buffer, sizeof(inotify_buffer))) < 0
) {
- if (l < 0) {
+ if (errno == EINTR)
+ continue;
- if (errno == EINTR)
- continue;
+ r = -errno;
+ goto fail;
+ }
+
+ e = (struct inotify_event*) inotify_buffer;
+
+ while (l > 0) {
+ size_t step;
- r = -errno;
- } else
+ if (e->wd != wd || !(e->mask & IN_CLOSE)) {
r = -EIO;
r = -EIO;
+ goto fail;
+ }
-
goto fail
;
- }
+
step = sizeof(struct inotify_event) + e->len
;
+ assert(step <= (size_t) l);
- if (e.wd != wd || !(e.mask & IN_CLOSE)) {
- r = -EIO;
- goto fail;
+ e = (struct inotify_event*) ((uint8_t*) e + step);
+ l -= step;
}
break;
}
break;
@@
-3319,15
+3329,16
@@
bool null_or_empty(struct stat *st) {
if (S_ISREG(st->st_mode) && st->st_size <= 0)
return true;
if (S_ISREG(st->st_mode) && st->st_size <= 0)
return true;
- /* /dev/null has major/minor of 1:3 */
- if (S_ISCHR(st->st_mode) &&
- major(st->st_rdev) == 1 &&
- minor(st->st_rdev) == 3)
+ if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode))
return true;
return false;
}
return true;
return false;
}
+DIR *xopendirat(int fd, const char *name) {
+ return fdopendir(openat(fd, name, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC));
+}
+
static const char *const ioprio_class_table[] = {
[IOPRIO_CLASS_NONE] = "none",
[IOPRIO_CLASS_RT] = "realtime",
static const char *const ioprio_class_table[] = {
[IOPRIO_CLASS_NONE] = "none",
[IOPRIO_CLASS_RT] = "realtime",