Browse code

ロングオプションに対応 iオプション追加

Masanobu Yasui authored on 2012/08/21 05:39:44
Showing 4 changed files
... ...
@@ -1,3 +1,7 @@
1
+1.3.3:
2
+ - fix: hangup when large amount of traffic.
3
+ - add i option (multicast interface address)
4
+
1 5
 1.3.2:
2 6
  - fix: infinite loop during shutdown when use c option.
3 7
 
... ...
@@ -1,5 +1,7 @@
1 1
 1.3.3:
2 2
  - 通信量が多い時に刺さることがある不具合を修正
3
+ - iオプションを追加
4
+   マルチキャストで利用するインターフェイスアドレスを指定できるようにした
3 5
 
4 6
 1.3.2:
5 7
  - cオプション使用時に終了できなくなる場合がある不具合を修正
... ...
@@ -284,6 +284,7 @@ typedef struct
284 284
   int sendrate;
285 285
   struct utsname uts;  
286 286
   struct sockaddr_in maddr;
287
+  struct sockaddr_in iaddr;
287 288
   struct sockaddr_in laddr;
288 289
   struct sockaddr_un uaddr;
289 290
   char base_dir[PATH_MAX];
... ...
@@ -14,28 +14,30 @@ static void usage()
14 14
   version_print();
15 15
   printf("(Multicasts All-Kinds of Updating Operation for Servers on Administered Network)\n\n");
16 16
   printf("usage: makuosan [OPTION]\n");
17
-  printf("  -d num   # loglevel(0-9)\n");
18
-  printf("  -u uid   # user\n");
19
-  printf("  -g gid   # group\n");
20
-  printf("  -G gid,..# groups\n");
21
-  printf("  -b dir   # base dir\n");
22
-  printf("  -p port  # port number       (default: 5000)\n");
23
-  printf("  -m addr  # multicast address (default: 224.0.0.108)\n");
24
-  printf("  -l addr  # listen address    (default: 127.0.0.1)\n");
25
-  printf("  -U path  # unix domain socket\n");
26
-  printf("  -k file  # key file (encrypt password)\n");
27
-  printf("  -K file  # key file (console password)\n");
28
-  printf("  -f num   # parallel send count(default: 5) \n");
29
-  printf("  -R num   # recv buffer size [bytes]\n");
30
-  printf("  -S num   # send buffer size [bytes]\n");
31
-  printf("  -T num   # traffic rate     [Mbps]\n");
32
-  printf("  -c       # chroot to base dir\n");
33
-  printf("  -n       # don't fork\n");
34
-  printf("  -r       # don't recv\n");
35
-  printf("  -s       # don't send\n");
36
-  printf("  -o       # don't listen (console off mode)\n");
37
-  printf("  -O       # owner match limitation mode\n");
38
-  printf("  -h       # help\n\n"); 
17
+  printf("  -d num       # loglevel(0-9)\n");
18
+  printf("  -u uid       # user\n");
19
+  printf("  -g gid       # group\n");
20
+  printf("  -G gid,..    # groups\n");
21
+  printf("  -b dir       # base dir\n");
22
+  printf("  -p port      # port number       (default: 5000)\n");
23
+  printf("  -m addr      # multicast address (default: 224.0.0.108)\n");
24
+  printf("  -i addr      # interface address (default: 0.0.0.0)\n");
25
+  printf("  -l addr      # listen address    (default: 127.0.0.1)\n");
26
+  printf("  -U path      # unix domain socket\n");
27
+  printf("  -k file      # key file (encrypt password)\n");
28
+  printf("  -K file      # key file (console password)\n");
29
+  printf("  -f num       # parallel send count(default: 5) \n");
30
+  printf("  -R num       # recv buffer size [bytes]\n");
31
+  printf("  -S num       # send buffer size [bytes]\n");
32
+  printf("  -T num       # traffic rate     [Mbps]\n");
33
+  printf("  -n           # don't fork\n");
34
+  printf("  -r           # don't recv\n");
35
+  printf("  -s           # don't send\n");
36
+  printf("  -o           # don't listen (console off mode)\n");
37
+  printf("  -O           # owner match limitation mode\n");
38
+  printf("  -c --chroot  # chroot to base dir\n");
39
+  printf("  -V --version # version\n"); 
40
+  printf("  -h --help    # help\n\n"); 
39 41
   exit(0);
