| |
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 } |