#ifndef _PPCPRAGMA_USERGROUP_H
#define _PPCPRAGMA_USERGROUP_H

#ifndef POWERUP_PPCLIB_INTERFACE_H
#include <powerup/ppclib/interface.h>
#endif

#ifndef POWERUP_GCCLIB_PROTOS_H
#include <powerup/gcclib/powerup_protos.h>
#endif

#ifndef _STRING_H
#include <string.h>
#endif

#ifndef NO_PPCINLINE_STDARG
#define NO_PPCINLINE_STDARG
#endif/* SAS C PPC inlines */

#ifndef USERGROUP_BASE_NAME
#define USERGROUP_BASE_NAME UserGroupBase
#endif

#define ug_SetupContextTagList(p,t) _ug_SetupContextTagList(USERGROUP_BASE_NAME,p,t)

static __inline long
_ug_SetupContextTagList(void *UserGroupBase,const unsigned char *p,struct TagItem *t) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.a0=(ULONG)p;
	MyCaos.a1=(ULONG)t;
	MyCaos.caos_Un.Offset=-30;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (long)PPCCallOS(&MyCaos);
}

#ifndef NO_PPCINLINE_STDARG
#define ug_SetupContextTags(p, tags...) \
	({ULONG _tags[] = {tags}; ug_SetupContextTagList((p), (long) _tags);})
#endif

#define ug_GetErr() _ug_GetErr(USERGROUP_BASE_NAME)

static __inline long
_ug_GetErr(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-36;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (long)PPCCallOS(&MyCaos);
}

#define ug_StrError(c) _ug_StrError(USERGROUP_BASE_NAME,c)

static __inline const char *
_ug_StrError(void *UserGroupBase,long c) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.d0=(ULONG)c;
	MyCaos.caos_Un.Offset=-42;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (const char *)PPCCallOS(&MyCaos);
}

#define getuid() _getuid(USERGROUP_BASE_NAME)

static __inline long
_getuid(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-48;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (long)PPCCallOS(&MyCaos);
}

#define geteuid() _geteuid(USERGROUP_BASE_NAME)

static __inline long
_geteuid(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-54;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (long)PPCCallOS(&MyCaos);
}

#define setreuid(r,e) _setreuid(USERGROUP_BASE_NAME,r,e)

static __inline long
_setreuid(void *UserGroupBase,long r,long e) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.d0=(ULONG)r;
	MyCaos.d1=(ULONG)e;
	MyCaos.caos_Un.Offset=-60;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (long)PPCCallOS(&MyCaos);
}

#define setuid(i) _setuid(USERGROUP_BASE_NAME,i)

static __inline long
_setuid(void *UserGroupBase,long i) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.d0=(ULONG)i;
	MyCaos.caos_Un.Offset=-66;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (long)PPCCallOS(&MyCaos);
}

#define getgid() _getgid(USERGROUP_BASE_NAME)

static __inline long
_getgid(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-72;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (long)PPCCallOS(&MyCaos);
}

#define getegid() _getegid(USERGROUP_BASE_NAME)

static __inline long
_getegid(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-78;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (long)PPCCallOS(&MyCaos);
}

#define setregid(r,e) _setregid(USERGROUP_BASE_NAME,r,e)

static __inline long
_setregid(void *UserGroupBase,long r,long e) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.d0=(ULONG)r;
	MyCaos.d1=(ULONG)e;
	MyCaos.caos_Un.Offset=-84;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (long)PPCCallOS(&MyCaos);
}

#define setgid(i) _setgid(USERGROUP_BASE_NAME,i)

static __inline long
_setgid(void *UserGroupBase,long i) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.d0=(ULONG)i;
	MyCaos.caos_Un.Offset=-90;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (long)PPCCallOS(&MyCaos);
}

#define getgroups(n,g) _getgroups(USERGROUP_BASE_NAME,n,g)

static __inline long
_getgroups(void *UserGroupBase,long n,long *g) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.d0=(ULONG)n;
	MyCaos.a1=(ULONG)g;
	MyCaos.caos_Un.Offset=-96;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (long)PPCCallOS(&MyCaos);
}

