亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? depmod.c

?? GCC資料大全
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* New simplified depmod without backwards compat stuff and not   requiring ksyms.   (C) 2002 Rusty Russell IBM Corporation */#include <stdarg.h>#include <stdio.h>#include <stdlib.h>#include <getopt.h>#include <string.h>#include <errno.h>#include <unistd.h>#include <elf.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <dirent.h>#include <sys/utsname.h>#include <sys/mman.h>#include "zlibsupport.h"#include "depmod.h"#include "moduleops.h"#include "tables.h"#include "testing.h"/* I hate strcmp. */#define streq(a,b) (strcmp((a),(b)) == 0)#ifndef MODULE_DIR#define MODULE_DIR "/lib/modules/"#endifstatic int verbose;static unsigned int skipchars;void fatal(const char *fmt, ...){	va_list arglist;	fprintf(stderr, "FATAL: ");	va_start(arglist, fmt);	vfprintf(stderr, fmt, arglist);	va_end(arglist);	exit(1);}void warn(const char *fmt, ...){	va_list arglist;	fprintf(stderr, "WARNING: ");	va_start(arglist, fmt);	vfprintf(stderr, fmt, arglist);	va_end(arglist);}void *do_nofail(void *ptr, const char *file, int line, const char *expr){	if (!ptr) {		fatal("Memory allocation failure %s line %d: %s.\n",		      file, line, expr);	}	return ptr;}#define SYMBOL_HASH_SIZE 1024struct symbol{	struct symbol *next;	struct module *owner;	char name[0];};static struct symbol *symbolhash[SYMBOL_HASH_SIZE];/* This is based on the hash agorithm from gdbm, via tdb */static inline unsigned int tdb_hash(const char *name){	unsigned value;	/* Used to compute the hash value.  */	unsigned   i;	/* Used to cycle through random values. */	/* Set the initial value from the key size. */	for (value = 0x238F13AF * strlen(name), i=0; name[i]; i++)		value = (value + (((unsigned char *)name)[i] << (i*5 % 24)));	return (1103515243 * value + 12345);}void add_symbol(const char *name, struct module *owner){	unsigned int hash;	struct symbol *new = NOFAIL(malloc(sizeof *new + strlen(name) + 1));	new->owner = owner;	strcpy(new->name, name);	hash = tdb_hash(name) % SYMBOL_HASH_SIZE;	new->next = symbolhash[hash];	symbolhash[hash] = new;}static int print_unknown;struct module *find_symbol(const char *name, const char *modname, int weak){	struct symbol *s;	/* For our purposes, .foo matches foo.  PPC64 needs this. */	if (name[0] == '.')		name++;	for (s = symbolhash[tdb_hash(name) % SYMBOL_HASH_SIZE]; s; s=s->next) {		if (streq(s->name, name))			return s->owner;	}	if (print_unknown && !weak)		warn("%s needs unknown symbol %s\n", modname, name);	return NULL;}void add_dep(struct module *mod, struct module *depends_on){	unsigned int i;	for (i = 0; i < mod->num_deps; i++)		if (mod->deps[i] == depends_on)			return;	mod->deps = realloc(mod->deps, sizeof(mod->deps[0])*(mod->num_deps+1));	mod->deps[mod->num_deps++] = depends_on;}static void load_system_map(const char *filename){	FILE *system_map;	char line[10240];	system_map = fopen(filename, "r");	if (!system_map)		fatal("Could not open '%s': %s\n", filename, strerror(errno));	/* eg. c0294200 R __ksymtab_devfs_alloc_devnum */	while (fgets(line, sizeof(line)-1, system_map)) {		char *ptr;		/* Snip \n */		ptr = strchr(line, '\n');		*ptr = '\0';		ptr = strchr(line, ' ');		if (!ptr || !(ptr = strchr(ptr + 1, ' ')))			continue;		/* Covers gpl-only and normal symbols. */		if (strncmp(ptr+1, "__ksymtab_", strlen("__ksymtab_")) == 0)			add_symbol(ptr+1+strlen("__ksymtab_"), NULL);	}	/* __this_module is magic inserted by kernel loader. */	add_symbol("__this_module", NULL);	/* On S390, this is faked up too */	add_symbol("_GLOBAL_OFFSET_TABLE_", NULL);}static struct option options[] = { { "all", 0, NULL, 'a' },				   { "quick", 0, NULL, 'A' },				   { "basedir", 1, NULL, 'b' },				   { "errsyms", 0, NULL, 'e' },				   { "filesyms", 1, NULL, 'F' },				   { "help", 0, NULL, 'h' },				   { "show", 0, NULL, 'n' },				   { "dry-run", 0, NULL, 'n' },				   { "quiet", 0, NULL, 'q' },				   { "root", 0, NULL, 'r' },				   { "unresolved-error", 0, NULL, 'u' },				   { "verbose", 0, NULL, 'v' },				   { "version", 0, NULL, 'V' },				   /* Obsolete, but we need to parse it. */				   { "config", 1, NULL, 'C' },				   { NULL, 0, NULL, 0 } };/* Version number or module name?  Don't assume extension. */static int is_version_number(const char *version){	unsigned int dummy;	return (sscanf(version, "%u.%u.%u", &dummy, &dummy, &dummy) == 3);}static int old_module_version(const char *version){	/* Expect three part version. */	unsigned int major, sub, minor;	sscanf(version, "%u.%u.%u", &major, &sub, &minor);	if (major > 2) return 0;	if (major < 2) return 1;	/* 2.x */	if (sub > 5) return 0;	if (sub < 5) return 1;	/* 2.5.x */	if (minor >= 48) return 0;	return 1;}static void exec_old_depmod(char *argv[]){	char *sep;	char pathname[strlen(argv[0])+1];	char oldname[strlen("depmod") + strlen(argv[0]) + sizeof(".old")];	memset(pathname, 0, strlen(argv[0])+1);	sep = strrchr(argv[0], '/');	if (sep)		memcpy(pathname, argv[0], sep - argv[0]+1);	sprintf(oldname, "%s%s.old", pathname, "depmod");	/* Recursion detection: we need an env var since we can't	   change argv[0] (as older modutils uses it to determine	   behavior). */	if (getenv("MODULE_RECURSE"))		return;	setenv("MODULE_RECURSE", "y", 0);	execvp(oldname, argv);	fprintf(stderr,		"Version requires old depmod, but couldn't run %s: %s\n",		oldname, strerror(errno));	exit(2);}static void print_usage(const char *name){	fprintf(stderr,	"%s " VERSION " -- part of " PACKAGE "\n"	"%s -[aA] [-n -e -v -q -V -r -u]\n"	"      [-b basedirectory] [forced_version]\n"	"depmod [-n -e -v -q -r -u] [-F kernelsyms] module1.o module2.o ...\n"	"If no arguments (except options) are given, \"depmod -a\" is assumed\n"	"\n"	"depmod will output a dependancy list suitable for the modprobe utility.\n"	"\n"	"\n"	"Options:\n"	"\t-a, --all            Probe all modules\n"	"\t-n, --show           Write the dependency file on stdout only\n"	"\t-V, --version        Print the release version\n"	"\t-h, --help           Print this usage message\n"	"\n"	"The following options are useful for people managing distributions:\n"	"\t-b basedirectory\n"	"\t    --basedir basedirectory    Use an image of a module tree.\n"	"\t-F kernelsyms\n"	"\t    --filesyms kernelsyms      Use the file instead of the\n"	"\t                               current kernel symbols.\n",	"depmod", "depmod");}static int ends_in(const char *name, const char *ext){	unsigned int namelen, extlen;	/* Grab lengths */	namelen = strlen(name);	extlen = strlen(ext);	if (namelen < extlen) return 0;	if (streq(name + namelen - extlen, ext))		return 1;	return 0;}static struct module *grab_module(const char *dirname,				  const char *filename,				  struct module *next){	struct module *new;	new = NOFAIL(malloc(sizeof(*new)			    + strlen(dirname) + 1 + strlen(filename) + 1));	sprintf(new->pathname, "%s/%s", dirname, filename);	INIT_LIST_HEAD(&new->dep_list);	new->data = grab_file(new->pathname, &new->len);	if (!new->data) {		warn("Can't read module %s: %s\n",		     new->pathname, strerror(errno));		goto fail_data;	}	/* "\177ELF" <byte> where byte = 001 for 32-bit, 002 for 64 */	if (memcmp(new->data, ELFMAG, SELFMAG) != 0) {		warn("Module %s is not an elf object\n", new->pathname);		goto fail;	}	switch (((char *)new->data)[EI_CLASS]) {	case ELFCLASS32:		new->ops = &mod_ops32;		break;	case ELFCLASS64:		new->ops = &mod_ops64;		break;	default:		warn("Module %s has elf unknown identifier %i\n",		     new->pathname, ((char *)new->data)[EI_CLASS]);		goto fail;	}	new->ops->load_symbols(new);	new->ops->fetch_tables(new);	new->next = next;	return new;fail:	release_file(new->data, new->len);fail_data:	free(new);	return next;}struct module_traverse{	struct module_traverse *prev;	struct module *mod;};static int in_loop(struct module *mod, const struct module_traverse *traverse){	const struct module_traverse *i;	for (i = traverse; i; i = i->prev) {		if (i->mod == mod)			return 1;	}	return 0;}static char *basename(const char *name){	const char *base = strrchr(name, '/');	if (base) return (char *)base + 1;	return (char *)name;}/* Assume we are doing all the modules, so only report each loop once. */static void report_loop(const struct module *mod,			const struct module_traverse *traverse){	const struct module_traverse *i;	/* Check that start is least alphabetically.  eg.  a depends	   on b depends on a will get reported for a, not b.  */	for (i = traverse->prev; i->prev; i = i->prev) {		if (strcmp(mod->pathname, i->mod->pathname) > 0)			return;	}	/* Is start in the loop?  If not, don't report now. eg. a	   depends on b which depends on c which depends on b.  Don't	   report when generating depends for a. */	if (mod != i->mod)		return;	warn("Loop detected: %s ", mod->pathname);	for (i = traverse->prev; i->prev; i = i->prev)		fprintf(stderr, "needs %s ", basename(i->mod->pathname));	fprintf(stderr, "which needs %s again!\n", basename(mod->pathname));}/* This is damn slow, but loops actually happen, and we don't want to   just exit() and leave the user without any modules. */static int has_dep_loop(struct module *module, struct module_traverse *prev){	unsigned int i;	struct module_traverse traverse = { .prev = prev, .mod = module };	if (in_loop(module, prev)) {		report_loop(module, &traverse);		return 1;	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
94色蜜桃网一区二区三区| 亚洲一级二级在线| 国产成人免费视频一区| www一区二区| 成人在线一区二区三区| 日韩一区在线看| 91国偷自产一区二区三区成为亚洲经典| 亚洲乱码国产乱码精品精的特点| 91行情网站电视在线观看高清版| 亚洲mv在线观看| 日韩精品在线一区二区| 色香蕉久久蜜桃| 亚洲1区2区3区4区| 2021久久国产精品不只是精品 | 精品综合免费视频观看| 久久综合精品国产一区二区三区| 国产大片一区二区| 亚洲欧洲综合另类| 欧美一区欧美二区| 国产麻豆视频精品| 亚洲美女屁股眼交| 欧美一区二区二区| 成人免费视频免费观看| 一区av在线播放| 日韩精品一区二区三区四区| 国产成人午夜99999| 亚洲精品你懂的| 精品欧美久久久| 99久久精品费精品国产一区二区| 亚洲成人一二三| 国产人成亚洲第一网站在线播放| 91黄色激情网站| 韩国理伦片一区二区三区在线播放| 中文字幕在线观看不卡视频| 这里只有精品视频在线观看| 成人午夜视频免费看| 五月天激情综合| 国产日韩v精品一区二区| 欧美日韩精品综合在线| 国产激情视频一区二区三区欧美| 亚洲一区二区四区蜜桃| 久久精品欧美一区二区三区麻豆| 欧美日韩五月天| 不卡的av电影| 国内精品视频一区二区三区八戒| 亚洲最新在线观看| 国产日韩欧美精品在线| 91精品国产全国免费观看| av成人老司机| 国产成人av一区二区三区在线| 午夜精品国产更新| 亚洲私人黄色宅男| 国产三级欧美三级日产三级99| 这里只有精品99re| 欧美日韩一区二区三区高清| 波多野结衣欧美| 毛片一区二区三区| 视频一区欧美日韩| 亚洲自拍偷拍麻豆| 亚洲欧美激情插| 国产精品日产欧美久久久久| 精品捆绑美女sm三区| 6080午夜不卡| 欧美伦理影视网| 欧美日韩国产免费一区二区 | 久久国产欧美日韩精品| 亚洲国产一区二区三区青草影视 | 欧美一级二级在线观看| 欧美自拍丝袜亚洲| 97se狠狠狠综合亚洲狠狠| 国产不卡在线视频| 国产酒店精品激情| 国产精品1024| 国产高清精品网站| 国产精品亚洲一区二区三区妖精 | 99re这里只有精品6| 国产在线精品一区二区夜色| 美腿丝袜亚洲三区| 久久99精品久久久久久| 免费在线观看一区| 日本中文字幕一区二区视频| 丝袜美腿成人在线| 奇米888四色在线精品| 日韩精品色哟哟| 日韩av午夜在线观看| 日本成人超碰在线观看| 婷婷国产v国产偷v亚洲高清| 偷窥少妇高潮呻吟av久久免费| 亚洲综合免费观看高清完整版在线| 亚洲三级小视频| 亚洲综合免费观看高清完整版| 亚洲综合网站在线观看| 爽好久久久欧美精品| 另类中文字幕网| 国产成人自拍网| 91麻豆蜜桃一区二区三区| 99国产精品久| 欧美色图一区二区三区| 欧美一区日本一区韩国一区| 日本特黄久久久高潮| 久久不见久久见免费视频1| 国产综合久久久久影院| 成人动漫一区二区| 欧美三级韩国三级日本一级| 91精品国产色综合久久ai换脸| 欧美精品一区二区三区在线| 中文字幕乱码一区二区免费| 亚洲女爱视频在线| 丝袜美腿亚洲综合| 国产成人超碰人人澡人人澡| 色婷婷综合久久久久中文| 欧美人妇做爰xxxⅹ性高电影| 精品国产凹凸成av人网站| 中文字幕精品综合| 亚洲第一久久影院| 国产曰批免费观看久久久| 色综合久久综合中文综合网| 日韩西西人体444www| 国产精品的网站| 免费一级片91| 99精品视频在线免费观看| 91精品国产色综合久久久蜜香臀| 亚洲国产精华液网站w| 日韩成人精品视频| 91丨porny丨国产入口| 欧美tickling挠脚心丨vk| 亚洲女女做受ⅹxx高潮| 国产自产高清不卡| 欧美系列在线观看| 国产人成亚洲第一网站在线播放| 午夜精品视频一区| 99久久婷婷国产综合精品电影| 91超碰这里只有精品国产| 中文字幕av资源一区| 久久精品国产网站| 在线视频国产一区| 久久se精品一区二区| 色婷婷综合激情| 久久久久久久综合色一本| 亚洲综合男人的天堂| 成人h版在线观看| 精品福利一区二区三区免费视频| 一区二区三区在线视频观看58| 国产福利不卡视频| 欧美成人r级一区二区三区| 亚洲成人免费影院| 91网址在线看| 亚洲欧洲无码一区二区三区| 久久国产精品第一页| 91麻豆精品国产91久久久久| 亚洲欧美乱综合| 99r国产精品| 日本一区二区电影| 国产成人综合亚洲91猫咪| 日韩精品一区二区三区四区| 日本最新不卡在线| 91精品蜜臀在线一区尤物| 亚洲精品福利视频网站| 91蜜桃婷婷狠狠久久综合9色| 国产午夜精品美女毛片视频| 国产一区二区三区高清播放| 日韩精品一区二区三区中文不卡| 视频在线在亚洲| 在线观看日韩电影| 一区二区欧美在线观看| 色94色欧美sute亚洲线路一ni| 中文字幕中文字幕中文字幕亚洲无线| 国产麻豆视频一区| 欧美国产欧美综合| av激情成人网| 亚洲欧美日韩在线| 91久久精品日日躁夜夜躁欧美| 亚洲精品久久7777| 欧美日韩在线免费视频| 亚洲国产成人av好男人在线观看| 在线一区二区视频| 一区二区欧美国产| 777欧美精品| 精品在线免费视频| 久久久不卡影院| 91在线视频网址| 性做久久久久久久免费看| 欧美日本在线播放| 蜜臀久久久99精品久久久久久| 久久一区二区视频| 风间由美一区二区三区在线观看| 国产精品网友自拍| 在线观看欧美黄色| 蜜臀久久99精品久久久久久9| 久久嫩草精品久久久精品一| 国产成人在线色| 亚洲欧美福利一区二区| 欧美人xxxx| 国产精品18久久久久久久久| 国产精品免费人成网站| 在线观看区一区二| 久久99精品视频| 亚洲特级片在线| 在线综合视频播放| 成人毛片在线观看|