2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
10 #include <afsconfig.h>
11 #include <afs/param.h>
16 #include <afs/pthread_glock.h>
17 #include <afs/afsutil.h>
20 #include "cellconfig.h"
23 /* write ThisCell and CellServDB containing exactly one cell's info specified
24 by acellInfo parm. Useful only on the server (which describes only one cell).
28 VerifyEntries(struct afsconf_cell
*aci
)
33 for (i
= 0; i
< aci
->numServers
; i
++) {
34 if (aci
->hostAddr
[i
].sin_addr
.s_addr
== 0) {
35 /* no address spec'd */
36 if (*(aci
->hostName
[i
]) != 0) {
38 struct addrinfo hints
;
39 struct addrinfo
*result
;
42 memset(&hints
, 0, sizeof(struct addrinfo
));
43 hints
.ai_family
= AF_INET
;
44 hints
.ai_socktype
= SOCK_DGRAM
;
46 code
= getaddrinfo(aci
->hostName
[i
], NULL
, &hints
, &result
);
48 printf("Host %s not found in host database...\n",
50 return AFSCONF_FAILURE
;
52 for (rp
= result
; rp
!= NULL
; rp
= rp
->ai_next
) {
53 struct sockaddr_in
*sa
= (struct sockaddr_in
*)rp
->ai_addr
;
54 if (!rx_IsLoopbackAddr(ntohl(sa
->sin_addr
.s_addr
))) {
55 aci
->hostAddr
[i
].sin_addr
.s_addr
= sa
->sin_addr
.s_addr
;
60 if (aci
->hostAddr
[i
].sin_addr
.s_addr
== 0) {
61 printf("No non-loopback addresses found for host %s\n",
63 return AFSCONF_FAILURE
;
66 /* otherwise we're deleting this entry */
68 /* address spec'd, perhaps no name known */
69 if (aci
->hostName
[i
][0] != 0)
70 continue; /* name known too */
71 /* figure out name, if possible */
72 th
= gethostbyaddr((char *)(&aci
->hostAddr
[i
].sin_addr
), 4,
75 strcpy(aci
->hostName
[i
], "UNKNOWNHOST");
77 if (strlcpy(aci
->hostName
[i
],
79 sizeof(aci
->hostName
[i
]))
80 >= sizeof(aci
->hostName
[i
])) {
81 strcpy(aci
->hostName
[i
], "UNKNOWNHOST");
89 /* Changed the interface to accept the afsconf_dir datastructure.
90 This is a handle to the internal cache that is maintained by the bosserver.
94 afsconf_SetCellInfo(struct afsconf_dir
*adir
, const char *apath
,
95 struct afsconf_cell
*acellInfo
)
99 code
= afsconf_SetExtendedCellInfo(adir
, apath
, acellInfo
, NULL
);
104 afsconf_SetExtendedCellInfo(struct afsconf_dir
*adir
,
106 struct afsconf_cell
*acellInfo
, char clones
[])
115 /* write ThisCell file */
116 strcompose(tbuffer
, 1024, apath
, "/", AFSDIR_THISCELL_FILE
, (char *)NULL
);
118 fd
= open(tbuffer
, O_RDWR
| O_CREAT
| O_TRUNC
, 0666);
123 i
= (int)strlen(acellInfo
->name
);
124 code
= write(fd
, acellInfo
->name
, i
);
127 return AFSCONF_FAILURE
;
134 /* make sure we have both name and address for each host, looking up other
136 code
= VerifyEntries(acellInfo
);
142 /* write CellServDB */
143 strcompose(tbuffer
, 1024, apath
, "/", AFSDIR_CELLSERVDB_FILE
, (char *)NULL
);
144 tf
= fopen(tbuffer
, "w");
147 return AFSCONF_NOTFOUND
;
149 fprintf(tf
, ">%s #Cell name\n", acellInfo
->name
);
150 for (i
= 0; i
< acellInfo
->numServers
; i
++) {
151 code
= acellInfo
->hostAddr
[i
].sin_addr
.s_addr
; /* net order */
153 continue; /* delete request */
154 code
= ntohl(code
); /* convert to host order */
155 if (clones
&& clones
[i
])
156 fprintf(tf
, "[%d.%d.%d.%d] #%s\n", (code
>> 24) & 0xff,
157 (code
>> 16) & 0xff, (code
>> 8) & 0xff, code
& 0xff,
158 acellInfo
->hostName
[i
]);
160 fprintf(tf
, "%d.%d.%d.%d #%s\n", (code
>> 24) & 0xff,
161 (code
>> 16) & 0xff, (code
>> 8) & 0xff, code
& 0xff,
162 acellInfo
->hostName
[i
]);
167 return AFSCONF_FAILURE
;
171 /* Reset the timestamp in the cache, so that
172 * the CellServDB is read into the cache next time.
173 * Resolves the lost update problem due to an inconsistent cache
180 return AFSCONF_FAILURE
;