symlinks
Olson, Arthur David (NCI)
olsona at dc37a.nci.nih.gov
Thu Mar 14 16:53:43 UTC 2002
Below find a proposed rewrite of the "symbolic link" section of zic.c;
I hope this deals with the problems circulated recently on the time zone
mailing list.
--ado
#if (HAVE_SYMLINK - 0)
/*
** If hard link fails but from file exists, try a symbolic
link.
** We want as relative a link as possible to maximize
chances
** of correct behavior when the link is part of an
** exported directory.
*/
if (result != 0 &&
access(fromname, F_OK) == 0 &&
!itsdir(fromname)) {
register char * t = toname;
register char * f = fromname;
register char * s;
register int n;
while ((s = strchr(t, '/')) != NULL &&
strncmp(t, f, (n = (s - t) + 1)) == 0) {
t += n;
f += n;
}
/*
** f t desired symlink
value
** /a/b/c /d/e/f eliminated just
above
** a/b/c d/e/f ../../a/b/c
** a/b d/e/f ../../a/b
** a/b/c d/e ../a/b/c
** /a/b/c d/e/f /a/b/c
** a/b/c /d/e/f hard to handle well
*/
if (*f == '/')
s = ecpyalloc(f);
else {
s = NULL;
if (*t != '/') {
while (*t != '\0')
if (*t++ == '/')
s = ecatalloc(s,
"../");
s = ecatalloc(s, f);
}
}
if (s != NULL) {
result = symlink(s, toname);
ifree(s);
if (result == 0)
warning(_("hard link failed, symbolic link used"));
}
}
#endif
More information about the tz
mailing list