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

📄 map.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	fd = db->fd(db);# if !defined(O_EXLOCK)	if (mode == O_RDWR && fd >= 0)	{		if (lockfile(fd, map->map_file, ".db", LOCK_EX))			map->map_mflags |= MF_LOCKED;	}# else	if (mode == O_RDONLY && fd >= 0)		(void) lockfile(fd, map->map_file, ".db", LOCK_UN);	else		map->map_mflags |= MF_LOCKED;# endif#endif	/* try to make sure that at least the database header is on disk */	if (mode == O_RDWR)#if OLD_NEWDB		(void) db->sync(db);#else		(void) db->sync(db, 0);	if (fd >= 0 && fstat(fd, &st) >= 0)		map->map_mtime = st.st_mtime;#endif	map->map_db2 = (void *) db;	if (mode == O_RDONLY && bitset(MF_ALIAS, map->map_mflags))		if (!aliaswait(map, ".db", TRUE))			return FALSE;	return TRUE;}/***  HASH_MAP_INIT -- HASH-style map initialization*/boolhash_map_open(map, mode)	MAP *map;	int mode;{	DB *db;	int i;	int omode;	int fd;	struct stat st;	char buf[MAXNAME];	if (tTd(38, 2))		printf("hash_map_open(%s, %d)\n", map->map_file, mode);	omode = mode;	if (omode == O_RDWR)	{		omode |= O_CREAT|O_TRUNC;#if defined(O_EXLOCK) && HASFLOCK		omode |= O_EXLOCK;# if !OLD_NEWDB	}	else	{		omode |= O_SHLOCK;# endif#endif	}	(void) strcpy(buf, map->map_file);	i = strlen(buf);	if (i < 3 || strcmp(&buf[i - 3], ".db") != 0)		(void) strcat(buf, ".db");	db = dbopen(buf, omode, DBMMODE, DB_HASH, NULL);	if (db == NULL)	{#ifdef MAYBENEXTRELEASE		if (aliaswait(map, ".db", FALSE))			return TRUE;#endif		if (!bitset(MF_OPTIONAL, map->map_mflags))			syserr("Cannot open HASH database %s", map->map_file);		return FALSE;	}#if !OLD_NEWDB && HASFLOCK	fd = db->fd(db);# if !defined(O_EXLOCK)	if (mode == O_RDWR && fd >= 0)	{		if (lockfile(fd, map->map_file, ".db", LOCK_EX))			map->map_mflags |= MF_LOCKED;	}# else	if (mode == O_RDONLY && fd >= 0)		(void) lockfile(fd, map->map_file, ".db", LOCK_UN);	else		map->map_mflags |= MF_LOCKED;# endif#endif	/* try to make sure that at least the database header is on disk */	if (mode == O_RDWR)#if OLD_NEWDB		(void) db->sync(db);#else		(void) db->sync(db, 0);	if (fd >= 0 && fstat(fd, &st) >= 0)		map->map_mtime = st.st_mtime;#endif	map->map_db2 = (void *) db;	if (mode == O_RDONLY && bitset(MF_ALIAS, map->map_mflags))		if (!aliaswait(map, ".db", TRUE))			return FALSE;	return TRUE;}/***  DB_MAP_LOOKUP -- look up a datum in a BTREE- or HASH-type map*/char *db_map_lookup(map, name, av, statp)	MAP *map;	char *name;	char **av;	int *statp;{	DBT key, val;	register DB *db = (DB *) map->map_db2;	int st;	int saveerrno;	int fd;	char keybuf[MAXNAME + 1];	if (tTd(38, 20))		printf("db_map_lookup(%s)\n", name);	key.size = strlen(name);	if (key.size > sizeof keybuf - 1)		key.size = sizeof keybuf - 1;	key.data = keybuf;	bcopy(name, keybuf, key.size + 1);	if (!bitset(MF_NOFOLDCASE, map->map_mflags))		makelower(keybuf);#if !OLD_NEWDB	fd = db->fd(db);	if (fd >= 0 && !bitset(MF_LOCKED, map->map_mflags))		(void) lockfile(db->fd(db), map->map_file, ".db", LOCK_SH);#endif	st = 1;	if (bitset(MF_TRY0NULL, map->map_mflags))	{		st = db->get(db, &key, &val, 0);		if (st == 0)			map->map_mflags &= ~MF_TRY1NULL;	}	if (st != 0 && bitset(MF_TRY1NULL, map->map_mflags))	{		key.size++;		st = db->get(db, &key, &val, 0);		if (st == 0)			map->map_mflags &= ~MF_TRY0NULL;	}	saveerrno = errno;#if !OLD_NEWDB	if (fd >= 0 && !bitset(MF_LOCKED, map->map_mflags))		(void) lockfile(fd, map->map_file, ".db", LOCK_UN);#endif	if (st != 0)	{		errno = saveerrno;		if (st < 0)			syserr("db_map_lookup: get (%s)", name);		return NULL;	}	if (bitset(MF_MATCHONLY, map->map_mflags))		return map_rewrite(map, name, strlen(name), NULL);	else		return map_rewrite(map, val.data, val.size, av);}/***  DB_MAP_STORE -- store a datum in the NEWDB database*/voiddb_map_store(map, lhs, rhs)	register MAP *map;	char *lhs;	char *rhs;{	int stat;	DBT key;	DBT data;	register DB *db = map->map_db2;	if (tTd(38, 20))		printf("db_map_store(%s, %s)\n", lhs, rhs);	key.size = strlen(lhs);	key.data = lhs;	data.size = strlen(rhs);	data.data = rhs;	if (bitset(MF_INCLNULL, map->map_mflags))	{		key.size++;		data.size++;	}	stat = db->put(db, &key, &data, R_NOOVERWRITE);	if (stat > 0)	{		usrerr("050 Warning: duplicate alias name %s", lhs);		stat = db->put(db, &key, &data, 0);	}	if (stat != 0)		syserr("readaliases: db put (%s)", lhs);}/***  DB_MAP_CLOSE -- add distinguished entries and close the database*/voiddb_map_close(map)	MAP *map;{	register DB *db = map->map_db2;	if (tTd(38, 9))		printf("db_map_close(%s, %x)\n", map->map_file, map->map_mflags);	if (bitset(MF_WRITABLE, map->map_mflags))	{		/* write out the distinguished alias */		db_map_store(map, "@", "@");	}	if (db->close(db) != 0)		syserr("readaliases: db close failure");}#endif/***  NIS Modules*/# ifdef NIS# ifndef YPERR_BUSY#  define YPERR_BUSY	16# endif/***  NIS_MAP_OPEN -- open DBM map*/boolnis_map_open(map, mode)	MAP *map;	int mode;{	int yperr;	register char *p;	auto char *vp;	auto int vsize;	char *master;	if (tTd(38, 2))		printf("nis_map_open(%s)\n", map->map_file);	if (mode != O_RDONLY)	{		/* issue a pseudo-error message */#ifdef ENOSYS		errno = ENOSYS;#else# ifdef EFTYPE		errno = EFTYPE;# else		errno = ENXIO;# endif#endif		return FALSE;	}	p = strchr(map->map_file, '@');	if (p != NULL)	{		*p++ = '\0';		if (*p != '\0')			map->map_domain = p;	}	if (*map->map_file == '\0')		map->map_file = "mail.aliases";	if (map->map_domain == NULL)	{		yperr = yp_get_default_domain(&map->map_domain);		if (yperr != 0)		{			if (!bitset(MF_OPTIONAL, map->map_mflags))				syserr("NIS map %s specified, but NIS not running\n",					map->map_file);			return FALSE;		}	}	/* check to see if this map actually exists */	yperr = yp_match(map->map_domain, map->map_file, "@", 1,			&vp, &vsize);	if (tTd(38, 10))		printf("nis_map_open: yp_match(%s, %s) => %s\n",			map->map_domain, map->map_file, yperr_string(yperr));	if (yperr == 0 || yperr == YPERR_KEY || yperr == YPERR_BUSY)		return TRUE;	if (!bitset(MF_OPTIONAL, map->map_mflags))		syserr("Cannot bind to domain %s: %s", map->map_domain,			yperr_string(yperr));	return FALSE;}/***  NIS_MAP_LOOKUP -- look up a datum in a NIS map*/char *nis_map_lookup(map, name, av, statp)	MAP *map;	char *name;	char **av;	int *statp;{	char *vp;	auto int vsize;	int buflen;	int yperr;	char keybuf[MAXNAME + 1];	if (tTd(38, 20))		printf("nis_map_lookup(%s)\n", name);	buflen = strlen(name);	if (buflen > sizeof keybuf - 1)		buflen = sizeof keybuf - 1;	bcopy(name, keybuf, buflen + 1);	if (!bitset(MF_NOFOLDCASE, map->map_mflags))		makelower(keybuf);	yperr = YPERR_KEY;	if (bitset(MF_TRY0NULL, map->map_mflags))	{		yperr = yp_match(map->map_domain, map->map_file, keybuf, buflen,			     &vp, &vsize);		if (yperr == 0)			map->map_mflags &= ~MF_TRY1NULL;	}	if (yperr == YPERR_KEY && bitset(MF_TRY1NULL, map->map_mflags))	{		buflen++;		yperr = yp_match(map->map_domain, map->map_file, keybuf, buflen,			     &vp, &vsize);		if (yperr == 0)			map->map_mflags &= ~MF_TRY0NULL;	}	if (yperr != 0)	{		if (yperr != YPERR_KEY && yperr != YPERR_BUSY)			map->map_mflags &= ~(MF_VALID|MF_OPEN);		return NULL;	}	if (bitset(MF_MATCHONLY, map->map_mflags))		return map_rewrite(map, name, strlen(name), NULL);	else		return map_rewrite(map, vp, vsize, av);}/***  NIS_MAP_STORE*/voidnis_map_store(map, lhs, rhs)	MAP *map;	char *lhs;	char *rhs;{	/* nothing */}/***  NIS_MAP_CLOSE*/voidnis_map_close(map)	MAP *map;{	/* nothing */}#endif /* NIS *//***  STAB (Symbol Table) Modules*//***  STAB_MAP_LOOKUP -- look up alias in symbol table*/char *stab_map_lookup(map, name, av, pstat)	register MAP *map;	char *name;	char **av;	int *pstat;{	register STAB *s;	if (tTd(38, 20))		printf("stab_lookup(%s)\n", name);	s = stab(name, ST_ALIAS, ST_FIND);	if (s != NULL)		return (s->s_alias);	return (NULL);}/***  STAB_MAP_STORE -- store in symtab (actually using during init, not rebuild)*/voidstab_map_store(map, lhs, rhs)	register MAP *map;	char *lhs;	char *rhs;{	register STAB *s;	s = stab(lhs, ST_ALIAS, ST_ENTER);	s->s_alias = newstr(rhs);}/***  STAB_MAP_OPEN -- initialize (reads data file)****	This is a wierd case -- it is only intended as a fallback for**	aliases.  For this reason, opens for write (only during a**	"newaliases") always fails, and opens for read open the**	actual underlying text file instead of the database.*/boolstab_map_open(map, mode)	register MAP *map;	int mode;{	FILE *af;	struct stat st;	if (tTd(38, 2))		printf("stab_map_open(%s)\n", map->map_file);	if (mode != O_RDONLY)	{		errno = ENODEV;		return FALSE;	}	af = fopen(map->map_file, "r");	if (af == NULL)		return FALSE;	readaliases(map, af, TRUE);	if (fstat(fileno(af), &st) >= 0)		map->map_mtime = st.st_mtime;	fclose(af);	return TRUE;}/***  STAB_MAP_CLOSE -- close symbol table.****	Since this is in memory, there is nothing to do.*/voidstab_map_close(map)	MAP *map;{	/* ignore it */}/***  Implicit Modules****	Tries several types.  For back compatibility of aliases.*//***  IMPL_MAP_LOOKUP -- lookup in best open database*/char *impl_map_lookup(map, name, av, pstat)	MAP *map;	char *name;	char **av;	int *pstat;{	if (tTd(38, 20))		printf("impl_map_lookup(%s)\n", name);#ifdef NEWDB	if (bitset(MF_IMPL_HASH, map->map_mflags))		return db_map_lookup(map, name, av, pstat);#endif#ifdef NDBM	if (bitset(MF_IMPL_NDBM, map->map_mflags))		return ndbm_map_lookup(map, name, av, pstat);#endif	return stab_map_lookup(map, name, av, pstat);}/***  IMPL_MAP_STORE -- store in open databases*/voidimpl_map_store(map, lhs, rhs)	MAP *map;	char *lhs;	char *rhs;{#ifdef NEWDB	if (bitset(MF_IMPL_HASH, map->map_mflags))		db_map_store(map, lhs, rhs);#endif#ifdef NDBM	if (bitset(MF_IMPL_NDBM, map->map_mflags))		ndbm_map_store(map, lhs, rhs);#endif	stab_map_store(map, lhs, rhs);}/***  IMPL_MAP_OPEN -- implicit database open*/boolimpl_map_open(map, mode)	MAP *map;	int mode;{	struct stat stb;	if (tTd(38, 2))		printf("impl_map_open(%s, %d)\n", map->map_file, mode);	if (stat(map->map_file, &stb) < 0)	{		/* no alias file at all */		if (tTd(38, 3))			printf("no map file\n");		return FALSE;	}#ifdef NEWDB	map->map_mflags |= MF_IMPL_HASH;	if (hash_map_open(map, mode))	{#if defined(NDBM) && defined(NIS)		if (mode == O_RDONLY || access("/var/yp/Makefile", R_OK) != 0)#endif			return TRUE;	}	else		map->map_mflags &= ~MF_IMPL_HASH;#endif#ifdef NDBM	map->map_mflags |= MF_IMPL_NDBM;	if (ndbm_map_open(map, mode))	{		return TRUE;	}	else		map->map_mflags &= ~MF_IMPL_NDBM;#endif#if defined(NEWDB) || defined(NDBM)	if (Verbose)		message("WARNING: cannot open alias database %s", map->map_file);#else	if (mode != O_RDONLY)		usrerr("Cannot rebuild aliases: no database format defined");#endif	return stab_map_open(map, mode);}/***  IMPL_MAP_CLOSE -- close any open database(s)*/voidimpl_map_close(map)	MAP *map;{#ifdef NEWDB	if (bitset(MF_IMPL_HASH, map->map_mflags))	{		db_map_close(map);		map->map_mflags &= ~MF_IMPL_HASH;	}#endif#ifdef NDBM	if (bitset(MF_IMPL_NDBM, map->map_mflags))	{		ndbm_map_close(map);		map->map_mflags &= ~MF_IMPL_NDBM;	}#endif}/***  NULL stubs*/boolnull_map_open(map, mode)	MAP *map;	int mode;{	return TRUE;}voidnull_map_close(map)	MAP *map;{	return;}voidnull_map_store(map, key, val)	MAP *map;	char *key;	char *val;{	return;}

⌨️ 快捷键说明

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