#include "hashmap.h"
#include "env-util.h"
#include "fileio.h"
+#include "device-nodes.h"
int saved_argc = 0;
char **saved_argv = NULL;
return (char*) s + sl - pl;
}
-char* startswith(const char *s, const char *prefix) {
- const char *a, *b;
-
- assert(s);
- assert(prefix);
-
- a = s, b = prefix;
- for (;;) {
- if (*b == 0)
- return (char*) a;
- if (*a != *b)
- return NULL;
-
- a++, b++;
- }
-}
-
-char* startswith_no_case(const char *s, const char *prefix) {
- const char *a, *b;
-
- assert(s);
- assert(prefix);
-
- a = s, b = prefix;
- for (;;) {
- if (*b == 0)
- return (char*) a;
- if (tolower(*a) != tolower(*b))
- return NULL;
-
- a++, b++;
- }
-}
-
bool first_word(const char *s, const char *word) {
size_t sl, wl;
int get_process_capeff(pid_t pid, char **capeff) {
const char *p;
- _cleanup_free_ char *status = NULL;
- char *t = NULL;
- int r;
assert(capeff);
assert(pid >= 0);
else
p = procfs_file_alloca(pid, "status");
- r = read_full_file(p, &status, NULL);
- if (r < 0)
- return r;
-
- t = strstr(status, "\nCapEff:\t");
- if (!t)
- return -ENOENT;
-
- for (t += strlen("\nCapEff:\t"); t[0] == '0'; t++)
- continue;
-
- if (t[0] == '\n')
- t--;
-
- *capeff = strndup(t, strchr(t, '\n') - t);
- if (!*capeff)
- return -ENOMEM;
-
- return 0;
+ return get_status_field(p, "\nCapEff:", capeff);
}
int get_process_exe(pid_t pid, char **name) {
}
static char *tag_to_udev_node(const char *tagvalue, const char *by) {
- char *dn, *t, *u;
- int r;
-
- /* FIXME: to follow udev's logic 100% we need to leave valid
- * UTF8 chars unescaped */
+ _cleanup_free_ char *t = NULL, *u = NULL;
+ char *dn;
+ size_t enc_len;
u = unquote(tagvalue, "\"\'");
if (u == NULL)
return NULL;
- t = xescape(u, "/ ");
- free(u);
-
+ enc_len = strlen(u) * 4;
+ t = new(char, enc_len);
if (t == NULL)
return NULL;
- r = asprintf(&dn, "/dev/disk/by-%s/%s", by, t);
- free(t);
+ if (encode_devnode_name(u, t, enc_len) < 0)
+ return NULL;
- if (r < 0)
+ if (asprintf(&dn, "/dev/disk/by-%s/%s", by, t) < 0)
return NULL;
return dn;
return true;
}
+/**
+ * Check if a string contains control characters.
+ * Spaces and tabs are not considered control characters.
+ */
bool string_has_cc(const char *p) {
const char *t;
assert(p);
for (t = p; *t; t++)
- if (*t > 0 && *t < ' ')
+ if (*t > 0 && *t < ' ' && *t != '\t')
return true;
return false;