1m4_dnl hmacros.h.m4
2m4_dnl (part of complex test harness, not of the library)
3m4_dnl - common macros
4
5m4_dnl  This file is part of adns, which is
6m4_dnl    Copyright (C) 1997-2000,2003,2006,2014-2016,2020  Ian Jackson
7m4_dnl    Copyright (C) 2014  Mark Wooding
8m4_dnl    Copyright (C) 1999-2000,2003,2006  Tony Finch
9m4_dnl    Copyright (C) 1991 Massachusetts Institute of Technology
10m4_dnl  (See the file INSTALL for full details.)
11m4_dnl
12m4_dnl  This program is free software; you can redistribute it and/or modify
13m4_dnl  it under the terms of the GNU General Public License as published by
14m4_dnl  the Free Software Foundation; either version 3, or (at your option)
15m4_dnl  any later version.
16m4_dnl
17m4_dnl  This program is distributed in the hope that it will be useful,
18m4_dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
19m4_dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20m4_dnl  GNU General Public License for more details.
21m4_dnl
22m4_dnl  You should have received a copy of the GNU General Public License
23m4_dnl  along with this program; if not, write to the Free Software Foundation.
24
25m4_define(`hm_args_massage',
26	`m4_ifelse(
27		m4_patsubst(
28				$1,
29				`hm_comma\|[
30	 ]+',
31				`'),
32		`',
33		`$2',
34		`m4_dnl
35	m4_patsubst(m4_patsubst(m4_patsubst(m4_translit($1, `
36	',` '), `\(hm_comma *\)*$', `'), `^\( *hm_comma\)*', `'),
37		`\( *hm_comma *\)+',` hm_comma ')m4_dnl
38	')')
39
40m4_define(`hm_create_nothing', `
41 m4_define(`hm_na',`')
42 m4_define(`hm_arg_nullptr', `')
43 m4_define(`hm_arg_int', `')
44 m4_define(`hm_arg_fdset_io', `')
45 m4_define(`hm_arg_pollfds_io', `')
46 m4_define(`hm_arg_timeval_in_rel_null',`')
47 m4_define(`hm_arg_must', `')
48 m4_define(`hm_arg_socktype',`')
49 m4_define(`hm_arg_addrfam',`')
50 m4_define(`hm_arg_ign', `')
51 m4_define(`hm_arg_fd', `')
52 m4_define(`hm_arg_fcntl_cmd_arg',`')
53 m4_define(`hm_arg_addr_in', `')
54 m4_define(`hm_arg_bytes_in', `')
55 m4_define(`hm_arg_bytes_out', `')
56 m4_define(`hm_arg_addr_out', `')
57 m4_define(`hm_rv_must', `')
58 m4_define(`hm_rv_any', `')
59 m4_define(`hm_rv_fd', `')
60 m4_define(`hm_rv_succfail', `')
61 m4_define(`hm_rv_len', `')
62 m4_define(`hm_rv_wlen', `hm_rv_any')
63 m4_define(`hm_rv_fcntl', `')
64 m4_define(`hm_rv_select', `hm_rv_any')
65 m4_define(`hm_rv_poll', `hm_rv_any')
66')
67
68m4_define(`hm_create_proto_h',`
69 m4_define(`hm_na', `hm_comma')
70 m4_define(`hm_arg_nullptr', `$'`1 $'`2')
71 m4_define(`hm_arg_int', `int $'`1')
72 m4_define(`hm_arg_fdset_io', `fd_set *$'`1')
73 m4_define(`hm_arg_pollfds_io', `struct pollfd *$'`1 hm_comma int $'`2')
74 m4_define(`hm_arg_timeval_in_rel_null', `struct timeval *$'`1')
75 m4_define(`hm_arg_must', `$'`1 $'`2')
76 m4_define(`hm_arg_socktype', `int $'`1')
77 m4_define(`hm_arg_addrfam', `int $'`1')
78 m4_define(`hm_arg_ign', `$'`1 $'`2')
79 m4_define(`hm_arg_fd', `int $'`1')
80 m4_define(`hm_arg_fcntl_cmd_arg', `int $'`1 hm_comma ...')
81 m4_define(`hm_arg_addr_in', `const struct sockaddr *$'`1 hm_comma int $'`2')
82 m4_define(`hm_arg_bytes_in', `const $'`1 *$'`2 hm_comma $'`3 $'`4')
83 m4_define(`hm_arg_bytes_out', `$'`1 *$'`2 hm_comma $'`3 $'`4')
84 m4_define(`hm_arg_addr_out', `struct sockaddr *$'`1 hm_comma int *$'`2')
85')
86
87m4_define(`hm_create_proto_q',`
88 hm_create_proto_h
89 m4_define(`hm_arg_nullptr', `')
90 m4_define(`hm_arg_fdset_io', `const fd_set *$'`1')
91 m4_define(`hm_arg_pollfds_io', `const struct pollfd *$'`1 hm_comma int $'`2')
92 m4_define(`hm_arg_must', `')
93 m4_define(`hm_arg_ign', `')
94 m4_define(`hm_arg_fcntl_cmd_arg', `int $'`1 hm_comma long $'`2')
95 m4_define(`hm_arg_bytes_out', `$'`3 $'`4')
96 m4_define(`hm_arg_addr_out', `int $'`2')
97')
98
99m4_define(`hm_create_hqcall_vars',`
100 hm_create_nothing
101 m4_define(`hm_arg_fcntl_cmd_arg',`va_list al; long $'`2;')
102')
103
104m4_define(`hm_create_hqcall_init',`
105 hm_create_nothing
106 m4_define(`hm_arg_nullptr', `Tmust("$1","$'`2",!$'`2);')
107 m4_define(`hm_arg_must', `Tmust("$1","$'`2",$'`2==$'`3);')
108 m4_define(`hm_arg_socktype',`
109  Tmust("$1","$'`1",$'`1==SOCK_STREAM || $'`1==SOCK_DGRAM);')
110 m4_define(`hm_arg_addrfam',`
111  Tmust("$1","$'`1",$'`1==AF_INET || $'`1==AF_INET6);')
112 m4_define(`hm_arg_fcntl_cmd_arg',`
113  Tmust("$1","$'`1",$'`1==F_SETFL || $'`1==F_GETFL);
114  if ($'`1 == F_SETFL) {
115    va_start(al,$'`1); $'`2= va_arg(al,int); va_end(al);
116  } else {
117    $'`2= 0;
118  }')
119 m4_define(`hm_arg_addr_out',`Tmust("$1","*$'`2",*$'`2>=sizeof(struct sockaddr_in));')
120')
121
122m4_define(`hm_create_realcall_args',`
123 m4_define(`hm_na',`hm_comma')
124 m4_define(`hm_arg_nullptr', `0')
125 m4_define(`hm_arg_int', `$'`1')
126 m4_define(`hm_arg_fdset_io', `$'`1')
127 m4_define(`hm_arg_pollfds_io', `$'`1 hm_comma $'`2')
128 m4_define(`hm_arg_timeval_in_rel_null', `$'`1')
129 m4_define(`hm_arg_must', `$'`2')
130 m4_define(`hm_arg_socktype', `$'`1')
131 m4_define(`hm_arg_addrfam', `$'`1')
132 m4_define(`hm_arg_ign', `$'`2')
133 m4_define(`hm_arg_fd', `$'`1')
134 m4_define(`hm_arg_fcntl_cmd_arg', `$'`1 hm_comma $'`2')
135 m4_define(`hm_arg_addr_in', `$'`1 hm_comma $'`2')
136 m4_define(`hm_arg_bytes_in', `$'`2 hm_comma $'`4')
137 m4_define(`hm_arg_bytes_out', `$'`2 hm_comma $'`4')
138 m4_define(`hm_arg_addr_out', `$'`1 hm_comma $'`2')
139')
140
141m4_define(`hm_create_hqcall_args',`
142 hm_create_realcall_args
143 m4_define(`hm_arg_nullptr', `')
144 m4_define(`hm_arg_must', `')
145 m4_define(`hm_arg_ign', `')
146 m4_define(`hm_arg_bytes_in', `$'`2 hm_comma $'`4')
147 m4_define(`hm_arg_bytes_out', `$'`4')
148 m4_define(`hm_arg_addr_out', `*$'`2')
149')
150
151m4_define(`hm_fr_syscall_ident',`
152  static const char sync_expect[sizeof("$1")]= "$1\xee";
153')
154