if (_likely_(pgsz > 0))
return pgsz;
- assert_se((r = sysconf(_SC_PAGESIZE)) > 0);
+ r = sysconf(_SC_PAGESIZE);
+ assert(r > 0);
pgsz = (size_t) r;
-
return pgsz;
}
if (sl < pl)
return false;
- for(i = 0; i < pl; ++i) {
+ for(i = 0; i < pl; ++i)
if (tolower(s[i]) != tolower(prefix[i]))
return false;
- }
return true;
}
assert(s);
assert(ret_pid);
- if ((r = safe_atolu(s, &ul)) < 0)
+ r = safe_atolu(s, &ul);
+ if (r < 0)
return r;
pid = (pid_t) ul;
assert(s);
assert(ret_uid);
- if ((r = safe_atolu(s, &ul)) < 0)
+ r = safe_atolu(s, &ul);
+ if (r < 0)
return r;
uid = (uid_t) ul;
int get_parent_of_pid(pid_t pid, pid_t *_ppid) {
int r;
- FILE *f;
+ _cleanup_fclose_ FILE *f = NULL;
char fn[PATH_MAX], line[LINE_MAX], *p;
long unsigned ppid;
assert_se(snprintf(fn, sizeof(fn)-1, "/proc/%lu/stat", (unsigned long) pid) < (int) (sizeof(fn)-1));
char_array_0(fn);
- if (!(f = fopen(fn, "re")))
+ f = fopen(fn, "re");
+ if (!f)
return -errno;
- if (!(fgets(line, sizeof(line), f))) {
+ if (!fgets(line, sizeof(line), f)) {
r = feof(f) ? -EIO : -errno;
fclose(f);
return r;
}
- fclose(f);
-
/* Let's skip the pid and comm fields. The latter is enclosed
* in () but does not escape any () in its value, so let's
* skip over it manually */
- if (!(p = strrchr(line, ')')))
+ p = strrchr(line, ')');
+ if (!p)
return -EIO;
p++;
}
int get_starttime_of_pid(pid_t pid, unsigned long long *st) {
- int r;
- FILE *f;
+ _cleanup_fclose_ FILE *f = NULL;
char fn[PATH_MAX], line[LINE_MAX], *p;
assert(pid > 0);
assert_se(snprintf(fn, sizeof(fn)-1, "/proc/%lu/stat", (unsigned long) pid) < (int) (sizeof(fn)-1));
char_array_0(fn);
- if (!(f = fopen(fn, "re")))
+ f = fopen(fn, "re");
+ if (!f)
return -errno;
- if (!(fgets(line, sizeof(line), f))) {
- r = feof(f) ? -EIO : -errno;
- fclose(f);
- return r;
- }
+ if (!fgets(line, sizeof(line), f)) {
+ if (ferror(f))
+ return -errno;
- fclose(f);
+ return -EIO;
+ }
/* Let's skip the pid and comm fields. The latter is enclosed
* in () but does not escape any () in its value, so let's
* skip over it manually */
- if (!(p = strrchr(line, ')')))
+ p = strrchr(line, ')');
+ if (!p)
return -EIO;
p++;
}
int write_one_line_file(const char *fn, const char *line) {
- FILE *f;
- int r;
+ _cleanup_fclose_ FILE *f = NULL;
assert(fn);
assert(line);
return -errno;
errno = 0;
- if (fputs(line, f) < 0) {
- r = -errno;
- goto finish;
- }
+ if (fputs(line, f) < 0)
+ return errno ? -errno : -EIO;
if (!endswith(line, "\n"))
fputc('\n', f);
fflush(f);
- if (ferror(f)) {
- if (errno != 0)
- r = -errno;
- else
- r = -EIO;
- } else
- r = 0;
+ if (ferror(f))
+ return errno ? -errno : -EIO;
-finish:
- fclose(f);
- return r;
+ return 0;
}
int fchmod_umask(int fd, mode_t m) {
}
int read_one_line_file(const char *fn, char **line) {
- FILE *f;
- int r;
+ _cleanup_fclose_ FILE *f = NULL;
char t[LINE_MAX], *c;
assert(fn);
if (!fgets(t, sizeof(t), f)) {
- if (ferror(f)) {
- r = -errno;
- goto finish;
- }
+ if (ferror(f))
+ return errno ? -errno : -EIO;
t[0] = 0;
}
c = strdup(t);
- if (!c) {
- r = -ENOMEM;
- goto finish;
- }
-
+ if (!c)
+ return -ENOMEM;
truncate_nl(c);
*line = c;
- r = 0;
-
-finish:
- fclose(f);
- return r;
+ return 0;
}
int read_full_file(const char *fn, char **contents, size_t *size) {
- FILE *f;
- int r;
+ _cleanup_fclose_ FILE *f = NULL;
size_t n, l;
- char *buf = NULL;
+ _cleanup_free_ char *buf = NULL;
struct stat st;
- if (!(f = fopen(fn, "re")))
+ f = fopen(fn, "re");
+ if (!f)
return -errno;
- if (fstat(fileno(f), &st) < 0) {
- r = -errno;
- goto finish;
- }
+ if (fstat(fileno(f), &st) < 0)
+ return -errno;
/* Safety check */
- if (st.st_size > 4*1024*1024) {
- r = -E2BIG;
- goto finish;
- }
+ if (st.st_size > 4*1024*1024)
+ return -E2BIG;
n = st.st_size > 0 ? st.st_size : LINE_MAX;
l = 0;
char *t;
size_t k;
- if (!(t = realloc(buf, n+1))) {
- r = -ENOMEM;
- goto finish;
- }
+ t = realloc(buf, n+1);
+ if (!t)
+ return -ENOMEM;
buf = t;
k = fread(buf + l, 1, n - l, f);
if (k <= 0) {
- if (ferror(f)) {
- r = -errno;
- goto finish;
- }
+ if (ferror(f))
+ return -errno;
break;
}
n *= 2;
/* Safety check */
- if (n > 4*1024*1024) {
- r = -E2BIG;
- goto finish;
- }
+ if (n > 4*1024*1024)
+ return -E2BIG;
}
buf[l] = 0;
if (size)
*size = l;
- r = 0;
-
-finish:
- fclose(f);
- free(buf);
-
- return r;
+ return 0;
}
int parse_env_file(
continue;
}
- r = rm_rf_children(subdir_fd, only_dirs, honour_sticky, root_dev);
+ r = rm_rf_children_dangerous(subdir_fd, only_dirs, honour_sticky, root_dev);
if (r < 0 && ret == 0)
ret = r;
assert(name);
assert(pid > 1);
- if ((r = wait_for_terminate(pid, &status)) < 0) {
+ r = wait_for_terminate(pid, &status);
+ if (r < 0) {
log_warning("Failed to wait for %s: %s", name, strerror(-r));
return r;
}
log_warning("%s failed due to unknown reason.", name);
return -EPROTO;
-
}
_noreturn_ void freeze(void) {
return access("/run/plymouth/pid", F_OK) >= 0;
}
-void syslog_parse_priority(char **p, int *priority) {
- int a = 0, b = 0, c = 0;
- int k;
-
- assert(p);
- assert(*p);
- assert(priority);
-
- if ((*p)[0] != '<')
- return;
-
- if (!strchr(*p, '>'))
- return;
-
- if ((*p)[2] == '>') {
- c = undecchar((*p)[1]);
- k = 3;
- } else if ((*p)[3] == '>') {
- b = undecchar((*p)[1]);
- c = undecchar((*p)[2]);
- k = 4;
- } else if ((*p)[4] == '>') {
- a = undecchar((*p)[1]);
- b = undecchar((*p)[2]);
- c = undecchar((*p)[3]);
- k = 5;
- } else
- return;
-
- if (a < 0 || b < 0 || c < 0)
- return;
-
- *priority = a*100+b*10+c;
- *p += k;
-}
-
-void syslog_skip_pid(char **buf) {
- char *p;
-
- assert(buf);
- assert(*buf);
-
- p = *buf;
-
- if (*p != '[')
- return;
-
- p++;
- p += strspn(p, "0123456789");
-
- if (*p != ']')
- return;
-
- p++;
-
- *buf = p;
-}
-
-void syslog_skip_date(char **buf) {
- enum {
- LETTER,
- SPACE,
- NUMBER,
- SPACE_OR_NUMBER,
- COLON
- } sequence[] = {
- LETTER, LETTER, LETTER,
- SPACE,
- SPACE_OR_NUMBER, NUMBER,
- SPACE,
- SPACE_OR_NUMBER, NUMBER,
- COLON,
- SPACE_OR_NUMBER, NUMBER,
- COLON,
- SPACE_OR_NUMBER, NUMBER,
- SPACE
- };
-
- char *p;
- unsigned i;
-
- assert(buf);
- assert(*buf);
-
- p = *buf;
-
- for (i = 0; i < ELEMENTSOF(sequence); i++, p++) {
-
- if (!*p)
- return;
-
- switch (sequence[i]) {
-
- case SPACE:
- if (*p != ' ')
- return;
- break;
-
- case SPACE_OR_NUMBER:
- if (*p == ' ')
- break;
-
- /* fall through */
-
- case NUMBER:
- if (*p < '0' || *p > '9')
- return;
-
- break;
-
- case LETTER:
- if (!(*p >= 'A' && *p <= 'Z') &&
- !(*p >= 'a' && *p <= 'z'))
- return;
-
- break;
-
- case COLON:
- if (*p != ':')
- return;
- break;
-
- }
- }
-
- *buf = p;
-}
-
char* strshorten(char *s, size_t l) {
assert(s);
}
int can_sleep(const char *type) {
- char *p, *w, *state;
+ char *w, *state;
size_t l, k;
- bool found = false;
int r;
+ _cleanup_free_ char *p = NULL;
assert(type);
return r == -ENOENT ? 0 : r;
k = strlen(type);
+ FOREACH_WORD_SEPARATOR(w, l, p, WHITESPACE, state)
+ if (l == k && memcmp(w, type, l) == 0)
+ return true;
- FOREACH_WORD_SEPARATOR(w, l, p, WHITESPACE, state) {
- if (l == k && strncmp(w, type, l) == 0) {
- found = true;
- break;
- }
- }
-
- free(p);
- return found;
+ return false;
}
bool is_valid_documentation_url(const char *url) {
}
void warn_melody(void) {
- int fd;
+ _cleanup_close_ int fd = -1;
fd = open("/dev/console", O_WRONLY|O_CLOEXEC|O_NOCTTY);
if (fd < 0)
usleep(125*USEC_PER_MSEC);
ioctl(fd, KIOCSOUND, 0);
- close_nointr_nofail(fd);
}
int make_console_stdio(void) {
errno = 0;
p = getpwuid(u);
if (!p)
- return errno ? -errno : -ENOENT;
+ return errno ? -errno : -ESRCH;
if (!path_is_absolute(p->pw_dir))
return -EINVAL;
*_sh = sh;
return 0;
}
+
+void freep(void *p) {
+ free(*(void**) p);
+}
+
+void fclosep(FILE **f) {
+ if (*f)
+ fclose(*f);
+}
+
+void closep(int *fd) {
+ if (*fd >= 0)
+ close_nointr_nofail(*fd);
+}