xref: /freebsd/usr.bin/tail/misc.c (revision bdcbfde31e8e9b343f113a1956384bdf30d1ed62)
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