#define setgroups(n,g) _setgroups(USERGROUP_BASE_NAME,n,g)

static __inline long
_setgroups(void *UserGroupBase,long n,const long *g) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.d0=(ULONG)n;
	MyCaos.a1=(ULONG)g;
	MyCaos.caos_Un.Offset=-102;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (long)PPCCallOS(&MyCaos);
}

#define initgroups(n,b) _initgroups(USERGROUP_BASE_NAME,n,b)

static __inline long
_initgroups(void *UserGroupBase,const char *n,long b) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.a1=(ULONG)n;
	MyCaos.d0=(ULONG)b;
	MyCaos.caos_Un.Offset=-108;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (long)PPCCallOS(&MyCaos);
}

#define getpwnam(n) _getpwnam(USERGROUP_BASE_NAME,n)

static __inline struct passwd *
_getpwnam(void *UserGroupBase,const char *n) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.a1=(ULONG)n;
	MyCaos.caos_Un.Offset=-114;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (struct passwd *)PPCCallOS(&MyCaos);
}

#define getpwuid(u) _getpwuid(USERGROUP_BASE_NAME,u)

static __inline struct passwd *
_getpwuid(void *UserGroupBase,long u) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.d0=(ULONG)u;
	MyCaos.caos_Un.Offset=-120;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (struct passwd *)PPCCallOS(&MyCaos);
}

#define setpwent() _setpwent(USERGROUP_BASE_NAME)

static __inline void
_setpwent(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-126;
	MyCaos.a6=(ULONG)UserGroupBase;
	PPCCallOS(&MyCaos);
}

#define getpwent() _getpwent(USERGROUP_BASE_NAME)

static __inline struct passwd *
_getpwent(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-132;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (struct passwd *)PPCCallOS(&MyCaos);
}

#define endpwent() _endpwent(USERGROUP_BASE_NAME)

static __inline void
_endpwent(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-138;
	MyCaos.a6=(ULONG)UserGroupBase;
	PPCCallOS(&MyCaos);
}

#define getgrnam(n) _getgrnam(USERGROUP_BASE_NAME,n)

static __inline struct group *
_getgrnam(void *UserGroupBase,const char *n) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.a1=(ULONG)n;
	MyCaos.caos_Un.Offset=-144;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (struct group *)PPCCallOS(&MyCaos);
}

#define getgrgid(g) _getgrgid(USERGROUP_BASE_NAME,g)

static __inline struct group *
_getgrgid(void *UserGroupBase,long g) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.d0=(ULONG)g;
	MyCaos.caos_Un.Offset=-150;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (struct group *)PPCCallOS(&MyCaos);
}

#define setgrent() _setgrent(USERGROUP_BASE_NAME)

static __inline void
_setgrent(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-156;
	MyCaos.a6=(ULONG)UserGroupBase;
	PPCCallOS(&MyCaos);
}

#define getgrent() _getgrent(USERGROUP_BASE_NAME)

static __inline struct group *
_getgrent(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-162;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (struct group *)PPCCallOS(&MyCaos);
}

#define endgrent() _endgrent(USERGROUP_BASE_NAME)

static __inline void
_endgrent(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-168;
	MyCaos.a6=(ULONG)UserGroupBase;
	PPCCallOS(&MyCaos);
}

#define crypt(k,s) _crypt(USERGROUP_BASE_NAME,k,s)

static __inline char *
_crypt(void *UserGroupBase,const char *k,const char *s) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.a0=(ULONG)k;
	MyCaos.a1=(ULONG)s;
	MyCaos.caos_Un.Offset=-174;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (char *)PPCCallOS(&MyCaos);
}

#define ug_GetSalt(u,b,s) _ug_GetSalt(USERGROUP_BASE_NAME,u,b,s)

