Datum pg_dearmor(PG_FUNCTION_ARGS) { text *data; bytea *res; int data_len, res_len, guess_len; data = PG_GETARG_TEXT_P(0); data_len = VARSIZE(data) - VARHDRSZ; guess_len = pgp_armor_dec_len(data_len); res = palloc(VARHDRSZ + guess_len); res_len = pgp_armor_decode((uint8 *) VARDATA(data), data_len, (uint8 *) VARDATA(res)); if (res_len < 0) ereport(ERROR, (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION), errmsg("%s", px_strerror(res_len)))); if (res_len > guess_len) ereport(ERROR, (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION), errmsg("Overflow - decode estimate too small"))); SET_VARSIZE(res, VARHDRSZ + res_len); PG_FREE_IF_COPY(data, 0); PG_RETURN_TEXT_P(res); }
Datum pg_dearmor(PG_FUNCTION_ARGS) { text *data; bytea *res; int data_len; int ret; StringInfoData buf; data = PG_GETARG_TEXT_P(0); data_len = VARSIZE(data) - VARHDRSZ; initStringInfo(&buf); ret = pgp_armor_decode((uint8 *) VARDATA(data), data_len, &buf); if (ret < 0) ereport(ERROR, (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION), errmsg("%s", px_strerror(ret)))); res = palloc(VARHDRSZ + buf.len); SET_VARSIZE(res, VARHDRSZ + buf.len); memcpy(VARDATA(res), buf.data, buf.len); pfree(buf.data); PG_FREE_IF_COPY(data, 0); PG_RETURN_TEXT_P(res); }