fstests: Replace all __[u]intNN_t types with standard [u]intNN_t
[xfstests-dev.git] / src / feature.c
index 88e8a943dc6e8b7d2a650b667132a21b7f48f36f..0fb834a0273e63045f30659e2248215cf2ea5282 100644 (file)
@@ -1,33 +1,19 @@
 /*
- * Copyright (c) 2000-2003 Silicon Graphics, Inc.  All Rights Reserved.
- * 
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
+ * Copyright (c) 2000-2003 Silicon Graphics, Inc.
+ * All Rights Reserved.
+ *
+ * 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.
- * 
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * 
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like.  Any license provided herein, whether implied or
- * otherwise, applies only to this software file.  Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- * 
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc., 59
- * Temple Place - Suite 330, Boston MA 02111-1307, USA.
- * 
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA  94043, or:
- * 
- * http://www.sgi.com 
- * 
- * For further information regarding this notice, see: 
- * 
- * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
+ *
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * 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 the Free Software Foundation,
+ * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
 /*
@@ -44,6 +30,8 @@
  * Return code: 0 is true, anything else is error/not supported
  *
  * Test for machine features
+ *   -A  test whether AIO syscalls are available
+ *   -o  report a number of online cpus
  *   -s  report pagesize
  *   -w  report bits per long
  */
 #include <sys/quota.h>
 #include <sys/resource.h>
 #include <signal.h>
+#include <unistd.h>
 
 #ifdef HAVE_XFS_XQM_H
 #include <xfs/xqm.h>
 #endif
 
+#ifdef HAVE_LIBAIO_H
+#include <libaio.h>
+#endif
+
 #ifndef USRQUOTA
 #define USRQUOTA  0
 #endif
@@ -78,7 +71,7 @@ usage(void)
        fprintf(stderr, "Usage: feature [-v] -<q|u|g|p|U|G|P> <filesystem>\n");
        fprintf(stderr, "       feature [-v] -c <file>\n");
        fprintf(stderr, "       feature [-v] -t <file>\n");
-       fprintf(stderr, "       feature -s | -w\n");
+       fprintf(stderr, "       feature -A | -o | -s | -w\n");
        exit(1);
 }
 
@@ -94,7 +87,7 @@ int check_big_ID(char *filename)
        }
 
        /* 98789 is greater than 2^16 (65536) */
-       if ((__uint32_t)sbuf.st_uid == 98789 || (__uint32_t)sbuf.st_gid == 98789)
+       if ((uint32_t)sbuf.st_uid == 98789 || (uint32_t)sbuf.st_gid == 98789)
                return(0);
        if (verbose)
                fprintf(stderr, "lstat64 on %s gave uid=%d, gid=%d\n",
@@ -211,10 +204,35 @@ hasxfsquota(int type, int q, char *device)
        return (1);
 }
 
+static int
+check_aio_support(void)
+{
+#ifdef HAVE_LIBAIO_H
+       struct io_context *ctx = NULL;
+       int err;
+
+       err = io_setup(1, &ctx);
+       if (err == 0)
+               return 0;
+
+       if (err == -ENOSYS) /* CONFIG_AIO=n */
+               return 1;
+
+       fprintf(stderr, "unexpected error from io_setup(): %s\n",
+               strerror(-err));
+       return 2;
+#else
+       /* libaio was unavailable at build time; assume AIO is unsupported */
+       return 1;
+#endif
+}
+
+
 int
 main(int argc, char **argv)
 {
        int     c;
+       int     Aflag = 0;
        int     cflag = 0;
        int     tflag = 0;
        int     gflag = 0;
@@ -226,10 +244,14 @@ main(int argc, char **argv)
        int     uflag = 0;
        int     Uflag = 0;
        int     wflag = 0;
+       int     oflag = 0;
        char    *fs = NULL;
 
-       while ((c = getopt(argc, argv, "ctgGpPqsuUvw")) != EOF) {
+       while ((c = getopt(argc, argv, "ActgGopPqsuUvw")) != EOF) {
                switch (c) {
+               case 'A':
+                       Aflag++;
+                       break;
                case 'c':
                        cflag++;
                        break;
@@ -242,6 +264,9 @@ main(int argc, char **argv)
                case 'G':
                        Gflag++;
                        break;
+               case 'o':
+                       oflag++;
+                       break;
                case 'p':
                        pflag++;
                        break;
@@ -276,7 +301,7 @@ main(int argc, char **argv)
                if (optind != argc-1)   /* need a device */
                        usage();
                fs = argv[argc-1];
-       } else if (wflag || sflag) {
+       } else if (Aflag || wflag || sflag || oflag) {
                if (optind != argc)
                        usage();
        } else 
@@ -301,6 +326,9 @@ main(int argc, char **argv)
        if (Uflag)
                return(hasxfsquota(USRQUOTA, XFS_QUOTA_UDQ_ACCT, fs));
 
+       if (Aflag)
+               return(check_aio_support());
+
        if (sflag) {
                printf("%d\n", getpagesize());
                exit(0);
@@ -320,6 +348,21 @@ bozo!
 #endif
                exit(0);
        }
+       if (oflag) {
+               long ncpus = -1;
+
+#if defined(_SC_NPROCESSORS_ONLN)
+               ncpus = sysconf(_SC_NPROCESSORS_ONLN);
+#elif defined(_SC_NPROC_ONLN)
+               ncpus = sysconf(_SC_NPROC_ONLN);
+#endif
+               if (ncpus == -1)
+                       ncpus = 1;
+
+               printf("%ld\n", ncpus);
+
+               exit(0);
+       }
 
        fprintf(stderr, "feature: dunno what you're after.\n");
        return(1);