int mail_tcp_connect(const char * server, uint16_t port) { return mail_tcp_connect_with_local_address(server, port, NULL, 0); }
int mailstorage_generic_connect_with_local_address(mailsession_driver * driver, char * servername, uint16_t port, char * local_address, uint16_t local_port, char * command, int connection_type, int cache_function_id, char * cache_directory, int flags_function_id, char * flags_directory, mailsession ** result) { int r; int res; mailstream * stream; int fd; mailsession * session; int connect_result; switch (connection_type) { case CONNECTION_TYPE_PLAIN: case CONNECTION_TYPE_TRY_STARTTLS: case CONNECTION_TYPE_STARTTLS: case CONNECTION_TYPE_TLS: fd = mail_tcp_connect_with_local_address(servername, port, local_address, local_port); if (fd == -1) { res = MAIL_ERROR_CONNECT; goto err; } break; case CONNECTION_TYPE_COMMAND: case CONNECTION_TYPE_COMMAND_TRY_STARTTLS: case CONNECTION_TYPE_COMMAND_STARTTLS: case CONNECTION_TYPE_COMMAND_TLS: fd = subcommand_connect(command, servername, port); break; default: fd = -1; break; } if (fd == -1) { res = MAIL_ERROR_INVAL; goto err; } switch (connection_type) { case CONNECTION_TYPE_PLAIN: case CONNECTION_TYPE_TRY_STARTTLS: case CONNECTION_TYPE_STARTTLS: case CONNECTION_TYPE_COMMAND: case CONNECTION_TYPE_COMMAND_TRY_STARTTLS: case CONNECTION_TYPE_COMMAND_STARTTLS: stream = mailstream_socket_open(fd); break; case CONNECTION_TYPE_TLS: case CONNECTION_TYPE_COMMAND_TLS: stream = mailstream_ssl_open(fd); break; default: stream = NULL; break; } if (stream == NULL) { res = MAIL_ERROR_STREAM; close(fd); goto err; } session = mailsession_new(driver); if (session == NULL) { res = MAIL_ERROR_MEMORY; goto close_stream; } if (cache_directory != NULL) { char cache_directory_server[PATH_MAX]; snprintf(cache_directory_server, PATH_MAX, "%s/%s", cache_directory, servername); r = mailsession_parameters(session, cache_function_id, cache_directory_server); if (r != MAIL_NO_ERROR) { res = r; goto close_stream; } } if (flags_directory != NULL) { char flags_directory_server[PATH_MAX]; snprintf(flags_directory_server, PATH_MAX, "%s/%s", flags_directory, servername); r = mailsession_parameters(session, flags_function_id, flags_directory_server); if (r != MAIL_NO_ERROR) { res = r; goto close_stream; } } r = mailsession_connect_stream(session, stream); switch (r) { case MAIL_NO_ERROR_NON_AUTHENTICATED: case MAIL_NO_ERROR_AUTHENTICATED: case MAIL_NO_ERROR: break; default: res = r; goto free; } connect_result = r; switch (connection_type) { case CONNECTION_TYPE_TRY_STARTTLS: case CONNECTION_TYPE_COMMAND_TRY_STARTTLS: r = mailsession_starttls(session); if ((r != MAIL_NO_ERROR) && (r != MAIL_ERROR_NO_TLS)) { res = r; goto free; } break; case CONNECTION_TYPE_STARTTLS: case CONNECTION_TYPE_COMMAND_STARTTLS: r = mailsession_starttls(session); if (r != MAIL_NO_ERROR) { res = r; goto free; } } * result = session; return connect_result; close_stream: mailstream_close(stream); free: mailsession_free(session); err: return res; }