blob: c75032e8fc4d4dc8d6f9ecdc7256229b5e5622b9 [file] [log] [blame]
/*
*
* Copyright (c) International Business Machines Corp., 2001
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
* the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
* Test Name: asapi_07
*
* Test Description:
* These tests are for the "Advanced Sockets API" (RFC 3542)
* Section 20, ancillary data macros and structure definitions
*
* Usage: <for command-line>
* asapi_07
*
* HISTORY
* 04/2005 written by David L Stevens
*
* RESTRICTIONS:
* None.
*
*/
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <netinet/ip6.h>
#include <netinet/icmp6.h>
#include "test.h"
#include "runcc.h"
char *TCID = "asapi_07"; /* Test program identifier. */
void setup(void);
void cleanup(void);
void adatet(void);
void adatft(void);
int main(int argc, char *argv[])
{
int lc;
const char *msg;
/* Parse standard options given to run the test. */
if ((msg = parse_opts(argc, argv, NULL, NULL)) != NULL)
tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
setup();
for (lc = 0; TEST_LOOPING(lc); ++lc) {
adatet();
}
cleanup();
tst_exit();
}
enum ttype { EXISTS, ALIAS, VALUE, DEFINED };
struct etent {
char *et_tname; /* test name */
int et_type; /* test type */
char *et_incl; /* include file list */
char *et_struct; /* structure name */
char *et_field; /* field name */
char *et_offset; /* field offset */
union {
char *fu_value; /* field size or value */
char *fu_dname; /* #define name */
} ftun;
#define et_value ftun.fu_value
#define et_dname ftun.fu_dname
} etab[] = {
/* existence checks, RFC 3542 sections 5, 20 */
{
"msghdr msg_name", EXISTS, SOCKET_H, "msghdr", "msg_name", NULL, {
"sizeof(void *)"}}, {
"msghdr msg_namelen", EXISTS, SOCKET_H, "msghdr",
"msg_namelen", NULL, {
"sizeof(socklen_t)"}}, {
"msghdr msg_iov", EXISTS, SOCKET_H, "msghdr", "msg_iov", NULL, {
"sizeof(struct iovec *)"}}, {
"msghdr msg_iovlen", EXISTS, SOCKET_H, "msghdr",
"msg_iovlen", NULL, {
"sizeof(size_t)"}}, {
"msghdr msg_control", EXISTS, SOCKET_H, "msghdr",
"msg_control", NULL, {
"sizeof(void *)"}}, {
"msghdr msg_controllen", EXISTS, SOCKET_H, "msghdr",
"msg_controllen", NULL, {
"sizeof(size_t)"}}, {
"msghdr msg_flags", EXISTS, SOCKET_H, "msghdr",
"msg_flags", NULL, {
"sizeof(int)"}}, {
"cmsghdr cmsg_len", EXISTS, SOCKET_H, "cmsghdr",
"cmsg_len", NULL, {
"sizeof(size_t)"}}, {
"cmsghdr cmsg_level", EXISTS, SOCKET_H, "cmsghdr",
"cmsg_level", NULL, {
"sizeof(int)"}}, {
"cmsghdr cmsg_type", EXISTS, SOCKET_H, "cmsghdr",
"cmsg_type", NULL, {
"sizeof(int)"}}, {
"CMSG_DATA", DEFINED, SOCKET_H, "CMSG_DATA", NULL, NULL, {
0}}, {
"CMSG_NXTHDR", DEFINED, SOCKET_H, "CMSG_NXTHDR", NULL, NULL, {
0}}, {
"CMSG_FIRSTHDR", DEFINED, SOCKET_H, "CMSG_FIRSTHDR", NULL, NULL, {
0}}, {
"CMSG_SPACE", DEFINED, SOCKET_H, "CMSG_SPACE", NULL, NULL, {
0}}, {
"CMSG_LEN", DEFINED, SOCKET_H, "CMSG_LEN", NULL, NULL, {
0}},};
#define ETCOUNT (sizeof(etab)/sizeof(etab[0]))
/* existence tests */
void adatet(void)
{
int i;
for (i = 0; i < ETCOUNT; ++i) {
switch (etab[i].et_type) {
case EXISTS:
structcheck(etab[i].et_tname, etab[i].et_incl,
etab[i].et_struct, etab[i].et_field,
etab[i].et_offset, etab[i].et_value);
break;
case ALIAS:
aliascheck(etab[i].et_tname, etab[i].et_incl,
etab[i].et_struct, etab[i].et_field,
etab[i].et_dname);
break;
case VALUE:
valuecheck(etab[i].et_tname, etab[i].et_incl,
etab[i].et_struct, etab[i].et_dname);
break;
case DEFINED:
funccheck(etab[i].et_tname, etab[i].et_incl,
etab[i].et_struct);
break;
default:
tst_resm(TBROK, "invalid type %d", etab[i].et_type);
break;
}
}
}
void setup(void)
{
TEST_PAUSE; /* if -P option specified */
}
void cleanup(void)
{
}
int TST_TOTAL = ETCOUNT;