Hi,

I am trying to get working replication between two message servers, both with 
new Cyrus 2.3.13. 

>From logs it seems that sync_client "hangs up". I have the following functions 
>flows for sync_client:

- main() calls replica_connect() to open connection to server

- replica_connect() calls backend_connect()

- backend_connect() calls ask_capability() since "banner is capability response"
  from protocol definition for "csync"

        static struct protocol_t csync_protocol =
        { "csync", "csync",
          { 1, "* OK" },  <==========================
          { NULL, NULL, "* OK", NULL,
            { { "* SASL ", CAPA_AUTH },
              { "* STARTTLS", CAPA_STARTTLS },
              { NULL, 0 } } },
          { "STARTTLS", "OK", "NO", 0 },
          { "AUTHENTICATE", INT_MAX, 0, "OK", "NO", "+ ", "*", NULL, 0 },
          { "NOOP", NULL, "OK" },
          { "EXIT", NULL, "OK" }
        };

  Below code from backend_connect() - ask_capability() is called with 
automatic==AUTO_BANNER

            if (prot->banner.is_capa) {
                /* try to get the capabilities from the banner */
                mechlist = ask_capability(ret->out, ret->in, prot,
                                          &ret->capability, AUTO_BANNER);
                if (mechlist || ret->capability) {
                    /* found capabilities in banner -> don't ask */
                    ask = 0;
                }
            }

- sync_server returns the following banner  "OK ms04 Cyrus sync server v2.3.13"

- ask_capability() tries to find capabilities (from protocol definition for 
"csync") in banner. 
  So it tries to find "* SASL " or  "* STARTTLS" in "* OK ms04 Cyrus sync 
server v2.3.13"
  And it fails.

- therefore function backend_connect() calls once again ask_capability() - this 
time with automatic==AUTO_NO

            if (ask) {
                /* get the capabilities */
                mechlist = ask_capability(ret->out, ret->in, prot,
                                          &ret->capability, AUTO_NO);
            }

- however this time it seems that function ask_capability() "hangs up". It 
never ends. 
  It tries to read stream but probably sync_server doesn't send anything.

            do {
                if (prot_fgets(str, sizeof(str), pin) == NULL) break;    
<================================

                /* look for capabilities in the string */
                for (c = prot->capa_cmd.capa; c->str; c++) {
                    if ((tmp = strstr(str, c->str)) != NULL) {
                        *capa = *capa | c->flag;
        
                        if (c->flag == CAPA_AUTH) {
                            if (prot->capa_cmd.parse_mechlist)
                                ret = prot->capa_cmd.parse_mechlist(str, prot);
                            else
                                ret = xstrdup(tmp+strlen(c->str));
                        }
                    }
                }
                if (!resp) {
                    /* multiline response with no distinct end (IMAP banner) */
                    prot_NONBLOCK(pin);
                }
        
                /* look for the end of the capabilities */
            } while (!resp || strncasecmp(str, resp, strlen(resp)));


Do you know what can be wrong?



Kind Regards,
Henryk
----
Cyrus Home Page: http://cyrusimap.web.cmu.edu/
Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki
List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html

Reply via email to