?? common.cc
字號:
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-// Copyright (c) 2001-2008 XORP, Inc.//// Permission is hereby granted, free of charge, to any person obtaining a// copy of this software and associated documentation files (the "Software")// to deal in the Software without restriction, subject to the conditions// listed in the XORP LICENSE file. These conditions include: you must// preserve this copyright notice, and you cannot mention the copyright// holders in advertising related to the Software without their permission.// The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This// notice is a summary of the XORP LICENSE file; the license in that file is// legally binding.#ident "$XORP: xorp/rip/tools/common.cc,v 1.12 2008/07/23 05:11:39 pavlin Exp $"#include <string>#include "rip/rip_module.h"#include "libxorp/xorp.h"#include "libxorp/xlog.h"#include "libxorp/eventloop.hh"#include "libxipc/xrl_std_router.hh"#include "common.hh"const char*default_xrl_target(uint32_t ip_version){ if (ip_version == 6) { return "ripng"; } else if (ip_version == 4) { return "rip"; } else { return 0; }}uint32_trip_name_to_ip_version(const char* rip_name){ static const char m[] = "ripng"; size_t n_m = sizeof(m) / sizeof(m[0]); uint16_t i = 0; while (rip_name[i] == m[i]) { i++; if (i == n_m) break; } if (i == 3) return 4; if (i == n_m) return 6; return 0;}boolparse_finder_args(const string& host_colon_port, string& host, uint16_t& port){ string::size_type sp = host_colon_port.find(":"); if (sp == string::npos) { host = host_colon_port; // Do not set port, by design it has default finder port value. } else { host = string(host_colon_port, 0, sp); string s_port = string(host_colon_port, sp + 1, 14); uint32_t t_port = atoi(s_port.c_str()); if (t_port == 0 || t_port > 65535) { XLOG_ERROR("Finder port %u is not in range 1--65535.\n", XORP_UINT_CAST(t_port)); return false; } port = (uint16_t)t_port; } return true;}/** * Xrl Job Queue */XrlJobQueue::XrlJobQueue(EventLoop& e, const string& finder_host, uint16_t finder_port, const string& tgtname) : _e(e), _fhost(finder_host), _fport(finder_port), _tgt(tgtname), _rtr(0), _rtr_poll_cnt(0){ set_status(SERVICE_READY);}XrlJobQueue::~XrlJobQueue(){ delete _rtr;}intXrlJobQueue::startup(){ string cls = c_format("%s-%u\n", xlog_process_name(), XORP_UINT_CAST(getpid())); _rtr = new XrlStdRouter(_e, cls.c_str(), _fhost.c_str(), _fport); _rtr->finalize(); set_status(SERVICE_STARTING); _rtr_poll = _e.new_periodic_ms(100, callback(this, &XrlJobQueue::xrl_router_ready_poll)); return (XORP_OK);}intXrlJobQueue::shutdown(){ while (_jobs.empty() == false) { _jobs.pop_front(); } set_status(SERVICE_SHUTDOWN); return (XORP_OK);}voidXrlJobQueue::dispatch_complete(const XrlError& xe, const XrlJobBase* cmd){ XLOG_ASSERT(_jobs.empty() == false); XLOG_ASSERT(_jobs.front().get() == cmd); if (xe != XrlError::OKAY()) { if (xe == XrlError::COMMAND_FAILED()) { cout << "Error: " << xe.note() << endl; } else { cout << xe.str() << endl; } shutdown(); return; } _jobs.pop_front(); if (_jobs.empty() == false) { process_next_job(); } else { shutdown(); }}boolXrlJobQueue::xrl_router_ready_poll(){ if (_rtr->ready()) { process_next_job(); return false; } if (_rtr_poll_cnt++ > 50) { set_status(SERVICE_FAILED, "Could not contact XORP Finder process"); } return true;}voidXrlJobQueue::process_next_job(){ if (_jobs.front()->dispatch() == false) { set_status(SERVICE_FAILED, "Could not dispatch xrl"); }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -