xref: /freebsd/usr.bin/tail/misc.c (revision 849d265d53a721b9bfb8bd5a5e204c026436316d)
19b50d902SRodney W. Grimes /*-
29b50d902SRodney W. Grimes  * Copyright (c) 1991, 1993
39b50d902SRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
49b50d902SRodney W. Grimes  *
59b50d902SRodney W. Grimes  * This code is derived from software contributed to Berkeley by
69b50d902SRodney W. Grimes  * Edward Sze-Tyan Wang.
79b50d902SRodney W. Grimes  *
89b50d902SRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
99b50d902SRodney W. Grimes  * modification, are permitted provided that the following conditions
109b50d902SRodney W. Grimes  * are met:
119b50d902SRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
129b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
139b50d902SRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
149b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
159b50d902SRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
169b50d902SRodney W. Grimes  * 4. Neither the name of the University nor the names of its contributors
179b50d902SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
189b50d902SRodney W. Grimes  *    without specific prior written permission.
199b50d902SRodney W. Grimes  *
209b50d902SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
219b50d902SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
229b50d902SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
239b50d902SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
249b50d902SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
259b50d902SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
269b50d902SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
279b50d902SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
289b50d902SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
299b50d902SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
309b50d902SRodney W. Grimes  * SUCH DAMAGE.
319b50d902SRodney W. Grimes  */
329b50d902SRodney W. Grimes 
33814e3a92SMark Murray #include <sys/cdefs.h>
34814e3a92SMark Murray 
35814e3a92SMark Murray __FBSDID("$FreeBSD$");
36814e3a92SMark Murray 
379b50d902SRodney W. Grimes #ifndef lint
38814e3a92SMark Murray static const char sccsid[] = "@(#)misc.c	8.1 (Berkeley) 6/6/93";
39247e7cb1SJeroen Ruigrok van der Werven #endif
409b50d902SRodney W. Grimes 
419b50d902SRodney W. Grimes #include <sys/types.h>
429b50d902SRodney W. Grimes #include <sys/stat.h>
43726098d3SDavid Malone #include <sys/mman.h>
44814e3a92SMark Murray 
45814e3a92SMark Murray #include <err.h>
469b50d902SRodney W. Grimes #include <errno.h>
479b50d902SRodney W. Grimes #include <stdio.h>
489b50d902SRodney W. Grimes #include <stdlib.h>
499b50d902SRodney W. Grimes #include <string.h>
50814e3a92SMark Murray #include <unistd.h>
51814e3a92SMark Murray 
529b50d902SRodney W. Grimes #include "extern.h"
539b50d902SRodney W. Grimes 
549b50d902SRodney W. Grimes void
5522da50cfSBrian Somers ierr(const char *fname)
569b50d902SRodney W. Grimes {
5744cf272fSAdam David 	warn("%s", fname);
5844cf272fSAdam David 	rval = 1;
599b50d902SRodney W. Grimes }
609b50d902SRodney W. Grimes 
619b50d902SRodney W. Grimes void
62ef636796SEd Schouten oerr(void)
639b50d902SRodney W. Grimes {
64ac551270SPeter Wemm 	err(1, "stdout");
659b50d902SRodney W. Grimes }
66726098d3SDavid Malone 
67726098d3SDavid Malone /*
68726098d3SDavid Malone  * Print `len' bytes from the file associated with `mip', starting at
69726098d3SDavid Malone  * absolute file offset `startoff'. May move map window.
70726098d3SDavid Malone  */
71726098d3SDavid Malone int
724bba8e59SPaul Richards mapprint(struct mapinfo *mip, off_t startoff, off_t len)
73726098d3SDavid Malone {
74726098d3SDavid Malone 	int n;
75726098d3SDavid Malone 
76726098d3SDavid Malone 	while (len > 0) {
77726098d3SDavid Malone 		if (startoff < mip->mapoff || startoff >= mip->mapoff +
78d0990ea9SDavid Malone 		    (off_t)mip->maplen) {
79726098d3SDavid Malone 			if (maparound(mip, startoff) != 0)
80726098d3SDavid Malone 				return (1);
81726098d3SDavid Malone 		}
82726098d3SDavid Malone 		n = (mip->mapoff + mip->maplen) - startoff;
83726098d3SDavid Malone 		if (n > len)
84726098d3SDavid Malone 			n = len;
85726098d3SDavid Malone 		WR(mip->start + (startoff - mip->mapoff), n);
86726098d3SDavid Malone 		startoff += n;
87726098d3SDavid Malone 		len -= n;
88726098d3SDavid Malone 	}
89726098d3SDavid Malone 	return (0);
90726098d3SDavid Malone }
91726098d3SDavid Malone 
92726098d3SDavid Malone /*
93726098d3SDavid Malone  * Move the map window so that it contains the byte at absolute file
94726098d3SDavid Malone  * offset `offset'. The start of the map window will be TAILMAPLEN
95726098d3SDavid Malone  * aligned.
96726098d3SDavid Malone  */
97726098d3SDavid Malone int
984bba8e59SPaul Richards maparound(struct mapinfo *mip, off_t offset)
99726098d3SDavid Malone {
100726098d3SDavid Malone 
101726098d3SDavid Malone 	if (mip->start != NULL && munmap(mip->start, mip->maplen) != 0)
102726098d3SDavid Malone 		return (1);
103726098d3SDavid Malone 
104726098d3SDavid Malone 	mip->mapoff = offset & ~((off_t)TAILMAPLEN - 1);
105726098d3SDavid Malone 	mip->maplen = TAILMAPLEN;
106d0990ea9SDavid Malone 	if ((off_t)mip->maplen > mip->maxoff - mip->mapoff)
107726098d3SDavid Malone 		mip->maplen = mip->maxoff - mip->mapoff;
108726098d3SDavid Malone 	if (mip->maplen <= 0)
109726098d3SDavid Malone 		abort();
110726098d3SDavid Malone 	if ((mip->start = mmap(NULL, mip->maplen, PROT_READ, MAP_SHARED,
111726098d3SDavid Malone 	     mip->fd, mip->mapoff)) == MAP_FAILED)
112726098d3SDavid Malone 		return (1);
113726098d3SDavid Malone 
114726098d3SDavid Malone 	return (0);
115726098d3SDavid Malone }
116*849d265dSJaakko Heinonen 
117*849d265dSJaakko Heinonen /*
118*849d265dSJaakko Heinonen  * Print the file name without stdio buffering.
119*849d265dSJaakko Heinonen  */
120*849d265dSJaakko Heinonen void
121*849d265dSJaakko Heinonen printfn(const char *fn, int print_nl)
122*849d265dSJaakko Heinonen {
123*849d265dSJaakko Heinonen 
124*849d265dSJaakko Heinonen 	if (print_nl)
125*849d265dSJaakko Heinonen 		WR("\n", 1);
126*849d265dSJaakko Heinonen 	WR("==> ", 4);
127*849d265dSJaakko Heinonen 	WR(fn, strlen(fn));
128*849d265dSJaakko Heinonen 	WR(" <==\n", 5);
129*849d265dSJaakko Heinonen }
130