@@ -663,3 +663,145 @@ void free_test_iovec(const struct iovec *test_iovec,
663663
664664 free (iovec );
665665}
666+
667+ /* Set "unsigned long long" socket option and check that it's indeed set */
668+ void setsockopt_ull_check (int fd , int level , int optname ,
669+ unsigned long long val , char const * errmsg )
670+ {
671+ unsigned long long chkval ;
672+ socklen_t chklen ;
673+ int err ;
674+
675+ err = setsockopt (fd , level , optname , & val , sizeof (val ));
676+ if (err ) {
677+ fprintf (stderr , "setsockopt err: %s (%d)\n" ,
678+ strerror (errno ), errno );
679+ goto fail ;
680+ }
681+
682+ chkval = ~val ; /* just make storage != val */
683+ chklen = sizeof (chkval );
684+
685+ err = getsockopt (fd , level , optname , & chkval , & chklen );
686+ if (err ) {
687+ fprintf (stderr , "getsockopt err: %s (%d)\n" ,
688+ strerror (errno ), errno );
689+ goto fail ;
690+ }
691+
692+ if (chklen != sizeof (chkval )) {
693+ fprintf (stderr , "size mismatch: set %zu got %d\n" , sizeof (val ),
694+ chklen );
695+ goto fail ;
696+ }
697+
698+ if (chkval != val ) {
699+ fprintf (stderr , "value mismatch: set %llu got %llu\n" , val ,
700+ chkval );
701+ goto fail ;
702+ }
703+ return ;
704+ fail :
705+ fprintf (stderr , "%s val %llu\n" , errmsg , val );
706+ exit (EXIT_FAILURE );
707+ ;
708+ }
709+
710+ /* Set "int" socket option and check that it's indeed set */
711+ void setsockopt_int_check (int fd , int level , int optname , int val ,
712+ char const * errmsg )
713+ {
714+ int chkval ;
715+ socklen_t chklen ;
716+ int err ;
717+
718+ err = setsockopt (fd , level , optname , & val , sizeof (val ));
719+ if (err ) {
720+ fprintf (stderr , "setsockopt err: %s (%d)\n" ,
721+ strerror (errno ), errno );
722+ goto fail ;
723+ }
724+
725+ chkval = ~val ; /* just make storage != val */
726+ chklen = sizeof (chkval );
727+
728+ err = getsockopt (fd , level , optname , & chkval , & chklen );
729+ if (err ) {
730+ fprintf (stderr , "getsockopt err: %s (%d)\n" ,
731+ strerror (errno ), errno );
732+ goto fail ;
733+ }
734+
735+ if (chklen != sizeof (chkval )) {
736+ fprintf (stderr , "size mismatch: set %zu got %d\n" , sizeof (val ),
737+ chklen );
738+ goto fail ;
739+ }
740+
741+ if (chkval != val ) {
742+ fprintf (stderr , "value mismatch: set %d got %d\n" , val , chkval );
743+ goto fail ;
744+ }
745+ return ;
746+ fail :
747+ fprintf (stderr , "%s val %d\n" , errmsg , val );
748+ exit (EXIT_FAILURE );
749+ }
750+
751+ static void mem_invert (unsigned char * mem , size_t size )
752+ {
753+ size_t i ;
754+
755+ for (i = 0 ; i < size ; i ++ )
756+ mem [i ] = ~mem [i ];
757+ }
758+
759+ /* Set "timeval" socket option and check that it's indeed set */
760+ void setsockopt_timeval_check (int fd , int level , int optname ,
761+ struct timeval val , char const * errmsg )
762+ {
763+ struct timeval chkval ;
764+ socklen_t chklen ;
765+ int err ;
766+
767+ err = setsockopt (fd , level , optname , & val , sizeof (val ));
768+ if (err ) {
769+ fprintf (stderr , "setsockopt err: %s (%d)\n" ,
770+ strerror (errno ), errno );
771+ goto fail ;
772+ }
773+
774+ /* just make storage != val */
775+ chkval = val ;
776+ mem_invert ((unsigned char * )& chkval , sizeof (chkval ));
777+ chklen = sizeof (chkval );
778+
779+ err = getsockopt (fd , level , optname , & chkval , & chklen );
780+ if (err ) {
781+ fprintf (stderr , "getsockopt err: %s (%d)\n" ,
782+ strerror (errno ), errno );
783+ goto fail ;
784+ }
785+
786+ if (chklen != sizeof (chkval )) {
787+ fprintf (stderr , "size mismatch: set %zu got %d\n" , sizeof (val ),
788+ chklen );
789+ goto fail ;
790+ }
791+
792+ if (memcmp (& chkval , & val , sizeof (val )) != 0 ) {
793+ fprintf (stderr , "value mismatch: set %ld:%ld got %ld:%ld\n" ,
794+ val .tv_sec , val .tv_usec , chkval .tv_sec , chkval .tv_usec );
795+ goto fail ;
796+ }
797+ return ;
798+ fail :
799+ fprintf (stderr , "%s val %ld:%ld\n" , errmsg , val .tv_sec , val .tv_usec );
800+ exit (EXIT_FAILURE );
801+ }
802+
803+ void enable_so_zerocopy_check (int fd )
804+ {
805+ setsockopt_int_check (fd , SOL_SOCKET , SO_ZEROCOPY , 1 ,
806+ "setsockopt SO_ZEROCOPY" );
807+ }
0 commit comments