40 42
 }
41 43
 
... ...
@@ -70,6 +72,9 @@ static void minit_option_setdefault()
70 70
   moption.maddr.sin_family      = AF_INET;
71 71
   moption.maddr.sin_addr.s_addr = inet_addr(MAKUO_MCAST_ADDR);
72 72
   moption.maddr.sin_port        = htons(MAKUO_MCAST_PORT);
73
+  moption.iaddr.sin_family      = AF_INET;
74
+  moption.iaddr.sin_addr.s_addr = INADDR_ANY;
75
+  moption.iaddr.sin_port        = htons(MAKUO_MCAST_PORT);
73 76
   moption.laddr.sin_family      = AF_INET;
74 77
   moption.laddr.sin_addr.s_addr = inet_addr(MAKUO_LOCAL_ADDR);
75 78
   moption.laddr.sin_port        = htons(MAKUO_MCAST_PORT);
... ...
@@ -308,8 +313,14 @@ static void minit_password(char *filename, int n)
308 308
 static void minit_getopt(int argc, char *argv[])
309 309
 {
310 310
   int r;
311
-
312
-  while((r=getopt(argc, argv, "T:R:S:f:u:g:G:d:b:p:m:l:U:k:K:VhnsroOc")) != -1){
311
+  struct option opt[]={
312
+    "chroot",  0, NULL, 'c',
313
+    "help",    0, NULL, 'h',
314
+    "version", 0, NULL, 'V',
315
+    0, 0, 0, 0
316
+  };
317
+
318
+  while((r=getopt_long(argc, argv, "T:R:S:f:u:g:G:d:b:p:m:i:l:U:k:K:VhnsroOc", opt, NULL)) != -1){
313 319
     switch(r){
314 320
       case 'V':
315 321
         version_print();
... ...
@@ -391,6 +402,10 @@ static void minit_getopt(int argc, char *argv[])
391 391
         moption.maddr.sin_addr.s_addr = inet_addr(optarg);
392 392
         break;
393 393
 
394
+      case 'i':
395
+        moption.iaddr.sin_addr.s_addr = inet_addr(optarg);
396
+        break;
397
+
394 398
       case 'l':
395 399
         moption.laddr.sin_addr.s_addr = inet_addr(optarg);
396 400
         break;
... ...
@@ -439,7 +454,7 @@ static void minit_socket()
439 439
   struct ip_mreq mg;
440 440
   struct sockaddr_in addr;
441 441
   mg.imr_multiaddr.s_addr = moption.maddr.sin_addr.s_addr;
442
-  mg.imr_interface.s_addr = INADDR_ANY;
442
+  mg.imr_interface.s_addr = moption.iaddr.sin_addr.s_addr;
443 443
   addr.sin_family         = AF_INET;
444 444
   addr.sin_port           = moption.maddr.sin_port; 
445 445
   addr.sin_addr.s_addr    = INADDR_ANY;
... ...
@@ -653,6 +668,7 @@ static void minit_bootlog()
653 653
     lprintf(0, "base dir  : %s\n", moption.base_dir);
654 654
   }
655 655
   lprintf(0, "multicast : %s\n", inet_ntoa(moption.maddr.sin_addr));
656
+  lprintf(0, "interface : %s\n", inet_ntoa(moption.iaddr.sin_addr));
656 657
   lprintf(0, "port      : %d\n", ntohs(moption.maddr.sin_port));
657 658
   lprintf(0, "uid       : %d(%s)\n", moption.uid, moption.user_name);
658 659
   lprintf(0, "gid       : %d(%s)"  , moption.gid, moption.group_name);