comparison src/protocols/novell/nmconn.c @ 8874:a2affcdf8e01

[gaim-migrate @ 9643] "This patch fixes the Novell protocol plugin on big endian platforms (Bug #947017). It also includes a fix for disconnects when sending large messages." --Mike Stoddard (novell) committer: Tailor Script <tailor@pidgin.im>
author Luke Schierer <lschiere@pidgin.im>
date Wed, 05 May 2004 20:29:21 +0000
parents c7e9687bfd79
children 6663ad2386d9
comparison
equal deleted inserted replaced
8873:82f0d88ada18 8874:a2affcdf8e01
235 } 235 }
236 return rc; 236 return rc;
237 } 237 }
238 238
239 NMERR_T 239 NMERR_T
240 nm_read_uint32(NMConn *conn, guint32 *val)
241 {
242 NMERR_T rc = NM_OK;
243
244 rc = nm_read_all(conn, (char *)val, sizeof(*val));
245 if (rc == NM_OK) {
246 *val = GUINT32_FROM_LE(*val);
247 }
248
249 return rc;
250 }
251
252 NMERR_T
253 nm_read_uint16(NMConn *conn, guint16 *val)
254 {
255 NMERR_T rc = NM_OK;
256
257 rc = nm_read_all(conn, (char *)val, sizeof(*val));
258 if (rc == NM_OK) {
259 *val = GUINT16_FROM_LE(*val);
260 }
261
262 return rc;
263 }
264
265 NMERR_T
240 nm_write_fields(NMConn * conn, NMField * fields) 266 nm_write_fields(NMConn * conn, NMField * fields)
241 { 267 {
242 NMERR_T rc = NM_OK; 268 NMERR_T rc = NM_OK;
243 NMField *field; 269 NMField *field;
244 char *value = NULL; 270 char *value = NULL;
245 char *method = NULL; 271 char *method = NULL;
246 char buffer[512]; 272 char buffer[4096];
247 int ret; 273 int ret;
248 int bytes_to_send; 274 int bytes_to_send;
249 int val = 0; 275 int val = 0;
250 276
251 if (conn == NULL || fields == NULL) { 277 if (conn == NULL || fields == NULL) {
285 case NMFIELD_TYPE_DN: 311 case NMFIELD_TYPE_DN:
286 312
287 value = url_escape_string((char *) field->value); 313 value = url_escape_string((char *) field->value);
288 bytes_to_send = g_snprintf(buffer, sizeof(buffer), 314 bytes_to_send = g_snprintf(buffer, sizeof(buffer),
289 "&val=%s", value); 315 "&val=%s", value);
290 ret = nm_tcp_write(conn, buffer, bytes_to_send); 316 if (bytes_to_send > (int)sizeof(buffer)) {
317 ret = nm_tcp_write(conn, buffer, sizeof(buffer));
318 } else {
319 ret = nm_tcp_write(conn, buffer, bytes_to_send);
320 }
321
291 if (ret < 0) { 322 if (ret < 0) {
292 rc = NMERR_TCP_WRITE; 323 rc = NMERR_TCP_WRITE;
293 } 324 }
294 325
295 g_free(value); 326 g_free(value);
497 528
498 rc = nm_read_all(conn, &method, sizeof(method)); 529 rc = nm_read_all(conn, &method, sizeof(method));
499 if (rc != NM_OK) 530 if (rc != NM_OK)
500 break; 531 break;
501 532
502 rc = nm_read_all(conn, (char *) &val, sizeof(val)); 533 rc = nm_read_uint32(conn, &val);
503 if (rc != NM_OK) 534 if (rc != NM_OK)
504 break; 535 break;
505 536
506 if (val > sizeof(tag)) { 537 if (val > sizeof(tag)) {
507 rc = NMERR_PROTOCOL; 538 rc = NMERR_PROTOCOL;
513 break; 544 break;
514 545
515 if (type == NMFIELD_TYPE_MV || type == NMFIELD_TYPE_ARRAY) { 546 if (type == NMFIELD_TYPE_MV || type == NMFIELD_TYPE_ARRAY) {
516 547
517 /* Read the subarray (first read the number of items in the array) */ 548 /* Read the subarray (first read the number of items in the array) */
518 rc = nm_read_all(conn, (char *) &val, sizeof(val)); 549 rc = nm_read_uint32(conn, &val);
519 if (rc != NM_OK) 550 if (rc != NM_OK)
520 break; 551 break;
521 552
522 if (val > 0) { 553 if (val > 0) {
523 rc = nm_read_fields(conn, val, &sub_fields); 554 rc = nm_read_fields(conn, val, &sub_fields);
531 sub_fields = NULL; 562 sub_fields = NULL;
532 563
533 } else if (type == NMFIELD_TYPE_UTF8 || type == NMFIELD_TYPE_DN) { 564 } else if (type == NMFIELD_TYPE_UTF8 || type == NMFIELD_TYPE_DN) {
534 565
535 /* Read the string (first read the length) */ 566 /* Read the string (first read the length) */
536 rc = nm_read_all(conn, (char *) &val, sizeof(val)); 567 rc = nm_read_uint32(conn, &val);
537 if (rc != NM_OK) 568 if (rc != NM_OK)
538 break; 569 break;
539 570
540 if (val >= NMFIELD_MAX_STR_LENGTH) { 571 if (val >= NMFIELD_MAX_STR_LENGTH) {
541 rc = NMERR_PROTOCOL; 572 rc = NMERR_PROTOCOL;
555 } 586 }
556 587
557 } else { 588 } else {
558 589
559 /* Read the numerical value */ 590 /* Read the numerical value */
560 rc = nm_read_all(conn, (char *) &val, sizeof(val)); 591 rc = nm_read_uint32(conn, &val);
561 if (rc != NM_OK) 592 if (rc != NM_OK)
562 break; 593 break;
563 594
564 *fields = nm_add_field(*fields, tag, 0, method, 0, val, type); 595 *fields = nm_add_field(*fields, tag, 0, method, 0, val, type);
565 } 596 }