]> git.pld-linux.org Git - packages/apinger.git/blame - apinger-srcip.patch
- cosmetics
[packages/apinger.git] / apinger-srcip.patch
CommitLineData
c3818ac3
MK
1diff -ur apinger-0.6.1.orig//src/apinger.c apinger-0.6.1/src/apinger.c
2--- apinger-0.6.1.orig//src/apinger.c 2012-07-25 17:46:59.421182293 +0000
3+++ apinger-0.6.1/src/apinger.c 2012-07-25 17:44:41.642064536 +0000
972c05fb
MK
4@@ -162,6 +162,9 @@
5 case 't':
6 values[n]=t->name;
7 break;
8+ case 'i':
9+ values[n]=t->config->srcip;
10+ break;
11 case 'T':
12 values[n]=t->description;
13 break;
14@@ -277,6 +280,7 @@
23868a1a
MK
15 else
16 fprintf(f,"alarm canceled: %s\n",a->name);
a561f599 17 fprintf(f,"Target: %s\n",t->name);
23868a1a 18+ fprintf(f,"Source IP: %s\n",t->config->srcip);
a561f599 19 fprintf(f,"Description: %s\n",t->description);
23868a1a
MK
20 fprintf(f,"Probes sent: %i\n",t->last_sent+1);
21 fprintf(f,"Replies received: %i\n",t->received);
972c05fb 22@@ -646,7 +650,7 @@
c3818ac3
MK
23 struct target *t,*pt,*nt;
24 struct target_cfg *tc;
25 struct active_alarm_list *al,*nal;
26-union addr addr;
27+union addr addr, srcaddr;
28 int r;
29 int l;
30
972c05fb 31@@ -666,6 +670,8 @@
c3818ac3
MK
32 nal=al->next;
33 free(al);
34 }
35+ if (t->socket)
36+ close(t->socket);
37 free(t->queue);
38 free(t->rbuf);
39 free(t->name);
972c05fb 40@@ -684,11 +690,6 @@
c3818ac3
MK
41 memset(&addr,0,sizeof(addr));
42 r=inet_pton(AF_INET,tc->name,&addr.addr4.sin_addr);
43 if (r){
44- if (icmp_sock<0){
45- logit("Sorry, IPv4 is not available\n");
46- logit("Ignoring target %s\n",tc->name);
47- continue;
48- }
49 addr.addr.sa_family=AF_INET;
50 }else{
51 #ifdef HAVE_IPV6
972c05fb 52@@ -708,12 +709,38 @@
c3818ac3
MK
53 addr.addr.sa_family=AF_INET6;
54 #endif
55 }
56+ memset(&srcaddr,0,sizeof(srcaddr));
57+ debug("Converting srcip %s", tc->srcip);
58+ r=inet_pton(AF_INET,tc->srcip,&srcaddr.addr4.sin_addr);
59+ if (r){
60+ srcaddr.addr.sa_family=AF_INET;
61+ }else{
62+#ifdef HAVE_IPV6
63+ r=inet_pton(AF_INET6,tc->srcip,&srcaddr.addr6.sin6_addr);
64+ if (r==0){
65+#endif
66+ logit("Bad srcip address %s for target %s\n", tc->srcip, tc->name);
67+ logit("Ignoring target %s\n",tc->name);
68+ continue;
69+#ifdef HAVE_IPV6
70+ }
71+ if (icmp6_sock<0){
72+ logit("Sorry, IPv6 is not available\n");
73+ logit("Ignoring target %s\n",tc->name);
74+ continue;
75+ }
76+ srcaddr.addr.sa_family=AF_INET6;
77+#endif
78+ }
79 t=NEW(struct target,1);
80 memset(t,0,sizeof(struct target));
81 t->name=strdup(tc->name);
82 t->description=strdup(tc->description);
83 t->addr=addr;
84+ t->ifaddr=srcaddr;
85 t->next=targets;
86+ if(t->addr.addr.sa_family==AF_INET) make_icmp_socket(t);
87+ if(t->addr.addr.sa_family==AF_INET6) make_icmp6_socket(t);
88 targets=t;
89 }
90 t->config=tc;
972c05fb 91@@ -733,6 +760,7 @@
c3818ac3
MK
92 assert(t->rbuf!=NULL);
93 memset(t->rbuf,0,l);
94 }
95+
96 if (targets==NULL){
97 logit("No usable targets found, exiting");
98 exit(1);
972c05fb 99@@ -753,6 +781,8 @@
c3818ac3
MK
100 nal=al->next;
101 free(al);
102 }
103+ if (t->socket)
104+ close(t->socket);
105 free(t->queue);
106 free(t->rbuf);
107 free(t->name);
972c05fb 108@@ -800,6 +830,7 @@
23868a1a
MK
109 fprintf(f,"%s\n",ctime(&tm));
110 for(t=targets;t;t=t->next){
a561f599 111 fprintf(f,"Target: %s\n",t->name);
23868a1a 112+ fprintf(f,"Source IP: %s\n",t->config->srcip);
a561f599 113 fprintf(f,"Description: %s\n",t->description);
23868a1a
MK
114 fprintf(f,"Last reply received: #%i %s",t->last_received,
115 ctime(&t->last_received_tv.tv_sec));
972c05fb 116@@ -865,7 +896,7 @@
c3818ac3
MK
117 void main_loop(void){
118 struct target *t;
119 struct timeval cur_time,next_status={0,0},tv,next_report={0,0},next_rrd_update={0,0};
120-struct pollfd pfd[2];
121+struct pollfd pfd[1024];
122 int timeout;
123 int npfd=0;
124 int i;
972c05fb 125@@ -876,16 +907,8 @@
c3818ac3
MK
126 struct alarm_cfg *a;
127
128 configure_targets();
129- if (icmp_sock){
130- pfd[npfd].events=POLLIN|POLLERR|POLLHUP|POLLNVAL;
131- pfd[npfd].revents=0;
132- pfd[npfd++].fd=icmp_sock;
133- }
134- if (icmp6_sock){
135- pfd[npfd].events=POLLIN|POLLERR|POLLHUP|POLLNVAL;
136- pfd[npfd++].fd=icmp6_sock;
137- pfd[npfd].revents=0;
138- }
139+ memset(&pfd, '\0', sizeof pfd);
140+
141 if (config->status_interval){
142 gettimeofday(&cur_time,NULL);
143 tv.tv_sec=config->status_interval/1000;
972c05fb 144@@ -893,10 +916,16 @@
c3818ac3
MK
145 timeradd(&cur_time,&tv,&next_status);
146 }
147 while(!interrupted_by){
148+ npfd = 0;
149 gettimeofday(&cur_time,NULL);
150 if ( !timercmp(&next_probe,&cur_time,>) )
151 timerclear(&next_probe);
152 for(t=targets;t;t=t->next){
153+ if (t->socket){
154+ pfd[npfd].events=POLLIN|POLLERR|POLLHUP|POLLNVAL;
155+ pfd[npfd].revents=0;
156+ pfd[npfd++].fd=t->socket;
157+ }
158 for(al=t->config->alarms;al;al=nal){
159 a=al->alarm;
160 nal=al->next;
972c05fb 161@@ -972,8 +1001,20 @@
c3818ac3
MK
162 poll(pfd,npfd,timeout);
163 for(i=0;i<npfd;i++){
164 if (!pfd[i].revents&POLLIN) continue;
165- if (pfd[i].fd==icmp_sock) recv_icmp();
166- else if (pfd[i].fd==icmp6_sock) recv_icmp6();
167+ for(t=targets;t;t=t->next){
168+ if (t->addr.addr.sa_family==AF_INET) {
169+ if (t->socket == pfd[i].fd) {
170+ recv_icmp(t);
171+ break;
172+ }
173+ }
174+ if (t->addr.addr.sa_family==AF_INET6) {
175+ if (t->socket == pfd[i].fd) {
176+ recv_icmp6(t);
177+ break;
178+ }
179+ }
180+ }
181 pfd[i].revents=0;
182 }
183 if (status_request){
972c05fb
MK
184diff -ur apinger-0.6.1.orig//src/apinger.conf apinger-0.6.1/src/apinger.conf
185--- apinger-0.6.1.orig//src/apinger.conf 2012-07-26 11:14:05.000000000 +0000
186+++ apinger-0.6.1/src/apinger.conf 2012-07-26 11:21:50.624064932 +0000
187@@ -48,6 +48,7 @@
188
189 ## Following "macros" may be used in options below:
190 ## %t - target name (address)
67a10869 191+ ## %i - source name (address)
972c05fb
MK
192 ## %T - target description
193 ## %a - alarm name
194 ## %A - alarm type ("down"/"loss"/"delay")
c3818ac3
MK
195diff -ur apinger-0.6.1.orig//src/apinger.h apinger-0.6.1/src/apinger.h
196--- apinger-0.6.1.orig//src/apinger.h 2012-07-25 17:46:59.422189729 +0000
197+++ apinger-0.6.1/src/apinger.h 2012-07-25 17:44:41.642064536 +0000
198@@ -47,6 +47,8 @@
199 #endif
200 #include "conf.h"
201
202+#include <ifaddrs.h>
203+
204 union addr {
205 struct sockaddr addr;
206 struct sockaddr_in addr4;
207@@ -67,10 +69,11 @@
208 char *description; /* description */
209
210 union addr addr; /* target address */
211-
212+
213 char *queue; /*
214 contains info about recently sent packets
215 "1" means it was received */
216+ int socket;
217 int last_sent; /* sequence number of the last ping sent */
218 int last_received; /* sequence number of the last ping received */
219 struct timeval last_received_tv; /* timestamp of the last ping received */
220@@ -90,6 +93,7 @@
221 struct target_cfg *config;
222
223 struct target *next;
224+ union addr ifaddr; /* iface address */
225 };
226
227 #define AVG_DELAY_KNOWN(t) (t->upsent >= t->config->avg_delay_samples)
228@@ -111,16 +115,16 @@
229
230 extern int icmp_sock;
231 extern int icmp6_sock;
232-extern int ident;
233+extern uint16_t ident;
234
235 extern struct timeval next_probe;
236
237-int make_icmp_socket(void);
238-void recv_icmp(void);
239+int make_icmp_socket(struct target *t);
240+void recv_icmp(struct target *t);
241 void send_icmp_probe(struct target *t,int seq);
242
243-int make_icmp6_socket(void);
244-void recv_icmp6(void);
245+int make_icmp6_socket(struct target *t);
246+void recv_icmp6(struct target *t);
247 void send_icmp6_probe(struct target *t,int seq);
248
249 void analyze_reply(struct timeval time_recv,int seq,struct trace_info *ti);
250diff -ur apinger-0.6.1.orig//src/cfgparser1.y apinger-0.6.1/src/cfgparser1.y
251--- apinger-0.6.1.orig//src/cfgparser1.y 2003-03-26 11:27:47.000000000 +0000
252+++ apinger-0.6.1/src/cfgparser1.y 2012-07-25 17:44:41.643063909 +0000
253@@ -97,6 +97,7 @@
254 %token DELAY_HIGH
255
256 %token DESCRIPTION
257+%token SRCIP
258 %token ALARMS
259 %token INTERVAL
260 %token AVG_DELAY_SAMPLES
261@@ -248,6 +249,8 @@
262 targetcfg: /* */
263 | DESCRIPTION string
264 { cur_target->description=$2; }
265+ | SRCIP string
266+ { cur_target->srcip = $2; }
267 | ALARMS alarmlist
268 { cur_target->alarms=$2; }
269 | ALARMS OVERRIDE alarmlist
270diff -ur apinger-0.6.1.orig//src/cfgparser2.l apinger-0.6.1/src/cfgparser2.l
271--- apinger-0.6.1.orig//src/cfgparser2.l 2003-03-26 11:27:47.000000000 +0000
272+++ apinger-0.6.1/src/cfgparser2.l 2012-07-25 17:44:41.643063909 +0000
273@@ -82,6 +82,7 @@
274 delay_high { LOC; LOCINC; return DELAY_HIGH; }
275 delay_low { LOC; LOCINC; return DELAY_LOW; }
276 description { LOC; LOCINC; return DESCRIPTION; }
277+srcip { LOC; LOCINC; return SRCIP; }
278 down { LOC; LOCINC; return DOWN; }
279 false { LOC; LOCINC; return FALSE; }
280 file { LOC; LOCINC; return FILE_; }
281diff -ur apinger-0.6.1.orig//src/conf.h apinger-0.6.1/src/conf.h
282--- apinger-0.6.1.orig//src/conf.h 2003-03-26 11:27:47.000000000 +0000
283+++ apinger-0.6.1/src/conf.h 2012-07-25 17:44:41.643063909 +0000
284@@ -72,6 +72,7 @@
285 struct target_cfg {
286 char *name;
287 char *description;
288+ char *srcip;
289 int interval;
290 int avg_delay_samples;
291 int avg_loss_delay_samples;
292diff -ur apinger-0.6.1.orig//src/icmp.c apinger-0.6.1/src/icmp.c
293--- apinger-0.6.1.orig//src/icmp.c 2012-07-25 17:46:59.422189729 +0000
294+++ apinger-0.6.1/src/icmp.c 2012-07-25 17:44:41.644063862 +0000
295@@ -151,14 +151,14 @@
296 size=sizeof(*p)+sizeof(ti);
297
298 p->icmp_cksum = in_cksum((u_short *)p,size,0);
299- ret=sendto(icmp_sock,p,size,MSG_DONTWAIT,
300+ ret=sendto(t->socket,p,size,MSG_DONTWAIT,
301 (struct sockaddr *)&t->addr.addr4,sizeof(t->addr.addr4));
302 if (ret<0){
303 if (config->debug) myperror("sendto");
304 }
305 }
306
307-void recv_icmp(void){
308+void recv_icmp(struct target *t){
309 int len,hlen,icmplen,datalen;
310 char buf[1024];
311 struct sockaddr_in from;
312@@ -171,6 +171,7 @@
313 struct iovec iov;
314 struct msghdr msg;
315 struct cmsghdr *c;
316+reloophack:
317
318 iov.iov_base=buf;
319 iov.iov_len=1000;
320@@ -180,12 +181,13 @@
321 msg.msg_iovlen=1;
322 msg.msg_control=ans_data;
323 msg.msg_controllen=sizeof(ans_data);
324- len=recvmsg(icmp_sock, &msg, MSG_DONTWAIT);
325+ len=recvmsg(t->socket, &msg, MSG_DONTWAIT);
326 #else
327 socklen_t sl;
328+reloophack:
329
330 sl=sizeof(from);
331- len=recvfrom(icmp_sock,buf,1024,MSG_DONTWAIT,(struct sockaddr *)&from,&sl);
332+ len=recvfrom(t->socket,buf,1024,MSG_DONTWAIT,(struct sockaddr *)&from,&sl);
333 #endif
334 if (len<0){
335 if (errno==EAGAIN) return;
336@@ -197,7 +199,7 @@
337 debug("checking CMSG...");
338 for (c = CMSG_FIRSTHDR(&msg); c; c = CMSG_NXTHDR(&msg, c)) {
339 debug("CMSG level: %i type: %i",c->cmsg_level,c->cmsg_type);
340- if (c->cmsg_level != SOL_SOCKET || c->cmsg_type != SO_TIMESTAMP)
341+ if (c->cmsg_level != SOL_SOCKET || c->cmsg_type != SCM_TIMESTAMP)
342 continue;
343 if (c->cmsg_len < CMSG_LEN(sizeof(struct timeval)))
344 continue;
345@@ -207,7 +209,7 @@
346 #endif
347 if (time_recvp==NULL){
348 #ifdef SIOCGSTAMP
349- if (!ioctl(icmp_sock, SIOCGSTAMP, &time_recv)){
350+ if (!ioctl(t->socket, SIOCGSTAMP, &time_recv)){
351 debug("Got timestampt from ioctl()");
352 }else
353 #endif
354@@ -227,7 +229,8 @@
355 return;
356 }
357 if (icmp->icmp_id != ident){
358- debug("Alien echo-reply received");
359+ debug("Alien echo-reply received from %s. Expected %i, received %i",inet_ntoa(from.sin_addr), ident, icmp->icmp_id);
360+ goto reloophack;
361 return;
362 }
363 debug("Ping reply from %s",inet_ntoa(from.sin_addr));
364@@ -239,19 +242,23 @@
365 analyze_reply(*time_recvp,icmp->icmp_seq,(struct trace_info*)(icmp+1));
366 }
367
368-int make_icmp_socket(void){
369+int make_icmp_socket(struct target *t){
370 int on;
371
372- icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
373- if (icmp_sock<0)
374+ t->socket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
375+ if (t->socket < 0)
376 myperror("socket");
377 #ifdef SO_TIMESTAMP
378- else{
379+ else {
380 on=1;
381- if (setsockopt(icmp_sock, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on)))
382+ if (setsockopt(t->socket, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on)))
383 myperror("setsockopt(SO_TIMESTAMP)");
384 }
385 #endif
386- return icmp_sock;
387+
388+ if (bind(t->socket, (struct sockaddr *)&t->ifaddr.addr4, sizeof(t->ifaddr.addr4)) < 0)
389+ myperror("bind socket");
390+
391+ return t->socket;
392 }
393
394diff -ur apinger-0.6.1.orig//src/icmp6.c apinger-0.6.1/src/icmp6.c
395--- apinger-0.6.1.orig//src/icmp6.c 2012-07-25 17:46:59.422189729 +0000
396+++ apinger-0.6.1/src/icmp6.c 2012-07-25 17:44:41.644063862 +0000
397@@ -113,14 +113,14 @@
398 memcpy(p+1,&ti,sizeof(ti));
399 size=sizeof(*p)+sizeof(ti);
400
401- ret=sendto(icmp6_sock,p,size,MSG_DONTWAIT,
402+ ret=sendto(t->socket,p,size,MSG_DONTWAIT,
403 (struct sockaddr *)&t->addr.addr6,sizeof(t->addr.addr6));
404 if (ret<0){
405 if (config->debug) myperror("sendto");
406 }
407 }
408
409-void recv_icmp6(void){
410+void recv_icmp6(struct target *t){
411 int len,icmplen,datalen;
412 char buf[1024];
413 char abuf[100];
414@@ -134,6 +134,7 @@
415 struct iovec iov;
416 struct msghdr msg;
417 struct cmsghdr *c;
418+reloophack6:
419
420 iov.iov_base=buf;
421 iov.iov_len=1000;
422@@ -143,12 +144,13 @@
423 msg.msg_iovlen=1;
424 msg.msg_control=ans_data;
425 msg.msg_controllen=sizeof(ans_data);
426- len=recvmsg(icmp6_sock, &msg, MSG_DONTWAIT);
427+ len=recvmsg(t->socket, &msg, MSG_DONTWAIT);
428 #else
429 socklen_t sl;
430+reloophack6:
431
432 sl=sizeof(from);
433- len=recvfrom(icmp6_sock,buf,1024,0,(struct sockaddr *)&from,&sl);
434+ len=recvfrom(t->socket,buf,1024,0,(struct sockaddr *)&from,&sl);
435 #endif
436 if (len<0){
437 if (errno==EAGAIN) return;
438@@ -170,7 +172,7 @@
439 #endif
440 if (time_recvp==NULL){
441 #ifdef SIOCGSTAMP
442- if (!ioctl(icmp6_sock, SIOCGSTAMP, &time_recv)){
443+ if (!ioctl(t->socket, SIOCGSTAMP, &time_recv)){
444 debug("Got timestamp from ioctl()");
445 }else
446 #endif
447@@ -183,8 +185,11 @@
448 icmplen=len;
449 icmp=(struct icmp6_hdr *)buf;
450 if (icmp->icmp6_type != ICMP6_ECHO_REPLY) return;
451- if (icmp->icmp6_id != ident) return;
452-
453+ if (icmp->icmp6_id != ident){
454+ debug("Alien echo-reply received from xxx. Expected %i, received %i", ident, icmp->icmp6_id);
455+ goto reloophack6;
456+ return;
457+ }
458 name=inet_ntop(AF_INET6,&from.sin6_addr,abuf,100);
459 debug("Ping reply from %s",name);
460 datalen=icmplen-sizeof(*icmp);
461@@ -196,33 +201,36 @@
462 }
463
464
465-int make_icmp6_socket(void){
466+int make_icmp6_socket(struct target *t){
467 int opt;
468
469- icmp6_sock = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
470- if (icmp6_sock<0)
471+ t->socket = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
472+ if (t->socket <0)
473 myperror("socket");
474 else {
475 opt=2;
476 #if defined(SOL_RAW) && defined(IPV6_CHECKSUM)
477- if (setsockopt(icmp6_sock, SOL_RAW, IPV6_CHECKSUM, &opt, sizeof(int)))
478+ if (setsockopt(t->socket, SOL_RAW, IPV6_CHECKSUM, &opt, sizeof(int)))
479 myperror("setsockopt(IPV6_CHECKSUM)");
480 #endif
481 #ifdef SO_TIMESTAMP
482 opt=1;
483- if (setsockopt(icmp6_sock, SOL_SOCKET, SO_TIMESTAMP, &opt, sizeof(opt)))
484+ if (setsockopt(t->socket, SOL_SOCKET, SO_TIMESTAMP, &opt, sizeof(opt)))
485 myperror("setsockopt(SO_TIMESTAMP)");
486 #endif
487 /*install_filter6();*/
488 }
489- return icmp6_sock;
490+ if (bind(t->socket, (struct sockaddr *)&t->ifaddr.addr6, sizeof(t->ifaddr.addr6)) < 0)
491+ myperror("bind socket");
492+
493+ return t->socket;
494 }
495
496 #else /*HAVE_IPV6*/
497 #include "apinger.h"
498
499-int make_icmp6_socket(void){ return -1; }
500-void recv_icmp6(void){}
501+int make_icmp6_socket(struct target *t){ return -1; }
502+void recv_icmp6(struct target *t){}
503 void send_icmp6_probe(struct target *t,int seq){}
504
505 #endif /*HAVE_IPV6*/
506diff -ur apinger-0.6.1.orig//src/main.c apinger-0.6.1/src/main.c
507--- apinger-0.6.1.orig//src/main.c 2012-07-25 17:46:59.423189376 +0000
508+++ apinger-0.6.1/src/main.c 2012-07-25 17:49:53.167255387 +0000
509@@ -72,6 +72,7 @@
510 { /* target defaults */
511 "default", /* name */
512 "", /* description */
513+ "", /* interface */
514 1000, /* interval */
515 20, /* avg_delay_samples */
516 5, /* avg_loss_delay_samples */
517@@ -96,7 +97,7 @@
518
519 int icmp_sock;
520 int icmp6_sock;
521-int ident;
522+uint16_t ident;
523
524 struct timeval next_probe={0,0};
525
526@@ -204,12 +205,6 @@
527 }
528 }
529
530- make_icmp_socket();
531- make_icmp6_socket();
532- if (icmp6_sock<0 && icmp_sock<0){
533- return 1;
534- }
535-
536 pw=getpwnam(config->user);
537 if (!pw) {
538 debug("getpwnam(\"%s\") failed.",config->user);
539@@ -264,15 +259,15 @@
540 return 1;
541 }
542
543- ident=getpid();
544+ ident=getpid() & 0xFFFF;
545 signal(SIGTERM,signal_handler);
546 signal(SIGINT,signal_handler);
547 signal(SIGHUP,signal_handler);
548 signal(SIGUSR1,signal_handler);
549 signal(SIGPIPE,signal_handler);
550+ logit("Starting Alarm Pinger, apinger(%i)", ident);
551+
552 main_loop();
553- if (icmp_sock>=0) close(icmp_sock);
554- if (icmp6_sock>=0) close(icmp6_sock);
555
556 logit("Exiting on signal %i.",interrupted_by);
557
This page took 0.262935 seconds and 4 git commands to generate.