diff libpurple/protocols/zephyr/ZhmStat.c @ 15374:5fe8042783c1

Rename gtk/ and libgaim/ to pidgin/ and libpurple/
author Sean Egan <seanegan@gmail.com>
date Sat, 20 Jan 2007 02:32:10 +0000
parents
children a8cc50c2279f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/zephyr/ZhmStat.c	Sat Jan 20 02:32:10 2007 +0000
@@ -0,0 +1,75 @@
+/* This file is part of the Project Athena Zephyr Notification System.
+ * It contains the ZhmStat() function.
+ *
+ *      Created by:     Marc Horowitz
+ *
+ *      Copyright (c) 1996 by the Massachusetts Institute of Technology.
+ *      For copying and distribution information, see the file
+ *      "mit-copyright.h". 
+ */
+
+#include "internal.h"
+
+#ifdef WIN32
+#include <winsock2.h>
+#else
+#include <sys/socket.h>
+#endif
+
+#ifndef INADDR_LOOPBACK
+#define INADDR_LOOPBACK 0x7f000001
+#endif
+
+Code_t ZhmStat(hostaddr, notice)
+    struct in_addr *hostaddr;
+    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;
+
+    if (hostaddr)
+	sin.sin_addr = *hostaddr;
+    else
+	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 ten seconds for a response. */
+    FD_ZERO(&readers);
+    FD_SET(ZGetFD(), &readers);
+    tv.tv_sec = 10;
+    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));
+}