115666Sralph #ifndef lint 2*17026Sralph static char *sccsid = "@(#)mkhosts.c 4.4 (Berkeley) 84/08/28"; 315666Sralph #endif 415666Sralph 515666Sralph #include <sys/file.h> 615666Sralph #include <stdio.h> 715666Sralph #include <netdb.h> 815666Sralph #include <ndbm.h> 915666Sralph 1015666Sralph char buf[BUFSIZ]; 1115666Sralph 1215666Sralph main(argc, argv) 1315666Sralph char *argv[]; 1415666Sralph { 1515666Sralph DBM *dp; 1615666Sralph register struct hostent *hp; 1715666Sralph datum key, content; 1815666Sralph register char *cp, *tp, **sp; 1915666Sralph register int naliases, *nap; 20*17026Sralph int verbose = 0, entries = 0, maxlen = 0, error = 0; 21*17026Sralph char tempname[BUFSIZ], newname[BUFSIZ]; 2215666Sralph 2315666Sralph if (argc > 1 && strcmp(argv[1], "-v") == 0) { 2415666Sralph verbose++; 2515666Sralph argv++, argc--; 2615666Sralph } 2715666Sralph if (argc != 2) { 2815666Sralph fprintf(stderr, "usage: mkhosts [ -v ] file\n"); 2915666Sralph exit(1); 3015666Sralph } 3116509Sralph if (access(argv[1], R_OK) < 0) { 3216509Sralph perror(argv[1]); 3316509Sralph exit(1); 3416509Sralph } 3515666Sralph umask(0); 36*17026Sralph 37*17026Sralph sprintf(tempname, "%s.new", argv[1]); 38*17026Sralph dp = dbm_open(tempname, O_WRONLY|O_CREAT|O_EXCL, 0644); 3915666Sralph if (dp == NULL) { 40*17026Sralph fprintf(stderr, "dbm_open failed: "); 4115666Sralph perror(argv[1]); 4215666Sralph exit(1); 4315666Sralph } 4416509Sralph sethostfile(argv[1]); 4515666Sralph sethostent(1); 4615666Sralph while (hp = gethostent()) { 4715666Sralph cp = buf; 4815666Sralph tp = hp->h_name; 4915666Sralph while (*cp++ = *tp++) 5015666Sralph ; 5115666Sralph nap = (int *)cp; 5215666Sralph cp += sizeof (int); 5315666Sralph naliases = 0; 5415666Sralph for (sp = hp->h_aliases; *sp; sp++) { 5515666Sralph tp = *sp; 5615666Sralph while (*cp++ = *tp++) 5715666Sralph ; 5815666Sralph naliases++; 5915666Sralph } 6015666Sralph *nap = naliases; 6115666Sralph bcopy((char *)&hp->h_addrtype, cp, sizeof (int)); 6215666Sralph cp += sizeof (int); 6315666Sralph bcopy((char *)&hp->h_length, cp, sizeof (int)); 6415666Sralph cp += sizeof (int); 6515666Sralph bcopy(hp->h_addr, cp, hp->h_length); 6615666Sralph cp += hp->h_length; 6715666Sralph content.dptr = buf; 6815666Sralph content.dsize = cp - buf; 6915666Sralph if (verbose) 7015666Sralph printf("store %s, %d aliases\n", hp->h_name, naliases); 7115666Sralph key.dptr = hp->h_name; 7215666Sralph key.dsize = strlen(hp->h_name); 73*17026Sralph if (dbm_store(dp, key, content, DBM_INSERT) < 0) { 74*17026Sralph perror(hp->h_name); 75*17026Sralph goto err; 76*17026Sralph } 7715666Sralph for (sp = hp->h_aliases; *sp; sp++) { 7815666Sralph key.dptr = *sp; 7915666Sralph key.dsize = strlen(*sp); 80*17026Sralph if (dbm_store(dp, key, content, DBM_INSERT) < 0) { 81*17026Sralph perror(*sp); 82*17026Sralph goto err; 83*17026Sralph } 8415666Sralph } 8515666Sralph key.dptr = hp->h_addr; 8615666Sralph key.dsize = hp->h_length; 87*17026Sralph if (dbm_store(dp, key, content, DBM_INSERT) < 0) { 88*17026Sralph perror("dbm_store host address"); 89*17026Sralph goto err; 90*17026Sralph } 9115666Sralph entries++; 9215666Sralph if (cp - buf > maxlen) 9315666Sralph maxlen = cp - buf; 9415666Sralph } 9515666Sralph endhostent(); 96*17026Sralph dbm_close(dp); 97*17026Sralph 98*17026Sralph sprintf(tempname, "%s.new.pag", argv[1]); 99*17026Sralph sprintf(newname, "%s.pag", argv[1]); 100*17026Sralph if (rename(tempname, newname) < 0) { 101*17026Sralph perror("rename .pag"); 102*17026Sralph exit(1); 103*17026Sralph } 104*17026Sralph sprintf(tempname, "%s.new.dir", argv[1]); 105*17026Sralph sprintf(newname, "%s.dir", argv[1]); 106*17026Sralph if (rename(tempname, newname) < 0) { 107*17026Sralph perror("rename .dir"); 108*17026Sralph exit(1); 109*17026Sralph } 11015666Sralph printf("%d host entries, maximum length %d\n", entries, maxlen); 11115666Sralph exit(0); 112*17026Sralph err: 113*17026Sralph sprintf(tempname, "%s.new.pag", argv[1]); 114*17026Sralph unlink(tempname); 115*17026Sralph sprintf(tempname, "%s.new.dir", argv[1]); 116*17026Sralph unlink(tempname); 117*17026Sralph exit(1); 11815666Sralph } 119