]> granicus.if.org Git - strace/blobdiff - quota.c
io.c: use printaddr and umove_or_printaddr
[strace] / quota.c
diff --git a/quota.c b/quota.c
index 638beb60b682f31f0386caeff845b15e3449ea3c..99f97771bd6e00ad85c81570b905014be2d2a48c 100644 (file)
--- a/quota.c
+++ b/quota.c
  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *     $Id$
  */
 
 #include "defs.h"
 
-#include <inttypes.h>
-
 #define SUBCMDMASK  0x00ff
 #define SUBCMDSHIFT 8
 #define QCMD_CMD(cmd)  ((u_int32_t)(cmd) >> SUBCMDSHIFT)
 #define Q_XQUOTARM     XQM_CMD(0x6)
 #define Q_XQUOTASYNC   XQM_CMD(0x7)
 
-static const struct xlat quotacmds[] = {
-       {Q_V1_QUOTAON, "Q_V1_QUOTAON"},
-       {Q_V1_QUOTAOFF, "Q_V1_QUOTAOFF"},
-       {Q_V1_GETQUOTA, "Q_V1_GETQUOTA"},
-       {Q_V1_SETQUOTA, "Q_V1_SETQUOTA"},
-       {Q_V1_SETUSE, "Q_V1_SETUSE"},
-       {Q_V1_SYNC, "Q_V1_SYNC"},
-       {Q_SETQLIM, "Q_SETQLIM"},
-       {Q_V1_GETSTATS, "Q_V1_GETSTATS"},
-       {Q_V1_RSQUASH, "Q_V1_RSQUASH"},
-
-       {Q_V2_GETQUOTA, "Q_V2_GETQUOTA"},
-       {Q_V2_SETQUOTA, "Q_V2_SETQUOTA"},
-       {Q_V2_SETUSE, "Q_V2_SETUSE"},
-       {Q_V2_GETINFO, "Q_V2_GETINFO"},
-       {Q_V2_SETINFO, "Q_V2_SETINFO"},
-       {Q_V2_SETGRACE, "Q_V2_SETGRACE"},
-       {Q_V2_SETFLAGS, "Q_V2_SETFLAGS"},
-       {Q_V2_GETSTATS, "Q_V2_GETSTATS"},
-
-       {Q_SYNC, "Q_SYNC"},
-       {Q_QUOTAON, "Q_QUOTAON"},
-       {Q_QUOTAOFF, "Q_QUOTAOFF"},
-       {Q_GETFMT, "Q_GETFMT"},
-       {Q_GETINFO, "Q_GETINFO"},
-       {Q_SETINFO, "Q_SETINFO"},
-       {Q_GETQUOTA, "Q_GETQUOTA"},
-       {Q_SETQUOTA, "Q_SETQUOTA"},
-
-       {Q_XQUOTAON, "Q_XQUOTAON"},
-       {Q_XQUOTAOFF, "Q_XQUOTAOFF"},
-       {Q_XGETQUOTA, "Q_XGETQUOTA"},
-       {Q_XSETQLIM, "Q_XSETQLIM"},
-       {Q_XGETQSTAT, "Q_XGETQSTAT"},
-       {Q_XQUOTARM, "Q_XQUOTARM"},
-       {Q_XQUOTASYNC, "Q_XQUOTASYNC"},
-
-       {0, NULL},
-};
+#include "xlat/quotacmds.h"
 
 #define USRQUOTA 0
 #define GRPQUOTA 1
 
-static const struct xlat quotatypes[] = {
-       {USRQUOTA, "USRQUOTA"},
-       {GRPQUOTA, "GRPQUOTA"},
-       {0, NULL},
-};
+#include "xlat/quotatypes.h"
 
 /* Quota format identifiers */
 #define QFMT_VFS_OLD 1
 #define QFMT_VFS_V0  2
 
-static const struct xlat quota_formats[] = {
-       {QFMT_VFS_OLD, "QFMT_VFS_OLD"},
-       {QFMT_VFS_V0, "QFMT_VFS_V0"},
-       {0, NULL},
-};
+#include "xlat/quota_formats.h"
 
 #define XFS_QUOTA_UDQ_ACCT     (1<<0)  /* user quota accounting */
 #define XFS_QUOTA_UDQ_ENFD     (1<<1)  /* user quota limits enforcement */
