91 lines
2.3 KiB
C
91 lines
2.3 KiB
C
/* Tests for ioctl wrappers.
|
|
More complicated ones than just trivial ones in scalar_ioctl. */
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <strings.h>
|
|
#include <unistd.h>
|
|
#include <net/if.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/sockio.h>
|
|
|
|
/* sockio */
|
|
__attribute__((noinline))
|
|
static int test_SIOCGIFCONF(void)
|
|
{
|
|
int fd = socket(AF_INET, SOCK_DGRAM, 0);
|
|
if (fd < 0)
|
|
perror("socket");
|
|
|
|
int n_ifs;
|
|
if (ioctl(fd, SIOCGIFNUM, &n_ifs) < 0)
|
|
perror("ioctl(SIOCGIFNUM)");
|
|
|
|
struct ifconf ifc;
|
|
ifc.ifc_len = (n_ifs + 1) * sizeof(struct ifreq);
|
|
ifc.ifc_buf = malloc((n_ifs + 1) * sizeof(struct ifreq));
|
|
if (ifc.ifc_buf == NULL)
|
|
perror("malloc");
|
|
|
|
if (ioctl(fd, SIOCGIFCONF, &ifc) < 0)
|
|
perror("ioctl(SIOCGIFCONF)");
|
|
|
|
/* Check definedness of ifc attributes ... */
|
|
int x = 0;
|
|
if (ifc.ifc_len != 0) x = -1; else x = -2;
|
|
if (ifc.ifc_req != NULL) x = -3; else x = -4;
|
|
if (strcmp(ifc.ifc_req[0].ifr_name, "") != 0) x = -5; else x = -6;
|
|
/* ... and now one which is not defined. */
|
|
if (strcmp(ifc.ifc_req[n_ifs].ifr_name, "") != 0) x = -7; else x = -8;
|
|
|
|
free(ifc.ifc_buf);
|
|
close(fd);
|
|
return x;
|
|
}
|
|
|
|
__attribute__((noinline))
|
|
static int test_SIOCGLIFCONF(void)
|
|
{
|
|
int fd = socket(AF_INET, SOCK_DGRAM, 0);
|
|
if (fd < 0)
|
|
perror("socket");
|
|
|
|
struct lifnum lifn;
|
|
lifn.lifn_family = AF_INET;
|
|
lifn.lifn_flags = 0;
|
|
if (ioctl(fd, SIOCGLIFNUM, &lifn) < 0)
|
|
perror("ioctl(SIOCGLIFNUM)");
|
|
|
|
struct lifconf lifc;
|
|
lifc.lifc_family = AF_INET;
|
|
lifc.lifc_flags = 0;
|
|
lifc.lifc_len = (lifn.lifn_count + 1) * sizeof(struct lifreq);
|
|
lifc.lifc_buf = malloc((lifn.lifn_count + 1) * sizeof(struct lifreq));
|
|
if (lifc.lifc_buf == NULL)
|
|
perror("malloc");
|
|
|
|
if (ioctl(fd, SIOCGLIFCONF, &lifc) < 0)
|
|
perror("ioctl(SIOCGLIFCONF)");
|
|
|
|
/* Check definedness of lifc attributes ... */
|
|
int x = 0;
|
|
if (lifc.lifc_len != 0) x = -1; else x = -2;
|
|
if (lifc.lifc_req != NULL) x = -3; else x = -4;
|
|
if (strcmp(lifc.lifc_req[0].lifr_name, "") != 0) x = -5; else x = -6;
|
|
/* ... and now one which is not defined. */
|
|
if (strcmp(lifc.lifc_req[lifn.lifn_count].lifr_name, "") != 0)
|
|
x = -7; else x = -8;
|
|
|
|
free(lifc.lifc_buf);
|
|
close(fd);
|
|
return x;
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
/* sockio */
|
|
test_SIOCGIFCONF();
|
|
test_SIOCGLIFCONF();
|
|
|
|
return 0;
|
|
}
|