/* Open the connection to the server. */ int mu_nntp_connect (mu_nntp_t nntp) { int status; /* Sanity checks. */ if (nntp == NULL) return EINVAL; /* A networking stack. */ if (nntp->carrier == NULL) return EINVAL; /* Enter the nntp state machine, and boogy */ switch (nntp->state) { default: /* FALLTHROUGH */ /* If nntp was in an error state going through here should clear it. */ case MU_NNTP_NO_STATE: status = mu_nntp_disconnect (nntp); MU_NNTP_CHECK_EAGAIN (nntp, status); nntp->state = MU_NNTP_CONNECT; case MU_NNTP_CONNECT: /* Establish the connection. */ status = mu_stream_open (nntp->carrier); MU_NNTP_CHECK_EAGAIN (nntp, status); nntp->acknowledge = 0; nntp->state = MU_NNTP_GREETINGS; case MU_NNTP_GREETINGS: /* Get the greetings. */ { size_t len = 0; int code; status = mu_nntp_response (nntp, NULL, 0, &len); MU_NNTP_CHECK_EAGAIN (nntp, status); mu_nntp_debug_ack (nntp); /* 200 Service available, posting allowed */ /* 201 Servie available, posting prohibited */ code = mu_nntp_response_code(nntp); if (code != MU_NNTP_RESP_CODE_POSTING_ALLOWED && code != MU_NNTP_RESP_CODE_POSTING_PROHIBITED) { mu_stream_close (nntp->carrier); nntp->state = MU_NNTP_NO_STATE; return EACCES; } nntp->state = MU_NNTP_NO_STATE; } } /* End AUTHORISATION state. */ return status; }
int mu_nntp_set_carrier (mu_nntp_t nntp, mu_stream_t carrier) { /* Sanity checks. */ if (nntp == NULL) return EINVAL; if (nntp->carrier) { /* Close any old carrier. */ mu_nntp_disconnect (nntp); mu_stream_destroy (&nntp->carrier); } nntp->carrier = carrier; return 0; }