confd: handle dup calls to dagger_add_dep()

Some callbacks may run twice, e.g., lag_gen_ports().  Check if the link
already exists, and is the same, then we can exit silently.  However, in
case the link exists and does *not* point to the same target, we log an
error with current target for the post mortem.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg
2025-02-12 23:21:08 +01:00
committed by Tobias Waldekranz
parent 78499757b0
commit d7895d5c9c
2 changed files with 26 additions and 4 deletions
+25 -3
View File
@@ -87,10 +87,32 @@ FILE *dagger_fopen_net_exit(struct dagger *d, const char *node, enum netdag_exit
return dagger_fopen_current(d, "exit", node, order, script);
}
int dagger_add_dep(struct dagger *d, const char *depender, const char *dependee)
int dagger_add_dep(const struct dagger *d, const char *depender, const char *dependee)
{
return systemf("ln -s ../%s %s/%d/dag/%s", dependee,
d->path, d->next, depender);
char link[strlen(d->path) + strlen(depender) + strlen(dependee) + 16];
char target[strlen(dependee) + 16];
char path[strlen(dependee) + 16];
ssize_t len;
/*
* Some callbacks may run twice, double check symlink, if it
* exists already and points to the same target, we're OK.
*/
snprintf(target, sizeof(target), "../%s", dependee);
snprintf(link, sizeof(link), "%s/%d/dag/%s/%s", d->path, d->next, depender, dependee);
len = readlink(link, path, sizeof(path));
if (len > 0) {
path[len] = 0;
if (strcmp(target, path)) {
ERROR("Dagger dependency already exists %s -> %s", target, path);
return errno = EEXIST;
}
return 0; /* same, ignore */
}
return symlink(target, link);
}
int dagger_add_node(struct dagger *d, const char *node)
+1 -1
View File
@@ -21,7 +21,7 @@ FILE *dagger_fopen_next(struct dagger *d, const char *action, const char *node,
FILE *dagger_fopen_current(struct dagger *d, const char *action, const char *node,
unsigned char prio, const char *script);
int dagger_add_dep(struct dagger *d, const char *depender, const char *dependee);
int dagger_add_dep(const struct dagger *d, const char *depender, const char *dependee);
int dagger_add_node(struct dagger *d, const char *node);
int dagger_abandon(struct dagger *d);
int dagger_evolve(struct dagger *d);