/* * See if btree or recno databases in the destination are out of date * with respect to a single manpath component. * Return -1 on fatal error, 0 if the source is no longer valid (and * shouldn't be listed), and 1 if the update went well. */ static int treecpy(char *dst, char *src) { size_t dsz, ssz; int rc; dsz = strlen(dst); ssz = strlen(src); xstrlcat(src, "/", MAXPATHLEN); xstrlcat(dst, "/", MAXPATHLEN); xstrlcat(src, MANDOC_IDX, MAXPATHLEN); xstrlcat(dst, MANDOC_IDX, MAXPATHLEN); if (-1 == (rc = isnewer(dst, src))) return(0); dst[(int)dsz] = src[(int)ssz] = '\0'; if (1 == rc) return(update(dst, src)); xstrlcat(src, "/", MAXPATHLEN); xstrlcat(dst, "/", MAXPATHLEN); xstrlcat(src, MANDOC_DB, MAXPATHLEN); xstrlcat(dst, MANDOC_DB, MAXPATHLEN); if (-1 == (rc = isnewer(dst, src))) return(0); else if (rc == 0) return(1); dst[(int)dsz] = src[(int)ssz] = '\0'; return(update(dst, src)); }
static int link_unless_newer_exists(const char *name, const char *alias, int rev) { again: if (link(name, alias) == 0) { printf("link %s->%s\n", alias, name); return 1; } if (errno != EEXIST) err(2, "link %s->%s", alias, name); if (isnewer(alias, rev)) return 0; printf("replacing %s\n", alias); if (unlink(alias)) err(2, "unlink %s", alias); goto again; }
/* * Pass over the recno database and re-create HTML pages if they're * found to be out of date. * Returns -1 on fatal error, 1 on success. */ static int indexhtml(char *src, size_t ssz, char *dst, size_t dsz) { DB *idx; DBT key, val; int c, rc; unsigned int fl; const char *f; char *d; char fname[MAXPATHLEN]; pid_t pid; pid = -1; xstrlcpy(fname, dst, MAXPATHLEN); xstrlcat(fname, "/", MAXPATHLEN); xstrlcat(fname, MANDOC_IDX, MAXPATHLEN); idx = dbopen(fname, O_RDONLY, 0, DB_RECNO, NULL); if (NULL == idx) { perror(fname); return(-1); } fl = R_FIRST; while (0 == (c = (*idx->seq)(idx, &key, &val, fl))) { fl = R_NEXT; /* * If the record is zero-length, then it's unassigned. * Skip past these. */ if (0 == val.size) continue; f = (const char *)val.data + 1; if (NULL == memchr(f, '\0', val.size - 1)) break; src[(int)ssz] = dst[(int)dsz] = '\0'; xstrlcat(dst, "/", MAXPATHLEN); xstrlcat(dst, f, MAXPATHLEN); xstrlcat(src, "/", MAXPATHLEN); xstrlcat(src, f, MAXPATHLEN); if (-1 == (rc = isnewer(dst, src))) { fprintf(stderr, "%s: File missing\n", f); break; } else if (0 == rc) continue; d = strrchr(dst, '/'); assert(NULL != d); *d = '\0'; if (-1 == mkpath(dst, 0755, 0755)) { perror(dst); break; } *d = '/'; if ( ! filecpy(dst, src)) break; if (verbose) printf("%s\n", dst); } (*idx->close)(idx); if (c < 0) perror(fname); else if (0 == c) fprintf(stderr, "%s: Corrupt index\n", fname); return(1 == c ? 1 : -1); }