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)