/*
- * $Id: cnid_metad.c,v 1.18 2009-10-18 19:02:43 didg Exp $
+ * $Id: cnid_metad.c,v 1.19 2009-10-18 20:21:09 didg Exp $
*
* Copyright (C) Joerg Lenneis 2003
* All Rights Reserved. See COPYING.
static int srvfd;
static int rqstfd;
-static volatile sig_atomic_t alarmed = 0;
static volatile sig_atomic_t sigchild = 0;
#define MAXSPAWN 3 /* Max times respawned in.. */
}
/* ------------------ */
-static void catch_alarm(int sig _U_) {
- alarmed = 1;
-}
-
static void catch_child(int sig _U_)
{
sigchild = 1;
sigset_t set;
signal(SIGPIPE, SIG_IGN);
- signal(SIGALRM, catch_alarm);
sv.sa_handler = catch_child;
sv.sa_flags = SA_NOCLDSTOP;
/* TODO: Check out read errors, broken pipe etc. in libatalk. Is
SIGIPE ignored there? Answer: Ignored for dsi, but not for asp ... */
- alarm(5); /* to prevent read from getting stuck */
ret = read(rqstfd, &len, sizeof(int));
- alarm(0);
- if (alarmed) {
- alarmed = 0;
- LOG(log_severe, logtype_cnid, "Read(1) bailed with alarm (timeout)");
- goto loop_end;
- }
-
if (!ret) {
/* already close */
goto loop_end;
}
else if (ret < 0) {
- LOG(log_error, logtype_cnid, "error read: %s", strerror(errno));
+ LOG(log_severe, logtype_cnid, "error read: %s", strerror(errno));
goto loop_end;
}
else if (ret != sizeof(int)) {
goto loop_end;
}
- alarm(5);
actual_len = read(rqstfd, dbdir, len);
- alarm(0);
- if (alarmed) {
- alarmed = 0;
- LOG(log_severe, logtype_cnid, "Read(2) bailed with alarm (timeout)");
+ if (actual_len < 0) {
+ LOG(log_severe, logtype_cnid, "Read(2) error : %s", strerror(errno));
goto loop_end;
}
if (actual_len != len) {
/*
- * $Id: usockfd.c,v 1.4 2009-10-18 19:02:43 didg Exp $
+ * $Id: usockfd.c,v 1.5 2009-10-18 20:21:09 didg Exp $
*
* Copyright (C) Joerg Lenneis 2003
* All Rights Reserved. See COPYING.
socklen_t size;
fd_set readfds;
int ret;
+ struct timeval tv;
FD_ZERO(&readfds);
FD_SET(sockfd, &readfds);
strerror(errno));
return -1;
}
+ tv.tv_sec = 5;
+ tv.tv_usec = 0;
+ if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) {
+ LOG(log_error, logtype_cnid, "set SO_RCVTIMEO: %s", strerror(errno));
+ close(fd);
+ return -1;
+ }
return fd;
} else
return 0;