From 648991d79325058df17937713a7c686d1653aed4 Mon Sep 17 00:00:00 2001 From: Abdulaziz Ghuloum Date: Wed, 26 Dec 2007 22:28:48 -0500 Subject: [PATCH] cygwin does not have getaddrinfo so I added a compatibility implementation in src/ikarus-getaddrinfo.[ch] --- benchmarks/Makefile.in | 4 +-- config.h.in | 3 ++ configure | 3 +- configure.ac | 2 +- doc/Makefile.in | 4 +-- lib/Makefile.in | 4 +-- scheme/Makefile.am | 2 +- scheme/Makefile.in | 6 ++-- src/Makefile.am | 2 +- src/Makefile.in | 9 +++--- src/ikarus-data.h | 1 + src/ikarus-getaddrinfo.c | 69 ++++++++++++++++++++++++++++++++++++++++ src/ikarus-getaddrinfo.h | 44 +++++++++++++++++++++++++ 13 files changed, 136 insertions(+), 17 deletions(-) create mode 100644 src/ikarus-getaddrinfo.c create mode 100644 src/ikarus-getaddrinfo.h diff --git a/benchmarks/Makefile.in b/benchmarks/Makefile.in index 22a379b..d24ea03 100644 --- a/benchmarks/Makefile.in +++ b/benchmarks/Makefile.in @@ -223,9 +223,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu benchmarks/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign benchmarks/Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu benchmarks/Makefile + $(AUTOMAKE) --foreign benchmarks/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ diff --git a/config.h.in b/config.h.in index d6e98b6..891ecae 100644 --- a/config.h.in +++ b/config.h.in @@ -18,6 +18,9 @@ /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK +/* Define to 1 if you have the `getaddrinfo' function. */ +#undef HAVE_GETADDRINFO + /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE diff --git a/configure b/configure index c6fff42..a2fe251 100755 --- a/configure +++ b/configure @@ -8787,7 +8787,8 @@ fi -for ac_func in bzero gettimeofday memmove memset munmap setenv sqrt strerror + +for ac_func in bzero gettimeofday memmove memset munmap setenv sqrt strerror getaddrinfo do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 diff --git a/configure.ac b/configure.ac index 3b32e82..a64849f 100644 --- a/configure.ac +++ b/configure.ac @@ -92,7 +92,7 @@ AC_FUNC_MMAP AC_FUNC_STAT AC_FUNC_STRFTIME AC_FUNC_STRTOD -AC_CHECK_FUNCS([bzero gettimeofday memmove memset munmap setenv sqrt strerror]) +AC_CHECK_FUNCS([bzero gettimeofday memmove memset munmap setenv sqrt strerror getaddrinfo]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES(Makefile src/Makefile scheme/Makefile doc/Makefile lib/Makefile benchmarks/Makefile) AC_OUTPUT #(Makefile src/Makefile scheme/Makefile doc/Makefile) diff --git a/doc/Makefile.in b/doc/Makefile.in index 30c9268..b43b5f4 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -170,9 +170,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu doc/Makefile + $(AUTOMAKE) --foreign doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ diff --git a/lib/Makefile.in b/lib/Makefile.in index 484f03e..4798dc0 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -172,9 +172,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu lib/Makefile + $(AUTOMAKE) --foreign lib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ diff --git a/scheme/Makefile.am b/scheme/Makefile.am index 6bc1285..d66c90a 100644 --- a/scheme/Makefile.am +++ b/scheme/Makefile.am @@ -23,7 +23,7 @@ EXTRA_DIST=ikarus.boot.prebuilt ikarus.enumerations.ss \ psyntax.internal.ss psyntax.library-manager.ss \ ikarus/code-objects.ss ikarus/compiler.ss ikarus/intel-assembler.ss \ ikarus/fasl/write.ss unicode/unicode-char-cases.ss \ - unicode/unicode-charinfo.ss ikarus.io.ss + unicode/unicode-charinfo.ss ikarus.io.ss ikarus.time-and-date.ss all: $(nodist_pkglib_DATA) diff --git a/scheme/Makefile.in b/scheme/Makefile.in index 6285adf..73286a3 100644 --- a/scheme/Makefile.in +++ b/scheme/Makefile.in @@ -177,7 +177,7 @@ EXTRA_DIST = ikarus.boot.prebuilt ikarus.enumerations.ss \ psyntax.internal.ss psyntax.library-manager.ss \ ikarus/code-objects.ss ikarus/compiler.ss ikarus/intel-assembler.ss \ ikarus/fasl/write.ss unicode/unicode-char-cases.ss \ - unicode/unicode-charinfo.ss ikarus.io.ss + unicode/unicode-charinfo.ss ikarus.io.ss ikarus.time-and-date.ss revno = "$(shell sed 's/ .*//' ../.bzr/branch/last-revision 2>/dev/null)" CLEANFILES = $(nodist_pkglib_DATA) ikarus.config.ss @@ -194,9 +194,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu scheme/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign scheme/Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu scheme/Makefile + $(AUTOMAKE) --foreign scheme/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ diff --git a/src/Makefile.am b/src/Makefile.am index 7469df9..38facdb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,7 +6,7 @@ ikarus_SOURCES = ikarus-collect.c ikarus-exec.c ikarus-fasl.c \ ikarus-runtime.c ikarus-symbol-table.c ikarus-verify-integrity.c \ ikarus-weak-pairs.c ikarus-winmmap.c ikarus-data.h \ ikarus-winmmap.h ikarus-enter.s cpu_has_sse2.s ikarus-io.c \ - ikarus-process.c + ikarus-process.c ikarus-getaddrinfo.h ikarus-getaddrinfo.c scheme_script_SOURCES = scheme-script.c diff --git a/src/Makefile.in b/src/Makefile.in index a387420..d7ff943 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -54,7 +54,7 @@ am_ikarus_OBJECTS = ikarus-collect.$(OBJEXT) ikarus-exec.$(OBJEXT) \ ikarus-verify-integrity.$(OBJEXT) ikarus-weak-pairs.$(OBJEXT) \ ikarus-winmmap.$(OBJEXT) ikarus-enter.$(OBJEXT) \ cpu_has_sse2.$(OBJEXT) ikarus-io.$(OBJEXT) \ - ikarus-process.$(OBJEXT) + ikarus-process.$(OBJEXT) ikarus-getaddrinfo.$(OBJEXT) nodist_ikarus_OBJECTS = ikarus_OBJECTS = $(am_ikarus_OBJECTS) $(nodist_ikarus_OBJECTS) ikarus_LDADD = $(LDADD) @@ -180,7 +180,7 @@ ikarus_SOURCES = ikarus-collect.c ikarus-exec.c ikarus-fasl.c \ ikarus-runtime.c ikarus-symbol-table.c ikarus-verify-integrity.c \ ikarus-weak-pairs.c ikarus-winmmap.c ikarus-data.h \ ikarus-winmmap.h ikarus-enter.s cpu_has_sse2.s ikarus-io.c \ - ikarus-process.c + ikarus-process.c ikarus-getaddrinfo.h ikarus-getaddrinfo.c scheme_script_SOURCES = scheme-script.c nodist_ikarus_SOURCES = bootfileloc.h @@ -200,9 +200,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/Makefile + $(AUTOMAKE) --foreign src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -260,6 +260,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ikarus-exec.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ikarus-fasl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ikarus-flonums.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ikarus-getaddrinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ikarus-io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ikarus-main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ikarus-numerics.Po@am__quote@ diff --git a/src/ikarus-data.h b/src/ikarus-data.h index ab75e1c..e648d3b 100644 --- a/src/ikarus-data.h +++ b/src/ikarus-data.h @@ -19,6 +19,7 @@ #ifndef IKARUS_H #define IKARUS_H +#include "ikarus-getaddrinfo.h" #include #include diff --git a/src/ikarus-getaddrinfo.c b/src/ikarus-getaddrinfo.c new file mode 100644 index 0000000..99ec4bd --- /dev/null +++ b/src/ikarus-getaddrinfo.c @@ -0,0 +1,69 @@ +/* + * Ikarus Scheme -- A compiler for R6RS Scheme. + * Copyright (C) 2006,2007 Abdulaziz Ghuloum + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + + + +#include "config.h" +#if (!HAVE_GETADDRINFO) +#include "ikarus-getaddrinfo.h" + +#include +#include +#include +#include +#include + +int +getaddrinfo(const char *hostname, const char* servname, + const struct addrinfo* hints, struct addrinfo** res){ + /* hints not used */ + struct servent* sent = getservbyname(servname, "tcp"); + if(sent == 0) return -1; + struct hostent* hent = gethostbyname(hostname); + if (!hent){ + return -1; + } + struct addrinfo* r = malloc(sizeof(struct addrinfo)); + if(r == 0) return -1; + r->ai_family = hent->h_addrtype; + r->ai_socktype = SOCK_STREAM; + r->ai_protocol = 0; + r->ai_addrlen = sizeof(struct sockaddr_in); + r->ai_addr = malloc(r->ai_addrlen); + if (r->ai_addr == 0){ + free(r); + return -1; + } + struct sockaddr_in* sa_in = (struct sockaddr_in *)r->ai_addr; + memset(sa_in, 0, sizeof(struct sockaddr_in)); + sa_in->sin_family = PF_INET; + sa_in->sin_port = sent->s_port; + struct in_addr** ap = (struct in_addr **)hent->h_addr_list; + memcpy(&sa_in->sin_addr, *ap, sizeof(struct in_addr)); + r->ai_next = NULL; + *res = r; + return (0); +} + +void +freeaddrinfo(struct addrinfo *ai){ + free(ai->ai_addr); + free(ai); +} + +#endif diff --git a/src/ikarus-getaddrinfo.h b/src/ikarus-getaddrinfo.h new file mode 100644 index 0000000..1c96d48 --- /dev/null +++ b/src/ikarus-getaddrinfo.h @@ -0,0 +1,44 @@ +/* + * Ikarus Scheme -- A compiler for R6RS Scheme. + * Copyright (C) 2006,2007 Abdulaziz Ghuloum + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + + + +#include "config.h" +#if (!HAVE_GETADDRINFO) +#include +#include +#include + +struct addrinfo { + int ai_family; + int ai_socktype; + int ai_protocol; + size_t ai_addrlen; + struct sockaddr *ai_addr; + struct addrinfo *ai_next; +}; + +extern int +getaddrinfo(const char *hostname, const char* servname, + const struct addrinfo* hints, struct addrinfo** res); + +extern void +freeaddrinfo(struct addrinfo *ai); + +#endif +