utils/net_dns.c

ソースコードを見る。

関数

DNS_ERROR DoDNSUpdate (char *pszServerName, const char *pszDomainName, const char *pszHostName, const struct in_addr *iplist, size_t num_addrs)
int get_my_ip_address (struct in_addr **ips)
DNS_ERROR do_gethostbyname (const char *server, const char *host)


関数

DNS_ERROR DoDNSUpdate ( char *  pszServerName,
const char *  pszDomainName,
const char *  pszHostName,
const struct in_addr *  iplist,
size_t  num_addrs 
)

net_dns.c33 行で定義されています。

参照先 dns_create_probe()dns_create_update_request()dns_generate_keyname()dns_negotiate_sec_ctx()dns_open_connection()dns_response_code()dns_sign_update()DNS_SRV_ANYDNS_SRV_WIN2000dns_update_transaction()errerrordns_update_request::flagstalloc_init().

00036 {
00037         DNS_ERROR err;
00038         struct dns_connection *conn;
00039         TALLOC_CTX *mem_ctx;
00040         OM_uint32 minor;
00041         struct dns_update_request *req, *resp;
00042 
00043         if ( (num_addrs <= 0) || !iplist ) {
00044                 return ERROR_DNS_INVALID_PARAMETER;
00045         }
00046 
00047         if (!(mem_ctx = talloc_init("DoDNSUpdate"))) {
00048                 return ERROR_DNS_NO_MEMORY;
00049         }
00050                 
00051         err = dns_open_connection( pszServerName, DNS_TCP, mem_ctx, &conn );
00052         if (!ERR_DNS_IS_OK(err)) {
00053                 goto error;
00054         }
00055 
00056         /*
00057          * Probe if everything's fine
00058          */
00059 
00060         err = dns_create_probe(mem_ctx, pszDomainName, pszHostName,
00061                                num_addrs, iplist, &req);
00062         if (!ERR_DNS_IS_OK(err)) goto error;
00063 
00064         err = dns_update_transaction(mem_ctx, conn, req, &resp);
00065         if (!ERR_DNS_IS_OK(err)) goto error;
00066 
00067         if (dns_response_code(resp->flags) == DNS_NO_ERROR) {
00068                 TALLOC_FREE(mem_ctx);
00069                 return ERROR_DNS_SUCCESS;
00070         }
00071 
00072         /*
00073          * First try without signing
00074          */
00075 
00076         err = dns_create_update_request(mem_ctx, pszDomainName, pszHostName,
00077                                         iplist, num_addrs, &req);
00078         if (!ERR_DNS_IS_OK(err)) goto error;
00079 
00080         err = dns_update_transaction(mem_ctx, conn, req, &resp);
00081         if (!ERR_DNS_IS_OK(err)) goto error;
00082 
00083         if (dns_response_code(resp->flags) == DNS_NO_ERROR) {
00084                 TALLOC_FREE(mem_ctx);
00085                 return ERROR_DNS_SUCCESS;
00086         }
00087 
00088         /*
00089          * Okay, we have to try with signing
00090          */
00091         {
00092                 gss_ctx_id_t gss_context;
00093                 char *keyname;
00094 
00095                 if (!(keyname = dns_generate_keyname( mem_ctx ))) {
00096                         err = ERROR_DNS_NO_MEMORY;
00097                         goto error;
00098                 }
00099 
00100                 err = dns_negotiate_sec_ctx( pszDomainName, pszServerName,
00101                                              keyname, &gss_context, DNS_SRV_ANY );
00102 
00103                 /* retry using the Windows 2000 DNS hack */
00104                 if (!ERR_DNS_IS_OK(err)) {
00105                         err = dns_negotiate_sec_ctx( pszDomainName, pszServerName,
00106                                                      keyname, &gss_context, 
00107                                                      DNS_SRV_WIN2000 );
00108                 }
00109                 
00110                 if (!ERR_DNS_IS_OK(err))
00111                         goto error;
00112                 
00113 
00114                 err = dns_sign_update(req, gss_context, keyname,
00115                                       "gss.microsoft.com", time(NULL), 3600);
00116 
00117                 gss_delete_sec_context(&minor, &gss_context, GSS_C_NO_BUFFER);
00118 
00119                 if (!ERR_DNS_IS_OK(err)) goto error;
00120 
00121                 err = dns_update_transaction(mem_ctx, conn, req, &resp);
00122                 if (!ERR_DNS_IS_OK(err)) goto error;
00123 
00124                 err = (dns_response_code(resp->flags) == DNS_NO_ERROR) ?
00125                         ERROR_DNS_SUCCESS : ERROR_DNS_UPDATE_FAILED;
00126         }
00127 
00128 
00129 error:
00130         TALLOC_FREE(mem_ctx);
00131         return err;
00132 }

int get_my_ip_address ( struct in_addr **  ips  ) 

net_dns.c137 行で定義されています。

参照先 get_interfaces()interpret_addr2()list().

参照元 net_update_dns().

00138 {
00139         struct iface_struct nics[MAX_INTERFACES];
00140         int i, n;
00141         struct in_addr loopback_ip = *interpret_addr2("127.0.0.1");
00142         struct in_addr *list;
00143         int count = 0;
00144 
00145         /* find the first non-loopback address from our list of interfaces */
00146 
00147         n = get_interfaces(nics, MAX_INTERFACES);
00148         
00149         if ( (list = SMB_MALLOC_ARRAY( struct in_addr, n )) == NULL ) {
00150                 return -1;
00151         }
00152 
00153         for ( i=0; i<n; i++ ) {
00154                 if ( nics[i].ip.s_addr != loopback_ip.s_addr ) {
00155                         memcpy( &list[count++], &nics[i].ip, sizeof( struct in_addr ) );
00156                 }
00157         }
00158         *ips = list;
00159 
00160         return count;
00161 }

DNS_ERROR do_gethostbyname ( const char *  server,
const char *  host 
)

net_dns.c163 行で定義されています。

参照先 dns_create_query()dns_open_connection()dns_transaction()errerror.

参照元 net_ads_dns_gethostbyname().

00164 {
00165         struct dns_connection *conn;
00166         struct dns_request *req, *resp;
00167         DNS_ERROR err;
00168 
00169         err = dns_open_connection(server, DNS_UDP, NULL, &conn);
00170         if (!ERR_DNS_IS_OK(err)) goto error;
00171 
00172         err = dns_create_query(conn, host, QTYPE_A, DNS_CLASS_IN, &req);
00173         if (!ERR_DNS_IS_OK(err)) goto error;
00174 
00175         err = dns_transaction(conn, conn, req, &resp);
00176 
00177  error:
00178         TALLOC_FREE(conn);
00179         return err;
00180 }


Sambaに対してSat Aug 29 21:24:33 2009に生成されました。  doxygen 1.4.7