xref: /freebsd/usr.bin/tail/misc.c (revision d0990ea900d0caa58b17d88ed48239d06a8b8b61)
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  * 3. All advertising materials mentioning features or use of this software
179b50d902SRodney W. Grimes  *    must display the following acknowledgement:
189b50d902SRodney W. Grimes  *	This product includes software developed by the University of
199b50d902SRodney W. Grimes  *	California, Berkeley and its contributors.
209b50d902SRodney W. Grimes  * 4. Neither the name of the University nor the names of its contributors
219b50d902SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
229b50d902SRodney W. Grimes  *    without specific prior written permission.
239b50d902SRodney W. Grimes  *
249b50d902SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
259b50d902SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
269b50d902SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
279b50d902SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
289b50d902SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
299b50d902SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
309b50d902SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
319b50d902SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
329b50d902SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
339b50d902SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
349b50d902SRodney W. Grimes  * SUCH DAMAGE.
359b50d902SRodney W. Grimes  */
369b50d902SRodney W. Grimes 
37814e3a92SMark Murray #include <sys/cdefs.h>
38814e3a92SMark Murray 
39814e3a92SMark Murray __FBSDID("$FreeBSD$");
40814e3a92SMark Murray 
419b50d902SRodney W. Grimes #ifndef lint
42814e3a92SMark Murray static const char sccsid[] = "@(#)misc.c	8.1 (Berkeley) 6/6/93";
43247e7cb1SJeroen Ruigrok van der Werven #endif
449b50d902SRodney W. Grimes 
459b50d902SRodney W. Grimes #include <sys/types.h>
469b50d902SRodney W. Grimes #include <sys/stat.h>
47726098d3SDavid Malone #include <sys/mman.h>
48814e3a92SMark Murray 
49814e3a92SMark Murray #include <err.h>
509b50d902SRodney W. Grimes #include <errno.h>
519b50d902SRodney W. Grimes #include <stdio.h>
529b50d902SRodney W. Grimes #include <stdlib.h>
539b50d902SRodney W. Grimes #include <string.h>
54814e3a92SMark Murray #include <unistd.h>
55814e3a92SMark Murray 
569b50d902SRodney W. Grimes #include "extern.h"
579b50d902SRodney W. Grimes 
589b50d902SRodney W. Grimes void
599b50d902SRodney W. Grimes ierr()
609b50d902SRodney W. Grimes {
6144cf272fSAdam David 	warn("%s", fname);
6244cf272fSAdam David 	rval = 1;
639b50d902SRodney W. Grimes }
649b50d902SRodney W. Grimes 
659b50d902SRodney W. Grimes void
669b50d902SRodney W. Grimes oerr()
679b50d902SRodney W. Grimes {
68ac551270SPeter Wemm 	err(1, "stdout");
699b50d902SRodney W. Grimes }
70726098d3SDavid Malone 
71726098d3SDavid Malone /*
72726098d3SDavid Malone  * Print `len' bytes from the file associated with `mip', starting at
73726098d3SDavid Malone  * absolute file offset `startoff'. May move map window.
74726098d3SDavid Malone  */
75726098d3SDavid Malone int
764bba8e59SPaul Richards mapprint(struct mapinfo *mip, off_t startoff, off_t len)
77726098d3SDavid Malone {
78726098d3SDavid Malone 	int n;
79726098d3SDavid Malone 
80726098d3SDavid Malone 	while (len > 0) {
81726098d3SDavid Malone 		if (startoff < mip->mapoff || startoff >= mip->mapoff +
82d0990ea9SDavid Malone 		    (off_t)mip->maplen) {
83726098d3SDavid Malone 			if (maparound(mip, startoff) != 0)
84726098d3SDavid Malone 				return (1);
85726098d3SDavid Malone 		}
86726098d3SDavid Malone 		n = (mip->mapoff + mip->maplen) - startoff;
87726098d3SDavid Malone 		if (n > len)
88726098d3SDavid Malone 			n = len;
89726098d3SDavid Malone 		WR(mip->start + (startoff - mip->mapoff), n);
90726098d3SDavid Malone 		startoff += n;
91726098d3SDavid Malone 		len -= n;
92726098d3SDavid Malone 	}
93726098d3SDavid Malone 	return (0);
94726098d3SDavid Malone }
95726098d3SDavid Malone 
96726098d3SDavid Malone /*
97726098d3SDavid Malone  * Move the map window so that it contains the byte at absolute file
98726098d3SDavid Malone  * offset `offset'. The start of the map window will be TAILMAPLEN
99726098d3SDavid Malone  * aligned.
100726098d3SDavid Malone  */
101726098d3SDavid Malone int
1024bba8e59SPaul Richards maparound(struct mapinfo *mip, off_t offset)
103726098d3SDavid Malone {
104726098d3SDavid Malone 
105726098d3SDavid Malone 	if (mip->start != NULL && munmap(mip->start, mip->maplen) != 0)
106726098d3SDavid Malone 		return (1);
107726098d3SDavid Malone 
108726098d3SDavid Malone 	mip->mapoff = offset & ~((off_t)TAILMAPLEN - 1);
109726098d3SDavid Malone 	mip->maplen = TAILMAPLEN;
110d0990ea9SDavid Malone 	if ((off_t)mip->maplen > mip->maxoff - mip->mapoff)
111726098d3SDavid Malone 		mip->maplen = mip->maxoff - mip->mapoff;
112726098d3SDavid Malone 	if (mip->maplen <= 0)
113726098d3SDavid Malone 		abort();
114726098d3SDavid Malone 	if ((mip->start = mmap(NULL, mip->maplen, PROT_READ, MAP_SHARED,
115726098d3SDavid Malone 	     mip->fd, mip->mapoff)) == MAP_FAILED)
116726098d3SDavid Malone 		return (1);
117726098d3SDavid Malone 
118726098d3SDavid Malone 	return (0);
119726098d3SDavid Malone }
120