Added hostname lookup for server.
[yaz-moved-to-github.git] / comstack / xmosi.c
index 9e15a28..3f6a9c2 100644 (file)
@@ -4,7 +4,25 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: xmosi.c,v $
- * Revision 1.1  1995-06-14 09:58:20  quinn
+ * Revision 1.7  1995-10-30 12:41:17  quinn
+ * Added hostname lookup for server.
+ *
+ * Revision 1.6  1995/09/29  17:12:00  quinn
+ * Smallish
+ *
+ * Revision 1.5  1995/09/28  10:24:32  quinn
+ * Windows changes
+ *
+ * Revision 1.4  1995/09/27  15:02:45  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.3  1995/06/16  10:30:38  quinn
+ * Added REUSEADDR.
+ *
+ * Revision 1.2  1995/06/15  12:30:07  quinn
+ * Added @ as hostname alias for INADDR ANY.
+ *
+ * Revision 1.1  1995/06/14  09:58:20  quinn
  * Renamed yazlib to comstack.
  *
  * Revision 1.15  1995/05/29  08:12:33  quinn
@@ -88,6 +106,7 @@ int mosi_rcvconnect(COMSTACK h);
 int mosi_bind(COMSTACK h, void *address, int mode);
 int mosi_listen(COMSTACK h, char *addrp, int *addrlen);
 COMSTACK mosi_accept(COMSTACK h);
+char *mosi_addrstr(COMSTACK h);
 
 typedef struct mosi_state
 {
@@ -156,6 +175,7 @@ COMSTACK mosi_type(int blocking, int protocol)
     r->f_bind = mosi_bind;
     r->f_listen = mosi_listen;
     r->f_accept = mosi_accept;
+    r->f_addrstr = mosi_addrstr;
 
     if (!blocking)
        flags |= O_NONBLOCK;
@@ -187,7 +207,7 @@ int hex2oct(char *hex, char *oct)
  * addressing specific to our hack of OSI transport. A sockaddr_in wrapped
  * up in a t_mosiaddr in a netbuf (on a stick).
  */
-struct netbuf *mosi_strtoaddr(const char *str)
+struct netbuf MDF *mosi_strtoaddr(const char *str)
 {
     struct netbuf *ret = malloc(sizeof(struct netbuf));
     struct sockaddr_in *add = malloc(sizeof(struct sockaddr_in));
@@ -236,7 +256,9 @@ struct netbuf *mosi_strtoaddr(const char *str)
            port = atoi(b + 1);
        }
        add->sin_port = htons(port);
-       if ((hp = gethostbyname(buf)))
+       if (!strcmp("@", buf))
+           add->sin_addr.s_addr = INADDR_ANY;
+       else if ((hp = gethostbyname(buf)))
            memcpy(&add->sin_addr.s_addr, *hp->h_addr_list, sizeof(struct in_addr));
        else if ((tmpadd = inet_addr(buf)) != 0)
            memcpy(&add->sin_addr.s_addr, &tmpadd, sizeof(struct in_addr));
@@ -318,7 +340,13 @@ int mosi_bind(COMSTACK h, void *address, int mode)
 {
     int res;
     struct t_bind bnd;
+    int one = 1;
 
+    if (setsockopt(h->iofile, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) < 0)
+    {
+       h->cerrno = CSYSERR;
+       return -1;
+    }
     if (mode == CS_SERVER)
        bnd.qlen = 3;
     else
@@ -357,7 +385,7 @@ COMSTACK mosi_accept(COMSTACK h)
 
     if (h->state != CS_INCON)
     {
-       h->errno = CSOUTSTATE;
+       h->cerrno = CSOUTSTATE;
        return 0;
     }
     if (!(new = malloc(sizeof(*new))))
@@ -447,3 +475,8 @@ int mosi_close(COMSTACK h)
     free(h);
     return 0;
 }    
+
+char *mosi_addrstr(COMSTACK h)
+{
+    return "osi:[UNIMPLEMENTED";
+}