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