asio::ip::udp::endpoint resolve(const asio::ip::udp::resolver::query &q, std::error_code &ec) { asio::ip::udp::endpoint ep; fibers::detail::fiber_ptr_t this_fiber(fibers::detail::fiber_object::current_fiber_->shared_from_this()); asio::ip::udp::resolver resolver(this_fiber->io_service_); CHECK_CALLER(this_fiber); if (this_fiber->caller_) { (*(this_fiber->caller_))([this_fiber, &q, &ep, &resolver](){ this_fiber->state_=fibers::detail::fiber_object::BLOCKED; resolver.async_resolve(q, (this_fiber->fiber_strand_.wrap([this_fiber, &ep](const std::error_code &ec, asio::ip::udp::resolver::iterator iterator){ this_fiber->last_error_=ec; if (!ec) { ep=*iterator; } this_fiber->state_=fibers::detail::fiber_object::RUNNING; this_fiber->one_step(); }))); }); } else { // TODO: Error } if (this_fiber->last_error_) { ec=this_fiber->last_error_; this_fiber->last_error_.clear(); } return ep; }
/* * The most IMPORTANT function !!! * * added by ikoo for testing -m{-i} optarg * fix me: something to do with cvstmp handling is not perfect. * * int PB_MR_CHECK (void *debug) */ int pb_mrchk (void *debug) { int err = 0; int found_it = 0; unsigned long loglen = 0; char cvstmp[TMPBUFLEN]; CHECK_CALLER (getcaller ()); if (0 == found_it) goto skip_check; sprintf (cvstmp, "[PB]Error MRID or User Name. Please check" " your MR or User Name in CVS"); saved_message = cm_get_sm (); if (saved_message[0] != '-') { error (1, 0, "[PB]Need mrid. Usage:{-i\"{mrid}\"......]}."); return -2; } if (saved_message[1] != 'i') { error (1, 0, "[PB]Need mrid. Usage:{-i\"{mrid}\"......]}."); return -2; } loglen = strlen (saved_message); if (2 > checkquote (saved_message)) { /* error (1, 0, cvstmp); */ error (1, 0, "[PB]Need mrid. Usage:{-i\"{mrid}\"......]}."); return -3; } getmrid (saved_message, mrid); sprintf (cvstmp, "[PB]Error MRID[%s] or User Name. Please check" " your MR or User Name in CVS", mrid); err = querymrid (getcaller (), mrid); if (1 == err) { /* sprintf(cvstmp, "MRID[%s] NOT valid!.", mrid); */ sprintf (cvstmp, "Error MR[%s] Status. Check if the input" " MR is in assigned or deferred status.", mrid); error (1, 0, cvstmp); } else if (0 == err) { sprintf (cvstmp, "MRID[%s] valid.", mrid); error (0, 0, cvstmp); } else { /* err < 0 means net error */ error (1, 0, "!!!Communication error with MR webserver!!!"); } skip_check: return 0; } /* end of added by ikoo */
std::error_code connect(asio::ip::udp::socket &s, const asio::ip::udp::endpoint &remote_ep, uint64_t timeout) { std::error_code ec; fibers::detail::fiber_ptr_t this_fiber(fibers::detail::fiber_object::current_fiber_->shared_from_this()); fibers::detail::timer_t sleep_timer(this_fiber->io_service_); if(timeout>0) sleep_timer.expires_from_now(std::chrono::microseconds(timeout)); CHECK_CALLER(this_fiber); if (this_fiber->caller_) { bool timer_triggered=false; bool async_op_triggered=false; (*(this_fiber->caller_))([&, this_fiber](){ this_fiber->state_=fibers::detail::fiber_object::BLOCKED; if(timeout>0) sleep_timer.async_wait(this_fiber->fiber_strand_.wrap([&, this_fiber](std::error_code ec){ /*if (ec!=asio::error::operation_aborted)*/ { timer_triggered=true; // Timeout, cancel socket op if it's still pending if(async_op_triggered) { // Both callback are called, resume fiber this_fiber->state_=fibers::detail::fiber_object::RUNNING; this_fiber->one_step(); } else { s.cancel(); } } })); s.async_connect(remote_ep, (this_fiber->fiber_strand_.wrap([&, this_fiber](std::error_code ec){ async_op_triggered=true; // Operation completed, cancel timer sleep_timer.cancel(); if(ec==asio::error::operation_aborted) ec=asio::error::timed_out; this_fiber->last_error_=ec; if(timeout==0 || timer_triggered) { // Both callback are called, resume fiber // this_fiber->schedule(); this_fiber->state_=fibers::detail::fiber_object::RUNNING; this_fiber->one_step(); } }))); }); } else { // TODO: Error } if (this_fiber->last_error_) { ec=std::make_error_code(static_cast<std::errc>(this_fiber->last_error_.value())); this_fiber->last_error_.clear(); } return ec; }