@@ -344,6 +344,33 @@ static apr_status_t sock_write(int fd, const void *buf, size_t buf_size)
344344 return APR_SUCCESS ;
345345}
346346
347+ static apr_status_t sock_writev (int fd , request_rec * r , int count , ...)
348+ {
349+ va_list ap ;
350+ int rc ;
351+ struct iovec * vec ;
352+ int i ;
353+ int total_bytes = 0 ;
354+
355+ vec = (struct iovec * )apr_palloc (r -> pool , count * sizeof (struct iovec ));
356+ va_start (ap , count );
357+ for (i = 0 ; i < count ; i ++ ) {
358+ vec [i ].iov_base = va_arg (ap , caddr_t );
359+ vec [i ].iov_len = va_arg (ap , apr_size_t );
360+ total_bytes += vec [i ].iov_len ;
361+ }
362+ va_end (ap );
363+
364+ do {
365+ rc = writev (fd , vec , count );
366+ } while (rc < 0 && errno == EINTR );
367+ if (rc < 0 ) {
368+ return errno ;
369+ }
370+
371+ return APR_SUCCESS ;
372+ }
373+
347374static apr_status_t get_req (int fd , request_rec * r , char * * argv0 , char * * * env ,
348375 cgid_req_t * req )
349376{
@@ -472,31 +499,31 @@ static apr_status_t send_req(int fd, request_rec *r, char *argv0, char **env,
472499 req .loglevel = r -> server -> loglevel ;
473500
474501 /* Write the request header */
475- if ((stat = sock_write (fd , & req , sizeof (req ))) != APR_SUCCESS ) {
476- return stat ;
502+ if (req .args_len ) {
503+ stat = sock_writev (fd , r , 5 ,
504+ & req , sizeof (req ),
505+ r -> filename , req .filename_len ,
506+ argv0 , req .argv0_len ,
507+ r -> uri , req .uri_len ,
508+ r -> args , req .args_len );
509+ } else {
510+ stat = sock_writev (fd , r , 4 ,
511+ & req , sizeof (req ),
512+ r -> filename , req .filename_len ,
513+ argv0 , req .argv0_len ,
514+ r -> uri , req .uri_len );
477515 }
478516
479- /* Write filename, argv0, uri, and args */
480- if ((stat = sock_write (fd , r -> filename , req .filename_len )) != APR_SUCCESS ||
481- (stat = sock_write (fd , argv0 , req .argv0_len )) != APR_SUCCESS ||
482- (stat = sock_write (fd , r -> uri , req .uri_len )) != APR_SUCCESS ) {
517+ if (stat != APR_SUCCESS ) {
483518 return stat ;
484519 }
485- if (req .args_len ) {
486- if ((stat = sock_write (fd , r -> args , req .args_len )) != APR_SUCCESS ) {
487- return stat ;
488- }
489- }
490520
491521 /* write the environment variables */
492522 for (i = 0 ; i < req .env_count ; i ++ ) {
493523 apr_size_t curlen = strlen (env [i ]);
494524
495- if ((stat = sock_write (fd , & curlen , sizeof (curlen ))) != APR_SUCCESS ) {
496- return stat ;
497- }
498-
499- if ((stat = sock_write (fd , env [i ], curlen )) != APR_SUCCESS ) {
525+ if ((stat = sock_writev (fd , r , 2 , & curlen , sizeof (curlen ),
526+ env [i ], curlen )) != APR_SUCCESS ) {
500527 return stat ;
501528 }
502529 }
0 commit comments