On Fri, May 19, 2000 at 05:54:55PM +0200, [EMAIL PROTECTED] wrote:
> Hi,
> I'm trying to write a simple C function:
>                                         
> char *pg_crypt (char *pass) {
>       char *salt="xyz";
>         char *res;
>       res = (char *) palloc(14);
>       res=crypt(pass,salt);
>       return res;
> }

you can't pass char pointers around like that for pgsql functions. 
Here's my version of the above function. It includes random salt
selection if you don't supply it. (Hmm, I suppose I should put
this is contrib, eh? I did start with someone elses boilerplate,
so I'm not sure about the #define at the top.)

I compile it on linux with gcc as so:

gcc -fPIC -shared -I /usr/local/pgsql/include -L /usr/local/pgsql/lib \
    -o sqlcrypt.so sqlcrypt.c

And install it like so:

CREATE FUNCTION "sqlcrypt" (text,text ) RETURNS text AS '/usr/local/lib/sqlcrypt
.so' LANGUAGE 'C';

CREATE FUNCTION "sqlcrypt" (text ) RETURNS text AS 'select sqlcrypt($1,'''')' LA
NGUAGE 'SQL';

Ross
-- 
Ross J. Reedstrom, Ph.D., <[EMAIL PROTECTED]> 
NSBRI Research Scientist/Programmer
Computer and Information Technology Institute
Rice University, 6100 S. Main St.,  Houston, TX 77005
#define _XOPEN_SOURCE
#include <postgres.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>


text *sqlcrypt(text *key, text *salt);
/*sql create function sqlcrypt(text,text) returns text as 'DESTLIB' language 'c'*/

char *crypt(const char *key, const char *salt);
int rand(void);
void srand(unsigned int seed);


text *sqlcrypt(text *key, text *salt)
{
  text *ret;
  char pass[] = "123456789";
  char s[] = "...";
  char salts[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./";
  int j,k;
  struct timeval tv;


  s[2]=0;
  bzero(pass,9);
  if ((VARSIZE(salt)-VARHDRSZ) < 2)
    {
    gettimeofday(&tv,0);
    srand((unsigned int)(tv.tv_usec));
    j=(rand() % 64);
    k=(rand() % 64);
    s[0]=salts[j];
    s[1]=salts[k];
	   
    }
  else
    {
    memcpy(s,VARDATA(salt),2);
    }
  ret = palloc(VARHDRSZ + 13);
  bzero(ret,VARHDRSZ + 13);
  VARSIZE(ret) = (VARHDRSZ + 13);
  if ((VARSIZE(key)-VARHDRSZ) < 8)
  {
  	memcpy(pass,VARDATA(key),VARSIZE(key)-VARHDRSZ);
  }
  else
  {
	  memcpy(pass,VARDATA(key),8) ;
  }

  memcpy(VARDATA(ret), crypt(pass,s),13); 

  return ret;
}

Reply via email to