PostgreSQL Source Code: src/interfaces/libpq/fe-cancel.c File Reference (original) (raw)

531{

534 int maxlen;

535 char recvbuf;

536 int cancel_pkt_len;

537

538 if (!cancel)

539 {

540 strlcpy(errbuf, "PQcancel() -- no cancel object supplied", errbufsize);

541

543 return false;

544 }

545

546

547

548

549

551 {

552 strlcpy(errbuf, "PQcancel() -- socket() failed: ", errbufsize);

553 goto cancel_errReturn;

554 }

555

556

557

558

559

560

561

562

563

564

565

566 if (cancel->raddr.addr.ss_family != AF_UNIX &&

568 {

569#ifndef WIN32

571 {

572 strlcpy(errbuf, "PQcancel() -- setsockopt(SO_KEEPALIVE) failed: ", errbufsize);

573 goto cancel_errReturn;

574 }

575

576#ifdef PG_TCP_KEEPALIVE_IDLE

579 {

580 strlcpy(errbuf, "PQcancel() -- setsockopt(" PG_TCP_KEEPALIVE_IDLE_STR ") failed: ", errbufsize);

581 goto cancel_errReturn;

582 }

583#endif

584

585#ifdef TCP_KEEPINTVL

588 {

589 strlcpy(errbuf, "PQcancel() -- setsockopt(TCP_KEEPINTVL) failed: ", errbufsize);

590 goto cancel_errReturn;

591 }

592#endif

593

594#ifdef TCP_KEEPCNT

597 {

598 strlcpy(errbuf, "PQcancel() -- setsockopt(TCP_KEEPCNT) failed: ", errbufsize);

599 goto cancel_errReturn;

600 }

601#endif

602

603#else

604

605#ifdef SIO_KEEPALIVE_VALS

606 if (!pqSetKeepalivesWin32(tmpsock,

609 {

610 strlcpy(errbuf, "PQcancel() -- WSAIoctl(SIO_KEEPALIVE_VALS) failed: ", errbufsize);

611 goto cancel_errReturn;

612 }

613#endif

614#endif

615

616

617#ifdef TCP_USER_TIMEOUT

620 {

621 strlcpy(errbuf, "PQcancel() -- setsockopt(TCP_USER_TIMEOUT) failed: ", errbufsize);

622 goto cancel_errReturn;

623 }

624#endif

625 }

626

627retry3:

628 if (connect(tmpsock, (struct sockaddr *) &cancel->raddr.addr,

630 {

632

633 goto retry3;

634 strlcpy(errbuf, "PQcancel() -- connect() failed: ", errbufsize);

635 goto cancel_errReturn;

636 }

637

639

640retry4:

641

642

643

644

645

646 if (send(tmpsock, (char *) &cancel->cancel_pkt_len, cancel_pkt_len, 0) != cancel_pkt_len)

647 {

649

650 goto retry4;

651 strlcpy(errbuf, "PQcancel() -- send() failed: ", errbufsize);

652 goto cancel_errReturn;

653 }

654

655

656

657

658

659

660

661

662retry5:

663 if (recv(tmpsock, &recvbuf, 1, 0) < 0)

664 {

666

667 goto retry5;

668

669 }

670

671

674 return true;

675

676cancel_errReturn:

677

678

679

680

681

682 maxlen = errbufsize - strlen(errbuf) - 2;

683 if (maxlen >= 0)

684 {

685

686

687

688

689

691 char buf[32];

692 char *bufp;

693

694 bufp = buf + sizeof(buf) - 1;

695 *bufp = '\0';

696 do

697 {

698 *(--bufp) = (val % 10) + '0';

699 val /= 10;

700 } while (val > 0);

701 bufp -= 6;

702 memcpy(bufp, "error ", 6);

703 strncat(errbuf, bufp, maxlen);

704 strcat(errbuf, "\n");

705 }

709 return false;

710}

static bool optional_setsockopt(int fd, int protoid, int optid, int value)

#define SOCK_ERRNO_SET(e)

size_t strlcpy(char *dst, const char *src, size_t siz)

struct sockaddr_storage addr

#define recv(s, buf, len, flags)

#define send(s, buf, len, flags)

#define socket(af, type, protocol)

#define connect(s, name, namelen)