static __inline char *
_ug_GetSalt(void *UserGroupBase,const struct passwd *u,char *b,unsigned long s) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.a0=(ULONG)u;
	MyCaos.a1=(ULONG)b;
	MyCaos.d0=(ULONG)s;
	MyCaos.caos_Un.Offset=-180;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (char *)PPCCallOS(&MyCaos);
}

#define getpass(p) _getpass(USERGROUP_BASE_NAME,p)

static __inline char *
_getpass(void *UserGroupBase,const char *p) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.a1=(ULONG)p;
	MyCaos.caos_Un.Offset=-186;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (char *)PPCCallOS(&MyCaos);
}

#define umask(m) _umask(USERGROUP_BASE_NAME,m)

static __inline unsigned short
_umask(void *UserGroupBase,unsigned short m) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.d0=(ULONG)m;
	MyCaos.caos_Un.Offset=-192;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (unsigned short)PPCCallOS(&MyCaos);
}

#define getumask() _getumask(USERGROUP_BASE_NAME)

static __inline unsigned short
_getumask(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-198;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (unsigned short)PPCCallOS(&MyCaos);
}

#define setsid() _setsid(USERGROUP_BASE_NAME)

static __inline struct Task *
_setsid(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-204;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (struct Task *)PPCCallOS(&MyCaos);
}

#define getpgrp() _getpgrp(USERGROUP_BASE_NAME)

static __inline struct Task *
_getpgrp(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-210;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (struct Task *)PPCCallOS(&MyCaos);
}

#define getlogin() _getlogin(USERGROUP_BASE_NAME)

static __inline char *
_getlogin(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-216;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (char *)PPCCallOS(&MyCaos);
}

#define setlogin(b) _setlogin(USERGROUP_BASE_NAME,b)

static __inline long
_setlogin(void *UserGroupBase,const char *b) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.a1=(ULONG)b;
	MyCaos.caos_Un.Offset=-222;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (long)PPCCallOS(&MyCaos);
}

#define setutent() _setutent(USERGROUP_BASE_NAME)

static __inline void
_setutent(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-228;
	MyCaos.a6=(ULONG)UserGroupBase;
	PPCCallOS(&MyCaos);
}

#define getutent() _getutent(USERGROUP_BASE_NAME)

static __inline struct utmp *
_getutent(void *UserGroupBase,const char *b) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-234;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (struct utmp *)PPCCallOS(&MyCaos);
}

#define endutent() _endutent(USERGROUP_BASE_NAME)

static __inline void
_endutent(void *UserGroupBase) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.caos_Un.Offset=-240;
	MyCaos.a6=(ULONG)UserGroupBase;
	PPCCallOS(&MyCaos);
}

#define getlastlog(u) _getlastlog(USERGROUP_BASE_NAME,u)

static __inline struct lastlog *
_getlastlog(void *UserGroupBase,long u) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.d0=(ULONG)u;
	MyCaos.caos_Un.Offset=-246;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (struct lastlog *)PPCCallOS(&MyCaos);
}

#define setlastlog(u,n,h) _setlastlog(USERGROUP_BASE_NAME,u,n,h)

static __inline long
_setlastlog(void *UserGroupBase,long u,char *n,char *h) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.d0=(ULONG)u;
	MyCaos.a0=(ULONG)n;
	MyCaos.a1=(ULONG)h;
	MyCaos.caos_Un.Offset=-252;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (long)PPCCallOS(&MyCaos);
}

#define getcredentials(t) _getcredentials(USERGROUP_BASE_NAME,t)

static __inline struct UserGroupCredentials *
_getcredentials(void *UserGroupBase,struct Task *t) {
	struct Caos MyCaos;
	MyCaos.M68kCacheMode=IF_CACHEFLUSHALL;
	MyCaos.PPCCacheMode=IF_CACHEFLUSHALL;
	MyCaos.a0=(ULONG)t;
	MyCaos.caos_Un.Offset=-258;
	MyCaos.a6=(ULONG)UserGroupBase;
	return (struct UserGroupCredentials *)PPCCallOS(&MyCaos);
}

#endif
