19b50d902SRodney W. Grimes /*-
28a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause
38a16b7a1SPedro F. Giffuni *
49b50d902SRodney W. Grimes * Copyright (c) 1991, 1993
59b50d902SRodney W. Grimes * The Regents of the University of California. All rights reserved.
69b50d902SRodney W. Grimes *
79b50d902SRodney W. Grimes * This code is derived from software contributed to Berkeley by
89b50d902SRodney W. Grimes * Edward Sze-Tyan Wang.
99b50d902SRodney W. Grimes *
109b50d902SRodney W. Grimes * Redistribution and use in source and binary forms, with or without
119b50d902SRodney W. Grimes * modification, are permitted provided that the following conditions
129b50d902SRodney W. Grimes * are met:
139b50d902SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright
149b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer.
159b50d902SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright
169b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the
179b50d902SRodney W. Grimes * documentation and/or other materials provided with the distribution.
18fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors
199b50d902SRodney W. Grimes * may be used to endorse or promote products derived from this software
209b50d902SRodney W. Grimes * without specific prior written permission.
219b50d902SRodney W. Grimes *
229b50d902SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
239b50d902SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
249b50d902SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
259b50d902SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
269b50d902SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
279b50d902SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
289b50d902SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
299b50d902SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
309b50d902SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
319b50d902SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
329b50d902SRodney W. Grimes * SUCH DAMAGE.
339b50d902SRodney W. Grimes */
349b50d902SRodney W. Grimes
35814e3a92SMark Murray
369b50d902SRodney W. Grimes
379b50d902SRodney W. Grimes #include <sys/types.h>
389b50d902SRodney W. Grimes #include <sys/stat.h>
39726098d3SDavid Malone #include <sys/mman.h>
40814e3a92SMark Murray
41814e3a92SMark Murray #include <err.h>
429b50d902SRodney W. Grimes #include <errno.h>
439b50d902SRodney W. Grimes #include <stdio.h>
449b50d902SRodney W. Grimes #include <stdlib.h>
459b50d902SRodney W. Grimes #include <string.h>
46814e3a92SMark Murray #include <unistd.h>
47814e3a92SMark Murray
48*c851fce6SMariusz Zaborski #include <libcasper.h>
49*c851fce6SMariusz Zaborski #include <casper/cap_fileargs.h>
50*c851fce6SMariusz Zaborski
519b50d902SRodney W. Grimes #include "extern.h"
529b50d902SRodney W. Grimes
539b50d902SRodney W. Grimes void
ierr(const char * fname)5422da50cfSBrian Somers ierr(const char *fname)
559b50d902SRodney W. Grimes {
5644cf272fSAdam David warn("%s", fname);
5744cf272fSAdam David rval = 1;
589b50d902SRodney W. Grimes }
599b50d902SRodney W. Grimes
609b50d902SRodney W. Grimes void
oerr(void)61ef636796SEd Schouten oerr(void)
629b50d902SRodney W. Grimes {
63ac551270SPeter Wemm err(1, "stdout");
649b50d902SRodney W. Grimes }
65726098d3SDavid Malone
66726098d3SDavid Malone /*
67726098d3SDavid Malone * Print `len' bytes from the file associated with `mip', starting at
68726098d3SDavid Malone * absolute file offset `startoff'. May move map window.
69726098d3SDavid Malone */
70726098d3SDavid Malone int
mapprint(struct mapinfo * mip,off_t startoff,off_t len)714bba8e59SPaul Richards mapprint(struct mapinfo *mip, off_t startoff, off_t len)
72726098d3SDavid Malone {
73726098d3SDavid Malone int n;
74726098d3SDavid Malone
75726098d3SDavid Malone while (len > 0) {
76726098d3SDavid Malone if (startoff < mip->mapoff || startoff >= mip->mapoff +
77d0990ea9SDavid Malone (off_t)mip->maplen) {
78726098d3SDavid Malone if (maparound(mip, startoff) != 0)
79726098d3SDavid Malone return (1);
80726098d3SDavid Malone }
81726098d3SDavid Malone n = (mip->mapoff + mip->maplen) - startoff;
82726098d3SDavid Malone if (n > len)
83726098d3SDavid Malone n = len;
84726098d3SDavid Malone WR(mip->start + (startoff - mip->mapoff), n);
85726098d3SDavid Malone startoff += n;
86726098d3SDavid Malone len -= n;
87726098d3SDavid Malone }
88726098d3SDavid Malone return (0);
89726098d3SDavid Malone }
90726098d3SDavid Malone
91726098d3SDavid Malone /*
92726098d3SDavid Malone * Move the map window so that it contains the byte at absolute file
93726098d3SDavid Malone * offset `offset'. The start of the map window will be TAILMAPLEN
94726098d3SDavid Malone * aligned.
95726098d3SDavid Malone */
96726098d3SDavid Malone int
maparound(struct mapinfo * mip,off_t offset)974bba8e59SPaul Richards maparound(struct mapinfo *mip, off_t offset)
98726098d3SDavid Malone {
99726098d3SDavid Malone
100726098d3SDavid Malone if (mip->start != NULL && munmap(mip->start, mip->maplen) != 0)
101726098d3SDavid Malone return (1);
102726098d3SDavid Malone
103726098d3SDavid Malone mip->mapoff = offset & ~((off_t)TAILMAPLEN - 1);
104726098d3SDavid Malone mip->maplen = TAILMAPLEN;
105d0990ea9SDavid Malone if ((off_t)mip->maplen > mip->maxoff - mip->mapoff)
106726098d3SDavid Malone mip->maplen = mip->maxoff - mip->mapoff;
107726098d3SDavid Malone if (mip->maplen <= 0)
108726098d3SDavid Malone abort();
109726098d3SDavid Malone if ((mip->start = mmap(NULL, mip->maplen, PROT_READ, MAP_SHARED,
110726098d3SDavid Malone mip->fd, mip->mapoff)) == MAP_FAILED)
111726098d3SDavid Malone return (1);
112726098d3SDavid Malone
113726098d3SDavid Malone return (0);
114726098d3SDavid Malone }
115849d265dSJaakko Heinonen
116849d265dSJaakko Heinonen /*
117849d265dSJaakko Heinonen * Print the file name without stdio buffering.
118849d265dSJaakko Heinonen */
119849d265dSJaakko Heinonen void
printfn(const char * fn,int print_nl)120849d265dSJaakko Heinonen printfn(const char *fn, int print_nl)
121849d265dSJaakko Heinonen {
122849d265dSJaakko Heinonen
123849d265dSJaakko Heinonen if (print_nl)
124849d265dSJaakko Heinonen WR("\n", 1);
125849d265dSJaakko Heinonen WR("==> ", 4);
126849d265dSJaakko Heinonen WR(fn, strlen(fn));
127849d265dSJaakko Heinonen WR(" <==\n", 5);
128849d265dSJaakko Heinonen }
129