The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
MODULE = Git::Raw			PACKAGE = Git::Raw::Cred

Cred
userpass(class, user, pass)
	SV *class
	SV *user
	SV *pass

	PREINIT:
		int rc;

		Cred out;
		git_cred *cred;

	CODE:
		rc = git_cred_userpass_plaintext_new(
			&cred,
			git_ensure_pv(user, "user"),
			git_ensure_pv(pass, "pass")
		);
		git_check_error(rc);

		Newxz(out, 1, git_raw_cred);
		out -> cred = cred;
		RETVAL = out;

	OUTPUT: RETVAL

Cred
sshkey(class, user, public, private, ...)
	SV *class
	SV *user
	SV *public
	SV *private

	PROTOTYPE: $$$$;$
	PREINIT:
		int rc;

		Cred out;
		git_cred *cred;
		const char *passphrase = NULL;

	CODE:
		if (items == 5)
			passphrase = git_ensure_pv(ST(4), "pass");

		rc = git_cred_ssh_key_new(
			&cred,
			git_ensure_pv(user, "user"),
			git_ensure_pv(public, "public"),
			git_ensure_pv(private, "private"),
			passphrase
		);
		git_check_error(rc);

		Newxz(out, 1, git_raw_cred);
		out -> cred = cred;
		RETVAL = out;

	OUTPUT: RETVAL

Cred
sshagent(class, user)
	SV *class
	SV *user

	PREINIT:
		int rc;

		Cred out;
		git_cred *cred;

	CODE:
		rc = git_cred_ssh_key_from_agent(
			&cred,
			git_ensure_pv(user, "user")
		);
		git_check_error(rc);

		Newxz(out, 1, git_raw_cred);
		out -> cred = cred;
		RETVAL = out;

	OUTPUT: RETVAL

Cred
sshinteractive(class, user, callback)
	SV *class
	SV *user
	SV *callback

	PREINIT:
		int rc;

		Cred out;
		git_cred *cred;

	CODE:
		rc = git_cred_ssh_interactive_new(
			&cred,
			git_ensure_pv(user, "user"),
			(git_cred_ssh_interactive_callback) git_ssh_interactive_cbb,
			git_ensure_cv(callback, "callback"));
		git_check_error(rc);

		Newxz(out, 1, git_raw_cred);
		out -> cred = cred;
		out -> callback = callback;
		SvREFCNT_inc(out -> callback);

		RETVAL = out;

	OUTPUT: RETVAL

void
DESTROY(self)
	SV *self

	PREINIT:
		Cred cred;

	CODE:
		cred = GIT_SV_TO_PTR(Cred, self);

		SvREFCNT_dec(cred -> callback);
		Safefree(cred);