while ((ff = fts_read(f)) != NULL) {
path = ff->fts_path + 2;
switch (ff->fts_info) {
/*
* Symbolic links require various sanity checks,
* then get handled just like regular files.
*/
case FTS_SL:
if (realpath(path, buf) == NULL) {
if (warnings)
say(path, "&realpath");
continue;
}
if (strncmp(buf, basedir, basedir_len) != 0
#ifdef READ_ALLOWED_PATH
&& !read_allowed(buf)
#endif
) {
if (warnings) say("",
"%s: outside base directory", buf);
continue;
}
/* Use logical inode to avoid mpages dupe. */
if (stat(path, ff->fts_statp) == -1) {
if (warnings)
say(path, "&stat");
continue;
}
/* FALLTHROUGH */
/*
* If we're a regular file, add an mlink by using the
* stored directory data and handling the filename.
*/
case FTS_F:
if ( ! strcmp(path, MANDOC_DB))
continue;
if ( ! use_all && ff->fts_level < 2) {
if (warnings)
say(path, "Extraneous file");
continue;
}
gzip = 0;
fsec = NULL;
while (fsec == NULL) {
fsec = strrchr(ff->fts_name, '.');
if (fsec == NULL || strcmp(fsec+1, "gz"))
break;
gzip = 1;
*fsec = '\0';
fsec = NULL;
}
if (fsec == NULL) {
if ( ! use_all) {
if (warnings)
say(path,
"No filename suffix");
continue;
}
} else if ( ! strcmp(++fsec, "html")) {
if (warnings)
say(path, "Skip html");
continue;
} else if ( ! strcmp(fsec, "ps")) {
if (warnings)
say(path, "Skip ps");
continue;
} else if ( ! strcmp(fsec, "pdf")) {
if (warnings)
say(path, "Skip pdf");
continue;
} else if ( ! use_all &&
((dform == FORM_SRC &&
strncmp(fsec, dsec, strlen(dsec))) ||
(dform == FORM_CAT && strcmp(fsec, "0")))) {
if (warnings)
say(path, "Wrong filename suffix");
continue;
} else
fsec[-1] = '\0';
mlink = mandoc_calloc(1, sizeof(struct mlink));
if (strlcpy(mlink->file, path,
sizeof(mlink->file)) >=
sizeof(mlink->file)) {
say(path, "Filename too long");
free(mlink);
continue;
}
mlink->dform = dform;
mlink->dsec = dsec;
mlink->arch = arch;
mlink->name = ff->fts_name;
mlink->fsec = fsec;
mlink->gzip = gzip;
mlink_add(mlink, ff->fts_statp);
continue;