xref: /original-bsd/old/mkhosts/mkhosts.c (revision 0f30d223)
1 #ifndef lint
2 static	char *sccsid = "@(#)mkhosts.c	4.5 (Berkeley) 85/02/18";
3 #endif
4 
5 #include <sys/file.h>
6 #include <stdio.h>
7 #include <netdb.h>
8 #include <ndbm.h>
9 
10 char	buf[BUFSIZ];
11 
12 main(argc, argv)
13 	char *argv[];
14 {
15 	DBM *dp;
16 	register struct hostent *hp;
17 	datum key, content;
18 	register char *cp, *tp, **sp;
19 	register int *nap;
20 	int naliases;
21 	int verbose = 0, entries = 0, maxlen = 0, error = 0;
22 	char tempname[BUFSIZ], newname[BUFSIZ];
23 
24 	if (argc > 1 && strcmp(argv[1], "-v") == 0) {
25 		verbose++;
26 		argv++, argc--;
27 	}
28 	if (argc != 2) {
29 		fprintf(stderr, "usage: mkhosts [ -v ] file\n");
30 		exit(1);
31 	}
32 	if (access(argv[1], R_OK) < 0) {
33 		perror(argv[1]);
34 		exit(1);
35 	}
36 	umask(0);
37 
38 	sprintf(tempname, "%s.new", argv[1]);
39 	dp = dbm_open(tempname, O_WRONLY|O_CREAT|O_EXCL, 0644);
40 	if (dp == NULL) {
41 		fprintf(stderr, "dbm_open failed: ");
42 		perror(argv[1]);
43 		exit(1);
44 	}
45 	sethostfile(argv[1]);
46 	sethostent(1);
47 	while (hp = gethostent()) {
48 		cp = buf;
49 		tp = hp->h_name;
50 		while (*cp++ = *tp++)
51 			;
52 		nap = (int *)cp;
53 		cp += sizeof (int);
54 		naliases = 0;
55 		for (sp = hp->h_aliases; *sp; sp++) {
56 			tp = *sp;
57 			while (*cp++ = *tp++)
58 				;
59 			naliases++;
60 		}
61 		bcopy((char *)&naliases, (char *)nap, sizeof(int));
62 		bcopy((char *)&hp->h_addrtype, cp, sizeof (int));
63 		cp += sizeof (int);
64 		bcopy((char *)&hp->h_length, cp, sizeof (int));
65 		cp += sizeof (int);
66 		bcopy(hp->h_addr, cp, hp->h_length);
67 		cp += hp->h_length;
68 		content.dptr = buf;
69 		content.dsize = cp - buf;
70 		if (verbose)
71 			printf("store %s, %d aliases\n", hp->h_name, naliases);
72 		key.dptr = hp->h_name;
73 		key.dsize = strlen(hp->h_name);
74 		if (dbm_store(dp, key, content, DBM_INSERT) < 0) {
75 			perror(hp->h_name);
76 			goto err;
77 		}
78 		for (sp = hp->h_aliases; *sp; sp++) {
79 			key.dptr = *sp;
80 			key.dsize = strlen(*sp);
81 			if (dbm_store(dp, key, content, DBM_INSERT) < 0) {
82 				perror(*sp);
83 				goto err;
84 			}
85 		}
86 		key.dptr = hp->h_addr;
87 		key.dsize = hp->h_length;
88 		if (dbm_store(dp, key, content, DBM_INSERT) < 0) {
89 			perror("dbm_store host address");
90 			goto err;
91 		}
92 		entries++;
93 		if (cp - buf > maxlen)
94 			maxlen = cp - buf;
95 	}
96 	endhostent();
97 	dbm_close(dp);
98 
99 	sprintf(tempname, "%s.new.pag", argv[1]);
100 	sprintf(newname, "%s.pag", argv[1]);
101 	if (rename(tempname, newname) < 0) {
102 		perror("rename .pag");
103 		exit(1);
104 	}
105 	sprintf(tempname, "%s.new.dir", argv[1]);
106 	sprintf(newname, "%s.dir", argv[1]);
107 	if (rename(tempname, newname) < 0) {
108 		perror("rename .dir");
109 		exit(1);
110 	}
111 	printf("%d host entries, maximum length %d\n", entries, maxlen);
112 	exit(0);
113 err:
114 	sprintf(tempname, "%s.new.pag", argv[1]);
115 	unlink(tempname);
116 	sprintf(tempname, "%s.new.dir", argv[1]);
117 	unlink(tempname);
118 	exit(1);
119 }
120