* systemd-repart: allow config of partition uuid
-* userdb: allow username prefix searches in varlink API
+* userdb: allow username prefix searches in varlink API, allow realname and
+ realname substr searches in varlink API
* userdb: allow existence checks
make assumptions about their slice anymore.
- follow PropertiesChanged state more closely, to deal with quick logouts and
relogins
+ - (optionally?) spawn seat-manager@$SEAT.service whenever a seat shows up that as CanGraphical set
* journal:
- consider introducing implicit _TTY= + _PPID= + _EUID= + _EGID= + _FSUID= + _FSGID= fields
bool escaped = false;
int n;
- for (n=0; s[n]; n++) {
+ for (n = 0; s[n] != '\0'; n++) {
if (escaped)
escaped = false;
else if (s[n] == '\\')
break;
}
- /* if s ends in \, return index of previous char */
- return n - escaped;
+ return n;
}
/* Split a string into words. */
-const char* split(const char **state, size_t *l, const char *separator, SplitFlags flags) {
+const char* split(
+ const char **state,
+ size_t *l,
+ const char *separator,
+ SplitFlags flags) {
+
const char *current;
+ assert(state);
+ assert(l);
+
+ if (!separator)
+ separator = WHITESPACE;
+
current = *state;
- if (!*current) {
- assert(**state == '\0');
+ if (*current == '\0') /* already at the end? */
return NULL;
- }
- current += strspn(current, separator);
- if (!*current) {
+ current += strspn(current, separator); /* skip leading separators */
+ if (*current == '\0') { /* at the end now? */
*state = current;
return NULL;
}
- if (flags & SPLIT_QUOTES && strchr("\'\"", *current)) {
- char quotechars[2] = {*current, '\0'};
-
- *l = strcspn_escaped(current + 1, quotechars);
- if (current[*l + 1] == '\0' || current[*l + 1] != quotechars[0] ||
- (current[*l + 2] && !strchr(separator, current[*l + 2]))) {
- /* right quote missing or garbage at the end */
- if (flags & SPLIT_RELAX) {
- *state = current + *l + 1 + (current[*l + 1] != '\0');
- return current + 1;
+ if (FLAGS_SET(flags, SPLIT_QUOTES)) {
+
+ if (strchr(QUOTES, *current)) {
+ /* We are looking at a quote */
+ *l = strcspn_escaped(current + 1, CHAR_TO_STR(*current));
+ if (current[*l + 1] != *current ||
+ (current[*l + 2] != 0 && !strchr(separator, current[*l + 2]))) {
+ /* right quote missing or garbage at the end */
+ if (FLAGS_SET(flags, SPLIT_RELAX)) {
+ *state = current + *l + 1 + (current[*l + 1] != '\0');
+ return current + 1;
+ }
+ *state = current;
+ return NULL;
}
- *state = current;
- return NULL;
- }
- *state = current++ + *l + 2;
- } else if (flags & SPLIT_QUOTES) {
- *l = strcspn_escaped(current, separator);
- if (current[*l] && !strchr(separator, current[*l]) && !(flags & SPLIT_RELAX)) {
- /* unfinished escape */
- *state = current;
- return NULL;
+ *state = current++ + *l + 2;
+
+ } else {
+ /* We are looking at a something that is not a quote */
+ *l = strcspn_escaped(current, separator);
+ if (current[*l] && !strchr(separator, current[*l]) && !FLAGS_SET(flags, SPLIT_RELAX)) {
+ /* unfinished escape */
+ *state = current;
+ return NULL;
+ }
+ *state = current + *l;
}
- *state = current + *l;
} else {
*l = strcspn(current, separator);
*state = current + *l;
SPLIT_RELAX = 0x01 << 1,
} SplitFlags;
+/* Smelly. Do not use this anymore. Use extract_first_word() instead! */
const char* split(const char **state, size_t *l, const char *separator, SplitFlags flags);
+/* Similar, don't use this anymore */
#define FOREACH_WORD(word, length, s, state) \
_FOREACH_WORD(word, length, s, WHITESPACE, 0, state)