xref: /freebsd/usr.bin/tail/misc.c (revision 8a16b7a18f5d0b031f09832fd7752fba717e2a97)
19b50d902SRodney W. Grimes /*-
2*8a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
3*8a16b7a1SPedro 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 #include <sys/cdefs.h>
36814e3a92SMark Murray 
37814e3a92SMark Murray __FBSDID("$FreeBSD$");
38814e3a92SMark Murray 
399b50d902SRodney W. Grimes #ifndef lint
40814e3a92SMark Murray static const char sccsid[] = "@(#)misc.c	8.1 (Berkeley) 6/6/93";
41247e7cb1SJeroen Ruigrok van der Werven #endif
429b50d902SRodney W. Grimes 
439b50d902SRodney W. Grimes #include <sys/types.h>
449b50d902SRodney W. Grimes #include <sys/stat.h>
45726098d3SDavid Malone #include <sys/mman.h>
46814e3a92SMark Murray 
47814e3a92SMark Murray #include <err.h>
489b50d902SRodney W. Grimes #include <errno.h>
499b50d902SRodney W. Grimes #include <stdio.h>
509b50d902SRodney W. Grimes #include <stdlib.h>
519b50d902SRodney W. Grimes #include <string.h>
52814e3a92SMark Murray #include <unistd.h>
53814e3a92SMark Murray 
549b50d902SRodney W. Grimes #include "extern.h"
559b50d902SRodney W. Grimes 
569b50d902SRodney W. Grimes void
5722da50cfSBrian Somers ierr(const char *fname)
589b50d902SRodney W. Grimes {
5944cf272fSAdam David 	warn("%s", fname);
6044cf272fSAdam David 	rval = 1;
619b50d902SRodney W. Grimes }
629b50d902SRodney W. Grimes 
639b50d902SRodney W. Grimes void
64ef636796SEd Schouten oerr(void)
659b50d902SRodney W. Grimes {
66ac551270SPeter Wemm 	err(1, "stdout");
679b50d902SRodney W. Grimes }
68726098d3SDavid Malone 
69726098d3SDavid Malone /*
70726098d3SDavid Malone  * Print `len' bytes from the file associated with `mip', starting at
71726098d3SDavid Malone  * absolute file offset `startoff'. May move map window.
72726098d3SDavid Malone  */
73726098d3SDavid Malone int
744bba8e59SPaul Richards mapprint(struct mapinfo *mip, off_t startoff, off_t len)
75726098d3SDavid Malone {
76726098d3SDavid Malone 	int n;
77726098d3SDavid Malone 
78726098d3SDavid Malone 	while (len > 0) {
79726098d3SDavid Malone 		if (startoff < mip->mapoff || startoff >= mip->mapoff +
80d0990ea9SDavid Malone 		    (off_t)mip->maplen) {
81726098d3SDavid Malone 			if (maparound(mip, startoff) != 0)
82726098d3SDavid Malone 				return (1);
83726098d3SDavid Malone 		}
84726098d3SDavid Malone 		n = (mip->mapoff + mip->maplen) - startoff;
85726098d3SDavid Malone 		if (n > len)
86726098d3SDavid Malone 			n = len;
87726098d3SDavid Malone 		WR(mip->start + (startoff - mip->mapoff), n);
88726098d3SDavid Malone 		startoff += n;
89726098d3SDavid Malone 		len -= n;
90726098d3SDavid Malone 	}
91726098d3SDavid Malone 	return (0);
92726098d3SDavid Malone }
93726098d3SDavid Malone 
94726098d3SDavid Malone /*
95726098d3SDavid Malone  * Move the map window so that it contains the byte at absolute file
96726098d3SDavid Malone  * offset `offset'. The start of the map window will be TAILMAPLEN
97726098d3SDavid Malone  * aligned.
98726098d3SDavid Malone  */
99726098d3SDavid Malone int
1004bba8e59SPaul Richards maparound(struct mapinfo *mip, off_t offset)
101726098d3SDavid Malone {
102726098d3SDavid Malone 
103726098d3SDavid Malone 	if (mip->start != NULL && munmap(mip->start, mip->maplen) != 0)
104726098d3SDavid Malone 		return (1);
105726098d3SDavid Malone 
106726098d3SDavid Malone 	mip->mapoff = offset & ~((off_t)TAILMAPLEN - 1);
107726098d3SDavid Malone 	mip->maplen = TAILMAPLEN;
108d0990ea9SDavid Malone 	if ((off_t)mip->maplen > mip->maxoff - mip->mapoff)
109726098d3SDavid Malone 		mip->maplen = mip->maxoff - mip->mapoff;
110726098d3SDavid Malone 	if (mip->maplen <= 0)
111726098d3SDavid Malone 		abort();
112726098d3SDavid Malone 	if ((mip->start = mmap(NULL, mip->maplen, PROT_READ, MAP_SHARED,
113726098d3SDavid Malone 	     mip->fd, mip->mapoff)) == MAP_FAILED)
114726098d3SDavid Malone 		return (1);
115726098d3SDavid Malone 
116726098d3SDavid Malone 	return (0);
117726098d3SDavid Malone }
118849d265dSJaakko Heinonen 
119849d265dSJaakko Heinonen /*
120849d265dSJaakko Heinonen  * Print the file name without stdio buffering.
121849d265dSJaakko Heinonen  */
122849d265dSJaakko Heinonen void
123849d265dSJaakko Heinonen printfn(const char *fn, int print_nl)
124849d265dSJaakko Heinonen {
125849d265dSJaakko Heinonen 
126849d265dSJaakko Heinonen 	if (print_nl)
127849d265dSJaakko Heinonen 		WR("\n", 1);
128849d265dSJaakko Heinonen 	WR("==> ", 4);
129849d265dSJaakko Heinonen 	WR(fn, strlen(fn));
130849d265dSJaakko Heinonen 	WR(" <==\n", 5);
131849d265dSJaakko Heinonen }
132