Обсуждение: C functions, arguments, and ssh oh my!
Hello All,
I am writing my first C function for postgres and failing miserably. my C
function needs to get passed a username (char) , uid(int), and gid(int) and
what it does with those is builds a command string for an external app that
is called with system() and exits 0. I know this is strange and ugly but I
need to trigger this external app when an insert is made into a user table.
I am looking into the version 1 calling convention to get these arguments
into my C function but I can't seem to match the types correctly. I am
looking at SPI with triggers now but I don't know if that will work either.
Am I barking up the wrong tree here? any comments are appreciated and I
appreciate the time you have taken to read my post. Below is to cludgy poor
code I have so far (it doesnt work of course) and I am halfway between
converting to version 1 calling but I wanted to give you an idea of what I
am trying to do. Thanks again.
- Joel
#include <stdlib.h>
#include "postgres.h"
#include "fmgr.h"
/*int *ssh_exec(char *uname[FILENAME_MAX], char *uid[FILENAME_MAX], char
*gid[FILENAME_MAX])*/
PG_FUNCTION_INFO_V1(ssh_exec);
Datum
ssh_exec(PG_FUNCTION_ARGS)
{
char sshcmd[255];
strncpy(sshcmd, "/usr/local/bin/plsshexec ", 255);
strncat(sshcmd, *uname, 255);
strncat(sshcmd, " ", 255);
strncat(sshcmd, *uid, 255);
strncat(sshcmd, " ", 255);
strncat(sshcmd, *gid, 255);
system(sshcmd);
return 0;
}
* Joel Dudley <Joel.Dudley@DevelopOnline.com> [010327 11:29] wrote: > Hello All, > I am writing my first C function for postgres and failing miserably. my C > function needs to get passed a username (char) , uid(int), and gid(int) and right, wrong and wrong. char *, uid_t, gid_t. -- -Alfred Perlstein - [bright@wintelcom.net|alfred@freebsd.org] Instead of asking why a piece of software is using "1970s technology," start asking why software is ignoring 30 years of accumulated wisdom.
Joel Dudley writes:
> PG_FUNCTION_INFO_V1(ssh_exec);
>
> Datum
> ssh_exec(PG_FUNCTION_ARGS)
> {
> char sshcmd[255];
>
> strncpy(sshcmd, "/usr/local/bin/plsshexec ", 255);
> strncat(sshcmd, *uname, 255);
> strncat(sshcmd, " ", 255);
> strncat(sshcmd, *uid, 255);
> strncat(sshcmd, " ", 255);
> strncat(sshcmd, *gid, 255);
> system(sshcmd);
> return 0;
> }
You missed the part about fetching the arguments using PG_GETARG_xxx.
Also you should use PG_RETURN_xxx and you need to null-terminate your
string.
--
Peter Eisentraut peter_e@gmx.net http://yi.org/peter-e/
Joel Dudley <Joel.Dudley@DevelopOnline.com> writes:
> what it does with those is builds a command string for an external app that
> is called with system() and exits 0. I know this is strange and ugly but I
> need to trigger this external app when an insert is made into a user table.
This seems an extremely dubious practice. If the transaction doing the
insert is later rolled back, the insert effectively never happened ---
but the effects of your external app will still be there. I'd suggest
thinking twice about your whole system design, if it requires this.
You can mitigate the problem a little bit by making the trigger an
AFTER trigger, so that it's only fired when we are about to commit the
transaction. But there's still a possibility of trouble if a later
AFTER trigger decides to abort.
regards, tom lane