예제 #1
0
파일: mutt_socket.c 프로젝트: hww3/pexts
/* mutt_conn_find: find a connection off the list of connections whose
 *   account matches account. If start is not null, only search for
 *   connections after the given connection (allows higher level socket code
 *   to make more fine-grained searches than account info - eg in IMAP we may
 *   wish to find a connection which is not in IMAP_SELECTED state) */
CONNECTION* mutt_conn_find (const CONNECTION* start, const ACCOUNT* account)
{
  CONNECTION* conn;
  ciss_url_t url;
  char hook[LONG_STRING];

  /* account isn't actually modified, since url isn't either */
  mutt_account_tourl ((ACCOUNT*) account, &url);
  url.path = NULL;
  url_ciss_tostring (&url, hook, sizeof (hook), 0);
#ifndef LIBMUTT /* no mutt hooks */
  mutt_account_hook (hook);
#endif 
  conn = start ? start->next : Connections;
  while (conn)
  {
    if (mutt_account_match (account, &(conn->account)))
      return conn;
    conn = conn->next;
  }

  conn = socket_new_conn ();
  memcpy (&conn->account, account, sizeof (ACCOUNT));

  conn->next = Connections;
  Connections = conn;

  if (Tunnel && *Tunnel)
#ifndef LIBMUTT
    mutt_tunnel_socket_setup (conn);
#else
  {} 
#endif
  else if (account->flags & M_ACCT_SSL) 
예제 #2
0
int imap_account_match (const ACCOUNT* a1, const ACCOUNT* a2)
{
  IMAP_DATA* a1_idata = imap_conn_find (a1, M_IMAP_CONN_NONEW);
  IMAP_DATA* a2_idata = imap_conn_find (a2, M_IMAP_CONN_NONEW);
  const ACCOUNT* a1_canon = a1_idata == NULL ? a1 : &a1_idata->conn->account;
  const ACCOUNT* a2_canon = a2_idata == NULL ? a2 : &a2_idata->conn->account;

  return mutt_account_match (a1_canon, a2_canon);
}
예제 #3
0
/* imap_pretty_mailbox: called by mutt_pretty_mailbox to make IMAP paths
 *   look nice. */
void imap_pretty_mailbox (char* path)
{
  IMAP_MBOX home, target;
  ciss_url_t url;
  char* delim;
  int tlen;
  int hlen = 0;
  char home_match = 0;

  if (imap_parse_path (path, &target) < 0)
    return;

  tlen = mutt_strlen (target.mbox);
  /* check whether we can do '=' substitution */
  if (mx_is_imap(Maildir) && !imap_parse_path (Maildir, &home))
  {
    hlen = mutt_strlen (home.mbox);
    if (tlen && mutt_account_match (&home.account, &target.account) &&
	!mutt_strncmp (home.mbox, target.mbox, hlen))
    {
      if (! hlen)
	home_match = 1;
      else if (ImapDelimChars)
	for (delim = ImapDelimChars; *delim != '\0'; delim++)
	  if (target.mbox[hlen] == *delim)
	    home_match = 1;
    }
    FREE (&home.mbox);
  }

  /* do the '=' substitution */
  if (home_match) {
    *path++ = '=';
    /* copy remaining path, skipping delimiter */
    if (! hlen)
      hlen = -1;
    memcpy (path, target.mbox + hlen + 1, tlen - hlen - 1);
    path[tlen - hlen - 1] = '\0';
  }
  else
  {
    mutt_account_tourl (&target.account, &url);
    url.path = target.mbox;
    /* FIXME: That hard-coded constant is bogus. But we need the actual
     *   size of the buffer from mutt_pretty_mailbox. And these pretty
     *   operations usually shrink the result. Still... */
    url_ciss_tostring (&url, path, 1024, 0);
  }

  FREE (&target.mbox);
}
예제 #4
0
/* mutt_conn_find: find a connection off the list of connections whose
 *   account matches account. If start is not null, only search for
 *   connections after the given connection (allows higher level socket code
 *   to make more fine-grained searches than account info - eg in IMAP we may
 *   wish to find a connection which is not in IMAP_SELECTED state) */
CONNECTION* mutt_conn_find (const CONNECTION* start, const ACCOUNT* account)
{
        CONNECTION* conn;
        ciss_url_t url;
        char hook[LONG_STRING];

/* account isn't actually modified, since url isn't either */
        mutt_account_tourl ((ACCOUNT*) account, &url);
        url.path = NULL;
        url_ciss_tostring (&url, hook, sizeof (hook), 0);
        mutt_account_hook (hook);

        conn = start ? start->next : Connections;
        while (conn) {
                if (mutt_account_match (account, &(conn->account)))
                        return conn;
                conn = conn->next;
        }

        conn = socket_new_conn ();
        memcpy (&conn->account, account, sizeof (ACCOUNT));

        conn->next = Connections;
        Connections = conn;

        if (Tunnel && *Tunnel)
                mutt_tunnel_socket_setup (conn);
        else if (account->flags & M_ACCT_SSL) {
#if defined(USE_SSL)
                if (mutt_ssl_socket_setup (conn) < 0) {
                        mutt_socket_free (conn);
                        return NULL;
                }
#else
                mutt_error _("SSL is unavailable.");
                mutt_sleep (2);
                mutt_socket_free (conn);

                return NULL;
#endif
        }
        else {
                conn->conn_read = raw_socket_read;
                conn->conn_write = raw_socket_write;
                conn->conn_open = raw_socket_open;
                conn->conn_close = raw_socket_close;
                conn->conn_poll = raw_socket_poll;
        }

        return conn;
}