diff options
Diffstat (limited to 'extras/test')
| -rwxr-xr-x | extras/test/bug-920583.t | 50 | ||||
| -rwxr-xr-x | extras/test/gluster_commands.sh | 151 | ||||
| -rw-r--r-- | extras/test/ld-preload-test/ld-preload-lib.c | 20 | ||||
| -rw-r--r-- | extras/test/ld-preload-test/ld-preload-test.c | 20 | ||||
| -rw-r--r-- | extras/test/open-fd-tests.c | 64 | ||||
| -rwxr-xr-x | extras/test/run.sh | 22 | ||||
| -rwxr-xr-x | extras/test/stop_glusterd.sh | 19 | ||||
| -rw-r--r-- | extras/test/test-ffop.c | 870 |
8 files changed, 1148 insertions, 68 deletions
diff --git a/extras/test/bug-920583.t b/extras/test/bug-920583.t new file mode 100755 index 000000000..eedbb800a --- /dev/null +++ b/extras/test/bug-920583.t @@ -0,0 +1,50 @@ +#!/bin/bash + +##Copy this file to tests/bugs before running run.sh (cp extras/test/bug-920583.t tests/bugs/) + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc + +cleanup; +logdir=`gluster --print-logdir` + +## Start and create a volume +TEST glusterd; +TEST pidof glusterd; + +TEST $CLI volume create $V0 replica 2 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; + +## Verify volume is is created +EXPECT "$V0" volinfo_field $V0 'Volume Name'; +EXPECT 'Created' volinfo_field $V0 'Status'; + +## Start volume and verify +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; + +function log-file-name() +{ + logfilename=$M0".log" + echo ${logfilename:1} | tr / - +} + +log_file=$logdir"/"`log-file-name` + +lookup_unhashed_count=`grep "adding option 'lookup-unhashed'" $log_file | wc -l` +no_child_down_count=`grep "adding option 'assert-no-child-down'" $log_file | wc -l` +mount -t glusterfs $H0:/$V0 $M0 -o "xlator-option=*dht.assert-no-child-down=yes,xlator-option=*dht.lookup-unhashed=yes" +touch $M0/file1; + +new_lookup_unhashed_count=`grep "adding option 'lookup-unhashed'" $log_file | wc -l` +new_no_child_down_count=`grep "adding option 'assert-no-child-down'" $log_file | wc -l` +EXPECT "1" expr $new_lookup_unhashed_count - $lookup_unhashed_count +EXPECT "1" expr $new_no_child_down_count - $no_child_down_count + +## Finish up +TEST $CLI volume stop $V0; +EXPECT 'Stopped' volinfo_field $V0 'Status'; + +TEST $CLI volume delete $V0; +TEST ! $CLI volume info $V0; + +cleanup; diff --git a/extras/test/gluster_commands.sh b/extras/test/gluster_commands.sh index 8db4de9c1..cb2a55fd5 100755 --- a/extras/test/gluster_commands.sh +++ b/extras/test/gluster_commands.sh @@ -1,25 +1,26 @@ #!/bin/bash -# Copyright (c) 2006-2010 Gluster, Inc. <http://www.gluster.com> -# This file is part of GlusterFS. -# GlusterFS 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 3 of the License, -# or (at your option) any later version. - -# GlusterFS is distributed in the hope that it will 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, see -# <http://www.gnu.org/licenses/>. +# Copyright (c) 2006-2012 Red Hat, Inc. <http://www.redhat.com> +# This file is part of GlusterFS. +# +# This file is licensed to you under your choice of the GNU Lesser +# General Public License, version 3 or any later version (LGPLv3 or +# later), or the GNU General Public License, version 2 (GPLv2), in all +# cases as published by the Free Software Foundation. # This script tests the basics gluster cli commands. +echo "Starting glusterd" +glusterd +if [ $? -ne 0 ]; then + echo "Could not start glusterd.Exiting" + exit; +else + echo "glusterd started" +fi + if [ ! -d "/exports" ]; then mkdir /exports; mkdir /exports/exp{1..10}; @@ -45,44 +46,67 @@ gluster volume start vol gluster volume info sleep 1 mount -t glusterfs `hostname`:vol /mnt/client -sleep 1 +sleep 1 df -h echo "adding-brick......." gluster volume add-brick vol `hostname`:/exports/exp2 gluster volume info -sleep 1 +sleep 1 +umount /mnt/client mount -t glusterfs `hostname`:vol /mnt/client df -h sleep 1 echo "replacing brick......" gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 start +#sleep for 5 seconds +sleep 5 gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 status gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 pause -gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 abort +gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 status +gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 start +#sleep for 5 seconds +sleep 5 +gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 status gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 commit + + +echo "replcing brick for abort operation" +gluster volume replace-brick vol `hostname`:/exports/exp3 `hostname`:/exports/exp1 start +#sleep for 5 seconds +sleep 5 +gluster volume replace-brick vol `hostname`:/exports/exp3 `hostname`:/exports/exp1 status +gluster volume replace-brick vol `hostname`:/exports/exp3 `hostname`:/exports/exp1 pause +gluster volume replace-brick vol `hostname`:/exports/exp3 `hostname`:/exports/exp1 status +gluster volume replace-brick vol `hostname`:/exports/exp3 `hostname`:/exports/exp1 start +#sleep for 5 seconds +sleep 5 +gluster volume replace-brick vol `hostname`:/exports/exp3 `hostname`:/exports/exp1 status +gluster volume replace-brick vol `hostname`:/exports/exp3 `hostname`:/exports/exp1 abort + + gluster volume info sleep 1 df -h sleep 1 echo "removing brick......." -gluster volume remove-brick vol `hostname`:/exports/exp2 +gluster --mode=script volume remove-brick vol `hostname`:/exports/exp2 gluster volume info -sleep 1 +sleep 1 df -h sleep 1 echo "stopping distribute volume......" -gluster volume stop vol +gluster --mode=script volume stop vol gluster volume info sleep 1 umount /mnt/client df -h echo "deleting distribute volume......" -gluster volume delete vol +gluster --mode=script volume delete vol gluster volume info sleep 1 @@ -95,46 +119,70 @@ sleep 1 echo "starting replicate volume......" gluster volume start mirror gluster volume info -sleep 1 +sleep 1 mount -t glusterfs `hostname`:mirror /mnt/client sleep 1 df -h sleep 1 echo "adding-brick......." -gluster volume add-brick mirror replica 2 `hostname`:/exports/exp3 `hostname`:/exports/exp4 +gluster volume add-brick mirror `hostname`:/exports/exp3 `hostname`:/exports/exp4 gluster volume info -sleep 1 +sleep 1 df -h sleep 1 echo "replacing-brick....." gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 start +#sleep for 5 seconds +sleep 5 gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 status gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 pause -gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 abort +gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 status +gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 start +#sleep for 5 seconds +sleep 5 +gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 status gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 commit gluster volume info sleep 1 df -h sleep 1 +echo "replacing brick for abort operation" +gluster volume replace-brick mirror `hostname`:/exports/exp5 `hostname`:/exports/exp1 start +#sleep for 5 seconds +sleep 5 +gluster volume replace-brick mirror `hostname`:/exports/exp5 `hostname`:/exports/exp1 status +gluster volume replace-brick mirror `hostname`:/exports/exp5 `hostname`:/exports/exp1 pause +gluster volume replace-brick mirror `hostname`:/exports/exp5 `hostname`:/exports/exp1 status +gluster volume replace-brick mirror `hostname`:/exports/exp5 `hostname`:/exports/exp1 start +#sleep for 5 seconds +sleep 5 +gluster volume replace-brick mirror `hostname`:/exports/exp5 `hostname`:/exports/exp1 status +gluster volume replace-brick mirror `hostname`:/exports/exp5 `hostname`:/exports/exp1 abort + +gluster volume info +sleep 1 +df -h +sleep 1 + echo "removeing-brick....." -gluster volume remove-brick mirror replica 2 `hostname`:/exports/exp3 `hostname`:/exports/exp4 +gluster --mode=script volume remove-brick mirror `hostname`:/exports/exp3 `hostname`:/exports/exp4 gluster volume info -sleep 1 +sleep 1 df -h sleep 1 echo "stopping replicate volume....." -gluster volume stop mirror +gluster --mode=script volume stop mirror gluster volume info -sleep 1 +sleep 1 umount /mnt/client df -h echo "deleting replicate volume....." -gluster volume delete mirror +gluster --mode=script volume delete mirror gluster volume info sleep 1 @@ -150,41 +198,68 @@ gluster volume start str gluster volume info sleep 1 mount -t glusterfs `hostname`:str /mnt/client -sleep 1 +sleep 1 df -h sleep 1 echo "adding brick...." -gluster volume add-brick str stripe 2 `hostname`:/exports/exp3 `hostname`:/exports/exp4 +gluster volume add-brick str `hostname`:/exports/exp3 `hostname`:/exports/exp4 gluster volume info -sleep 1 +sleep 1 df -h sleep 1 echo "replacing brick....." gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 start +#sleep for 5 seconds +sleep 5 gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 status gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 pause -gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 abort +gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 status +gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 start +#sleep for 5 seconds +sleep 5 +gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 status gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 commit + +gluster volume info +sleep 1 +df -h +sleep 1 + +echo "replacing brick for abort operation" +gluster volume replace-brick str `hostname`:/exports/exp5 `hostname`:/exports/exp1 start +#sleep for 5 seconds +sleep 5 +gluster volume replace-brick str `hostname`:/exports/exp5 `hostname`:/exports/exp1 status +gluster volume replace-brick str `hostname`:/exports/exp5 `hostname`:/exports/exp1 pause +gluster volume replace-brick str `hostname`:/exports/exp5 `hostname`:/exports/exp1 status +gluster volume replace-brick str `hostname`:/exports/exp5 `hostname`:/exports/exp1 start +#sleep for 5 seconds +sleep 5 +gluster volume replace-brick str `hostname`:/exports/exp5 `hostname`:/exports/exp1 status +gluster volume replace-brick str `hostname`:/exports/exp5 `hostname`:/exports/exp1 abort + gluster volume info sleep 1 df -h +sleep 1 echo "removing-brick....." -gluster volume remove-brick str stripe 2 `hostname`:/exports/exp3 `hostname`:/exports/exp4 +gluster --mode=script volume remove-brick str `hostname`:/exports/exp3 `hostname`:/exports/exp4 gluster volume info sleep 1 df -h sleep 1 echo "stopping stripe volume....." -gluster volume stop str +gluster --mode=script volume stop str gluster volume info sleep 1 umount /mnt/client df -h echo "deleting stripe volume....." -gluster volume delete str +gluster --mode=script volume delete str gluster volume info + diff --git a/extras/test/ld-preload-test/ld-preload-lib.c b/extras/test/ld-preload-test/ld-preload-lib.c index 18ee3b993..88afd14c3 100644 --- a/extras/test/ld-preload-test/ld-preload-lib.c +++ b/extras/test/ld-preload-test/ld-preload-lib.c @@ -1,23 +1,13 @@ /* - Copyright (c) 2007-2009 Gluster, Inc. <http://www.gluster.com> + Copyright (c) 2007-2012 Red Hat, Inc. <http://www.redhat.com> This file is part of GlusterFS. - GlusterFS 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 3 of the License, - or (at your option) any later version. - - GlusterFS is distributed in the hope that it will 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, see - <http://www.gnu.org/licenses/>. + This file is licensed to you under your choice of the GNU Lesser + General Public License, version 3 or any later version (LGPLv3 or + later), or the GNU General Public License, version 2 (GPLv2), in all + cases as published by the Free Software Foundation. */ - /* LD PRELOAD'able library * A very simple library that intercepts booster supported system calls * and prints a log message to stdout. diff --git a/extras/test/ld-preload-test/ld-preload-test.c b/extras/test/ld-preload-test/ld-preload-test.c index f98b1f4ee..78772f598 100644 --- a/extras/test/ld-preload-test/ld-preload-test.c +++ b/extras/test/ld-preload-test/ld-preload-test.c @@ -1,23 +1,13 @@ /* - Copyright (c) 2007-2009 Gluster, Inc. <http://www.gluster.com> + Copyright (c) 2007-2012 Red Hat, Inc. <http://www.redhat.com> This file is part of GlusterFS. - GlusterFS 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 3 of the License, - or (at your option) any later version. - - GlusterFS is distributed in the hope that it will 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, see - <http://www.gnu.org/licenses/>. + This file is licensed to you under your choice of the GNU Lesser + General Public License, version 3 or any later version (LGPLv3 or + later), or the GNU General Public License, version 2 (GPLv2), in all + cases as published by the Free Software Foundation. */ - /* * LD PRELOAD Test Tool * diff --git a/extras/test/open-fd-tests.c b/extras/test/open-fd-tests.c new file mode 100644 index 000000000..4184079d0 --- /dev/null +++ b/extras/test/open-fd-tests.c @@ -0,0 +1,64 @@ + +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <attr/xattr.h> +#include <errno.h> +#include <string.h> + +int +main (int argc, char *argv[]) +{ + int ret = -1; + int fd = 0; + char *filename = NULL; + int loop = 0; + struct stat stbuf = {0,}; + char string[1024] = {0,}; + + if (argc > 1) + filename = argv[1]; + + if (!filename) + filename = "temp-fd-test-file"; + + fd = open (filename, O_RDWR|O_CREAT|O_TRUNC); + if (fd < 0) { + fd = 0; + fprintf (stderr, "open failed : %s\n", strerror (errno)); + goto out; + } + + while (loop < 1000) { + /* Use it as a mechanism to test time delays */ + memset (string, 0, 1024); + scanf ("%s", string); + + ret = write (fd, string, strlen (string)); + if (ret != strlen (string)) { + fprintf (stderr, "write failed : %s (%s %d)\n", + strerror (errno), string, loop); + goto out; + } + + ret = write (fd, "\n", 1); + if (ret != 1) { + fprintf (stderr, "write failed : %s (%d)\n", + strerror (errno), loop); + goto out; + } + + loop++; + } + + fprintf (stdout, "finishing the test after %d loops\n", loop); + + ret = 0; +out: + if (fd) + close (fd); + + return ret; +} diff --git a/extras/test/run.sh b/extras/test/run.sh new file mode 100755 index 000000000..4b3839cf6 --- /dev/null +++ b/extras/test/run.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +# Copyright (c) 2006-2012 Red Hat, Inc. <http://www.redhat.com> +# This file is part of GlusterFS. +# +# This file is licensed to you under your choice of the GNU Lesser +# General Public License, version 3 or any later version (LGPLv3 or +# later), or the GNU General Public License, version 2 (GPLv2), in all +# cases as published by the Free Software Foundation. + +# Running gluster sanity test which starts glusterd and runs gluster commands, and exit at the first failure. +$PWD/gluster_commands.sh + +if [ $? -ne 0 ]; then + echo "sanity failed" +else + echo "sanity passed" +fi + +# Stopping glusterd +$PWD/stop_glusterd.sh + diff --git a/extras/test/stop_glusterd.sh b/extras/test/stop_glusterd.sh new file mode 100755 index 000000000..a2db13f42 --- /dev/null +++ b/extras/test/stop_glusterd.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Copyright (c) 2006-2012 Red Hat, Inc. <http://www.redhat.com> +# This file is part of GlusterFS. +# +# This file is licensed to you under your choice of the GNU Lesser +# General Public License, version 3 or any later version (LGPLv3 or +# later), or the GNU General Public License, version 2 (GPLv2), in all +# cases as published by the Free Software Foundation. + +#This script stops the glusterd running on the machine. Helpful for gluster sanity script + +killall -9 glusterd + +if [ $? -ne 0 ]; then + echo "Error: Could not kill glusterd. Either glusterd is not running or kill it manually" +else + echo "Killed glusterd" +fi diff --git a/extras/test/test-ffop.c b/extras/test/test-ffop.c new file mode 100644 index 000000000..2d174d452 --- /dev/null +++ b/extras/test/test-ffop.c @@ -0,0 +1,870 @@ +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <attr/xattr.h> +#include <errno.h> +#include <string.h> +#include <dirent.h> + +int fd_based_fops_1 (char *filename); //for fd based fops after unlink +int fd_based_fops_2 (char *filename); //for fd based fops before unlink +int dup_fd_based_fops (char *filename); // fops based on fd after dup +int path_based_fops (char *filename); //for fops based on path +int dir_based_fops (char *filename); // for fops which operate on directory +int link_based_fops (char *filename); //for fops which operate in link files (symlinks) +int test_open_modes (char *filename); // to test open syscall with open modes available. +int generic_open_read_write (char *filename, int flag); // generic function which does open write and read. + +int +main (int argc, char *argv[]) +{ + int ret = -1; + char filename[255] = {0,}; + + if (argc > 1) + strcpy(filename, argv[1]); + else + strcpy(filename, "temp-xattr-test-file"); + + ret = fd_based_fops_1 (strcat(filename, "_1")); + if (ret < 0) + fprintf (stderr, "fd based file operation 1 failed\n"); + else + fprintf (stdout, "fd based file operation 1 passed\n"); + + ret = fd_based_fops_2 (strcat(filename, "_2")); + if (ret < 0) + fprintf (stderr, "fd based file operation 2 failed\n"); + else + fprintf (stdout, "fd based file operation 2 passed\n"); + + ret = dup_fd_based_fops (strcat (filename, "_3")); + if (ret < 0) + fprintf (stderr, "dup fd based file operation failed\n"); + else + fprintf (stdout, "dup fd based file operation passed\n"); + + ret = path_based_fops (strcat (filename, "_4")); + if (ret < 0) + fprintf (stderr, "path based file operation failed\n"); + else + fprintf (stdout, "path based file operation passed\n"); + + ret = dir_based_fops (strcat (filename, "_5")); + if (ret < 0) + fprintf (stderr, "directory based file operation failed\n"); + else + fprintf (stdout, "directory based file operation passed\n"); + + ret = link_based_fops (strcat (filename, "_5")); + if (ret < 0) + fprintf (stderr, "link based file operation failed\n"); + else + fprintf (stdout, "link based file operation passed\n"); + + ret = test_open_modes (strcat (filename, "_5")); + if (ret < 0) + fprintf (stderr, "testing modes of 'open' call failed\n"); + else + fprintf (stdout, "testing modes of 'open' call passed\n"); + +out: + return ret; +} + +int +fd_based_fops_1 (char *filename) +{ + int fd = 0; + int ret = -1; + struct stat stbuf = {0,}; + char wstr[50] = {0,}; + char rstr[50] = {0,}; + + fd = open (filename, O_RDWR|O_CREAT); + if (fd < 0) { + fd = 0; + fprintf (stderr, "open failed : %s\n", strerror (errno)); + goto out; + } + + ret = unlink (filename); + if (ret < 0) { + fprintf (stderr, "unlink failed : %s\n", strerror (errno)); + goto out; + } + + strcpy (wstr, "This is my string\n"); + ret = write (fd, wstr, strlen(wstr)); + if (ret <= 0) { + ret = -1; + fprintf (stderr, "write failed: %s\n", strerror (errno)); + goto out; + } + + ret = lseek (fd, 0, SEEK_SET); + if (ret < 0) { + fprintf (stderr, "lseek failed: %s\n", strerror (errno)); + goto out; + } + + ret = read (fd, rstr, strlen(wstr)); + if (ret <= 0) { + ret = -1; + fprintf (stderr, "read failed: %s\n", strerror (errno)); + goto out; + } + + ret = memcmp (rstr, wstr, strlen (wstr)); + if (ret != 0) { + ret = -1; + fprintf (stderr, "read returning junk\n"); + goto out; + } + + ret = ftruncate (fd, 0); + if (ret < 0) { + fprintf (stderr, "ftruncate failed : %s\n", strerror (errno)); + goto out; + } + + ret = fstat (fd, &stbuf); + if (ret < 0) { + fprintf (stderr, "fstat failed : %s\n", strerror (errno)); + goto out; + } + + ret = fchmod (fd, 0640); + if (ret < 0) { + fprintf (stderr, "fchmod failed : %s\n", strerror (errno)); + goto out; + } + + ret = fchown (fd, 10001, 10001); + if (ret < 0) { + fprintf (stderr, "fchown failed : %s\n", strerror (errno)); + goto out; + } + + ret = fsync (fd); + if (ret < 0) { + fprintf (stderr, "fsync failed : %s\n", strerror (errno)); + goto out; + } + + ret = fsetxattr (fd, "trusted.xattr-test", "working", 8, 0); + if (ret < 0) { + fprintf (stderr, "fsetxattr failed : %s\n", strerror (errno)); + goto out; + } + + ret = fdatasync (fd); + if (ret < 0) { + fprintf (stderr, "fdatasync failed : %s\n", strerror (errno)); + goto out; + } + + ret = flistxattr (fd, NULL, 0); + if (ret <= 0) { + ret = -1; + fprintf (stderr, "flistxattr failed : %s\n", strerror (errno)); + goto out; + } + + ret = fgetxattr (fd, "trusted.xattr-test", NULL, 0); + if (ret <= 0) { + ret = -1; + fprintf (stderr, "fgetxattr failed : %s\n", strerror (errno)); + goto out; + } + + ret = fremovexattr (fd, "trusted.xattr-test"); + if (ret < 0) { + fprintf (stderr, "fremovexattr failed : %s\n", strerror (errno)); + goto out; + } + + ret = 0; +out: + if (fd) + close (fd); + + return ret; +} + + +int +fd_based_fops_2 (char *filename) +{ + int fd = 0; + int ret = -1; + struct stat stbuf = {0,}; + char wstr[50] = {0,}; + char rstr[50] = {0,}; + + fd = open (filename, O_RDWR|O_CREAT); + if (fd < 0) { + fd = 0; + fprintf (stderr, "open failed : %s\n", strerror (errno)); + goto out; + } + + ret = ftruncate (fd, 0); + + if (ret < 0) { + fprintf (stderr, "ftruncate failed : %s\n", strerror (errno)); + goto out; + } + + strcpy (wstr, "This is my second string\n"); + ret = write (fd, wstr, strlen (wstr)); + if (ret < 0) { + ret = -1; + fprintf (stderr, "write failed: %s\n", strerror (errno)); + goto out; + } + + lseek (fd, 0, SEEK_SET); + if (ret < 0) { + fprintf (stderr, "lseek failed: %s\n", strerror (errno)); + goto out; + } + + ret = read (fd, rstr, strlen (wstr)); + if (ret <= 0) { + ret = -1; + fprintf (stderr, "read failed: %s\n", strerror (errno)); + goto out; + } + + ret = memcmp (rstr, wstr, strlen (wstr)); + if (ret != 0) { + ret = -1; + fprintf (stderr, "read returning junk\n"); + goto out; + } + + ret = fstat (fd, &stbuf); + if (ret < 0) { + fprintf (stderr, "fstat failed : %s\n", strerror (errno)); + goto out; + } + + ret = fchmod (fd, 0640); + if (ret < 0) { + fprintf (stderr, "fchmod failed : %s\n", strerror (errno)); + goto out; + } + + ret = fchown (fd, 10001, 10001); + if (ret < 0) { + fprintf (stderr, "fchown failed : %s\n", strerror (errno)); + goto out; + } + + ret = fsync (fd); + if (ret < 0) { + fprintf (stderr, "fsync failed : %s\n", strerror (errno)); + goto out; + } + + ret = fsetxattr (fd, "trusted.xattr-test", "working", 8, 0); + if (ret < 0) { + fprintf (stderr, "fsetxattr failed : %s\n", strerror (errno)); + goto out; + } + + ret = fdatasync (fd); + if (ret < 0) { + fprintf (stderr, "fdatasync failed : %s\n", strerror (errno)); + goto out; + } + + ret = flistxattr (fd, NULL, 0); + if (ret <= 0) { + ret = -1; + fprintf (stderr, "flistxattr failed : %s\n", strerror (errno)); + goto out; + } + + ret = fgetxattr (fd, "trusted.xattr-test", NULL, 0); + if (ret <= 0) { + ret = -1; + fprintf (stderr, "fgetxattr failed : %s\n", strerror (errno)); + goto out; + } + + ret = fremovexattr (fd, "trusted.xattr-test"); + if (ret < 0) { + fprintf (stderr, "fremovexattr failed : %s\n", strerror (errno)); + goto out; + } + +out: + if (fd) + close (fd); + unlink (filename); + + return ret; +} + +int +path_based_fops (char *filename) +{ + int ret = -1; + int fd = 0; + struct stat stbuf = {0,}; + char newfilename[255] = {0,}; + + fd = creat (filename, 0644); + if (fd < 0) { + fprintf (stderr, "creat failed: %s\n", strerror (errno)); + goto out; + } + + ret = truncate (filename, 0); + if (ret < 0) { + fprintf (stderr, "truncate failed: %s\n", strerror (errno)); + goto out; + } + + ret = stat (filename, &stbuf); + if (ret < 0) { + fprintf (stderr, "stat failed: %s\n", strerror (errno)); + goto out; + } + + ret = chmod (filename, 0640); + if (ret < 0) { + fprintf (stderr, "chmod failed: %s\n", strerror (errno)); + goto out; + } + + ret = chown (filename, 10001, 10001); + if (ret < 0) { + fprintf (stderr, "chown failed: %s\n", strerror (errno)); + goto out; + } + + ret = setxattr (filename, "trusted.xattr-test", "working", 8, 0); + if (ret < 0) { + fprintf (stderr, "setxattr failed: %s\n", strerror (errno)); + goto out; + } + + ret = listxattr (filename, NULL, 0); + if (ret <= 0) { + ret = -1; + fprintf (stderr, "listxattr failed: %s\n", strerror (errno)); + goto out; + } + + ret = getxattr (filename, "trusted.xattr-test", NULL, 0); + if (ret <= 0) { + ret = -1; + fprintf (stderr, "getxattr failed: %s\n", strerror (errno)); + goto out; + } + + ret = removexattr (filename, "trusted.xattr-test"); + if (ret < 0) { + fprintf (stderr, "removexattr failed: %s\n", strerror (errno)); + goto out; + } + + ret = access (filename, R_OK|W_OK); + if (ret < 0) { + fprintf (stderr, "access failed: %s\n", strerror (errno)); + goto out; + } + + strcpy (newfilename, filename); + strcat(newfilename, "_new"); + ret = rename (filename, newfilename); + if (ret < 0) { + fprintf (stderr, "rename failed: %s\n", strerror (errno)); + goto out; + } + unlink (newfilename); + +out: + if (fd) + close (fd); + + unlink (filename); + return ret; +} + +int +dup_fd_based_fops (char *filename) +{ + int fd = 0; + int newfd = 0; + int ret = -1; + struct stat stbuf = {0,}; + char wstr[50] = {0,}; + char rstr[50] = {0,}; + + fd = open (filename, O_RDWR|O_CREAT); + if (fd < 0) { + fd = 0; + fprintf (stderr, "open failed : %s\n", strerror (errno)); + goto out; + } + + newfd = dup (fd); + if (newfd < 0) { + ret = -1; + fprintf (stderr, "dup failed: %s\n", strerror (errno)); + goto out; + } + + close (fd); + + strcpy (wstr, "This is my string\n"); + ret = write (newfd, wstr, strlen(wstr)); + if (ret <= 0) { + ret = -1; + fprintf (stderr, "write failed: %s\n", strerror (errno)); + goto out; + } + + ret = lseek (newfd, 0, SEEK_SET); + if (ret < 0) { + fprintf (stderr, "lseek failed: %s\n", strerror (errno)); + goto out; + } + + ret = read (newfd, rstr, strlen(wstr)); + if (ret <= 0) { + ret = -1; + fprintf (stderr, "read failed: %s\n", strerror (errno)); + goto out; + } + + ret = memcmp (rstr, wstr, strlen (wstr)); + if (ret != 0) { + ret = -1; + fprintf (stderr, "read returning junk\n"); + goto out; + } + + ret = ftruncate (newfd, 0); + if (ret < 0) { + fprintf (stderr, "ftruncate failed : %s\n", strerror (errno)); + goto out; + } + + ret = fstat (newfd, &stbuf); + if (ret < 0) { + fprintf (stderr, "fstat failed : %s\n", strerror (errno)); + goto out; + } + + ret = fchmod (newfd, 0640); + if (ret < 0) { + fprintf (stderr, "fchmod failed : %s\n", strerror (errno)); + goto out; + } + + ret = fchown (newfd, 10001, 10001); + if (ret < 0) { + fprintf (stderr, "fchown failed : %s\n", strerror (errno)); + goto out; + } + + ret = fsync (newfd); + if (ret < 0) { + fprintf (stderr, "fsync failed : %s\n", strerror (errno)); + goto out; + } + + ret = fsetxattr (newfd, "trusted.xattr-test", "working", 8, 0); + if (ret < 0) { + fprintf (stderr, "fsetxattr failed : %s\n", strerror (errno)); + goto out; + } + + ret = fdatasync (newfd); + if (ret < 0) { + fprintf (stderr, "fdatasync failed : %s\n", strerror (errno)); + goto out; + } + + ret = flistxattr (newfd, NULL, 0); + if (ret <= 0) { + ret = -1; + fprintf (stderr, "flistxattr failed : %s\n", strerror (errno)); + goto out; + } + + ret = fgetxattr (newfd, "trusted.xattr-test", NULL, 0); + if (ret <= 0) { + ret = -1; + fprintf (stderr, "fgetxattr failed : %s\n", strerror (errno)); + goto out; + } + + ret = fremovexattr (newfd, "trusted.xattr-test"); + if (ret < 0) { + fprintf (stderr, "fremovexattr failed : %s\n", strerror (errno)); + goto out; + } + + ret = 0; +out: + if (newfd) + close (newfd); + ret = unlink (filename); + if (ret < 0) { + fprintf (stderr, "unlink failed : %s\n", strerror (errno)); + goto out; + } + + return ret; +} + +int +dir_based_fops (char *dirname) +{ + int ret = -1; + DIR *dp = NULL; + char buff[255] = {0,}; + struct dirent *dbuff = {0,}; + struct stat stbuff = {0,}; + char newdname[255] = {0,}; + char *cwd = NULL; + + ret = mkdir (dirname, 0755); + if (ret < 0) { + fprintf (stderr, "mkdir failed: %s\n", strerror (errno)); + goto out; + } + + dp = opendir (dirname); + if (dp == NULL) { + fprintf (stderr, "opendir failed: %s\n", strerror (errno)); + goto out; + } + + dbuff = readdir (dp); + if (NULL == dbuff) { + fprintf (stderr, "readdir failed: %s\n", strerror (errno)); + goto out; + } + + ret = closedir (dp); + if (ret < 0) { + fprintf (stderr, "closedir failed: %s\n", strerror (errno)); + goto out; + } + + ret = stat (dirname, &stbuff); + if (ret < 0) { + fprintf (stderr, "stat failed: %s\n", strerror (errno)); + goto out; + } + + ret = chmod (dirname, 0744); + if (ret < 0) { + fprintf (stderr, "chmod failed: %s\n", strerror (errno)); + goto out; + } + + ret = chown (dirname, 10001, 10001); + if (ret < 0) { + fprintf (stderr, "chmod failed: %s\n", strerror (errno)); + goto out; + } + + ret = setxattr (dirname, "trusted.xattr-test", "working", 8, 0); + if (ret < 0) { + fprintf (stderr, "setxattr failed: %s\n", strerror (errno)); + goto out; + } + + ret = listxattr (dirname, NULL, 0); + if (ret <= 0) { + ret = -1; + fprintf (stderr, "listxattr failed: %s\n", strerror (errno)); + goto out; + } + + ret = getxattr (dirname, "trusted.xattr-test", NULL, 0); + if (ret <= 0) { + ret = -1; + fprintf (stderr, "getxattr failed: %s\n", strerror (errno)); + goto out; + } + + ret = removexattr (dirname, "trusted.xattr-test"); + if (ret < 0) { + fprintf (stderr, "removexattr failed: %s\n", strerror (errno)); + goto out; + } + + strcpy (newdname, dirname); + strcat (newdname, "/../"); + ret = chdir (newdname); + if (ret < 0) { + fprintf (stderr, "chdir failed: %s\n", strerror (errno)); + goto out; + } + + cwd = getcwd (buff, 255); + if (NULL == cwd) { + fprintf (stderr, "getcwd failed: %s\n", strerror (errno)); + goto out; + } + + strcpy (newdname, dirname); + strcat (newdname, "new"); + ret = rename (dirname, newdname); + if (ret < 0) { + fprintf (stderr, "rename failed: %s\n", strerror (errno)); + goto out; + } + + ret = rmdir (newdname); + if (ret < 0) { + fprintf (stderr, "rmdir failed: %s\n", strerror (errno)); + return ret; + } + +out: + rmdir (dirname); + return ret; +} + +int +link_based_fops (char *filename) +{ + int ret = -1; + int fd = 0; + char newname[255] = {0,}; + char linkname[255] = {0,}; + struct stat lstbuf = {0,}; + + fd = creat (filename, 0644); + if (fd < 0) { + fd = 0; + fprintf (stderr, "creat failed: %s\n", strerror (errno)); + goto out; + } + + strcpy (newname, filename); + strcat (newname, "_hlink"); + ret = link (filename, newname); + if (ret < 0) { + fprintf (stderr, "link failed: %s\n", strerror (errno)); + goto out; + } + + ret = unlink (filename); + if (ret < 0) { + fprintf (stderr, "unlink failed: %s\n", strerror (errno)); + goto out; + } + + strcpy (linkname, filename); + strcat (linkname, "_slink"); + ret = symlink (newname, linkname); + if (ret < 0) { + fprintf (stderr, "symlink failed: %s\n", strerror (errno)); + goto out; + } + + ret = lstat (linkname, &lstbuf); + if (ret < 0) { + fprintf (stderr, "lstbuf failed: %s\n", strerror (errno)); + goto out; + } + + ret = lchown (linkname, 10001, 10001); + if (ret < 0) { + fprintf (stderr, "lchown failed: %s\n", strerror (errno)); + goto out; + } + + ret = lsetxattr (linkname, "trusted.lxattr-test", "working", 8, 0); + if (ret < 0) { + fprintf (stderr, "lsetxattr failed: %s\n", strerror (errno)); + goto out; + } + + ret = llistxattr (linkname, NULL, 0); + if (ret < 0) { + ret = -1; + fprintf (stderr, "llistxattr failed: %s\n", strerror (errno)); + goto out; + } + + ret = lgetxattr (linkname, "trusted.lxattr-test", NULL, 0); + if (ret < 0) { + ret = -1; + fprintf (stderr, "lgetxattr failed: %s\n", strerror (errno)); + goto out; + } + + ret = lremovexattr (linkname, "trusted.lxattr-test"); + if (ret < 0) { + fprintf (stderr, "lremovexattr failed: %s\n", strerror (errno)); + goto out; + } + + +out: + if (fd) + close(fd); + unlink (linkname); + unlink (newname); +} + +int +test_open_modes (char *filename) +{ + int ret = -1; + + ret = generic_open_read_write (filename, O_CREAT|O_WRONLY); + if (3 != ret) { + fprintf (stderr, "flag O_CREAT|O_WRONLY failed: \n"); + goto out; + } + + ret = generic_open_read_write (filename, O_CREAT|O_RDWR); + if (ret != 0) { + fprintf (stderr, "flag O_CREAT|O_RDWR failed\n"); + goto out; + } + + ret = generic_open_read_write (filename, O_CREAT|O_RDONLY); + if (ret != 0) { + fprintf (stderr, "flag O_CREAT|O_RDONLY failed\n"); + goto out; + } + + ret = creat (filename, 0644); + close (ret); + ret = generic_open_read_write (filename, O_WRONLY); + if (3 != ret) { + fprintf (stderr, "flag O_WRONLY failed\n"); + goto out; + } + + ret = creat (filename, 0644); + close (ret); + ret = generic_open_read_write (filename, O_RDWR); + if (0 != ret) { + fprintf (stderr, "flag O_RDWR failed\n"); + goto out; + } + + ret = creat (filename, 0644); + close (ret); + ret = generic_open_read_write (filename, O_RDONLY); + if (0 != ret) { + fprintf (stderr, "flag O_RDONLY failed\n"); + goto out; + } + + ret = creat (filename, 0644); + close (ret); + ret = generic_open_read_write (filename, O_TRUNC|O_WRONLY); + if (3 != ret) { + fprintf (stderr, "flag O_TRUNC|O_WRONLY failed\n"); + goto out; + } + +#if 0 /* undefined behaviour, unable to reliably test */ + ret = creat (filename, 0644); + close (ret); + ret = generic_open_read_write (filename, O_TRUNC|O_RDONLY); + if (0 != ret) { + fprintf (stderr, "flag O_TRUNC|O_RDONLY failed\n"); + goto out; + } +#endif + + ret = generic_open_read_write (filename, O_CREAT|O_RDWR|O_SYNC); + if (0 != ret) { + fprintf (stderr, "flag O_CREAT|O_RDWR|O_SYNC failed\n"); + goto out; + } + + ret = creat (filename, 0644); + close (ret); + ret = generic_open_read_write (filename, O_CREAT|O_EXCL); + if (0 != ret) { + fprintf (stderr, "flag O_CREAT|O_EXCL failed\n"); + goto out; + } + +out: + return ret; +} + +int generic_open_read_write (char *filename, int flag) +{ + int fd = 0; + int ret = -1; + char wstring[50] = {0,}; + char rstring[50] = {0,}; + + fd = open (filename, flag); + if (fd < 0) { + if (flag == O_CREAT|O_EXCL && errno == EEXIST) { + unlink (filename); + return 0; + } + else { + fd = 0; + fprintf (stderr, "open failed: %s\n", strerror (errno)); + return 1; + } + } + + strcpy (wstring, "My string to write\n"); + ret = write (fd, wstring, strlen(wstring)); + if (ret <= 0) { + if (errno != EBADF) { + fprintf (stderr, "write failed: %s\n", strerror (errno)); + close (fd); + unlink(filename); + return 2; + } + } + + ret = lseek (fd, 0, SEEK_SET); + if (ret < 0) { + close (fd); + unlink(filename); + return 4; + } + + ret = read (fd, rstring, strlen(wstring)); + if (ret < 0) { + close (fd); + unlink (filename); + return 3; + } + + /* Compare the rstring with wstring. But we do not want to return + * error when the flag is either O_RDONLY, O_CREAT|O_RDONLY or + * O_TRUNC|O_RDONLY. Because in that case we are not writing + * anything to the file.*/ + + ret = memcmp (wstring, rstring, strlen (wstring)); + if (0 != ret && !(flag == O_CREAT|O_RDONLY || flag == O_RDONLY ||\ + flag == O_TRUNC|O_RDONLY)) { + fprintf (stderr, "read is returning junk\n"); + close (fd); + unlink (filename); + return 4; + } + + close (fd); + unlink (filename); + return 0; +} |
