From 67a29a8661ca965ffa86666aee7832ef9f33dadb Mon Sep 17 00:00:00 2001 From: Uri Simchoni Date: Sun, 13 Mar 2016 08:18:47 +0200 Subject: [PATCH] smbd: remove quota support for some ancient OSs Remove quota support for SunOS4 and VxFS on Solaris 2 Signed-off-by: Uri Simchoni Reviewed-by: Jeremy Allison --- source3/smbd/quotas.c | 200 +----------------------------------------- tests/oldquotas.c | 61 +------------ 2 files changed, 4 insertions(+), 257 deletions(-) diff --git a/source3/smbd/quotas.c b/source3/smbd/quotas.c index 8e414168929..58d8460641c 100644 --- a/source3/smbd/quotas.c +++ b/source3/smbd/quotas.c @@ -40,32 +40,13 @@ #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 - */ -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 #include -#if defined(SUNOS5) #include #include #include -#else /* defined(SUNOS4) */ -#include -#include -#endif - -#if defined(SUNOS5) /**************************************************************************** Allows querying of remote hosts for quotas on NFS mounted shares. @@ -229,7 +210,6 @@ static bool nfs_quotas(char *nfspath, uid_t euser_id, uint64_t *bsize, uint64_t DEBUG(10,("nfs_quotas: End of nfs_quotas\n" )); return ret; } -#endif /**************************************************************************** try to get the disk space from disk quotas (SunOS & Solaris2 version) @@ -242,13 +222,9 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize, 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; @@ -264,7 +240,6 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize, 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; } @@ -291,28 +266,6 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize, } 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; } @@ -322,7 +275,6 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize, } become_root(); -#if defined(SUNOS5) if (strcmp(mnt.mnt_fstype, "nfs") == 0) { bool retval; DEBUG(5,("disk_quotas: looking for mountpath (NFS) \"%s\"\n", @@ -343,10 +295,6 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize, 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(); @@ -354,19 +302,7 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize, 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. @@ -403,7 +339,7 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize, } -#else +#else /* not Solaris */ #if AIX /* AIX quota patch from Ole Holm Nielsen */ @@ -523,137 +459,7 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize, return (True); } -#endif - -#if defined(VXFS_QUOTA) - -/**************************************************************************** -Try to get the disk space from Veritas disk quotas. - David Lee 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 - -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 -#endif -#include -#include -#include -#include -#include - -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 */ diff --git a/tests/oldquotas.c b/tests/oldquotas.c index 0aacf2363c2..54dc242248c 100644 --- a/tests/oldquotas.c +++ b/tests/oldquotas.c @@ -12,27 +12,13 @@ #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 #include -#if defined(SUNOS5) /* Solaris */ #include #include #include -#else /* SunOS4 */ -#include -#include -#endif /* Solaris */ - -#if defined(SUNOS5) /* Solaris */ /**************************************************************************** Allows querying of remote hosts for quotas on NFS mounted shares. @@ -53,7 +39,6 @@ static bool nfs_quotas(char *nfspath, uid_t euser_id, uint64_t *bsize, clnt = clnt_create("host", RQUOTAPROG, RQUOTAVERS, "udp"); return true; } -#endif /* Solaris */ /**************************************************************************** try to get the disk space from disk quotas (SunOS & Solaris2 version) @@ -64,25 +49,14 @@ bool disk_quotas(const char *path, uint64_t *bsize, uint64_t *dfree, 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; } @@ -126,39 +100,6 @@ bool disk_quotas(const char *path, uint64_t *bsize, uint64_t *dfree, #endif /* SunOS / Solaris */ -#if defined(VXFS_QUOTA) /* Veritas for Solaris 2 */ - -#if defined(SUNOS5) - -#include -#include -#include -#include -#include -#include - -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" -- 2.34.1