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