]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/nfsstat/nfsstat.c
nfsstat: add get_stats()
[nfs-utils.git] / utils / nfsstat / nfsstat.c
index 436d407700765c333647d19cd6b7da4d4d474816..619ce8b7ff428d23b38ce4387e36c3cc1c6577e9 100644 (file)
@@ -149,6 +149,9 @@ static statinfo             *get_stat_info(const char *, struct statinfo *);
 
 static int             mounts(const char *);
 
+static void            get_stats(const char *, statinfo *, int *, int, const char *);
+static int             has_stats(const unsigned int *);
+
 #define PRNT_CALLS     0x0001
 #define PRNT_RPC       0x0002
 #define PRNT_NET       0x0004
@@ -215,8 +218,6 @@ main(int argc, char **argv)
        int             opt_all = 0,
                        opt_srv = 0,
                        opt_clt = 0,
-                       srv_info = 0,
-                       clt_info = 0,
                        opt_prt = 0;
        int             c;
        char           *progname;
@@ -311,25 +312,10 @@ main(int argc, char **argv)
                        "server.\n");
        }
 
-       if (opt_srv) {
-               srv_info = parse_statfile(NFSSVCSTAT, svcinfo);
-               if (srv_info == 0 && opt_clt == 0) {
-                       fprintf(stderr, "Warning: No Server Stats (%s: %m).\n", NFSSVCSTAT);
-                       return 2;
-               }
-               if (srv_info == 0)
-                       opt_srv = 0;
-       }
-
-       if (opt_clt) {
-               clt_info = parse_statfile(NFSCLTSTAT, cltinfo);
-               if (opt_srv == 0 && clt_info == 0) {
-                       fprintf(stderr, "Warning: No Client Stats (%s: %m).\n", NFSCLTSTAT);
-                       return 2;
-               }
-               if (clt_info == 0)
-                       opt_clt = 0;
-       }
+       if (opt_srv)
+               get_stats(NFSSVCSTAT, svcinfo, &opt_srv, opt_clt, "Server");
+       if (opt_clt)
+               get_stats(NFSCLTSTAT, cltinfo, &opt_clt, opt_srv, "Client");
 
        if (opt_srv) {
                if (opt_prt & PRNT_NET) {
@@ -383,17 +369,17 @@ main(int argc, char **argv)
                        printf("\n");
                }
                if (opt_prt & PRNT_CALLS) {
-                       if ((opt_prt & PRNT_V2) || ((opt_prt & PRNT_AUTO) && svcv2info[0] && svcv2info[svcv2info[0]+1] != svcv2info[0]))
+                       if ((opt_prt & PRNT_V2) || ((opt_prt & PRNT_AUTO) && has_stats(svcv2info)))
                                print_callstats(
                                "Server nfs v2:\n",
                                    nfsv2name, svcv2info + 1, sizeof(nfsv2name)/sizeof(char *)
                                );
-                       if ((opt_prt & PRNT_V3) || ((opt_prt & PRNT_AUTO) && svcv3info[0] && svcv3info[svcv3info[0]+1] != svcv3info[0]))
+                       if ((opt_prt & PRNT_V3) || ((opt_prt & PRNT_AUTO) && has_stats(svcv3info)))
                                print_callstats(
                                "Server nfs v3:\n",
                                nfsv3name, svcv3info + 1, sizeof(nfsv3name)/sizeof(char *)
                                );
-                       if ((opt_prt & PRNT_V4) || ((opt_prt & PRNT_AUTO) && svcv4info[0] && svcv4info[svcv4info[0]+1] != svcv4info[0])) {
+                       if ((opt_prt & PRNT_V4) || ((opt_prt & PRNT_AUTO) && has_stats(svcv4info))) {
                                print_callstats(
                                "Server nfs v4:\n",
                                nfssvrv4name, svcv4info + 1, sizeof(nfssvrv4name)/sizeof(char *)
@@ -424,17 +410,17 @@ main(int argc, char **argv)
                        printf("\n");
                }
                if (opt_prt & PRNT_CALLS) {
-                       if ((opt_prt & PRNT_V2) || ((opt_prt & PRNT_AUTO) && cltv2info[0] && cltv2info[cltv2info[0]+1] != cltv2info[0]))
+                       if ((opt_prt & PRNT_V2) || ((opt_prt & PRNT_AUTO) && has_stats(cltv2info)))
                                print_callstats(
                                "Client nfs v2:\n",
                                nfsv2name, cltv2info + 1,  sizeof(nfsv2name)/sizeof(char *)
                                );
-                       if ((opt_prt & PRNT_V3) || ((opt_prt & PRNT_AUTO) && cltv3info[0] && cltv3info[cltv3info[0]+1] != cltv3info[0]))
+                       if ((opt_prt & PRNT_V3) || ((opt_prt & PRNT_AUTO) && has_stats(cltv3info)))
                                print_callstats(
                                "Client nfs v3:\n",
                                nfsv3name, cltv3info + 1, sizeof(nfsv3name)/sizeof(char *)
                                );
-                       if ((opt_prt & PRNT_V4) || ((opt_prt & PRNT_AUTO) && cltv4info[0] && cltv4info[cltv4info[0]+1] != cltv4info[0]))
+                       if ((opt_prt & PRNT_V4) || ((opt_prt & PRNT_AUTO) && has_stats(cltv4info)))
                                print_callstats(
                                "Client nfs v4:\n",
                                nfscltv4name, cltv4info + 1,  sizeof(nfscltv4name)/sizeof(char *)
@@ -587,3 +573,21 @@ mounts(const char *name)
        fclose(fp);
        return 1;
 }
+
+static void
+get_stats(const char *file, statinfo *info, int *opt, int other_opt, const char *label)
+{
+       if (!parse_statfile(file, info)) {
+               if (!other_opt) {
+                       fprintf(stderr, "Warning: No %s Stats (%s: %m). \n", label, file);
+                       exit(2);
+               }
+               *opt = 0;
+       }
+}
+
+static int
+has_stats(const unsigned int *info)
+{
+       return (info[0] && info[info[0] + 1] != info[0]);
+}