|
|
1.1 root 1: /*
2: * Copyright (c) 1983 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted provided
6: * that: (1) source distributions retain this entire copyright notice and
7: * comment, and (2) distributions including binaries display the following
8: * acknowledgement: ``This product includes software developed by the
9: * University of California, Berkeley and its contributors'' in the
10: * documentation or other materials provided with the distribution and in
11: * all advertising materials mentioning features or use of this software.
12: * Neither the name of the University nor the names of its contributors may
13: * be used to endorse or promote products derived from this software without
14: * specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: char copyright[] =
22: "@(#) Copyright (c) 1983 The Regents of the University of California.\n\
23: All rights reserved.\n";
24: #endif /* not lint */
25:
26: #ifndef lint
27: static char sccsid[] = "@(#)mkhosts.c 5.4 (Berkeley) 6/1/90";
28: #endif /* not lint */
29:
30: #include <sys/file.h>
31: #include <stdio.h>
32: #include <netdb.h>
33: #include <ndbm.h>
34:
35: char buf[BUFSIZ];
36:
37: main(argc, argv)
38: char *argv[];
39: {
40: DBM *dp;
41: register struct hostent *hp;
42: datum key, content;
43: register char *cp, *tp, **sp;
44: register int *nap;
45: int naliases;
46: int verbose = 0, entries = 0, maxlen = 0, error = 0;
47: char tempname[BUFSIZ], newname[BUFSIZ];
48:
49: if (argc > 1 && strcmp(argv[1], "-v") == 0) {
50: verbose++;
51: argv++, argc--;
52: }
53: if (argc != 2) {
54: fprintf(stderr, "usage: mkhosts [ -v ] file\n");
55: exit(1);
56: }
57: if (access(argv[1], R_OK) < 0) {
58: perror(argv[1]);
59: exit(1);
60: }
61: umask(0);
62:
63: (void)sprintf(tempname, "%s.new", argv[1]);
64: dp = dbm_open(tempname, O_WRONLY|O_CREAT|O_EXCL, 0644);
65: if (dp == NULL) {
66: fprintf(stderr, "dbm_open failed: ");
67: perror(argv[1]);
68: exit(1);
69: }
70: sethostfile(argv[1]);
71: sethostent(1);
72: while (hp = gethostent()) {
73: cp = buf;
74: tp = hp->h_name;
75: while (*cp++ = *tp++)
76: ;
77: nap = (int *)cp;
78: cp += sizeof (int);
79: naliases = 0;
80: for (sp = hp->h_aliases; *sp; sp++) {
81: tp = *sp;
82: while (*cp++ = *tp++)
83: ;
84: naliases++;
85: }
86: bcopy((char *)&naliases, (char *)nap, sizeof(int));
87: bcopy((char *)&hp->h_addrtype, cp, sizeof (int));
88: cp += sizeof (int);
89: bcopy((char *)&hp->h_length, cp, sizeof (int));
90: cp += sizeof (int);
91: bcopy(hp->h_addr, cp, hp->h_length);
92: cp += hp->h_length;
93: content.dptr = buf;
94: content.dsize = cp - buf;
95: if (verbose)
96: printf("store %s, %d aliases\n", hp->h_name, naliases);
97: key.dptr = hp->h_name;
98: key.dsize = strlen(hp->h_name);
99: if (dbm_store(dp, key, content, DBM_INSERT) < 0) {
100: perror(hp->h_name);
101: goto err;
102: }
103: for (sp = hp->h_aliases; *sp; sp++) {
104: key.dptr = *sp;
105: key.dsize = strlen(*sp);
106: if (dbm_store(dp, key, content, DBM_INSERT) < 0) {
107: perror(*sp);
108: goto err;
109: }
110: }
111: key.dptr = hp->h_addr;
112: key.dsize = hp->h_length;
113: if (dbm_store(dp, key, content, DBM_INSERT) < 0) {
114: perror("dbm_store host address");
115: goto err;
116: }
117: entries++;
118: if (cp - buf > maxlen)
119: maxlen = cp - buf;
120: }
121: endhostent();
122: dbm_close(dp);
123:
124: (void)sprintf(tempname, "%s.new.pag", argv[1]);
125: (void)sprintf(newname, "%s.pag", argv[1]);
126: if (rename(tempname, newname) < 0) {
127: perror("rename .pag");
128: exit(1);
129: }
130: (void)sprintf(tempname, "%s.new.dir", argv[1]);
131: (void)sprintf(newname, "%s.dir", argv[1]);
132: if (rename(tempname, newname) < 0) {
133: perror("rename .dir");
134: exit(1);
135: }
136: printf("%d host entries, maximum length %d\n", entries, maxlen);
137: exit(0);
138: err:
139: (void)sprintf(tempname, "%s.new.pag", argv[1]);
140: unlink(tempname);
141: (void)sprintf(tempname, "%s.new.dir", argv[1]);
142: unlink(tempname);
143: exit(1);
144: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.