Mercurial > pidgin
annotate src/protocols/zephyr/ZAsyncLocate.c @ 10302:581de78cf809
[gaim-migrate @ 11487]
Rename main.c to gtkmain.c
Change POTFILES.in to reflect the new file names
Update the po's so they use the new file names
Update the po's to use the correct line numbers (or whatever make dist does)
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 02 Dec 2004 23:48:48 +0000 |
parents | 407355e05a0a |
children | 5727afad0fb8 |
rev | line source |
---|---|
2086 | 1 /* This file is part of the Project Athena Zephyr Notification System. |
2 * It contains source for asynchronous location functions. | |
3 * | |
4 * Created by: Marc Horowitz | |
5 * | |
6 * $Source$ | |
8791
407355e05a0a
[gaim-migrate @ 9553]
Christian Hammond <chipx86@chipx86.com>
parents:
7475
diff
changeset
|
7 * $Author: chipx86 $ |
2086 | 8 * |
9 * Copyright (c) 1990,1991 by the Massachusetts Institute of Technology. | |
10 * For copying and distribution information, see the file | |
11 * "mit-copyright.h". | |
12 */ | |
13 /* $Header$ */ | |
14 | |
8791
407355e05a0a
[gaim-migrate @ 9553]
Christian Hammond <chipx86@chipx86.com>
parents:
7475
diff
changeset
|
15 #include "internal.h" |
2086 | 16 |
17 #ifndef lint | |
8791
407355e05a0a
[gaim-migrate @ 9553]
Christian Hammond <chipx86@chipx86.com>
parents:
7475
diff
changeset
|
18 static const char rcsid_ZAsyncLocate_c[] = "$Id: ZAsyncLocate.c 9553 2004-04-24 09:00:37Z chipx86 $"; |
2086 | 19 #endif |
20 | |
21 Code_t ZRequestLocations(user, zald, kind, auth) | |
7261 | 22 const char *user; |
2086 | 23 register ZAsyncLocateData_t *zald; |
24 ZNotice_Kind_t kind; /* UNSAFE, UNACKED, or ACKED */ | |
25 Z_AuthProc auth; | |
26 { | |
27 int retval; | |
28 ZNotice_t notice; | |
29 | |
30 if (ZGetFD() < 0) | |
7475 | 31 if ((retval = ZOpenPort((unsigned short *)0)) != ZERR_NONE) |
2086 | 32 return (retval); |
33 | |
34 (void) memset((char *)¬ice, 0, sizeof(notice)); | |
35 notice.z_kind = kind; | |
36 notice.z_port = __Zephyr_port; | |
37 notice.z_class = LOCATE_CLASS; | |
38 notice.z_class_inst = user; | |
39 notice.z_opcode = LOCATE_LOCATE; | |
40 notice.z_sender = 0; | |
41 notice.z_recipient = ""; | |
42 notice.z_default_format = ""; | |
43 notice.z_message_len = 0; | |
44 | |
45 if ((retval = ZSendNotice(¬ice, auth)) != ZERR_NONE) | |
46 return(retval); | |
47 | |
48 if ((zald->user = (char *) malloc(strlen(user)+1)) == NULL) { | |
49 return(ENOMEM); | |
50 } | |
51 if ((zald->version = (char *) malloc(strlen(notice.z_version)+1)) == NULL) { | |
52 free(zald->user); | |
53 return(ENOMEM); | |
54 } | |
55 zald->uid = notice.z_multiuid; | |
56 strcpy(zald->user,user); | |
57 strcpy(zald->version,notice.z_version); | |
58 | |
59 return(ZERR_NONE); | |
60 } | |
61 | |
62 Code_t ZParseLocations(notice,zald,nlocs,user) | |
63 register ZNotice_t *notice; | |
64 register ZAsyncLocateData_t *zald; | |
65 int *nlocs; | |
66 char **user; | |
67 { | |
68 char *ptr, *end; | |
69 int i; | |
70 | |
71 ZFlushLocations(); /* This never fails (this function is part of the | |
72 library, so it is allowed to know this). */ | |
73 | |
74 /* non-matching protocol version numbers means the | |
75 server is probably an older version--must punt */ | |
76 | |
77 if (zald && strcmp(notice->z_version, zald->version)) | |
78 return(ZERR_VERS); | |
79 | |
80 if (notice->z_kind == SERVNAK) | |
81 return (ZERR_SERVNAK); | |
82 | |
83 /* flag ACKs as special */ | |
84 if (notice->z_kind == SERVACK && | |
85 !strcmp(notice->z_opcode, LOCATE_LOCATE)) { | |
86 *nlocs = -1; | |
87 return(ZERR_NONE); | |
88 } | |
89 | |
90 if (notice->z_kind != ACKED) | |
91 return (ZERR_INTERNAL); | |
92 | |
93 end = notice->z_message+notice->z_message_len; | |
94 | |
95 __locate_num = 0; | |
96 | |
97 for (ptr=notice->z_message;ptr<end;ptr++) | |
98 if (!*ptr) | |
99 __locate_num++; | |
100 | |
101 __locate_num /= 3; | |
102 | |
103 if (__locate_num) | |
104 { | |
105 __locate_list = (ZLocations_t *)malloc((unsigned)__locate_num* | |
106 sizeof(ZLocations_t)); | |
107 if (!__locate_list) | |
108 return (ENOMEM); | |
109 } else { | |
110 __locate_list = 0; | |
111 } | |
112 | |
113 for (ptr=notice->z_message, i=0; i<__locate_num; i++) { | |
114 unsigned int len; | |
115 | |
116 len = strlen (ptr) + 1; | |
117 __locate_list[i].host = (char *) malloc(len); | |
118 if (!__locate_list[i].host) | |
119 return (ENOMEM); | |
120 (void) strcpy(__locate_list[i].host, ptr); | |
121 ptr += len; | |
122 | |
123 len = strlen (ptr) + 1; | |
124 __locate_list[i].time = (char *) malloc(len); | |
125 if (!__locate_list[i].time) | |
126 return (ENOMEM); | |
127 (void) strcpy(__locate_list[i].time, ptr); | |
128 ptr += len; | |
129 | |
130 len = strlen (ptr) + 1; | |
131 __locate_list[i].tty = (char *) malloc(len); | |
132 if (!__locate_list[i].tty) | |
133 return (ENOMEM); | |
134 (void) strcpy(__locate_list[i].tty, ptr); | |
135 ptr += len; | |
136 } | |
137 | |
138 __locate_next = 0; | |
139 *nlocs = __locate_num; | |
140 if (user) { | |
141 if (zald) { | |
142 if ((*user = (char *) malloc(strlen(zald->user)+1)) == NULL) | |
143 return(ENOMEM); | |
144 strcpy(*user,zald->user); | |
145 } else { | |
146 if ((*user = (char *) malloc(strlen(notice->z_class_inst)+1)) == NULL) | |
147 return(ENOMEM); | |
148 strcpy(*user,notice->z_class_inst); | |
149 } | |
150 } | |
151 return (ZERR_NONE); | |
152 } | |
153 | |
154 int ZCompareALDPred(notice, zald) | |
155 ZNotice_t *notice; | |
156 void *zald; | |
157 { | |
158 return(ZCompareUID(&(notice->z_multiuid), | |
159 &(((ZAsyncLocateData_t *) zald)->uid))); | |
160 } | |
161 | |
162 void ZFreeALD(zald) | |
163 register ZAsyncLocateData_t *zald; | |
164 { | |
165 if (!zald) return; | |
166 | |
167 if (zald->user) free(zald->user); | |
168 if (zald->version) free(zald->version); | |
169 (void) memset(zald, 0, sizeof(*zald)); | |
170 } |