115666Sralph #ifndef lint 2*18004Sbloom static char *sccsid = "@(#)mkhosts.c 4.5 (Berkeley) 85/02/18"; 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; 19*18004Sbloom register int *nap; 20*18004Sbloom int naliases; 2117026Sralph int verbose = 0, entries = 0, maxlen = 0, error = 0; 2217026Sralph char tempname[BUFSIZ], newname[BUFSIZ]; 2315666Sralph 2415666Sralph if (argc > 1 && strcmp(argv[1], "-v") == 0) { 2515666Sralph verbose++; 2615666Sralph argv++, argc--; 2715666Sralph } 2815666Sralph if (argc != 2) { 2915666Sralph fprintf(stderr, "usage: mkhosts [ -v ] file\n"); 3015666Sralph exit(1); 3115666Sralph } 3216509Sralph if (access(argv[1], R_OK) < 0) { 3316509Sralph perror(argv[1]); 3416509Sralph exit(1); 3516509Sralph } 3615666Sralph umask(0); 3717026Sralph 3817026Sralph sprintf(tempname, "%s.new", argv[1]); 3917026Sralph dp = dbm_open(tempname, O_WRONLY|O_CREAT|O_EXCL, 0644); 4015666Sralph if (dp == NULL) { 4117026Sralph fprintf(stderr, "dbm_open failed: "); 4215666Sralph perror(argv[1]); 4315666Sralph exit(1); 4415666Sralph } 4516509Sralph sethostfile(argv[1]); 4615666Sralph sethostent(1); 4715666Sralph while (hp = gethostent()) { 4815666Sralph cp = buf; 4915666Sralph tp = hp->h_name; 5015666Sralph while (*cp++ = *tp++) 5115666Sralph ; 5215666Sralph nap = (int *)cp; 5315666Sralph cp += sizeof (int); 5415666Sralph naliases = 0; 5515666Sralph for (sp = hp->h_aliases; *sp; sp++) { 5615666Sralph tp = *sp; 5715666Sralph while (*cp++ = *tp++) 5815666Sralph ; 5915666Sralph naliases++; 6015666Sralph } 61*18004Sbloom bcopy((char *)&naliases, (char *)nap, sizeof(int)); 6215666Sralph bcopy((char *)&hp->h_addrtype, cp, sizeof (int)); 6315666Sralph cp += sizeof (int); 6415666Sralph bcopy((char *)&hp->h_length, cp, sizeof (int)); 6515666Sralph cp += sizeof (int); 6615666Sralph bcopy(hp->h_addr, cp, hp->h_length); 6715666Sralph cp += hp->h_length; 6815666Sralph content.dptr = buf; 6915666Sralph content.dsize = cp - buf; 7015666Sralph if (verbose) 7115666Sralph printf("store %s, %d aliases\n", hp->h_name, naliases); 7215666Sralph key.dptr = hp->h_name; 7315666Sralph key.dsize = strlen(hp->h_name); 7417026Sralph if (dbm_store(dp, key, content, DBM_INSERT) < 0) { 7517026Sralph perror(hp->h_name); 7617026Sralph goto err; 7717026Sralph } 7815666Sralph for (sp = hp->h_aliases; *sp; sp++) { 7915666Sralph key.dptr = *sp; 8015666Sralph key.dsize = strlen(*sp); 8117026Sralph if (dbm_store(dp, key, content, DBM_INSERT) < 0) { 8217026Sralph perror(*sp); 8317026Sralph goto err; 8417026Sralph } 8515666Sralph } 8615666Sralph key.dptr = hp->h_addr; 8715666Sralph key.dsize = hp->h_length; 8817026Sralph if (dbm_store(dp, key, content, DBM_INSERT) < 0) { 8917026Sralph perror("dbm_store host address"); 9017026Sralph goto err; 9117026Sralph } 9215666Sralph entries++; 9315666Sralph if (cp - buf > maxlen) 9415666Sralph maxlen = cp - buf; 9515666Sralph } 9615666Sralph endhostent(); 9717026Sralph dbm_close(dp); 9817026Sralph 9917026Sralph sprintf(tempname, "%s.new.pag", argv[1]); 10017026Sralph sprintf(newname, "%s.pag", argv[1]); 10117026Sralph if (rename(tempname, newname) < 0) { 10217026Sralph perror("rename .pag"); 10317026Sralph exit(1); 10417026Sralph } 10517026Sralph sprintf(tempname, "%s.new.dir", argv[1]); 10617026Sralph sprintf(newname, "%s.dir", argv[1]); 10717026Sralph if (rename(tempname, newname) < 0) { 10817026Sralph perror("rename .dir"); 10917026Sralph exit(1); 11017026Sralph } 11115666Sralph printf("%d host entries, maximum length %d\n", entries, maxlen); 11215666Sralph exit(0); 11317026Sralph err: 11417026Sralph sprintf(tempname, "%s.new.pag", argv[1]); 11517026Sralph unlink(tempname); 11617026Sralph sprintf(tempname, "%s.new.dir", argv[1]); 11717026Sralph unlink(tempname); 11817026Sralph exit(1); 11915666Sralph } 120