7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER START
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# The contents of this file are subject to the terms of the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Common Development and Distribution License (the "License").
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# You may not use this file except in compliance with the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# See the License for the specific language governing permissions
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# and limitations under the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# When distributing Covered Code, include this CDDL HEADER in each
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# If applicable, add the following below this CDDL HEADER, with the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# fields enclosed by brackets "[]" replaced with your own identifying
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# information: Portions Copyright [yyyy] [name of copyright owner]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER END
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Make sure all math stuff runs in the "C" locale to avoid problems
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# with alternative # radix point representations (e.g. ',' instead of
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# '.' in de_DE.*-locales). This needs to be set _before_ any
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# floating-point constants are defined in this script).
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin getopts -a "${progname}" "${multifollow_usage}" OPT '-?'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# program start
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[-?\n@(#)\$Id: multifollow (Roland Mainz) 2009-04-08 \$\n]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[-author?Roland Mainz <roland.mainz@nrubsig.org>]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+NAME?multifollow - use tail -f on multiple files]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+DESCRIPTION?\bmultifollow\b is a small utilty which can "follow" multiple
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin files similar to tail -f.]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+SEE ALSO?\bksh93\b(1), \btail\b(1)]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinwhile getopts -a "${progname}" "${multifollow_usage}" OPT ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# expecting at least one more arguments
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbuiltin -f libshell.so.1 poll || fatal_error "poll builtin not found."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# register trap to cleanup child processes
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintrap 'for ((i=0 ; i < numfiles ; i++ )) ; do kill -TERM ${files[i].childpid} ; done' EXIT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# setup "tail -f" childs, FIFOs and information for the "poll" builtin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset pipename="/tmp/multifollow_pipe_${PPID}_$$_${numfiles}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz redirect {files[numfiles].fd}<> "${files[numfiles].pipename}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tail -f "${files[${numfiles}].name}" >"${files[${numfiles}].pipename}" &
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinwhile true ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # todo: investigate why we have to use "do_poll" at all - AFAIK it
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # should be sufficient to call "poll" and get "revents" set if there
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # are any remaining data...
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -- "#${i}: ${line}"