77 *
88 *
99 * IDENTIFICATION
10- * $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.23 1997/09/18 20:20:39 momjian Exp $
10+ * $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.24 1997/11/07 20:51:34 momjian Exp $
1111 *
1212 *-------------------------------------------------------------------------
1313 */
@@ -571,20 +571,27 @@ pq_async_notify()
571571 *
572572 * RETURNS: STATUS_OK or STATUS_ERROR
573573 */
574+
575+ static char sock_path [100 ]= "" ;
576+
577+ static void do_unlink ()
578+ {
579+ if (sock_path [0 ])unlink (sock_path );
580+ }
581+
574582int
575583StreamServerPort (char * hostName ,short portName ,int * fdP )
576584{
577585struct sockaddr_in sin ;
578- int fd ;
586+ struct sockaddr_un sun ;
587+ int fd ,err ,family ;
579588int one = 1 ;
580589
581-
582- if (!hostName )
583- hostName = "localhost" ;
590+ family = hostName != NULL ?AF_INET :AF_UNIX ;
584591
585592MemSet ((char * )& sin ,0 ,sizeof sin );
586593
587- if ((fd = socket (AF_INET ,SOCK_STREAM ,0 ))< 0 )
594+ if ((fd = socket (family ,SOCK_STREAM ,0 ))< 0 )
588595{
589596sprintf (PQerrormsg ,
590597"FATAL: StreamServerPort: socket() failed: errno=%d\n" ,
@@ -593,7 +600,7 @@ StreamServerPort(char *hostName, short portName, int *fdP)
593600pqdebug ("%s" ,PQerrormsg );
594601return (STATUS_ERROR );
595602}
596-
603+ if ( family == AF_UNIX ) on_exitpg ( do_unlink , ( caddr_t ) 0 );
597604if ((setsockopt (fd ,SOL_SOCKET ,SO_REUSEADDR , (char * )& one ,
598605sizeof (one )))== -1 )
599606{
@@ -604,11 +611,24 @@ StreamServerPort(char *hostName, short portName, int *fdP)
604611pqdebug ("%s" ,PQerrormsg );
605612return (STATUS_ERROR );
606613}
607-
608- sin .sin_family = AF_INET ;
609- sin .sin_port = htons (portName );
610-
611- if (bind (fd , (struct sockaddr * )& sin ,sizeof sin )< 0 )
614+ if (family == AF_UNIX )
615+ {
616+ size_t len ;
617+ bzero (& sun ,sizeof (sun ));
618+ sun .sun_family = family ;
619+ len = UNIXSOCK_PATH (sun ,portName );
620+ strcpy (sock_path ,sun .sun_path );
621+ err = bind (fd , (struct sockaddr * )& sun ,len );
622+ }
623+ else
624+ {
625+ bzero (& sin ,sizeof (sin ));
626+ sin .sin_family = family ;
627+ sin .sin_addr .s_addr = htonl (INADDR_ANY );
628+ sin .sin_port = htons (portName );
629+ err = bind (fd , (struct sockaddr * )& sin ,sizeof sin );
630+ }
631+ if (err < 0 )
612632{
613633sprintf (PQerrormsg ,
614634"FATAL: StreamServerPort: bind() failed: errno=%d\n" ,
@@ -645,26 +665,30 @@ StreamServerPort(char *hostName, short portName, int *fdP)
645665int
646666StreamConnection (int server_fd ,Port * port )
647667{
648- int addrlen ;
668+ int len ,addrlen ;
669+ int family = port -> raddr .in .sin_family ;
649670
650671/* accept connection (and fill in the client (remote) address) */
651- addrlen = sizeof (struct sockaddr_in );
672+ len = family == AF_INET ?
673+ sizeof (struct sockaddr_in ) :sizeof (struct sockaddr_un );
674+ addrlen = len ;
652675if ((port -> sock = accept (server_fd ,
653- (struct sockaddr * )& port -> raddr ,
654- & addrlen ))< 0 )
676+ (struct sockaddr * )& port -> raddr ,
677+ & addrlen ))< 0 )
655678{
656679elog (WARN ,"postmaster: StreamConnection: accept: %m" );
657680return (STATUS_ERROR );
658681}
659-
682+
660683/* fill in the server (local) address */
661- addrlen = sizeof ( struct sockaddr_in ) ;
684+ addrlen = len ;
662685if (getsockname (port -> sock , (struct sockaddr * )& port -> laddr ,
663686& addrlen )< 0 )
664687{
665688elog (WARN ,"postmaster: StreamConnection: getsockname: %m" );
666689return (STATUS_ERROR );
667690}
691+ if (family == AF_INET )
668692{
669693struct protoent * pe ;
670694int on = 1 ;
@@ -714,45 +738,50 @@ StreamClose(int sock)
714738int
715739StreamOpen (char * hostName ,short portName ,Port * port )
716740{
741+ int len ,err ;
717742struct hostent * hp ;
718- int laddrlen = sizeof (struct sockaddr_in );
719743extern int errno ;
720-
721- if (!hostName )
722- hostName = "localhost" ;
723-
744+
724745/* set up the server (remote) address */
725- if (!(hp = gethostbyname (hostName ))|| hp -> h_addrtype != AF_INET )
726- {
746+ MemSet ((char * )& port -> raddr ,0 ,sizeof (port -> raddr ));
747+ if (hostName )
748+ {
749+ if (!(hp = gethostbyname (hostName ))|| hp -> h_addrtype != AF_INET )
750+ {
727751sprintf (PQerrormsg ,
728- "FATAL: StreamOpen: unknown hostname: %s\n" ,
729- hostName );
752+ "FATAL: StreamOpen: unknown hostname: %s\n" ,
753+ hostName );
730754fputs (PQerrormsg ,stderr );
731755pqdebug ("%s" ,PQerrormsg );
732756return (STATUS_ERROR );
733- }
734- MemSet ((char * )& port -> raddr ,0 ,sizeof (port -> raddr ));
735- memmove ((char * )& (port -> raddr .sin_addr ),
736- (char * )hp -> h_addr ,
737- hp -> h_length );
738- port -> raddr .sin_family = AF_INET ;
739- port -> raddr .sin_port = htons (portName );
740-
757+ }
758+ memmove ((char * )& (port -> raddr .in .sin_addr ),
759+ (char * )hp -> h_addr ,
760+ hp -> h_length );
761+ port -> raddr .in .sin_family = AF_INET ;
762+ port -> raddr .in .sin_port = htons (portName );
763+ len = sizeof (struct sockaddr_in );
764+ }
765+ else
766+ {
767+ port -> raddr .un .sun_family = AF_UNIX ;
768+ len = UNIXSOCK_PATH (port -> raddr .un ,portName );
769+ }
741770/* connect to the server */
742- if ((port -> sock = socket (AF_INET ,SOCK_STREAM ,0 ))< 0 )
771+ if ((port -> sock = socket (port -> raddr . in . sin_family ,SOCK_STREAM ,0 ))< 0 )
743772{
744773sprintf (PQerrormsg ,
745- "FATAL: StreamOpen: socket() failed: errno=%d\n" ,
774+ "FATAL: StreamOpen: socket() failed: errno=%d\n" ,
746775errno );
747776fputs (PQerrormsg ,stderr );
748777pqdebug ("%s" ,PQerrormsg );
749778return (STATUS_ERROR );
750779}
751- if ( connect (port -> sock , (struct sockaddr * )& port -> raddr ,
752- sizeof ( port -> raddr )) < 0 )
780+ err = connect (port -> sock , (struct sockaddr * )& port -> raddr ,len );
781+ if ( err < 0 )
753782{
754783sprintf (PQerrormsg ,
755- "FATAL: StreamOpen: connect() failed: errno=%d\n" ,
784+ "FATAL: StreamOpen: connect() failed: errno=%d\n" ,
756785errno );
757786fputs (PQerrormsg ,stderr );
758787pqdebug ("%s" ,PQerrormsg );
@@ -761,7 +790,7 @@ StreamOpen(char *hostName, short portName, Port *port)
761790
762791/* fill in the client address */
763792if (getsockname (port -> sock , (struct sockaddr * )& port -> laddr ,
764- & laddrlen )< 0 )
793+ & len )< 0 )
765794{
766795sprintf (PQerrormsg ,
767796"FATAL: StreamOpen: getsockname() failed: errno=%d\n" ,