|
|
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.