aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/network.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/network.c')
-rw-r--r--src/backend/utils/adt/network.c67
1 files changed, 47 insertions, 20 deletions
diff --git a/src/backend/utils/adt/network.c b/src/backend/utils/adt/network.c
index 213bf5d2f66..d238098c259 100644
--- a/src/backend/utils/adt/network.c
+++ b/src/backend/utils/adt/network.c
@@ -1,7 +1,7 @@
/*
* PostgreSQL type definitions for the INET and CIDR types.
*
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/network.c,v 1.42 2003/06/24 22:21:22 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/network.c,v 1.43 2003/07/27 04:53:07 tgl Exp $
*
* Jon Postel RIP 16 Oct 1998
*/
@@ -85,17 +85,23 @@ network_in(char *src, int type)
bits = inet_net_pton(ip_family(dst), src, ip_addr(dst),
type ? ip_addrsize(dst) : -1);
if ((bits < 0) || (bits > ip_maxbits(dst)))
- elog(ERROR, "invalid %s value '%s'",
- type ? "CIDR" : "INET", src);
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ /* translator: first %s is inet or cidr */
+ errmsg("invalid input syntax for %s: \"%s\"",
+ type ? "cidr" : "inet", src)));
- /*
+ /*
* Error check: CIDR values must not have any bits set beyond
* the masklen.
- */
- if (type)
+ */
+ if (type)
{
if (!addressOK(ip_addr(dst), bits, ip_family(dst)))
- elog(ERROR, "invalid CIDR value '%s': has bits set to right of mask", src);
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid cidr value: \"%s\"", src),
+ errdetail("Value has bits set to right of mask.")));
}
VARATT_SIZEP(dst) = VARHDRSZ
@@ -139,7 +145,10 @@ inet_out(PG_FUNCTION_ARGS)
dst = inet_net_ntop(ip_family(src), ip_addr(src), ip_bits(src),
tmp, sizeof(tmp));
if (dst == NULL)
- elog(ERROR, "unable to print address (%s)", strerror(errno));
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("could not format inet value: %m")));
+
/* For CIDR, add /n if not present */
if (ip_type(src) && strchr(tmp, '/') == NULL)
{
@@ -180,18 +189,25 @@ inet_recv(PG_FUNCTION_ARGS)
ip_family(addr) = pq_getmsgbyte(buf);
if (ip_family(addr) != AF_INET)
- elog(ERROR, "Invalid family in external inet");
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid family in external inet")));
bits = pq_getmsgbyte(buf);
if (bits < 0 || bits > ip_maxbits(addr))
- elog(ERROR, "Invalid bits in external inet");
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid bits in external inet")));
ip_bits(addr) = bits;
ip_type(addr) = pq_getmsgbyte(buf);
if (ip_type(addr) != 0 && ip_type(addr) != 1)
- elog(ERROR, "Invalid type in external inet");
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid type in external inet")));
nb = pq_getmsgbyte(buf);
if (nb != ip_addrsize(addr))
- elog(ERROR, "Invalid length in external inet");
-
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid length in external inet")));
VARATT_SIZEP(addr) = VARHDRSZ
+ ((char *)ip_addr(addr) - (char *) VARDATA(addr))
+ ip_addrsize(addr);
@@ -207,7 +223,10 @@ inet_recv(PG_FUNCTION_ARGS)
if (ip_type(addr))
{
if (!addressOK(ip_addr(addr), bits, ip_family(addr)))
- elog(ERROR, "invalid external CIDR value: has bits set to right of mask");
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid external CIDR value"),
+ errdetail("Value has bits set to right of mask.")));
}
PG_RETURN_INET_P(addr);
@@ -291,7 +310,9 @@ inet_set_masklen(PG_FUNCTION_ARGS)
bits = ip_maxbits(src);
if ((bits < 0) || (bits > ip_maxbits(src)))
- elog(ERROR, "set_masklen - invalid value '%d'", bits);
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid mask length: %d", bits)));
/* clone the original data */
dst = (inet *) palloc(VARHDRSZ + sizeof(inet_struct));
@@ -477,7 +498,9 @@ network_host(PG_FUNCTION_ARGS)
/* force display of max bits, regardless of masklen... */
if (inet_net_ntop(ip_family(ip), ip_addr(ip), ip_maxbits(ip),
tmp, sizeof(tmp)) == NULL)
- elog(ERROR, "unable to print host (%s)", strerror(errno));
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("could not format inet value: %m")));
/* Suppress /n if present (shouldn't happen now) */
if ((ptr = strchr(tmp, '/')) != NULL)
@@ -501,7 +524,10 @@ network_show(PG_FUNCTION_ARGS)
if (inet_net_ntop(ip_family(ip), ip_addr(ip), ip_maxbits(ip),
tmp, sizeof(tmp)) == NULL)
- elog(ERROR, "unable to print host (%s)", strerror(errno));
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("could not format inet value: %m")));
+
/* Add /n if not present (which it won't be) */
if (strchr(tmp, '/') == NULL)
{
@@ -534,8 +560,9 @@ network_abbrev(PG_FUNCTION_ARGS)
ip_bits(ip), tmp, sizeof(tmp));
if (dst == NULL)
- elog(ERROR, "unable to print address (%s)",
- strerror(errno));
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("could not format inet value: %m")));
/* Return string as a text datum */
len = strlen(tmp);
@@ -818,7 +845,7 @@ convert_network_to_scalar(Datum value, Oid typid)
* Can't get here unless someone tries to use scalarltsel/scalargtsel
* on an operator with one network and one non-network operand.
*/
- elog(ERROR, "convert_network_to_scalar: unsupported type %u", typid);
+ elog(ERROR, "unsupported type: %u", typid);
return 0;
}