/* * A new file included. * If ifiles == NULL, this is the first file and already opened (stdin). * Return 0 on success, -1 if file to be included is not found. */ int pushfile(const usch *file, const usch *fn, int idx, void *incs) { struct includ ibuf; struct includ *ic; int otrulvl; ic = &ibuf; ic->next = ifiles; if (file != NULL) { if ((ic->infil = open((const char *)file, O_RDONLY)) < 0) return -1; ic->orgfn = ic->fname = file; if (++inclevel > MAX_INCLEVEL) error("limit for nested includes exceeded"); } else { ic->infil = 0; ic->orgfn = ic->fname = (const usch *)"<stdin>"; } #if LIBVMF if (ifiles) { vmmodify(ifiles->vseg); vmunlock(ifiles->vseg); } ic->vseg = vmmapseg(&ibspc, inclevel); vmlock(ic->vseg); #endif ifiles = ic; ic->ib = getobuf(BINBUF); ic->lineno = 1; ic->escln = 0; ic->maxread = ic->curptr; ic->idx = idx; ic->incs = incs; ic->fn = fn; prtline(1); otrulvl = trulvl; fastscan(); if (otrulvl != trulvl || flslvl) error("unterminated conditional"); ifiles = ic->next; inclevel--; #if LIBVMF vmmodify(ic->vseg); vmunlock(ic->vseg); ic->ib->ro = 1; /* XXX no free */ if (ifiles) { ifiles->vseg = vmmapseg(&ibspc, inclevel); vmlock(ifiles->vseg); ifiles->ib->buf = (usch *)ifiles->vseg->s_cinfo; } #endif close(ic->infil); bufree(ic->ib); return 0; }
int mlock(const void *addr, size_t size) { return vmlock((void *) addr, size); }