+
+ case TSP_LOOP:
+ /* looking for loops of masters */
+ if ( !(status & MASTER))
+ break;
+ if (fromnet->status == SLAVE) {
+ if ( !strcmp(msg->tsp_name, hostname)) {
+ for(;;) {
+ to.tsp_type = TSP_RESOLVE;
+ answer = acksend(&to, &fromnet->dest_addr,
+ (char *)ANYADDR, TSP_MASTERACK,
+ fromnet);
+ if (answer == NULL)
+ break;
+ to.tsp_type = TSP_QUIT;
+ (void)strcpy(to.tsp_name, hostname);
+ server = from;
+ answer = acksend(&to, &server,
+ answer->tsp_name, TSP_ACK,
+ (struct netinfo *)NULL);
+ if (answer == NULL) {
+ syslog(LOG_ERR, "loop kill error");
+ } else {
+ electiontime = 0;
+ }
+ }
+ } else {
+ if (msg->tsp_hopcnt-- <= 0)
+ break;
+ bytenetorder(msg);
+ ntp = nettab;
+ for (; ntp != NULL; ntp = ntp->next)
+ if (ntp->status == MASTER)
+ if (sendto(sock, (char *)msg,
+ sizeof(struct tsp), 0,
+ &ntp->dest_addr, length) < 0) {
+ syslog(LOG_ERR, "sendto: %m");
+ exit(1);
+ }
+ }
+ } else {
+ /*
+ * We should not have received this from a net
+ * we are master on. There must be two masters
+ * in this case.
+ */
+ if (fromnet->my_addr.s_addr == from.sin_addr.s_addr)
+ break;
+ for (;;) {
+ to.tsp_type = TSP_RESOLVE;
+ answer = acksend(&to, &fromnet->dest_addr,
+ (char *)ANYADDR, TSP_MASTERACK,
+ fromnet);
+ if (answer == NULL)
+ break;
+ to.tsp_type = TSP_QUIT;
+ (void)strcpy(to.tsp_name, hostname);
+ server = from;
+ answer = acksend(&to, &server, answer->tsp_name,
+ TSP_ACK, (struct netinfo *)NULL);
+ if (answer == NULL) {
+ syslog(LOG_ERR, "loop kill error2");
+ } else {
+ (void)addmach(msg->tsp_name, &from);
+ }
+ }
+ }
+ break;