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