diff options
author | Anders Broman <anders.broman@ericsson.com> | 2006-08-30 21:51:31 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2006-08-30 21:51:31 +0000 |
commit | 7eac3c28796d480b79da5b59dc59115d717a61ef (patch) | |
tree | c77a14f5d9fd078b6c27806c9c116ed51eb257d7 | |
parent | 55ddc3dd59102d8ebc30acb9af7bc5c395bcdc1b (diff) | |
download | wireshark-7eac3c28796d480b79da5b59dc59115d717a61ef.tar.gz |
From Alejandro Vaquero:
- Change the "listen_rtp" to "rtp_player"
- Change from a plugin to be part of the core
- By default it will not compile with the rtp_player. In order to
compile it is necessary to:
+ For windows: uncomment the line
"PORTAUDIO_DIR=$(WIRESHARK_LIBS)\portaudio_v18_1" in config.nmake
+ For linux: using the "--with-portaudio=yes"
svn path=/trunk/; revision=19094
-rw-r--r-- | Makefile.am | 4 | ||||
-rw-r--r-- | Makefile.nmake | 6 | ||||
-rw-r--r-- | acinclude.m4 | 127 | ||||
-rw-r--r-- | config.h.win32 | 3 | ||||
-rw-r--r-- | config.nmake | 17 | ||||
-rw-r--r-- | configure.in | 43 | ||||
-rw-r--r-- | gtk/Makefile.am | 10 | ||||
-rw-r--r-- | gtk/Makefile.nmake | 31 | ||||
-rw-r--r-- | gtk/voip_calls.c | 23 | ||||
-rw-r--r-- | gtk/voip_calls_dlg.c | 39 | ||||
-rwxr-xr-x | tools/win32-setup.sh | 2 |
11 files changed, 292 insertions, 13 deletions
diff --git a/Makefile.am b/Makefile.am index 9c36410101..207112239a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -285,6 +285,7 @@ wireshark_optional_objects = @GETOPT_O@ @STRERROR_O@ \ # linked into the wireshark executable. wireshark_additional_libs = \ gtk/libui.a \ + gtk/codecs/libcodec.a \ wiretap/libwiretap.la \ epan/libwireshark.la @@ -317,7 +318,8 @@ wireshark_LDADD = \ @PCAP_LIBS@ @GTK_LIBS@ @ADNS_LIBS@ @KRB5_LIBS@ @FRAMEWORKS@ \ @LIBICONV@ \ @LIBGCRYPT_LIBS@ \ - @LIBGNUTLS_LIBS@ + @LIBGNUTLS_LIBS@ \ + @PORTAUDIO_LIBS@ # Additional libs that I know how to build. These will be # linked into the tshark executable. diff --git a/Makefile.nmake b/Makefile.nmake index 91b08042be..8f70ed335b 100644 --- a/Makefile.nmake +++ b/Makefile.nmake @@ -237,6 +237,7 @@ config.h : config.h.win32 config.nmake -e "s/@HAVE_LUA@/$(LUA_CONFIG)/" \ -e "s/@HAVE_LUA_5_1@/$(LUA_VERSION)/" \ -e "s/@HAVE_AIRPCAP@/$(AIRPCAP_CONFIG)/" \ + -e "s/@HAVE_PORTAUDIO@/$(AIRPCAP_CONFIG)/" \ < config.h.win32 > $@ ps.c : rdps.exe print.ps @@ -529,6 +530,11 @@ setup: verify_tools @$(SH) tools\win32-setup.sh --download "$(WIRESHARK_LIBS)" \ . gnutls-1.5.0-1.zip !ENDIF +!IFDEF PORTAUDIO_DIR + @$(SH) tools\win32-setup.sh --download "$(WIRESHARK_LIBS)" \ + . portaudio_v18_1.zip +!ENDIF + !IFDEF GTK2_DIR !IF "$(GTK2_INST_VERSION)" == "2.8" @$(SH) tools\win32-setup.sh --download "$(WIRESHARK_LIBS)" \ diff --git a/acinclude.m4 b/acinclude.m4 index eb36ee634a..829857cf79 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -961,6 +961,133 @@ AC_DEFUN([AC_WIRESHARK_LIBLUA_CHECK],[ ]) # +# AC_WIRESHARK_LIBPORTAUDIO_CHECK +# +AC_DEFUN([AC_WIRESHARK_LIBPORTAUDIO_CHECK],[ + + if test "x$portaudio_dir" != "x" + then + # + # The user specified a directory in which libportaudio + # resides, so add the "include" subdirectory of that directory to + # the include file search path and the "lib" subdirectory + # of that directory to the library search path. + # + # XXX - if there's also a libportaudio in a directory that's + # already in CFLAGS, CPPFLAGS, or LDFLAGS, this won't + # make us find the version in the specified directory, + # as the compiler and/or linker will search that other + # directory before it searches the specified directory. + # + wireshark_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -I$portaudio_dir/include" + wireshark_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -I$portaudio_dir/include" + wireshark_save_LIBS="$LIBS" + LIBS="$LIBS -L$portaudio_dir/lib -lportaudio" + wireshark_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -L$portaudio_dir/lib" + else + # + # The user specified no directory in which libportaudio resides, + # so just add "-lportaudio" to the used libs. + # + wireshark_save_CFLAGS="$CFLAGS" + wireshark_save_CPPFLAGS="$CPPFLAGS" + wireshark_save_LDFLAGS="$LDFLAGS" + wireshark_save_LIBS="$LIBS" + LIBS="$LIBS -lportaudio" + fi + + # + # Make sure we have "portaudio.h". If we don't, it means we probably + # don't have libportaudio, so don't use it. + # + AC_CHECK_HEADERS(portaudio.h,, + [ + if test "x$portaudio_dir" != "x" + then + # + # The user used "--with-portaudio=" to specify a directory + # containing libportaudio, but we didn't find the header file + # there; that either means they didn't specify the + # right directory or are confused about whether libportaudio + # is, in fact, installed. Report the error and give up. + # + AC_MSG_ERROR([libportaudio header not found in directory specified in --with-portaudio]) + else + if test "x$want_portaudio" = "xyes" + then + # + # The user tried to force us to use the library, but we + # couldn't find the header file; report an error. + # + AC_MSG_ERROR(Header file portaudio.h not found.) + else + # + # We couldn't find the header file; don't use the + # library, as it's probably not present. + # + want_portaudio=no + fi + fi + ]) + + if test "x$want_portaudio" != "xno" + then + # + # Well, we at least have the portaudio header file. + # + # let's check if the libs are there + # + + AC_CHECK_LIB(portaudio, Pa_Initialize, + [ + if test "x$portaudio_dir" != "x" + then + # + # Put the "-I" and "-L" flags for portaudio at + # the beginning of CFLAGS, CPPFLAGS, + # LDFLAGS, and LIBS. + # + PORTAUDIO_LIBS="-L$portaudio_dir/lib -lportaudio" + PORTAUDIO_INCLUDES="-I$portaudio_dir/include" + else + PORTAUDIO_LIBS="-lportaudio" + PORTAUDIO_INCLUDES="" + fi + AC_DEFINE(HAVE_LIBPORTAUDIO, 1, [Define to use libportaudio library]) + ],[ + # + # Restore the versions of CFLAGS, CPPFLAGS, + # LDFLAGS, and LIBS before we added the + # "--with-portaudio=" directory, as we didn't + # actually find portaudio there. + # + CFLAGS="$wireshark_save_CFLAGS" + CPPFLAGS="$wireshark_save_CPPFLAGS" + LDFLAGS="$wireshark_save_LDFLAGS" + LIBS="$wireshark_save_LIBS" + PORTAUDIO_LIBS="" + # User requested --with-portaudio but it isn't available + if test "x$want_portaudio" = "xyes" + then + AC_MSG_ERROR(Linking with libportaudio failed.) + fi + want_portaudio=no + ]) + + CFLAGS="$wireshark_save_CFLAGS" + CPPFLAGS="$wireshark_save_CPPFLAGS" + LDFLAGS="$wireshark_save_LDFLAGS" + LIBS="$wireshark_save_LIBS" + AC_SUBST(PORTAUDIO_LIBS) + AC_SUBST(PORTAUDIO_INCLUDES) + + fi +]) + +# # AC_WIRESHARK_NETSNMP_CHECK # AC_DEFUN([AC_WIRESHARK_NETSNMP_CHECK], diff --git a/config.h.win32 b/config.h.win32 index 89af736e0e..9871ee6e0a 100644 --- a/config.h.win32 +++ b/config.h.win32 @@ -220,6 +220,9 @@ @HAVE_LUA@ @HAVE_LUA_5_1@ +/* Define to use Portaudio library */ +@HAVE_PORTAUDIO@ + #ifndef WIN32 #define WIN32 1 #endif diff --git a/config.nmake b/config.nmake index 6063799f2e..4cd6c726ce 100644 --- a/config.nmake +++ b/config.nmake @@ -177,6 +177,16 @@ KFW_DIR=$(WIRESHARK_LIBS)\kfw-2.5 LUA_DIR=$(WIRESHARK_LIBS)\lua5.1 # +# If you have the PORTAUDIO library (used por rtp_player), +# set this to the pathname of the directory in which the PORTAUDIO +# package has been extracted. +# +# If you don't have PORTAUDIO, comment this line out, so that +# PORTAUDIO_DIR isn't defined. +# +#PORTAUDIO_DIR=$(WIRESHARK_LIBS)\portaudio_v18_1 + +# # Set ICONV_DIR to the pathname of the directory in which the # ICONV include files and library resides. # @@ -481,5 +491,12 @@ LUA_LIBS= LUA_CONFIG= !ENDIF +!IFDEF PORTAUDIO_DIR +# Nmake uses carets to escape special characters +PORTAUDIO_CONFIG=^#define HAVE_LIBPORTAUDIO 1 +!else +PORTAUDIO_CONFIG= +!ENDIF + # Construct the path PATH=$(PATH);$(CYGWIN_PATH);$(DLL_PATH);$(ZLIB_PATH);$(ADNS_PATH) diff --git a/configure.in b/configure.in index adf506c856..de8db71929 100644 --- a/configure.in +++ b/configure.in @@ -821,6 +821,41 @@ fi AM_CONDITIONAL(HAVE_LIBLUA, test x$want_lua = xyes) +dnl portaudio check +AC_MSG_CHECKING(whether to use libportaudio for the rtp_player) + +AC_ARG_WITH(portaudio, +[ --with-portaudio[[=DIR]] use libportaudio (located in directory DIR, if supplied) for the rtp_player. [[default=no]]], +[ + if test $withval = no + then + want_portaudio=no + elif test $withval = yes + then + want_portaudio=yes + else + want_portaudio=yes + portaudio_dir=$withval + fi +],[ + # + # Don't use libportaudio by default + # + want_portaudio=no + portaudio_dir= +]) +if test "x$want_portaudio" = "xno" ; then + AC_MSG_RESULT(no) +else + AC_MSG_RESULT(yes) + AC_WIRESHARK_LIBPORTAUDIO_CHECK + if test "x$want_portaudio" = "xno" ; then + AC_MSG_RESULT(libportaudio not found - disabling support for the rtp_player) + fi +fi +AM_CONDITIONAL(HAVE_LIBPORTAUDIO, test x$want_portaudio = xyes) + + dnl ipv6 check AC_ARG_ENABLE(ipv6, [ --enable-ipv6 use ipv6 name resolution, if available. [default=yes]],enable_ipv6=$enableval,enable_ipv6=yes) @@ -1313,6 +1348,7 @@ AC_OUTPUT( epan/dissectors/Makefile epan/ftypes/Makefile gtk/Makefile + gtk/codecs/Makefile gtk/doxygen.cfg help/Makefile packaging/Makefile @@ -1381,6 +1417,12 @@ else lua_message="no" fi +if test "x$want_portaudio" = "xyes" ; then + portaudio_message="yes" +else + portaudio_message="no" +fi + if test "x$want_ssl" = "xno" ; then ssl_message="no" else @@ -1423,6 +1465,7 @@ echo "" echo " Install setuid : $setuid_message" echo " Use plugins : $have_plugins" echo " Build lua plugin : $lua_message" +echo " Build rtp_player : $portaudio_message" echo " Use GTK+ v2 library : $enable_gtk2" if test "x$enable_gtk2" = "xyes" ; then echo " Use threads : $enable_threads" diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 035ce3982e..8be4d216ce 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -28,6 +28,7 @@ noinst_LIBRARIES = libui.a CLEANFILES = \ libui.a \ *~ +SUBDIRS = codecs MAINTAINERCLEANFILES = \ $(GENERATED_FILES) \ @@ -91,6 +92,7 @@ noinst_HEADERS = \ range_utils.h \ recent.h \ rtp_analysis.h \ + rtp_player.h \ rtp_stream.h \ rtp_stream_dlg.h \ mcast_stream.h \ @@ -111,10 +113,18 @@ noinst_HEADERS = \ webbrowser.h if USE_GTK2 +if HAVE_LIBPORTAUDIO +libui_a_SOURCES = \ + $(WIRESHARK_GTK_SRC) \ + $(noinst_HEADERS) \ + $(WIRESHARK_TAP_SRC) \ + rtp_player.c +else libui_a_SOURCES = \ $(WIRESHARK_GTK_SRC) \ $(noinst_HEADERS) \ $(WIRESHARK_TAP_SRC) +endif else libui_a_SOURCES = \ ethclist.c \ diff --git a/gtk/Makefile.nmake b/gtk/Makefile.nmake index 31ee32012b..ba3405074c 100644 --- a/gtk/Makefile.nmake +++ b/gtk/Makefile.nmake @@ -12,6 +12,7 @@ CFLAGS=-DHAVE_CONFIG_H /I.. /I../wiretap $(GTK_CFLAGS) $(GNUTLS_CFLAGS) \ /I$(PCAP_DIR)\WPCAP\LIBPCAP\lbl \ /I$(PCAP_DIR)\include /I$(NET_SNMP_DIR)\include \ /I$(NET_SNMP_DIR)\win32 /Zm800 -D_U_="" -D_NEED_VAR_IMPORT_ $(LOCAL_CFLAGS) \ + /I$(PORTAUDIO_DIR)\pa_common \ !IFDEF HHC_DIR /I$(HHC_DIR)\include -DHHC_DIR !ENDIF @@ -29,11 +30,20 @@ include Makefile.common # if you add files here, be sure to include them also in Makefile.am EXTRA_DIST +!IFDEF PORTAUDIO_DIR WIRESHARK_WIN32_GTK_SRC = \ $(WIRESHARK_GTK_SRC) \ print_mswin.c \ - win32-file-dlg.c - + win32-file-dlg.c \ + rtp_player.c \ + pa_lib.c \ + pa_win_wmme.c +!ELSE +WIRESHARK_WIN32_GTK_SRC = \ + $(WIRESHARK_GTK_SRC) \ + print_mswin.c \ + win32-file-dlg.c +!ENDIF WIRESHARK_TAP_OBJECTS = $(WIRESHARK_TAP_SRC:.c=.obj) @@ -41,17 +51,30 @@ WIRESHARK_TAP_OBJECTS = $(WIRESHARK_TAP_SRC:.c=.obj) WIRESHARK_WIN32_GTK_OBJECTS = $(WIRESHARK_WIN32_GTK_SRC:.c=.obj) -libui.lib : ..\config.h $(WIRESHARK_WIN32_GTK_OBJECTS) $(WIRESHARK_TAP_OBJECTS) - link /lib /out:libui.lib $(WIRESHARK_WIN32_GTK_OBJECTS) $(WIRESHARK_TAP_OBJECTS) +libui.lib : ..\config.h $(WIRESHARK_WIN32_GTK_OBJECTS) $(WIRESHARK_TAP_OBJECTS) ..\gtk\codecs\codecs.lib + link /lib /out:libui.lib $(WIRESHARK_WIN32_GTK_OBJECTS) $(WIRESHARK_TAP_OBJECTS) winmm.lib ..\gtk\codecs\codecs.lib wireshark-tap-register.c: $(WIRESHARK_TAP_SRC) ../make-tapreg-dotc Makefile.common @echo Making wireshark-tap-register.c @$(SH) ../make-tapreg-dotc wireshark-tap-register.c . $(WIRESHARK_TAP_SRC) +pa_lib.obj: $(PORTAUDIO_DIR)\pa_common\pa_lib.c + $(CC) -c /Zi /W1 /Od $(PORTAUDIO_DIR)\pa_common\pa_lib.c -o $@ + +pa_win_wmme.obj: $(PORTAUDIO_DIR)\pa_win_wmme\pa_win_wmme.c + $(CC) -c /Zi /W1 /Od /I$(PORTAUDIO_DIR)\pa_common $(PORTAUDIO_DIR)\pa_win_wmme\pa_win_wmme.c -o $@ + +..\gtk\codecs\codecs.lib: + cd codecs + $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake + cd .. clean: rm -f $(WIRESHARK_WIN32_GTK_OBJECTS) $(WIRESHARK_TAP_OBJECTS) libui.lib $(PDB_FILE) doxygen.cfg html/*.* if exist html rmdir html + cd codecs + $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean + cd .. distclean: clean diff --git a/gtk/voip_calls.c b/gtk/voip_calls.c index 4135e1a068..dad420d88c 100644 --- a/gtk/voip_calls.c +++ b/gtk/voip_calls.c @@ -124,6 +124,13 @@ void voip_calls_reset(voip_calls_tapinfo_t *tapinfo) GList* list; GList* list2; + /* reset the RTP player */ +#if GTK_MAJOR_VERSION >= 2 +#ifdef PORTAUDIO_DIR + reset_rtp_player(); +#endif +#endif + /* free the data items first */ list = g_list_first(tapinfo->strinfo_list); while (list) @@ -190,7 +197,6 @@ void graph_analysis_data_init(void){ the_tapinfo_struct.graph_analysis = g_malloc(sizeof(graph_analysis_info_t)); the_tapinfo_struct.graph_analysis->nconv = 0; the_tapinfo_struct.graph_analysis->list = NULL; - } /****************************************************************************/ @@ -466,7 +472,7 @@ static void voip_rtp_reset(void *ptr _U_) /****************************************************************************/ /* whenever a RTP packet is seen by the tap listener */ static int -RTP_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *RTPinfo) +RTP_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, void const *RTPinfo) { voip_rtp_tapinfo_t *tapinfo = &the_tapinfo_rtp_struct; voip_rtp_stream_info_t *tmp_listinfo; @@ -481,7 +487,14 @@ RTP_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const vo return 0; } - /* check whether we already have a RTP stream with this setup frame and ssrc in the list */ + /* add this RTP for future listening using the RTP Player*/ +#if GTK_MAJOR_VERSION >= 2 +#ifdef PORTAUDIO_DIR + add_rtp_packet(pi, pinfo); +#endif +#endif + + /* check wether we already have a RTP stream with this setup frame and ssrc in the list */ list = g_list_first(tapinfo->list); while (list) { @@ -659,6 +672,10 @@ remove_tap_listener_rtp(void) have_RTP_tap_listener=FALSE; } +/* XXX just copied from gtk/rpc_stat.c */ +void protect_thread_critical_region(void); +void unprotect_thread_critical_region(void); + /****************************************************************************/ /******************************TAP for T38 **********************************/ /****************************************************************************/ diff --git a/gtk/voip_calls_dlg.c b/gtk/voip_calls_dlg.c index 8c925c630b..48736dd5e8 100644 --- a/gtk/voip_calls_dlg.c +++ b/gtk/voip_calls_dlg.c @@ -42,6 +42,12 @@ #include "register.h" +#if GTK_MAJOR_VERSION >= 2 +#ifdef HAVE_LIBPORTAUDIO +#include "rtp_player.h" +#endif /* HAVE_LIBPORTAUDIO */ +#endif + #include "graph_analysis.h" #include "voip_calls_dlg.h" #include "voip_calls.h" @@ -68,7 +74,7 @@ #include <ctype.h> #include <epan/address.h> #include <epan/addr_resolv.h> - + static const gchar FWD_LABEL_TEXT[] = "Select one call."; /****************************************************************************/ @@ -83,7 +89,7 @@ static GtkWidget *label_fwd = NULL; /*static GtkWidet *bt_unselect = NULL;*/ static GtkWidget *bt_filter = NULL; static GtkWidget *bt_graph = NULL; - +static GtkWidget *bt_player = NULL; static voip_calls_info_t* selected_call_fwd = NULL; /* current selection */ static GList *last_list = NULL; @@ -231,6 +237,7 @@ voip_calls_on_unselect (GtkButton *button _U_, /*gtk_widget_set_sensitive(bt_unselect, FALSE);*/ gtk_widget_set_sensitive(bt_filter, FALSE); gtk_widget_set_sensitive(bt_graph, FALSE); + gtk_widget_set_sensitive(bt_player, FALSE); } @@ -395,6 +402,18 @@ on_graph_bt_clicked (GtkButton *button _U_, } /****************************************************************************/ +static void +on_player_bt_clicked (GtkButton *button _U_, + gpointer user_data _U_) +{ +#if GTK_MAJOR_VERSION >= 2 +#ifdef HAVE_LIBPORTAUDIO +rtp_player_init(voip_calls_get_info()); +#endif /* HAVE_LIBPORTAUDIO */ +#endif +} + +/****************************************************************************/ /* when the user selects a row in the calls list */ static void voip_calls_on_select_row(GtkCList *clist, @@ -443,9 +462,16 @@ voip_calls_on_select_row(GtkCList *clist, if (calls_ns > 0) { gtk_widget_set_sensitive(bt_filter, TRUE); gtk_widget_set_sensitive(bt_graph, TRUE); + gtk_widget_set_sensitive(bt_player, FALSE); +#if GTK_MAJOR_VERSION >= 2 +#ifdef HAVE_LIBPORTAUDIO + gtk_widget_set_sensitive(bt_player, TRUE); +#endif /* HAVE_LIBPORTAUDIO */ +#endif } else { gtk_widget_set_sensitive(bt_filter, FALSE); gtk_widget_set_sensitive(bt_graph, FALSE); + gtk_widget_set_sensitive(bt_player, FALSE); } /* TODO: activate other buttons when implemented */ @@ -650,6 +676,12 @@ static void voip_calls_dlg_create (void) SIGNAL_CONNECT(bt_graph, "clicked", on_graph_bt_clicked, NULL); gtk_tooltips_set_tip (tooltips, bt_graph, "Show a flow graph of the selected calls.", NULL); + bt_player = gtk_button_new_with_label("Player"); + gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_player); + gtk_widget_show(bt_player); + SIGNAL_CONNECT(bt_player, "clicked", on_player_bt_clicked, NULL); + gtk_tooltips_set_tip (tooltips, bt_player, "Launch the RTP player to listen the selected calls.", NULL); + bt_close = BUTTON_NEW_FROM_STOCK(GTK_STOCK_CLOSE); gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_close); GTK_WIDGET_SET_FLAGS(bt_close, GTK_CAN_DEFAULT); @@ -816,6 +848,5 @@ register_tap_listener_voip_calls_dlg(void) { register_stat_cmd_arg("voip,calls",voip_calls_init_tap,NULL); register_stat_menu_item("VoIP Calls", REGISTER_STAT_GROUP_TELEPHONY, - voip_calls_launch, NULL, NULL, NULL); - + voip_calls_launch, NULL, NULL, NULL); } diff --git a/tools/win32-setup.sh b/tools/win32-setup.sh index 9e737dff74..66d1302579 100755 --- a/tools/win32-setup.sh +++ b/tools/win32-setup.sh @@ -44,7 +44,7 @@ case "$1" in if [ -z "$2" -o -z "$3" -o -z "$4" ] ; then usage fi - DEST_PATH=`cygpath --unix "$2"` + DEST_PATH=`cygpath --dos "$2"` DEST_SUBDIR=$3 PACKAGE_PATH=$4 PACKAGE=`basename "$PACKAGE_PATH"` |