X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Funix.c;h=3449001059de76e92b569a479fe792f3481b1421;hp=75ceb17fcb2a7b4c25744839e524a6803458b69a;hb=84d7b06c13daa609e93f353e655c4b02f936d65c;hpb=05c274ef315384faafcc5900c17468f0ea2474e6 diff --git a/src/unix.c b/src/unix.c index 75ceb17..3449001 100644 --- a/src/unix.c +++ b/src/unix.c @@ -1,8 +1,8 @@ /* - * Copyright (c) 1995-2004, Index Data + * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: unix.c,v 1.6 2004-10-15 00:19:01 adam Exp $ + * $Id: unix.c,v 1.14 2005-02-09 09:18:27 adam Exp $ * UNIX socket COMSTACK. By Morten Bøgeskov. */ /** @@ -15,22 +15,32 @@ #include #include #include -#include #include +#if HAVE_SYS_TYPES_H +#include +#endif +#if HAVE_UNISTD_H +#include +#endif +#if HAVE_SYS_SOCKET_H +#include +#endif #include #include #include +#if HAVE_PWD_H #include -#include +#endif -#include +#if HAVE_SYS_STAT_H #include +#endif +#if HAVE_SYS_UN_H #include +#endif -#include #include -#include #include #ifndef YAZ_SOCKLEN_T @@ -142,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; @@ -302,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; @@ -310,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; @@ -394,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; @@ -700,4 +726,4 @@ static int unix_set_blocking(COMSTACK p, int blocking) p->blocking = blocking; return 1; } -#endif +#endif /* WIN32 */