mkalias.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 215 行
C
215 行
#ifndef lintstatic char *sccsid = "@(#)mkalias.c 4.1 ULTRIX 7/2/90";#endif lint/**************************************************************** * * * Licensed to Digital Equipment Corporation, Maynard, MA * * Copyright 1985 Sun Microsystems, Inc. * * All rights reserved. * * * ****************************************************************//* * mkmap - program to convert the mail.aliases map into an * inverse map of <user@host> back to <preferred-alias> */# include <sys/file.h># include <ndbm.h># include <stdio.h># include <ctype.h>/* from ypdefs.h USE_YP_PREFIX */ static char yp_prefix[] = "YP_"; static int yp_prefix_sz = sizeof (yp_prefix) - 1;/* from ypdefs.h USE_YP_MASTER_NAME */ static char yp_master_name[] = "YP_MASTER_NAME"; static int yp_master_name_sz = sizeof (yp_master_name) - 1;/* from ypdefs.h USE_YP_LAST_MODIFIED */ static char yp_last_modified[] = "YP_LAST_MODIFIED"; static int yp_last_modified_sz = sizeof (yp_last_modified) - 1;char *index(), *rindex();int Verbose = 0; /* to get the gory details */DBM *Indbm, *Scandbm, *Outdbm;IsMailingList(s) { /* * returns true if the given string is a mailing list */ char *p; if ( index(s,',') ) return(1); if ( index(s,'|') ) return(1); p = index(s,':'); if (p && strncmp(p,":include:")) return(1); return(0); }IsQualified(s,p) char *s; /* input string */ char *p; /* output: user part */ { /* * returns true if the given string is qualified with a host name */ register char *middle; middle = index(s,'@'); if ( middle ) { for (middle=s; *middle != '@'; *p++ = *middle++) continue; *p = '\0'; return(1); } middle = rindex(s,'!'); if ( middle ) { strcpy(p, middle+1); return(1); } return(0); }IsMaint(s) char *s; { /* * returns true if the given string is one of the maintenence * strings used in sendmail or YP. */ if (*s=='@') return(1); if (strncmp(s, yp_prefix, yp_prefix_sz)==0) return(1); return(0); }CopyName(dst, src) register char *dst, *src; { /* * copy a string, but ignore white space */ while (*src != '\0' && isspace(*src)) src++; while (*src) *dst++ = *src++; *dst = '\0'; }Compare(s1, s2) register char *s1, *s2; { /* * compare strings, but ignore white space */ while (*s1 != '\0' && isspace(*s1)) s1++; while (*s2 != '\0' && isspace(*s2)) s2++; return(strcmp(s1,s2)); }ProcessMap() { datum key, value, part, partvalue; char address[PBLKSIZ]; /* qualified version */ char user[PBLKSIZ]; /* unqualified version */ char userpart[PBLKSIZ]; /* unqualified part of qualified addr. */ for (key = dbm_firstkey(Scandbm); key.dptr != NULL; key = dbm_nextkey(Scandbm)) { value = dbm_fetch(Indbm, key); CopyName(address, value.dptr); CopyName(user, key.dptr); if (address == NULL) continue; if (IsMailingList(address)) continue; if (!IsQualified(address, userpart)) continue; if (IsMaint(user)) continue; part.dptr = userpart; part.dsize = strlen(userpart) + 1; partvalue = dbm_fetch(Indbm, part); value.dptr = address; value.dsize = strlen(address) + 1; if (partvalue.dptr != NULL && Compare(partvalue.dptr,user)==0 ) { dbm_store(Outdbm, value, part, DBM_REPLACE); if (Verbose) printf("%s --> %s --> %s\n", userpart, user, address); } else { key.dptr = user; key.dsize = strlen(user) + 1; dbm_store(Outdbm, value, key, DBM_REPLACE); if (Verbose) printf("%s --> %s\n", user, address); } } }AddYPEntries() { datum key, value; char last_modified[PBLKSIZ]; char host_name[PBLKSIZ]; long now; /* * Add the special Yellow pages entries. */ key.dptr = yp_last_modified; key.dsize = yp_last_modified_sz; time(&now); sprintf(last_modified,"%10.10d",now); value.dptr = last_modified; value.dsize = strlen(value.dptr); dbm_store(Outdbm, key, value); key.dptr = yp_master_name; key.dsize = yp_master_name_sz; gethostname(host_name, sizeof(host_name) ); value.dptr = host_name; value.dsize = strlen(value.dptr); dbm_store(Outdbm, key, value); }main(argc, argv) int argc; char **argv;{ while (argc > 1 && argv[1][0] == '-') { switch (argv[1][1]) { case 'v': Verbose = 1; break; default: printf("Unknown option %c\n", argv[1][1]); break; } argc--; argv++; } if (argc != 3) { printf("Usage: mkalias <input> <output>\n"); exit(1); } Indbm = dbm_open(argv[1], O_RDONLY, 0); if (Indbm==NULL) { printf("Unable to open input database %s\n", argv[1]); exit(1); } Scandbm = dbm_open(argv[1], O_RDONLY, 0); if (Scandbm==NULL) { printf("Unable to open input database %s\n", argv[1]); exit(1); } Outdbm = dbm_open(argv[2], O_RDWR|O_CREAT|O_TRUNC, 0644); if (Outdbm==NULL) { printf("Unable to open output database %s\n", argv[2]); exit(1); } ProcessMap(); AddYPEntries(); dbm_close(Indbm); dbm_close(Scandbm); dbm_close(Outdbm);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?