1 #include "common.h"
2 #include "datacache.h"
3
datacache_add(datacache ** dc,const char * interface,const short sync)4 int datacache_add(datacache **dc, const char *interface, const short sync)
5 {
6 datacache *newdc;
7
8 newdc = malloc(sizeof(datacache));
9 if (newdc == NULL) {
10 return 0;
11 }
12 newdc->next = *dc;
13 *dc = newdc;
14
15 strncpy_nt((*dc)->interface, interface, 32);
16 (*dc)->active = 1;
17 (*dc)->filled = 0;
18 (*dc)->syncneeded = sync;
19 (*dc)->currx = 0;
20 (*dc)->curtx = 0;
21 (*dc)->updated = time(NULL);
22 (*dc)->log = NULL;
23
24 return 1;
25 }
26
datacache_remove(datacache ** dc,const char * interface)27 int datacache_remove(datacache **dc, const char *interface)
28 {
29 int ret = 0;
30 datacache *dc_prev, *dc_head;
31
32 dc_head = *dc;
33 dc_prev = *dc;
34
35 if (*dc == NULL) {
36 return ret;
37 }
38
39 /* handle list head remove */
40 if (strcmp((*dc)->interface, interface) == 0) {
41 *dc = (*dc)->next;
42 xferlog_clear(&dc_prev->log);
43 free(dc_prev);
44 return 1;
45 }
46
47 *dc = (*dc)->next;
48
49 /* handle other locations */
50 while (*dc != NULL) {
51 if (strcmp((*dc)->interface, interface) == 0) {
52 dc_prev->next = (*dc)->next;
53 xferlog_clear(&(*dc)->log);
54 free(*dc);
55 ret = 1;
56 break;
57 }
58 dc_prev = *dc;
59 *dc = (*dc)->next;
60 }
61
62 *dc = dc_head;
63 return ret;
64 }
65
datacache_clear(datacache ** dc)66 void datacache_clear(datacache **dc)
67 {
68 datacache *dc_prev;
69
70 while (*dc != NULL) {
71 dc_prev = *dc;
72 *dc = (*dc)->next;
73 xferlog_clear(&dc_prev->log);
74 free(dc_prev);
75 }
76 }
77
datacache_count(datacache ** dc)78 int datacache_count(datacache **dc)
79 {
80 int count = 0;
81 datacache *cacheiterator = *dc;
82
83 while (cacheiterator != NULL) {
84 count++;
85 cacheiterator = cacheiterator->next;
86 }
87 return count;
88 }
89
datacache_activecount(datacache ** dc)90 int datacache_activecount(datacache **dc)
91 {
92 int count = 0;
93 datacache *cacheiterator = *dc;
94
95 while (cacheiterator != NULL) {
96 if (cacheiterator->active) {
97 count++;
98 }
99 cacheiterator = cacheiterator->next;
100 }
101 return count;
102 }
103
datacache_debug(datacache ** dc)104 void datacache_debug(datacache **dc)
105 {
106 int i = 1;
107 datacache *cacheiterator = *dc;
108
109 if (cacheiterator == NULL) {
110 printf("cache: empty\n");
111 return;
112 }
113
114 printf("cache: ");
115 while (cacheiterator != NULL) {
116 printf(" %d: \"%s\" (", i, cacheiterator->interface);
117 xferlog_debug(&cacheiterator->log, 0);
118 printf(") ");
119 cacheiterator = cacheiterator->next;
120 i++;
121 }
122 printf("\n");
123 }
124
xferlog_add(xferlog ** log,const time_t timestamp,const uint64_t rx,const uint64_t tx)125 int xferlog_add(xferlog **log, const time_t timestamp, const uint64_t rx, const uint64_t tx)
126 {
127 xferlog *newlog;
128
129 if (*log == NULL || (*log)->timestamp != timestamp) {
130 newlog = malloc(sizeof(xferlog));
131 if (newlog == NULL) {
132 return 0;
133 }
134 newlog->next = *log;
135 *log = newlog;
136
137 newlog->timestamp = timestamp;
138 newlog->rx = 0;
139 newlog->tx = 0;
140 }
141
142 (*log)->rx += rx;
143 (*log)->tx += tx;
144
145 return 1;
146 }
147
xferlog_clear(xferlog ** log)148 void xferlog_clear(xferlog **log)
149 {
150 xferlog *log_prev;
151
152 while (*log != NULL) {
153 log_prev = *log;
154 *log = (*log)->next;
155 free(log_prev);
156 }
157 }
158
xferlog_debug(xferlog ** log,const int newline)159 void xferlog_debug(xferlog **log, const int newline)
160 {
161 int i = 1;
162 xferlog *logiterator = *log;
163
164 if (newline && logiterator == NULL) {
165 printf(" xferlog: empty\n");
166 return;
167 }
168
169 if (newline) {
170 printf(" xferlog: ");
171 }
172 while (logiterator != NULL) {
173 printf("%d: %" PRIu64 " - %" PRIu64 " / %" PRIu64 "", i, (uint64_t)logiterator->timestamp, logiterator->rx, logiterator->tx);
174 if (logiterator->next != NULL) {
175 printf(", ");
176 }
177 logiterator = logiterator->next;
178 i++;
179 }
180 if (newline) {
181 printf("\n");
182 }
183 }
184