xref: /csrg-svn/old/mkhosts/mkhosts.c (revision 15666)
1*15666Sralph #ifndef lint
2*15666Sralph static	char *sccsid = "@(#)mkhosts.c	4.1 (Berkeley) 83/12/05";
3*15666Sralph #endif
4*15666Sralph 
5*15666Sralph #include <sys/file.h>
6*15666Sralph #include <stdio.h>
7*15666Sralph #include <netdb.h>
8*15666Sralph #include <ndbm.h>
9*15666Sralph 
10*15666Sralph char	buf[BUFSIZ];
11*15666Sralph 
12*15666Sralph main(argc, argv)
13*15666Sralph 	char *argv[];
14*15666Sralph {
15*15666Sralph 	DBM *dp;
16*15666Sralph 	register struct hostent *hp;
17*15666Sralph 	datum key, content;
18*15666Sralph 	register char *cp, *tp, **sp;
19*15666Sralph 	register int naliases, *nap;
20*15666Sralph 	int verbose = 0, entries = 0, maxlen = 0;
21*15666Sralph 
22*15666Sralph 	if (argc > 1 && strcmp(argv[1], "-v") == 0) {
23*15666Sralph 		verbose++;
24*15666Sralph 		argv++, argc--;
25*15666Sralph 	}
26*15666Sralph 	if (argc != 2) {
27*15666Sralph 		fprintf(stderr, "usage: mkhosts [ -v ] file\n");
28*15666Sralph 		exit(1);
29*15666Sralph 	}
30*15666Sralph 	umask(0);
31*15666Sralph 	dp = ndbmopen(argv[1], O_WRONLY|O_CREAT|O_EXCL, 0644);
32*15666Sralph 	if (dp == NULL) {
33*15666Sralph 		fprintf(stderr, "dbminit failed: ");
34*15666Sralph 		perror(argv[1]);
35*15666Sralph 		exit(1);
36*15666Sralph 	}
37*15666Sralph 	dp->db_maxbno = 0;
38*15666Sralph 	sethostent(1);
39*15666Sralph 	while (hp = gethostent()) {
40*15666Sralph 		cp = buf;
41*15666Sralph 		tp = hp->h_name;
42*15666Sralph 		while (*cp++ = *tp++)
43*15666Sralph 			;
44*15666Sralph 		nap = (int *)cp;
45*15666Sralph 		cp += sizeof (int);
46*15666Sralph 		naliases = 0;
47*15666Sralph 		for (sp = hp->h_aliases; *sp; sp++) {
48*15666Sralph 			tp = *sp;
49*15666Sralph 			while (*cp++ = *tp++)
50*15666Sralph 				;
51*15666Sralph 			naliases++;
52*15666Sralph 		}
53*15666Sralph 		*nap = naliases;
54*15666Sralph 		bcopy((char *)&hp->h_addrtype, cp, sizeof (int));
55*15666Sralph 		cp += sizeof (int);
56*15666Sralph 		bcopy((char *)&hp->h_length, cp, sizeof (int));
57*15666Sralph 		cp += sizeof (int);
58*15666Sralph 		bcopy(hp->h_addr, cp, hp->h_length);
59*15666Sralph 		cp += hp->h_length;
60*15666Sralph 		content.dptr = buf;
61*15666Sralph 		content.dsize = cp - buf;
62*15666Sralph 		if (verbose)
63*15666Sralph 			printf("store %s, %d aliases\n", hp->h_name, naliases);
64*15666Sralph 		key.dptr = hp->h_name;
65*15666Sralph 		key.dsize = strlen(hp->h_name);
66*15666Sralph 		dbmstore(dp, key, content);
67*15666Sralph 		for (sp = hp->h_aliases; *sp; sp++) {
68*15666Sralph 			key.dptr = *sp;
69*15666Sralph 			key.dsize = strlen(*sp);
70*15666Sralph 			dbmstore(dp, key, content);
71*15666Sralph 		}
72*15666Sralph 		key.dptr = hp->h_addr;
73*15666Sralph 		key.dsize = hp->h_length;
74*15666Sralph 		dbmstore(dp, key, content);
75*15666Sralph 		entries++;
76*15666Sralph 		if (cp - buf > maxlen)
77*15666Sralph 			maxlen = cp - buf;
78*15666Sralph 	}
79*15666Sralph 	endhostent();
80*15666Sralph 	printf("%d host entries, maximum length %d\n", entries, maxlen);
81*15666Sralph 	exit(0);
82*15666Sralph }
83