Datum ipaddr_cast_from_text(PG_FUNCTION_ARGS) { text *txt = PG_GETARG_TEXT_PP(0); int tlen = VARSIZE_ANY_EXHDR(txt); char buf[IP6_STRING_MAX]; if (tlen < sizeof(buf)) { IP ip; memcpy(buf, VARDATA_ANY(txt), tlen); buf[tlen] = 0; if (strchr(buf,':')) { if (ip6_raw_input(buf, ip.ip6.bits)) PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6, &ip)); } else { if (ip4_raw_input(buf, &ip.ip4)) PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET, &ip)); } } ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid IP value in text"))); PG_RETURN_NULL(); }
static inline IP_P ipaddr_transform_2(Datum d1, Datum d2, PGFunction ip4func, PGFunction ip6func) { IP_P ipp1 = DatumGetIP_P(d1); IP_P ipp2 = DatumGetIP_P(d2); IP ip1; IP ip2; IP out; int af1 = ip_unpack(ipp1, &ip1); int af2 = ip_unpack(ipp2, &ip2); if (af1 != af2) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid mixing of IP address families"))); switch (af1) { case PGSQL_AF_INET: out.ip4 = DatumGetIP4(DirectFunctionCall2(ip4func, IP4GetDatum(ip1.ip4), IP4GetDatum(ip2.ip4))); break; case PGSQL_AF_INET6: out.ip6 = *(DatumGetIP6P(DirectFunctionCall2(ip6func, IP6PGetDatum(&ip1.ip6), IP6PGetDatum(&ip2.ip6)))); break; default: ipaddr_internal_error(); } return ip_pack(af1, &out); }
Datum ipaddr_cast_from_ip4(PG_FUNCTION_ARGS) { IP ip; ip.ip4 = PG_GETARG_IP4(0); PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET, &ip)); }
Datum ipaddr_cast_from_ip6(PG_FUNCTION_ARGS) { IP6 *in = PG_GETARG_IP6_P(0); IP ip; ip.ip6 = *in; PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6, &ip)); }
int udp_pack(u32 length) { udp_t *udp = (void *)(send_buf + sizeof(eth_t) + sizeof(ip_t)); udp->source = eport; udp->dest = hport; udp->len = htons(sizeof(udp_t) + length); udp->check = 0; return ip_pack(sizeof(udp_t) + length, 17); }
int udp_pack(unsigned int length, unsigned short port) { udp_h *udp = (void *)(send_buf + sizeof(eth_h) + sizeof(ip_h)); udp->source = (eport);//eport :PC端口号 udp->dest = (port); udp->len = htons(sizeof(udp_h) + length); udp->check = 0; return ip_pack(sizeof(udp_h) + length, 17); }
Datum ipaddr_cast_from_inet(PG_FUNCTION_ARGS) { inet *inetptr = PG_GETARG_INET_P(0); inet_struct *in = INET_STRUCT_DATA(inetptr); IP ip; switch (in->family) { case PGSQL_AF_INET: ip.ip4 = DatumGetIP4(DirectFunctionCall1(ip4_cast_from_inet, InetPGetDatum(inetptr))); PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET, &ip)); case PGSQL_AF_INET6: ip.ip6 = *(DatumGetIP6P(DirectFunctionCall1(ip6_cast_from_inet, InetPGetDatum(inetptr)))); PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6, &ip)); } ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid INET value for conversion to IP"))); PG_RETURN_NULL(); }
Datum ipaddr_in(PG_FUNCTION_ARGS) { char *str = PG_GETARG_CSTRING(0); IP ip; if (strchr(str,':')) { if (ip6_raw_input(str, ip.ip6.bits)) PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6, &ip)); } else { if (ip4_raw_input(str, &ip.ip4)) PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET, &ip)); } ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid IP value: '%s'", str))); PG_RETURN_NULL(); }
int icmp_pack(char type,int seq,int len,short id) { icmp_t *icmp = (void *)(send_buf + sizeof(eth_t) + sizeof(ip_t)); icmp->type = type; icmp->code = 0; icmp->checksum = 0; icmp->id = htons(id); icmp->sequence = htons(seq); icmp->checksum = cal_sum((void *)icmp,len + sizeof(*icmp)); return ip_pack(len + sizeof(*icmp), 1); }
Datum ipaddr_recv(PG_FUNCTION_ARGS) { StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); IP ip; int af, bits, flag, nbytes; /* we copy the external format used by inet/cidr, just because. */ af = pq_getmsgbyte(buf); if (af != PGSQL_AF_INET && af != PGSQL_AF_INET6) ereport(ERROR, (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), errmsg("invalid address family in external IP value"))); bits = pq_getmsgbyte(buf); if (bits != ip_maxbits(af)) ereport(ERROR, (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), errmsg("invalid bit length in external IP value"))); flag = pq_getmsgbyte(buf); /* ignored */ nbytes = pq_getmsgbyte(buf); if (nbytes*8 != bits) ereport(ERROR, (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), errmsg("invalid address length in external IP value"))); switch (af) { case PGSQL_AF_INET: ip.ip4 = (IP4) pq_getmsgint(buf, sizeof(IP4)); break; case PGSQL_AF_INET6: ip.ip6.bits[0] = pq_getmsgint64(buf); ip.ip6.bits[1] = pq_getmsgint64(buf); break; } PG_RETURN_IP_P(ip_pack(af, &ip)); }
static inline IP_P ipaddr_transform_2d(Datum d1, Datum d2, PGFunction ip4func, PGFunction ip6func) { IP_P ipp = DatumGetIP_P(d1); IP ip; int af = ip_unpack(ipp, &ip); switch (af) { case PGSQL_AF_INET: ip.ip4 = DatumGetIP4(DirectFunctionCall2(ip4func, IP4GetDatum(ip.ip4), d2)); break; case PGSQL_AF_INET6: ip.ip6 = *(DatumGetIP6P(DirectFunctionCall2(ip6func, IP6PGetDatum(&ip.ip6), d2))); break; default: ipaddr_internal_error(); } return ip_pack(af, &ip); }
static void ipport_pack(uint8_t *data, const IP_Port *source) { ip_pack(data, source->ip); memcpy(data + SIZE_IP, &source->port, SIZE_PORT); }