blob: dbda1f5b8833b18e438a1d153afb8e817193c34f [file] [log] [blame]
#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;
}