• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
main(void)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