comparison libpurple/protocols/gg/lib/pubdir50.c @ 29538:6359fde67f4c

Update our internal libgadu to 1.9.0-rc2. This does not yet build on Windows. Refs #10542. The Windows build errors are the only reason this isn't on `im.pidgin.pidgin` already.
author John Bailey <rekkanoryo@rekkanoryo.org>
date Sun, 21 Feb 2010 16:52:42 +0000
parents 259bbfb423d4
children a8cc50c2279f
comparison
equal deleted inserted replaced
29474:551253814063 29538:6359fde67f4c
1 /* $Id: pubdir50.c 16856 2006-08-19 01:13:25Z evands $ */ 1 /* $Id: pubdir50.c 854 2009-10-12 21:06:28Z wojtekka $ */
2 2
3 /* 3 /*
4 * (C) Copyright 2003 Wojtek Kaniewski <wojtekka@irc.pl> 4 * (C) Copyright 2003 Wojtek Kaniewski <wojtekka@irc.pl>
5 * 5 *
6 * This program is free software; you can redistribute it and/or modify 6 * This program is free software; you can redistribute it and/or modify
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details. 13 * GNU Lesser General Public License for more details.
14 * 14 *
15 * You should have received a copy of the GNU Lesser General Public 15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this program; if not, write to the Free Software 16 * License along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,
18 * USA. 18 * USA.
19 */ 19 */
20 20
21 #include "libgadu.h" 21 /**
22 * \file pubdir50.c
23 *
24 * \brief Obsługa katalogu publicznego od wersji Gadu-Gadu 5.x
25 */
22 26
23 #include <errno.h> 27 #include <errno.h>
24 #include <stdlib.h> 28 #include <stdlib.h>
25 #include <string.h> 29 #include <string.h>
26 #include <time.h> 30 #include <time.h>
27 31
28 /* 32 #include "libgadu.h"
29 * gg_pubdir50_new() 33 #include "libgadu-internal.h"
30 * 34
31 * tworzy now± zmienn± typu gg_pubdir50_t. 35 /**
32 * 36 * Tworzy nowe zapytanie katalogu publicznego.
33 * zaalokowana zmienna lub NULL w przypadku braku pamięci. 37 *
38 * \param type Rodzaj zapytania
39 *
40 * \return Zmienna \c gg_pubdir50_t lub \c NULL w przypadku błędu.
41 *
42 * \ingroup pubdir50
34 */ 43 */
35 gg_pubdir50_t gg_pubdir50_new(int type) 44 gg_pubdir50_t gg_pubdir50_new(int type)
36 { 45 {
37 gg_pubdir50_t res = malloc(sizeof(struct gg_pubdir50_s)); 46 gg_pubdir50_t res = malloc(sizeof(struct gg_pubdir50_s));
38 47
48 res->type = type; 57 res->type = type;
49 58
50 return res; 59 return res;
51 } 60 }
52 61
53 /* 62 /**
54 * gg_pubdir50_add_n() // funkcja wewnętrzna 63 * \internal Dodaje lub zastÄ™puje pole zapytania lub odpowiedzi katalogu
55 * 64 * publicznego.
56 * funkcja dodaje lub zastępuje istniej±ce pole do zapytania lub odpowiedzi. 65 *
57 * 66 * \param req Zapytanie lub odpowiedĹş
58 * - req - wskaĽnik opisu zapytania, 67 * \param num Numer wyniku odpowiedzi (0 dla zapytania)
59 * - num - numer wyniku (0 dla zapytania), 68 * \param field Nazwa pola
60 * - field - nazwa pola, 69 * \param value Wartość pola
61 * - value - warto¶ć pola, 70 *
62 * 71 * \return 0 jeśli się powiodło, -1 w przypadku błędu
63 * 0/-1
64 */ 72 */
65 static int gg_pubdir50_add_n(gg_pubdir50_t req, int num, const char *field, const char *value) 73 static int gg_pubdir50_add_n(gg_pubdir50_t req, int num, const char *field, const char *value)
66 { 74 {
67 struct gg_pubdir50_entry *tmp = NULL, *entry; 75 struct gg_pubdir50_entry *tmp = NULL, *entry;
68 char *dupfield, *dupvalue; 76 char *dupfield, *dupvalue;
108 req->entries_count++; 116 req->entries_count++;
109 117
110 return 0; 118 return 0;
111 } 119 }
112 120
113 /* 121 /**
114 * gg_pubdir50_add() 122 * Dodaje pole zapytania.
115 * 123 *
116 * funkcja dodaje pole do zapytania. 124 * \param req Zapytanie
117 * 125 * \param field Nazwa pola
118 * - req - wskaĽnik opisu zapytania, 126 * \param value Wartość pola
119 * - field - nazwa pola, 127 *
120 * - value - warto¶ć pola, 128 * \return 0 jeĹ›li siÄ™ powiodĹ‚o, -1 w przypadku bĹ‚Ä™du
121 * 129 *
122 * 0/-1 130 * \ingroup pubdir50
123 */ 131 */
124 int gg_pubdir50_add(gg_pubdir50_t req, const char *field, const char *value) 132 int gg_pubdir50_add(gg_pubdir50_t req, const char *field, const char *value)
125 { 133 {
126 return gg_pubdir50_add_n(req, 0, field, value); 134 return gg_pubdir50_add_n(req, 0, field, value);
127 } 135 }
128 136
129 /* 137 /**
130 * gg_pubdir50_seq_set() 138 * Ustawia numer sekwencyjny zapytania.
131 * 139 *
132 * ustawia numer sekwencyjny zapytania. 140 * \param req Zapytanie
133 * 141 * \param seq Numer sekwencyjny
134 * - req - zapytanie, 142 *
135 * - seq - nowy numer sekwencyjny. 143 * \return 0 jeśli się powiodło, -1 w przypadku błędu
136 * 144 *
137 * 0/-1. 145 * \ingroup pubdir50
138 */ 146 */
139 int gg_pubdir50_seq_set(gg_pubdir50_t req, uint32_t seq) 147 int gg_pubdir50_seq_set(gg_pubdir50_t req, uint32_t seq)
140 { 148 {
141 gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50_seq_set(%p, %d);\n", req, seq); 149 gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50_seq_set(%p, %d);\n", req, seq);
142 150
149 req->seq = seq; 157 req->seq = seq;
150 158
151 return 0; 159 return 0;
152 } 160 }
153 161
154 /* 162 /**
155 * gg_pubdir50_free() 163 * Zwalnia zasoby po zapytaniu lub odpowiedzi katalogu publicznego.
156 * 164 *
157 * zwalnia pamięć po zapytaniu lub rezultacie szukania użytkownika. 165 * \param s Zapytanie lub odpowiedĹş
158 * 166 *
159 * - s - zwalniana zmienna, 167 * \ingroup pubdir50
160 */ 168 */
161 void gg_pubdir50_free(gg_pubdir50_t s) 169 void gg_pubdir50_free(gg_pubdir50_t s)
162 { 170 {
163 int i; 171 int i;
164 172
172 180
173 free(s->entries); 181 free(s->entries);
174 free(s); 182 free(s);
175 } 183 }
176 184
177 /* 185 /**
178 * gg_pubdir50() 186 * Wysyła zapytanie katalogu publicznego do serwera.
179 * 187 *
180 * wysyła zapytanie katalogu publicznego do serwera. 188 * \param sess Struktura sesji
181 * 189 * \param req Zapytanie
182 * - sess - sesja, 190 *
183 * - req - zapytanie. 191 * \return Numer sekwencyjny zapytania lub 0 w przypadku błędu
184 * 192 *
185 * numer sekwencyjny wyszukiwania lub 0 w przypadku błędu. 193 * \ingroup pubdir50
186 */ 194 */
187 uint32_t gg_pubdir50(struct gg_session *sess, gg_pubdir50_t req) 195 uint32_t gg_pubdir50(struct gg_session *sess, gg_pubdir50_t req)
188 { 196 {
189 int i, size = 5; 197 int i, size = 5;
190 uint32_t res; 198 uint32_t res;
191 char *buf, *p; 199 char *buf, *p;
192 struct gg_pubdir50_request *r; 200 struct gg_pubdir50_request *r;
193 201
194 gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50(%p, %p);\n", sess, req); 202 gg_debug_session(sess, GG_DEBUG_FUNCTION, "** gg_pubdir50(%p, %p);\n", sess, req);
195 203
196 if (!sess || !req) { 204 if (!sess || !req) {
197 gg_debug(GG_DEBUG_MISC, "// gg_pubdir50() invalid arguments\n"); 205 gg_debug_session(sess, GG_DEBUG_MISC, "// gg_pubdir50() invalid arguments\n");
198 errno = EFAULT; 206 errno = EFAULT;
199 return 0; 207 return 0;
200 } 208 }
201 209
202 if (sess->state != GG_STATE_CONNECTED) { 210 if (sess->state != GG_STATE_CONNECTED) {
203 gg_debug(GG_DEBUG_MISC, "// gg_pubdir50() not connected\n"); 211 gg_debug_session(sess, GG_DEBUG_MISC, "// gg_pubdir50() not connected\n");
204 errno = ENOTCONN; 212 errno = ENOTCONN;
205 return 0; 213 return 0;
206 } 214 }
207 215
208 for (i = 0; i < req->entries_count; i++) { 216 for (i = 0; i < req->entries_count; i++) {
209 /* wyszukiwanie bierze tylko pierwszy wpis */ 217 /* wyszukiwanie bierze tylko pierwszy wpis */
210 if (req->entries[i].num) 218 if (req->entries[i].num)
211 continue; 219 continue;
212 220
213 size += strlen(req->entries[i].field) + 1; 221 if (sess->encoding == GG_ENCODING_CP1250) {
214 size += strlen(req->entries[i].value) + 1; 222 size += strlen(req->entries[i].field) + 1;
223 size += strlen(req->entries[i].value) + 1;
224 } else {
225 char *tmp;
226
227 tmp = gg_utf8_to_cp(req->entries[i].field);
228
229 if (tmp == NULL)
230 return -1;
231
232 size += strlen(tmp) + 1;
233
234 free(tmp);
235
236 tmp = gg_utf8_to_cp(req->entries[i].value);
237
238 if (tmp == NULL)
239 return -1;
240
241 size += strlen(tmp) + 1;
242
243 free(tmp);
244 }
215 } 245 }
216 246
217 if (!(buf = malloc(size))) { 247 if (!(buf = malloc(size))) {
218 gg_debug(GG_DEBUG_MISC, "// gg_pubdir50() out of memory (%d bytes)\n", size); 248 gg_debug_session(sess, GG_DEBUG_MISC, "// gg_pubdir50() out of memory (%d bytes)\n", size);
219 return 0; 249 return 0;
220 } 250 }
221 251
252 if (!req->seq)
253 req->seq = time(NULL);
254
255 res = req->seq;
256
222 r = (struct gg_pubdir50_request*) buf; 257 r = (struct gg_pubdir50_request*) buf;
223 res = time(NULL);
224 r->type = req->type; 258 r->type = req->type;
225 r->seq = (req->seq) ? gg_fix32(req->seq) : gg_fix32(time(NULL)); 259 r->seq = gg_fix32(req->seq);
226 req->seq = gg_fix32(r->seq);
227 260
228 for (i = 0, p = buf + 5; i < req->entries_count; i++) { 261 for (i = 0, p = buf + 5; i < req->entries_count; i++) {
229 if (req->entries[i].num) 262 if (req->entries[i].num)
230 continue; 263 continue;
231 264
232 strcpy(p, req->entries[i].field); 265 if (sess->encoding == GG_ENCODING_CP1250) {
233 p += strlen(p) + 1; 266 strcpy(p, req->entries[i].field);
234 267 p += strlen(p) + 1;
235 strcpy(p, req->entries[i].value); 268
236 p += strlen(p) + 1; 269 strcpy(p, req->entries[i].value);
270 p += strlen(p) + 1;
271 } else {
272 char *tmp;
273
274 tmp = gg_utf8_to_cp(req->entries[i].field);
275
276 if (tmp == NULL) {
277 free(buf);
278 return -1;
279 }
280
281 strcpy(p, tmp);
282 p += strlen(tmp) + 1;
283 free(tmp);
284
285 tmp = gg_utf8_to_cp(req->entries[i].value);
286
287 if (tmp == NULL) {
288 free(buf);
289 return -1;
290 }
291
292 strcpy(p, tmp);
293 p += strlen(tmp) + 1;
294 free(tmp);
295 }
237 } 296 }
238 297
239 if (gg_send_packet(sess, GG_PUBDIR50_REQUEST, buf, size, NULL, 0) == -1) 298 if (gg_send_packet(sess, GG_PUBDIR50_REQUEST, buf, size, NULL, 0) == -1)
240 res = 0; 299 res = 0;
241 300
243 302
244 return res; 303 return res;
245 } 304 }
246 305
247 /* 306 /*
248 * gg_pubdir50_handle_reply() // funkcja wewnętrzna 307 * \internal Analizuje przychodzÄ…cy pakiet odpowiedzi i zapisuje wynik
249 * 308 * w strukturze \c gg_event.
250 * analizuje przychodz±cy pakiet odpowiedzi i zapisuje wynik w struct gg_event. 309 *
251 * 310 * \param sess Struktura sesji
252 * - e - opis zdarzenia 311 * \param e Struktura zdarzenia
253 * - packet - zawarto¶ć pakietu odpowiedzi 312 * \param packet Pakiet odpowiedzi
254 * - length - długo¶ć pakietu odpowiedzi 313 * \param length DĹ‚ugość pakietu odpowiedzi
255 * 314 *
256 * 0/-1 315 * \return 0 jeśli się powiodło, -1 w przypadku błędu
257 */ 316 */
258 int gg_pubdir50_handle_reply(struct gg_event *e, const char *packet, int length) 317 int gg_pubdir50_handle_reply_sess(struct gg_session *sess, struct gg_event *e, const char *packet, int length)
259 { 318 {
260 const char *end = packet + length, *p; 319 const char *end = packet + length, *p;
261 struct gg_pubdir50_reply *r = (struct gg_pubdir50_reply*) packet; 320 struct gg_pubdir50_reply *r = (struct gg_pubdir50_reply*) packet;
262 gg_pubdir50_t res; 321 gg_pubdir50_t res;
263 int num = 0; 322 int num = 0;
264 323
265 gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50_handle_reply(%p, %p, %d);\n", e, packet, length); 324 gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50_handle_reply_sess(%p, %p, %p, %d);\n", sess, e, packet, length);
266 325
267 if (!e || !packet) { 326 if (!sess || !e || !packet) {
268 gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_handle_reply() invalid arguments\n"); 327 gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_handle_reply() invalid arguments\n");
269 errno = EFAULT; 328 errno = EFAULT;
270 return -1; 329 return -1;
271 } 330 }
272 331
297 default: 356 default:
298 e->type = GG_EVENT_PUBDIR50_SEARCH_REPLY; 357 e->type = GG_EVENT_PUBDIR50_SEARCH_REPLY;
299 break; 358 break;
300 } 359 }
301 360
302 /* brak wyników? */ 361 /* brak wynikĂłw? */
303 if (length == 5) 362 if (length == 5)
304 return 0; 363 return 0;
305 364
306 /* pomiń pocz±tek odpowiedzi */ 365 /* pomiĹ„ poczÄ…tek odpowiedzi */
307 p = packet + 5; 366 p = packet + 5;
308 367
309 while (p < end) { 368 while (p < end) {
310 const char *field, *value; 369 const char *field, *value;
311 370
312 field = p; 371 field = p;
313 372
314 /* sprawdĽ, czy nie mamy podziału na kolejne pole */ 373 /* sprawdĹş, czy nie mamy podziaĹ‚u na kolejne pole */
315 if (!*field) { 374 if (!*field) {
316 num++; 375 num++;
317 field++; 376 field++;
318 } 377 }
319 378
320 value = NULL; 379 value = NULL;
321 380
322 for (p = field; p < end; p++) { 381 for (p = field; p < end; p++) {
323 /* je¶li mamy koniec tekstu... */ 382 /* jeĹ›li mamy koniec tekstu... */
324 if (!*p) { 383 if (!*p) {
325 /* ...i jeszcze nie mieli¶my warto¶ci pola to 384 /* ...i jeszcze nie mieliĹ›my wartoĹ›ci pola to
326 * wiemy, że po tym zerze jest warto¶ć... */ 385 * wiemy, ĹĽe po tym zerze jest wartość... */
327 if (!value) 386 if (!value)
328 value = p + 1; 387 value = p + 1;
329 else 388 else
330 /* ...w przeciwym wypadku koniec 389 /* ...w przeciwym wypadku koniec
331 * warto¶ci i możemy wychodzić 390 * wartoĹ›ci i moĹĽemy wychodzić
332 * grzecznie z pętli */ 391 * grzecznie z pÄ™tli */
333 break; 392 break;
334 } 393 }
335 } 394 }
336 395
337 /* sprawdĽmy, czy pole nie wychodzi poza pakiet, żeby nie 396 /* sprawdĹşmy, czy pole nie wychodzi poza pakiet, ĹĽeby nie
338 * mieć segfaultów, je¶li serwer przestanie zakańczać pakietów 397 * mieć segfaultĂłw, jeĹ›li serwer przestanie zakaĹ„czać pakietĂłw
339 * przez \0 */ 398 * przez \0 */
340 399
341 if (p == end) { 400 if (p == end) {
342 gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_handle_reply() premature end of packet\n"); 401 gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_handle_reply() premature end of packet\n");
343 goto failure; 402 goto failure;
344 } 403 }
345 404
346 p++; 405 p++;
347 406
348 /* je¶li dostali¶my namier na następne wyniki, to znaczy że 407 /* jeĹ›li dostaliĹ›my namier na nastÄ™pne wyniki, to znaczy ĹĽe
349 * mamy koniec wyników i nie jest to kolejna osoba. */ 408 * mamy koniec wynikĂłw i nie jest to kolejna osoba. */
350 if (!strcasecmp(field, "nextstart")) { 409 if (!strcasecmp(field, "nextstart")) {
351 res->next = atoi(value); 410 res->next = atoi(value);
352 num--; 411 num--;
353 } else { 412 } else {
354 if (gg_pubdir50_add_n(res, num, field, value) == -1) 413 if (sess->encoding == GG_ENCODING_CP1250) {
355 goto failure; 414 if (gg_pubdir50_add_n(res, num, field, value) == -1)
415 goto failure;
416 } else {
417 char *tmp;
418
419 tmp = gg_cp_to_utf8(value);
420
421 if (tmp == NULL)
422 goto failure;
423
424 if (gg_pubdir50_add_n(res, num, field, tmp) == -1) {
425 free(tmp);
426 goto failure;
427 }
428
429 free(tmp);
430 }
356 } 431 }
357 } 432 }
358 433
359 res->count = num + 1; 434 res->count = num + 1;
360 435
363 failure: 438 failure:
364 gg_pubdir50_free(res); 439 gg_pubdir50_free(res);
365 return -1; 440 return -1;
366 } 441 }
367 442
368 /* 443 /**
369 * gg_pubdir50_get() 444 * Pobiera pole z odpowiedzi katalogu publicznego.
370 * 445 *
371 * pobiera informację z rezultatu wyszukiwania. 446 * \param res OdpowiedĹş
372 * 447 * \param num Numer wyniku odpowiedzi
373 * - res - rezultat wyszukiwania, 448 * \param field Nazwa pola (wielkość liter nie ma znaczenia)
374 * - num - numer odpowiedzi, 449 *
375 * - field - nazwa pola (wielko¶ć liter nie ma znaczenia). 450 * \return Wartość pola lub \c NULL jeĹ›li nie znaleziono
376 * 451 *
377 * warto¶ć pola lub NULL, je¶li nie znaleziono. 452 * \ingroup pubdir50
378 */ 453 */
379 const char *gg_pubdir50_get(gg_pubdir50_t res, int num, const char *field) 454 const char *gg_pubdir50_get(gg_pubdir50_t res, int num, const char *field)
380 { 455 {
381 char *value = NULL; 456 char *value = NULL;
382 int i; 457 int i;
397 } 472 }
398 473
399 return value; 474 return value;
400 } 475 }
401 476
402 /* 477 /**
403 * gg_pubdir50_count() 478 * Zwraca liczbÄ™ wynikĂłw odpowiedzi.
404 * 479 *
405 * zwraca ilo¶ć wyników danego zapytania. 480 * \param res OdpowiedĹş
406 * 481 *
407 * - res - odpowiedĽ 482 * \return Liczba wynikĂłw lub -1 w przypadku bĹ‚Ä™du
408 * 483 *
409 * ilo¶ć lub -1 w przypadku błędu. 484 * \ingroup pubdir50
410 */ 485 */
411 int gg_pubdir50_count(gg_pubdir50_t res) 486 int gg_pubdir50_count(gg_pubdir50_t res)
412 { 487 {
413 return (!res) ? -1 : res->count; 488 return (!res) ? -1 : res->count;
414 } 489 }
415 490
416 /* 491 /**
417 * gg_pubdir50_type() 492 * Zwraca rodzaj zapytania lub odpowiedzi.
418 * 493 *
419 * zwraca rodzaj zapytania lub odpowiedzi. 494 * \param res Zapytanie lub odpowiedĹş
420 * 495 *
421 * - res - zapytanie lub odpowiedĽ 496 * \return Rodzaj lub -1 w przypadku bĹ‚Ä™du
422 * 497 *
423 * ilo¶ć lub -1 w przypadku błędu. 498 * \ingroup pubdir50
424 */ 499 */
425 int gg_pubdir50_type(gg_pubdir50_t res) 500 int gg_pubdir50_type(gg_pubdir50_t res)
426 { 501 {
427 return (!res) ? -1 : res->type; 502 return (!res) ? -1 : res->type;
428 } 503 }
429 504
430 /* 505 /**
431 * gg_pubdir50_next() 506 * Zwraca numer, od ktĂłrego naleĹĽy rozpoczÄ…c kolejne wyszukiwanie.
432 * 507 *
433 * zwraca numer, od którego należy rozpocz±ć kolejne wyszukiwanie, je¶li 508 * DĹ‚uĹĽsze odpowiedzi katalogu publicznego sÄ… wysyĹ‚ane przez serwer
434 * zależy nam na kolejnych wynikach. 509 * w mniejszych paczkach. Po otrzymaniu odpowiedzi, jeĹ›li numer kolejnego
435 * 510 * wyszukiwania jest większy od zera, dalsze wyniki można otrzymać przez
436 * - res - odpowiedĽ 511 * wywoĹ‚anie kolejnego zapytania z okreĹ›lonym numerem poczÄ…tkowym.
437 * 512 *
438 * numer lub -1 w przypadku błędu. 513 * \param res OdpowiedĹş
514 *
515 * \return Numer lub -1 w przypadku błędu
516 *
517 * \ingroup pubdir50
439 */ 518 */
440 uin_t gg_pubdir50_next(gg_pubdir50_t res) 519 uin_t gg_pubdir50_next(gg_pubdir50_t res)
441 { 520 {
442 return (!res) ? (unsigned) -1 : res->next; 521 return (!res) ? (unsigned) -1 : res->next;
443 } 522 }
444 523
445 /* 524 /**
446 * gg_pubdir50_seq() 525 * Zwraca numer sekwencyjny zapytania lub odpowiedzi.
447 * 526 *
448 * zwraca numer sekwencyjny zapytania lub odpowiedzi. 527 * \param res Zapytanie lub odpowiedĹş
449 * 528 *
450 * - res - zapytanie lub odpowiedĽ 529 * \return Numer sekwencyjny lub -1 w przypadku bĹ‚Ä™du
451 * 530 *
452 * numer lub -1 w przypadku błędu. 531 * \ingroup pubdir50
453 */ 532 */
454 uint32_t gg_pubdir50_seq(gg_pubdir50_t res) 533 uint32_t gg_pubdir50_seq(gg_pubdir50_t res)
455 { 534 {
456 return (!res) ? (unsigned) -1 : res->seq; 535 return (!res) ? (unsigned) -1 : res->seq;
457 } 536 }