@@ -65,7 +65,7 @@ int need4 = 0;
6565int need6 = 0 ;
6666
6767size_t group_num = 0 ;
68- struct gr groups [ MAX_NUM_GROUPS ] ;
68+ TAILQ_HEAD ( tailhead , gr ) groups ;
6969
7070char iface [IFNAMSIZ ];
7171
@@ -85,17 +85,15 @@ static char spin(struct gr *g)
8585
8686void progress_show (int signo )
8787{
88+ struct gr * g ;
8889 char act = 0 ;
89- size_t i ;
9090
9191 (void )signo ;
9292
9393 if (!hastty )
9494 return ;
9595
96- for (i = 0 ; i < group_num ; i ++ ) {
97- struct gr * g = & groups [i ];
98-
96+ TAILQ_FOREACH (g , & groups , entry ) {
9997 if (g -> status [STATUS_POS ] != ' ' )
10098 act = g -> status [STATUS_POS ];
10199 }
@@ -106,11 +104,10 @@ void progress_show(int signo)
106104
107105static int sgwidth (void )
108106{
107+ struct gr * g ;
109108 int width = 0 ;
110- size_t i ;
111109
112- for (i = 0 ; i < group_num ; i ++ ) {
113- struct gr * g = & groups [i ];
110+ TAILQ_FOREACH (g , & groups , entry ) {
114111 int w ;
115112
116113 w = snprintf (NULL , 0 , "%s,%s" , g -> source ? g -> source : "*" , g -> group );
@@ -123,11 +120,12 @@ static int sgwidth(void)
123120
124121void plotter_show (int signo )
125122{
123+ struct gr * g ;
126124 char act = 0 ;
127125 int swidth ;
128126 int sgmax ;
129127 int spos ;
130- size_t i ;
128+ size_t i = 0 ;
131129
132130 (void )signo ;
133131 sgmax = sgwidth ();
@@ -143,11 +141,10 @@ void plotter_show(int signo)
143141 swidth = STATUS_HISTORY ;
144142 spos = STATUS_HISTORY - swidth ;
145143
146- for (i = 0 ; i < group_num ; i ++ ) {
147- struct gr * g = & groups [i ];
144+ TAILQ_FOREACH (g , & groups , entry ) {
148145 char sgbuf [35 ];
149146
150- gotoxy (0 , GROUP_ROW + i );
147+ gotoxy (0 , GROUP_ROW + i ++ );
151148 act = spin (g );
152149
153150 snprintf (sgbuf , sizeof (sgbuf ), "%s,%s" , g -> source ? g -> source : "*" , g -> group );
@@ -194,11 +191,12 @@ static char *ratef(size_t bps)
194191/* like plotter_show(), but with throughput numbers */
195192void plotbps_show (int signo )
196193{
194+ struct gr * g ;
197195 char act = 0 ;
198196 int swidth ;
199197 int sgmax ;
200198 int spos ;
201- size_t i ;
199+ size_t i = 0 ;
202200
203201 (void )signo ;
204202 sgmax = sgwidth ();
@@ -216,11 +214,10 @@ void plotbps_show(int signo)
216214 swidth = STATUS_HISTORY ;
217215 spos = STATUS_HISTORY - swidth ;
218216
219- for (i = 0 ; i < group_num ; i ++ ) {
220- struct gr * g = & groups [i ];
217+ TAILQ_FOREACH (g , & groups , entry ) {
221218 char sgbuf [35 ];
222219
223- gotoxy (0 , GROUP_ROW + i );
220+ gotoxy (0 , GROUP_ROW + i ++ );
224221 act = spin (g );
225222
226223 snprintf (sgbuf , sizeof (sgbuf ), "%s,%s" , g -> source ? g -> source : "*" , g -> group );
@@ -231,8 +228,9 @@ void plotbps_show(int signo)
231228
232229void stats_show (int signo )
233230{
231+ struct gr * g ;
234232 int sgmax ;
235- size_t i ;
233+ size_t i = 0 ;
236234 int w ;
237235
238236 (void )signo ;
@@ -248,11 +246,10 @@ void stats_show(int signo)
248246 sgmax , "Source,Group" , w , " " ,
249247 "Inv" , "Del" , "Gaps" , "Ordr" , "Dups" , "Bytes" , "Packets" );
250248
251- for (i = 0 ; i < group_num ; i ++ ) {
252- struct gr * g = & groups [i ];
249+ TAILQ_FOREACH (g , & groups , entry ) {
253250 char sgbuf [35 ];
254251
255- gotoxy (0 , GROUP_ROW + i );
252+ gotoxy (0 , GROUP_ROW + i ++ );
256253
257254 snprintf (sgbuf , sizeof (sgbuf ), "%s,%s" , g -> source ? g -> source : "*" , g -> group );
258255 fprintf (stderr , "\e[K%-*s%*s%4zu %4zu %4zu %4zu %4zu %7s %8zu" , sgmax , sgbuf ,
@@ -319,12 +316,12 @@ static char *uptime(time_t up)
319316
320317static void show_stats (void )
321318{
322- size_t i , total_count = 0 ;
319+ struct gr * g ;
320+ size_t total_count = 0 ;
323321 int len = 0 ;
324322 time_t now ;
325323
326- for (i = 0 ; i < group_num ; i ++ ) {
327- struct gr * g = & groups [i ];
324+ TAILQ_FOREACH (g , & groups , entry ) {
328325 char buf [35 ];
329326
330327 snprintf (buf , sizeof (buf ), "%s,%s" , g -> source ? g -> source : "*" , g -> group );
@@ -335,8 +332,7 @@ static void show_stats(void)
335332 /* Reset log in case of user scrolling to show stats */
336333 log_scroll (0 );
337334
338- for (i = 0 ; i < group_num ; i ++ ) {
339- struct gr * g = & groups [i ];
335+ TAILQ_FOREACH (g , & groups , entry ) {
340336 char buf [35 ];
341337
342338 snprintf (buf , sizeof (buf ), "%s,%s" , g -> source ? g -> source : "*" , g -> group );
@@ -563,17 +559,15 @@ static void key_cb(int sd, void *arg)
563559
564560static void scroll_cb (int period , void * arg )
565561{
566- size_t i ;
562+ struct gr * g ;
567563
568564 (void )period ;
569565 (void )arg ;
570566
571567 present (0 );
572568
573569 /* age all groups */
574- for (i = 0 ; i < group_num ; i ++ ) {
575- struct gr * g = & groups [i ];
576-
570+ TAILQ_FOREACH (g , & groups , entry ) {
577571 memmove (g -> status , & g -> status [1 ], STATUS_HISTORY - 1 );
578572 memmove (g -> seqnos , & g -> seqnos [1 ], (STATUS_HISTORY - 1 ) * sizeof (size_t ));
579573 g -> status [STATUS_POS ] = ' ' ;
@@ -613,13 +607,12 @@ static void clock_cb(int period, void *arg)
613607
614608static void rate_cb (int period , void * arg )
615609{
616- size_t i ;
610+ struct gr * g ;
617611
618612 period /= 1000000 ; /* /sec */
619613 (void )arg ;
620614
621- for (i = 0 ; i < group_num ; i ++ ) {
622- struct gr * g = & groups [i ];
615+ TAILQ_FOREACH (g , & groups , entry ) {
623616 size_t rate ;
624617
625618 rate = g -> bytes - g -> obytes ;
@@ -684,6 +677,7 @@ static char *progname(char *arg0)
684677int main (int argc , char * argv [])
685678{
686679 struct rlimit rlim ;
680+ struct gr * g ;
687681 int deadline = 0 ;
688682 int wait = 0 ;
689683 int i , c , rc ;
@@ -773,8 +767,17 @@ int main(int argc, char *argv[])
773767 }
774768 }
775769
776- if (optind == argc )
777- groups [group_num ++ ].group = strdup (DEFAULT_GROUP );
770+ TAILQ_INIT (& groups );
771+ if (optind == argc ) {
772+ struct gr * g = malloc (sizeof * g );
773+ if (g == NULL ) {
774+ printf ("malloc: %s" , strerror (errno ));
775+ _exit (1 );
776+ }
777+ g -> group = strdup (DEFAULT_GROUP );
778+ TAILQ_INSERT_TAIL (& groups , g , entry );
779+ group_num ++ ;
780+ }
778781
779782 if (!foreground ) {
780783 if (daemonize ()) {
@@ -837,12 +840,12 @@ int main(int argc, char *argv[])
837840 group = pos ;
838841 }
839842
840- if (num < 1 || ( num + group_num ) >= NELEMS ( groups ) ) {
841- ERROR ("Invalid number of groups given (%d), or max (%zd) reached ." , num , NELEMS ( groups ) );
843+ if (num < 1 ) {
844+ ERROR ("Invalid number of groups given (%d)." , num );
842845 return usage (1 );
843846 }
844847
845- for (j = 0 ; j < num && group_num < NELEMS ( groups ) ; j ++ ) {
848+ for (j = 0 ; j < num ; j ++ ) {
846849#ifdef AF_INET6
847850 struct sockaddr_in6 * sin6 ;
848851#endif
@@ -873,8 +876,14 @@ int main(int argc, char *argv[])
873876 }
874877
875878 DEBUG ("Adding (S,G) %s,%s to list ..." , source ?: "*" , group );
876- groups [group_num ].source = source ;
877- groups [group_num ++ ].group = strdup (group );
879+ if ((g = malloc (sizeof * g )) == NULL ) {
880+ printf ("malloc: %s" , strerror (errno ));
881+ _exit (1 );
882+ }
883+ g -> source = source ;
884+ g -> group = strdup (group );
885+ TAILQ_INSERT_TAIL (& groups , g , entry );
886+ group_num ++ ;
878887
879888 /* Next group ... */
880889#ifdef AF_INET6
@@ -899,57 +908,57 @@ int main(int argc, char *argv[])
899908 }
900909 }
901910
902- for ( i = 0 ; i < ( int ) group_num ; i ++ ) {
911+ TAILQ_FOREACH ( g , & groups , entry ) {
903912#ifdef AF_INET6
904- if (inet_ip6 (groups [ i ]. group )) {
905- struct sockaddr_in6 * grp = (struct sockaddr_in6 * )& groups [ i ]. grp ;
906- struct sockaddr_in6 * src = (struct sockaddr_in6 * )& groups [ i ]. src ;
913+ if (inet_ip6 (g -> group )) {
914+ struct sockaddr_in6 * grp = (struct sockaddr_in6 * )& g -> grp ;
915+ struct sockaddr_in6 * src = (struct sockaddr_in6 * )& g -> src ;
907916 char buf [INET_ADDRSTR_LEN + 1 ] = {0 };
908917 int t_port ;
909918
910- inet_pton_port (AF_INET6 , groups [ i ]. group , & grp -> sin6_addr , & t_port , port );
919+ inet_pton_port (AF_INET6 , g -> group , & grp -> sin6_addr , & t_port , port );
911920 grp -> sin6_family = AF_INET6 ;
912921 grp -> sin6_port = htons (t_port );
913922
914- if (groups [ i ]. source ) {
915- inet_pton_port (AF_INET6 , groups [ i ]. source , & src -> sin6_addr , & t_port , 0 );
923+ if (g -> source ) {
924+ inet_pton_port (AF_INET6 , g -> source , & src -> sin6_addr , & t_port , 0 );
916925 src -> sin6_family = AF_INET6 ;
917926 src -> sin6_port = htons (t_port );
918927 }
919928
920- DEBUG ("IP6: <%s> grp: %s:%u" , groups [ i ]. group , inet_ntop (AF_INET6 , & grp -> sin6_addr , buf , sizeof (buf )), ntohs (grp -> sin6_port ));
921- DEBUG ("IP6: <%s> src: %s:%u" , groups [ i ]. source ?groups [ i ]. source :"" , inet_ntop (AF_INET6 , & src -> sin6_addr , buf , sizeof (buf )), ntohs (src -> sin6_port ));
929+ DEBUG ("IP6: <%s> grp: %s:%u" , g -> group , inet_ntop (AF_INET6 , & grp -> sin6_addr , buf , sizeof (buf )), ntohs (grp -> sin6_port ));
930+ DEBUG ("IP6: <%s> src: %s:%u" , g -> source ?g -> source :"" , inet_ntop (AF_INET6 , & src -> sin6_addr , buf , sizeof (buf )), ntohs (src -> sin6_port ));
922931 need6 ++ ;
923932 } else
924933#endif
925934 {
926- struct sockaddr_in * grp = (struct sockaddr_in * )& groups [ i ]. grp ;
927- struct sockaddr_in * src = (struct sockaddr_in * )& groups [ i ]. src ;
935+ struct sockaddr_in * grp = (struct sockaddr_in * )& g -> grp ;
936+ struct sockaddr_in * src = (struct sockaddr_in * )& g -> src ;
928937 char buf [INET_ADDRSTR_LEN + 1 ] = {0 };
929938 int t_port ;
930939
931- inet_pton_port (AF_INET , groups [ i ]. group , & grp -> sin_addr , & t_port , port );
940+ inet_pton_port (AF_INET , g -> group , & grp -> sin_addr , & t_port , port );
932941 grp -> sin_family = AF_INET ;
933942 grp -> sin_port = htons (t_port );
934943
935- if (groups [ i ]. source ) {
936- inet_pton_port (AF_INET , groups [ i ]. source , & src -> sin_addr , & t_port , 0 );
944+ if (g -> source ) {
945+ inet_pton_port (AF_INET , g -> source , & src -> sin_addr , & t_port , 0 );
937946 src -> sin_family = AF_INET ;
938947 src -> sin_port = htons (t_port );
939948 }
940949
941- DEBUG ("IP4: <%s> grp: %s:%u" , groups [ i ]. group , inet_ntop (AF_INET , & grp -> sin_addr , buf , sizeof (buf )), ntohs (grp -> sin_port ));
942- DEBUG ("IP4: <%s> src: %s:%u" , groups [ i ]. source ?groups [ i ]. source :"" , inet_ntop (AF_INET , & src -> sin_addr , buf , sizeof (buf )), ntohs (src -> sin_port ));
950+ DEBUG ("IP4: <%s> grp: %s:%u" , g -> group , inet_ntop (AF_INET , & grp -> sin_addr , buf , sizeof (buf )), ntohs (grp -> sin_port ));
951+ DEBUG ("IP4: <%s> src: %s:%u" , g -> source ?g -> source :"" , inet_ntop (AF_INET , & src -> sin_addr , buf , sizeof (buf )), ntohs (src -> sin_port ));
943952 need4 ++ ;
944953 }
945954#ifdef HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN
946- groups [ i ]. grp .ss_len = inet_addrlen (& groups [ i ]. grp );
947- if (groups [ i ]. source )
948- groups [ i ]. src .ss_len = inet_addrlen (& groups [ i ]. src );
955+ g -> grp .ss_len = inet_addrlen (& g -> grp );
956+ if (g -> source )
957+ g -> src .ss_len = inet_addrlen (& g -> src );
949958#endif
950959
951- memset (groups [ i ]. status , ' ' , STATUS_HISTORY - 1 );
952- groups [ i ]. spin = groups [ i ]. group [strlen (groups [ i ]. group ) - 1 ];
960+ memset (g -> status , ' ' , STATUS_HISTORY - 1 );
961+ g -> spin = g -> group [strlen (g -> group ) - 1 ];
953962 }
954963
955964 pev_init ();
0 commit comments