From owner-freebsd-ports-bugs@FreeBSD.ORG Sun Mar 13 23:21:07 2005 Return-Path: Delivered-To: freebsd-ports-bugs@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6017816A4CE; Sun, 13 Mar 2005 23:21:07 +0000 (GMT) Received: from firewall.forkin.com (forkin.com [203.63.205.224]) by mx1.FreeBSD.org (Postfix) with ESMTP id 1BEF143D48; Sun, 13 Mar 2005 23:21:05 +0000 (GMT) (envelope-from chris@forkin.com) Received: from firewall.forkin.com (localhost.forkin.com [127.0.0.1]) by firewall.forkin.com (8.12.10/8.12.10) with ESMTP id j2DNKwo8037605; Mon, 14 Mar 2005 10:20:58 +1100 (EST) (envelope-from chris@firewall.forkin.com) Received: (from chris@localhost) by firewall.forkin.com (8.12.10/8.12.10/Submit) id j2DNKrWH037604; Mon, 14 Mar 2005 10:20:53 +1100 (EST) (envelope-from chris) Date: Mon, 14 Mar 2005 10:20:53 +1100 From: Chris Forkin To: FreeBSD-gnats-submit@FreeBSD.org, freebsd-ports-bugs@FreeBSD.org Message-ID: <20050313232053.GA37543@firewall.forkin.com> References: <200502132359.j1DNxXh5067124@firewall.forkin.com> <200502140000.j1E00kda085830@freefall.freebsd.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----------=_1110756060-24530-24" In-Reply-To: <200502140000.j1E00kda085830@freefall.freebsd.org> User-Agent: Mutt/1.4.2.1i Organization: http://www.forkin.com/ X-Archived: msg.VK53dbAB@firewall.forkin.com X-Scanned-By: MIMEDefang 2.45 Subject: Re: ports/77471: New port: Device driver for Voicetronix OpenLine4 Telephony HW X-BeenThere: freebsd-ports-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Ports bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 13 Mar 2005 23:21:07 -0000 This is a multi-part message in MIME format... ------------=_1110756060-24530-24 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi, I missed a compile problem in the original submission and also fixed an error that occurs when you attempt to deploy this on the latest RELENG_5 release. Regards, Chris. ---------------- # This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # vpb-driver # vpb-driver/files # vpb-driver/files/patch-FreeBSD-Makefile # vpb-driver/files/patch-FreeBSD-vpb.c # vpb-driver/files/patch-Makefile # vpb-driver/files/patch-src-comm.cpp # vpb-driver/files/patch-src-vpbapi.cpp # vpb-driver/files/patch-src-vpbapi.h # vpb-driver/files/patch-src-vpbreg.cpp # vpb-driver/files/vpb.sh # vpb-driver/Makefile # vpb-driver/distinfo # vpb-driver/pkg-descr # vpb-driver/pkg-message # vpb-driver/pkg-plist # echo c - vpb-driver mkdir -p vpb-driver > /dev/null 2>&1 echo c - vpb-driver/files mkdir -p vpb-driver/files > /dev/null 2>&1 echo x - vpb-driver/files/patch-FreeBSD-Makefile sed 's/^X//' >vpb-driver/files/patch-FreeBSD-Makefile << 'END-of-vpb-driver/files/patch-FreeBSD-Makefile' X--- FreeBSD/Makefile Thu Jan 1 10:00:00 1970 X+++ FreeBSD/Makefile Fri Feb 11 16:21:52 2005 X@@ -0,0 +1,5 @@ X+SRCS=vpb.c X+SRCS+=bus_if.h device_if.h pci_if.h X+KMOD=vpb X+ X+.include END-of-vpb-driver/files/patch-FreeBSD-Makefile echo x - vpb-driver/files/patch-FreeBSD-vpb.c sed 's/^X//' >vpb-driver/files/patch-FreeBSD-vpb.c << 'END-of-vpb-driver/files/patch-FreeBSD-vpb.c' X--- FreeBSD/vpb.c Mon May 3 13:49:58 2004 X+++ FreeBSD/vpb.c Sun Mar 13 11:56:37 2005 X@@ -52,8 +52,6 @@ X #define BLOCK_DELAY 1 /* delay (us) between adjacent blocks */ X #define SIZE_LCR 128 /* size of 9050 local config reg space in bytes */ X X-#define MIN(a,b) (((a) < (b)) ? (a) : (b)) X- X #define EEPROM_SIZE 64 X #define EEPROM_CS 25 /* Chip select bit */ X #define EEPROM_CLK 24 X@@ -68,16 +66,20 @@ X X #include X #include X-#include /* uprintf */ X+#include /* uprintf */ X #include X-#include /* defines used in kernel.h */ X-#include /* types used in module initialization */ X-#include /* cdevsw struct */ X-#include /* uio struct */ X+#include /* defines used in kernel.h */ X+#include /* types used in module initialization */ X+#include /* cdevsw struct */ X+#include /* uio struct */ X #include X-#include /* structs, prototypes for pci bus stuff */ X-#include /* For get_pci macros! */ X-#include /* IOCTL definitions */ X+#include /* structs, prototypes for pci bus stuff */ X+#if __FreeBSD_version > 500000 X+#include /* For get_pci macros! */ X+#else X+#include /* For get_pci macros! */ X+#endif X+#include "vpbio.h" /* IOCTL definitions */ X #include X #include X #include X@@ -113,26 +115,31 @@ X \*---------------------------------------------------------------------------*/ X X /* Character device entry points */ X- X+#if __FreeBSD_version > 500000 X+#if __FreeBSD_version > 503000 X+#define DEV_T struct cdev* X+#else X+#define DEV_T dev_t X+#endif X+#define D_THREAD_T thread X+#define CDEV_MAJOR MAJOR_AUTO /* reserved for local use */ X+#else X+#define DEV_T dev_t X+#define D_THREAD_T proc X+#define CDEV_MAJOR 33 /* reserved for lkms */ X+#endif X static struct cdevsw vpb_cdevsw = { X- vpb_open, X- vpb_close, X- vpb_read, X- vpb_write, X- vpb_ioctl, X- nopoll, X- nommap, X- nostrategy, X- "vpb", X- 201, /* reserved for local use */ X- nodump, X- nopsize, X- D_TTY, X- -1 X+ .d_open = vpb_open, X+ .d_close = vpb_close, X+ .d_read = vpb_read, X+ .d_write = vpb_write, X+ .d_ioctl = vpb_ioctl, X+ .d_name = "vpb", X+ .d_maj = CDEV_MAJOR, X }; X X /* number of valid PCI devices detected */ X-static int numPCI; X+static int numPCI=0; X X /* translated base address of PLX9050 regions */ X static unsigned char *base0[MAX_V4PCI]; X@@ -144,7 +151,7 @@ X static short buf[SIZE_WD]; X X /* vars */ X-static dev_t sdev; X+static DEV_T sdev[MAX_V4PCI] ={ 0 }; /* replace with dynamic allocation! */ X X static device_method_t vpb_methods[] = { X /* Device interface */ X@@ -154,15 +161,19 @@ X DEVMETHOD(device_shutdown, vpb_shutdown), X DEVMETHOD(device_suspend, vpb_suspend), X DEVMETHOD(device_resume, vpb_resume), X- X { 0, 0 } X }; X X+struct vpb_softc { X+ u_int32_t unit; X+ DEV_T dev; X+}; X+ X static driver_t vpb_driver = { X "vpb", X vpb_methods, X 0, X- /* sizeof(struct vpb_softc), */ X+ /* sizeof(struct vpb_softc), */ X }; X X static devclass_t vpb_devclass; X@@ -173,7 +184,7 @@ X open/close/read/write at this point */ X X static int X-vpb_open(dev_t dev, int oflags, int devtype, struct proc *p) X+vpb_open(DEV_T dev, int oflags, int devtype, struct D_THREAD_T *td) X { X int err = 0; X X@@ -181,7 +192,7 @@ X } X X static int X-vpb_close(dev_t dev, int fflag, int devtype, struct proc *p) X+vpb_close(DEV_T dev, int fflag, int devtype, struct D_THREAD_T *td) X { X int err=0; X X@@ -189,7 +200,7 @@ X } X X static int X-vpb_read(dev_t dev, struct uio *uio, int ioflag) X+vpb_read(DEV_T dev, struct uio *uio, int ioflag) X { X int err = 0; X X@@ -197,7 +208,7 @@ X } X X static int X-vpb_write(dev_t dev, struct uio *uio, int ioflag) X+vpb_write(DEV_T dev, struct uio *uio, int ioflag) X { X int err = 0; X X@@ -205,7 +216,7 @@ X } X X static int X-vpb_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct proc *pr) X+vpb_ioctl(DEV_T dev, u_long cmd, caddr_t arg, int flag, struct D_THREAD_T *td) X { X VPB_DATA *vpb_data; /* ioctl parameters from user space */ X short *data; /* user space address of data */ X@@ -318,8 +329,14 @@ X int subsystem; X char *s; X X+ if(numPCI >= MAX_V4PCI) { X+ return ENXIO; X+ } X+ X+ /* struct vpb_softc *sc = (struct vpb_softc *)device_get_softc(dev); */ X if ((pci_get_vendor(dev) == 0x10b5) && (pci_get_device(dev) == 0x9050)) { X X+ /* bzero(sc, sizeof(struct vpb_softc)); */ X /* check that subsytem ID & Subsytem Vendor matches */ X subsystem = pci_read_config(dev, 0x2c, 4); X s = (char*)&subsystem; X@@ -327,7 +344,7 @@ X if ((s[3] == 'V') && (s[2] == '4') && (s[1] == 'V') && (s[0] == 'T')) { X X printf("V4PCI %d found!\n", numPCI); X- device_set_desc(dev, "Voicetronix V4PCI Computer Telephony Card"); X+ device_set_desc_copy(dev, "Voicetronix V4PCI Computer Telephony Card"); X return 0; X } X } X@@ -341,13 +358,16 @@ X vpb_attach(device_t dev) X { X vm_offset_t paddr; X+ /* int unit; */ X X- sdev = make_dev(&vpb_cdevsw, X+ /* unit = device_get_unit(dev); */ X+ sdev[numPCI] = make_dev(&vpb_cdevsw, X 0, X UID_ROOT, X GID_WHEEL, X 0600, X- "vpb"); X+ "vpb%d", X+ numPCI); X X /* OK, V4PCI found, so map address regions..... */ X paddr = (vm_offset_t)pci_read_config(dev, PCI_BASE_ADDR0, 4) & ~0xf; X@@ -357,7 +377,9 @@ X base2[numPCI] = pmap_mapdev(paddr, sizeof(short)*SIZE_WD); X X /* set wait-states */ X- *(base0[0]+0x28) = 0x00440422; X+ /* ((unsigned int)*(base0[0]+0x28)) = 0x00440422; */ X+ /* now adding 1 wait-state to Write cycle hold */ X+ ((unsigned int)*(base0[0]+0x28)) = 0x070440422; X X numPCI++; X X@@ -369,6 +391,11 @@ X static int X vpb_detach(device_t dev) X { X+ if(numPCI>0 && sdev[numPCI-1]!=NULL) { X+ destroy_dev(sdev[numPCI-1]); X+ sdev[numPCI-1]=NULL; X+ numPCI--; X+ } X return 0; X } X X@@ -491,4 +518,4 @@ X cntrl &= 1; X return(cntrl); X } X- X+ END-of-vpb-driver/files/patch-FreeBSD-vpb.c echo x - vpb-driver/files/patch-Makefile sed 's/^X//' >vpb-driver/files/patch-Makefile << 'END-of-vpb-driver/files/patch-Makefile' X--- Makefile Thu Nov 4 07:33:22 2004 X+++ Makefile Fri Feb 11 16:55:17 2005 X@@ -26,8 +26,8 @@ X KERNEL_OLD := $(shell if [ -f $(KERNEL_LOCATION)/Rules.make ]; then echo 1; else echo 0; fi) X X # FreeBSD users: Please change this line to 'OS = FreeBSD' X-OS = linux X-#OS = FreeBSD X+#OS = linux X+OS = FreeBSD X export OS X X all: X@@ -37,20 +37,29 @@ X cd vpb-detect; make X else X echo FREEBSD X- cd src; gmake X+ cd src && gmake X+ cd FreeBSD && make X endif X X install: all X+ifeq ($(OS),linux) X mkdir -p $(root)/etc/vpb X cp -f firmware/vpbmain_isa.out $(root)/etc/vpb X cp -f firmware/vpbmain_pci.out $(root)/etc/vpb X cp -f firmware/vlcmain.out $(root)/etc/vpb X cp -f src/libvpb.a $(root)/usr/local/lib X cp -f src/vpbapi.h $(root)/usr/include X-ifneq ($(OS),linux) X- cp -f FreeBSD/vpb.c /sys/pci X- cp -f FreeBSD/vpbio.h /sys/sys X-else X+endif X+ifeq ($(OS),FreeBSD) X+ mkdir -p $(PREFIX)/etc/vpb X+ cp -f firmware/vpbmain_isa.out $(PREFIX)/etc/vpb X+ cp -f firmware/vpbmain_pci.out $(PREFIX)/etc/vpb X+ cp -f firmware/vlcmain.out $(PREFIX)/etc/vpb X+ cp -f src/libvpb.a $(PREFIX)/lib X+ cp -f src/vpbapi.h $(PREFIX)/include X+ cd FreeBSD && make install X+endif X+ifeq ($(OS),linux) X cp -f vpb-detect/vpbscan /usr/sbin X cp -f vpb-detect/vpbconf /usr/sbin X ifeq ($(KERNEL_OLD), 1) END-of-vpb-driver/files/patch-Makefile echo x - vpb-driver/files/patch-src-comm.cpp sed 's/^X//' >vpb-driver/files/patch-src-comm.cpp << 'END-of-vpb-driver/files/patch-src-comm.cpp' X--- src/comm.cpp Fri Aug 20 23:30:55 2004 X+++ src/comm.cpp Mon Mar 14 09:42:07 2005 X@@ -840,6 +840,7 @@ X X // GenericEnterCriticalSection(&PutMessageSect); X X+#ifndef __FreeBSD__ X switch (v->reg->model) X { X case VPB_V12PCI: X@@ -852,6 +853,9 @@ X hip->WriteIic(board, addr, length, buf); X break; X } X+#else X+ hip->WriteIic(board, addr, length, buf); X+#endif X X // CheckForAssert(board); X // GenericLeaveCriticalSection(&PutMessageSect); X@@ -879,6 +883,7 @@ X X // GenericEnterCriticalSection(&PutMessageSect); X X+#ifndef __FreeBSD__ X switch (v->reg->model) X { X case VPB_V12PCI: X@@ -891,6 +896,9 @@ X hip->ReadIic(board, addr, length, buf); X break; X } X+#else X+ hip->ReadIic(board, addr, length, buf); X+#endif X X // CheckForAssert(board); X // GenericLeaveCriticalSection(&PutMessageSect); END-of-vpb-driver/files/patch-src-comm.cpp echo x - vpb-driver/files/patch-src-vpbapi.cpp sed 's/^X//' >vpb-driver/files/patch-src-vpbapi.cpp << 'END-of-vpb-driver/files/patch-src-vpbapi.cpp' X--- src/vpbapi.cpp Sat Feb 12 09:56:53 2005 X+++ src/vpbapi.cpp Sat Feb 12 09:58:34 2005 X@@ -516,7 +516,7 @@ X Comm *c); X X static jmp_buf env; X-#ifdef linux X+#if defined(linux) || defined(__FreeBSD__) X static int check_3dnow(); X static int check_sse(); X #endif X@@ -3689,7 +3689,7 @@ X X return(VPB_OK); X } X-#ifdef linux X+#if defined(linux) || defined(__FreeBSD__) X /*---------------------------------------------------------------------------*\ X X FUNCTION: vpb_hostecho_opt END-of-vpb-driver/files/patch-src-vpbapi.cpp echo x - vpb-driver/files/patch-src-vpbapi.h sed 's/^X//' >vpb-driver/files/patch-src-vpbapi.h << 'END-of-vpb-driver/files/patch-src-vpbapi.h' X--- src/vpbapi.h Sat Feb 12 10:00:47 2005 X+++ src/vpbapi.h Sat Feb 12 10:01:56 2005 X@@ -150,7 +150,7 @@ X X \*-------------------------------------------------------------------------*/ X X-#ifdef linux X+#if defined(linux) || defined(__FreeBSD__) X int WINAPI vpb_set_station_sync(int handle, int state); X int WINAPI vpb_ring_station_async(int handle, int state, int one_ring); X int WINAPI vpb_user_ring_station_sync(int handle, int state); END-of-vpb-driver/files/patch-src-vpbapi.h echo x - vpb-driver/files/patch-src-vpbreg.cpp sed 's/^X//' >vpb-driver/files/patch-src-vpbreg.cpp << 'END-of-vpb-driver/files/patch-src-vpbreg.cpp' X--- src/vpbreg.cpp Sat Feb 12 09:50:04 2005 X+++ src/vpbreg.cpp Sat Feb 12 09:50:59 2005 X@@ -94,9 +94,9 @@ X X // path and name of firmware file X X-#define FIRMWARE_FILE_ISA "/etc/vpb/vpbmain_isa.out" X-#define FIRMWARE_FILE_ISA_VPB8L "/etc/vpb/vlcmain.out" X-#define FIRMWARE_FILE_PCI "/etc/vpb/vpbmain_pci.out" X+#define FIRMWARE_FILE_ISA "%%PREFIX%%/etc/vpb/vpbmain_isa.out" X+#define FIRMWARE_FILE_ISA_VPB8L "%%PREFIX%%/etc/vpb/vlcmain.out" X+#define FIRMWARE_FILE_PCI "%%PREFIX%%/etc/vpb/vpbmain_pci.out" X X /*-------------------------------------------------------------------------*\ X END-of-vpb-driver/files/patch-src-vpbreg.cpp echo x - vpb-driver/files/vpb.sh sed 's/^X//' >vpb-driver/files/vpb.sh << 'END-of-vpb-driver/files/vpb.sh' X#!/bin/sh X# X# $FreeBSD$ X# X X# PROVIDE: vpb-driver X# REQUIRE: NETWORKING X# KEYWORD: FreeBSD shutdown X# we load the vpb-driver after the network is fully loaded X# (for VOIP?) X X# X# Add the following lines to /etc/rc.conf to enable exim: X# X#vpb_driver_enable="YES" X# X X. %%RC_SUBR%% X Xname=vpb_driver Xrcvar=`set_rcvar` X Xrequired_dirs=%%LOGDIR%% Xvpb_module=/boot/kernel/vpb.ko Xrequired_files=${vpb_module} X Xstart_cmd=start_cmd Xstop_cmd=stop_cmd X Xextra_commands="reload" X Xstart_cmd() X{ X kldload ${vpb_module} X} X Xstop_cmd() X{ X kldunload vpb X} X X# read settings, set default values Xload_rc_config $name X: ${vpb_driver_enable="NO"} X Xrun_rc_command "$1" END-of-vpb-driver/files/vpb.sh echo x - vpb-driver/Makefile sed 's/^X//' >vpb-driver/Makefile << 'END-of-vpb-driver/Makefile' X# New ports collection makefile for: vpb-driver X# Date created: 11 Feb 2005 X# Whom: Chris Forkin X# X# $FreeBSD$ X# X XPORTNAME= vpb-driver XPORTVERSION= 2.4.0 XPORTREVISION= 1 XCATEGORIES= misc XMASTER_SITES= http://www.voicetronix.com/Downloads/ X XMAINTAINER= chris@forkin.com XCOMMENT= Device-driver for the Voicetronix OpenLine4 PCI telephony cards X XUSE_GMAKE= yes XUSE_REINPLACE= yes X XSED_SCRIPT= -e 's,%%PREFIX%%,${PREFIX},g' \ X -e 's,%%DOCSDIR%%,${DOCSDIR},g' \ X -e 's,%%DATADIR%%,${DATADIR},g' \ X -e 's,%%EXAMPLESDIR%%,${EXAMPLESDIR},g' \ X -e 's,%%RC_SUBR%%,${RC_SUBR},g' \ X X.include X Xcheck-sanity: X.if ${OSVERSION} < 502000 X# uses new device driver code X @${ECHO} "This port has only been tested on FreeBSD releases >= 502000 (this release is ${OSVERSION})" X @exit 1 X.endif X Xdo-configure: X @${REINPLACE_CMD} -E ${SED_SCRIPT} ${WRKSRC}/src/vpbreg.cpp X Xpost-install: X @${CP} ${FILESDIR}/vpb.sh ${PREFIX}/etc/rc.d/vpb.sh.sample X @${REINPLACE_CMD} -E ${SED_SCRIPT} ${PREFIX}/etc/rc.d/vpb.sh.sample X @${RM} -f ${PREFIX}/etc/rc.d/vpb.sh.sample.bak 2>/dev/null X X.include END-of-vpb-driver/Makefile echo x - vpb-driver/distinfo sed 's/^X//' >vpb-driver/distinfo << 'END-of-vpb-driver/distinfo' XMD5 (vpb-driver-2.4.0.tar.gz) = 6c64be7c42b1ca865fa5972a44ecf144 XSIZE (vpb-driver-2.4.0.tar.gz) = 838391 END-of-vpb-driver/distinfo echo x - vpb-driver/pkg-descr sed 's/^X//' >vpb-driver/pkg-descr << 'END-of-vpb-driver/pkg-descr' XA device-driver for the Voicetronix OpenLine4 PCI telephony card. XThe OpenLine4 PCI telephony card can be used in conjunction with Xasterisk (http://www.asterisk.org) to create a PC based PBX (private Xbranch exchange). X XWWW: http://www.voicetronix.com.au/vpb4_v4pci.htm X X- Chris Forkin Xchris@forkin.com END-of-vpb-driver/pkg-descr echo x - vpb-driver/pkg-message sed 's/^X//' >vpb-driver/pkg-message << 'END-of-vpb-driver/pkg-message' X------------------------------------------------------------------------------- XIMPORTANT INFORMATION! X XTo load(use) the driver, run (as root): X X# kldload /boot/kernel/vpb.ko X XTo unload it: X X# kldunload vpb X XYou can also automatically load the driver by adding it to loader.conf(5). XAlternatively you can copy the provided sample script X X${PREFIX}/etc/rc.d/vpb.sh.sample X Xto X X${PREFIX}/etc/rc.d/vpb.sh X Xand add X Xvpb_driver_enable="YES" X Xto your /etc/rc.conf file. X XThis port is based on the original driver for FreeBSD RELENG_4 by Voicetronix. XI have updated the driver to compile as a kernel loadable module and added Xthe port infrastructure. Should you have issues with the above, please report Xthem to me. Problems related to the driver itself (vpb.c) and or the library X(libvpb.a) should also be directed to Voicetronix as the original authors Xand code owners. X X-Chris X------------------------------------------------------------------------------- END-of-vpb-driver/pkg-message echo x - vpb-driver/pkg-plist sed 's/^X//' >vpb-driver/pkg-plist << 'END-of-vpb-driver/pkg-plist' Xetc/rc.d/vpb.sh.sample Xetc/vpb/vlcmain.out Xetc/vpb/vpbmain_isa.out Xetc/vpb/vpbmain_pci.out Xinclude/vpbapi.h Xlib/libvpb.a X@dirrm etc/vpb X@unexec rm -f /boot/kernel/vpb.ko 2>/dev/null || true END-of-vpb-driver/pkg-plist exit ---------------- ------------=_1110756060-24530-24 Content-Type: text/plain; name="disclaimer.txt" Content-Disposition: inline; filename="disclaimer.txt" Content-Transfer-Encoding: 7bit MIME-Version: 1.0 X-Mailer: MIME-tools 5.414 (Entity 5.414) =========================== Disclaimer =========================== All E-mail correspondence is scanned with: + ClamAV (see http://www.clamav.net) + MIMEDefang (see http://www.mimedefang.org/) + SpamAssassin (see http://spamassassin.apache.org/) We can however not guarantee that it is virus free and therefore accept no responsibility for any damage caused by the contents of this email. forkin.com has implemented SPF to assist in identifying SPAM (see http://spf.pobox.com/). postmaster@forkin.com ------------=_1110756060-24530-24--