core/protocols/zephyr/ZLocations.c

changeset 14253
b63ebf84c42b
parent 13583
29c0a756c086
equal deleted inserted replaced
14252:d10dda2777a9 14253:b63ebf84c42b
1 /* This file is part of the Project Athena Zephyr Notification System.
2 * It contains source for the ZSetLocation, ZUnsetLocation, and
3 * ZFlushMyLocations functions.
4 *
5 * Created by: Robert French
6 *
7 * Copyright (c) 1987,1988,1991 by the Massachusetts Institute of Technology.
8 * For copying and distribution information, see the file
9 * "mit-copyright.h".
10 */
11
12 #include "internal.h"
13
14 #ifndef WIN32
15 #include <pwd.h>
16 #endif
17
18 #include <stdlib.h>
19 #include <errno.h>
20
21 Code_t ZSetLocation(exposure)
22 char *exposure;
23 {
24 return (Z_SendLocation(LOGIN_CLASS, exposure, ZAUTH,
25 "$sender logged in to $1 on $3 at $2"));
26 }
27
28 Code_t ZUnsetLocation()
29 {
30 return (Z_SendLocation(LOGIN_CLASS, LOGIN_USER_LOGOUT, ZNOAUTH,
31 "$sender logged out of $1 on $3 at $2"));
32 }
33
34 Code_t ZFlushMyLocations()
35 {
36 return (Z_SendLocation(LOGIN_CLASS, LOGIN_USER_FLUSH, ZAUTH, ""));
37 }
38
39 static char host[MAXHOSTNAMELEN], mytty[MAXPATHLEN];
40 static int reenter = 0;
41
42 Code_t Z_SendLocation(class, opcode, auth, format)
43 char *class;
44 char *opcode;
45 Z_AuthProc auth;
46 char *format;
47 {
48 int retval;
49 time_t ourtime;
50 ZNotice_t notice, retnotice;
51 char *bptr[3];
52 #ifndef X_DISPLAY_MISSING
53 char *display;
54 #endif
55 #ifndef WIN32
56 char *ttyp;
57 char *p;
58 #endif
59 struct hostent *hent;
60 short wg_port = ZGetWGPort();
61
62 (void) memset((char *)&notice, 0, sizeof(notice));
63 notice.z_kind = ACKED;
64 notice.z_port = (unsigned short) ((wg_port == -1) ? 0 : wg_port);
65 notice.z_class = class;
66 notice.z_class_inst = ZGetSender();
67 notice.z_opcode = opcode;
68 notice.z_sender = 0;
69 notice.z_recipient = "";
70 notice.z_num_other_fields = 0;
71 notice.z_default_format = format;
72
73 /*
74 keep track of what we said before so that we can be consistent
75 when changing location information.
76 This is done mainly for the sake of the WindowGram client.
77 */
78
79 if (!reenter) {
80 if (gethostname(host, MAXHOSTNAMELEN) < 0)
81 return (errno);
82
83 hent = gethostbyname(host);
84 if (hent) {
85 (void) strncpy(host, hent->h_name, sizeof(host));
86 host[sizeof(host) - 1] = '\0';
87 }
88 #ifndef X_DISPLAY_MISSING
89 if ((display = getenv("DISPLAY")) && *display) {
90 (void) strncpy(mytty, display, sizeof(mytty));
91 } else {
92 #endif
93 #ifdef WIN32
94 strncpy(mytty, "WinGaim", sizeof(mytty));
95 #else
96 ttyp = ttyname(0);
97 if (ttyp && *ttyp) {
98 p = strchr(ttyp + 1, '/');
99 strcpy(mytty, (p) ? p + 1 : ttyp);
100 } else {
101 strncpy(mytty, "unknown", sizeof(mytty));
102 }
103 #endif
104 mytty[sizeof(mytty)-1] = '\0';
105 #ifndef X_DISPLAY_MISSING
106 }
107 #endif
108 reenter = 1;
109 }
110
111 ourtime = time((time_t *)0);
112 bptr[0] = host;
113 bptr[1] = ctime(&ourtime);
114 bptr[1][strlen(bptr[1])-1] = '\0';
115 bptr[2] = mytty;
116
117
118 if ((retval = ZSendList(&notice, bptr, 3, auth)) != ZERR_NONE)
119 return (retval);
120
121 retval = Z_WaitForNotice (&retnotice, ZCompareUIDPred, &notice.z_uid,
122 SRV_TIMEOUT);
123 if (retval != ZERR_NONE)
124 return retval;
125
126 if (retnotice.z_kind == SERVNAK) {
127 if (!retnotice.z_message_len) {
128 ZFreeNotice(&retnotice);
129 return (ZERR_SERVNAK);
130 }
131 if (!strcmp(retnotice.z_message, ZSRVACK_NOTSENT)) {
132 ZFreeNotice(&retnotice);
133 return (ZERR_AUTHFAIL);
134 }
135 if (!strcmp(retnotice.z_message, ZSRVACK_FAIL)) {
136 ZFreeNotice(&retnotice);
137 return (ZERR_LOGINFAIL);
138 }
139 ZFreeNotice(&retnotice);
140 return (ZERR_SERVNAK);
141 }
142
143 if (retnotice.z_kind != SERVACK) {
144 ZFreeNotice(&retnotice);
145 return (ZERR_INTERNAL);
146 }
147
148 if (!retnotice.z_message_len) {
149 ZFreeNotice(&retnotice);
150 return (ZERR_INTERNAL);
151 }
152
153 if (strcmp(retnotice.z_message, ZSRVACK_SENT) &&
154 strcmp(retnotice.z_message, ZSRVACK_NOTSENT)) {
155 ZFreeNotice(&retnotice);
156 return (ZERR_INTERNAL);
157 }
158
159 ZFreeNotice(&retnotice);
160
161 return (ZERR_NONE);
162 }

mercurial