1
0
Files
irix-657m-src/eoe/cmd/sun/yp/mkalias.c
2022-09-29 17:59:04 +03:00

209 lines
4.7 KiB
C

#ifndef lint
static char sccsid[] = "@(#)mkalias.c 1.1 88/03/07 4.0NFSSRC Copyr 1988 Sun Micro";
#endif
/*
* mkmap - program to convert the mail.aliases map into an
* inverse map of <user@host> back to <preferred-alias>
*/
#include <stdio.h>
#include <ctype.h>
#include <ndbm.h>
#include <strings.h>
#include <sys/file.h>
#include "ypdefs.h"
USE_YP_PREFIX
USE_YP_MASTER_NAME
USE_YP_LAST_MODIFIED
int Verbose = 0; /* to get the gory details */
char inclstr[] = ":include:";
DBM *Indbm, *Scandbm, *Outdbm;
IsMailingList(s)
char *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,inclstr,strlen(inclstr))) 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 NIS.
*/
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);
if (value.dptr == NULL) continue;
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 NIS 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, DBM_INSERT);
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, DBM_INSERT);
}
usage()
{
(void) fprintf(stderr, "Usage: mkalias <input> <output>\n");
exit(1);
}
main(argc, argv)
int argc;
char **argv;
{
extern char *optarg;
extern int optind;
int i;
while ((i = getopt(argc, argv, "v")) != EOF) {
switch (i) {
case 'v':
Verbose = 1;
break;
default:
usage();
}
}
if (optind != argc - 2) {
usage();
}
Indbm = dbm_open(argv[optind], O_RDONLY, 0);
if (Indbm==NULL) {
printf("Unable to open input database %s\n", argv[optind]);
exit(1);
}
Scandbm = dbm_open(argv[optind], O_RDONLY, 0);
if (Scandbm==NULL) {
printf("Unable to open input database %s\n", argv[optind]);
exit(1);
}
Outdbm = dbm_open(argv[optind+1], O_RDWR|O_CREAT|O_TRUNC, 0644);
if (Outdbm==NULL) {
printf("Unable to open output database %s\n", argv[optind+1]);
exit(1);
}
ProcessMap();
AddYPEntries();
dbm_close(Indbm);
dbm_close(Scandbm);
dbm_close(Outdbm);
}