@@ -148,20 +98,8 @@ static const struct xlat quota_formats[] = {
 #define XFS_PROJ_QUOTA         (1<<1)  /* (IRIX) project quota type */
 #define XFS_GROUP_QUOTA                (1<<2)  /* group quota type */
 
-static const struct xlat xfs_quota_flags[] = {
-       {XFS_QUOTA_UDQ_ACCT, "XFS_QUOTA_UDQ_ACCT"},
-       {XFS_QUOTA_UDQ_ENFD, "XFS_QUOTA_UDQ_ENFD"},
-       {XFS_QUOTA_GDQ_ACCT, "XFS_QUOTA_GDQ_ACCT"},
-       {XFS_QUOTA_GDQ_ENFD, "XFS_QUOTA_GDQ_ENFD"},
-       {0, NULL}
-};
-
-static const struct xlat xfs_dqblk_flags[] = {
-       {XFS_USER_QUOTA, "XFS_USER_QUOTA"},
-       {XFS_PROJ_QUOTA, "XFS_PROJ_QUOTA"},
-       {XFS_GROUP_QUOTA, "XFS_GROUP_QUOTA"},
-       {0, NULL}
-};
+#include "xlat/xfs_quota_flags.h"
+#include "xlat/xfs_dqblk_flags.h"
 
 /*
  * Following flags are used to specify which fields are valid
@@ -173,15 +111,7 @@ static const struct xlat xfs_dqblk_flags[] = {
 #define QIF_BTIME      16
 #define QIF_ITIME      32
 
-static const struct xlat if_dqblk_valid[] = {
-       {QIF_BLIMITS, "QIF_BLIMITS"},
-       {QIF_SPACE, "QIF_SPACE"},
-       {QIF_ILIMITS, "QIF_ILIMITS"},
-       {QIF_INODES, "QIF_INODES"},
-       {QIF_BTIME, "QIF_BTIME"},
-       {QIF_ITIME, "QIF_ITIME"},
-       {0, NULL}
-};
+#include "xlat/if_dqblk_valid.h"
 
 struct if_dqblk
 {
@@ -253,12 +183,7 @@ struct xfs_dqblk
 #define IIF_IGRACE     2
 #define IIF_FLAGS      4
 
-static const struct xlat if_dqinfo_valid[] = {
-       {IIF_BGRACE, "IIF_BGRACE"},
-       {IIF_IGRACE, "IIF_IGRACE"},
-       {IIF_FLAGS, "IIF_FLAGS"},
-       {0, NULL}
-};
+#include "xlat/if_dqinfo_valid.h"
 
 struct if_dqinfo
 {
@@ -334,14 +259,8 @@ decode_cmd_data(struct tcb *tcp, u_int32_t cmd, unsigned long data)
                {
                        struct if_dqblk dq;
 
-                       if (cmd == Q_GETQUOTA && syserror(tcp)) {
-                               tprintf("%#lx", data);
+                       if (umove_or_printaddr(tcp, data, &dq))
                                break;
-                       }
-                       if (umove(tcp, data, &dq) < 0) {
-                               tprintf("{???} %#lx", data);
-                               break;
-                       }
                        tprintf("{bhardlimit=%" PRIu64 ", ", dq.dqb_bhardlimit);
                        tprintf("bsoftlimit=%" PRIu64 ", ", dq.dqb_bsoftlimit);
                        tprintf("curspace=%" PRIu64 ", ", dq.dqb_curspace);
@@ -364,14 +283,8 @@ decode_cmd_data(struct tcb *tcp, u_int32_t cmd, unsigned long data)
                {
                        struct v1_dqblk dq;
 
-                       if (cmd == Q_V1_GETQUOTA && syserror(tcp)) {
-                               tprintf("%#lx", data);
+                       if (umove_or_printaddr(tcp, data, &dq))
                                break;
-                       }
-                       if (umove(tcp, data, &dq) < 0) {
-                               tprintf("{???} %#lx", data);
-                               break;
-                       }
                        tprintf("{bhardlimit=%u, ", dq.dqb_bhardlimit);
                        tprintf("bsoftlimit=%u, ", dq.dqb_bsoftlimit);
                        tprintf("curblocks=%u, ", dq.dqb_curblocks);
@@ -387,14 +300,8 @@ decode_cmd_data(struct tcb *tcp, u_int32_t cmd, unsigned long data)
                {
                        struct v2_dqblk dq;
 
-                       if (cmd == Q_V2_GETQUOTA && syserror(tcp)) {
-                               tprintf("%#lx", data);
-                               break;
-                       }
-                       if (umove(tcp, data, &dq) < 0) {
-                               tprintf("{???} %#lx", data);
+                       if (umove_or_printaddr(tcp, data, &dq))
                                break;
-                       }
                        tprintf("{ihardlimit=%u, ", dq.dqb_ihardlimit);
                        tprintf("isoftlimit=%u, ", dq.dqb_isoftlimit);
                        tprintf("curinodes=%u, ", dq.dqb_curinodes);
@@ -410,14 +317,8 @@ decode_cmd_data(struct tcb *tcp, u_int32_t cmd, unsigned long data)
                {
                        struct xfs_dqblk dq;
 
-                       if (cmd == Q_XGETQUOTA && syserror(tcp)) {
-                               tprintf("%#lx", data);
-                               break;
-                       }
-                       if (umove(tcp, data, &dq) < 0) {
-                               tprintf("{???} %#lx", data);
+                       if (umove_or_printaddr(tcp, data, &dq))
                                break;
-                       }
                        tprintf("{version=%d, ", dq.d_version);
                        tprints("flags=");
                        printflags(xfs_dqblk_flags,
@@ -446,14 +347,8 @@ decode_cmd_data(struct tcb *tcp, u_int32_t cmd, unsigned long data)
                {
                        u_int32_t fmt;
 
-                       if (syserror(tcp)) {
-                               tprintf("%#lx", data);
-                               break;
-                       }
-                       if (umove(tcp, data, &fmt) < 0) {
-                               tprintf("{???} %#lx", data);
+                       if (umove_or_printaddr(tcp, data, &fmt))
                                break;
-                       }
                        tprints("{");
                        printxval(quota_formats, fmt, "QFMT_VFS_???");
                        tprints("}");
@@ -464,14 +359,8 @@ decode_cmd_data(struct tcb *tcp, u_int32_t cmd, unsigned long data)
                {
                        struct if_dqinfo dq;
 
-                       if (cmd == Q_GETINFO && syserror(tcp)) {
-                               tprintf("%#lx", data);
-                               break;
-                       }
-                       if (umove(tcp, data, &dq) < 0) {
-                               tprintf("{???} %#lx", data);
+                       if (umove_or_printaddr(tcp, data, &dq))
                                break;
-                       }
                        tprintf("{bgrace=%" PRIu64 ", ", dq.dqi_bgrace);
                        tprintf("igrace=%" PRIu64 ", ", dq.dqi_igrace);
                        tprintf("flags=%#x, ", dq.dqi_flags);
@@ -485,14 +374,8 @@ decode_cmd_data(struct tcb *tcp, u_int32_t cmd, unsigned long data)
                {
                        struct v2_dqinfo dq;
 
-                       if (cmd == Q_V2_GETINFO && syserror(tcp)) {
-                               tprintf("%#lx", data);
-                               break;
-                       }
-                       if (umove(tcp, data, &dq) < 0) {
-                               tprintf("{???} %#lx", data);
+                       if (umove_or_printaddr(tcp, data, &dq))
                                break;
-                       }
                        tprintf("{bgrace=%u, ", dq.dqi_bgrace);
                        tprintf("igrace=%u, ", dq.dqi_igrace);
                        tprintf("flags=%#x, ", dq.dqi_flags);
@@ -505,14 +388,8 @@ decode_cmd_data(struct tcb *tcp, u_int32_t cmd, unsigned long data)
                {
                        struct v1_dqstats dq;
 
-                       if (syserror(tcp)) {
-                               tprintf("%#lx", data);
+                       if (umove_or_printaddr(tcp, data, &dq))
                                break;
-                       }
-                       if (umove(tcp, data, &dq) < 0) {
-                               tprintf("{???} %#lx", data);
-                               break;
-                       }
                        tprintf("{lookups=%u, ", dq.lookups);
                        tprintf("drops=%u, ", dq.drops);
                        tprintf("reads=%u, ", dq.reads);
@@ -527,14 +404,8 @@ decode_cmd_data(struct tcb *tcp, u_int32_t cmd, unsigned long data)
                {
                        struct v2_dqstats dq;
 
-                       if (syserror(tcp)) {
-                               tprintf("%#lx", data);
+                       if (umove_or_printaddr(tcp, data, &dq))
                                break;
-                       }
-                       if (umove(tcp, data, &dq) < 0) {
-                               tprintf("{???} %#lx", data);
-                               break;
-                       }
                        tprintf("{lookups=%u, ", dq.lookups);
                        tprintf("drops=%u, ", dq.drops);
                        tprintf("reads=%u, ", dq.reads);
@@ -550,14 +421,8 @@ decode_cmd_data(struct tcb *tcp, u_int32_t cmd, unsigned long data)
                {
                        struct xfs_dqstats dq;
 
-                       if (syserror(tcp)) {
-                               tprintf("%#lx", data);
+                       if (umove_or_printaddr(tcp, data, &dq))
                                break;
-                       }
-                       if (umove(tcp, data, &dq) < 0) {
-                               tprintf("{???} %#lx", data);
-                               break;
-                       }
                        tprintf("{version=%d, ", dq.qs_version);
                        if (abbrev(tcp)) {
                                tprints("...}");
@@ -584,23 +449,20 @@ decode_cmd_data(struct tcb *tcp, u_int32_t cmd, unsigned long data)
                {
                        u_int32_t flag;
 
-                       if (umove(tcp, data, &flag) < 0) {
-                               tprintf("{???} %#lx", data);
+                       if (umove_or_printaddr(tcp, data, &flag))
                                break;
-                       }
                        tprints("{");
                        printflags(xfs_quota_flags, flag, "XFS_QUOTA_???");
                        tprints("}");
                        break;
                }
                default:
-                       tprintf("%#lx", data);
+                       printaddr(data);
                        break;
        }
 }
 
-int
-sys_quotactl(struct tcb *tcp)
+SYS_FUNC(quotactl)
 {
        /*
         * The Linux kernel only looks at the low 32 bits of command and id
@@ -613,15 +475,12 @@ sys_quotactl(struct tcb *tcp)
        u_int32_t type = QCMD_TYPE(qcmd);
        u_int32_t id = tcp->u_arg[2];
 
-       if (!verbose(tcp))
-               return printargs(tcp);
-
        if (entering(tcp)) {
                printxval(quotacmds, cmd, "Q_???");
                tprints("|");
                printxval(quotatypes, type, "???QUOTA");
                tprints(", ");
-               printstr(tcp, tcp->u_arg[1], -1);
+               printpath(tcp, tcp->u_arg[1]);
                tprints(", ");
                switch (cmd) {
                        case Q_V1_QUOTAON:
@@ -631,26 +490,31 @@ sys_quotactl(struct tcb *tcp)
                        case Q_V1_GETQUOTA:
                        case Q_V2_GETQUOTA:
                        case Q_GETQUOTA:
+                       case Q_XGETQUOTA:
+                               tprintf("%u", id);
+                               break;
+                       case Q_SETQLIM:
+                       case Q_SETQUOTA:
                        case Q_V1_SETQUOTA:
-                       case Q_V2_SETQUOTA:
                        case Q_V1_SETUSE:
+                       case Q_V2_SETQUOTA:
                        case Q_V2_SETUSE:
-                       case Q_SETQLIM:
-                       case Q_SETQUOTA:
-                       case Q_XGETQUOTA:
                        case Q_XSETQLIM:
-                               tprintf("%u", id);
+                               tprintf("%u, ", id);
+                       case Q_SETINFO:
+                       case Q_V2_SETFLAGS:
+                       case Q_V2_SETGRACE:
+                       case Q_V2_SETINFO:
+                               decode_cmd_data(tcp, cmd, tcp->u_arg[3]);
+                               return RVAL_DECODED;
                                break;
                        default:
-                               tprintf("%#lx", tcp->u_arg[2]);
+                               printaddr(tcp->u_arg[2]);
                                break;
                }
                tprints(", ");
        } else {
-               if (!tcp->u_arg[3])
-                       tprints("NULL");
-               else
-                       decode_cmd_data(tcp, cmd, tcp->u_arg[3]);
+               decode_cmd_data(tcp, cmd, tcp->u_arg[3]);
        }
        return 0;
 }