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