Net-NIS-Netgroup

 view release on metacpan or  search on metacpan

Netgroup.xs  view on Meta::CPAN

/*
 * $Id: Netgroup.xs,v 1.3 2010/08/12 14:10:24 bastian Exp $
 *
 * Copyright (C) 2009, 2010 Collax GmbH
 *                    (Bastian Friedrich <bastian.friedrich@collax.com>)
 */

#include <unistd.h>

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

MODULE = Net::NIS::Netgroup PACKAGE = Net::NIS::Netgroup

SV *
getdomainname()
    PREINIT:
    	int len = 512;
	char buf[512];
    PPCODE:
    	int ret = getdomainname(buf, len);
	if (ret == -1) {
		XPUSHs(&PL_sv_undef);
	} else {
		XPUSHs(sv_2mortal(newSVpv(buf, 0)));
	}

IV *
setdomainname(name)
    const char *name
    PREINIT:
    	int len = strlen(name) + 1;
    PPCODE:
    	int ret = setdomainname(name, len);
	if (ret == -1) {
		XPUSHs(&PL_sv_undef);
	} else {
		XPUSHs(sv_2mortal(newSViv(1)));
	}

IV *
innetgr(sv_netgroup, sv_host, sv_user, sv_domain)
    SV *sv_netgroup
    SV *sv_host
    SV *sv_user
    SV *sv_domain
    PREINIT:
	char *netgroup;
	char *host;
	char *user;
	char *domain;

	int ret;

    PPCODE:
	ret = 0;

	if (!SvOK(sv_netgroup)) { netgroup = NULL; } else { netgroup = SvPV_nolen(sv_netgroup); }
	if (!SvOK(sv_host)) { host = NULL; } else { host = SvPV_nolen(sv_host); }
	if (!SvOK(sv_user)) { user = NULL; } else { user = SvPV_nolen(sv_user); }
	if (!SvOK(sv_domain)) { domain = NULL; } else { domain = SvPV_nolen(sv_domain); }

    	/*
    	printf("xs code: netgroup == %s\n", netgroup);
    	printf("xs code: host == '%s'\n", host);
    	printf("xs code: user == '%s'\n", user);
    	printf("xs code: domain == '%s'\n", domain);
	*/
	if (netgroup) {
	    	ret = innetgr(netgroup, host, user, domain);
	}
	if (ret == 1) {
		XPUSHs(sv_2mortal(newSViv(1)));
	} else {
		XPUSHs(&PL_sv_undef);
	}


AV *
listnetgr(netgroup, stringify = 0)
	char *netgroup
	bool stringify

    PREINIT:
	char *host;
	char *user;
	char *domain;

	HV *el;
	char *buf;
	int bufsize = 256;
	int len;
    PPCODE:

	if (stringify) {
		buf = malloc(bufsize);
		if (!buf) {
			Perl_croak(aTHX_ "Could not allocate memory");
		}
	}

	setnetgrent(netgroup);

	while (getnetgrent (&host, &user, &domain)) {
		if (stringify) {
			if (!host) host = "";
			if (!user) user = "";
			if (!domain) domain = "";
			len = strlen("(,,)") + strlen(host) + strlen(user) + strlen(domain);
			if ((len+1) > bufsize) {
				bufsize = len + 1;
				buf = realloc(buf, bufsize);
				if (!buf) {
					Perl_croak(aTHX_ "Could not allocate memory");
				}
			}
			sprintf(buf, "(%s,%s,%s)", host, user, domain);
			XPUSHs(sv_2mortal(newSVpv(buf, len)));
		} else {
			el = newHV();

			hv_store(el, "host", strlen("host"), host ? newSVpv(strdup(host), 0) : newSV(0), 0);
			hv_store(el, "user", strlen("user"), user ? newSVpv(strdup(user), 0) : newSV(0), 0);
			hv_store(el, "domain", strlen("domain"), domain ? newSVpv(strdup(domain), 0) : newSV(0), 0);

			XPUSHs(sv_2mortal(newRV_noinc((SV*)el)));
		}
	}

	if (stringify) {
		free(buf);
	}

	endnetgrent();



( run in 0.644 second using v1.01-cache-2.11-cpan-5511b514fd6 )