Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:36

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  * Copyright 2010, Alin Rus <alin.codejunkie@gmail.com>
0005  * Copyright 2024, Alessandro Nardin <ale.daluch@gmail.com>
0006  *
0007  * Redistribution and use in source and binary forms, with or without
0008  * modification, are permitted provided that the following conditions
0009  * are met:
0010  * 1. Redistributions of source code must retain the above copyright
0011  *    notice, this list of conditions and the following disclaimer.
0012  * 2. Redistributions in binary form must reproduce the above copyright
0013  *    notice, this list of conditions and the following disclaimer in the
0014  *    documentation and/or other materials provided with the distribution.
0015  *
0016  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0017  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0018  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0019  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0020  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0021  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0022  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0023  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0024  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0025  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0026  * POSSIBILITY OF SUCH DAMAGE.
0027  */
0028 
0029 #ifdef HAVE_CONFIG_H
0030 #include "config.h"
0031 #endif
0032 
0033 #define CONFIGURE_INIT
0034 #include "system.h"
0035 #include <rtems.h>
0036 #include "tmacros.h"
0037 #include <rtems/posix/aio_misc.h>
0038 #include <aio.h>
0039 #include <stdlib.h>
0040 #include <unistd.h>
0041 #include <sched.h>
0042 #include <fcntl.h>
0043 
0044 const char rtems_test_name[] = "PSXAIO 1";
0045 
0046 #define BUFSIZE 512
0047 #define WRONG_FD 404
0048 
0049 /* forward declarations to avoid warnings */
0050 static struct aiocb *create_aiocb( int fd );
0051 static void free_aiocb( struct aiocb *aiocbp );
0052 
0053 static struct aiocb *create_aiocb( int fd )
0054 {
0055   struct aiocb *aiocbp;
0056 
0057   aiocbp = malloc( sizeof( struct aiocb ) );
0058   memset( aiocbp, 0, sizeof( struct aiocb ) );
0059   aiocbp->aio_buf = malloc( BUFSIZE * sizeof( char ) );
0060   aiocbp->aio_nbytes = BUFSIZE;
0061   aiocbp->aio_offset = 0;
0062   aiocbp->aio_reqprio = 0;
0063   aiocbp->aio_fildes = fd;
0064   aiocbp->aio_sigevent.sigev_notify = SIGEV_NONE;
0065   return aiocbp;
0066 }
0067 
0068 static void free_aiocb( struct aiocb *aiocbp )
0069 {
0070   free( (void*) aiocbp->aio_buf );
0071   free( aiocbp );
0072 }
0073 
0074 void *POSIX_Init( void *argument )
0075 {
0076   int result, fd;
0077   struct aiocb *aiocbp;
0078   int status;
0079 
0080   rtems_aio_init();
0081 
0082   status = mkdir( "/tmp", S_IRWXU );
0083   rtems_test_assert( !status );
0084   
0085   fd = open( "/tmp/aio_fildes", O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO );
0086   rtems_test_assert( fd != -1 );
0087 
0088   TEST_BEGIN();
0089 
0090   /* NULL aiocbp */
0091 
0092   result = aio_write( NULL );
0093   status = errno;
0094   rtems_test_assert( result == -1 );
0095   rtems_test_assert( status == EINVAL );
0096 
0097   /* NULL aiocbp */
0098 
0099   result = aio_read( NULL );
0100   status = errno;
0101   rtems_test_assert( result == -1 );
0102   rtems_test_assert( status == EINVAL );
0103 
0104   /* NULL aiocbp */
0105 
0106   result = aio_fsync( O_SYNC, NULL );
0107   status = errno;
0108   rtems_test_assert( result == -1 );
0109   rtems_test_assert( status == EINVAL );
0110 
0111   /* NULL aiocbp */
0112 
0113   result = aio_return( NULL );
0114   status = errno;
0115   rtems_test_assert( result == -1 );
0116   rtems_test_assert( status == ENOENT );
0117 
0118   /* NULL aiocbp */
0119 
0120   result = aio_error( NULL );
0121   status = errno;
0122   rtems_test_assert( result == -1 );
0123   rtems_test_assert( status == EINVAL );
0124 
0125   aiocbp = create_aiocb( WRONG_FD );
0126 
0127   /* Bad file descriptor */
0128   
0129   result = aio_write( aiocbp );
0130   status = errno;
0131   rtems_test_assert( result == -1 );
0132   rtems_test_assert( status == EBADF );
0133 
0134   /* Bad file descriptor */
0135 
0136   result = aio_read( aiocbp );
0137   status = errno;
0138   rtems_test_assert( result == -1 );
0139   rtems_test_assert( status == EBADF );
0140 
0141   /* Bad file descriptor */
0142   
0143   result = aio_cancel( WRONG_FD, NULL );
0144   status = errno;
0145   rtems_test_assert( result == -1 );
0146   rtems_test_assert( status == EBADF );
0147  
0148   /* Bad file descriptor */
0149 
0150   result = aio_fsync( O_SYNC, aiocbp );
0151   status = errno;
0152   rtems_test_assert( result == -1 );
0153   rtems_test_assert( status == EBADF );
0154   
0155   free_aiocb( aiocbp );
0156 
0157   aiocbp = create_aiocb( fd );
0158   aiocbp->aio_offset = -1;
0159 
0160   /* Invalid offset */
0161 
0162   result = aio_write( aiocbp );
0163   status = errno;
0164   rtems_test_assert( result == -1 );
0165   rtems_test_assert( status == EINVAL );
0166 
0167   /* Invalid offset */
0168 
0169   result = aio_read( aiocbp );
0170   status = errno;
0171   rtems_test_assert( result == -1 );
0172   rtems_test_assert( status == EINVAL );
0173 
0174   free_aiocb( aiocbp );
0175 
0176   aiocbp = create_aiocb( fd );
0177   aiocbp->aio_reqprio = AIO_PRIO_DELTA_MAX + 1;
0178 
0179   /* Invalid request priority */
0180 
0181   result = aio_write( aiocbp );
0182   status = errno;
0183   rtems_test_assert( result == -1 );
0184   rtems_test_assert( status == EINVAL );
0185 
0186   /* Invalid request priority */
0187 
0188   result = aio_read( aiocbp );
0189   status = errno;
0190   rtems_test_assert( result == -1 );
0191   rtems_test_assert( status == EINVAL );
0192 
0193   /* Invalid operation to aio_fsync */
0194 
0195   result = aio_fsync( -1, aiocbp );
0196   status = errno;
0197   rtems_test_assert( result == -1 );
0198   rtems_test_assert( status == EINVAL );
0199 
0200   /* Invalid request aio_cancel */
0201 
0202   aiocbp->aio_fildes = WRONG_FD;
0203   result = aio_cancel( fd, aiocbp );
0204   status = errno;
0205   rtems_test_assert( result == -1 );
0206   rtems_test_assert( status == EINVAL );
0207   aiocbp->aio_fildes = fd;
0208   
0209   /* Bad sigevent */
0210 
0211   aiocbp->aio_sigevent.sigev_notify = SIGEV_SIGNAL;
0212   aiocbp->aio_sigevent.sigev_notify_function = NULL;
0213   result = aio_fsync( O_SYNC, aiocbp );
0214   status = errno;
0215   rtems_test_assert( result == -1 );
0216   rtems_test_assert( status == EINVAL );
0217 
0218   /* Bad sigevent */
0219 
0220   aiocbp->aio_sigevent.sigev_notify = SIGEV_THREAD;
0221   aiocbp->aio_sigevent.sigev_signo = 0;
0222   result = aio_fsync( O_SYNC, aiocbp );
0223   status = errno;
0224   rtems_test_assert( result == -1 );
0225   rtems_test_assert( status == EINVAL );
0226 
0227   free_aiocb( aiocbp );
0228 
0229   TEST_END();
0230 
0231   close( fd );
0232   rtems_test_exit( 0 );
0233 
0234   return NULL;
0235 }