xref: /csrg-svn/old/mkhosts/mkhosts.c (revision 18004)
115666Sralph #ifndef lint
2*18004Sbloom static	char *sccsid = "@(#)mkhosts.c	4.5 (Berkeley) 85/02/18";
315666Sralph #endif
415666Sralph 
515666Sralph #include <sys/file.h>
615666Sralph #include <stdio.h>
715666Sralph #include <netdb.h>
815666Sralph #include <ndbm.h>
915666Sralph 
1015666Sralph char	buf[BUFSIZ];
1115666Sralph 
1215666Sralph main(argc, argv)
1315666Sralph 	char *argv[];
1415666Sralph {
1515666Sralph 	DBM *dp;
1615666Sralph 	register struct hostent *hp;
1715666Sralph 	datum key, content;
1815666Sralph 	register char *cp, *tp, **sp;
19*18004Sbloom 	register int *nap;
20*18004Sbloom 	int naliases;
2117026Sralph 	int verbose = 0, entries = 0, maxlen = 0, error = 0;
2217026Sralph 	char tempname[BUFSIZ], newname[BUFSIZ];
2315666Sralph 
2415666Sralph 	if (argc > 1 && strcmp(argv[1], "-v") == 0) {
2515666Sralph 		verbose++;
2615666Sralph 		argv++, argc--;
2715666Sralph 	}
2815666Sralph 	if (argc != 2) {
2915666Sralph 		fprintf(stderr, "usage: mkhosts [ -v ] file\n");
3015666Sralph 		exit(1);
3115666Sralph 	}
3216509Sralph 	if (access(argv[1], R_OK) < 0) {
3316509Sralph 		perror(argv[1]);
3416509Sralph 		exit(1);
3516509Sralph 	}
3615666Sralph 	umask(0);
3717026Sralph 
3817026Sralph 	sprintf(tempname, "%s.new", argv[1]);
3917026Sralph 	dp = dbm_open(tempname, O_WRONLY|O_CREAT|O_EXCL, 0644);
4015666Sralph 	if (dp == NULL) {
4117026Sralph 		fprintf(stderr, "dbm_open failed: ");
4215666Sralph 		perror(argv[1]);
4315666Sralph 		exit(1);
4415666Sralph 	}
4516509Sralph 	sethostfile(argv[1]);
4615666Sralph 	sethostent(1);
4715666Sralph 	while (hp = gethostent()) {
4815666Sralph 		cp = buf;
4915666Sralph 		tp = hp->h_name;
5015666Sralph 		while (*cp++ = *tp++)
5115666Sralph 			;
5215666Sralph 		nap = (int *)cp;
5315666Sralph 		cp += sizeof (int);
5415666Sralph 		naliases = 0;
5515666Sralph 		for (sp = hp->h_aliases; *sp; sp++) {
5615666Sralph 			tp = *sp;
5715666Sralph 			while (*cp++ = *tp++)
5815666Sralph 				;
5915666Sralph 			naliases++;
6015666Sralph 		}
61*18004Sbloom 		bcopy((char *)&naliases, (char *)nap, sizeof(int));
6215666Sralph 		bcopy((char *)&hp->h_addrtype, cp, sizeof (int));
6315666Sralph 		cp += sizeof (int);
6415666Sralph 		bcopy((char *)&hp->h_length, cp, sizeof (int));
6515666Sralph 		cp += sizeof (int);
6615666Sralph 		bcopy(hp->h_addr, cp, hp->h_length);
6715666Sralph 		cp += hp->h_length;
6815666Sralph 		content.dptr = buf;
6915666Sralph 		content.dsize = cp - buf;
7015666Sralph 		if (verbose)
7115666Sralph 			printf("store %s, %d aliases\n", hp->h_name, naliases);
7215666Sralph 		key.dptr = hp->h_name;
7315666Sralph 		key.dsize = strlen(hp->h_name);
7417026Sralph 		if (dbm_store(dp, key, content, DBM_INSERT) < 0) {
7517026Sralph 			perror(hp->h_name);
7617026Sralph 			goto err;
7717026Sralph 		}
7815666Sralph 		for (sp = hp->h_aliases; *sp; sp++) {
7915666Sralph 			key.dptr = *sp;
8015666Sralph 			key.dsize = strlen(*sp);
8117026Sralph 			if (dbm_store(dp, key, content, DBM_INSERT) < 0) {
8217026Sralph 				perror(*sp);
8317026Sralph 				goto err;
8417026Sralph 			}
8515666Sralph 		}
8615666Sralph 		key.dptr = hp->h_addr;
8715666Sralph 		key.dsize = hp->h_length;
8817026Sralph 		if (dbm_store(dp, key, content, DBM_INSERT) < 0) {
8917026Sralph 			perror("dbm_store host address");
9017026Sralph 			goto err;
9117026Sralph 		}
9215666Sralph 		entries++;
9315666Sralph 		if (cp - buf > maxlen)
9415666Sralph 			maxlen = cp - buf;
9515666Sralph 	}
9615666Sralph 	endhostent();
9717026Sralph 	dbm_close(dp);
9817026Sralph 
9917026Sralph 	sprintf(tempname, "%s.new.pag", argv[1]);
10017026Sralph 	sprintf(newname, "%s.pag", argv[1]);
10117026Sralph 	if (rename(tempname, newname) < 0) {
10217026Sralph 		perror("rename .pag");
10317026Sralph 		exit(1);
10417026Sralph 	}
10517026Sralph 	sprintf(tempname, "%s.new.dir", argv[1]);
10617026Sralph 	sprintf(newname, "%s.dir", argv[1]);
10717026Sralph 	if (rename(tempname, newname) < 0) {
10817026Sralph 		perror("rename .dir");
10917026Sralph 		exit(1);
11017026Sralph 	}
11115666Sralph 	printf("%d host entries, maximum length %d\n", entries, maxlen);
11215666Sralph 	exit(0);
11317026Sralph err:
11417026Sralph 	sprintf(tempname, "%s.new.pag", argv[1]);
11517026Sralph 	unlink(tempname);
11617026Sralph 	sprintf(tempname, "%s.new.dir", argv[1]);
11717026Sralph 	unlink(tempname);
11817026Sralph 	exit(1);
11915666Sralph }
120