📄 map.c
字号:
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 + -