/* 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; }