static volatile unsigned cached_columns = 0;
static volatile unsigned cached_lines = 0;
+#define PROCFS_PATH_LEN (sizeof("/proc/")-1 + DECIMAL_STR_MAX(pid_t))
+
+#define FORMAT_PROCFS_PATH(buffer, path, pid) \
+ do { \
+ assert_cc(sizeof(buffer) == (PROCFS_PATH_LEN + 1 + sizeof(path))); \
+ snprintf(buffer, sizeof(buffer) - 1, "/proc/%lu/%s", (unsigned long) pid, path); \
+ char_array_0(buffer); \
+ } while(0)
+
+
size_t page_size(void) {
static __thread size_t pgsz = 0;
long r;
close_nointr_nofail(fds[i]);
}
+int unlink_noerrno(const char *path) {
+ PROTECT_ERRNO;
+ int r;
+
+ r = unlink(path);
+ if (r < 0)
+ return -errno;
+
+ return 0;
+}
+
int parse_boolean(const char *v) {
assert(v);
if (pid == 0)
r = read_one_line_file("/proc/self/comm", name);
else {
- char *p;
- if (asprintf(&p, "/proc/%lu/comm", (unsigned long) pid) < 0)
- return -ENOMEM;
-
- r = read_one_line_file(p, name);
- free(p);
+ char path[PROCFS_PATH_LEN + sizeof("/comm")];
+ FORMAT_PROCFS_PATH(path, "comm", pid);
+ r = read_one_line_file(path, name);
}
return r;
if (pid == 0)
f = fopen("/proc/self/cmdline", "re");
else {
- char *p;
- if (asprintf(&p, "/proc/%lu/cmdline", (unsigned long) pid) < 0)
- return -ENOMEM;
-
- f = fopen(p, "re");
- free(p);
+ char path[PROCFS_PATH_LEN + sizeof("/cmdline")];
+ FORMAT_PROCFS_PATH(path, "cmdline", pid);
+ f = fopen(path, "re");
}
if (!f)
}
int is_kernel_thread(pid_t pid) {
- char *p;
+ char path[PROCFS_PATH_LEN + sizeof("/cmdline")];
size_t count;
char c;
bool eof;
if (pid == 0)
return 0;
- if (asprintf(&p, "/proc/%lu/cmdline", (unsigned long) pid) < 0)
- return -ENOMEM;
-
- f = fopen(p, "re");
- free(p);
+ FORMAT_PROCFS_PATH(path, "cmdline", pid);
+ f = fopen(path, "re");
if (!f)
return -errno;
if (pid == 0)
r = readlink_malloc("/proc/self/exe", name);
else {
- char *p;
- if (asprintf(&p, "/proc/%lu/exe", (unsigned long) pid) < 0)
- return -ENOMEM;
-
- r = readlink_malloc(p, name);
- free(p);
+ char path[PROCFS_PATH_LEN + sizeof("/exe")];
+ FORMAT_PROCFS_PATH(path, "exe", pid);
+ r = readlink_malloc(path, name);
}
return r;
static int get_process_id(pid_t pid, const char *field, uid_t *uid) {
_cleanup_fclose_ FILE *f = NULL;
- _cleanup_free_ char *p = NULL;
+ char path[PROCFS_PATH_LEN + sizeof("/status")];
char line[LINE_MAX];
assert(field);
if (pid == 0)
return getuid();
- if (asprintf(&p, "/proc/%lu/status", (unsigned long) pid) < 0)
- return -ENOMEM;
-
- f = fopen(p, "re");
+ FORMAT_PROCFS_PATH(path, "status", pid);
+ f = fopen(path, "re");
if (!f)
return -errno;
char* hostname_cleanup(char *s) {
char *p, *d;
+ bool dot;
+
+ for (p = s, d = s, dot = true; *p; p++) {
+ if (*p == '.') {
+ if (dot || p[1] == 0)
+ continue;
+
+ dot = true;
+ } else
+ dot = false;
- for (p = s, d = s; *p; p++)
- if ((*p >= 'a' && *p <= 'z') ||
- (*p >= 'A' && *p <= 'Z') ||
- (*p >= '0' && *p <= '9') ||
- *p == '-' ||
- *p == '_' ||
- *p == '.')
+ if (hostname_valid_char(*p))
*(d++) = *p;
+ }
*d = 0;
-
strshorten(s, HOST_NAME_MAX);
+
return s;
}
errno = 0;
p = getpwuid(u);
if (!p)
- return errno ? -errno : -ESRCH;
+ return errno > 0 ? -errno : -ESRCH;
if (!path_is_absolute(p->pw_dir))
return -EINVAL;
return 0;
}
-void fclosep(FILE **f) {
- if (*f)
- fclose(*f);
-}
-
-void pclosep(FILE **f) {
- if (*f)
- pclose(*f);
-}
-
-void closep(int *fd) {
- if (*fd >= 0)
- close_nointr_nofail(*fd);
-}
-
-void closedirp(DIR **d) {
- if (*d)
- closedir(*d);
-}
-
bool filename_is_safe(const char *p) {
if (isempty(p))
goto out;
}
- cached_answer = streq(set, "UTF-8");
+ if(streq(set, "UTF-8")) {
+ cached_answer = true;
+ goto out;
+ }
+
+ /* For LC_CTYPE=="C" return true,
+ * because CTYPE is effectly unset and
+ * everything defaults to UTF-8 nowadays. */
+
+ set = setlocale(LC_CTYPE, NULL);
+ if (!set) {
+ cached_answer = true;
+ goto out;
+ }
+
+ cached_answer = streq(set, "C");
+
out:
return (bool)cached_answer;
}