#ifdef WITH_QUOTAS
-#if defined(VXFS_QUOTA)
-
-/*
- * In addition to their native filesystems, some systems have Veritas VxFS.
- * Declare here, define at end: reduces likely "include" interaction problems.
- * David Lee <T.D.Lee@durham.ac.uk>
- */
-bool disk_quotas_vxfs(const char *name, char *path, uint64_t *bsize, uint64_t *dfree, uint64_t *dsize);
-
-#endif /* VXFS_QUOTA */
-
-
-#if defined(SUNOS5) || defined(SUNOS4)
+#if defined(SUNOS5) /* Solaris */
#include <fcntl.h>
#include <sys/param.h>
-#if defined(SUNOS5)
#include <sys/fs/ufs_quota.h>
#include <sys/mnttab.h>
#include <sys/mntent.h>
-#else /* defined(SUNOS4) */
-#include <ufs/quota.h>
-#include <mntent.h>
-#endif
-
-#if defined(SUNOS5)
/****************************************************************************
Allows querying of remote hosts for quotas on NFS mounted shares.
DEBUG(10,("nfs_quotas: End of nfs_quotas\n" ));
return ret;
}
-#endif
/****************************************************************************
try to get the disk space from disk quotas (SunOS & Solaris2 version)
uid_t euser_id;
int ret;
struct dqblk D;
-#if defined(SUNOS5)
struct quotctl command;
int file;
struct mnttab mnt;
-#else /* SunOS4 */
- struct mntent *mnt;
-#endif
char *name = NULL;
FILE *fd;
SMB_STRUCT_STAT sbuf;
devno = sbuf.st_ex_dev ;
DEBUG(5,("disk_quotas: looking for path \"%s\" devno=%x\n",
path, (unsigned int)devno));
-#if defined(SUNOS5)
if ((fd = fopen(MNTTAB, "r")) == NULL) {
return false;
}
}
fclose(fd);
-#else /* SunOS4 */
- if ((fd = setmntent(MOUNTED, "r")) == NULL) {
- return false;
- }
-
- while ((mnt = getmntent(fd)) != NULL) {
- if (sys_stat(mnt->mnt_dir, &sbuf, false) == -1) {
- continue;
- }
- DEBUG(5,("disk_quotas: testing \"%s\" devno=%x\n",
- mnt->mnt_dir,
- (unsigned int)sbuf.st_ex_dev));
- if (sbuf.st_ex_dev == devno) {
- found = true;
- name = talloc_strdup(talloc_tos(),
- mnt->mnt_fsname);
- break;
- }
- }
-
- endmntent(fd);
-#endif
if (!found) {
return false;
}
}
become_root();
-#if defined(SUNOS5)
if (strcmp(mnt.mnt_fstype, "nfs") == 0) {
bool retval;
DEBUG(5,("disk_quotas: looking for mountpath (NFS) \"%s\"\n",
command.addr = (caddr_t) &D;
ret = ioctl(file, Q_QUOTACTL, &command);
close(file);
-#else
- DEBUG(5,("disk_quotas: trying quotactl on device \"%s\"\n", name));
- ret = quotactl(Q_GETQUOTA, name, euser_id, &D);
-#endif
unbecome_root();
DEBUG(5,("disk_quotas ioctl (Solaris) failed. Error = %s\n",
strerror(errno) ));
-#if defined(SUNOS5) && defined(VXFS_QUOTA)
- /* If normal quotactl() fails, try vxfs private calls */
- set_effective_uid(euser_id);
- DEBUG(5,("disk_quotas: mount type \"%s\"\n", mnt.mnt_fstype));
- if ( 0 == strcmp ( mnt.mnt_fstype, "vxfs" )) {
- bool retval;
- retval = disk_quotas_vxfs(name, path,
- bsize, dfree, dsize);
- return retval;
- }
-#else
return false;
-#endif
}
/* If softlimit is zero, set it equal to hardlimit.
}
-#else
+#else /* not Solaris */
#if AIX
/* AIX quota patch from Ole Holm Nielsen <ohnielse@fysik.dtu.dk> */
return (True);
}
-#endif
-
-#if defined(VXFS_QUOTA)
-
-/****************************************************************************
-Try to get the disk space from Veritas disk quotas.
- David Lee <T.D.Lee@durham.ac.uk> August 1999.
-
-Background assumptions:
- Potentially under many Operating Systems. Initially Solaris 2.
-
- My guess is that Veritas is largely, though not entirely,
- independent of OS. So I have separated it out.
-
- There may be some details. For example, OS-specific "include" files.
-
- It is understood that HPUX 10 somehow gets Veritas quotas without
- any special effort; if so, this routine need not be compiled in.
- Dirk De Wachter <Dirk.DeWachter@rug.ac.be>
-
-Warning:
- It is understood that Veritas do not publicly support this ioctl interface.
- Rather their preference would be for the user (us) to call the native
- OS and then for the OS itself to call through to the VxFS filesystem.
- Presumably HPUX 10, see above, does this.
-
-Hints for porting:
- Add your OS to "IFLIST" below.
- Get it to compile successfully:
- Almost certainly "include"s require attention: see SUNOS5.
- In the main code above, arrange for it to be called: see SUNOS5.
- Test!
-
-****************************************************************************/
-
-/* "IFLIST"
- * This "if" is a list of ports:
- * if defined(OS1) || defined(OS2) || ...
- */
-#if defined(SUNOS5)
-
-#if defined(SUNOS5)
-#include <sys/fs/vx_solaris.h>
-#endif
-#include <sys/fs/vx_machdep.h>
-#include <sys/fs/vx_layout.h>
-#include <sys/fs/vx_quota.h>
-#include <sys/fs/vx_aioctl.h>
-#include <sys/fs/vx_ioctl.h>
-
-bool disk_quotas_vxfs(const char *name, char *path, uint64_t *bsize, uint64_t *dfree, uint64_t *dsize)
-{
- uid_t user_id, euser_id;
- int ret;
- struct vx_dqblk D;
- struct vx_quotctl quotabuf;
- struct vx_genioctl genbuf;
- char *qfname;
- int file;
-
- /*
- * "name" may or may not include a trailing "/quotas".
- * Arranging consistency of calling here in "quotas.c" may not be easy and
- * it might be easier to examine and adjust it here.
- * Fortunately, VxFS seems not to mind at present.
- */
- qfname = talloc_strdup(talloc_tos(), name);
- if (!qfname) {
- return false;
- }
- /* pstrcat(qfname, "/quotas") ; */ /* possibly examine and adjust "name" */
-
- euser_id = geteuid();
- set_effective_uid(0);
-
- DEBUG(5,("disk_quotas: looking for VxFS quotas file \"%s\"\n", qfname));
- if((file=open(qfname, O_RDONLY,0))<0) {
- set_effective_uid(euser_id);
- return(False);
- }
- genbuf.ioc_cmd = VX_QUOTACTL;
- genbuf.ioc_up = (void *) "abuf;
-
- quotabuf.cmd = VX_GETQUOTA;
- quotabuf.uid = euser_id;
- quotabuf.addr = (caddr_t) &D;
- ret = ioctl(file, VX_ADMIN_IOCTL, &genbuf);
- close(file);
-
- set_effective_uid(euser_id);
-
- if (ret < 0) {
- DEBUG(5,("disk_quotas ioctl (VxFS) failed. Error = %s\n", strerror(errno) ));
- return(False);
- }
-
- /* If softlimit is zero, set it equal to hardlimit.
- */
-
- if (D.dqb_bsoftlimit==0)
- D.dqb_bsoftlimit = D.dqb_bhardlimit;
-
- /* Use softlimit to determine disk space. A user exceeding the quota is told
- * that there's no space left. Writes might actually work for a bit if the
- * hardlimit is set higher than softlimit. Effectively the disk becomes
- * made of rubber latex and begins to expand to accommodate the user :-)
- */
- DEBUG(5,("disk_quotas for path \"%s\" block c/s/h %ld/%ld/%ld; file c/s/h %ld/%ld/%ld\n",
- path, D.dqb_curblocks, D.dqb_bsoftlimit, D.dqb_bhardlimit,
- D.dqb_curfiles, D.dqb_fsoftlimit, D.dqb_fhardlimit));
-
- if (D.dqb_bsoftlimit==0)
- return(False);
- *bsize = DEV_BSIZE;
- *dsize = D.dqb_bsoftlimit;
-
- if (D.dqb_curblocks > D.dqb_bsoftlimit) {
- *dfree = 0;
- *dsize = D.dqb_curblocks;
- } else
- *dfree = D.dqb_bsoftlimit - D.dqb_curblocks;
-
- DEBUG(5,("disk_quotas for path \"%s\" returning bsize %.0f, dfree %.0f, dsize %.0f\n",
- path,(double)*bsize,(double)*dfree,(double)*dsize));
-
- return(True);
-}
-
-#endif /* SUNOS5 || ... */
-
-#endif /* VXFS_QUOTA */
+#endif /* Solaris */
#else /* WITH_QUOTAS */
#ifdef WITH_QUOTAS
-#if defined(VXFS_QUOTA) /* Veritas VxFS for Solaris 2 */
-
-bool disk_quotas_vxfs(const char *name, char *path, uint64_t *bsize,
- uint64_t *dfree, uint64_t *dsize);
-
-#endif /* VXFS_QUOTA */
-
-#if defined(SUNOS5) || defined(SUNOS4)
+#if defined(SUNOS5) /* Solaris */
#include <fcntl.h>
#include <sys/param.h>
-#if defined(SUNOS5) /* Solaris */
#include <sys/fs/ufs_quota.h>
#include <sys/mnttab.h>
#include <sys/mntent.h>
-#else /* SunOS4 */
-#include <ufs/quota.h>
-#include <mntent.h>
-#endif /* Solaris */
-
-#if defined(SUNOS5) /* Solaris */
/****************************************************************************
Allows querying of remote hosts for quotas on NFS mounted shares.
clnt = clnt_create("host", RQUOTAPROG, RQUOTAVERS, "udp");
return true;
}
-#endif /* Solaris */
/****************************************************************************
try to get the disk space from disk quotas (SunOS & Solaris2 version)
uint64_t *dsize)
{
int ret;
-#if defined(SUNOS5) /* Solaris */
struct quotctl command;
-#else /* SunOS4 */
- struct mntent *mnt;
-#endif /* Solaris */
-#if defined(SUNOS5) /* Solaris */
nfs_quotas("", 0, bsize, dfree, dsize);
command.op = Q_GETQUOTA;
command.uid = 0;
command.addr = NULL;
ret = ioctl(1, Q_QUOTACTL, &command);
-#else /* SunOS4 */
- ret = quotactl(Q_GETQUOTA, "", 0, NULL);
-#endif /* Solaris */
-#if defined(SUNOS5) && defined(VXFS_QUOTA) /* Solaris 2 VxFS */
- disk_quotas_vxfs("", path, bsize, dfree, dsize);
-#endif /* Solaris 2 VxFS */
return true;
}
#endif /* SunOS / Solaris */
-#if defined(VXFS_QUOTA) /* Veritas for Solaris 2 */
-
-#if defined(SUNOS5)
-
-#include <sys/fs/vx_solaris.h>
-#include <sys/fs/vx_machdep.h>
-#include <sys/fs/vx_layout.h>
-#include <sys/fs/vx_quota.h>
-#include <sys/fs/vx_aioctl.h>
-#include <sys/fs/vx_ioctl.h>
-
-bool disk_quotas_vxfs(const char *name, char *path, uint64_t *bsize,
- uint64_t *dfree, uint64_t *dsize)
-{
- struct vx_dqblk D;
- struct vx_quotctl quotabuf;
- struct vx_genioctl genbuf;
-
- genbuf.ioc_cmd = VX_QUOTACTL;
- genbuf.ioc_up = (void *)"abuf;
-
- quotabuf.cmd = VX_GETQUOTA;
- quotabuf.uid = 0;
- quotabuf.addr = (caddr_t)&D;
- ret = ioctl(1, VX_ADMIN_IOCTL, &genbuf);
-
- return true;
-}
-
-#endif /* SUNOS5 */
-
-#endif /* VXFS_QUOTA */
-
#else /* WITH_QUOTAS */
#error "This test should be called with WITH_QUOTAS defined"