xref: /csrg-svn/old/mkhosts/mkhosts.c (revision 17026)
115666Sralph #ifndef lint
2*17026Sralph static	char *sccsid = "@(#)mkhosts.c	4.4 (Berkeley) 84/08/28";
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;
1915666Sralph 	register int naliases, *nap;
20*17026Sralph 	int verbose = 0, entries = 0, maxlen = 0, error = 0;
21*17026Sralph 	char tempname[BUFSIZ], newname[BUFSIZ];
2215666Sralph 
2315666Sralph 	if (argc > 1 && strcmp(argv[1], "-v") == 0) {
2415666Sralph 		verbose++;
2515666Sralph 		argv++, argc--;
2615666Sralph 	}
2715666Sralph 	if (argc != 2) {
2815666Sralph 		fprintf(stderr, "usage: mkhosts [ -v ] file\n");
2915666Sralph 		exit(1);
3015666Sralph 	}
3116509Sralph 	if (access(argv[1], R_OK) < 0) {
3216509Sralph 		perror(argv[1]);
3316509Sralph 		exit(1);
3416509Sralph 	}
3515666Sralph 	umask(0);
36*17026Sralph 
37*17026Sralph 	sprintf(tempname, "%s.new", argv[1]);
38*17026Sralph 	dp = dbm_open(tempname, O_WRONLY|O_CREAT|O_EXCL, 0644);
3915666Sralph 	if (dp == NULL) {
40*17026Sralph 		fprintf(stderr, "dbm_open failed: ");
4115666Sralph 		perror(argv[1]);
4215666Sralph 		exit(1);
4315666Sralph 	}
4416509Sralph 	sethostfile(argv[1]);
4515666Sralph 	sethostent(1);
4615666Sralph 	while (hp = gethostent()) {
4715666Sralph 		cp = buf;
4815666Sralph 		tp = hp->h_name;
4915666Sralph 		while (*cp++ = *tp++)
5015666Sralph 			;
5115666Sralph 		nap = (int *)cp;
5215666Sralph 		cp += sizeof (int);
5315666Sralph 		naliases = 0;
5415666Sralph 		for (sp = hp->h_aliases; *sp; sp++) {
5515666Sralph 			tp = *sp;
5615666Sralph 			while (*cp++ = *tp++)
5715666Sralph 				;
5815666Sralph 			naliases++;
5915666Sralph 		}
6015666Sralph 		*nap = naliases;
6115666Sralph 		bcopy((char *)&hp->h_addrtype, cp, sizeof (int));
6215666Sralph 		cp += sizeof (int);
6315666Sralph 		bcopy((char *)&hp->h_length, cp, sizeof (int));
6415666Sralph 		cp += sizeof (int);
6515666Sralph 		bcopy(hp->h_addr, cp, hp->h_length);
6615666Sralph 		cp += hp->h_length;
6715666Sralph 		content.dptr = buf;
6815666Sralph 		content.dsize = cp - buf;
6915666Sralph 		if (verbose)
7015666Sralph 			printf("store %s, %d aliases\n", hp->h_name, naliases);
7115666Sralph 		key.dptr = hp->h_name;
7215666Sralph 		key.dsize = strlen(hp->h_name);
73*17026Sralph 		if (dbm_store(dp, key, content, DBM_INSERT) < 0) {
74*17026Sralph 			perror(hp->h_name);
75*17026Sralph 			goto err;
76*17026Sralph 		}
7715666Sralph 		for (sp = hp->h_aliases; *sp; sp++) {
7815666Sralph 			key.dptr = *sp;
7915666Sralph 			key.dsize = strlen(*sp);
80*17026Sralph 			if (dbm_store(dp, key, content, DBM_INSERT) < 0) {
81*17026Sralph 				perror(*sp);
82*17026Sralph 				goto err;
83*17026Sralph 			}
8415666Sralph 		}
8515666Sralph 		key.dptr = hp->h_addr;
8615666Sralph 		key.dsize = hp->h_length;
87*17026Sralph 		if (dbm_store(dp, key, content, DBM_INSERT) < 0) {
88*17026Sralph 			perror("dbm_store host address");
89*17026Sralph 			goto err;
90*17026Sralph 		}
9115666Sralph 		entries++;
9215666Sralph 		if (cp - buf > maxlen)
9315666Sralph 			maxlen = cp - buf;
9415666Sralph 	}
9515666Sralph 	endhostent();
96*17026Sralph 	dbm_close(dp);
97*17026Sralph 
98*17026Sralph 	sprintf(tempname, "%s.new.pag", argv[1]);
99*17026Sralph 	sprintf(newname, "%s.pag", argv[1]);
100*17026Sralph 	if (rename(tempname, newname) < 0) {
101*17026Sralph 		perror("rename .pag");
102*17026Sralph 		exit(1);
103*17026Sralph 	}
104*17026Sralph 	sprintf(tempname, "%s.new.dir", argv[1]);
105*17026Sralph 	sprintf(newname, "%s.dir", argv[1]);
106*17026Sralph 	if (rename(tempname, newname) < 0) {
107*17026Sralph 		perror("rename .dir");
108*17026Sralph 		exit(1);
109*17026Sralph 	}
11015666Sralph 	printf("%d host entries, maximum length %d\n", entries, maxlen);
11115666Sralph 	exit(0);
112*17026Sralph err:
113*17026Sralph 	sprintf(tempname, "%s.new.pag", argv[1]);
114*17026Sralph 	unlink(tempname);
115*17026Sralph 	sprintf(tempname, "%s.new.dir", argv[1]);
116*17026Sralph 	unlink(tempname);
117*17026Sralph 	exit(1);
11815666Sralph }
119