Thread: passing function's output into C function

passing function's output into C function

From
Kamil Kukura
Date:
I have table with column of type "inet". Then I have my own function
resolveip(text). It works okay when I store IP addres into column typed
as text or varchar. But with type of inet I run into this problem:


select host(acc_ip), resolveip(host(acc_ip)) from access_test limit 15

       host      |             resolveip
----------------+-----------------------------------
  212.80.81.141  | Bad IP address: '212.80.81.141.'
  212.80.81.141  | Bad IP address: '212.80.81.141'
  212.80.81.141  | Bad IP address: '212.80.81.141'
  212.80.81.141  | Bad IP address: '212.80.81.141'
  80.139.171.208 | Bad IP address: '80.139.171.208*'
  212.80.81.141  | Bad IP address: '212.80.81.1418'
  212.80.81.141  | Bad IP address: '212.80.81.1418'
  211.22.169.82  | Bad IP address: '211.22.169.828'
  81.0.234.52    |
  62.24.89.106   | Bad IP address: '62.24.89.106`'
  81.0.234.52    | Bad IP address: '81.0.234.526'
  212.80.81.141  | Bad IP address: '212.80.81.1415'
  62.84.131.161  | Bad IP address: '62.84.131.1615'
  212.80.81.141  | Bad IP address: '212.80.81.1415'
  195.122.204.15 | e0-a11.b1.lan.prg.vol.cz

Is there something I'm missing when data are passed from function to
function?

--
Kamil Kukura


Re: passing function's output into C function

From
Joe Conway
Date:
Kamil Kukura wrote:
> Is there something I'm missing when data are passed from function to
> function?

It is difficult to know what you might be missing when you haven't shown
us the function. Post the code.

Joe


Re: passing function's output into C function

From
Tom Lane
Date:
Kamil Kukura <kamk@volny.cz> writes:
> Is there something I'm missing when data are passed from function to
> function?

I get the impression your function is expecting the contents of a text
datum to be null-terminated.  It's not.

            regards, tom lane

Re: passing function's output into C function

From
Kamil Kukura
Date:
It was problem with allocating needed space, now it's okay. Anyway, the
code of function is being attached..

--
Kamil Kukura
#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>

#include "postgres.h"
#include "fmgr.h"
#include "utils/palloc.h"


text *create_text(char *data) {
    unsigned long r_size;
    text *result;

    r_size = strlen(data);
    result = palloc(r_size + VARHDRSZ);
    VARATT_SIZEP(result) = r_size + VARHDRSZ;
    memcpy(VARDATA(result), data, r_size);
    return(result);
}


PG_FUNCTION_INFO_V1(resolveip);

Datum resolveip(PG_FUNCTION_ARGS) {
    struct hostent *host;
    struct in_addr addr;
    text *ipaddress = (text *)PG_GETARG_TEXT_P(0);
    const char *bad_ip_txt = "Bad IP address: '";
    char *message;

    unsigned long r_size, a_size = VARSIZE(ipaddress) - VARHDRSZ;
    char *saddress = (char *)palloc(a_size + 1);

    memcpy(saddress, VARDATA(ipaddress), a_size);
    saddress[a_size] = 0;        /* terminate string */

    if (! inet_aton(saddress, &addr)) {
        message = palloc(strlen(bad_ip_txt) + a_size + 2);
        message[0] = 0;
        strcat(message, bad_ip_txt);
        strcat(message, saddress);
        strcat(message, "'");

        PG_RETURN_TEXT_P(create_text(message));
    }
    host = gethostbyaddr(&addr, sizeof addr, AF_INET);

    if (! host) {
        PG_RETURN_NULL();
    }

    PG_RETURN_TEXT_P(create_text(host->h_name));
}