idl/ioctl: change QAR response array to a DATA_BLOB
[samba.git] / source3 / lib / sysquotas.c
index 62714cf4d51579cc442dfdf07cbae0059502cc42..2ef1d1bf8f5a7d942b1ed8cc9dfbc902c3b57e69 100644 (file)
@@ -5,7 +5,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -14,8 +14,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 
@@ -31,8 +30,6 @@
 /*#endif HAVE_QUOTACTL_4A */
 #elif defined(HAVE_QUOTACTL_4B)
 
-#error HAVE_QUOTACTL_4B not implemeted
-
 /*#endif HAVE_QUOTACTL_4B */
 #elif defined(HAVE_QUOTACTL_3)
 
@@ -61,10 +58,10 @@ static int sys_path_to_bdev(const char *path, char **mntpath, char **bdev, char
        (*bdev) = NULL;
        (*fs) = NULL;
        
-       if ( sys_stat(path, &S) == -1 )
+       if ( sys_stat(path, &S, false) == -1 )
                return (-1);
 
-       devno = S.st_dev ;
+       devno = S.st_ex_dev ;
 
        fp = setmntent(MOUNTED,"r");
        if (fp == NULL) {
@@ -72,10 +69,10 @@ static int sys_path_to_bdev(const char *path, char **mntpath, char **bdev, char
        }
   
        while ((mnt = getmntent(fp))) {
-               if ( sys_stat(mnt->mnt_dir,&S) == -1 )
+               if ( sys_stat(mnt->mnt_dir, &S, false) == -1 )
                        continue ;
 
-               if (S.st_dev == devno) {
+               if (S.st_ex_dev == devno) {
                        (*mntpath) = SMB_STRDUP(mnt->mnt_dir);
                        (*bdev) = SMB_STRDUP(mnt->mnt_fsname);
                        (*fs)   = SMB_STRDUP(mnt->mnt_type);
@@ -115,11 +112,11 @@ static int sys_path_to_bdev(const char *path, char **mntpath, char **bdev, char
        
        /* find the block device file */
 
-       if ((ret=sys_stat(path, &S))!=0) {
+       if ((ret=sys_stat(path, &S, false))!=0) {
                return ret;
        }
        
-       if ((ret=devnm(S_IFBLK, S.st_dev, dev_disk, 256, 1))!=0) {
+       if ((ret=devnm(S_IFBLK, S.st_ex_dev, dev_disk, 256, 1))!=0) {
                return ret;     
        }
 
@@ -175,22 +172,28 @@ static struct {
        int (*get_quota)(const char *path, const char *bdev, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *dp);
        int (*set_quota)(const char *path, const char *bdev, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *dp);
 } sys_quota_backends[] = {
-#ifdef HAVE_XFS_QUOTAS
+#if defined HAVE_XFS_QUOTAS
        {"xfs", sys_get_xfs_quota,      sys_set_xfs_quota},
+       {"gfs", sys_get_xfs_quota,      sys_set_xfs_quota},
+       {"gfs2", sys_get_xfs_quota,     sys_set_xfs_quota},
 #endif /* HAVE_XFS_QUOTAS */
-       {NULL,  NULL,                   NULL}   
+#ifdef HAVE_NFS_QUOTAS
+       {"nfs", sys_get_nfs_quota,      sys_set_nfs_quota},
+       {"nfs4", sys_get_nfs_quota,     sys_set_nfs_quota},
+#endif /* HAVE_NFS_QUOTAS */
+       {NULL,  NULL,                   NULL}
 };
 
 static int command_get_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *dp)
 {
        const char *get_quota_command;
        char **lines = NULL;
-       
-       get_quota_command = lp_get_quota_command();
+
+       get_quota_command = lp_get_quota_command(talloc_tos());
        if (get_quota_command && *get_quota_command) {
                const char *p;
                char *p2;
-               pstring syscmd;
+               char *syscmd = NULL;
                int _id = -1;
 
                switch(qtype) {
@@ -207,13 +210,16 @@ static int command_get_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t
                                return -1;
                }
 
-               slprintf(syscmd, sizeof(syscmd)-1, 
-                       "%s \"%s\" %d %d", 
-                       get_quota_command, path, qtype, _id);
+               if (asprintf(&syscmd, "%s %s %d %d",
+                       get_quota_command, path, qtype, _id) < 0) {
+                       return -1;
+               }
 
                DEBUG (3, ("get_quota: Running command %s\n", syscmd));
 
                lines = file_lines_pload(syscmd, NULL);
+               SAFE_FREE(syscmd);
+
                if (lines) {
                        char *line = lines[0];
 
@@ -221,7 +227,7 @@ static int command_get_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t
 
                        /* we need to deal with long long unsigned here, if supported */
 
-                       dp->qflags = (enum SMB_QUOTA_TYPE)strtoul(line, &p2, 10);
+                       dp->qflags = strtoul(line, &p2, 10);
                        p = p2;
                        while (p && *p && isspace(*p)) {
                                p++;
@@ -293,12 +299,11 @@ static int command_get_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t
                                dp->bsize = 1024;
                        }
 
-                       file_lines_free(lines);
+                       TALLOC_FREE(lines);
                        lines = NULL;
 
                        DEBUG (3, ("Parsed output of get_quota, ...\n"));
 
-#ifdef LARGE_SMB_OFF_T
                        DEBUGADD (5,( 
                                "qflags:%u curblocks:%llu softlimit:%llu hardlimit:%llu\n"
                                "curinodes:%llu isoftlimit:%llu ihardlimit:%llu bsize:%llu\n", 
@@ -307,16 +312,6 @@ static int command_get_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t
                                (long long unsigned)dp->curinodes,
                                (long long unsigned)dp->isoftlimit,(long long unsigned)dp->ihardlimit,
                                (long long unsigned)dp->bsize));
-#else /* LARGE_SMB_OFF_T */
-                       DEBUGADD (5,( 
-                               "qflags:%u curblocks:%lu softlimit:%lu hardlimit:%lu\n"
-                               "curinodes:%lu isoftlimit:%lu ihardlimit:%lu bsize:%lu\n", 
-                               dp->qflags,(long unsigned)dp->curblocks,
-                               (long unsigned)dp->softlimit,(long unsigned)dp->hardlimit,
-                               (long unsigned)dp->curinodes,
-                               (long unsigned)dp->isoftlimit,(long unsigned)dp->ihardlimit,
-                               (long unsigned)dp->bsize));
-#endif /* LARGE_SMB_OFF_T */
                        return 0;
                }
 
@@ -326,10 +321,10 @@ static int command_get_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t
 
        errno = ENOSYS;
        return -1;
-       
+
 invalid_param:
 
-       file_lines_free(lines);
+       TALLOC_FREE(lines);
        DEBUG(0,("The output of get_quota_command is invalid!\n"));
        return -1;
 }
@@ -337,11 +332,11 @@ invalid_param:
 static int command_set_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *dp)
 {
        const char *set_quota_command;
-       
-       set_quota_command = lp_set_quota_command();
+
+       set_quota_command = lp_set_quota_command(talloc_tos());
        if (set_quota_command && *set_quota_command) {
-               char **lines;
-               pstring syscmd;
+               char **lines = NULL;
+               char *syscmd = NULL;
                int _id = -1;
 
                switch(qtype) {
@@ -357,38 +352,28 @@ static int command_set_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t
                                return -1;
                }
 
-#ifdef LARGE_SMB_OFF_T
-               slprintf(syscmd, sizeof(syscmd)-1, 
-                       "%s \"%s\" %d %d "
+               if (asprintf(&syscmd,
+                       "%s %s %d %d "
                        "%u %llu %llu "
-                       "%llu %llu %llu ", 
+                       "%llu %llu %llu ",
                        set_quota_command, path, qtype, _id, dp->qflags,
                        (long long unsigned)dp->softlimit,(long long unsigned)dp->hardlimit,
                        (long long unsigned)dp->isoftlimit,(long long unsigned)dp->ihardlimit,
-                       (long long unsigned)dp->bsize);
-#else /* LARGE_SMB_OFF_T */
-               slprintf(syscmd, sizeof(syscmd)-1, 
-                       "%s \"%s\" %d %d "
-                       "%u %lu %lu "
-                       "%lu %lu %lu ", 
-                       set_quota_command, path, qtype, _id, dp->qflags,
-                       (long unsigned)dp->softlimit,(long unsigned)dp->hardlimit,
-                       (long unsigned)dp->isoftlimit,(long unsigned)dp->ihardlimit,
-                       (long unsigned)dp->bsize);
-#endif /* LARGE_SMB_OFF_T */
-
-
+                       (long long unsigned)dp->bsize) < 0) {
+                       return -1;
+               }
 
                DEBUG (3, ("get_quota: Running command %s\n", syscmd));
 
                lines = file_lines_pload(syscmd, NULL);
+               SAFE_FREE(syscmd);
                if (lines) {
                        char *line = lines[0];
 
                        DEBUG (3, ("Read output from set_quota, \"%s\"\n", line));
 
-                       file_lines_free(lines);
-                       
+                       TALLOC_FREE(lines);
+
                        return 0;
                }
                DEBUG (0, ("set_quota_command failed!\n"));
@@ -403,7 +388,7 @@ int sys_get_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DI
 {
        int ret = -1;
        int i;
-       BOOL ready = False;
+       bool ready = False;
        char *mntpath = NULL;
        char *bdev = NULL;
        char *fs = NULL;
@@ -423,7 +408,7 @@ int sys_get_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DI
        }
 
        errno = 0;
-       DEBUG(10,("sys_get_quota() uid(%u, %u)\n", (unsigned)getuid(), (unsigned)geteuid()));
+       DEBUG(10,("sys_get_quota() uid(%u, %u), fs(%s)\n", (unsigned)getuid(), (unsigned)geteuid(), fs));
 
        for (i=0;(fs && sys_quota_backends[i].name && sys_quota_backends[i].get_quota);i++) {
                if (strcmp(fs,sys_quota_backends[i].name)==0) {
@@ -468,7 +453,7 @@ int sys_set_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DI
 {
        int ret = -1;
        int i;
-       BOOL ready = False;
+       bool ready = False;
        char *mntpath = NULL;
        char *bdev = NULL;
        char *fs = NULL;