⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 click-install.cc

📁 Click is a modular router toolkit. To use it you ll need to know how to compile and install the sof
💻 CC
📖 第 1 页 / 共 2 页
字号:
/* * click-install.cc -- configuration installer for Click kernel module * Eddie Kohler * * Copyright (c) 1999-2000 Massachusetts Institute of Technology * Copyright (c) 2000 Mazu Networks, Inc. * Copyright (c) 2002 International Computer Science Institute * Copyright (c) 2006 Regents of the University of California * Copyright (c) 2008 Meraki, 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 Click 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 Click LICENSE file; the license in that file is * legally binding. */#include <click/config.h>#include "common.hh"#include "routert.hh"#include "lexert.hh"#include <click/error.hh>#include <click/confparse.hh>#include <click/clp.h>#include <click/straccum.hh>#include <click/driver.hh>#include "toolutils.hh"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <errno.h>#include <sys/time.h>#include <sys/types.h>#include <sys/stat.h>#if FOR_BSDMODULE# include <sys/param.h># include <sys/mount.h>#elif FOR_LINUXMODULE# include <sys/mount.h># include <pwd.h># include <grp.h>#endif#include <fcntl.h>#include <unistd.h>#define HELP_OPT		300#define VERSION_OPT		301#define CLICKPATH_OPT		302#define ROUTER_OPT		303#define EXPRESSION_OPT		304#define UNINSTALL_OPT		305#define HOTSWAP_OPT		306#define MAP_OPT			307#define VERBOSE_OPT		308#define THREADS_OPT		309#define PRIVATE_OPT		310#define PRIORITY_OPT		311#define GREEDY_OPT		312#define UID_OPT			313#define GID_OPT			314#define CPU_OPT			315static const Clp_Option options[] = {  { "cabalistic", 0, PRIVATE_OPT, 0, Clp_Negate },  { "clickpath", 'C', CLICKPATH_OPT, Clp_ValString, 0 },  { "expression", 'e', EXPRESSION_OPT, Clp_ValString, 0 },  { "file", 'f', ROUTER_OPT, Clp_ValString, 0 },  { "help", 0, HELP_OPT, 0, 0 },  { "hot-swap", 'h', HOTSWAP_OPT, 0, Clp_Negate },  { "hotswap", 'h', HOTSWAP_OPT, 0, Clp_Negate },  { "priority", 'n', PRIORITY_OPT, Clp_ValInt, 0 },#if FOR_LINUXMODULE  { "map", 'm', MAP_OPT, 0, 0 },  { "private", 'p', PRIVATE_OPT, 0, Clp_Negate },  { "threads", 't', THREADS_OPT, Clp_ValUnsigned, 0 },  { "greedy", 'G', GREEDY_OPT, 0, Clp_Negate },  { "uid", 'U', UID_OPT, Clp_ValString, 0 },  { "user", 0, UID_OPT, Clp_ValString, 0 },  { "gid", 0, GID_OPT, Clp_ValString, 0 },  { "cpu", 0, CPU_OPT, Clp_ValUnsigned, 0 },#endif  { "uninstall", 'u', UNINSTALL_OPT, 0, Clp_Negate },  { "verbose", 'V', VERBOSE_OPT, 0, Clp_Negate },  { "version", 'v', VERSION_OPT, 0, 0 },};static const char *program_name;#if FOR_LINUXMODULEstatic bool output_map;#endifstatic String tmpdir;voidshort_usage(){  fprintf(stderr, "Usage: %s [OPTION]... [ROUTERFILE]\n\Try '%s --help' for more information.\n",	  program_name, program_name);}voidusage(){  printf("\'Click-install' installs a kernel Click configuration. It loads the Click\n\kernel module, and any other necessary modules, as required.\n\\n\Usage: %s [OPTION]... [ROUTERFILE]\n\\n\Options:\n\  -f, --file FILE          Read router configuration from FILE.\n\  -e, --expression EXPR    Use EXPR as router configuration.\n\  -h, --hot-swap           Hot-swap install new configuration.\n\  -u, --uninstall          Uninstall Click from kernel, then reinstall.\n\  -n, --priority N         Set kernel thread priority to N (lower is better).\n", program_name);#if FOR_LINUXMODULE  printf("\  -p, --private            Make /click readable only by owning user.\n\  -U, --user USER[:GROUP]  Set owning user [root].\n\  -t, --threads N          Use N threads (multithreaded Click only).\n\  -G, --greedy             Make Click thread take up an entire CPU.\n\      --cpu N              Click thread runs on CPU N.\n");# if HAVE_LINUXMODULE_2_6  printf("\  -m, --map                Print load map to the standard output.\n");# endif#endif  printf("\  -V, --verbose            Print information about files installed.\n\  -C, --clickpath PATH     Use PATH for CLICKPATH.\n\      --help               Print this message and exit.\n\  -v, --version            Print version number and exit.\n\\n\Report bugs to <click@pdos.lcs.mit.edu>.\n");}static voidprepare_tmpdir(ErrorHandler *errh){  ContextErrorHandler cerrh(errh, "While preparing to compile packages:");  BailErrorHandler berrh(&cerrh);  // change to temporary directory  tmpdir = click_mktmpdir(&berrh);  assert(tmpdir);  if (chdir(tmpdir.c_str()) < 0)    berrh.fatal("cannot chdir to %s: %s", tmpdir.c_str(), strerror(errno));}static voidcompile_archive_packages(RouterT *r, HashTable<String, int> &packages,			 ErrorHandler *errh){  Vector<String> requirements = r->requirements();  bool tmpdir_populated = false;  // go over requirements  for (int i = 0; i < requirements.size(); i++) {    const String &req = requirements[i];    // skip if already have object file    if (r->archive_index(req + OBJSUFFIX) >= 0	|| packages[req] >= 0)      continue;    // look for source file, prepare temporary directory    int source_ae = r->archive_index(req + CXXSUFFIX);    if (source_ae < 0)      source_ae = r->archive_index(req + ".cc");    if (source_ae < 0)      continue;    // found source file, so compile it    errh->message("Compiling package %s from config archive", req.c_str());    String result_filename = click_compile_archive_file(r->archive(), &r->archive()[source_ae], req, COMPILETARGET, "", tmpdir_populated, errh);    // grab object file and add to archive    if (result_filename) {	ArchiveElement obj_ae = init_archive_element(req + OBJSUFFIX, 0600);	obj_ae.data = file_string(result_filename, errh);	r->add_archive(obj_ae);    }  }}static voidinstall_module(const String &filename, const String &options,	       ErrorHandler *errh){#if FOR_LINUXMODULE  String cmdline = "/sbin/insmod ";  if (output_map)    cmdline += "-m ";  cmdline += filename;  if (options)    cmdline += " " + options;  int retval = system(cmdline.c_str());  if (retval != 0)    errh->fatal("'%s' failed", cmdline.c_str());#else  String cmdline = "/sbin/kldload " + filename;  assert(!options);  int retval = system(cmdline.c_str());  if (retval != 0)    errh->fatal("'%s' failed", cmdline.c_str());#endif}static voidinstall_required_packages(RouterT *r, HashTable<String, int> &packages,			  HashTable<String, int> &active_modules,			  ErrorHandler *errh){  // check for uncompiled archive packages and try to compile them  compile_archive_packages(r, packages, errh);  Vector<String> requirements = r->requirements();  // go over requirements  for (int i = 0; i < requirements.size(); i++) {    String req = requirements[i];    // look for object in archive    int obj_aei = r->archive_index(req + OBJSUFFIX);    if (obj_aei >= 0 && packages[req] < 0) {      // install archived objects. mark them with leading underscores.      // may require renaming to avoid clashes in 'insmod'      // choose module name      String insmod_name = req + OBJSUFFIX;      if (verbose)	errh->message("Installing package %s (%s" OBJSUFFIX " from config archive)", insmod_name.c_str(), req.c_str());      // install module      if (!tmpdir)	prepare_tmpdir(errh);      const ArchiveElement &ae = r->archive(obj_aei);      String tmpnam = tmpdir + insmod_name;      FILE *f = fopen(tmpnam.c_str(), "w");      if (!f)	errh->fatal("%s: %s", tmpnam.c_str(), strerror(errno));      ignore_result(fwrite(ae.data.data(), 1, ae.data.length(), f));      fclose(f);      install_module(tmpnam, String(), errh);      // cleanup      packages.set(req, 1);      active_modules.set(insmod_name, 1);    } else if (packages[req] < 0) {      // install required package from CLICKPATH      String filename = req + OBJSUFFIX;      String pathname = clickpath_find_file(filename, "lib", CLICK_LIBDIR);      if (!pathname) {	filename = req + ".o";	pathname = clickpath_find_file(filename, "lib", CLICK_LIBDIR);	if (!pathname)	  errh->fatal("cannot find required package '%s" OBJSUFFIX "'\nin CLICKPATH or '%s'", req.c_str(), CLICK_LIBDIR);      }      // install module      if (verbose)	errh->message("Installing package %s (%s)", req.c_str(), pathname.c_str());      install_module(pathname, String(), errh);      packages.set(req, 1);      active_modules.set(filename, 1);    } else {      // package already loaded; note in 'active_modules' that we still need      // it      if (verbose)	errh->message("Not installing package %s, version already exists", req.c_str());      String filename = req;      if (active_modules[filename] < 0)	filename = req + OBJSUFFIX;      if (active_modules[filename] < 0)	filename = req + ".o";      if (active_modules[filename] == 0)	active_modules.set(filename, 1);    }  }}intmain(int argc, char **argv){  click_static_initialize();  CLICK_DEFAULT_PROVIDES;  ErrorHandler *nop_errh = ErrorHandler::default_handler();  ErrorHandler *errh = new PrefixErrorHandler(nop_errh, "click-install: ");  // read command line arguments  Clp_Parser *clp =    Clp_NewParser(argc, argv, sizeof(options) / sizeof(options[0]), options);  Clp_SetOptionChar(clp, '+', Clp_ShortNegated);  program_name = Clp_ProgramName(clp);  const char *router_file = 0;  bool file_is_expr = false;  bool uninstall = false;  bool hotswap = false;  int priority = -100;#if FOR_LINUXMODULE  bool accessible = true;  int threads = 1;  bool greedy = false;  output_map = false;  uid_t uid = 0;  gid_t gid = 0;  int cpu = -1;#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -