assert(service);
assert(alias);
+ if (streq(service, alias)) {
+ log_error("Ignoring creation of an alias %s for itself", service);
+ return 0;
+ }
+
link = strjoin(arg_dest, "/", alias, NULL);
if (!link)
return log_oom();
_cleanup_free_ char *wants = NULL;
_cleanup_free_ char *conflicts = NULL;
int r;
+ struct stat st;
before = strv_join(s->before, " ");
if (!before)
if (!unit)
return log_oom();
+ /* We might already have a symlink with the same name from a Provides:,
+ * or from backup files like /etc/init.d/foo.bak. Real scripts always win,
+ * so remove an existing link */
+ if (lstat(unit, &st) == 0 && S_ISLNK(st.st_mode)) {
+ log_warning("Overwriting existing symlink %s with real service", unit);
+ unlink(unit);
+ }
+
f = fopen(unit, "wxe");
if (!f)
return log_error_errno(errno, "Failed to create unit file %s: %m", unit);
"time", SPECIAL_TIME_SYNC_TARGET,
};
- unsigned i;
- char *r;
+ char *filename_no_sh, *e, *r;
const char *n;
+ unsigned i;
assert(name);
assert(_r);
goto finish;
}
+ /* strip ".sh" suffix from file name for comparison */
+ filename_no_sh = strdupa(filename);
+ e = endswith(filename, ".sh");
+ if (e) {
+ *e = '\0';
+ filename = filename_no_sh;
+ }
+
/* If we don't know this name, fallback heuristics to figure
* out whether something is a target or a service alias. */
if (!f)
return errno == ENOENT ? 0 : -errno;
+ log_debug("Loading SysV script %s", s->path);
+
while (!feof(f)) {
char l[LINE_MAX], *t;
return -ENOMEM;
r = sysv_translate_facility(n, basename(s->path), &m);
-
if (r < 0)
return r;
-
if (r == 0)
continue;
if (unit_name_to_type(m) == UNIT_SERVICE) {
+ log_debug("Adding Provides: alias '%s' for '%s'", m, s->name);
r = add_alias(s->name, m);
} else {
/* NB: SysV targets
struct stat st;
int r;
- if (hidden_file(de->d_name))
- continue;
+ dirent_ensure_type(d, de);
+
+ if (!dirent_is_file(de))
+ continue;
if (fstatat(dirfd(d), de->d_name, &st, 0) < 0) {
log_warning_errno(errno, "stat() failed on %s/%s: %m", *path, de->d_name);