X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-bus%2Fbus-internal.c;h=3fb1cf40f35c72e863a1e52b470cc8b198c86643;hp=cac948e875df4f97a7732b742e6098f20bb54b98;hb=0cc1125ae10a216f2b27cb2828849ac1beb6a1b1;hpb=f5f6e41a9ee008e1632f79ab3fa20beef7c2b613 diff --git a/src/libsystemd-bus/bus-internal.c b/src/libsystemd-bus/bus-internal.c index cac948e87..3fb1cf40f 100644 --- a/src/libsystemd-bus/bus-internal.c +++ b/src/libsystemd-bus/bus-internal.c @@ -61,6 +61,29 @@ bool object_path_is_valid(const char *p) { return true; } +char* object_path_startswith(const char *a, const char *b) { + const char *p; + + if (!object_path_is_valid(a) || + !object_path_is_valid(b)) + return NULL; + + if (streq(b, "/")) + return (char*) a + 1; + + p = startswith(a, b); + if (!p) + return NULL; + + if (*p == 0) + return (char*) p; + + if (*p == '/') + return (char*) p + 1; + + return NULL; +} + bool interface_name_is_valid(const char *p) { const char *q; bool dot, found_dot = false; @@ -143,6 +166,17 @@ bool service_name_is_valid(const char *p) { return true; } +bool sender_name_is_valid(const char *p) { + if (isempty(p)) + return false; + + /* FIXME: remove after PID 1 bus conversion */ + if (streq(p, ":no-sender")) + return true; + + return service_name_is_valid(p); +} + bool member_name_is_valid(const char *p) { const char *q; @@ -229,13 +263,13 @@ bool path_simple_pattern(const char *pattern, const char *value) { int bus_message_type_from_string(const char *s, uint8_t *u) { if (streq(s, "signal")) - *u = SD_BUS_MESSAGE_TYPE_SIGNAL; + *u = SD_BUS_MESSAGE_SIGNAL; else if (streq(s, "method_call")) - *u = SD_BUS_MESSAGE_TYPE_METHOD_CALL; + *u = SD_BUS_MESSAGE_METHOD_CALL; else if (streq(s, "error")) - *u = SD_BUS_MESSAGE_TYPE_METHOD_ERROR; + *u = SD_BUS_MESSAGE_METHOD_ERROR; else if (streq(s, "method_return")) - *u = SD_BUS_MESSAGE_TYPE_METHOD_RETURN; + *u = SD_BUS_MESSAGE_METHOD_RETURN; else return -EINVAL; @@ -243,14 +277,40 @@ int bus_message_type_from_string(const char *s, uint8_t *u) { } const char *bus_message_type_to_string(uint8_t u) { - if (u == SD_BUS_MESSAGE_TYPE_SIGNAL) + if (u == SD_BUS_MESSAGE_SIGNAL) return "signal"; - else if (u == SD_BUS_MESSAGE_TYPE_METHOD_CALL) + else if (u == SD_BUS_MESSAGE_METHOD_CALL) return "method_call"; - else if (u == SD_BUS_MESSAGE_TYPE_METHOD_ERROR) + else if (u == SD_BUS_MESSAGE_METHOD_ERROR) return "error"; - else if (u == SD_BUS_MESSAGE_TYPE_METHOD_RETURN) + else if (u == SD_BUS_MESSAGE_METHOD_RETURN) return "method_return"; else return NULL; } + +char *bus_address_escape(const char *v) { + const char *a; + char *r, *b; + + r = new(char, strlen(v)*3+1); + if (!r) + return NULL; + + for (a = v, b = r; *a; a++) { + + if ((*a >= '0' && *a <= '9') || + (*a >= 'a' && *a <= 'z') || + (*a >= 'A' && *a <= 'Z') || + strchr("_-/.", *a)) + *(b++) = *a; + else { + *(b++) = '%'; + *(b++) = hexchar(*a >> 4); + *(b++) = hexchar(*a & 0xF); + } + } + + *b = 0; + return r; +}