Net-Hesiod

 view release on metacpan or  search on metacpan

Hesiod.xs  view on Meta::CPAN

		{	tmp = sv_newmortal();
			sv_setpv(tmp,*res);
			XPUSHs(tmp);
			i++;
			res++;
		}
		hesiod_free_list(context,results);
		XSRETURN(i);


void
hesiod_getpwnam(context,name)
	void *	context;
	const char *	name;
	PREINIT:
		struct passwd *pw;
		dTARGET;
		SV *tmp;
	PPCODE:
		pw = hesiod_getpwnam(context,name);
		/* Handle errors by returning empty */
		if ( ! pw ) { XSRETURN_EMPTY; }
		/* Presumably, have a valid response */
		tmp = sv_newmortal(); sv_setpv(tmp,pw->pw_name);
		XPUSHs(tmp);
		tmp = sv_newmortal(); sv_setpv(tmp,pw->pw_passwd);
		XPUSHs(tmp);
		tmp = sv_newmortal(); sv_setiv(tmp,pw->pw_uid);
		XPUSHs(tmp);
		tmp = sv_newmortal(); sv_setiv(tmp,pw->pw_gid);
		XPUSHs(tmp);
		tmp = sv_newmortal();
		/* Not all systems have a pw_quota or pw_comment elements. 
		** Solaris lacks pw_quota, having pw_age instead
		** Linux lacks both
			If missing, leave undef the return value 
		*/
#ifndef DONT_HAVE_PW_QUOTA
		sv_setiv(tmp,pw->pw_quota);
#else
		sv_setsv(tmp,&sv_undef);
#endif
		XPUSHs(tmp);
		tmp = sv_newmortal(); 
#ifndef DONT_HAVE_PW_COMMENT
		sv_setpv(tmp,pw->pw_comment);
#else
		sv_setsv(tmp,&sv_undef);
#endif
		XPUSHs(tmp);
		tmp = sv_newmortal(); sv_setpv(tmp,pw->pw_gecos);
		XPUSHs(tmp);
		tmp = sv_newmortal(); sv_setpv(tmp,pw->pw_dir);
		XPUSHs(tmp);
		tmp = sv_newmortal(); sv_setpv(tmp,pw->pw_shell);
		XPUSHs(tmp);
		hesiod_free_passwd(context,pw);
		XSRETURN(9);

void
hesiod_getpwuid(context,uid)
	void *	context;
	uid_t	uid;
	PREINIT:
		struct passwd *pw;
		dTARGET;
		SV *tmp;
	PPCODE:
		pw = hesiod_getpwuid(context,uid);
		/* Handle errors by returning empty */
		if ( ! pw ) { XSRETURN_EMPTY; }
		/* Presumably, have a valid response */
		tmp = sv_newmortal(); sv_setpv(tmp,pw->pw_name);
		XPUSHs(tmp);
		tmp = sv_newmortal(); sv_setpv(tmp,pw->pw_passwd);
		XPUSHs(tmp);
		tmp = sv_newmortal(); sv_setiv(tmp,pw->pw_uid);
		XPUSHs(tmp);
		tmp = sv_newmortal(); sv_setiv(tmp,pw->pw_gid);
		XPUSHs(tmp);
		tmp = sv_newmortal();
		/* Leave undef if lacking pw_quota or pw_comment */
#ifndef DONT_HAVE_PW_QUOTA
		sv_setiv(tmp,pw->pw_quota);
#else
		sv_setsv(tmp,&sv_undef);
#endif
		XPUSHs(tmp);
		tmp = sv_newmortal();
#ifndef DONT_HAVE_PW_COMMENT
		sv_setpv(tmp,pw->pw_comment);
#else
		sv_setsv(tmp,&sv_undef);
#endif
		XPUSHs(tmp);
		tmp = sv_newmortal(); sv_setpv(tmp,pw->pw_gecos);
		XPUSHs(tmp);
		tmp = sv_newmortal(); sv_setpv(tmp,pw->pw_dir);
		XPUSHs(tmp);
		tmp = sv_newmortal(); sv_setpv(tmp,pw->pw_shell);
		XPUSHs(tmp);
		hesiod_free_passwd(context,pw);
		XSRETURN(9);

struct servent *
hesiod_getservbyname(context,name, proto)
	void *	context;
	const char *	name;
	const char *	proto;
	PREINIT:
		struct servent *sent;
		dTARGET;
		SV *tmp;
		int port;
	PPCODE:
		sent = hesiod_getservbyname(context,name, proto);
		/* Handle errors by returning empty */
		if ( ! sent ) { XSRETURN_EMPTY; }
		/* Presumably, have a valid response */
		/* servent struct is supposed to store port number in
			network byte order.  We return it in host order
			to be consistent with perl getservbyname */
		port = ntohs(sent->s_port);
		tmp= sv_newmortal(); sv_setpv(tmp,sent->s_name);
		XPUSHs(tmp);
		/* WE now concat the alias list */
		tmp= sv_newmortal();
		if ( *sent->s_aliases )
		{ 	sv_setpv(tmp,*sent->s_aliases);



( run in 1.783 second using v1.01-cache-2.11-cpan-98e64b0badf )