Skip to content

Commit 3200646

Browse files
authored
Merge pull request #38 from younix/tailq
Use TAILQ macro instead of static array Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2 parents afeea77 + 36f5e5c commit 3200646

File tree

4 files changed

+84
-74
lines changed

4 files changed

+84
-74
lines changed

src/mcjoin.c

Lines changed: 69 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ int need4 = 0;
6565
int need6 = 0;
6666

6767
size_t group_num = 0;
68-
struct gr groups[MAX_NUM_GROUPS];
68+
TAILQ_HEAD(tailhead, gr) groups;
6969

7070
char iface[IFNAMSIZ];
7171

@@ -85,17 +85,15 @@ static char spin(struct gr *g)
8585

8686
void 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

107105
static 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

124121
void 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 */
195192
void 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

232229
void 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

320317
static 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

564560
static 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

614608
static 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)
684677
int 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();

src/mcjoin.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#ifndef MCJOIN_H_
1818
#define MCJOIN_H_
1919

20+
#include <sys/queue.h>
21+
2022
#include "config.h"
2123
#include "addr.h"
2224
#include "log.h"
@@ -67,6 +69,7 @@ struct gr {
6769
size_t seqnos[STATUS_HISTORY]; /* for dup detection */
6870
char status[STATUS_HISTORY];
6971
size_t spin;
72+
TAILQ_ENTRY(gr) entry;
7073
};
7174

7275
extern int help;
@@ -87,7 +90,6 @@ extern size_t count;
8790
extern unsigned char ttl;
8891

8992
extern size_t group_num;
90-
extern struct gr groups[];
9193

9294
extern void plotter_show(int signo);
9395

0 commit comments

Comments
 (0)