関数 | |
static const char * | get_service_from_locate_service_type (enum locate_service_type svc) |
static const char * | locate_service_type_name (enum locate_service_type svc) |
static const char * | socktype_name (int socktype) |
static const char * | family_name (int family) |
static int | smb_krb5_locator_lookup_sanity_check (enum locate_service_type svc, const char *realm, int socktype, int family) |
Check input parameters, return KRB5_PLUGIN_NO_HANDLE for unsupported ones | |
static krb5_error_code | smb_krb5_locator_call_cbfunc (const char *name, const char *service, struct addrinfo *in, int(*cbfunc)(void *, int, struct sockaddr *), void *cbdata) |
Try to get addrinfo for a given host and call the krb5 callback | |
krb5_error_code | smb_krb5_locator_init (krb5_context context, void **private_data) |
PUBLIC INTERFACE: locate init | |
void | smb_krb5_locator_close (void *private_data) |
PUBLIC INTERFACE: close locate | |
krb5_error_code | smb_krb5_locator_lookup (void *private_data, enum locate_service_type svc, const char *realm, int socktype, int family, int(*cbfunc)(void *, int, struct sockaddr *), void *cbdata) |
PUBLIC INTERFACE: locate lookup | |
変数 | |
const krb5plugin_service_locate_ftable | SMB_KRB5_LOCATOR_SYMBOL_NAME |
static const char* get_service_from_locate_service_type | ( | enum locate_service_type | svc | ) | [static] |
smb_krb5_locator.c の 27 行で定義されています。
参照元 smb_krb5_locator_lookup().
00028 { 00029 switch (svc) { 00030 case locate_service_kdc: 00031 case locate_service_master_kdc: 00032 return "88"; 00033 case locate_service_kadmin: 00034 case locate_service_krb524: 00035 /* not supported */ 00036 return NULL; 00037 case locate_service_kpasswd: 00038 return "464"; 00039 default: 00040 break; 00041 } 00042 return NULL; 00043 00044 }
static const char* locate_service_type_name | ( | enum locate_service_type | svc | ) | [static] |
smb_krb5_locator.c の 46 行で定義されています。
参照元 smb_krb5_locator_lookup().
00047 { 00048 switch (svc) { 00049 case locate_service_kdc: 00050 return "locate_service_kdc"; 00051 case locate_service_master_kdc: 00052 return "locate_service_master_kdc"; 00053 case locate_service_kadmin: 00054 return "locate_service_kadmin"; 00055 case locate_service_krb524: 00056 return "locate_service_krb524"; 00057 case locate_service_kpasswd: 00058 return "locate_service_kpasswd"; 00059 default: 00060 break; 00061 } 00062 return NULL; 00063 }
static const char* socktype_name | ( | int | socktype | ) | [static] |
smb_krb5_locator.c の 65 行で定義されています。
参照元 smb_krb5_locator_lookup().
00066 { 00067 switch (socktype) { 00068 case SOCK_STREAM: 00069 return "SOCK_STREAM"; 00070 case SOCK_DGRAM: 00071 return "SOCK_DGRAM"; 00072 default: 00073 break; 00074 } 00075 return "unknown"; 00076 }
static const char* family_name | ( | int | family | ) | [static] |
smb_krb5_locator.c の 78 行で定義されています。
参照元 smb_krb5_locator_lookup().
00079 { 00080 switch (family) { 00081 case AF_UNSPEC: 00082 return "AF_UNSPEC"; 00083 case AF_INET: 00084 return "AF_INET"; 00085 case AF_INET6: 00086 return "AF_INET6"; 00087 default: 00088 break; 00089 } 00090 return "unknown"; 00091 }
static int smb_krb5_locator_lookup_sanity_check | ( | enum locate_service_type | svc, | |
const char * | realm, | |||
int | socktype, | |||
int | family | |||
) | [static] |
Check input parameters, return KRB5_PLUGIN_NO_HANDLE for unsupported ones
svc | ||
realm | string | |
socktype | integer | |
family | integer |
smb_krb5_locator.c の 104 行で定義されています。
参照元 smb_krb5_locator_lookup().
00108 { 00109 if (!realm || strlen(realm) == 0) { 00110 return EINVAL; 00111 } 00112 00113 switch (svc) { 00114 case locate_service_kdc: 00115 case locate_service_master_kdc: 00116 case locate_service_kpasswd: 00117 break; 00118 case locate_service_kadmin: 00119 case locate_service_krb524: 00120 #ifdef KRB5_PLUGIN_NO_HANDLE 00121 return KRB5_PLUGIN_NO_HANDLE; 00122 #else 00123 return KRB5_KDC_UNREACH; /* Heimdal */ 00124 #endif 00125 default: 00126 return EINVAL; 00127 } 00128 00129 switch (family) { 00130 case AF_UNSPEC: 00131 case AF_INET: 00132 break; 00133 case AF_INET6: /* not yet */ 00134 #ifdef KRB5_PLUGIN_NO_HANDLE 00135 return KRB5_PLUGIN_NO_HANDLE; 00136 #else 00137 return KRB5_KDC_UNREACH; /* Heimdal */ 00138 #endif 00139 default: 00140 return EINVAL; 00141 } 00142 00143 switch (socktype) { 00144 case SOCK_STREAM: 00145 case SOCK_DGRAM: 00146 case 0: /* Heimdal uses that */ 00147 break; 00148 default: 00149 return EINVAL; 00150 } 00151 00152 return 0; 00153 }
static krb5_error_code smb_krb5_locator_call_cbfunc | ( | const char * | name, | |
const char * | service, | |||
struct addrinfo * | in, | |||
int(*)(void *, int, struct sockaddr *) | cbfunc, | |||
void * | cbdata | |||
) | [static] |
Try to get addrinfo for a given host and call the krb5 callback
name | string | |
service | string | |
in | struct addrinfo hint | |
cbfunc | krb5 callback function | |
cbdata | void pointer cbdata |
smb_krb5_locator.c の 167 行で定義されています。
参照元 smb_krb5_locator_lookup().
00172 { 00173 struct addrinfo *out; 00174 int ret; 00175 int count = 3; 00176 00177 while (count) { 00178 00179 ret = getaddrinfo(name, service, in, &out); 00180 if (ret == 0) { 00181 break; 00182 } 00183 00184 if (ret == EAI_AGAIN) { 00185 count--; 00186 continue; 00187 } 00188 00189 DEBUG(10,("smb_krb5_locator_lookup: got ret: %s (%d)\n", 00190 gai_strerror(ret), ret)); 00191 #ifdef KRB5_PLUGIN_NO_HANDLE 00192 return KRB5_PLUGIN_NO_HANDLE; 00193 #else 00194 return KRB5_KDC_UNREACH; /* Heimdal */ 00195 #endif 00196 } 00197 00198 ret = cbfunc(cbdata, out->ai_socktype, out->ai_addr); 00199 if (ret) { 00200 DEBUG(10,("smb_krb5_locator_lookup: failed to call callback: %s (%d)\n", 00201 error_message(ret), ret)); 00202 } 00203 00204 freeaddrinfo(out); 00205 00206 return ret; 00207 }
krb5_error_code smb_krb5_locator_init | ( | krb5_context | context, | |
void ** | private_data | |||
) |
PUBLIC INTERFACE: locate init
context | krb5_context | |
privata_data | pointer to private data pointer |
smb_krb5_locator.c の 218 行で定義されています。
参照先 dyn_CONFIGFILE・load_case_tables()・setup_logging().
00220 { 00221 setup_logging("smb_krb5_locator", True); 00222 load_case_tables(); 00223 lp_load(dyn_CONFIGFILE,True,False,False,True); 00224 00225 DEBUG(10,("smb_krb5_locator_init: called\n")); 00226 00227 return 0; 00228 }
void smb_krb5_locator_close | ( | void * | private_data | ) |
PUBLIC INTERFACE: close locate
private_data | pointer to private data |
smb_krb5_locator.c の 238 行で定義されています。
00239 { 00240 DEBUG(10,("smb_krb5_locator_close: called\n")); 00241 00242 /* gfree_all(); */ 00243 }
krb5_error_code smb_krb5_locator_lookup | ( | void * | private_data, | |
enum locate_service_type | svc, | |||
const char * | realm, | |||
int | socktype, | |||
int | family, | |||
int(*)(void *, int, struct sockaddr *) | cbfunc, | |||
void * | cbdata | |||
) |
PUBLIC INTERFACE: locate lookup
private_data | pointer to private data | |
svc | enum locate_service_type. | |
realm | string | |
socktype | integer | |
family | integer | |
cbfunc | callback function to send back entries | |
cbdata | void pointer to cbdata |
smb_krb5_locator.c の 259 行で定義されています。
参照先 family_name()・get_kdc_list()・get_service_from_locate_service_type()・host・locate_service_type_name()・nt_errstr()・nt_status_to_krb5()・port・saf_fetch()・sitename_fetch()・smb_krb5_locator_call_cbfunc()・smb_krb5_locator_lookup_sanity_check()・socktype_name()・status.
00266 { 00267 NTSTATUS status; 00268 krb5_error_code ret; 00269 char *sitename = NULL; 00270 struct ip_service *ip_list; 00271 int count = 0; 00272 struct addrinfo aihints; 00273 char *saf_name = NULL; 00274 int i; 00275 00276 DEBUG(10,("smb_krb5_locator_lookup: called for\n")); 00277 DEBUGADD(10,("\tsvc: %s (%d), realm: %s\n", 00278 locate_service_type_name(svc), svc, realm)); 00279 DEBUGADD(10,("\tsocktype: %s (%d), family: %s (%d)\n", 00280 socktype_name(socktype), socktype, 00281 family_name(family), family)); 00282 00283 ret = smb_krb5_locator_lookup_sanity_check(svc, realm, socktype, family); 00284 if (ret) { 00285 DEBUG(10,("smb_krb5_locator_lookup: returning ret: %s (%d)\n", 00286 error_message(ret), ret)); 00287 return ret; 00288 } 00289 00290 /* first try to fetch from SAF cache */ 00291 00292 saf_name = saf_fetch(realm); 00293 if (!saf_name || strlen(saf_name) == 0) { 00294 DEBUG(10,("smb_krb5_locator_lookup: no SAF name stored for %s\n", 00295 realm)); 00296 goto find_kdc; 00297 } 00298 00299 DEBUG(10,("smb_krb5_locator_lookup: got %s for %s from SAF cache\n", 00300 saf_name, realm)); 00301 00302 ZERO_STRUCT(aihints); 00303 00304 aihints.ai_family = family; 00305 aihints.ai_socktype = socktype; 00306 00307 ret = smb_krb5_locator_call_cbfunc(saf_name, 00308 get_service_from_locate_service_type(svc), 00309 &aihints, 00310 cbfunc, cbdata); 00311 if (ret) { 00312 return ret; 00313 } 00314 00315 return 0; 00316 00317 find_kdc: 00318 00319 /* now try to find via site-aware DNS SRV query */ 00320 00321 sitename = sitename_fetch(realm); 00322 status = get_kdc_list(realm, sitename, &ip_list, &count); 00323 00324 /* if we didn't found any KDCs on our site go to the main list */ 00325 00326 if (NT_STATUS_IS_OK(status) && sitename && (count == 0)) { 00327 SAFE_FREE(ip_list); 00328 SAFE_FREE(sitename); 00329 status = get_kdc_list(realm, NULL, &ip_list, &count); 00330 } 00331 00332 SAFE_FREE(sitename); 00333 00334 if (!NT_STATUS_IS_OK(status)) { 00335 DEBUG(10,("smb_krb5_locator_lookup: got %s (%s)\n", 00336 nt_errstr(status), 00337 error_message(nt_status_to_krb5(status)))); 00338 #ifdef KRB5_PLUGIN_NO_HANDLE 00339 return KRB5_PLUGIN_NO_HANDLE; 00340 #else 00341 return KRB5_KDC_UNREACH; /* Heimdal */ 00342 #endif 00343 } 00344 00345 for (i=0; i<count; i++) { 00346 00347 const char *host = NULL; 00348 const char *port = NULL; 00349 00350 ZERO_STRUCT(aihints); 00351 00352 aihints.ai_family = family; 00353 aihints.ai_socktype = socktype; 00354 00355 host = inet_ntoa(ip_list[i].ip); 00356 port = get_service_from_locate_service_type(svc); 00357 00358 ret = smb_krb5_locator_call_cbfunc(host, 00359 port, 00360 &aihints, 00361 cbfunc, cbdata); 00362 if (ret) { 00363 /* got error */ 00364 break; 00365 } 00366 } 00367 00368 SAFE_FREE(ip_list); 00369 00370 return ret; 00371 }
const krb5plugin_service_locate_ftable SMB_KRB5_LOCATOR_SYMBOL_NAME |
初期値:
smb_krb5_locator.c の 379 行で定義されています。