Datum pg_crypt(PG_FUNCTION_ARGS) { text *arg0 = PG_GETARG_TEXT_PP(0); text *arg1 = PG_GETARG_TEXT_PP(1); char *buf0, *buf1, *cres, *resbuf; text *res; buf0 = text_to_cstring(arg0); buf1 = text_to_cstring(arg1); resbuf = palloc0(PX_MAX_CRYPT); cres = px_crypt(buf0, buf1, resbuf, PX_MAX_CRYPT); pfree(buf0); pfree(buf1); if (cres == NULL) ereport(ERROR, (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION), errmsg("crypt(3) returned NULL"))); res = cstring_to_text(cres); pfree(resbuf); PG_FREE_IF_COPY(arg0, 0); PG_FREE_IF_COPY(arg1, 1); PG_RETURN_TEXT_P(res); }
Datum pg_crypt(PG_FUNCTION_ARGS) { text *arg0; text *arg1; unsigned len0, len1, clen; char *buf0, *buf1, *cres, *resbuf; text *res; if (PG_ARGISNULL(0) || PG_ARGISNULL(1)) PG_RETURN_NULL(); arg0 = PG_GETARG_TEXT_P(0); arg1 = PG_GETARG_TEXT_P(1); len0 = VARSIZE(arg0) - VARHDRSZ; len1 = VARSIZE(arg1) - VARHDRSZ; buf0 = palloc(len0 + 1); buf1 = palloc(len1 + 1); memcpy(buf0, VARDATA(arg0), len0); memcpy(buf1, VARDATA(arg1), len1); buf0[len0] = '\0'; buf1[len1] = '\0'; resbuf = palloc(PX_MAX_CRYPT); memset(resbuf, 0, PX_MAX_CRYPT); cres = px_crypt(buf0, buf1, resbuf, PX_MAX_CRYPT); pfree(buf0); pfree(buf1); if (cres == NULL) ereport(ERROR, (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION), errmsg("crypt(3) returned NULL"))); clen = strlen(cres); res = (text *) palloc(clen + VARHDRSZ); VARATT_SIZEP(res) = clen + VARHDRSZ; memcpy(VARDATA(res), cres, clen); pfree(resbuf); PG_FREE_IF_COPY(arg0, 0); PG_FREE_IF_COPY(arg1, 1); PG_RETURN_TEXT_P(res); }