SOURCES: ucarp-1.4-yandex-multicast-handlers.patch (NEW) - http://...
areq
areq at pld-linux.org
Tue Mar 18 17:38:22 CET 2008
Author: areq Date: Tue Mar 18 16:38:22 2008 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- http://imperium.lenin.ru/~nit/ucarp/ucarp-1.4-yandex-multicast-handlers.patch
---- Files affected:
SOURCES:
ucarp-1.4-yandex-multicast-handlers.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/ucarp-1.4-yandex-multicast-handlers.patch
diff -u /dev/null SOURCES/ucarp-1.4-yandex-multicast-handlers.patch:1.1
--- /dev/null Tue Mar 18 17:38:22 2008
+++ SOURCES/ucarp-1.4-yandex-multicast-handlers.patch Tue Mar 18 17:38:17 2008
@@ -0,0 +1,131 @@
+diff -ru --new-file ucarp-1.4-vanilla/src/carp.c ucarp-1.4-handlers/src/carp.c
+--- ucarp-1.4-vanilla/src/carp.c 2008-01-20 01:27:13.000000000 +0300
++++ ucarp-1.4-handlers/src/carp.c 2008-02-01 22:39:12.000000000 +0300
+@@ -58,14 +58,20 @@
+ logfile(LOG_INFO, _("Switching to state: INIT"));
+ break;
+ case BACKUP:
+- logfile(LOG_WARNING, _("Switching to state: BACKUP"));
+ if ((sc->sc_state != INIT) || (neutral != 1)) {
+- (void) spawn_handler(dev_desc_fd, downscript);
++ if (!spawn_handler(dev_desc_fd, downscript)) {
++ logfile(LOG_WARNING, _("%s failed; not switching to BACKUP"), downscript);
++ return;
++ }
+ }
++ logfile(LOG_WARNING, _("Switching to state: BACKUP"));
+ break;
+ case MASTER:
++ if (!spawn_handler(dev_desc_fd, upscript)) {
++ logfile(LOG_WARNING, _("%s failed; not switching to MASTER"), upscript);
++ return;
++ }
+ logfile(LOG_WARNING, _("Switching to state: MASTER"));
+- (void) spawn_handler(dev_desc_fd, upscript);
+ gratuitous_arp(dev_desc_fd);
+ break;
+ default:
+@@ -329,6 +335,10 @@
+ switch (sc->sc_state) {
+ case INIT:
+ carp_set_state(sc, BACKUP);
++ if (sc->sc_state != BACKUP) {
++ logfile(LOG_ERR, _("Can't swith to BACKUP state."));
++ abort();
++ }
+ carp_setrun(sc, 0);
+ break;
+ case BACKUP:
+@@ -381,12 +391,14 @@
+ break;
+ case BACKUP:
+ carp_set_state(sc, MASTER);
+- carp_send_ad(sc);
+- /* Schedule a delayed ARP request to deal w/ some L3 switches */
+- sc->sc_delayed_arp = 2;
++ if (sc->sc_state == MASTER) {
++ carp_send_ad(sc);
++ /* Schedule a delayed ARP request to deal w/ some L3 switches */
++ sc->sc_delayed_arp = 2;
+ #ifdef INET6
+- carp_send_na(sc);
++ carp_send_na(sc);
+ #endif /* INET6 */
++ }
+ carp_setrun(sc, 0);
+ break;
+ }
+@@ -570,9 +582,11 @@
+ (timercmp(&sc_tv, &ch_tv, ==) &&
+ iphead.ip_src.s_addr < srcip.s_addr)) {
+ carp_set_state(&sc, BACKUP);
++ if (sc.sc_state == BACKUP) {
++ logfile(LOG_WARNING, _("Preferred master advertised: "
++ "going back to BACKUP state"));
++ }
+ carp_setrun(&sc, 0);
+- logfile(LOG_WARNING, _("Preferred master advertised: "
+- "going back to BACKUP state"));
+ }
+
+ /*
+@@ -751,6 +765,18 @@
+ interface == NULL ? "-" : interface, strerror(errno));
+ return -1;
+ }
++
++ struct ip_mreqn req_add;
++ memset(&req_add, 0, sizeof (req_add));
++ req_add.imr_multiaddr.s_addr = inet_addr("224.0.0.18");
++ req_add.imr_address.s_addr = srcip.s_addr;
++ if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
++ (char *) &req_add, sizeof (struct ip_mreqn)) < 0) {
++ logfile(LOG_ERR, "Can't do IP_ADD_MEMBERSHIP errno=%s (%d)",
++ strerror(errno), errno);
++ close(fd);
++ return -1;
++ }
+ #ifdef SIOCGIFFLAGS
+ if (strlen(interface) >= sizeof iface.ifr_name) {
+ logfile(LOG_ERR, _("Interface name too long"));
+diff -ru --new-file ucarp-1.4-vanilla/src/spawn.c ucarp-1.4-handlers/src/spawn.c
+--- ucarp-1.4-vanilla/src/spawn.c 2008-01-20 01:25:58.000000000 +0300
++++ ucarp-1.4-handlers/src/spawn.c 2008-02-01 22:38:55.000000000 +0300
+@@ -12,7 +12,8 @@
+
+ int spawn_handler(const int dev_desc_fd, const char * const script)
+ {
+- pid_t pid;
++ pid_t pid, w;
++ int status;
+
+ if (script == NULL || *script == 0) {
+ return 0;
+@@ -32,7 +33,19 @@
+ (xparam ? " " : ""), (xparam ? xparam : ""));
+ #ifdef HAVE_WAITPID
+ {
+- while (waitpid(pid, NULL, 0) == (pid_t) -1 && errno == EINTR);
++ do {
++ status = -1;
++ w = waitpid(pid, &status, WUNTRACED | WCONTINUED);
++ while ((w = waitpid(pid, &status, WUNTRACED | WCONTINUED)) ==
++ (pid_t) -1 && errno == EINTR);
++
++ if (WIFEXITED(status)) {
++ return (WEXITSTATUS(status) == 0 ? 1 : 0);
++ }
++ else if (WIFSIGNALED(status)) {
++ return 0;
++ }
++ } while (!WIFEXITED(status) && !WIFSIGNALED(status));
+ }
+ #else
+ {
+@@ -51,5 +64,5 @@
+ strerror(errno));
+ return -1;
+ }
+- return 0;
++ return 1;
+ }
================================================================
More information about the pld-cvs-commit
mailing list