1  /* { dg-require-effective-target sockets } */
       2  /* { dg-skip-if "" { powerpc*-*-aix* } } */
       3  
       4  #include <sys/socket.h>
       5  #include <sys/un.h>
       6  #include <unistd.h>
       7  #include <errno.h>
       8  #include "analyzer-decls.h"
       9  
      10  void test_active_open_from_scratch (const char *sockname, void *buf)
      11  {
      12    errno = 0;
      13    int fd = socket (AF_UNIX, SOCK_STREAM, 0);
      14    if (fd == -1)
      15      {
      16        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-invalid'" } */
      17        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
      18        return;
      19      }
      20    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-new-stream-socket'" } */
      21    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
      22  
      23    struct sockaddr_un addr;
      24    memset (&addr, 0, sizeof (addr));
      25    addr.sun_family = AF_UNIX;
      26    strncpy (addr.sun_path, sockname, sizeof(addr.sun_path) - 1);
      27  
      28    errno = 0;
      29    if (connect (fd, (struct sockaddr *)&addr, sizeof (addr)) == -1)
      30      {
      31        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-new-stream-socket'" } */
      32        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
      33        close (fd);
      34        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
      35        return;
      36      }
      37  
      38    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-connected-stream-socket'" } */
      39    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
      40    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
      41  
      42    write (fd, "hello", 6);
      43    read (fd, buf, 100);
      44  
      45    close (fd);
      46    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
      47  }
      48  
      49  void test_active_open_from_connect (int fd, const char *sockname, void *buf)
      50  {
      51    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'start'" } */
      52  
      53    struct sockaddr_un addr;
      54    memset (&addr, 0, sizeof (addr));
      55    addr.sun_family = AF_UNIX;
      56    strncpy (addr.sun_path, sockname, sizeof(addr.sun_path) - 1);
      57  
      58    errno = 0;
      59    if (connect (fd, (struct sockaddr *)&addr, sizeof (addr)) == -1)
      60      {
      61        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-new-unknown-socket'" } */
      62        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
      63        close (fd);
      64        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
      65        return;
      66      }
      67  
      68    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-stop'" } */
      69    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
      70    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
      71  
      72    write (fd, "hello", 6);
      73    read (fd, buf, 100);
      74  
      75    close (fd);
      76    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-stop'" } */
      77  }
      78  
      79  void test_active_open_from_connect_constant (const char *sockname, void *buf)
      80  {
      81    const int fd = 42;
      82    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-constant'" } */
      83  
      84    struct sockaddr_un addr;
      85    memset (&addr, 0, sizeof (addr));
      86    addr.sun_family = AF_UNIX;
      87    strncpy (addr.sun_path, sockname, sizeof(addr.sun_path) - 1);
      88  
      89    errno = 0;
      90    if (connect (fd, (struct sockaddr *)&addr, sizeof (addr)) == -1)
      91      {
      92        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-constant'" } */
      93        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
      94        close (fd);
      95        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
      96        return;
      97      }
      98  
      99    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-stop'" } */
     100    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
     101    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
     102  
     103    write (fd, "hello", 6);
     104    read (fd, buf, 100);
     105  
     106    close (fd);
     107    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-stop'" } */
     108  }