| | 385 | #define SOCKET int |
|---|
| | 386 | #define SOCKET_ERRNO errno |
|---|
| | 387 | #define SOCKET_EINTR EINTR |
|---|
| | 388 | #define SOCKET_READ(a,b,c) read(a,b,c) |
|---|
| | 389 | #define SOCKET_WRITE(a,b,c) write(a,b,c) |
|---|
| | 390 | #define krb5_xfree(a) free((char*)(a)) |
|---|
| | 391 | /* |
|---|
| | 392 | * lib/krb5/os/net_read.c |
|---|
| | 393 | * |
|---|
| | 394 | * Copyright 1987, 1988, 1990 by the Massachusetts Institute of Technology. |
|---|
| | 395 | * All Rights Reserved. |
|---|
| | 396 | * |
|---|
| | 397 | * Export of this software from the United States of America may |
|---|
| | 398 | * require a specific license from the United States Government. |
|---|
| | 399 | * It is the responsibility of any person or organization contemplating |
|---|
| | 400 | * export to obtain such a license before exporting. |
|---|
| | 401 | * |
|---|
| | 402 | * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and |
|---|
| | 403 | * distribute this software and its documentation for any purpose and |
|---|
| | 404 | * without fee is hereby granted, provided that the above copyright |
|---|
| | 405 | * notice appear in all copies and that both that copyright notice and |
|---|
| | 406 | * this permission notice appear in supporting documentation, and that |
|---|
| | 407 | * the name of M.I.T. not be used in advertising or publicity pertaining |
|---|
| | 408 | * to distribution of the software without specific, written prior |
|---|
| | 409 | * permission. Furthermore if you modify this software you must label |
|---|
| | 410 | * your software as modified software and not distribute it in such a |
|---|
| | 411 | * fashion that it might be confused with the original M.I.T. software. |
|---|
| | 412 | * M.I.T. makes no representations about the suitability of |
|---|
| | 413 | * this software for any purpose. It is provided "as is" without express |
|---|
| | 414 | * or implied warranty. |
|---|
| | 415 | * |
|---|
| | 416 | */ |
|---|
| | 417 | |
|---|
| | 418 | /* |
|---|
| | 419 | * krb5_net_read() reads from the file descriptor "fd" to the buffer |
|---|
| | 420 | * "buf", until either 1) "len" bytes have been read or 2) cannot |
|---|
| | 421 | * read anymore from "fd". It returns the number of bytes read |
|---|
| | 422 | * or a read() error. (The calling interface is identical to |
|---|
| | 423 | * read(2).) |
|---|
| | 424 | * |
|---|
| | 425 | * XXX must not use non-blocking I/O |
|---|
| | 426 | */ |
|---|
| | 427 | |
|---|
| | 428 | int |
|---|
| | 429 | krb5_net_read(krb5_context context, int fd, register char *buf, register int len) |
|---|
| | 430 | { |
|---|
| | 431 | int cc, len2 = 0; |
|---|
| | 432 | |
|---|
| | 433 | do { |
|---|
| | 434 | cc = SOCKET_READ((SOCKET)fd, buf, len); |
|---|
| | 435 | if (cc < 0) { |
|---|
| | 436 | if (SOCKET_ERRNO == SOCKET_EINTR) |
|---|
| | 437 | continue; |
|---|
| | 438 | |
|---|
| | 439 | /* XXX this interface sucks! */ |
|---|
| | 440 | errno = SOCKET_ERRNO; |
|---|
| | 441 | |
|---|
| | 442 | return(cc); /* errno is already set */ |
|---|
| | 443 | } |
|---|
| | 444 | else if (cc == 0) { |
|---|
| | 445 | return(len2); |
|---|
| | 446 | } else { |
|---|
| | 447 | buf += cc; |
|---|
| | 448 | len2 += cc; |
|---|
| | 449 | len -= cc; |
|---|
| | 450 | } |
|---|
| | 451 | } while (len > 0); |
|---|
| | 452 | return(len2); |
|---|
| | 453 | } |
|---|
| | 454 | /* |
|---|
| | 455 | * lib/krb5/os/net_write.c |
|---|
| | 456 | * |
|---|
| | 457 | * Copyright 1987, 1988, 1990 by the Massachusetts Institute of Technology. |
|---|
| | 458 | * All Rights Reserved. |
|---|
| | 459 | * |
|---|
| | 460 | * Export of this software from the United States of America may |
|---|
| | 461 | * require a specific license from the United States Government. |
|---|
| | 462 | * It is the responsibility of any person or organization contemplating |
|---|
| | 463 | * export to obtain such a license before exporting. |
|---|
| | 464 | * |
|---|
| | 465 | * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and |
|---|
| | 466 | * distribute this software and its documentation for any purpose and |
|---|
| | 467 | * without fee is hereby granted, provided that the above copyright |
|---|
| | 468 | * notice appear in all copies and that both that copyright notice and |
|---|
| | 469 | * this permission notice appear in supporting documentation, and that |
|---|
| | 470 | * the name of M.I.T. not be used in advertising or publicity pertaining |
|---|
| | 471 | * to distribution of the software without specific, written prior |
|---|
| | 472 | * permission. Furthermore if you modify this software you must label |
|---|
| | 473 | * your software as modified software and not distribute it in such a |
|---|
| | 474 | * fashion that it might be confused with the original M.I.T. software. |
|---|
| | 475 | * M.I.T. makes no representations about the suitability of |
|---|
| | 476 | * this software for any purpose. It is provided "as is" without express |
|---|
| | 477 | * or implied warranty. |
|---|
| | 478 | * |
|---|
| | 479 | */ |
|---|
| | 480 | |
|---|
| | 481 | /* |
|---|
| | 482 | * krb5_net_write() writes "len" bytes from "buf" to the file |
|---|
| | 483 | * descriptor "fd". It returns the number of bytes written or |
|---|
| | 484 | * a write() error. (The calling interface is identical to |
|---|
| | 485 | * write(2).) |
|---|
| | 486 | * |
|---|
| | 487 | * XXX must not use non-blocking I/O |
|---|
| | 488 | */ |
|---|
| | 489 | |
|---|
| | 490 | int |
|---|
| | 491 | krb5_net_write(krb5_context context, int fd, register const char *buf, int len) |
|---|
| | 492 | { |
|---|
| | 493 | int cc; |
|---|
| | 494 | register int wrlen = len; |
|---|
| | 495 | do { |
|---|
| | 496 | cc = SOCKET_WRITE((SOCKET)fd, buf, wrlen); |
|---|
| | 497 | if (cc < 0) { |
|---|
| | 498 | if (SOCKET_ERRNO == SOCKET_EINTR) |
|---|
| | 499 | continue; |
|---|
| | 500 | |
|---|
| | 501 | /* XXX this interface sucks! */ |
|---|
| | 502 | errno = SOCKET_ERRNO; |
|---|
| | 503 | |
|---|
| | 504 | return(cc); |
|---|
| | 505 | } |
|---|
| | 506 | else { |
|---|
| | 507 | buf += cc; |
|---|
| | 508 | wrlen -= cc; |
|---|
| | 509 | } |
|---|
| | 510 | } while (wrlen > 0); |
|---|
| | 511 | return(len); |
|---|
| | 512 | } |
|---|
| | 513 | /* |
|---|
| | 514 | * lib/krb5/os/read_msg.c |
|---|
| | 515 | * |
|---|
| | 516 | * Copyright 1991 by the Massachusetts Institute of Technology. |
|---|
| | 517 | * All Rights Reserved. |
|---|
| | 518 | * |
|---|
| | 519 | * Export of this software from the United States of America may |
|---|
| | 520 | * require a specific license from the United States Government. |
|---|
| | 521 | * It is the responsibility of any person or organization contemplating |
|---|
| | 522 | * export to obtain such a license before exporting. |
|---|
| | 523 | * |
|---|
| | 524 | * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and |
|---|
| | 525 | * distribute this software and its documentation for any purpose and |
|---|
| | 526 | * without fee is hereby granted, provided that the above copyright |
|---|
| | 527 | * notice appear in all copies and that both that copyright notice and |
|---|
| | 528 | * this permission notice appear in supporting documentation, and that |
|---|
| | 529 | * the name of M.I.T. not be used in advertising or publicity pertaining |
|---|
| | 530 | * to distribution of the software without specific, written prior |
|---|
| | 531 | * permission. Furthermore if you modify this software you must label |
|---|
| | 532 | * your software as modified software and not distribute it in such a |
|---|
| | 533 | * fashion that it might be confused with the original M.I.T. software. |
|---|
| | 534 | * M.I.T. makes no representations about the suitability of |
|---|
| | 535 | * this software for any purpose. It is provided "as is" without express |
|---|
| | 536 | * or implied warranty. |
|---|
| | 537 | * |
|---|
| | 538 | * |
|---|
| | 539 | * Write a message to the network |
|---|
| | 540 | */ |
|---|
| | 541 | |
|---|
| | 542 | krb5_error_code |
|---|
| | 543 | krb5_read_message(krb5_context context, krb5_pointer fdp, krb5_data *inbuf) |
|---|
| | 544 | { |
|---|
| | 545 | krb5_int32 len; |
|---|
| | 546 | int len2, ilen; |
|---|
| | 547 | char *buf = NULL; |
|---|
| | 548 | int fd = *( (int *) fdp); |
|---|
| | 549 | |
|---|
| | 550 | if ((len2 = krb5_net_read(context, fd, (char *)&len, 4)) != 4) |
|---|
| | 551 | return((len2 < 0) ? errno : ECONNABORTED); |
|---|
| | 552 | len = ntohl(len); |
|---|
| | 553 | |
|---|
| | 554 | if ((len & VALID_UINT_BITS) != len) /* Overflow size_t??? */ |
|---|
| | 555 | return ENOMEM; |
|---|
| | 556 | |
|---|
| | 557 | inbuf->length = ilen = (int) len; |
|---|
| | 558 | if (ilen) { |
|---|
| | 559 | /* |
|---|
| | 560 | * We may want to include a sanity check here someday.... |
|---|
| | 561 | */ |
|---|
| | 562 | if (!(buf = malloc(ilen))) { |
|---|
| | 563 | return(ENOMEM); |
|---|
| | 564 | } |
|---|
| | 565 | if ((len2 = krb5_net_read(context, fd, buf, ilen)) != ilen) { |
|---|
| | 566 | krb5_xfree(buf); |
|---|
| | 567 | return((len2 < 0) ? errno : ECONNABORTED); |
|---|
| | 568 | } |
|---|
| | 569 | } |
|---|
| | 570 | inbuf->data = buf; |
|---|
| | 571 | return(0); |
|---|
| | 572 | } |
|---|
| | 573 | /* |
|---|
| | 574 | * lib/krb5/os/write_msg.c |
|---|
| | 575 | * |
|---|
| | 576 | * Copyright 1991 by the Massachusetts Institute of Technology. |
|---|
| | 577 | * All Rights Reserved. |
|---|
| | 578 | * |
|---|
| | 579 | * Export of this software from the United States of America may |
|---|
| | 580 | * require a specific license from the United States Government. |
|---|
| | 581 | * It is the responsibility of any person or organization contemplating |
|---|
| | 582 | * export to obtain such a license before exporting. |
|---|
| | 583 | * |
|---|
| | 584 | * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and |
|---|
| | 585 | * distribute this software and its documentation for any purpose and |
|---|
| | 586 | * without fee is hereby granted, provided that the above copyright |
|---|
| | 587 | * notice appear in all copies and that both that copyright notice and |
|---|
| | 588 | * this permission notice appear in supporting documentation, and that |
|---|
| | 589 | * the name of M.I.T. not be used in advertising or publicity pertaining |
|---|
| | 590 | * to distribution of the software without specific, written prior |
|---|
| | 591 | * permission. Furthermore if you modify this software you must label |
|---|
| | 592 | * your software as modified software and not distribute it in such a |
|---|
| | 593 | * fashion that it might be confused with the original M.I.T. software. |
|---|
| | 594 | * M.I.T. makes no representations about the suitability of |
|---|
| | 595 | * this software for any purpose. It is provided "as is" without express |
|---|
| | 596 | * or implied warranty. |
|---|
| | 597 | * |
|---|
| | 598 | * |
|---|
| | 599 | * convenience sendauth/recvauth functions |
|---|
| | 600 | */ |
|---|
| | 601 | |
|---|
| | 602 | krb5_error_code |
|---|
| | 603 | krb5_write_message(krb5_context context, krb5_pointer fdp, krb5_data *outbuf) |
|---|
| | 604 | { |
|---|
| | 605 | krb5_int32 len; |
|---|
| | 606 | int fd = *( (int *) fdp); |
|---|
| | 607 | |
|---|
| | 608 | len = htonl(outbuf->length); |
|---|
| | 609 | if (krb5_net_write(context, fd, (char *)&len, 4) < 0) { |
|---|
| | 610 | return(errno); |
|---|
| | 611 | } |
|---|
| | 612 | if (outbuf->length && (krb5_net_write(context, fd, outbuf->data, outbuf->length) < 0)) { |
|---|
| | 613 | return(errno); |
|---|
| | 614 | } |
|---|
| | 615 | return(0); |
|---|
| | 616 | } |
|---|
| | 617 | |
|---|
| | 618 | |
|---|