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; }