+static const char sdb_path[] = "/org/freedesktop/systemd1";
+static const char sdb_destination[] = "org.freedesktop.systemd1";
+static const char sdbi_manager[] = "org.freedesktop.systemd1.Manager";
+static const char sdbm_reload[] = "Reload";
+
+static struct sd_bus *sysbus;
+static struct sd_bus *usrbus;
+
+/*
+ * Translate systemd errors to errno errors
+ */
+static int seterrno(int value)
+{
+ errno = value;
+ return -1;
+}
+
+static int sderr2errno(int rc)
+{
+ return rc < 0 ? seterrno(-rc) : rc;
+}
+
+static int errno2sderr(int rc)
+{
+ return rc < 0 ? -errno : rc;
+}
+
+/* Returns in 'ret' either the system bus (if isuser==0)
+ * or the user bus (if isuser!=0).
+ * Returns 0 in case of success or -1 in case of error
+ */
+static int get_bus(int isuser, struct sd_bus **ret)
+{
+ int rc;
+ struct sd_bus *bus;
+
+ bus = isuser ? usrbus : sysbus;
+ if (bus) {
+ *ret = bus;
+ rc = 0;
+ } else if (isuser) {
+ rc = sd_bus_default_user(ret);
+ if (!rc)
+ usrbus = *ret;
+ } else {
+ rc = sd_bus_default_system(ret);
+ if (!rc)
+ sysbus = *ret;
+ }
+ return sderr2errno(rc);
+}
+static int check_snprintf_result(int rc, size_t buflen)
+{
+ return (rc >= 0 && (size_t)rc >= buflen) ? seterrno(ENAMETOOLONG) : rc;
+}
+
+int systemd_get_units_dir(char *path, size_t pathlen, int isuser)
+{
+ int rc = snprintf(path, pathlen, "%s/%s",
+ SYSTEMD_UNITS_ROOT,
+ isuser ? "user" : "system");
+
+ return check_snprintf_result(rc, pathlen);
+}
+