From 3eaf4dbad2c00ba90806ae43cd38cf9281c82c9b Mon Sep 17 00:00:00 2001 From: michael Date: Thu, 6 Mar 2003 22:41:37 +0000 Subject: [PATCH] + Initial implementation --- packages/base/netdb/Makefile | 1322 ++++++++++++++++++++++++++++++ packages/base/netdb/Makefile.fpc | 19 + packages/base/netdb/README | 17 + packages/base/netdb/hs.inc | 109 +++ packages/base/netdb/hsh.inc | 21 + packages/base/netdb/netdb.pp | 929 +++++++++++++++++++++ packages/base/netdb/testdns.pp | 68 ++ packages/base/netdb/testhst.pp | 47 ++ packages/base/netdb/testnet.pp | 44 + packages/base/netdb/testsvc.pp | 49 ++ 10 files changed, 2625 insertions(+) create mode 100644 packages/base/netdb/Makefile create mode 100644 packages/base/netdb/Makefile.fpc create mode 100644 packages/base/netdb/README create mode 100644 packages/base/netdb/hs.inc create mode 100644 packages/base/netdb/hsh.inc create mode 100644 packages/base/netdb/netdb.pp create mode 100644 packages/base/netdb/testdns.pp create mode 100644 packages/base/netdb/testhst.pp create mode 100644 packages/base/netdb/testnet.pp create mode 100644 packages/base/netdb/testsvc.pp diff --git a/packages/base/netdb/Makefile b/packages/base/netdb/Makefile new file mode 100644 index 0000000000..3e99040638 --- /dev/null +++ b/packages/base/netdb/Makefile @@ -0,0 +1,1322 @@ +# +# Don't edit, this file is generated by FPCMake Version 1.1 [2002/10/05] +# +default: all +MAKEFILETARGETS=linux go32v2 win32 os2 freebsd beos netbsd amiga atari sunos qnx netware openbsd wdosx +override PATH:=$(subst \,/,$(PATH)) +ifeq ($(findstring ;,$(PATH)),) +inUnix=1 +SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH))) +else +SEARCHPATH:=$(subst ;, ,$(PATH)) +endif +PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH)))) +ifeq ($(PWD),) +PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH)))) +ifeq ($(PWD),) +$(error You need the GNU utils package to use this Makefile) +else +PWD:=$(firstword $(PWD)) +SRCEXEEXT= +endif +else +PWD:=$(firstword $(PWD)) +SRCEXEEXT=.exe +endif +ifndef inUnix +ifeq ($(OS),Windows_NT) +inWinNT=1 +else +ifdef OS2_SHELL +inOS2=1 +endif +endif +else +ifneq ($(findstring cygwin,$(MACHTYPE)),) +inCygWin=1 +endif +endif +ifeq ($(OS_TARGET),freebsd) +BSDhier=1 +endif +ifeq ($(OS_TARGET),netbsd) +BSDhier=1 +endif +ifeq ($(OS_TARGET),openbsd) +BSDhier=1 +endif +ifdef inUnix +BATCHEXT=.sh +else +ifdef inOS2 +BATCHEXT=.cmd +else +BATCHEXT=.bat +endif +endif +ifdef inUnix +PATHSEP=/ +else +PATHSEP:=$(subst /,\,/) +ifneq ($(findstring sh.exe,$(SHELL)),) +PATHSEP=/ +endif +endif +ifdef PWD +BASEDIR:=$(subst \,/,$(shell $(PWD))) +ifdef inCygWin +ifneq ($(findstring /cygdrive/,$(BASEDIR)),) +BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR)) +BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR))) +BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR)) +endif +endif +else +BASEDIR=. +endif +ifdef inOS2 +ifndef ECHO +ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(ECHO),) +ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(ECHO),) +ECHO=echo +else +ECHO:=$(firstword $(ECHO)) +endif +else +ECHO:=$(firstword $(ECHO)) +endif +endif +export ECHO +endif +override DEFAULT_FPCDIR=../../.. +ifndef FPC +ifdef PP +FPC=$(PP) +endif +endif +ifndef FPC +FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH)))) +ifneq ($(FPCPROG),) +FPCPROG:=$(firstword $(FPCPROG)) +FPC:=$(shell $(FPCPROG) -PB) +ifneq ($(findstring Error,$(FPC)),) +override FPC=ppc386 +endif +else +override FPC=ppc386 +endif +endif +override FPC:=$(subst $(SRCEXEEXT),,$(FPC)) +override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT) +ifndef FPC_VERSION +FPC_VERSION:=$(shell $(FPC) -iV) +endif +export FPC FPC_VERSION +unexport CHECKDEPEND ALLDEPENDENCIES +ifeq ($(findstring 1.0.,$(FPC_VERSION)),) +COMPILERINFO:=$(shell $(FPC) -iSP -iTP -iSO -iTO) +ifndef CPU_SOURCE +CPU_SOURCE:=$(word 1,$(COMPILERINFO)) +endif +ifndef CPU_TARGET +CPU_TARGET:=$(word 2,$(COMPILERINFO)) +endif +ifndef OS_SOURCE +OS_SOURCE:=$(word 3,$(COMPILERINFO)) +endif +ifndef OS_TARGET +OS_TARGET:=$(word 4,$(COMPILERINFO)) +endif +else +ifndef CPU_SOURCE +CPU_SOURCE:=$(shell $(FPC) -iSP) +endif +ifndef CPU_TARGET +CPU_TARGET:=$(shell $(FPC) -iTP) +endif +ifndef OS_SOURCE +OS_SOURCE:=$(shell $(FPC) -iSO) +endif +ifndef OS_TARGET +OS_TARGET:=$(shell $(FPC) -iTO) +endif +endif +ifndef CPU_TARGET +ifdef CPU_TARGET_DEFAULT +CPU_TARGET=$(CPU_TARGET_DEFAULT) +endif +endif +ifndef OS_TARGET +ifdef OS_TARGET_DEFAULT +OS_TARGET=$(OS_TARGET_DEFAULT) +endif +endif +FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET) +FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE) +ifneq ($(FULL_TARGET),$(FULL_SOURCE)) +CROSSCOMPILE=1 +endif +ifeq ($(findstring makefile,$(MAKECMDGOALS)),) +ifeq ($(findstring $(OS_TARGET),$(MAKEFILETARGETS)),) +$(error The Makefile doesn't support target $(OS_TARGET), please run fpcmake first) +endif +endif +export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE CROSSCOMPILE +ifdef FPCDIR +override FPCDIR:=$(subst \,/,$(FPCDIR)) +ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),) +override FPCDIR=wrong +endif +else +override FPCDIR=wrong +endif +ifdef DEFAULT_FPCDIR +ifeq ($(FPCDIR),wrong) +override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR)) +ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),) +override FPCDIR=wrong +endif +endif +endif +ifeq ($(FPCDIR),wrong) +ifdef inUnix +override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION) +ifeq ($(wildcard $(FPCDIR)/units),) +override FPCDIR=/usr/lib/fpc/$(FPC_VERSION) +endif +else +override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH)))))) +override FPCDIR:=$(FPCDIR)/.. +ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),) +override FPCDIR:=$(FPCDIR)/.. +ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),) +override FPCDIR=c:/pp +endif +endif +endif +endif +ifndef CROSSDIR +CROSSDIR:=$(FPCDIR)/cross/$(FULL_TARGET) +endif +ifndef CROSSTARGETDIR +CROSSTARGETDIR=$(CROSSDIR)/$(FULL_TARGET) +endif +ifdef CROSSCOMPILE +UNITSDIR:=$(wildcard $(CROSSTARGETDIR)/units) +ifeq ($(UNITSDIR),) +UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET)) +endif +else +UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET)) +endif +PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages/base $(FPCDIR)/packages/extra) +override PACKAGE_NAME=netdb +override PACKAGE_VERSION=1.0.6 +override TARGET_UNITS+=netdb +override TARGET_EXAMPLES+=testdns testhst testsvc testnet +override INSTALL_FPCPACKAGE=y +ifdef REQUIRE_UNITSDIR +override UNITSDIR+=$(REQUIRE_UNITSDIR) +endif +ifdef REQUIRE_PACKAGESDIR +override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR) +endif +ifdef ZIPINSTALL +ifeq ($(OS_TARGET),linux) +UNIXINSTALLDIR=1 +endif +ifeq ($(OS_TARGET),freebsd) +UNIXINSTALLDIR=1 +endif +ifeq ($(OS_TARGET),netbsd) +UNIXINSTALLDIR=1 +endif +ifeq ($(OS_TARGET),openbsd) +UNIXINSTALLDIR=1 +endif +ifeq ($(OS_TARGET),sunos) +UNIXINSTALLDIR=1 +endif +ifeq ($(OS_TARGET),qnx) +UNIXINSTALLDIR=1 +endif +else +ifeq ($(OS_SOURCE),linux) +UNIXINSTALLDIR=1 +endif +ifeq ($(OS_SOURCE),freebsd) +UNIXINSTALLDIR=1 +endif +ifeq ($(OS_SOURCE),netbsd) +UNIXINSTALLDIR=1 +endif +ifeq ($(OS_SOURCE),openbsd) +UNIXINSTALLDIR=1 +endif +ifeq ($(OS_TARGET),sunos) +UNIXINSTALLDIR=1 +endif +ifeq ($(OS_TARGET),qnx) +UNIXINSTALLDIR=1 +endif +endif +ifndef INSTALL_PREFIX +ifdef PREFIX +INSTALL_PREFIX=$(PREFIX) +endif +endif +ifndef INSTALL_PREFIX +ifdef UNIXINSTALLDIR +INSTALL_PREFIX=/usr/local +else +ifdef INSTALL_FPCPACKAGE +INSTALL_BASEDIR:=/pp +else +INSTALL_BASEDIR:=/$(PACKAGE_NAME) +endif +endif +endif +export INSTALL_PREFIX +ifdef INSTALL_FPCSUBDIR +export INSTALL_FPCSUBDIR +endif +ifndef DIST_DESTDIR +DIST_DESTDIR:=$(BASEDIR) +endif +export DIST_DESTDIR +ifndef INSTALL_BASEDIR +ifdef UNIXINSTALLDIR +ifdef INSTALL_FPCPACKAGE +INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION) +else +INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME) +endif +else +INSTALL_BASEDIR:=$(INSTALL_PREFIX) +endif +endif +ifndef INSTALL_BINDIR +ifdef UNIXINSTALLDIR +INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin +else +INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin +ifdef INSTALL_FPCPACKAGE +INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(OS_TARGET) +endif +endif +endif +ifndef INSTALL_UNITDIR +ifdef CROSSCOMPILE +INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/cross/$(FULL_TARGET)/units +else +INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(OS_TARGET) +endif +ifdef INSTALL_FPCPACKAGE +ifdef PACKAGE_NAME +INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME) +endif +endif +endif +ifndef INSTALL_LIBDIR +ifdef UNIXINSTALLDIR +INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib +else +INSTALL_LIBDIR:=$(INSTALL_UNITDIR) +endif +endif +ifndef INSTALL_SOURCEDIR +ifdef UNIXINSTALLDIR +ifdef BSDhier +SRCPREFIXDIR=share/src +else +SRCPREFIXDIR=src +endif +ifdef INSTALL_FPCPACKAGE +ifdef INSTALL_FPCSUBDIR +INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME) +else +INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME) +endif +else +INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION) +endif +else +ifdef INSTALL_FPCPACKAGE +ifdef INSTALL_FPCSUBDIR +INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME) +else +INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME) +endif +else +INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source +endif +endif +endif +ifndef INSTALL_DOCDIR +ifdef UNIXINSTALLDIR +ifdef BSDhier +DOCPREFIXDIR=share/doc +else +DOCPREFIXDIR=doc +endif +ifdef INSTALL_FPCPACKAGE +INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME) +else +INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION) +endif +else +ifdef INSTALL_FPCPACKAGE +INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME) +else +INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc +endif +endif +endif +ifndef INSTALL_EXAMPLEDIR +ifdef UNIXINSTALLDIR +ifdef INSTALL_FPCPACKAGE +ifdef BSDhier +INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME) +else +INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME) +endif +else +ifdef BSDhier +INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION) +else +INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION) +endif +endif +else +ifdef INSTALL_FPCPACKAGE +INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME) +else +INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples +endif +endif +endif +ifndef INSTALL_DATADIR +INSTALL_DATADIR=$(INSTALL_BASEDIR) +endif +ifdef CROSSCOMPILE +ifndef CROSSBINDIR +CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(FULL_SOURCE)) +ifeq ($(CROSSBINDIR),) +CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(FULL_TARGET)/bin/$(FULL_SOURCE)) +endif +endif +else +CROSSBINDIR= +endif +LOADEREXT=.as +EXEEXT=.exe +PPLEXT=.ppl +PPUEXT=.ppu +OEXT=.o +ASMEXT=.s +SMARTEXT=.sl +STATICLIBEXT=.a +SHAREDLIBEXT=.so +STATICLIBPREFIX=libp +RSTEXT=.rst +FPCMADE=fpcmade +ifeq ($(OS_TARGET),go32v1) +PPUEXT=.pp1 +OEXT=.o1 +ASMEXT=.s1 +SMARTEXT=.sl1 +STATICLIBEXT=.a1 +SHAREDLIBEXT=.so1 +STATICLIBPREFIX= +FPCMADE=fpcmade.v1 +PACKAGESUFFIX=v1 +endif +ifeq ($(OS_TARGET),go32v2) +STATICLIBPREFIX= +FPCMADE=fpcmade.dos +ZIPSUFFIX=go32 +endif +ifeq ($(OS_TARGET),linux) +EXEEXT= +HASSHAREDLIB=1 +FPCMADE=fpcmade.lnx +ZIPSUFFIX=linux +endif +ifeq ($(OS_TARGET),freebsd) +EXEEXT= +HASSHAREDLIB=1 +FPCMADE=fpcmade.freebsd +ZIPSUFFIX=freebsd +endif +ifeq ($(OS_TARGET),netbsd) +EXEEXT= +HASSHAREDLIB=1 +FPCMADE=fpcmade.netbsd +ZIPSUFFIX=netbsd +endif +ifeq ($(OS_TARGET),openbsd) +EXEEXT= +HASSHAREDLIB=1 +FPCMADE=fpcmade.openbsd +ZIPSUFFIX=openbsd +endif +ifeq ($(OS_TARGET),win32) +PPUEXT=.ppw +OEXT=.ow +ASMEXT=.sw +SMARTEXT=.slw +STATICLIBEXT=.aw +SHAREDLIBEXT=.dll +FPCMADE=fpcmade.w32 +ZIPSUFFIX=w32 +endif +ifeq ($(OS_TARGET),os2) +PPUEXT=.ppo +ASMEXT=.so2 +OEXT=.oo2 +AOUTEXT=.out +SMARTEXT=.sl2 +STATICLIBPREFIX= +STATICLIBEXT=.ao2 +SHAREDLIBEXT=.dll +FPCMADE=fpcmade.os2 +ZIPSUFFIX=emx +ECHO=echo +endif +ifeq ($(OS_TARGET),amiga) +EXEEXT= +PPUEXT=.ppu +ASMEXT=.asm +OEXT=.o +SMARTEXT=.sl +STATICLIBEXT=.a +SHAREDLIBEXT=.library +FPCMADE=fpcmade.amg +endif +ifeq ($(OS_TARGET),atari) +PPUEXT=.ppu +ASMEXT=.s +OEXT=.o +SMARTEXT=.sl +STATICLIBEXT=.a +EXEEXT=.ttp +FPCMADE=fpcmade.ata +endif +ifeq ($(OS_TARGET),beos) +PPUEXT=.ppu +ASMEXT=.s +OEXT=.o +SMARTEXT=.sl +STATICLIBEXT=.a +EXEEXT= +FPCMADE=fpcmade.be +ZIPSUFFIX=be +endif +ifeq ($(OS_TARGET),sunos) +PPUEXT=.ppu +ASMEXT=.s +OEXT=.o +SMARTEXT=.sl +STATICLIBEXT=.a +EXEEXT= +FPCMADE=fpcmade.sun +ZIPSUFFIX=sun +endif +ifeq ($(OS_TARGET),qnx) +PPUEXT=.ppu +ASMEXT=.s +OEXT=.o +SMARTEXT=.sl +STATICLIBEXT=.a +EXEEXT= +FPCMADE=fpcmade.qnx +ZIPSUFFIX=qnx +endif +ifeq ($(OS_TARGET),netware) +STATICLIBPREFIX= +PPUEXT=.ppn +OEXT=.on +ASMEXT=.s +SMARTEXT=.sl +STATICLIBEXT=.a +SHAREDLIBEXT=.nlm +FPCMADE=fpcmade.nw +ZIPSUFFIX=nw +EXEEXT=.nlm +endif +ifndef ECHO +ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(ECHO),) +ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(ECHO),) +ECHO= +else +ECHO:=$(firstword $(ECHO)) +endif +else +ECHO:=$(firstword $(ECHO)) +endif +endif +export ECHO +ifndef DATE +DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(DATE),) +DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(DATE),) +DATE= +else +DATE:=$(firstword $(DATE)) +endif +else +DATE:=$(firstword $(DATE)) +endif +endif +export DATE +ifndef GINSTALL +GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(GINSTALL),) +GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(GINSTALL),) +GINSTALL= +else +GINSTALL:=$(firstword $(GINSTALL)) +endif +else +GINSTALL:=$(firstword $(GINSTALL)) +endif +endif +export GINSTALL +ifndef CPPROG +CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(CPPROG),) +CPPROG= +else +CPPROG:=$(firstword $(CPPROG)) +endif +endif +export CPPROG +ifndef RMPROG +RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(RMPROG),) +RMPROG= +else +RMPROG:=$(firstword $(RMPROG)) +endif +endif +export RMPROG +ifndef MVPROG +MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(MVPROG),) +MVPROG= +else +MVPROG:=$(firstword $(MVPROG)) +endif +endif +export MVPROG +ifndef ECHOREDIR +ECHOREDIR:=$(subst /,$(PATHSEP),$(ECHO)) +endif +ifndef COPY +COPY:=$(CPPROG) -fp +endif +ifndef COPYTREE +COPYTREE:=$(CPPROG) -rfp +endif +ifndef MOVE +MOVE:=$(MVPROG) -f +endif +ifndef DEL +DEL:=$(RMPROG) -f +endif +ifndef DELTREE +DELTREE:=$(RMPROG) -rf +endif +ifndef INSTALL +ifdef inUnix +INSTALL:=$(GINSTALL) -c -m 644 +else +INSTALL:=$(COPY) +endif +endif +ifndef INSTALLEXE +ifdef inUnix +INSTALLEXE:=$(GINSTALL) -c -m 755 +else +INSTALLEXE:=$(COPY) +endif +endif +ifndef MKDIR +MKDIR:=$(GINSTALL) -m 755 -d +endif +export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR +ifndef PPUMOVE +PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(PPUMOVE),) +PPUMOVE= +else +PPUMOVE:=$(firstword $(PPUMOVE)) +endif +endif +export PPUMOVE +ifndef FPCMAKE +FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(FPCMAKE),) +FPCMAKE= +else +FPCMAKE:=$(firstword $(FPCMAKE)) +endif +endif +export FPCMAKE +ifndef ZIPPROG +ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(ZIPPROG),) +ZIPPROG= +else +ZIPPROG:=$(firstword $(ZIPPROG)) +endif +endif +export ZIPPROG +ifndef TARPROG +TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(TARPROG),) +TARPROG= +else +TARPROG:=$(firstword $(TARPROG)) +endif +endif +export TARPROG +ASNAME=as +LDNAME=ld +ARNAME=ar +RCNAME=rc +ifeq ($(OS_TARGET),win32) +ASNAME=asw +LDNAME=ldw +ARNAME=arw +endif +ifndef ASPROG +ifdef CROSSBINDIR +ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT) +else +ASPROG=$(ASNAME) +endif +endif +ifndef LDPROG +ifdef CROSSBINDIR +LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT) +else +LDPROG=$(LDNAME) +endif +endif +ifndef RCPROG +ifdef CROSSBINDIR +RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT) +else +RCPROG=$(RCNAME) +endif +endif +ifndef ARPROG +ifdef CROSSBINDIR +ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT) +else +ARPROG=$(ARNAME) +endif +endif +AS=$(ASPROG) +LD=$(LDPROG) +RC=$(RCPROG) +AR=$(ARPROG) +PPAS=ppas$(BATCHEXT) +ifdef inUnix +LDCONFIG=ldconfig +else +LDCONFIG= +endif +ifdef DATE +DATESTR:=$(shell $(DATE) +%Y%m%d) +else +DATESTR= +endif +ifndef UPXPROG +ifeq ($(OS_TARGET),go32v2) +UPXPROG:=1 +endif +ifeq ($(OS_TARGET),win32) +UPXPROG:=1 +endif +ifdef UPXPROG +UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(UPXPROG),) +UPXPROG= +else +UPXPROG:=$(firstword $(UPXPROG)) +endif +else +UPXPROG= +endif +endif +export UPXPROG +ZIPOPT=-9 +ZIPEXT=.zip +ifeq ($(USETAR),bz2) +TAROPT=vI +TAREXT=.tar.bz2 +else +TAROPT=vz +TAREXT=.tar.gz +endif +override REQUIRE_PACKAGES=rtl +ifeq ($(OS_TARGET),linux) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(OS_TARGET),go32v2) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(OS_TARGET),win32) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(OS_TARGET),os2) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(OS_TARGET),freebsd) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(OS_TARGET),beos) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(OS_TARGET),netbsd) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(OS_TARGET),amiga) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(OS_TARGET),atari) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(OS_TARGET),sunos) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(OS_TARGET),qnx) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(OS_TARGET),netware) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(OS_TARGET),openbsd) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(OS_TARGET),wdosx) +REQUIRE_PACKAGES_RTL=1 +endif +ifdef REQUIRE_PACKAGES_RTL +PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/$(OS_TARGET)/Makefile.fpc,$(PACKAGESDIR)))))) +ifneq ($(PACKAGEDIR_RTL),) +ifneq ($(wildcard $(PACKAGEDIR_RTL)/$(OS_TARGET)),) +UNITDIR_RTL=$(PACKAGEDIR_RTL)/$(OS_TARGET) +else +UNITDIR_RTL=$(PACKAGEDIR_RTL) +endif +ifdef CHECKDEPEND +$(PACKAGEDIR_RTL)/$(FPCMADE): + $(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE) +override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE) +endif +else +PACKAGEDIR_RTL= +UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR))))) +ifneq ($(UNITDIR_RTL),) +UNITDIR_RTL:=$(firstword $(UNITDIR_RTL)) +else +UNITDIR_RTL= +endif +endif +ifdef UNITDIR_RTL +override COMPILER_UNITDIR+=$(UNITDIR_RTL) +endif +endif +ifndef NOCPUDEF +override FPCOPTDEF=$(CPU_TARGET) +endif +ifneq ($(OS_TARGET),$(OS_SOURCE)) +override FPCOPT+=-T$(OS_TARGET) +endif +ifeq ($(OS_SOURCE),openbsd) +override FPCOPT+=-FD$(NEW_BINUTILS_PATH) +endif +ifdef UNITDIR +override FPCOPT+=$(addprefix -Fu,$(UNITDIR)) +endif +ifdef LIBDIR +override FPCOPT+=$(addprefix -Fl,$(LIBDIR)) +endif +ifdef OBJDIR +override FPCOPT+=$(addprefix -Fo,$(OBJDIR)) +endif +ifdef INCDIR +override FPCOPT+=$(addprefix -Fi,$(INCDIR)) +endif +ifdef LINKSMART +override FPCOPT+=-XX +endif +ifdef CREATESMART +override FPCOPT+=-CX +endif +ifdef DEBUG +override FPCOPT+=-gl +override FPCOPTDEF+=DEBUG +endif +ifdef RELEASE +ifeq ($(CPU_TARGET),i386) +FPCCPUOPT:=-OG2p3 +else +FPCCPUOPT:= +endif +override FPCOPT+=-Xs $(FPCCPUOPT) -n +override FPCOPTDEF+=RELEASE +endif +ifdef STRIP +override FPCOPT+=-Xs +endif +ifdef OPTIMIZE +ifeq ($(CPU_TARGET),i386) +override FPCOPT+=-OG2p3 +endif +endif +ifdef VERBOSE +override FPCOPT+=-vwni +endif +ifdef COMPILER_OPTIONS +override FPCOPT+=$(COMPILER_OPTIONS) +endif +ifdef COMPILER_UNITDIR +override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR)) +endif +ifdef COMPILER_LIBRARYDIR +override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR)) +endif +ifdef COMPILER_OBJECTDIR +override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR)) +endif +ifdef COMPILER_INCLUDEDIR +override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR)) +endif +ifdef CROSSBINDIR +override FPCOPT+=-FD$(CROSSBINDIR) +endif +ifdef COMPILER_TARGETDIR +override FPCOPT+=-FE$(COMPILER_TARGETDIR) +ifeq ($(COMPILER_TARGETDIR),.) +override TARGETDIRPREFIX= +else +override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/ +endif +endif +ifdef COMPILER_UNITTARGETDIR +override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR) +ifeq ($(COMPILER_UNITTARGETDIR),.) +override UNITTARGETDIRPREFIX= +else +override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/ +endif +else +ifdef COMPILER_TARGETDIR +override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR) +override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX) +endif +endif +ifdef OPT +override FPCOPT+=$(OPT) +endif +ifdef FPCOPTDEF +override FPCOPT+=$(addprefix -d,$(FPCOPTDEF)) +endif +ifdef CFGFILE +override FPCOPT+=@$(CFGFILE) +endif +ifdef USEENV +override FPCEXTCMD:=$(FPCOPT) +override FPCOPT:=!FPCEXTCMD +export FPCEXTCMD +endif +override COMPILER:=$(FPC) $(FPCOPT) +ifeq (,$(findstring -s ,$(COMPILER))) +EXECPPAS= +else +ifeq ($(OS_SOURCE),$(OS_TARGET)) +EXECPPAS:=@$(PPAS) +endif +endif +.PHONY: fpc_units +ifdef TARGET_UNITS +override ALLTARGET+=fpc_units +override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS)) +override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITUNITS)) +override INSTALLPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES) +override CLEANPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES) +endif +fpc_units: $(UNITPPUFILES) +ifdef TARGET_RSTS +override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS)) +override CLEANRSTFILES+=$(RSTFILES) +endif +.PHONY: fpc_examples +ifdef TARGET_EXAMPLES +HASEXAMPLES=1 +override EXAMPLESOURCEFILES:=$(wildcard $(addsuffix .pp,$(TARGET_EXAMPLES)) $(addsuffix .pas,$(TARGET_EXAMPLES))) +override EXAMPLEFILES:=$(addsuffix $(EXEEXT),$(TARGET_EXAMPLES)) +override EXAMPLEOFILES:=$(addsuffix $(OEXT),$(TARGET_EXAMPLES)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_EXAMPLES))) +override CLEANEXEFILES+=$(EXAMPLEFILES) $(EXAMPLEOFILES) +ifeq ($(OS_TARGET),os2) +override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_EXAMPLES)) +endif +endif +ifdef TARGET_EXAMPLEDIRS +HASEXAMPLES=1 +endif +fpc_examples: all $(EXAMPLEFILES) $(addsuffix _all,$(TARGET_EXAMPLEDIRS)) +.PHONY: fpc_all fpc_smart fpc_debug fpc_release +$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET) + @$(ECHOREDIR) Compiled > $(FPCMADE) +fpc_all: $(FPCMADE) +fpc_smart: + $(MAKE) all LINKSMART=1 CREATESMART=1 +fpc_debug: + $(MAKE) all DEBUG=1 +fpc_release: + $(MAKE) all RELEASE=1 +.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .pp .rc .res +%$(PPUEXT): %.pp + $(COMPILER) $< + $(EXECPPAS) +%$(PPUEXT): %.pas + $(COMPILER) $< + $(EXECPPAS) +%$(EXEEXT): %.pp + $(COMPILER) $< + $(EXECPPAS) +%$(EXEEXT): %.pas + $(COMPILER) $< + $(EXECPPAS) +%.res: %.rc + windres -i $< -o $@ +vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR) +vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR) +vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR) +.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall +ifdef INSTALL_UNITS +override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS)) +endif +ifdef INSTALL_BUILDUNIT +override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES)) +endif +ifdef INSTALLPPUFILES +override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) +override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(INSTALLPPUFILES)) +override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(INSTALLPPULINKFILES))) +override INSTALL_CREATEPACKAGEFPC=1 +endif +ifdef INSTALLEXEFILES +override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLEXEFILES)) +endif +fpc_install: all $(INSTALLTARGET) +ifdef INSTALLEXEFILES + $(MKDIR) $(INSTALL_BINDIR) +ifdef UPXPROG + -$(UPXPROG) $(INSTALLEXEFILES) +endif + $(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR) +endif +ifdef INSTALL_CREATEPACKAGEFPC +ifdef FPCMAKE +ifdef PACKAGE_VERSION +ifneq ($(wildcard Makefile.fpc),) + $(FPCMAKE) -p -T$(OS_TARGET) Makefile.fpc + $(MKDIR) $(INSTALL_UNITDIR) + $(INSTALL) Package.fpc $(INSTALL_UNITDIR) +endif +endif +endif +endif +ifdef INSTALLPPUFILES + $(MKDIR) $(INSTALL_UNITDIR) + $(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR) +ifneq ($(INSTALLPPULINKFILES),) + $(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR) +endif +ifneq ($(wildcard $(LIB_FULLNAME)),) + $(MKDIR) $(INSTALL_LIBDIR) + $(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR) +ifdef inUnix + ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME) +endif +endif +endif +ifdef INSTALL_FILES + $(MKDIR) $(INSTALL_DATADIR) + $(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR) +endif +fpc_sourceinstall: distclean + $(MKDIR) $(INSTALL_SOURCEDIR) + $(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR) +fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS)) +ifdef HASEXAMPLES + $(MKDIR) $(INSTALL_EXAMPLEDIR) +endif +ifdef EXAMPLESOURCEFILES + $(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR) +endif +ifdef TARGET_EXAMPLEDIRS + $(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR) +endif +.PHONY: fpc_distinstall +fpc_distinstall: install exampleinstall +.PHONY: fpc_zipinstall fpc_zipsourceinstall fpc_zipexampleinstall +ifndef PACKDIR +ifndef inUnix +PACKDIR=$(BASEDIR)/../fpc-pack +else +PACKDIR=/tmp/fpc-pack +endif +endif +ifndef ZIPNAME +ifdef DIST_ZIPNAME +ZIPNAME=$(DIST_ZIPNAME) +else +ZIPNAME=$(ZIPPREFIX)$(PACKAGE_NAME)$(ZIPSUFFIX) +endif +endif +ifndef ZIPTARGET +ifdef DIST_ZIPTARGET +ZIPTARGET=DIST_ZIPTARGET +else +ZIPTARGET=install +endif +endif +ifndef USEZIP +ifdef inUnix +USETAR=1 +endif +endif +ifndef inUnix +USEZIPWRAPPER=1 +endif +ifdef USEZIPWRAPPER +ZIPPATHSEP=$(PATHSEP) +ZIPWRAPPER=$(subst /,$(PATHSEP),$(DIST_DESTDIR)/fpczip$(BATCHEXT)) +else +ZIPPATHSEP=/ +endif +ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR)) +ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR)) +ifdef USETAR +ZIPDESTFILE:=$(DIST_DESTDIR)/$(ZIPNAME)$(TAREXT) +ZIPCMD_ZIP:=$(TARPROG) cf$(TAROPT) $(ZIPDESTFILE) * +else +ZIPDESTFILE:=$(DIST_DESTDIR)/$(ZIPNAME)$(ZIPEXT) +ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) * +endif +fpc_zipinstall: + $(MAKE) $(ZIPTARGET) INSTALL_PREFIX=$(PACKDIR) ZIPINSTALL=1 + $(MKDIR) $(DIST_DESTDIR) + $(DEL) $(ZIPDESTFILE) +ifdef USEZIPWRAPPER +ifneq ($(ECHOREDIR),echo) + $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDPACK))" > $(ZIPWRAPPER) + $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_ZIP))" >> $(ZIPWRAPPER) + $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDBASE))" >> $(ZIPWRAPPER) +else + echo $(ZIPCMD_CDPACK) > $(ZIPWRAPPER) + echo $(ZIPCMD_ZIP) >> $(ZIPWRAPPER) + echo $(ZIPCMD_CDBASE) >> $(ZIPWRAPPER) +endif +ifdef inUnix + /bin/sh $(ZIPWRAPPER) +else + $(ZIPWRAPPER) +endif + $(DEL) $(ZIPWRAPPER) +else + $(ZIPCMD_CDPACK) ; $(ZIPCMD_ZIP) ; $(ZIPCMD_CDBASE) +endif + $(DELTREE) $(PACKDIR) +fpc_zipsourceinstall: + $(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall ZIPSUFFIX=src +fpc_zipexampleinstall: +ifdef HASEXAMPLES + $(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall ZIPSUFFIX=exm +endif +fpc_zipdistinstall: + $(MAKE) fpc_zipinstall ZIPTARGET=distinstall +.PHONY: fpc_clean fpc_cleanall fpc_distclean +ifdef EXEFILES +override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES)) +endif +ifdef CLEAN_UNITS +override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS)) +endif +ifdef CLEANPPUFILES +override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) +override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES)) +override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES))) +endif +fpc_clean: $(CLEANTARGET) +ifdef CLEANEXEFILES + -$(DEL) $(CLEANEXEFILES) +endif +ifdef CLEANPPUFILES + -$(DEL) $(CLEANPPUFILES) +endif +ifneq ($(CLEANPPULINKFILES),) + -$(DEL) $(CLEANPPULINKFILES) +endif +ifdef CLEANRSTFILES + -$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES)) +endif +ifdef CLEAN_FILES + -$(DEL) $(CLEAN_FILES) +endif +ifdef LIB_NAME + -$(DEL) $(LIB_NAME) $(LIB_FULLNAME) +endif + -$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE) +fpc_distclean: clean +ifdef COMPILER_UNITTARGETDIR +TARGETDIRCLEAN=fpc_clean +endif +fpc_cleanall: $(CLEANTARGET) $(TARGETDIRCLEAN) +ifdef CLEANEXEFILES + -$(DEL) $(CLEANEXEFILES) +endif + -$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT) + -$(DELTREE) *$(SMARTEXT) + -$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE) +ifdef AOUTEXT + -$(DEL) *$(AOUTEXT) +endif +.PHONY: fpc_baseinfo +override INFORULES+=fpc_baseinfo +fpc_baseinfo: + @$(ECHO) + @$(ECHO) == Package info == + @$(ECHO) Package Name..... $(PACKAGE_NAME) + @$(ECHO) Package Version.. $(PACKAGE_VERSION) + @$(ECHO) + @$(ECHO) == Configuration info == + @$(ECHO) + @$(ECHO) FPC.......... $(FPC) + @$(ECHO) FPC Version.. $(FPC_VERSION) + @$(ECHO) Source CPU... $(CPU_SOURCE) + @$(ECHO) Target CPU... $(CPU_TARGET) + @$(ECHO) Source OS.... $(OS_SOURCE) + @$(ECHO) Target OS.... $(OS_TARGET) + @$(ECHO) Full Source.. $(FULL_SOURCE) + @$(ECHO) Full Target.. $(FULL_TARGET) + @$(ECHO) + @$(ECHO) == Directory info == + @$(ECHO) + @$(ECHO) Required pkgs... $(REQUIRE_PACKAGES) + @$(ECHO) + @$(ECHO) Basedir......... $(BASEDIR) + @$(ECHO) FPCDir.......... $(FPCDIR) + @$(ECHO) CrossBinDir..... $(CROSSBINDIR) + @$(ECHO) UnitsDir........ $(UNITSDIR) + @$(ECHO) PackagesDir..... $(PACKAGESDIR) + @$(ECHO) + @$(ECHO) GCC library..... $(GCCLIBDIR) + @$(ECHO) Other library... $(OTHERLIBDIR) + @$(ECHO) + @$(ECHO) == Tools info == + @$(ECHO) + @$(ECHO) As........ $(AS) + @$(ECHO) Ld........ $(LD) + @$(ECHO) Ar........ $(AR) + @$(ECHO) Rc........ $(RC) + @$(ECHO) + @$(ECHO) Mv........ $(MVPROG) + @$(ECHO) Cp........ $(CPPROG) + @$(ECHO) Rm........ $(RMPROG) + @$(ECHO) GInstall.. $(GINSTALL) + @$(ECHO) Echo...... $(ECHO) + @$(ECHO) Shell..... $(SHELL) + @$(ECHO) Date...... $(DATE) + @$(ECHO) FPCMake... $(FPCMAKE) + @$(ECHO) PPUMove... $(PPUMOVE) + @$(ECHO) Upx....... $(UPXPROG) + @$(ECHO) Zip....... $(ZIPPROG) + @$(ECHO) + @$(ECHO) == Object info == + @$(ECHO) + @$(ECHO) Target Loaders........ $(TARGET_LOADERS) + @$(ECHO) Target Units.......... $(TARGET_UNITS) + @$(ECHO) Target Implicit Units. $(TARGET_IMPLICITUNITS) + @$(ECHO) Target Programs....... $(TARGET_PROGRAMS) + @$(ECHO) Target Dirs........... $(TARGET_DIRS) + @$(ECHO) Target Examples....... $(TARGET_EXAMPLES) + @$(ECHO) Target ExampleDirs.... $(TARGET_EXAMPLEDIRS) + @$(ECHO) + @$(ECHO) Clean Units......... $(CLEAN_UNITS) + @$(ECHO) Clean Files......... $(CLEAN_FILES) + @$(ECHO) + @$(ECHO) Install Units....... $(INSTALL_UNITS) + @$(ECHO) Install Files....... $(INSTALL_FILES) + @$(ECHO) + @$(ECHO) == Install info == + @$(ECHO) + @$(ECHO) DateStr.............. $(DATESTR) + @$(ECHO) ZipPrefix............ $(ZIPPREFIX) + @$(ECHO) ZipSuffix............ $(ZIPSUFFIX) + @$(ECHO) Install FPC Package.. $(INSTALL_FPCPACKAGE) + @$(ECHO) + @$(ECHO) Install base dir..... $(INSTALL_BASEDIR) + @$(ECHO) Install binary dir... $(INSTALL_BINDIR) + @$(ECHO) Install library dir.. $(INSTALL_LIBDIR) + @$(ECHO) Install units dir.... $(INSTALL_UNITDIR) + @$(ECHO) Install source dir... $(INSTALL_SOURCEDIR) + @$(ECHO) Install doc dir...... $(INSTALL_DOCDIR) + @$(ECHO) Install example dir.. $(INSTALL_EXAMPLEDIR) + @$(ECHO) Install data dir..... $(INSTALL_DATADIR) + @$(ECHO) + @$(ECHO) Dist destination dir. $(DIST_DESTDIR) + @$(ECHO) Dist zip name........ $(DIST_ZIPNAME) + @$(ECHO) +.PHONY: fpc_info +fpc_info: $(INFORULES) +.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \ + fpc_makefile_dirs +fpc_makefile: + $(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc +fpc_makefile_sub1: +ifdef TARGET_DIRS + $(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS)) +endif +ifdef TARGET_EXAMPLEDIRS + $(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS)) +endif +fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS)) +fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2 +fpc_makefiles: fpc_makefile fpc_makefile_dirs +all: fpc_all +debug: fpc_debug +smart: fpc_smart +release: fpc_release +examples: fpc_examples +shared: +install: fpc_install +sourceinstall: fpc_sourceinstall +exampleinstall: fpc_exampleinstall +distinstall: fpc_distinstall +zipinstall: fpc_zipinstall +zipsourceinstall: fpc_zipsourceinstall +zipexampleinstall: fpc_zipexampleinstall +zipdistinstall: fpc_zipdistinstall +clean: fpc_clean +distclean: fpc_distclean +cleanall: fpc_cleanall +info: fpc_info +makefiles: fpc_makefiles +.PHONY: all debug smart release examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles +ifneq ($(wildcard fpcmake.loc),) +include fpcmake.loc +endif diff --git a/packages/base/netdb/Makefile.fpc b/packages/base/netdb/Makefile.fpc new file mode 100644 index 0000000000..640b4b35f2 --- /dev/null +++ b/packages/base/netdb/Makefile.fpc @@ -0,0 +1,19 @@ +# +# Makefile.fpc for netdb implementation +# + +[package] +name=netdb +version=1.0.6 + +[target] +units=netdb +examples=testdns testhst testsvc testnet + +[require] + +[install] +fpcpackage=y + +[default] +fpcdir=../../.. diff --git a/packages/base/netdb/README b/packages/base/netdb/README new file mode 100644 index 0000000000..e8283d8497 --- /dev/null +++ b/packages/base/netdb/README @@ -0,0 +1,17 @@ +This directory contains a pure-pascal netdb implementation: +It is written mainly to be able to implement network applications that +do hostname lookups independent of the C library. + +This provides the equivalent of the Inet unit, but the implementation is +written completely in pascal. It parses the hosts,services and networks +files just as the C library does (it should, anyway). + +The DNS routines also do a DNS lookup and parse /etc/resolv.conf +The 'domain' and 'search' entries in this file are parsed, but ignored. +Only the 'nameserver' entries are used at the moment. + +The various test programs show how to use this. + +Enjoy! + +Michael. \ No newline at end of file diff --git a/packages/base/netdb/hs.inc b/packages/base/netdb/hs.inc new file mode 100644 index 0000000000..9a6f74d427 --- /dev/null +++ b/packages/base/netdb/hs.inc @@ -0,0 +1,109 @@ + +function HostAddrToStr (Entry : THostAddr) : String; + +Var Dummy : String[4]; + I : Longint; + +begin + HostAddrToStr:=''; + For I:=1 to 4 do + begin + Str(Entry[I],Dummy); + HostAddrToStr:=HostAddrToStr+Dummy; + If I<4 Then + HostAddrToStr:=HostAddrToStr+'.'; + end; +end; + +function StrToHostAddr(IP : String) : THostAddr ; + +Var + Dummy : String; + I : Longint; + J : Integer; + Temp : THostAddr; + +begin + Result:=NoAddress; + For I:=1 to 4 do + begin + If I<4 Then + begin + J:=Pos('.',IP); + If J=0 then + exit; + Dummy:=Copy(IP,1,J-1); + Delete (IP,1,J); + end + else + Dummy:=IP; + Val (Dummy,Temp[I],J); + If J<>0 then Exit; + end; + Result:=Temp; +end; + +function NetAddrToStr (Entry : TNetAddr) : String; + +Var Dummy : String[4]; + I : Longint; + +begin + NetAddrToStr:=''; + For I:=4 downto 1 do + begin + Str(Entry[I],Dummy); + NetAddrToStr:=NetAddrToStr+Dummy; + If I>1 Then + NetAddrToStr:=NetAddrToStr+'.'; + end; +end; + +function StrToNetAddr(IP : String) : TNetAddr; + +begin + StrToNetAddr:=TNetAddr(StrToHostAddr(IP)); +end; + +Function HostToNet (Host : ThostAddr) : THostAddr; + +begin + Result[1]:=Host[4]; + Result[2]:=Host[3]; + Result[3]:=Host[2]; + Result[4]:=Host[1]; +end; + +Function NetToHost (Net : TNetAddr) : TNetAddr; + +begin + Result[1]:=Net[4]; + Result[2]:=Net[3]; + Result[3]:=Net[2]; + Result[4]:=Net[1]; +end; + +Function HostToNet (Host : Longint) : Longint; + +begin + Result:=Longint(HostToNet(THostAddr(host))); +end; + +Function NetToHost (Net : Longint) : Longint; + +begin + Result:=Longint(NetToHost(TNetAddr(Net))); +end; + +Function ShortHostToNet (Host : Word) : Word; + +begin + ShortHostToNet:=lo(host)*256+Hi(Host); +end; + +Function ShortNetToHost (Net : Word) : Word; + +begin + ShortNetToHost:=lo(Net)*256+Hi(Net); +end; + diff --git a/packages/base/netdb/hsh.inc b/packages/base/netdb/hsh.inc new file mode 100644 index 0000000000..312489d2e3 --- /dev/null +++ b/packages/base/netdb/hsh.inc @@ -0,0 +1,21 @@ + +Type + THostAddr = array[1..4] of byte; + PHostAddr = ^THostAddr; + TNetAddr = THostAddr; + PNetAddr = ^TNetAddr; + +Const + NoAddress : THostAddr = (0,0,0,0); + NoNet : TNetAddr = (0,0,0,0); + +function HostAddrToStr (Entry : THostAddr) : String; +function StrToHostAddr(IP : String) : THostAddr ; +function NetAddrToStr (Entry : TNetAddr) : String; +function StrToNetAddr(IP : String) : TNetAddr; +Function HostToNet (Host : ThostAddr) : THostAddr; +Function NetToHost (Net : TNetAddr) : TNetAddr; +Function HostToNet (Host : Longint) : Longint; +Function NetToHost (Net : Longint) : Longint; +Function ShortHostToNet (Host : Word) : Word; +Function ShortNetToHost (Net : Word) : Word; diff --git a/packages/base/netdb/netdb.pp b/packages/base/netdb/netdb.pp new file mode 100644 index 0000000000..44e2b3b59f --- /dev/null +++ b/packages/base/netdb/netdb.pp @@ -0,0 +1,929 @@ +{$mode objfpc} +{$h+} + +unit netdb; + +Interface + +{$i hsh.inc} // disappears if part of resolve.pp !! + +Const + DNSPort = 53; + MaxServers = 4; + MaxResolveAddr = 10; + SResolveFile = '/etc/resolv.conf'; + SServicesFile = '/etc/services'; + SHostsFile = '/etc/hosts'; + SNetworksFile = '/etc/networks'; + +Type + TDNSServerArray = Array[1..MaxServers] of THostAddr; + TServiceEntry = record + Name : String; + Protocol : String; + Port : Word; + Aliases : String; + end; + + THostEntry = record + Name : String; + Addr : THostAddr; + Aliases : String; + end; + + TNetworkEntry = Record + Name : String; + Addr : TNetAddr; + Aliases : String; + end; + +Var + DNSServers : TDNSServerArray; + DNSServerCount : Integer; + DefaultDomainList : String; + CheckResolveFileAge : Boolean; + TimeOutS,TimeOutMS : Longint; + + +Function GetDNSServers(FN : String) : Integer; + +Function ResolveName(HostName : String; Var Addresses : Array of THostAddr) : Integer; +Function ResolveAddress(HostAddr : THostAddr; Var Addresses : Array of String) : Integer; + +Function ResolveHostByName(HostName : String; Var H : THostEntry) : Boolean; +Function ResolveHostByAddr(HostAddr : THostAddr; Var H : THostEntry) : Boolean; + +Function GetHostByName(HostName: String; Var H : THostEntry) : boolean; +Function GetHostByAddr(Addr: THostAddr; Var H : THostEntry) : boolean; + +Function GetNetworkByName(NetName: String; Var N : TNetworkEntry) : boolean; +Function GetNetworkByAddr(Addr: THostAddr; Var N : TNetworkEntry) : boolean; + +Function GetServiceByName(Const Name,Proto : String; Var E : TServiceEntry) : Boolean; +Function GetServiceByPort(Port : Word;Const Proto : String; Var E : TServiceEntry) : Boolean; + +Implementation + +uses + linux,sockets,sysutils; + +{$i hs.inc} + +const + DNSQRY_A = 1; // name to IP address + DNSQRY_AAAA = 28; // name to IP6 address + DNSQRY_PTR = 12; // IP address to name + DNSQRY_MX = 15; // name to MX + DNSQRY_TXT = 16; // name to TXT + + // Flags 1 + QF_QR = $80; + QF_OPCODE = $78; + QF_AA = $04; + QF_TC = $02; // Truncated. + QF_RD = $01; + + // Flags 2 + QF_RA = $80; + QF_Z = $70; + QF_RCODE = $0F; + + + +Type + TPayLoad = Array[0..511] of char; + TQueryData = packed Record + id : Array[0..1] of Byte; + flags1 : Byte; + flags2 : Byte; + qdcount : word; + ancount : word; + nscount : word; + arcount : word; + Payload : TPayLoad; + end; + + TRRData = Packed record // RR record + Atype : Word; // Answer type + AClass : Word; + TTL : Cardinal; + RDLength : Word; + end; + +Var + ResolveFileAge : Longint; + ResolveFileName : String; + +{ --------------------------------------------------------------------- + Auxiliary functions. + ---------------------------------------------------------------------} + +Function htons(var W : Word) : word; + +begin + w:=Swap(w); + Result:=W; +end; + +Function ntohs(var W : Word) : Word; + +begin + w:=Swap(w); + Result:=W; +end; + + +{ --------------------------------------------------------------------- + Resolve.conf handling + ---------------------------------------------------------------------} + +Function GetDNSServers(Fn : String) : Integer; + +Var + R : Text; + L : String; + I : Integer; + H : THostAddr; + + Function CheckDirective(Dir : String) : Boolean; + + Var + P : Integer; + + begin + P:=Pos(Dir,L); + Result:=(P<>0); + If Result then + begin + Delete(L,1,P+Length(Dir)); + Trim(L); + end; + end; + +begin + Result:=0; + ResolveFileName:=Fn; + ResolveFileAge:=FileAge(FN); + {$i-} + Assign(R,FN); + Reset(R); + {$i+} + If (IOResult<>0) then + exit; + Try + While not EOF(R) do + begin + Readln(R,L); + I:=Pos('#',L); + If (I<>0) then + L:=Copy(L,1,I-1); + If CheckDirective('nameserver') then + begin + H:=HostToNet(StrToHostAddr(L)); + If (H[1]<>0) then + begin + Inc(Result); + DNSServers[Result]:=H; + end; + end + else if CheckDirective('domain') then + DefaultDomainList:=L + else if CheckDirective('search') then + DefaultDomainList:=L; + end; + Finally + Close(R); + end; + DNSServerCount:=Result; +end; + +Procedure CheckResolveFile; + +Var + F : Integer; + +begin + If CheckResolveFileAge then + begin + F:=FileAge(ResolveFileName); + If ResolveFileAge506 then + Exit; + Result:=0; + P:=@Q.Payload; + Repeat + L:=Pos('.',Name); + If (L=0) then + S:=Length(Name) + else + S:=L-1; + P[Result]:=S; + Move(Name[1],P[Result+1],S); + Inc(Result,S+1); + If (L>0) then + Delete(Name,1,L); + Until (L=0); + P[Result]:=0; + htons(rr); + Move(rr,P[Result+1],2); + Inc(Result,3); + htons(QClass); + Move(qclass,P[Result],2); + Inc(Result,2); +end; + + + +Function NextRR(Const PayLoad : TPayLoad;Var Start : LongInt; AnsLen : LongInt; Var RR : TRRData) : Boolean; + +Var + I : Integer; + HaveName : Boolean; + PA : ^TRRData; + RClass,RType : Word; + +begin + Result:=False; + I:=Start; + // Skip labels and pointers. At least 1 label or pointer is present. + Repeat + HaveName:=True; + If (Payload[i]>#63) then // Pointer, skip + Inc(I,2) + else If Payload[i]=#0 then // Null termination of label, skip. + Inc(i) + else + begin + Inc(I,Ord(Payload[i])+1); // Label, continue scan. + HaveName:=False; + end; + Until HaveName or (I>(AnsLen-SizeOf(TRRData))); + Result:=(I<=(AnsLen-SizeOf(TRRData))); + // Check RR record. + PA:=@Payload[i]; + RR:=PA^; + Start:=I+SizeOf(TRRData); +end; + + +Function BuildName (Const PayLoad : TPayLoad; Start,len : Integer) : String; + +Const + FIREDNS_POINTER_VALUE = $C000; + +Var + I,O : Integer; + P : Word; + +begin + SetLength(Result,512); + I:=Start; + O:=1; + // Copy labels and pointers. At least 1 label or pointer is present. + Repeat + If (Payload[i]>#63) then // Pointer, move. + begin + Move(Payload[i],P,2); + I:=ntohs(p)-FIREDNS_POINTER_VALUE-12; + end + else if Payload[i]<>#0 then // Label, copy + begin + If O<>1 then + begin + Result[O]:='.'; + Inc(O); + end; + P:=Ord(Payload[i]); + Move(Payload[i+1],Result[o],P); + Inc(I,P+1); + Inc(O,P); + end; + Until (Payload[I]=#0); +end; + + +{ --------------------------------------------------------------------- + QueryData handling functions + ---------------------------------------------------------------------} + +Function CheckAnswer(Const Qry : TQueryData; Var Ans : TQueryData) : Boolean; + +begin + Result:=False; + With Ans do + begin + // Check ID. + If (ID[1]<>QRY.ID[1]) or (ID[0]<>Qry.ID[0]) then + exit; + // Flags ? + If (Flags1 and QF_QR)=0 then + exit; + if (Flags1 and QF_OPCODE)<>0 then + exit; + if (Flags2 and QF_RCODE)<>0 then + exit; + // Number of answers ? + htons(Ancount); + If Ancount<1 then + Exit; + Result:=True; + end; +end; + +Function SkipAnsQueries(Var Ans : TQueryData; L : Integer) : integer; + +Var + Q,I : Integer; + +begin + Result:=0; + With Ans do + begin + htons(qdcount); + i:=0; + q:=0; + While (Q63 then + begin + Inc(I,6); + Inc(Q); + end + else + begin + If Payload[i]=#0 then + begin + inc(q); + Inc(I,5); + end + else + Inc(I,Ord(Payload[i])+1); + end; + end; + Result:=I; + end; +end; + +{ --------------------------------------------------------------------- + DNS Query functions. + ---------------------------------------------------------------------} + + +Function Query(Resolver : Integer; Var Qry,Ans : TQueryData; QryLen : Integer; Var AnsLen : Integer) : Boolean; + +Var + BA,SA : TInetSockAddr; + Sock,L,I : Longint; + Al,RTO : Longint; + ReadFDS : FDSet; + +begin + Result:=False; + With Qry do + begin + ID[0]:=Random(256); + ID[1]:=Random(256); + Flags1:=QF_RD; + Flags2:=0; + qdcount:=1 shl 8; + ancount:=0; + nscount:=0; + arcount:=0; + end; + Sock:=Socket(PF_INET,SOCK_DGRAM,0); + If Sock=-1 then + exit; + With SA do + begin + family:=AF_INET; + port:=DNSport; + htons(port); + addr:=cardinal(HostToNet(DNSServers[Resolver])); + end; + sendto(sock,qry,qrylen+12,0,SA,SizeOf(SA)); + // Wait for answer. + RTO:=TimeOutS*1000+TimeOutMS; + FD_ZERO(ReadFDS); + FD_Set(Sock,readfds); + if Select(Sock+1,@readfds,Nil,Nil,RTO)<=0 then + begin + fdclose(Sock); + exit; + end; + AL:=SizeOf(SA); + L:=recvfrom(Sock,ans,SizeOf(Ans),0,SA,AL); + fdclose(Sock); + // Check lenght answer and fields in header data. + If (L<12) or not CheckAnswer(Qry,Ans) Then + exit; + // Return Payload length. + Anslen:=L-12; + Result:=True; +end; + +Function ResolveNameAt(Resolver : Integer; HostName : String; Var Addresses : Array of THostAddr) : Integer; + +Var + Qry, Ans : TQueryData; + MaxAnswer,I,QryLen, + AnsLen,AnsStart : Longint; + RR : TRRData; + +begin + Result:=0; + QryLen:=BuildPayLoad(Qry,HostName,DNSQRY_A,1); + If Not Query(Resolver,Qry,Ans,QryLen,AnsLen) then + Result:=-1 + else + begin + AnsStart:=SkipAnsQueries(Ans,AnsLen); + MaxAnswer:=Ans.AnCount-1; + If MaxAnswer>High(Addresses) then + MaxAnswer:=High(Addresses); + I:=0; + While (I<=MaxAnswer) and NextRR(Ans.Payload,AnsStart,AnsLen,RR) do + begin + if (Ntohs(RR.AType)=DNSQRY_A) and (1=NtoHS(RR.AClass)) then + begin + Move(Ans.PayLoad[AnsStart],Addresses[i],SizeOf(THostAddr)); + inc(Result); + Inc(AnsStart,RR.RDLength); + end; + Inc(I); + end; + end; +end; + +Function ResolveName(HostName : String; Var Addresses : Array of THostAddr) : Integer; + +Var + I : Integer; + +begin + CheckResolveFile; + I:=1; + Result:=0; + While (Result=0) and (I<=DNSServerCount) do + begin + Result:=ResolveNameAt(I,HostName,Addresses); + Inc(I); + end; +end; + +Function ResolveAddressAt(Resolver : Integer; Address : String; Var Names : Array of String) : Integer; + + +Var + Qry, Ans : TQueryData; + MaxAnswer,I,QryLen, + AnsLen,AnsStart : Longint; + RR : TRRData; + S : String; +begin + Result:=0; + QryLen:=BuildPayLoad(Qry,Address,DNSQRY_PTR,1); + If Not Query(Resolver,Qry,Ans,QryLen,AnsLen) then + Result:=-1 + else + begin + AnsStart:=SkipAnsQueries(Ans,AnsLen); + MaxAnswer:=Ans.AnCount-1; + If MaxAnswer>High(Names) then + MaxAnswer:=High(Names); + I:=0; + While (I<=MaxAnswer) and NextRR(Ans.Payload,AnsStart,AnsLen,RR) do + begin + if (Ntohs(RR.AType)=DNSQRY_PTR) and (1=NtoHS(RR.AClass)) then + begin + Names[i]:=BuildName(Ans.Payload,AnsStart,AnsLen); + inc(Result); + Inc(AnsStart,RR.RDLength); + end; + Inc(I); + end; + end; +end; + + +Function ResolveAddress(HostAddr : THostAddr; Var Addresses : Array of String) : Integer; + +Var + I : Integer; + S : String; + +begin + CheckResolveFile; + I:=1; + Result:=0; + S:=Format('%d.%d.%d.%d.in-addr.arpa',[HostAddr[4],HostAddr[3],HostAddr[2],HostAddr[1]]); + While (Result=0) and (I<=DNSServerCount) do + begin + Result:=ResolveAddressAt(I,S,Addresses); + Inc(I); + end; +end; + +Function ResolveHostByName(HostName : String; Var H : THostEntry) : Boolean; + +Var + Address : Array[1..MaxResolveAddr] of THostAddr; + L : Integer; + +begin + L:=ResolveName(HostName,Address); + Result:=(L>0); + If Result then + begin + // We could add a reverse call here to get the real name and aliases. + H.Name:=HostName; + H.Addr:=Address[1]; + H.aliases:=''; + end; +end; + +Function ResolveHostByAddr(HostAddr : THostAddr; Var H : THostEntry) : Boolean; + +Var + Names : Array[1..MaxResolveAddr] of String; + I,L : Integer; + +begin + L:=ResolveAddress(HostAddr,Names); + Result:=(L>0); + If Result then + begin + H.Name:=Names[1]; + H.Addr:=HostAddr; + H.Aliases:=''; + If (L>1) then + For I:=2 to L do + If (I=2) then + H.Aliases:=Names[i] + else + H.Aliases:=H.Aliases+','+Names[i]; + end; +end; + +{ --------------------------------------------------------------------- + Some Parsing routines + ---------------------------------------------------------------------} + +Const + Whitespace = [' ',#9]; + +Function NextWord(Var Line : String) : String; + +Var + I,J : Integer; + +begin + I:=1; + While (I<=Length(Line)) and (Line[i] in Whitespace) do + inc(I); + J:=I; + While (J<=Length(Line)) and Not (Line[J] in WhiteSpace) do + inc(j); + Result:=Copy(Line,I,J-1); + Delete(Line,1,J); +end; + +Procedure StripComment(Var line : String); + +Var + P : Integer; + +begin + P:=Pos('#',Line); + If (P<>0) then + Line:=Trim(Copy(Line,1,P-1)); +end; + +Function MatchNameOrAlias(Const Entry,Name: String; Aliases : String) : Boolean; + +Var + P : Integer; + A : String; + +begin + Result:=CompareText(Entry,Name)=0; + If Not Result then + While (Not Result) and (Length(Aliases)>0) do + begin + P:=Pos(',',Aliases); + If (P=0) then + P:=Length(Aliases)+1; + A:=Copy(Aliases,1,P-1); + Delete(Aliases,1,P); + Result:=CompareText(A,Entry)=0; + end; +end; + +{ --------------------------------------------------------------------- + /etc/hosts handling. + ---------------------------------------------------------------------} + +Function GetNextHostEntry(var F : Text; Var H : THostEntry): boolean; + +Var + Line,S : String; + P : Integer; + +begin + Result:=False; + Repeat + ReadLn(F,Line); + StripComment(Line); + S:=NextWord(Line); + If (S<>'') then + begin + H.Addr:=StrToHostAddr(S); + if (H.Addr[1]<>0) then + begin + S:=NextWord(Line); + If (S<>'') then + begin + H.Name:=S; + Result:=True; + H.Aliases:=''; + Repeat + S:=NextWord(line); + If (S<>'') then + If (H.Aliases='') then + H.Aliases:=S + else + H.Aliases:=H.Aliases+','+S; + until (S=''); + end; + end; + end; + until Result or EOF(F); +end; + +Function FindHostEntryInHostsFile(N: String; Addr: THostAddr; Var H : THostEntry) : boolean; + +Var + F : Text; + HE : THostEntry; + +begin + Result:=False; + If FileExists(SHostsFile) then + begin + Assign(F,SHostsFile); + {$i-} + Reset(F); + {$i+} + If (IOResult=0) then + begin + While Not Result and GetNextHostEntry(F,HE) do + begin + If (N<>'') then + Result:=MatchNameOrAlias(N,HE.Name,HE.Aliases) + else + Result:=Cardinal(Addr)=Cardinal(HE.Addr); + end; + Close(f); + If Result then + begin + H.Name:=HE.Name; + H.Addr:=HE.Addr; + H.Aliases:=HE.Aliases; + end; + end; + end; +end; + +Function GetHostByName(HostName: String; Var H : THostEntry) : boolean; + +begin + Result:=FindHostEntryInHostsFile(HostName,NoAddress,H); +end; + + +Function GetHostByAddr(Addr: THostAddr; Var H : THostEntry) : boolean; + +begin + Result:=FindHostEntryInHostsFile('',Addr,H); +end; + +{ --------------------------------------------------------------------- + /etc/networks handling + ---------------------------------------------------------------------} + +Function GetNextNetworkEntry(var F : Text; Var N : TNetworkEntry): boolean; + +Var + NN,Line,S : String; + P : Integer; + A : TNetAddr; + +begin + Result:=False; + Repeat + ReadLn(F,Line); + StripComment(Line); + S:=NextWord(Line); + If (S<>'') then + begin + NN:=S; + A:=StrToHostAddr(NextWord(Line)); + Result:=(NN<>'') and (A[1]<>0); // Valid addr. + If result then + begin + N.Addr:=A; + N.Name:=NN; + N.Aliases:=''; + end; + end; + until Result or EOF(F); +end; + +Function FindNetworkEntryInNetworksFile(Net: String; Addr: TNetAddr; Var N : TNetworkEntry) : boolean; + +Var + F : Text; + NE : TNetworkEntry; + +begin + Result:=False; + If FileExists(SNetworksFile) then + begin + Assign(F,SNetworksFile); + {$i-} + Reset(F); + {$i+} + If (IOResult=0) then + begin + While Not Result and GetNextNetworkEntry(F,NE) do + begin + If (Net<>'') then + Result:=MatchNameOrAlias(Net,NE.Name,NE.Aliases) + else + Result:=Cardinal(Addr)=Cardinal(NE.Addr); + end; + Close(f); + If Result then + begin + N.Name:=NE.Name; + N.Addr:=NE.Addr; + N.Aliases:=NE.Aliases; + end; + end; + end; +end; + +Function GetNetworkByName(NetName: String; Var N : TNetworkEntry) : boolean; + +begin + Result:=FindNetworkEntryInNetworksFile(NetName,NoNet,N); +end; + +Function GetNetworkByAddr(Addr: THostAddr; Var N : TNetworkEntry) : boolean; + +begin + Result:=FindNetworkEntryInNetworksFile('',Addr,N); +end; + +{ --------------------------------------------------------------------- + /etc/services section + ---------------------------------------------------------------------} + +Function GetNextServiceEntry(Var F : Text; Var E : TServiceEntry) : Boolean; + + +Var + Line,S : String; + P : INteger; + +begin + Result:=False; + Repeat + ReadLn(F,Line); + StripComment(Line); + S:=NextWord(Line); + If (S<>'') then + begin + E.Name:=S; + S:=NextWord(Line); + P:=Pos('/',S); + If (P<>0) then + begin + E.Port:=StrToIntDef(Copy(S,1,P-1),0); + If (E.Port<>0) then + begin + E.Protocol:=Copy(S,P+1,Length(S)-P); + Result:=length(E.Protocol)>0; + E.Aliases:=''; + Repeat + S:=NextWord(Line); + If (S<>'') then + If (Length(E.Aliases)=0) then + E.aliases:=S + else + E.Aliases:=E.Aliases+','+S; + until (S=''); + end; + end; + end; + until Result or EOF(F); +end; + + +Function FindServiceEntryInFile(Const Name,Proto : String; Port : Integer; Var E : TServiceEntry) : Boolean; + +Var + F : Text; + TE : TServiceEntry; + +begin + Result:=False; + If FileExists(SServicesFile) then + begin + Assign(F,SServicesFile); + {$i-} + Reset(F); + {$i+} + If (IOResult=0) then + begin + While Not Result and GetNextServiceEntry(F,TE) do + begin + If (Port=-1) then + Result:=MatchNameOrAlias(Name,TE.Name,TE.Aliases) + else + Result:=(Port=TE.Port); + If Result and (Proto<>'') then + Result:=(Proto=TE.Protocol); + end; + Close(f); + If Result then + begin + E.Name:=TE.Name; + E.Port:=TE.Port; + E.Protocol:=TE.Protocol; + E.Aliases:=TE.Aliases; + end; + end; + end; +end; + +Function GetServiceByName(Const Name,Proto : String; Var E : TServiceEntry) : Boolean; + +begin + Result:=FindServiceEntryInFile(Name,Proto,-1,E); +end; + +Function GetServiceByPort(Port : Word;Const Proto : String; Var E : TServiceEntry) : Boolean; + +begin + Result:=FindServiceEntryInFile('',Proto,Port,E); +end; + +{ --------------------------------------------------------------------- + Initialization section + ---------------------------------------------------------------------} + +Procedure InitResolver; + +Var + I : Integer; + +begin + TimeOutS :=5; + TimeOutMS:=0; + CheckResolveFileAge:=False; + If FileExists(SResolveFile) then + GetDNsservers(SResolveFile); +end; + +begin + InitResolver; +end. diff --git a/packages/base/netdb/testdns.pp b/packages/base/netdb/testdns.pp new file mode 100644 index 0000000000..19e1bf5de5 --- /dev/null +++ b/packages/base/netdb/testdns.pp @@ -0,0 +1,68 @@ +{$mode objfpc} +{$h+} + +program testdns; + +uses netdb; + +Procedure DumpHostEntry(Const H : THostEntry); + +begin + With H do + begin + Writeln('Name : ',Name); + Writeln('Addr : ',HostAddrToStr(Addr)); + Writeln('Aliases : ',Aliases); + Writeln; + end; +end; + +Procedure TestAddr(Addr : string); + +Var + H : THostEntry; + +begin + If ResolveHostByAddr(StrToHostAddr(Addr),H) then + DumpHostEntry(H) + else + Writeln('No entry for address ',Addr) +end; + +Procedure TestName(Const N : string); + +Var + H : THostEntry; + +begin + If ResolveHostByName(N,H) then + DumpHostEntry(H) + else + Writeln('No entry for hostname ',N) +end; + +Var + I,l : INteger; + Ans : Array [1..10] of THostAddr; + H : THostAddr; + NAns : Array[1..10] of String; + + + +begin + Writeln('Resolving name '); + l:=ResolveName('malpertuus.wisa.be',Ans); + Writeln('Got : ',l,' answers'); + For I:=1 to l do + Writeln(i:2,': ',hostAddrtostr(Ans[i])); + Writeln('Resolving address '); + H:=StrtoHostAddr('212.224.143.202'); + L:=ResolveAddress(H,NAns); + Writeln('Got : ',l,' answers'); + For I:=1 to l do + Writeln(i:2,': ',NAns[i]); + Writeln('ResolveHostByName:'); + testname('malpertuus.wisa.be'); + Writeln('ResolveHostByAddr:'); + testaddr('212.224.143.202'); +end. \ No newline at end of file diff --git a/packages/base/netdb/testhst.pp b/packages/base/netdb/testhst.pp new file mode 100644 index 0000000000..001f836d27 --- /dev/null +++ b/packages/base/netdb/testhst.pp @@ -0,0 +1,47 @@ +program testhst; + +uses netdb; + +Procedure DumpHostEntry(Const H : THostEntry); + +begin + With H do + begin + Writeln('Name : ',Name); + Writeln('Addr : ',HostAddrToStr(Addr)); + Writeln('Aliases : ',Aliases); + Writeln; + end; +end; + +Procedure TestAddr(Addr : string); + +Var + H : THostEntry; + +begin + If GetHostByAddr(StrToHostAddr(Addr),H) then + DumpHostEntry(H) + else + Writeln('No entry for address ',Addr) +end; + +Procedure TestName(Const N : string); + +Var + H : THostEntry; + +begin + If GetHostByName(N,H) then + DumpHostEntry(H) + else + Writeln('No entry for hostname ',N) +end; + +begin + testaddr('127.0.0.1'); + testaddr('212.224.143.213'); + testname('LOCALHOST'); + testname('www.freepascal.org'); + testname('obelix.wisa.be'); +end. diff --git a/packages/base/netdb/testnet.pp b/packages/base/netdb/testnet.pp new file mode 100644 index 0000000000..028ac23ca0 --- /dev/null +++ b/packages/base/netdb/testnet.pp @@ -0,0 +1,44 @@ +program testhst; + +uses netdb; + +Procedure DumpNetEntry(Const N : TNetworkEntry); + +begin + With N do + begin + Writeln('Name : ',Name); + Writeln('Addr : ',HostAddrToStr(Addr)); + Writeln('Aliases : ',Aliases); + Writeln; + end; +end; + +Procedure TestAddr(Addr : string); + +Var + N : TNetworkEntry; + +begin + If GetNetworkByAddr(StrToHostAddr(Addr),N) then + DumpNetEntry(N) + else + Writeln('No entry for address ',Addr) +end; + +Procedure TestName(Const Net : string); + +Var + N : TNetworkEntry; + +begin + If GetNetworkByName(Net,N) then + DumpNetEntry(N) + else + Writeln('No entry for netname ',Net) +end; + +begin + testaddr('127.0.0.0'); + testname('loopback'); +end. diff --git a/packages/base/netdb/testsvc.pp b/packages/base/netdb/testsvc.pp new file mode 100644 index 0000000000..42bf7da975 --- /dev/null +++ b/packages/base/netdb/testsvc.pp @@ -0,0 +1,49 @@ +program testsvc; + +uses netdb; + +Procedure DumpServiceEntry(Const E : TserviceEntry); + +begin + With E do + begin + Writeln('Name : ',Name); + Writeln('Protocol : ',Protocol); + Writeln('Port : ',Port); + Writeln('Aliases : ',Aliases); + Writeln; + end; +end; + +Procedure TestPort(P : Word; Const Proto : string); + +Var + E : TServiceEntry; + +begin + If GetServiceByPort(P,Proto,E) then + DumpServiceEntry(E) + else + Writeln('No entry for port ',P) +end; + +Procedure TestName(Const N,Proto : string); + +Var + E : TServiceEntry; + +begin + If GetServiceByName(N,Proto,E) then + DumpServiceEntry(E) + else + Writeln('No entry for service ',N) +end; + +begin + testport(25,''); + testport(23,''); + testport(53,'udp'); + testname('mail',''); + testname('ftp',''); + testname('domain','udp'); +end.