Quota
view release on metacpan or search on metacpan
return (xdr_string(xdrs, &gqp->gqa_pathp, 1024) &&
xdr_int(xdrs, &gqp->gqa_uid));
}
bool_t
xdr_getquota_rslt(xdrs, gqp)
XDR *xdrs;
struct getquota_rslt *gqp;
{
return (xdr_union(xdrs,
(int *) &gqp->GQR_STATUS, (char *) &gqp->GQR_RQUOTA,
gq_des, (xdrproc_t) xdr_void));
}
bool_t
xdr_rquota(xdrs, rqp)
XDR *xdrs;
struct rquota *rqp;
{
return (xdr_int(xdrs, &rqp->rq_bsize) &&
xdr_bool(xdrs, &rqp->rq_active) &&
xdr_u_long(xdrs, (unsigned long *)&rqp->rq_bhardlimit) &&
xdr_u_long(xdrs, (unsigned long *)&rqp->rq_bsoftlimit) &&
xdr_u_long(xdrs, (unsigned long *)&rqp->rq_curblocks) &&
xdr_u_long(xdrs, (unsigned long *)&rqp->rq_fhardlimit) &&
xdr_u_long(xdrs, (unsigned long *)&rqp->rq_fsoftlimit) &&
xdr_u_long(xdrs, (unsigned long *)&rqp->rq_curfiles) &&
xdr_u_long(xdrs, (unsigned long *)&rqp->rq_btimeleft) &&
xdr_u_long(xdrs, (unsigned long *)&rqp->rq_ftimeleft) );
}
#endif /* MY_XDR */
#ifdef USE_EXT_RQUOTA
bool_t
xdr_ext_getquota_args(xdrs, objp)
XDR *xdrs;
ext_getquota_args *objp;
{
return xdr_string(xdrs, &objp->gqa_pathp, RQ_PATHLEN) &&
xdr_int(xdrs, &objp->gqa_type) &&
xdr_int(xdrs, &objp->gqa_id);
}
#endif /* USE_EXT_RQUOTA */
#endif /* !NO_RPC */
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
*
* The Perl interface
*
*/
MODULE = Quota PACKAGE = Quota
PROTOTYPES: DISABLE
void
query(dev,uid=getuid(),kind=0)
char * dev
int uid
int kind
PPCODE:
{
char *p = NULL;
int err;
#ifndef NO_RPC
quota_rpc_strerror = NULL;
#endif
#ifdef SGI_XFS
if(!strncmp(dev, "(XFS)", 5)) {
fs_disk_quota_t xfs_dqblk;
#ifndef linux
err = quotactl(Q_XGETQUOTA, dev+5, uid, CADR &xfs_dqblk);
#else
err = quotactl(QCMD(Q_XGETQUOTA, ((kind == 2) ? XQM_PRJQUOTA : ((kind == 1) ? XQM_GRPQUOTA : XQM_USRQUOTA))), dev+5, uid, CADR &xfs_dqblk);
#endif
if(!err) {
EXTEND(SP, 8);
PUSHs(sv_2mortal(newSVnv(QX_DIV(xfs_dqblk.d_bcount))));
PUSHs(sv_2mortal(newSVnv(QX_DIV(xfs_dqblk.d_blk_softlimit))));
PUSHs(sv_2mortal(newSVnv(QX_DIV(xfs_dqblk.d_blk_hardlimit))));
PUSHs(sv_2mortal(newSViv(xfs_dqblk.d_btimer)));
PUSHs(sv_2mortal(newSVnv(xfs_dqblk.d_icount)));
PUSHs(sv_2mortal(newSVnv(xfs_dqblk.d_ino_softlimit)));
PUSHs(sv_2mortal(newSVnv(xfs_dqblk.d_ino_hardlimit)));
PUSHs(sv_2mortal(newSViv(xfs_dqblk.d_itimer)));
}
}
else
#endif
#ifdef SOLARIS_VXFS
if(!strncmp(dev, "(VXFS)", 6)) {
struct vx_dqblk vxfs_dqb;
err = vx_quotactl(VX_GETQUOTA, dev+6, uid, CADR &vxfs_dqb);
if(!err) {
EXTEND(SP,8);
PUSHs(sv_2mortal(newSVnv(Q_DIV(vxfs_dqb.dqb_curblocks))));
PUSHs(sv_2mortal(newSVnv(Q_DIV(vxfs_dqb.dqb_bsoftlimit))));
PUSHs(sv_2mortal(newSVnv(Q_DIV(vxfs_dqb.dqb_bhardlimit))));
PUSHs(sv_2mortal(newSViv(vxfs_dqb.dqb_btimelimit)));
PUSHs(sv_2mortal(newSVnv(vxfs_dqb.dqb_curfiles)));
PUSHs(sv_2mortal(newSVnv(vxfs_dqb.dqb_fsoftlimit)));
PUSHs(sv_2mortal(newSVnv(vxfs_dqb.dqb_fhardlimit)));
PUSHs(sv_2mortal(newSViv(vxfs_dqb.dqb_ftimelimit)));
}
}
else
#endif
#ifdef AFSQUOTA
if(!strncmp(dev, "(AFS)", 5)) {
if (!afs_check()) { /* check is *required* as setup! */
errno = EINVAL;
}
else {
int maxQuota, blocksUsed;
err = afs_getquota(dev + 5, &maxQuota, &blocksUsed);
if(!err) {
EXTEND(SP, 8);
PUSHs(sv_2mortal(newSViv(blocksUsed)));
PUSHs(sv_2mortal(newSViv(maxQuota)));
PUSHs(sv_2mortal(newSViv(maxQuota)));
RETVAL = -1;
}
#else
{
#ifdef Q_CTL_V3 /* Linux */
#ifdef SGI_XFS
if ((dev != NULL) && (!strncmp(dev, "(XFS)", 5))) {
RETVAL = quotactl(QCMD(Q_XQUOTASYNC, XQM_USRQUOTA), dev+5, 0, NULL);
}
else
#endif
RETVAL = linuxquota_sync (dev, FALSE);
#else
#ifdef Q_CTL_V2
#ifdef AIX
struct stat st;
#endif
if(dev == NULL) dev = "/";
#ifdef AIX
#if defined(HAVE_JFS2)
if (strncmp(dev, "(JFS2)", 6) == 0) dev += 6;
#endif
if (stat(dev, &st)) RETVAL = -1;
else
#endif
RETVAL = quotactl(dev, QCMD(Q_SYNC, USRQUOTA), 0, NULL);
#else
#ifdef SGI_XFS
#define XFS_UQUOTA (XFS_QUOTA_UDQ_ACCT|XFS_QUOTA_UDQ_ENFD)
/* Q_SYNC is not supported on XFS filesystems, so emulate it */
if ((dev != NULL) && (!strncmp(dev, "(XFS)", 5))) {
fs_quota_stat_t fsq_stat;
sync();
RETVAL = quotactl(Q_GETQSTAT, dev+5, 0, CADR &fsq_stat);
if (!RETVAL && ((fsq_stat.qs_flags & XFS_UQUOTA) != XFS_UQUOTA)) {
errno = ENOENT;
RETVAL = -1;
}
}
else
#endif
RETVAL = quotactl(Q_SYNC, dev, 0, NULL);
#endif
#endif
}
#endif
#endif /* NETBSD_LIBQUOTA */
OUTPUT:
RETVAL
void
rpcquery(host,path,uid=getuid(),kind=0)
char * host
char * path
int uid
int kind
PPCODE:
{
#ifndef NO_RPC
struct quota_xs_nfs_rslt rslt;
quota_rpc_strerror = NULL;
if (getnfsquota(host, path, uid, kind, &rslt) == 0) {
EXTEND(SP, 8);
PUSHs(sv_2mortal(newSVnv(Q_DIV(rslt.bcur))));
PUSHs(sv_2mortal(newSVnv(Q_DIV(rslt.bsoft))));
PUSHs(sv_2mortal(newSVnv(Q_DIV(rslt.bhard))));
PUSHs(sv_2mortal(newSViv(rslt.btime)));
PUSHs(sv_2mortal(newSVnv(rslt.fcur)));
PUSHs(sv_2mortal(newSVnv(rslt.fsoft)));
PUSHs(sv_2mortal(newSVnv(rslt.fhard)));
PUSHs(sv_2mortal(newSViv(rslt.ftime)));
}
#else
errno = ENOTSUP;
#endif
}
void
rpcpeer(port=0,use_tcp=FALSE,timeout=RPC_DEFAULT_TIMEOUT)
unsigned port
unsigned use_tcp
unsigned timeout
PPCODE:
{
#ifndef NO_RPC
quota_rpc_strerror = NULL;
quota_rpc_cfg.port = port;
quota_rpc_cfg.use_tcp = use_tcp;
quota_rpc_cfg.timeout = timeout;
#endif
}
int
rpcauth(uid=-1,gid=-1,hostname=NULL)
int uid
int gid
char * hostname
CODE:
{
#ifndef NO_RPC
quota_rpc_strerror = NULL;
if ((uid == -1) && (gid == -1) && (hostname==NULL)) {
/* reset to default values */
quota_rpc_auth.uid = uid;
quota_rpc_auth.gid = gid;
quota_rpc_auth.hostname[0] = 0;
RETVAL = 0;
} else {
if (uid == -1)
quota_rpc_auth.uid = getuid();
else
quota_rpc_auth.uid = uid;
if (gid == -1)
quota_rpc_auth.gid = getgid();
else
quota_rpc_auth.gid = gid;
if (hostname == NULL) {
RETVAL = gethostname(quota_rpc_auth.hostname, MAX_MACHINE_NAME);
} else if (strlen(hostname) < MAX_MACHINE_NAME) {
strcpy(quota_rpc_auth.hostname, hostname);
RETVAL = 0;
} else {
errno = EINVAL;
RETVAL = -1;
}
}
#endif
}
OUTPUT:
RETVAL
int
setmntent()
CODE:
{
#ifndef NO_RPC
quota_rpc_strerror = NULL;
#endif
#ifndef AIX
#ifndef NO_MNTENT
#ifndef NO_OPEN_MNTTAB
if(mtab != NULL) endmntent(mtab);
if((mtab = setmntent(MOUNTED, "r")) == NULL)
#else
if(mtab != NULL) fclose(mtab);
if((mtab = std_fopen (MOUNTED,"r")) == NULL)
#endif
RETVAL = -1;
else
RETVAL = 0;
#else /* NO_MNTENT */
/* if(mtab != NULL) free(mtab); */
if((mtab_size = getmntinfo(&mtab, MNT_NOWAIT)) <= 0)
RETVAL = -1;
else
RETVAL = 0;
mntp = mtab;
#endif
#else /* AIX */
int count, space;
if(mtab != NULL) free(mtab);
count = mntctl(MCTL_QUERY, sizeof(space), (char *) &space);
if (count == 0) {
mtab = (struct vmount *) malloc(space);
if (mtab != NULL) {
count = mntctl(MCTL_QUERY, space, (char *) mtab);
if (count > 0) {
aix_mtab_count = count;
aix_mtab_idx = 0;
RETVAL = 0;
}
else { /* error, or size changed between calls */
if (count == 0) errno = EINTR;
RETVAL = -1;
}
}
else
RETVAL = -1;
}
else if (count < 0)
RETVAL = -1;
else { /* should never happen */
errno = ENOENT;
RETVAL = -1;
}
#endif
}
OUTPUT:
RETVAL
void
getmntent()
PPCODE:
{
#ifndef NO_RPC
quota_rpc_strerror = NULL;
#endif
#ifndef AIX
#ifndef NO_MNTENT
#ifndef NO_OPEN_MNTTAB
struct mntent *mntp;
if(mtab != NULL) {
mntp = getmntent(mtab);
if(mntp != NULL) {
EXTEND(SP, 4);
PUSHs(sv_2mortal(newSVpv(mntp->mnt_fsname, strlen(mntp->mnt_fsname))));
PUSHs(sv_2mortal(newSVpv(mntp->mnt_dir, strlen(mntp->mnt_dir))));
PUSHs(sv_2mortal(newSVpv(mntp->mnt_type, strlen(mntp->mnt_type))));
PUSHs(sv_2mortal(newSVpv(mntp->mnt_opts, strlen(mntp->mnt_opts))));
}
}
else
errno = EBADF;
#else /* NO_OPEN_MNTTAB */
struct mnttab mntp;
if(mtab != NULL) {
if(getmntent(mtab, &mntp) == 0) {
EXTEND(SP, 4);
PUSHs(sv_2mortal(newSVpv(mntp.mnt_special, strlen(mntp.mnt_special))));
PUSHs(sv_2mortal(newSVpv(mntp.mnt_mountp, strlen(mntp.mnt_mountp))));
PUSHs(sv_2mortal(newSVpv(mntp.mnt_fstype, strlen(mntp.mnt_fstype))));
PUSHs(sv_2mortal(newSVpv(mntp.mnt_mntopts, strlen(mntp.mnt_mntopts))));
}
}
else
errno = EBADF;
#endif
#else /* NO_MNTENT */
if((mtab != NULL) && mtab_size) {
EXTEND(SP,4);
PUSHs(sv_2mortal(newSVpv(mntp->f_mntfromname, strlen(mntp->f_mntfromname))));
PUSHs(sv_2mortal(newSVpv(mntp->f_mntonname, strlen(mntp->f_mntonname))));
#ifdef OSF_QUOTA
char *fstype = getvfsbynumber((int)mntp->f_type);
if (fstype != (char *) -1)
PUSHs(sv_2mortal(newSVpv(fstype, strlen(fstype))));
else
#endif
PUSHs(sv_2mortal(newSVpv(mntp->f_fstypename, strlen(mntp->f_fstypename))));
PUSHs(sv_2mortal(newSVpvf("%s%s%s%s%s%s%s",
((mntp->MNTINFO_FLAG_EL & MNT_LOCAL) ? "local" : "non-local"),
((mntp->MNTINFO_FLAG_EL & MNT_RDONLY) ? ",read-only" : ""),
((mntp->MNTINFO_FLAG_EL & MNT_SYNCHRONOUS) ? ",sync" : ""),
((mntp->MNTINFO_FLAG_EL & MNT_NOEXEC) ? ",noexec" : ""),
((mntp->MNTINFO_FLAG_EL & MNT_NOSUID) ? ",nosuid" : ""),
((mntp->MNTINFO_FLAG_EL & MNT_ASYNC) ? ",async" : ""),
((mntp->MNTINFO_FLAG_EL & MNT_QUOTA) ? ",quotas" : ""))));
mtab_size--;
mntp++;
}
#endif
#else /* AIX */
struct vmount *vmp;
if ((mtab != NULL) && (aix_mtab_idx < aix_mtab_count)) {
cp = (char *) mtab;
for (i=0; i<aix_mtab_idx; i++) {
vmp = (struct vmount *) cp;
cp += vmp->vmt_length;
}
vmp = (struct vmount *) cp;
aix_mtab_idx += 1;
EXTEND(SP,4);
if ((vmp->vmt_gfstype != MNT_NFS) && (vmp->vmt_gfstype != MNT_NFS3)) {
cp = vmt2dataptr(vmp, VMT_OBJECT);
PUSHs(sv_2mortal(newSVpv(cp, strlen(cp))));
}
else {
uchar *mp, *cp2;
cp = vmt2dataptr(vmp, VMT_HOST);
cp2 = vmt2dataptr(vmp, VMT_OBJECT);
mp = malloc(strlen(cp) + strlen(cp2) + 2);
if (mp != NULL) {
strcpy(mp, cp);
strcat(mp, ":");
strcat(mp, cp2);
PUSHs(sv_2mortal(newSVpv(mp, strlen(mp))));
free(mp);
}
else {
cp = "?";
PUSHs(sv_2mortal(newSVpv(cp, strlen(cp))));
}
}
cp = vmt2dataptr(vmp, VMT_STUB);
PUSHs(sv_2mortal(newSVpv(cp, strlen(cp))));
switch(vmp->vmt_gfstype) {
case MNT_NFS: cp = "nfs"; break;
case MNT_NFS3: cp = "nfs"; break;
case MNT_JFS: cp = "jfs"; break;
#if defined(MNT_AIX) && defined(MNT_J2) && (MNT_AIX==MNT_J2)
case MNT_J2: cp = "jfs2"; break;
#else
#if defined(MNT_J2)
case MNT_J2: cp = "jfs2"; break;
#endif
case MNT_AIX: cp = "aix"; break;
#endif
case 4: cp = "afs"; break;
case MNT_CDROM: cp = "cdrom,ignore"; break;
default: cp = "unknown,ignore"; break;
}
PUSHs(sv_2mortal(newSVpv(cp, strlen(cp))));
cp = vmt2dataptr(vmp, VMT_ARGS);
PUSHs(sv_2mortal(newSVpv(cp, strlen(cp))));
}
#endif
}
void
endmntent()
PPCODE:
{
#ifndef NO_RPC
quota_rpc_strerror = NULL;
#endif
if(mtab != NULL) {
#ifndef AIX
#ifndef NO_MNTENT
#ifndef NO_OPEN_MNTTAB
endmntent(mtab); /* returns always 1 in SunOS */
#else
std_fclose (mtab);
#endif
/* #else: if(mtab != NULL) free(mtab); */
#endif
#else /* AIX */
free(mtab);
#endif
mtab = NULL;
}
}
char *
getqcargtype()
CODE:
static char ret[25];
#if defined(USE_IOCTL) || defined(QCARG_MNTPT)
strcpy(ret, "mntpt");
#else
#if defined(HAVE_JFS2)
strcpy(ret, "any,JFS2");
#else
#if defined(AIX) || defined(OSF_QUOTA)
strcpy(ret, "any");
#else
#ifdef Q_CTL_V2
strcpy(ret, "qfile");
#else
/* this branch applies to Q_CTL_V3 (Linux) too */
#ifdef SGI_XFS
strcpy(ret, "dev,XFS");
#else
strcpy(ret, "dev");
#endif
#endif
#endif
#endif
#endif
#ifdef AFSQUOTA
strcat(ret, ",AFS");
#endif
#ifdef SOLARIS_VXFS
strcat(ret, ",VXFS");
#endif
RETVAL = ret;
OUTPUT:
RETVAL
const char *
strerr()
CODE:
( run in 2.245 seconds using v1.01-cache-2.11-cpan-5511b514fd6 )