[1087] in BarnOwl Developers
[D-O-H] r1055 - trunk/owl
daemon@ATHENA.MIT.EDU (nelhage@MIT.EDU)
Thu Oct 29 18:12:52 2009
Resent-From: nelhage@mit.edu
Resent-To: barnowl-dev-mtg@charon.mit.edu
X-Original-To: nelhage@nelhage.com
To: dirty-owl-hackers@MIT.EDU
From: nelhage@MIT.EDU
Reply-to: dirty-owl-hackers@MIT.EDU
Date: Mon, 26 May 2008 22:58:52 -0400 (EDT)
Author: nelhage
Date: 2008-05-26 22:58:52 -0400 (Mon, 26 May 2008)
New Revision: 1055
Modified:
trunk/owl/zephyr.c
Log:
Clone ZhmStat() from the Zephyr source so we only hang for one second,
instead of 10, if there is not Zhm available.
Modified: trunk/owl/zephyr.c
===================================================================
--- trunk/owl/zephyr.c 2008-05-27 02:58:49 UTC (rev 1054)
+++ trunk/owl/zephyr.c 2008-05-27 02:58:52 UTC (rev 1055)
@@ -16,7 +16,17 @@
{
#ifdef HAVE_LIBZEPHYR
int ret;
-
+ ZNotice_t notice;
+
+ /* Stat the zhm manually, with a shorter timeout */
+ if ((ret = ZOpenPort(NULL)) != ZERR_NONE)
+ return(ret);
+
+ if ((ret = owl_zhm_stat(¬ice)) != ZERR_NONE)
+ return(ret);
+
+ ZClosePort();
+
if ((ret = ZInitialize()) != ZERR_NONE) {
com_err("owl",ret,"while initializing");
return(1);
@@ -29,6 +39,65 @@
return(0);
}
+#ifdef HAVE_LIBZEPHYR
+#define HM_SVC_FALLBACK htons((unsigned short) 2104)
+
+/*
+ * Code modified from libzephyr's ZhmStat.c
+ *
+ * Modified to only wait one second to time out if there is no
+ * hostmanager present, rather than a rather excessive 10 seconds.
+ */
+Code_t owl_zhm_stat(ZNotice_t *notice) {
+ struct servent *sp;
+ struct sockaddr_in sin;
+ ZNotice_t req;
+ Code_t code;
+ struct timeval tv;
+ fd_set readers;
+
+ (void) memset((char *)&sin, 0, sizeof(struct sockaddr_in));
+
+ sp = getservbyname(HM_SVCNAME, "udp");
+
+ sin.sin_port = (sp) ? sp->s_port : HM_SVC_FALLBACK;
+ sin.sin_family = AF_INET;
+
+ sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+
+ (void) memset((char *)&req, 0, sizeof(req));
+ req.z_kind = STAT;
+ req.z_port = 0;
+ req.z_class = HM_STAT_CLASS;
+ req.z_class_inst = HM_STAT_CLIENT;
+ req.z_opcode = HM_GIMMESTATS;
+ req.z_sender = "";
+ req.z_recipient = "";
+ req.z_default_format = "";
+ req.z_message_len = 0;
+
+ if ((code = ZSetDestAddr(&sin)) != ZERR_NONE)
+ return(code);
+
+ if ((code = ZSendNotice(&req, ZNOAUTH)) != ZERR_NONE)
+ return(code);
+
+ /* Wait up to 1 second for a response. */
+ FD_ZERO(&readers);
+ FD_SET(ZGetFD(), &readers);
+ tv.tv_sec = 1;
+ tv.tv_usec = 0;
+ code = select(ZGetFD() + 1, &readers, NULL, NULL, &tv);
+ if (code < 0 && errno != EINTR)
+ return(errno);
+ if (code == 0 || (code < 0 && errno == EINTR) || ZPending() == 0)
+ return(ZERR_HMDEAD);
+
+ return(ZReceiveNotice(notice, (struct sockaddr_in *) 0));
+}
+
+#endif
+
int owl_zephyr_shutdown()
{
#ifdef HAVE_LIBZEPHYR