Changed include/yaz/diagbib1.h and added include/yaz/diagsrw.h with
[yaz-moved-to-github.git] / src / unix.c
index bd6ce7c..3449001 100644 (file)
@@ -1,31 +1,46 @@
 /*
- * Copyright (c) 1995-2004, Index Data
+ * Copyright (C) 1995-2005, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: unix.c,v 1.4 2004-04-29 21:19:23 adam Exp $
+ * $Id: unix.c,v 1.14 2005-02-09 09:18:27 adam Exp $
  * UNIX socket COMSTACK. By Morten Bøgeskov.
  */
+/**
+ * \file unix.c
+ * \brief Implements UNIX domain socket COMSTACK
+ */
+
 #ifndef WIN32
 
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
-#include <unistd.h>
 #include <errno.h>
+#if HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#if HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
 #include <fcntl.h>
 #include <signal.h>
 
 #include <grp.h>
+#if HAVE_PWD_H
 #include <pwd.h>
-#include <sys/types.h>
+#endif
 
-#include <sys/socket.h>
+#if HAVE_SYS_STAT_H
 #include <sys/stat.h>
+#endif
+#if HAVE_SYS_UN_H
 #include <sys/un.h>
+#endif
 
-#include <yaz/comstack.h>
 #include <yaz/unix.h>
-#include <yaz/log.h>
 #include <yaz/nmem.h>
 
 #ifndef YAZ_SOCKLEN_T
@@ -137,6 +152,7 @@ COMSTACK unix_type(int s, int blocking, int protocol, void *vp)
     p->event = CS_NONE;
     p->cerrno = 0;
     p->stackerr = 0;
+    p->user = 0;
 
     state->altbuf = 0;
     state->altsize = state->altlen = 0;
@@ -297,6 +313,7 @@ static int unix_connect(COMSTACK h, void *address)
 {
     struct sockaddr_un *add = (struct sockaddr_un *)address;
     int r;
+    int i;
 
     TRC(fprintf(stderr, "unix_connect\n"));
     h->io_pending = 0;
@@ -305,14 +322,28 @@ static int unix_connect(COMSTACK h, void *address)
        h->cerrno = CSOUTSTATE;
        return -1;
     }
-    r = connect(h->iofile, (struct sockaddr *) add, SUN_LEN(add));
+    for (i = 0; i<3; i++)
+    {
+       r = connect(h->iofile, (struct sockaddr *) add, SUN_LEN(add));
+       if (r < 0 && yaz_errno() == EAGAIN)
+       {
+#if HAVE_USLEEP
+           usleep(i*10000+1000); /* 1ms, 11ms, 21ms */
+#else
+           sleep(1);
+#endif
+           continue;
+       }
+       else
+           break;
+    }
     if (r < 0)
     {
        if (yaz_errno() == EINPROGRESS)
        {
            h->event = CS_CONNECT;
            h->state = CS_ST_CONNECTING;
-           h->io_pending = CS_WANT_WRITE|CS_WANT_READ;
+           h->io_pending = CS_WANT_WRITE;
            return 1;
        }
        h->cerrno = CSYSERR;
@@ -389,7 +420,7 @@ static int unix_bind(COMSTACK h, void *address, int mode)
     }
     chown(path, sp->uid, sp->gid);
     chmod(path, sp->umask != -1 ? sp->umask : 0666);
-    if (mode == CS_SERVER && listen(h->iofile, 3) < 0)
+    if (mode == CS_SERVER && listen(h->iofile, 100) < 0)
     {
        h->cerrno = CSYSERR;
        return -1;
@@ -565,7 +596,7 @@ static int unix_get(COMSTACK h, char **buf, int *bufsize)
                return -1;
        }
        else if (!res)
-           return 0;
+           return hasread;
        hasread += res;
     }
     TRC (fprintf (stderr, "  Out of read loop with hasread=%d, berlen=%d\n",
@@ -695,4 +726,4 @@ static int unix_set_blocking(COMSTACK p, int blocking)
     p->blocking = blocking;
     return 1;
 }
-#endif
+#endif /* WIN32 */