/*
- * 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
p->event = CS_NONE;
p->cerrno = 0;
p->stackerr = 0;
+ p->user = 0;
state->altbuf = 0;
state->altsize = state->altlen = 0;
{
struct sockaddr_un *add = (struct sockaddr_un *)address;
int r;
+ int i;
TRC(fprintf(stderr, "unix_connect\n"));
h->io_pending = 0;
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;
}
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;
return -1;
}
else if (!res)
- return 0;
+ return hasread;
hasread += res;
}
TRC (fprintf (stderr, " Out of read loop with hasread=%d, berlen=%d\n",
p->blocking = blocking;
return 1;
}
-#endif
+#endif /* WIN32 */