mirror of
https://github.com/postgres/postgres.git
synced 2025-11-10 17:42:29 +03:00
Add Unix domain socket support, from Goran Thyni, goran@bildbasen.se
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.22 1997/09/08 21:43:45 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.23 1997/11/07 20:51:27 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -855,8 +855,8 @@ authident(const char DataDir[],
|
||||
|
||||
/* The username returned by ident */
|
||||
|
||||
ident(port.raddr.sin_addr, port.laddr.sin_addr,
|
||||
port.raddr.sin_port, port.laddr.sin_port,
|
||||
ident(port.raddr.in.sin_addr, port.laddr.in.sin_addr,
|
||||
port.raddr.in.sin_port, port.laddr.in.sin_port,
|
||||
&ident_failed, ident_username);
|
||||
|
||||
if (ident_failed)
|
||||
@@ -906,10 +906,13 @@ hba_recvauth(const Port *port, const char database[], const char user[],
|
||||
*/
|
||||
int retvalue;
|
||||
|
||||
/* UNIX socket always OK, for now */
|
||||
if(port->raddr.in.sin_family == AF_UNIX)
|
||||
return STATUS_OK;
|
||||
/* Our eventual return value */
|
||||
|
||||
|
||||
|
||||
find_hba_entry(DataDir, port->raddr.sin_addr, database,
|
||||
find_hba_entry(DataDir, port->raddr.in.sin_addr, database,
|
||||
&host_ok, &userauth, usermap_name,
|
||||
false /* don't find password entries of type
|
||||
'password' */ );
|
||||
|
||||
@@ -26,7 +26,7 @@ verify_password(char *user, char *password, Port *port,
|
||||
*test_pw;
|
||||
char salt[3];
|
||||
|
||||
find_hba_entry(DataDir, port->raddr.sin_addr, database,
|
||||
find_hba_entry(DataDir, port->raddr.in.sin_addr, database,
|
||||
&host_ok, &userauth, pw_file_name, true);
|
||||
|
||||
if (!host_ok)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.23 1997/09/18 20:20:39 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.24 1997/11/07 20:51:34 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -571,20 +571,27 @@ pq_async_notify()
|
||||
*
|
||||
* RETURNS: STATUS_OK or STATUS_ERROR
|
||||
*/
|
||||
|
||||
static char sock_path[100] = "";
|
||||
|
||||
static void do_unlink()
|
||||
{
|
||||
if (sock_path[0]) unlink(sock_path);
|
||||
}
|
||||
|
||||
int
|
||||
StreamServerPort(char *hostName, short portName, int *fdP)
|
||||
{
|
||||
struct sockaddr_in sin;
|
||||
int fd;
|
||||
struct sockaddr_un sun;
|
||||
int fd, err, family;
|
||||
int one = 1;
|
||||
|
||||
|
||||
if (!hostName)
|
||||
hostName = "localhost";
|
||||
family = hostName != NULL ? AF_INET : AF_UNIX;
|
||||
|
||||
MemSet((char *) &sin, 0, sizeof sin);
|
||||
|
||||
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
if ((fd = socket(family, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
sprintf(PQerrormsg,
|
||||
"FATAL: StreamServerPort: socket() failed: errno=%d\n",
|
||||
@@ -593,7 +600,7 @@ StreamServerPort(char *hostName, short portName, int *fdP)
|
||||
pqdebug("%s", PQerrormsg);
|
||||
return (STATUS_ERROR);
|
||||
}
|
||||
|
||||
if (family == AF_UNIX) on_exitpg(do_unlink, (caddr_t) 0);
|
||||
if ((setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &one,
|
||||
sizeof(one))) == -1)
|
||||
{
|
||||
@@ -604,11 +611,24 @@ StreamServerPort(char *hostName, short portName, int *fdP)
|
||||
pqdebug("%s", PQerrormsg);
|
||||
return (STATUS_ERROR);
|
||||
}
|
||||
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_port = htons(portName);
|
||||
|
||||
if (bind(fd, (struct sockaddr *) & sin, sizeof sin) < 0)
|
||||
if (family == AF_UNIX)
|
||||
{
|
||||
size_t len;
|
||||
bzero(&sun, sizeof(sun));
|
||||
sun.sun_family = family;
|
||||
len = UNIXSOCK_PATH(sun,portName);
|
||||
strcpy(sock_path, sun.sun_path);
|
||||
err = bind(fd, (struct sockaddr *) &sun, len);
|
||||
}
|
||||
else
|
||||
{
|
||||
bzero(&sin, sizeof(sin));
|
||||
sin.sin_family = family;
|
||||
sin.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
sin.sin_port = htons(portName);
|
||||
err = bind(fd, (struct sockaddr *) &sin, sizeof sin);
|
||||
}
|
||||
if (err < 0)
|
||||
{
|
||||
sprintf(PQerrormsg,
|
||||
"FATAL: StreamServerPort: bind() failed: errno=%d\n",
|
||||
@@ -645,26 +665,30 @@ StreamServerPort(char *hostName, short portName, int *fdP)
|
||||
int
|
||||
StreamConnection(int server_fd, Port *port)
|
||||
{
|
||||
int addrlen;
|
||||
int len, addrlen;
|
||||
int family = port->raddr.in.sin_family;
|
||||
|
||||
/* accept connection (and fill in the client (remote) address) */
|
||||
addrlen = sizeof(struct sockaddr_in);
|
||||
len = family == AF_INET ?
|
||||
sizeof(struct sockaddr_in) : sizeof(struct sockaddr_un);
|
||||
addrlen = len;
|
||||
if ((port->sock = accept(server_fd,
|
||||
(struct sockaddr *) & port->raddr,
|
||||
&addrlen)) < 0)
|
||||
(struct sockaddr *) & port->raddr,
|
||||
&addrlen)) < 0)
|
||||
{
|
||||
elog(WARN, "postmaster: StreamConnection: accept: %m");
|
||||
return (STATUS_ERROR);
|
||||
}
|
||||
|
||||
|
||||
/* fill in the server (local) address */
|
||||
addrlen = sizeof(struct sockaddr_in);
|
||||
addrlen = len;
|
||||
if (getsockname(port->sock, (struct sockaddr *) & port->laddr,
|
||||
&addrlen) < 0)
|
||||
{
|
||||
elog(WARN, "postmaster: StreamConnection: getsockname: %m");
|
||||
return (STATUS_ERROR);
|
||||
}
|
||||
if (family == AF_INET)
|
||||
{
|
||||
struct protoent *pe;
|
||||
int on = 1;
|
||||
@@ -714,45 +738,50 @@ StreamClose(int sock)
|
||||
int
|
||||
StreamOpen(char *hostName, short portName, Port *port)
|
||||
{
|
||||
int len, err;
|
||||
struct hostent *hp;
|
||||
int laddrlen = sizeof(struct sockaddr_in);
|
||||
extern int errno;
|
||||
|
||||
if (!hostName)
|
||||
hostName = "localhost";
|
||||
|
||||
|
||||
/* set up the server (remote) address */
|
||||
if (!(hp = gethostbyname(hostName)) || hp->h_addrtype != AF_INET)
|
||||
{
|
||||
MemSet((char *) &port->raddr, 0, sizeof(port->raddr));
|
||||
if (hostName)
|
||||
{
|
||||
if (!(hp = gethostbyname(hostName)) || hp->h_addrtype != AF_INET)
|
||||
{
|
||||
sprintf(PQerrormsg,
|
||||
"FATAL: StreamOpen: unknown hostname: %s\n",
|
||||
hostName);
|
||||
"FATAL: StreamOpen: unknown hostname: %s\n",
|
||||
hostName);
|
||||
fputs(PQerrormsg, stderr);
|
||||
pqdebug("%s", PQerrormsg);
|
||||
return (STATUS_ERROR);
|
||||
}
|
||||
MemSet((char *) &port->raddr, 0, sizeof(port->raddr));
|
||||
memmove((char *) &(port->raddr.sin_addr),
|
||||
(char *) hp->h_addr,
|
||||
hp->h_length);
|
||||
port->raddr.sin_family = AF_INET;
|
||||
port->raddr.sin_port = htons(portName);
|
||||
|
||||
}
|
||||
memmove((char *) &(port->raddr.in.sin_addr),
|
||||
(char *) hp->h_addr,
|
||||
hp->h_length);
|
||||
port->raddr.in.sin_family = AF_INET;
|
||||
port->raddr.in.sin_port = htons(portName);
|
||||
len = sizeof(struct sockaddr_in);
|
||||
}
|
||||
else
|
||||
{
|
||||
port->raddr.un.sun_family = AF_UNIX;
|
||||
len = UNIXSOCK_PATH(port->raddr.un,portName);
|
||||
}
|
||||
/* connect to the server */
|
||||
if ((port->sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
if ((port->sock=socket(port->raddr.in.sin_family, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
sprintf(PQerrormsg,
|
||||
"FATAL: StreamOpen: socket() failed: errno=%d\n",
|
||||
"FATAL: StreamOpen: socket() failed: errno=%d\n",
|
||||
errno);
|
||||
fputs(PQerrormsg, stderr);
|
||||
pqdebug("%s", PQerrormsg);
|
||||
return (STATUS_ERROR);
|
||||
}
|
||||
if (connect(port->sock, (struct sockaddr *) & port->raddr,
|
||||
sizeof(port->raddr)) < 0)
|
||||
err = connect(port->sock, (struct sockaddr*) &port->raddr, len);
|
||||
if (err < 0)
|
||||
{
|
||||
sprintf(PQerrormsg,
|
||||
"FATAL: StreamOpen: connect() failed: errno=%d\n",
|
||||
"FATAL: StreamOpen: connect() failed: errno=%d\n",
|
||||
errno);
|
||||
fputs(PQerrormsg, stderr);
|
||||
pqdebug("%s", PQerrormsg);
|
||||
@@ -761,7 +790,7 @@ StreamOpen(char *hostName, short portName, Port *port)
|
||||
|
||||
/* fill in the client address */
|
||||
if (getsockname(port->sock, (struct sockaddr *) & port->laddr,
|
||||
&laddrlen) < 0)
|
||||
&len) < 0)
|
||||
{
|
||||
sprintf(PQerrormsg,
|
||||
"FATAL: StreamOpen: getsockname() failed: errno=%d\n",
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/libpq/Attic/pqpacket.c,v 1.8 1997/09/08 21:43:52 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/libpq/Attic/pqpacket.c,v 1.9 1997/11/07 20:51:36 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -85,7 +85,7 @@ PacketReceive(Port *port, /* receive port */
|
||||
|
||||
/*
|
||||
* Assume port->nBytes is zero unless we were interrupted during
|
||||
* non-blocking I/O. This first recvfrom() is to get the hdr
|
||||
* non-blocking I/O. This first recv() is to get the hdr
|
||||
* information so we know how many bytes to read. Life would be very
|
||||
* complicated if we read too much data (buffering).
|
||||
*/
|
||||
@@ -98,8 +98,7 @@ PacketReceive(Port *port, /* receive port */
|
||||
else
|
||||
{
|
||||
/* peeking into the incoming message */
|
||||
cc = recvfrom(port->sock, (char *) &(buf->len), hdrLen, flag,
|
||||
(struct sockaddr *) & (port->raddr), &addrLen);
|
||||
cc = recv(port->sock, (char *) &(buf->len), hdrLen, flag);
|
||||
if (cc < hdrLen)
|
||||
{
|
||||
/* if cc is negative, the system call failed */
|
||||
@@ -179,8 +178,7 @@ PacketReceive(Port *port, /* receive port */
|
||||
*/
|
||||
while (packetLen)
|
||||
{
|
||||
cc = recvfrom(port->sock, tmp, packetLen, 0,
|
||||
(struct sockaddr *) & (port->raddr), &addrLen);
|
||||
cc = read(port->sock, tmp, packetLen);
|
||||
if (cc < 0)
|
||||
return (STATUS_ERROR);
|
||||
|
||||
@@ -224,18 +222,13 @@ PacketSend(Port *port,
|
||||
PacketLen len,
|
||||
bool nonBlocking)
|
||||
{
|
||||
PacketLen totalLen;
|
||||
int addrLen = sizeof(struct sockaddr_in);
|
||||
PacketLen doneLen;
|
||||
|
||||
Assert(!nonBlocking);
|
||||
Assert(buf);
|
||||
|
||||
totalLen = len;
|
||||
|
||||
len = sendto(port->sock, (Addr) buf, totalLen, /* flags */ 0,
|
||||
(struct sockaddr *) & (port->raddr), addrLen);
|
||||
|
||||
if (len < totalLen)
|
||||
doneLen = write(port->sock, buf, len);
|
||||
if (doneLen < len)
|
||||
{
|
||||
sprintf(PQerrormsg,
|
||||
"FATAL: PacketSend: couldn't send complete packet: errno=%d\n",
|
||||
|
||||
Reference in New Issue
Block a user