mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-30 12:33:02 +02:00
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:
committed by
Tobias Waldekranz
parent
78499757b0
commit
d7895d5c9c
+25
-3
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user