return 0;
}
+/*
+ * Get the maximal number of symlinks to follow. Use sysconf() on
+ * Hurd where the hardcoded value MAXSYMLINKS is not available.
+ */
+static int maxsymlinks(void)
+{
+ int v = sysconf(_SC_SYMLOOP_MAX);
+#ifdef MAXSYMLINKS
+ if (v == -1)
+ return MAXSYMLINKS;
+#endif
+ return v;
+}
+
/*
* Check path is located on a network based partition.
*/
{
char buf[PATH_MAX+1];
const char *curr;
- int deep = MAXSYMLINKS;
+ int deep = maxsymlinks();
if (!nlist) return 0;
/* Read SID & statname from it. */
if ((fp = fopen(path, "r")) != NULL) {
- if (!fgets(buf, sizeof(buf), fp))
- buf[0] = '\0';
+ size_t len;
+
+ len = fread(buf, sizeof(char), sizeof(buf)-1, fp);
+ buf[len] = '\0';
if (buf[0] == '\0') {
nsyslog(LOG_ERR,
if ((p->nfs = check4nfs(path, buf)))
goto link;
case DO_STAT:
- if (stat(path, &st) != 0)
+ if (stat(path, &st) != 0) {
+ char * ptr;
+
+ len = readlink(path, buf, PATH_MAX);
+ if (len <= 0)
+ break;
+ buf[len] = '\0';
+
+ ptr = strstr(buf, " (deleted)");
+ if (!ptr)
+ break;
+ *ptr = '\0';
+ len -= strlen(" (deleted)");
+
+ if (stat(buf, &st) != 0)
+ break;
+ p->dev = st.st_dev;
+ p->ino = st.st_ino;
+ p->pathname = (char *)xmalloc(len + 1);
+ memcpy(p->pathname, buf, len);
+ p->pathname[len] = '\0';
+
+ /* All done */
break;
+ }
+
p->dev = st.st_dev;
p->ino = st.st_ino;