Mercurial > pidgin
annotate src/protocols/zephyr/ZLocations.c @ 11839:216a05e0a6f1
[gaim-migrate @ 14130]
Peter, does this help?
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Wed, 26 Oct 2005 05:59:26 +0000 |
parents | 64895571248f |
children | f98c559a1682 |
rev | line source |
---|---|
2086 | 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 | |
8792
43d6c08d7e96
[gaim-migrate @ 9554]
Christian Hammond <chipx86@chipx86.com>
parents:
7475
diff
changeset
|
12 #include "internal.h" |
2086 | 13 |
10867 | 14 #ifndef WIN32 |
2086 | 15 #include <pwd.h> |
10867 | 16 #endif |
2086 | 17 |
18 extern char *getenv(); | |
19 extern int errno; | |
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; | |
10867 | 51 char *bptr[3]; |
2086 | 52 #ifndef X_DISPLAY_MISSING |
53 char *display; | |
54 #endif | |
10867 | 55 #ifndef WIN32 |
2086 | 56 char *ttyp; |
10867 | 57 char *p; |
58 #endif | |
2086 | 59 struct hostent *hent; |
60 short wg_port = ZGetWGPort(); | |
61 | |
62 (void) memset((char *)¬ice, 0, sizeof(notice)); | |
63 notice.z_kind = ACKED; | |
7475 | 64 notice.z_port = (unsigned short) ((wg_port == -1) ? 0 : wg_port); |
2086 | 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) { | |
10328 | 90 (void) strncpy(mytty, display, sizeof(mytty)); |
2086 | 91 } else { |
92 #endif | |
10867 | 93 #ifdef WIN32 |
10897 | 94 strncpy(mytty, "WinGaim", sizeof(mytty)); |
10867 | 95 #else |
2086 | 96 ttyp = ttyname(0); |
2419
7ba69b8e0de5
[gaim-migrate @ 2432]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
97 if (ttyp && *ttyp) { |
7ba69b8e0de5
[gaim-migrate @ 2432]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
98 p = strchr(ttyp + 1, '/'); |
7ba69b8e0de5
[gaim-migrate @ 2432]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
99 strcpy(mytty, (p) ? p + 1 : ttyp); |
7ba69b8e0de5
[gaim-migrate @ 2432]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
100 } else { |
10897 | 101 strncpy(mytty, "unknown", sizeof(mytty)); |
2086 | 102 } |
10867 | 103 #endif |
10897 | 104 mytty[sizeof(mytty)-1] = '\0'; |
2086 | 105 #ifndef X_DISPLAY_MISSING |
106 } | |
107 #endif | |
108 reenter = 1; | |
109 } | |
110 | |
111 ourtime = time((time_t *)0); | |
2419
7ba69b8e0de5
[gaim-migrate @ 2432]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
112 bptr[0] = host; |
2086 | 113 bptr[1] = ctime(&ourtime); |
114 bptr[1][strlen(bptr[1])-1] = '\0'; | |
2419
7ba69b8e0de5
[gaim-migrate @ 2432]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
115 bptr[2] = mytty; |
2086 | 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 } |