@@ -87,102 +87,150 @@ main(void)
87
87
{
88
88
tprintf ("%s" , "" );
89
89
90
- const int R = 0 , W = 1 ;
91
- int sv [2 ];
92
- if (socketpair (AF_UNIX , SOCK_DGRAM , 0 , sv ))
90
+ int fds [2 ];
91
+ if (socketpair (AF_UNIX , SOCK_DGRAM , 0 , fds ))
93
92
perror_msg_and_skip ("socketpair" );
94
- assert (R == sv [0 ]);
95
- assert (W == sv [1 ]);
93
+ assert (0 == fds [0 ]);
94
+ assert (1 == fds [1 ]);
96
95
97
- static const char one [] = "one" ;
98
- static const char two [] = "two" ;
99
- static const char three [] = "three" ;
100
- static const char ascii_one [] = "6f 6e 65" ;
101
- static const char ascii_two [] = "74 77 6f" ;
102
- static const char ascii_three [] = "74 68 72 65 65" ;
96
+ static const char w0_c [] = "012" ;
97
+ const char * w0_d = hexdump_strdup (w0_c );
98
+ void * w0 = tail_memdup (w0_c , LENGTH_OF (w0_c ));
103
99
104
- void * copy_one = tail_memdup ( one , LENGTH_OF ( one )) ;
105
- void * copy_two = tail_memdup ( two , LENGTH_OF ( two ) );
106
- void * copy_three = tail_memdup (three , LENGTH_OF (three ));
100
+ static const char w1_c [] = "34567" ;
101
+ const char * w1_d = hexdump_strdup ( w1_c );
102
+ void * w1 = tail_memdup (w1_c , LENGTH_OF (w1_c ));
107
103
108
- struct iovec iov [] = {
104
+ static const char w2_c [] = "89abcde" ;
105
+ const char * w2_d = hexdump_strdup (w2_c );
106
+ void * w2 = tail_memdup (w2_c , LENGTH_OF (w2_c ));
107
+
108
+ const struct iovec w0_iov_ [] = {
109
109
{
110
- .iov_base = copy_one ,
111
- .iov_len = LENGTH_OF (one )
112
- }, {
113
- .iov_base = copy_two ,
114
- .iov_len = LENGTH_OF (two )
110
+ .iov_base = w0 ,
111
+ .iov_len = LENGTH_OF (w0_c )
115
112
}, {
116
- .iov_base = copy_three ,
117
- .iov_len = LENGTH_OF (three )
113
+ .iov_base = w1 ,
114
+ .iov_len = LENGTH_OF (w1_c )
118
115
}
119
116
};
120
- struct iovec * copy_iov = tail_memdup (iov , sizeof (iov ));
117
+ struct iovec * w0_iov = tail_memdup (w0_iov_ , sizeof (w0_iov_ ));
121
118
122
- struct mmsghdr mmh [] = {
119
+ const struct iovec w1_iov_ [] = {
120
+ {
121
+ .iov_base = w2 ,
122
+ .iov_len = LENGTH_OF (w2_c )
123
+ }
124
+ };
125
+ struct iovec * w1_iov = tail_memdup (w1_iov_ , sizeof (w1_iov_ ));
126
+
127
+ const struct mmsghdr w_mmh_ [] = {
123
128
{
124
129
.msg_hdr = {
125
- .msg_iov = copy_iov + 0 ,
126
- .msg_iovlen = 2 ,
130
+ .msg_iov = w0_iov ,
131
+ .msg_iovlen = ARRAY_SIZE ( w0_iov_ ) ,
127
132
}
128
133
}, {
129
134
.msg_hdr = {
130
- .msg_iov = copy_iov + 2 ,
131
- .msg_iovlen = 1 ,
135
+ .msg_iov = w1_iov ,
136
+ .msg_iovlen = ARRAY_SIZE ( w1_iov_ ) ,
132
137
}
133
138
}
134
139
};
135
- void * copy_mmh = tail_memdup (mmh , sizeof (mmh ));
136
- # define n_mmh (( unsigned int) (sizeof(mmh)/sizeof(mmh[0])))
140
+ void * w_mmh = tail_memdup (w_mmh_ , sizeof (w_mmh_ ));
141
+ const unsigned int n_w_mmh = ARRAY_SIZE ( w_mmh_ );
137
142
138
- int r = send_mmsg (W , copy_mmh , n_mmh , MSG_DONTROUTE | MSG_NOSIGNAL );
143
+ int r = send_mmsg (1 , w_mmh , n_w_mmh , MSG_DONTROUTE | MSG_NOSIGNAL );
139
144
if (r < 0 && errno == ENOSYS )
140
145
perror_msg_and_skip ("sendmmsg" );
141
- assert (r == (int ) n_mmh );
142
- assert (close (W ) == 0 );
143
- tprintf ("sendmmsg(%d , {{{msg_name(0)=NULL, msg_iov(%u)=[{\"%s\", %u}"
146
+ assert (r == (int ) n_w_mmh );
147
+ assert (close (1 ) == 0 );
148
+ tprintf ("sendmmsg(1 , {{{msg_name(0)=NULL, msg_iov(%u)=[{\"%s\", %u}"
144
149
", {\"%s\", %u}], msg_controllen=0, msg_flags=0}, %u}"
145
150
", {{msg_name(0)=NULL, msg_iov(%u)=[{\"%s\", %u}]"
146
151
", msg_controllen=0, msg_flags=0}, %u}}, %u"
147
152
", MSG_DONTROUTE|MSG_NOSIGNAL) = %d\n"
148
153
" = %u buffers in vector 0\n"
149
154
" * %u bytes in buffer 0\n"
150
- " | 00000 %-48s %-16s |\n"
155
+ " | 00000 %-49s %-16s |\n"
151
156
" * %u bytes in buffer 1\n"
152
- " | 00000 %-48s %-16s |\n"
157
+ " | 00000 %-49s %-16s |\n"
153
158
" = %u buffers in vector 1\n"
154
159
" * %u bytes in buffer 0\n"
155
- " | 00000 %-48s %-16s |\n" ,
156
- W , 2 , one , LENGTH_OF (one ), two , LENGTH_OF (two ),
157
- LENGTH_OF (one ) + LENGTH_OF (two ),
158
- 1 , three , LENGTH_OF (three ), LENGTH_OF (three ),
159
- n_mmh , r ,
160
- 2 , LENGTH_OF (one ), ascii_one , one ,
161
- LENGTH_OF (two ), ascii_two , two ,
162
- 1 , LENGTH_OF (three ), ascii_three , three );
163
-
164
- assert (recv_mmsg (R , copy_mmh , n_mmh , MSG_DONTWAIT , NULL ) == (int ) n_mmh );
165
- assert (close (R ) == 0 );
166
- tprintf ("recvmmsg(%d, {{{msg_name(0)=NULL, msg_iov(%u)=[{\"%s\", %u}"
167
- ", {\"%s\", %u}], msg_controllen=0, msg_flags=0}, %u}"
168
- ", {{msg_name(0)=NULL, msg_iov(%u)=[{\"%s\", %u}]"
160
+ " | 00000 %-49s %-16s |\n" ,
161
+ ARRAY_SIZE (w0_iov_ ), w0_c , LENGTH_OF (w0_c ),
162
+ w1_c , LENGTH_OF (w1_c ),
163
+ LENGTH_OF (w0_c ) + LENGTH_OF (w1_c ),
164
+ ARRAY_SIZE (w1_iov_ ), w2_c , LENGTH_OF (w2_c ), LENGTH_OF (w2_c ),
165
+ n_w_mmh , r ,
166
+ ARRAY_SIZE (w0_iov_ ), LENGTH_OF (w0_c ), w0_d , w0_c ,
167
+ LENGTH_OF (w1_c ), w1_d , w1_c ,
168
+ ARRAY_SIZE (w1_iov_ ), LENGTH_OF (w2_c ), w2_d , w2_c );
169
+
170
+ const unsigned int w_len =
171
+ LENGTH_OF (w0_c ) + LENGTH_OF (w1_c ) + LENGTH_OF (w2_c );
172
+ const unsigned int r_len = (w_len + 1 ) / 2 ;
173
+ void * r0 = tail_alloc (r_len );
174
+ void * r1 = tail_alloc (r_len );
175
+ void * r2 = tail_alloc (r_len );
176
+ const struct iovec r0_iov_ [] = {
177
+ {
178
+ .iov_base = r0 ,
179
+ .iov_len = r_len
180
+ }
181
+ };
182
+ struct iovec * r0_iov = tail_memdup (r0_iov_ , sizeof (r0_iov_ ));
183
+ const struct iovec r1_iov_ [] = {
184
+ {
185
+ .iov_base = r1 ,
186
+ .iov_len = r_len
187
+ },
188
+ {
189
+ .iov_base = r2 ,
190
+ .iov_len = r_len
191
+ }
192
+ };
193
+ struct iovec * r1_iov = tail_memdup (r1_iov_ , sizeof (r1_iov_ ));
194
+
195
+ const struct mmsghdr r_mmh_ [] = {
196
+ {
197
+ .msg_hdr = {
198
+ .msg_iov = r0_iov ,
199
+ .msg_iovlen = ARRAY_SIZE (r0_iov_ ),
200
+ }
201
+ }, {
202
+ .msg_hdr = {
203
+ .msg_iov = r1_iov ,
204
+ .msg_iovlen = ARRAY_SIZE (r1_iov_ ),
205
+ }
206
+ }
207
+ };
208
+ void * r_mmh = tail_memdup (r_mmh_ , sizeof (r_mmh_ ));
209
+ const unsigned int n_r_mmh = ARRAY_SIZE (r_mmh_ );
210
+
211
+ static const char r0_c [] = "01234567" ;
212
+ const char * r0_d = hexdump_strdup (r0_c );
213
+ static const char r1_c [] = "89abcde" ;
214
+ const char * r1_d = hexdump_strdup (r1_c );
215
+
216
+ assert (recv_mmsg (0 , r_mmh , n_r_mmh , MSG_DONTWAIT , NULL ) == (int ) n_r_mmh );
217
+ assert (close (0 ) == 0 );
218
+ tprintf ("recvmmsg(0, {{{msg_name(0)=NULL, msg_iov(%u)=[{\"%s\", %u}]"
219
+ ", msg_controllen=0, msg_flags=0}, %u}"
220
+ ", {{msg_name(0)=NULL, msg_iov(%u)=[{\"%s\", %u}, {\"\", %u}]"
169
221
", msg_controllen=0, msg_flags=0}, %u}}, %u"
170
222
", MSG_DONTWAIT, NULL) = %d (left NULL)\n"
171
223
" = %u buffers in vector 0\n"
172
224
" * %u bytes in buffer 0\n"
173
- " | 00000 %-48s %-16s |\n"
174
- " * %u bytes in buffer 1\n"
175
- " | 00000 %-48s %-16s |\n"
225
+ " | 00000 %-49s %-16s |\n"
176
226
" = %u buffers in vector 1\n"
177
227
" * %u bytes in buffer 0\n"
178
- " | 00000 %-48s %-16s |\n" ,
179
- R , 2 , one , LENGTH_OF (one ), two , LENGTH_OF (two ),
180
- LENGTH_OF (one ) + LENGTH_OF (two ),
181
- 1 , three , LENGTH_OF (three ), LENGTH_OF (three ),
182
- n_mmh , r ,
183
- 2 , LENGTH_OF (one ), ascii_one , one ,
184
- LENGTH_OF (two ), ascii_two , two ,
185
- 1 , LENGTH_OF (three ), ascii_three , three );
228
+ " | 00000 %-49s %-16s |\n" ,
229
+ ARRAY_SIZE (r0_iov_ ), r0_c , r_len , LENGTH_OF (r0_c ),
230
+ ARRAY_SIZE (r1_iov_ ), r1_c , r_len , r_len , LENGTH_OF (r1_c ),
231
+ n_r_mmh , r ,
232
+ ARRAY_SIZE (r0_iov_ ), LENGTH_OF (r0_c ), r0_d , r0_c ,
233
+ ARRAY_SIZE (r1_iov_ ), LENGTH_OF (r1_c ), r1_d , r1_c );
186
234
187
235
tprintf ("+++ exited with 0 +++\n" );
188
236
return 0 ;
0 commit comments