File: rfcomm.c

package info (click to toggle)
valgrind 1%3A3.12.0~svn20160714-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 120,428 kB
  • ctags: 70,855
  • sloc: ansic: 674,645; exp: 26,134; xml: 21,574; asm: 7,570; cpp: 7,567; makefile: 7,380; sh: 6,188; perl: 5,855; haskell: 195
file content (74 lines) | stat: -rw-r--r-- 1,903 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include "../../memcheck.h"

/* user space headers might not be there, define things ourselves. */
typedef struct {
   uint8_t b[6];
} __attribute__((packed)) vui_bdaddr_t;

struct vui_sockaddr_rc {
	sa_family_t	rc_family;
	vui_bdaddr_t	rc_bdaddr;
	uint8_t		rc_channel;
};

#define VUI_AF_BLUETOOTH 31
#define VUI_BTPROTO_RFCOMM 3

#define VUI_BDADDR_ANY (&(vui_bdaddr_t) {{0, 0, 0, 0, 0, 0}})

int
main (int argc, char **argv)
{
  int nSocket;

  nSocket = socket(VUI_AF_BLUETOOTH, SOCK_STREAM, VUI_BTPROTO_RFCOMM);

  if (nSocket < 0)
    {
      // Not supported, nothing to test...
      return 1;
    }

  struct vui_sockaddr_rc aAddr;

  // Store correct values in aAddr but marking it undefined
  // so as to generate errors. We need to have deterministic
  // undefined values to have a reproducible test.
  aAddr.rc_family = VUI_AF_BLUETOOTH;
  aAddr.rc_bdaddr = *VUI_BDADDR_ANY;
  aAddr.rc_channel = 5;
  VALGRIND_MAKE_MEM_UNDEFINED(&aAddr, sizeof(aAddr));
  // We re-assign below each piece one by one, so as to
  // have the piece marked initialised.


  // Ignore return values.

  // Everything uninit (family, ...)
  bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr));

  // Same but with an unknown family (we hope :)
  aAddr.rc_family = 12345;
  // (reset everything to uninit)
  VALGRIND_MAKE_MEM_UNDEFINED(&aAddr, sizeof(aAddr));
  bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr));

  aAddr.rc_family = VUI_AF_BLUETOOTH;
  // uninit bdaddr and channel.
  bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr));

  aAddr.rc_bdaddr = *VUI_BDADDR_ANY;
  // uninit channel.
  bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr));

  aAddr.rc_channel = 5;
  // Everything correctly init.
  bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr));

  return 0;
}