From 861bbbcc9242e8ba5fa59fb583f89b8b9e2f04fe Mon Sep 17 00:00:00 2001 From: wohl Date: Thu, 26 Jun 2003 10:24:11 +0000 Subject: [PATCH] implementation of shib-sock.c for win32 create a strtok_r implementatation for systems where there is no strtok_r and the system strtok is already thread safe. git-svn-id: https://svn.middleware.georgetown.edu/cpp-sp/trunk@547 cb58f699-b61c-0410-a6fe-9272a202ed29 --- shib-target/shib-resource.cpp | 11 ++++++++++ shib-target/shib-sock.c | 50 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/shib-target/shib-resource.cpp b/shib-target/shib-resource.cpp index 601e83d..c23bdd4 100644 --- a/shib-target/shib-resource.cpp +++ b/shib-target/shib-resource.cpp @@ -32,6 +32,17 @@ public: vector designators; }; +#ifdef USE_STRTOK +// for systems that dont have strtok_r (reenttrant version) where +// the system strtok is already threadsafe +#define strtok_r local_strtok_r_mumble +static char *strtok_r(char *parse_me,const char *break_on,void *foo) +{ + return strtok(parse_me,break_on); +} + +#endif + ResourcePriv::ResourcePriv(const char *str) { string ctx = "shibtarget.Resource"; diff --git a/shib-target/shib-sock.c b/shib-target/shib-sock.c index 5715037..8d97605 100644 --- a/shib-target/shib-sock.c +++ b/shib-target/shib-sock.c @@ -24,30 +24,78 @@ #ifdef WIN32 -#error "Need to define functions for Win32" +typedef struct sockaddr_in SHIBADDR; + +// called when there was definitly an error +// return the winsock errno to use as a unix errno +// but make sure it is >=1 so failures stay failures +static int get_winsock_errno(void) +{ + int rc=WSAGetLastError(); + if(rc<=0) + rc=1; + return rc; +} + +// map a winsock call result to: +// 0-success +// else a unix errno +static int map_winsock_result(int rc) +{ + if(rc!=SOCKET_ERROR) + return 0; + return get_winsock_errno(); +} int shib_sock_create (ShibSocket *sock) { + int rc=socket(AF_INET,SOCK_STREAM,0); + if(rc==SOCKET_ERROR) + return get_winsock_errno(); + return rc; +} + +static void setup_sockaddr(SHIBADDR *addr, short aport) +{ + const char *LOOPBACK_IP="127.0.0.1"; + memset(addr,0,sizeof(SHIBADDR)); + addr->sin_family=AF_INET; + addr->sin_port=htons(aport); + addr->sin_addr.s_addr=inet_addr(LOOPBACK_IP); } int shib_sock_bind (ShibSocket s, ShibSockName name) { + SHIBADDR addr; + setup_sockaddr(&addr,name); + return map_winsock_result(bind(s,(struct sockaddr *)&addr,sizeof(addr))); } int shib_sock_connect (ShibSocket s, ShibSockName name) { + SHIBADDR addr; + setup_sockaddr(&addr,name); + return map_winsock_result(connect(s,(struct sockaddr *)&addr,sizeof(addr))); } void shib_sock_close (ShibSocket s, ShibSockName name) { + int rc=map_winsock_result(closesocket(s)); } int shib_sock_accept (ShibSocket listener, ShibSocket* s) { + int rc; + if (!s) return EINVAL; + rc=accept(listener,NULL,NULL); + if(rc==INVALID_SOCKET) + return get_winsock_errno(); + *s=rc; + return 0; } /* XXX */ -- 2.1.4