Home | History | Annotate | Download | only in darwin
      1 #include <assert.h>
      2 #include <aio.h>
      3 #include <fcntl.h>
      4 #include <stdio.h>
      5 #include <string.h>
      6 #include <unistd.h>
      7 int x;
      8 
      9 int main(void)
     10 {
     11    #define LEN 10
     12    char buf[LEN];
     13 
     14    struct aiocb a;
     15    struct sigevent s;
     16 
     17    memset(&a, 0, sizeof(struct aiocb));
     18    // Not sure if the sigevent is even looked at by aio_*... just zero it.
     19    memset(&s, 0, sizeof(struct sigevent));
     20 
     21    a.aio_fildes     = -1;
     22    a.aio_offset     = 0;
     23    a.aio_buf        = NULL;
     24    a.aio_nbytes     = LEN;
     25    a.aio_reqprio    = 0;
     26    a.aio_sigevent   = s;
     27    a.aio_lio_opcode = 0;   // ignored
     28 
     29    //------------------------------------------------------------------------
     30    // The cases where aiocbp itself points to bogus memory is handled in
     31    // memcheck/tests/darwin/scalar.c, so we don't check that here.
     32 
     33    //------------------------------------------------------------------------
     34    // XXX: This causes an unexpected undef value error later, at the XXX mark.
     35    //      Not sure why, it shouldn't.
     36    // assert( aio_return(&a) < 0);  // (aiocbp hasn't been inited)
     37 
     38    //------------------------------------------------------------------------
     39    assert( aio_read(&a) < 0);       // invalid fd
     40 
     41    //------------------------------------------------------------------------
     42    a.aio_fildes = open("aio.c", O_RDONLY);
     43    assert(a.aio_fildes >= 0);
     44 
     45    assert( aio_read(&a) < 0);       // unaddressable aio_buf
     46 
     47    //------------------------------------------------------------------------
     48    a.aio_buf = buf;
     49 
     50    assert( aio_read(&a) == 0 );
     51 
     52    assert( aio_read(&a)  < 0 );     // (don't crash on the repeated &a)
     53 
     54    while (0 != aio_error(&a)) { };
     55 
     56    if (buf[0] == buf[9]) x++;       // undefined -- aio_return() not called yet
     57 
     58    assert( aio_return(&a) > 0 );    // XXX: (undefined value error here)
     59 
     60    if (buf[0] == buf[9]) x++;
     61 
     62    assert( aio_return(&a) < 0 );    // (repeated aio_return();  fails because
     63                                     // Valgrind can't find &a in the table)
     64 
     65    //------------------------------------------------------------------------
     66    a.aio_buf    = 0;
     67    a.aio_fildes = creat("mytmpfile", S_IRUSR|S_IWUSR);
     68    assert(a.aio_fildes >= 0);
     69 
     70    assert( aio_write(&a) < 0);      // unaddressable aio_buf
     71 
     72    //------------------------------------------------------------------------
     73    a.aio_buf = buf;
     74 
     75    assert( aio_write(&a) == 0 );
     76 
     77    assert( aio_write(&a)  < 0 );    // (don't crash on the repeated &a)
     78 
     79    while (0 != aio_error(&a)) { };
     80 
     81    assert( aio_return(&a) > 0 );
     82 
     83    assert( aio_return(&a) < 0 );    // (repeated aio_return();  fails because
     84                                     // Valgrind can't find &a in the table)
     85 
     86    unlink("mytmpfile");
     87 
     88    return x;
     89 };
     90 
     91 
     92 
     93