implementation of shib-sock.c for win32
authorwohl <wohl@cb58f699-b61c-0410-a6fe-9272a202ed29>
Thu, 26 Jun 2003 10:24:11 +0000 (10:24 +0000)
committerwohl <wohl@cb58f699-b61c-0410-a6fe-9272a202ed29>
Thu, 26 Jun 2003 10:24:11 +0000 (10:24 +0000)
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
shib-target/shib-sock.c

index 601e83d..c23bdd4 100644 (file)
@@ -32,6 +32,17 @@ public:
   vector<SAMLAttribute*> 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";
index 5715037..8d97605 100644 (file)
 
 #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 */