]> asedeno.scripts.mit.edu Git - 1ts-debian.git/blob - zephyr/lib/ZhmStat.c
r4254@bucket (orig r244): kcr | 2008-01-20 14:40:42 -0500
[1ts-debian.git] / zephyr / lib / ZhmStat.c
1 /* This file is part of the Project Athena Zephyr Notification System.
2  * It contains the ZhmStat() function.
3  *
4  *      Created by:     Marc Horowitz
5  *
6  *      $Id$
7  *
8  *      Copyright (c) 1996 by the Massachusetts Institute of Technology.
9  *      For copying and distribution information, see the file
10  *      "mit-copyright.h". 
11  */
12
13 #include <internal.h>
14 #include <sys/socket.h>
15
16 #ifndef INADDR_LOOPBACK
17 #define INADDR_LOOPBACK 0x7f000001
18 #endif
19
20 Code_t
21 ZhmStat(struct in_addr *hostaddr,
22         ZNotice_t *notice)
23 {
24     struct servent *sp;
25     struct sockaddr_in sin;
26     ZNotice_t req;
27     Code_t code;
28     struct timeval tv;
29     fd_set readers;
30
31     (void) memset((char *)&sin, 0, sizeof(struct sockaddr_in));
32
33     sp = getservbyname(HM_SVCNAME, "udp");
34
35     sin.sin_port = (sp) ? sp->s_port : HM_SVC_FALLBACK;
36     sin.sin_family = AF_INET;
37
38     if (hostaddr)
39         sin.sin_addr = *hostaddr;
40     else
41         sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
42
43     (void) memset((char *)&req, 0, sizeof(req));
44     req.z_kind = STAT;
45     req.z_port = 0;
46     req.z_class = HM_STAT_CLASS;
47     req.z_class_inst = HM_STAT_CLIENT;
48     req.z_opcode = HM_GIMMESTATS;
49     req.z_sender = "";
50     req.z_recipient = "";
51     req.z_default_format = "";
52     req.z_message_len = 0;
53         
54     if ((code = ZSetDestAddr(&sin)) != ZERR_NONE)
55         return(code);
56
57     if ((code = ZSendNotice(&req, ZNOAUTH)) != ZERR_NONE)
58         return(code);
59
60     /* Wait up to ten seconds for a response. */
61     FD_ZERO(&readers);
62     FD_SET(ZGetFD(), &readers);
63     tv.tv_sec = 10;
64     tv.tv_usec = 0;
65     code = select(ZGetFD() + 1, &readers, NULL, NULL, &tv);
66     if (code < 0 && errno != EINTR)
67         return(errno);
68     if (code == 0 || (code < 0 && errno == EINTR) || ZPending() == 0)
69         return(ZERR_HMDEAD);
70
71     return(ZReceiveNotice(notice, (struct sockaddr_in *) 0));
72 }