14192
|
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 *)¬ice, 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(¬ice, bptr, 3, auth)) != ZERR_NONE)
|
|
119 return (retval);
|
|
120
|
|
121 retval = Z_WaitForNotice (&retnotice, ZCompareUIDPred, ¬ice.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 }
|