libaddns/dns.h

ソースコードを見る。

データ構造

struct  dns_domain_label
struct  dns_domain_name
struct  dns_question
struct  dns_zone
struct  dns_rrec
struct  dns_tkey_record
struct  dns_request
struct  dns_update_request
struct  dns_connection
struct  dns_buffer

型定義

typedef long HANDLE
typedef int BOOL

列挙型

enum  dns_ServerType { DNS_SRV_ANY, DNS_SRV_WIN2000, DNS_SRV_WIN2003 }

関数

void * _talloc_zero_zeronull (const void *ctx, size_t size, const char *name)
void * _talloc_memdup_zeronull (const void *t, const void *p, size_t size, const char *name)
void * _talloc_array_zeronull (const void *ctx, size_t el_size, unsigned count, const char *name)
void * _talloc_zero_array_zeronull (const void *ctx, size_t el_size, unsigned count, const char *name)
void * talloc_zeronull (const void *context, size_t size, const char *name)
DNS_ERROR dns_domain_name_from_string (TALLOC_CTX *mem_ctx, const char *pszDomainName, struct dns_domain_name **presult)
char * dns_generate_keyname (TALLOC_CTX *mem_ctx)
DNS_ERROR dns_create_query (TALLOC_CTX *mem_ctx, const char *name, uint16 q_type, uint16 q_class, struct dns_request **preq)
DNS_ERROR dns_create_update (TALLOC_CTX *mem_ctx, const char *name, struct dns_update_request **preq)
DNS_ERROR dns_create_probe (TALLOC_CTX *mem_ctx, const char *zone, const char *host, int num_ips, const struct in_addr *iplist, struct dns_update_request **preq)
DNS_ERROR dns_create_rrec (TALLOC_CTX *mem_ctx, const char *name, uint16 type, uint16 r_class, uint32 ttl, uint16 data_length, uint8 *data, struct dns_rrec **prec)
DNS_ERROR dns_add_rrec (TALLOC_CTX *mem_ctx, struct dns_rrec *rec, uint16 *num_records, struct dns_rrec ***records)
DNS_ERROR dns_create_tkey_record (TALLOC_CTX *mem_ctx, const char *keyname, const char *algorithm_name, time_t inception, time_t expiration, uint16 mode, uint16 error, uint16 key_length, const uint8 *key, struct dns_rrec **prec)
DNS_ERROR dns_create_name_in_use_record (TALLOC_CTX *mem_ctx, const char *name, const struct in_addr *ip, struct dns_rrec **prec)
DNS_ERROR dns_create_delete_record (TALLOC_CTX *mem_ctx, const char *name, uint16 type, uint16 r_class, struct dns_rrec **prec)
DNS_ERROR dns_create_name_not_in_use_record (TALLOC_CTX *mem_ctx, const char *name, uint32 type, struct dns_rrec **prec)
DNS_ERROR dns_create_a_record (TALLOC_CTX *mem_ctx, const char *host, uint32 ttl, struct in_addr ip, struct dns_rrec **prec)
DNS_ERROR dns_unmarshall_tkey_record (TALLOC_CTX *mem_ctx, struct dns_rrec *rec, struct dns_tkey_record **ptkey)
DNS_ERROR dns_create_tsig_record (TALLOC_CTX *mem_ctx, const char *keyname, const char *algorithm_name, time_t time_signed, uint16 fudge, uint16 mac_length, const uint8 *mac, uint16 original_id, uint16 error, struct dns_rrec **prec)
DNS_ERROR dns_open_connection (const char *nameserver, int32 dwType, TALLOC_CTX *mem_ctx, struct dns_connection **conn)
DNS_ERROR dns_send (struct dns_connection *conn, const struct dns_buffer *buf)
DNS_ERROR dns_receive (TALLOC_CTX *mem_ctx, struct dns_connection *conn, struct dns_buffer **presult)
DNS_ERROR dns_transaction (TALLOC_CTX *mem_ctx, struct dns_connection *conn, const struct dns_request *req, struct dns_request **resp)
DNS_ERROR dns_update_transaction (TALLOC_CTX *mem_ctx, struct dns_connection *conn, struct dns_update_request *up_req, struct dns_update_request **up_resp)
dns_bufferdns_create_buffer (TALLOC_CTX *mem_ctx)
void dns_marshall_buffer (struct dns_buffer *buf, const uint8 *data, size_t len)
void dns_marshall_uint16 (struct dns_buffer *buf, uint16 val)
void dns_marshall_uint32 (struct dns_buffer *buf, uint32 val)
void dns_unmarshall_buffer (struct dns_buffer *buf, uint8 *data, size_t len)
void dns_unmarshall_uint16 (struct dns_buffer *buf, uint16 *val)
void dns_unmarshall_uint32 (struct dns_buffer *buf, uint32 *val)
void dns_unmarshall_domain_name (TALLOC_CTX *mem_ctx, struct dns_buffer *buf, struct dns_domain_name **pname)
void dns_marshall_domain_name (struct dns_buffer *buf, const struct dns_domain_name *name)
DNS_ERROR dns_marshall_request (TALLOC_CTX *mem_ctx, const struct dns_request *req, struct dns_buffer **pbuf)
DNS_ERROR dns_unmarshall_request (TALLOC_CTX *mem_ctx, struct dns_buffer *buf, struct dns_request **preq)
DNS_ERROR dns_marshall_update_request (TALLOC_CTX *mem_ctx, struct dns_update_request *update, struct dns_buffer **pbuf)
DNS_ERROR dns_unmarshall_update_request (TALLOC_CTX *mem_ctx, struct dns_buffer *buf, struct dns_update_request **pupreq)
dns_requestdns_update2request (struct dns_update_request *update)
dns_update_requestdns_request2update (struct dns_request *request)
uint16 dns_response_code (uint16 flags)
void display_status (const char *msg, OM_uint32 maj_stat, OM_uint32 min_stat)
DNS_ERROR dns_negotiate_sec_ctx (const char *target_realm, const char *servername, const char *keyname, gss_ctx_id_t *gss_ctx, enum dns_ServerType srv_type)
DNS_ERROR dns_sign_update (struct dns_update_request *req, gss_ctx_id_t gss_ctx, const char *keyname, const char *algorithmname, time_t time_signed, uint16 fudge)
DNS_ERROR dns_create_update_request (TALLOC_CTX *mem_ctx, const char *domainname, const char *hostname, const struct in_addr *ip_addr, size_t num_adds, struct dns_update_request **preq)


型定義

typedef long HANDLE

dns.h284 行で定義されています。

typedef int BOOL

dns.h287 行で定義されています。


列挙型

enum dns_ServerType

列挙型の値:
DNS_SRV_ANY 
DNS_SRV_WIN2000 
DNS_SRV_WIN2003 

dns.h292 行で定義されています。


関数

void* _talloc_zero_zeronull ( const void *  ctx,
size_t  size,
const char *  name 
)

util.c3250 行で定義されています。

参照先 talloc_named_const().

03251 {
03252         void *p;
03253 
03254         if (size == 0) {
03255                 return NULL;
03256         }
03257 
03258         p = talloc_named_const(ctx, size, name);
03259 
03260         if (p) {
03261                 memset(p, '\0', size);
03262         }
03263 
03264         return p;
03265 }

void* _talloc_memdup_zeronull ( const void *  t,
const void *  p,
size_t  size,
const char *  name 
)

util.c3272 行で定義されています。

参照先 talloc_named_const().

03273 {
03274         void *newp;
03275 
03276         if (size == 0) {
03277                 return NULL;
03278         }
03279 
03280         newp = talloc_named_const(t, size, name);
03281         if (newp) {
03282                 memcpy(newp, p, size);
03283         }
03284 
03285         return newp;
03286 }

void* _talloc_array_zeronull ( const void *  ctx,
size_t  el_size,
unsigned  count,
const char *  name 
)

util.c3293 行で定義されています。

参照先 talloc_named_const().

03294 {
03295         if (count >= MAX_TALLOC_SIZE/el_size) {
03296                 return NULL;
03297         }
03298 
03299         if (el_size == 0 || count == 0) {
03300                 return NULL;
03301         }
03302 
03303         return talloc_named_const(ctx, el_size * count, name);
03304 }

void* _talloc_zero_array_zeronull ( const void *  ctx,
size_t  el_size,
unsigned  count,
const char *  name 
)

util.c3311 行で定義されています。

参照先 _talloc_zero().

03312 {
03313         if (count >= MAX_TALLOC_SIZE/el_size) {
03314                 return NULL;
03315         }
03316 
03317         if (el_size == 0 || count == 0) {
03318                 return NULL;
03319         }
03320 
03321         return _talloc_zero(ctx, el_size * count, name);
03322 }

void* talloc_zeronull ( const void *  context,
size_t  size,
const char *  name 
)

util.c3327 行で定義されています。

参照先 talloc_named_const().

03328 {
03329         if (size == 0) {
03330                 return NULL;
03331         }
03332         return talloc_named_const(context, size, name);
03333 }

DNS_ERROR dns_domain_name_from_string ( TALLOC_CTX mem_ctx,
const char *  pszDomainName,
struct dns_domain_name **  presult 
)

dnsutils.c109 行で定義されています。

参照先 errLabelList()result.

参照元 dns_create_query()dns_create_rrec()dns_create_tkey_record()dns_create_tsig_record()dns_create_update()dns_sign_update().

00112 {
00113         struct dns_domain_name *result;
00114         DNS_ERROR err;
00115 
00116         if (!(result = talloc(mem_ctx, struct dns_domain_name))) {
00117                 return ERROR_DNS_NO_MEMORY;
00118         }
00119 
00120         err = LabelList( result, pszDomainName, &result->pLabelList );
00121         if (!ERR_DNS_IS_OK(err)) {
00122                 TALLOC_FREE(result);
00123                 return err;
00124         }
00125 
00126         *presult = result;
00127         return ERROR_DNS_SUCCESS;
00128 }

char* dns_generate_keyname ( TALLOC_CTX mem_ctx  ) 

dnsutils.c133 行で定義されています。

参照先 result.

参照元 DoDNSUpdate().

00134 {
00135         char *result = NULL;
00136 #if defined(WITH_DNS_UPDATES)
00137 
00138         uuid_t uuid;
00139 
00140         /*
00141          * uuid_unparse gives 36 bytes plus '\0'
00142          */
00143         if (!(result = TALLOC_ARRAY(mem_ctx, char, 37))) {
00144                 return NULL;
00145         }
00146 
00147         uuid_generate( uuid );
00148         uuid_unparse( uuid, result );
00149 
00150 #endif
00151 
00152         return result;
00153 }

DNS_ERROR dns_create_query ( TALLOC_CTX mem_ctx,
const char *  name,
uint16  q_type,
uint16  q_class,
struct dns_request **  preq 
)

dnsrecord.c28 行で定義されています。

参照先 dns_domain_name_from_string()errdns_request::iddns_question::namedns_request::num_questionsdns_question::q_classdns_question::q_typedns_request::questions.

参照元 dns_negotiate_gss_ctx_int()do_gethostbyname().

00031 {
00032         struct dns_request *req;
00033         struct dns_question *q;
00034         DNS_ERROR err;
00035 
00036         if (!(req = TALLOC_ZERO_P(mem_ctx, struct dns_request)) ||
00037             !(req->questions = TALLOC_ARRAY(req, struct dns_question *, 1)) ||
00038             !(req->questions[0] = talloc(req->questions,
00039                                          struct dns_question))) {
00040                 TALLOC_FREE(req);
00041                 return ERROR_DNS_NO_MEMORY;
00042         }
00043 
00044         req->id = random();
00045 
00046         req->num_questions = 1;
00047         q = req->questions[0];
00048 
00049         err = dns_domain_name_from_string(q, name, &q->name);
00050         if (!ERR_DNS_IS_OK(err)) {
00051                 TALLOC_FREE(req);
00052                 return err;
00053         }
00054 
00055         q->q_type = q_type;
00056         q->q_class = q_class;
00057 
00058         *preq = req;
00059         return ERROR_DNS_SUCCESS;
00060 }

DNS_ERROR dns_create_update ( TALLOC_CTX mem_ctx,
const char *  name,
struct dns_update_request **  preq 
)

dnsrecord.c62 行で定義されています。

参照先 dns_domain_name_from_string()errdns_update_request::flagsdns_update_request::iddns_zone::namedns_update_request::num_zonesdns_zone::z_classdns_zone::z_typedns_update_request::zones.

参照元 dns_create_probe()dns_create_update_request().

00064 {
00065         struct dns_update_request *req;
00066         struct dns_zone *z;
00067         DNS_ERROR err;
00068 
00069         if (!(req = TALLOC_ZERO_P(mem_ctx, struct dns_update_request)) ||
00070             !(req->zones = TALLOC_ARRAY(req, struct dns_zone *, 1)) ||
00071             !(req->zones[0] = talloc(req->zones, struct dns_zone))) {
00072                 TALLOC_FREE(req);
00073                 return ERROR_DNS_NO_MEMORY;
00074         }
00075 
00076         req->id = random();
00077         req->flags = 0x2800;    /* Dynamic update */
00078 
00079         req->num_zones = 1;
00080         z = req->zones[0];
00081 
00082         err = dns_domain_name_from_string(z, name, &z->name);
00083         if (!ERR_DNS_IS_OK(err)) {
00084                 TALLOC_FREE(req);
00085                 return err;
00086         }
00087 
00088         z->z_type = QTYPE_SOA;
00089         z->z_class = DNS_CLASS_IN;
00090 
00091         *preq = req;
00092         return ERROR_DNS_SUCCESS;
00093 }

DNS_ERROR dns_create_probe ( TALLOC_CTX mem_ctx,
const char *  zone,
const char *  host,
int  num_ips,
const struct in_addr *  iplist,
struct dns_update_request **  preq 
)

dnsrecord.c324 行で定義されています。

参照先 dns_add_rrec()dns_create_name_in_use_record()dns_create_name_not_in_use_record()dns_create_update()errerrordns_update_request::num_preqsdns_update_request::preqs.

参照元 DoDNSUpdate().

00328 {
00329         struct dns_update_request *req;
00330         struct dns_rrec *rec;
00331         DNS_ERROR err;
00332         uint16 i;
00333 
00334         err = dns_create_update(mem_ctx, zone, &req);
00335         if (!ERR_DNS_IS_OK(err)) goto error;
00336 
00337         err = dns_create_name_not_in_use_record(req, host, QTYPE_CNAME, &rec);
00338         if (!ERR_DNS_IS_OK(err)) goto error;
00339 
00340         err = dns_add_rrec(req, rec, &req->num_preqs, &req->preqs);
00341         if (!ERR_DNS_IS_OK(err)) goto error;
00342 
00343         for (i=0; i<num_ips; i++) {
00344                 err = dns_create_name_in_use_record(req, host,
00345                                                     &iplist[i], &rec);
00346                 if (!ERR_DNS_IS_OK(err)) goto error;
00347 
00348                 err = dns_add_rrec(req, rec, &req->num_preqs, &req->preqs);
00349                 if (!ERR_DNS_IS_OK(err)) goto error;
00350         }
00351 
00352         *preq = req;
00353         return ERROR_DNS_SUCCESS;
00354 
00355  error:
00356         TALLOC_FREE(req);
00357         return err;
00358 }

DNS_ERROR dns_create_rrec ( TALLOC_CTX mem_ctx,
const char *  name,
uint16  type,
uint16  r_class,
uint32  ttl,
uint16  data_length,
uint8 *  data,
struct dns_rrec **  prec 
)

dnsrecord.c95 行で定義されています。

参照先 dns_rrec::datadns_rrec::data_lengthdns_domain_name_from_string()errdns_rrec::namedns_rrec::r_classdns_rrec::ttldns_rrec::type.

参照元 dns_create_a_record()dns_create_delete_record()dns_create_name_in_use_record()dns_create_name_not_in_use_record()dns_create_tkey_record()dns_create_tsig_record()dns_create_update_request().

00099 {
00100         struct dns_rrec *rec;
00101         DNS_ERROR err;
00102 
00103         if (!(rec = talloc(mem_ctx, struct dns_rrec))) {
00104                 return ERROR_DNS_NO_MEMORY;
00105         }
00106 
00107         err = dns_domain_name_from_string(rec, name, &rec->name);
00108         if (!(ERR_DNS_IS_OK(err))) {
00109                 TALLOC_FREE(rec);
00110                 return err;
00111         }
00112 
00113         rec->type = type;
00114         rec->r_class = r_class;
00115         rec->ttl = ttl;
00116         rec->data_length = data_length;
00117         rec->data = talloc_move(rec, &data);
00118 
00119         *prec = rec;
00120         return ERROR_DNS_SUCCESS;
00121 }

DNS_ERROR dns_add_rrec ( TALLOC_CTX mem_ctx,
struct dns_rrec rec,
uint16 *  num_records,
struct dns_rrec ***  records 
)

dnsrecord.c301 行で定義されています。

参照元 dns_create_probe()dns_create_update_request()dns_negotiate_gss_ctx_int()dns_sign_update().

00303 {
00304         struct dns_rrec **new_records;
00305 
00306         if (!(new_records = TALLOC_REALLOC_ARRAY(mem_ctx, *records,
00307                                                  struct dns_rrec *,
00308                                                  (*num_records)+1))) {
00309                 return ERROR_DNS_NO_MEMORY;
00310         }
00311 
00312         new_records[*num_records] = talloc_move(new_records, &rec);
00313 
00314         *num_records += 1;
00315         *records = new_records;
00316         return ERROR_DNS_SUCCESS;
00317 }

DNS_ERROR dns_create_tkey_record ( TALLOC_CTX mem_ctx,
const char *  keyname,
const char *  algorithm_name,
time_t  inception,
time_t  expiration,
uint16  mode,
uint16  error,
uint16  key_length,
const uint8 *  key,
struct dns_rrec **  prec 
)

dnsrecord.c173 行で定義されています。

参照先 bufdns_create_buffer()dns_create_rrec()dns_domain_name_from_string()dns_marshall_buffer()dns_marshall_domain_name()dns_marshall_uint16()dns_marshall_uint32()err.

参照元 dns_negotiate_gss_ctx_int().

00178 {
00179         struct dns_buffer *buf;
00180         struct dns_domain_name *algorithm;
00181         DNS_ERROR err;
00182 
00183         if (!(buf = dns_create_buffer(mem_ctx))) {
00184                 return ERROR_DNS_NO_MEMORY;
00185         }
00186 
00187         err = dns_domain_name_from_string(buf, algorithm_name, &algorithm);
00188         if (!ERR_DNS_IS_OK(err)) goto error;
00189 
00190         dns_marshall_domain_name(buf, algorithm);
00191         dns_marshall_uint32(buf, inception);
00192         dns_marshall_uint32(buf, expiration);
00193         dns_marshall_uint16(buf, mode);
00194         dns_marshall_uint16(buf, error);
00195         dns_marshall_uint16(buf, key_length);
00196         dns_marshall_buffer(buf, key, key_length);
00197         dns_marshall_uint16(buf, 0); /* Other Size */
00198 
00199         if (!ERR_DNS_IS_OK(buf->error)) {
00200                 err = buf->error;
00201                 goto error;
00202         }
00203 
00204         err = dns_create_rrec(mem_ctx, keyname, QTYPE_TKEY, DNS_CLASS_ANY, 0,
00205                               buf->offset, buf->data, prec);
00206 
00207  error:
00208         TALLOC_FREE(buf);
00209         return err;
00210 }

DNS_ERROR dns_create_name_in_use_record ( TALLOC_CTX mem_ctx,
const char *  name,
const struct in_addr *  ip,
struct dns_rrec **  prec 
)

dnsrecord.c145 行で定義されています。

参照先 dns_create_a_record()dns_create_rrec().

参照元 dns_create_probe().

00149 {
00150         if (ip != NULL) {
00151                 return dns_create_a_record(mem_ctx, name, 0, *ip, prec);
00152         }
00153 
00154         return dns_create_rrec(mem_ctx, name, QTYPE_ANY, DNS_CLASS_IN, 0, 0,
00155                                NULL, prec);
00156 }

DNS_ERROR dns_create_delete_record ( TALLOC_CTX mem_ctx,
const char *  name,
uint16  type,
uint16  r_class,
struct dns_rrec **  prec 
)

dnsrecord.c166 行で定義されています。

参照先 dns_create_rrec().

参照元 dns_create_update_request().

00169 {
00170         return dns_create_rrec(mem_ctx, name, type, r_class, 0, 0, NULL, prec);
00171 }

DNS_ERROR dns_create_name_not_in_use_record ( TALLOC_CTX mem_ctx,
const char *  name,
uint32  type,
struct dns_rrec **  prec 
)

dnsrecord.c158 行で定義されています。

参照先 dns_create_rrec().

参照元 dns_create_probe().

00161 {
00162         return dns_create_rrec(mem_ctx, name, type, DNS_CLASS_NONE, 0,
00163                                0, NULL, prec);
00164 }

DNS_ERROR dns_create_a_record ( TALLOC_CTX mem_ctx,
const char *  host,
uint32  ttl,
struct in_addr  ip,
struct dns_rrec **  prec 
)

dnsrecord.c123 行で定義されています。

参照先 dns_rrec::datadns_create_rrec()err.

参照元 dns_create_name_in_use_record()dns_create_update_request().

00126 {
00127         uint8 *data;
00128         DNS_ERROR err;
00129 
00130         if (!(data = (uint8 *)TALLOC_MEMDUP(mem_ctx, (const void *)&ip.s_addr,
00131                                             sizeof(ip.s_addr)))) {
00132                 return ERROR_DNS_NO_MEMORY;
00133         }
00134 
00135         err = dns_create_rrec(mem_ctx, host, QTYPE_A, DNS_CLASS_IN, ttl,
00136                               sizeof(ip.s_addr), data, prec);
00137 
00138         if (!ERR_DNS_IS_OK(err)) {
00139                 TALLOC_FREE(data);
00140         }
00141 
00142         return err;
00143 }

DNS_ERROR dns_unmarshall_tkey_record ( TALLOC_CTX mem_ctx,
struct dns_rrec rec,
struct dns_tkey_record **  ptkey 
)

dnsrecord.c212 行で定義されています。

参照先 dns_tkey_record::algorithmbufdns_rrec::datadns_rrec::data_lengthdns_unmarshall_buffer()dns_unmarshall_domain_name()dns_unmarshall_uint16()dns_unmarshall_uint32()dns_tkey_record::errorerrordns_tkey_record::expirationdns_tkey_record::inceptiondns_tkey_record::keydns_tkey_record::key_lengthdns_tkey_record::mode.

参照元 dns_negotiate_gss_ctx_int().

00214 {
00215         struct dns_tkey_record *tkey;
00216         struct dns_buffer buf;
00217         uint32 tmp_inception, tmp_expiration;
00218         
00219         if (!(tkey = talloc(mem_ctx, struct dns_tkey_record))) {
00220                 return ERROR_DNS_NO_MEMORY;
00221         }
00222 
00223         buf.data = rec->data;
00224         buf.size = rec->data_length;
00225         buf.offset = 0;
00226         buf.error = ERROR_DNS_SUCCESS;
00227 
00228         dns_unmarshall_domain_name(tkey, &buf, &tkey->algorithm);
00229         dns_unmarshall_uint32(&buf, &tmp_inception);
00230         dns_unmarshall_uint32(&buf, &tmp_expiration);
00231         dns_unmarshall_uint16(&buf, &tkey->mode);
00232         dns_unmarshall_uint16(&buf, &tkey->error);
00233         dns_unmarshall_uint16(&buf, &tkey->key_length);
00234 
00235         if (!ERR_DNS_IS_OK(buf.error)) goto error;
00236 
00237         if (tkey->key_length) {
00238                 if (!(tkey->key = TALLOC_ARRAY(tkey, uint8, tkey->key_length))) {
00239                         buf.error = ERROR_DNS_NO_MEMORY;
00240                         goto error;
00241                 }
00242         } else {
00243                 tkey->key = NULL;
00244         }
00245 
00246         dns_unmarshall_buffer(&buf, tkey->key, tkey->key_length);
00247         if (!ERR_DNS_IS_OK(buf.error)) goto error;
00248 
00249         tkey->inception = (time_t)tmp_inception;
00250         tkey->expiration = (time_t)tmp_expiration;
00251 
00252         *ptkey = tkey;
00253         return ERROR_DNS_SUCCESS;
00254 
00255  error:
00256         TALLOC_FREE(tkey);
00257         return buf.error;
00258 }

DNS_ERROR dns_create_tsig_record ( TALLOC_CTX mem_ctx,
const char *  keyname,
const char *  algorithm_name,
time_t  time_signed,
uint16  fudge,
uint16  mac_length,
const uint8 *  mac,
uint16  original_id,
uint16  error,
struct dns_rrec **  prec 
)

dnsrecord.c260 行で定義されています。

参照先 bufdns_create_buffer()dns_create_rrec()dns_domain_name_from_string()dns_marshall_buffer()dns_marshall_domain_name()dns_marshall_uint16()dns_marshall_uint32()err.

参照元 dns_sign_update().

00266 {
00267         struct dns_buffer *buf;
00268         struct dns_domain_name *algorithm;
00269         DNS_ERROR err;
00270 
00271         if (!(buf = dns_create_buffer(mem_ctx))) {
00272                 return ERROR_DNS_NO_MEMORY;
00273         }
00274 
00275         err = dns_domain_name_from_string(buf, algorithm_name, &algorithm);
00276         if (!ERR_DNS_IS_OK(err)) goto error;
00277 
00278         dns_marshall_domain_name(buf, algorithm);
00279         dns_marshall_uint16(buf, 0); /* time prefix */
00280         dns_marshall_uint32(buf, time_signed);
00281         dns_marshall_uint16(buf, fudge);
00282         dns_marshall_uint16(buf, mac_length);
00283         dns_marshall_buffer(buf, mac, mac_length);
00284         dns_marshall_uint16(buf, original_id);
00285         dns_marshall_uint16(buf, error);
00286         dns_marshall_uint16(buf, 0); /* Other Size */
00287 
00288         if (!ERR_DNS_IS_OK(buf->error)) {
00289                 err = buf->error;
00290                 goto error;
00291         }
00292 
00293         err = dns_create_rrec(mem_ctx, keyname, QTYPE_TSIG, DNS_CLASS_ANY, 0,
00294                               buf->offset, buf->data, prec);
00295 
00296  error:
00297         TALLOC_FREE(buf);
00298         return err;
00299 }

DNS_ERROR dns_open_connection ( const char *  nameserver,
int32  dwType,
TALLOC_CTX mem_ctx,
struct dns_connection **  conn 
)

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

参照先 dns_tcp_open()dns_udp_open().

参照元 dns_negotiate_sec_ctx()do_gethostbyname()DoDNSUpdate().

00140 {
00141         switch ( dwType ) {
00142         case DNS_TCP:
00143                 return dns_tcp_open( nameserver, mem_ctx, conn );
00144         case DNS_UDP:
00145                 return dns_udp_open( nameserver, mem_ctx, conn );
00146         }
00147         
00148         return ERROR_DNS_INVALID_PARAMETER;
00149 }

DNS_ERROR dns_send ( struct dns_connection conn,
const struct dns_buffer buf 
)

dnssock.c200 行で定義されています。

参照先 bufdns_send_tcp()dns_send_udp()dns_connection::hType.

参照元 dns_negotiate_gss_ctx_int()dns_transaction().

00201 {
00202         if (conn->hType == DNS_TCP) {
00203                 return dns_send_tcp(conn, buf);
00204         }
00205 
00206         if (conn->hType == DNS_UDP) {
00207                 return dns_send_udp(conn, buf);
00208         }
00209 
00210         return ERROR_DNS_INVALID_PARAMETER;
00211 }

DNS_ERROR dns_receive ( TALLOC_CTX mem_ctx,
struct dns_connection conn,
struct dns_buffer **  presult 
)

dnssock.c325 行で定義されています。

参照先 dns_receive_tcp()dns_receive_udp()dns_connection::hType.

参照元 dns_negotiate_gss_ctx_int()dns_transaction().

00327 {
00328         if (conn->hType == DNS_TCP) {
00329                 return dns_receive_tcp(mem_ctx, conn, presult);
00330         }
00331 
00332         if (conn->hType == DNS_UDP) {
00333                 return dns_receive_udp(mem_ctx, conn, presult);
00334         }
00335 
00336         return ERROR_DNS_INVALID_PARAMETER;
00337 }

DNS_ERROR dns_transaction ( TALLOC_CTX mem_ctx,
struct dns_connection conn,
const struct dns_request req,
struct dns_request **  resp 
)

dnssock.c339 行で定義されています。

参照先 bufdns_marshall_request()dns_receive()dns_send()dns_unmarshall_request()errerror.

参照元 dns_update_transaction()do_gethostbyname().

00342 {
00343         struct dns_buffer *buf = NULL;
00344         DNS_ERROR err;
00345 
00346         err = dns_marshall_request(conn, req, &buf);
00347         if (!ERR_DNS_IS_OK(err)) goto error;
00348 
00349         err = dns_send(conn, buf);
00350         if (!ERR_DNS_IS_OK(err)) goto error;
00351         TALLOC_FREE(buf);
00352 
00353         err = dns_receive(mem_ctx, conn, &buf);
00354         if (!ERR_DNS_IS_OK(err)) goto error;
00355 
00356         err = dns_unmarshall_request(mem_ctx, buf, resp);
00357 
00358  error:
00359         TALLOC_FREE(buf);
00360         return err;
00361 }

DNS_ERROR dns_update_transaction ( TALLOC_CTX mem_ctx,
struct dns_connection conn,
struct dns_update_request up_req,
struct dns_update_request **  up_resp 
)

dnssock.c363 行で定義されています。

参照先 dns_request2update()dns_transaction()dns_update2request()err.

参照元 DoDNSUpdate().

00367 {
00368         struct dns_request *resp;
00369         DNS_ERROR err;
00370 
00371         err = dns_transaction(mem_ctx, conn, dns_update2request(up_req),
00372                               &resp);
00373 
00374         if (!ERR_DNS_IS_OK(err)) return err;
00375 
00376         *up_resp = dns_request2update(resp);
00377         return ERROR_DNS_SUCCESS;
00378 }

struct dns_buffer* dns_create_buffer ( TALLOC_CTX mem_ctx  ) 

dnsmarshall.c28 行で定義されています。

参照先 result.

参照元 dns_create_tkey_record()dns_create_tsig_record()dns_marshall_request().

00029 {
00030         struct dns_buffer *result;
00031 
00032         if (!(result = talloc(mem_ctx, struct dns_buffer))) {
00033                 return NULL;
00034         }
00035 
00036         result->offset = 0;
00037         result->error = ERROR_DNS_SUCCESS;
00038         
00039         /*
00040          * Small inital size to excercise the realloc code
00041          */
00042         result->size = 2;
00043 
00044         if (!(result->data = TALLOC_ARRAY(result, uint8, result->size))) {
00045                 TALLOC_FREE(result);
00046                 return NULL;
00047         }
00048 
00049         return result;
00050 }

void dns_marshall_buffer ( struct dns_buffer buf,
const uint8 *  data,
size_t  len 
)

dnsmarshall.c52 行で定義されています。

参照先 bufdns_buffer::offset.

参照元 dns_create_tkey_record()dns_create_tsig_record()dns_marshall_domain_name()dns_marshall_rr()dns_marshall_uint16()dns_marshall_uint32().

00054 {
00055         if (!ERR_DNS_IS_OK(buf->error)) return;
00056 
00057         if (buf->offset + len < buf->offset) {
00058                 /*
00059                  * Wraparound!
00060                  */
00061                 buf->error = ERROR_DNS_INVALID_PARAMETER;
00062                 return;
00063         }
00064 
00065         if ((buf->offset + len) > 0xffff) {
00066                 /*
00067                  * Only 64k possible
00068                  */
00069                 buf->error = ERROR_DNS_INVALID_PARAMETER;
00070                 return;
00071         }
00072                 
00073         if (buf->offset + len > buf->size) {
00074                 size_t new_size = buf->offset + len;
00075                 uint8 *new_data;
00076 
00077                 /*
00078                  * Don't do too many reallocs, round up to some multiple
00079                  */
00080 
00081                 new_size += (64 - (new_size % 64));
00082 
00083                 if (!(new_data = TALLOC_REALLOC_ARRAY(buf, buf->data, uint8,
00084                                                       new_size))) {
00085                         buf->error = ERROR_DNS_NO_MEMORY;
00086                         return;
00087                 }
00088 
00089                 buf->size = new_size;
00090                 buf->data = new_data;
00091         }
00092 
00093         memcpy(buf->data + buf->offset, data, len);
00094         buf->offset += len;
00095         return;
00096 }

void dns_marshall_uint16 ( struct dns_buffer buf,
uint16  val 
)

dnsmarshall.c98 行で定義されています。

参照先 bufdns_marshall_buffer().

参照元 dns_create_tkey_record()dns_create_tsig_record()dns_marshall_question()dns_marshall_request()dns_marshall_rr()dns_sign_update().

00099 {
00100         uint16 n_val = htons(val);
00101         dns_marshall_buffer(buf, (uint8 *)&n_val, sizeof(n_val));
00102 }

void dns_marshall_uint32 ( struct dns_buffer buf,
uint32  val 
)

dnsmarshall.c104 行で定義されています。

参照先 bufdns_marshall_buffer().

参照元 dns_create_tkey_record()dns_create_tsig_record()dns_marshall_rr()dns_sign_update().

00105 {
00106         uint32 n_val = htonl(val);
00107         dns_marshall_buffer(buf, (uint8 *)&n_val, sizeof(n_val));
00108 }

void dns_unmarshall_buffer ( struct dns_buffer buf,
uint8 *  data,
size_t  len 
)

dnsmarshall.c110 行で定義されています。

参照先 buf.

参照元 dns_unmarshall_label()dns_unmarshall_rr()dns_unmarshall_tkey_record()dns_unmarshall_uint16()dns_unmarshall_uint32().

00112 {
00113         if (!(ERR_DNS_IS_OK(buf->error))) return;
00114 
00115         if ((len > buf->size) || (buf->offset + len > buf->size)) {
00116                 buf->error = ERROR_DNS_INVALID_MESSAGE;
00117                 return;
00118         }
00119 
00120         memcpy((void *)data, (const void *)(buf->data + buf->offset), len);
00121         buf->offset += len;
00122 
00123         return;
00124 }

void dns_unmarshall_uint16 ( struct dns_buffer buf,
uint16 *  val 
)

dnsmarshall.c126 行で定義されています。

参照先 bufdns_unmarshall_buffer().

参照元 dns_unmarshall_question()dns_unmarshall_request()dns_unmarshall_rr()dns_unmarshall_tkey_record().

00127 {
00128         uint16 n_val;
00129 
00130         dns_unmarshall_buffer(buf, (uint8 *)&n_val, sizeof(n_val));
00131         if (!(ERR_DNS_IS_OK(buf->error))) return;
00132 
00133         *val = ntohs(n_val);
00134 }

void dns_unmarshall_uint32 ( struct dns_buffer buf,
uint32 *  val 
)

dnsmarshall.c136 行で定義されています。

参照先 bufdns_unmarshall_buffer().

参照元 dns_unmarshall_rr()dns_unmarshall_tkey_record().

00137 {
00138         uint32 n_val;
00139 
00140         dns_unmarshall_buffer(buf, (uint8 *)&n_val, sizeof(n_val));
00141         if (!(ERR_DNS_IS_OK(buf->error))) return;
00142 
00143         *val = ntohl(n_val);
00144 }

void dns_unmarshall_domain_name ( TALLOC_CTX mem_ctx,
struct dns_buffer buf,
struct dns_domain_name **  pname 
)

dnsmarshall.c247 行で定義されています。

参照先 bufdns_unmarshall_label()name.

参照元 dns_unmarshall_question()dns_unmarshall_rr()dns_unmarshall_tkey_record().

00250 {
00251         struct dns_domain_name *name;
00252 
00253         if (!ERR_DNS_IS_OK(buf->error)) return;
00254 
00255         if (!(name = talloc(mem_ctx, struct dns_domain_name))) {
00256                 buf->error = ERROR_DNS_NO_MEMORY;
00257         }
00258 
00259         dns_unmarshall_label(name, 0, buf, &name->pLabelList);
00260 
00261         if (!ERR_DNS_IS_OK(buf->error)) {
00262                 return;
00263         }
00264 
00265         *pname = name;
00266         return;
00267 }

void dns_marshall_domain_name ( struct dns_buffer buf,
const struct dns_domain_name name 
)

dnsmarshall.c146 行で定義されています。

参照先 bufdns_marshall_buffer()dns_domain_label::labellenname.

参照元 dns_create_tkey_record()dns_create_tsig_record()dns_marshall_question()dns_marshall_rr()dns_sign_update().

00148 {
00149         struct dns_domain_label *label;
00150         char end_char = '\0';
00151 
00152         /*
00153          * TODO: Implement DNS compression
00154          */
00155 
00156         for (label = name->pLabelList; label != NULL; label = label->next) {
00157                 uint8 len = label->len;
00158 
00159                 dns_marshall_buffer(buf, (uint8 *)&len, sizeof(len));
00160                 if (!ERR_DNS_IS_OK(buf->error)) return;
00161 
00162                 dns_marshall_buffer(buf, (uint8 *)label->label, len);
00163                 if (!ERR_DNS_IS_OK(buf->error)) return;
00164         }
00165 
00166         dns_marshall_buffer(buf, (uint8 *)&end_char, 1);
00167 }

DNS_ERROR dns_marshall_request ( TALLOC_CTX mem_ctx,
const struct dns_request req,
struct dns_buffer **  pbuf 
)

dnsmarshall.c345 行で定義されています。

参照先 dns_request::additionalsdns_request::answersdns_request::authsbufdns_create_buffer()dns_marshall_question()dns_marshall_rr()dns_marshall_uint16()errdns_request::flagsdns_request::iddns_request::num_additionalsdns_request::num_answersdns_request::num_authsdns_request::num_questionsdns_request::questions.

参照元 dns_marshall_update_request()dns_negotiate_gss_ctx_int()dns_transaction().

00348 {
00349         struct dns_buffer *buf;
00350         uint16 i;
00351 
00352         if (!(buf = dns_create_buffer(mem_ctx))) {
00353                 return ERROR_DNS_NO_MEMORY;
00354         }
00355 
00356         dns_marshall_uint16(buf, req->id);
00357         dns_marshall_uint16(buf, req->flags);
00358         dns_marshall_uint16(buf, req->num_questions);
00359         dns_marshall_uint16(buf, req->num_answers);
00360         dns_marshall_uint16(buf, req->num_auths);
00361         dns_marshall_uint16(buf, req->num_additionals);
00362 
00363         for (i=0; i<req->num_questions; i++) {
00364                 dns_marshall_question(buf, req->questions[i]);
00365         }
00366         for (i=0; i<req->num_answers; i++) {
00367                 dns_marshall_rr(buf, req->answers[i]);
00368         }
00369         for (i=0; i<req->num_auths; i++) {
00370                 dns_marshall_rr(buf, req->auths[i]);
00371         }
00372         for (i=0; i<req->num_additionals; i++) {
00373                 dns_marshall_rr(buf, req->additionals[i]);
00374         }
00375 
00376         if (!ERR_DNS_IS_OK(buf->error)) {
00377                 DNS_ERROR err = buf->error;
00378                 TALLOC_FREE(buf);
00379                 return err;
00380         }
00381 
00382         *pbuf = buf;
00383         return ERROR_DNS_SUCCESS;
00384 }

DNS_ERROR dns_unmarshall_request ( TALLOC_CTX mem_ctx,
struct dns_buffer buf,
struct dns_request **  preq 
)

dnsmarshall.c386 行で定義されています。

参照先 dns_request::additionalsdns_request::answersdns_request::authsbufdns_unmarshall_question()dns_unmarshall_rr()dns_unmarshall_uint16()errerrordns_request::flagsdns_request::iddns_request::num_additionalsdns_request::num_answersdns_request::num_authsdns_request::num_questionsdns_request::questions.

参照元 dns_negotiate_gss_ctx_int()dns_transaction()dns_unmarshall_update_request().

00389 {
00390         struct dns_request *req;
00391         uint16 i;
00392         DNS_ERROR err;
00393 
00394         if (!(req = TALLOC_ZERO_P(mem_ctx, struct dns_request))) {
00395                 return ERROR_DNS_NO_MEMORY;
00396         }
00397 
00398         dns_unmarshall_uint16(buf, &req->id);
00399         dns_unmarshall_uint16(buf, &req->flags);
00400         dns_unmarshall_uint16(buf, &req->num_questions);
00401         dns_unmarshall_uint16(buf, &req->num_answers);
00402         dns_unmarshall_uint16(buf, &req->num_auths);
00403         dns_unmarshall_uint16(buf, &req->num_additionals);
00404 
00405         if (!ERR_DNS_IS_OK(buf->error)) goto error;
00406 
00407         err = ERROR_DNS_NO_MEMORY;
00408 
00409         if ((req->num_questions != 0) &&
00410             !(req->questions = TALLOC_ARRAY(req, struct dns_question *,
00411                                             req->num_questions))) {
00412                 goto error;
00413         }
00414         if ((req->num_answers != 0) &&
00415             !(req->answers = TALLOC_ARRAY(req, struct dns_rrec *,
00416                                           req->num_answers))) {
00417                 goto error;
00418         }
00419         if ((req->num_auths != 0) &&
00420             !(req->auths = TALLOC_ARRAY(req, struct dns_rrec *,
00421                                         req->num_auths))) {
00422                 goto error;
00423         }
00424         if ((req->num_additionals != 0) &&
00425             !(req->additionals = TALLOC_ARRAY(req, struct dns_rrec *,
00426                                               req->num_additionals))) {
00427                 goto error;
00428         }
00429 
00430         for (i=0; i<req->num_questions; i++) {
00431                 dns_unmarshall_question(req->questions, buf,
00432                                         &req->questions[i]);
00433         }
00434         for (i=0; i<req->num_answers; i++) {
00435                 dns_unmarshall_rr(req->answers, buf,
00436                                   &req->answers[i]);
00437         }
00438         for (i=0; i<req->num_auths; i++) {
00439                 dns_unmarshall_rr(req->auths, buf,
00440                                   &req->auths[i]);
00441         }
00442         for (i=0; i<req->num_additionals; i++) {
00443                 dns_unmarshall_rr(req->additionals, buf,
00444                                   &req->additionals[i]);
00445         }
00446 
00447         if (!ERR_DNS_IS_OK(buf->error)) {
00448                 err = buf->error;
00449                 goto error;
00450         }
00451 
00452         *preq = req;
00453         return ERROR_DNS_SUCCESS;
00454 
00455  error:
00456         err = buf->error;
00457         TALLOC_FREE(req);
00458         return err;
00459 }

DNS_ERROR dns_marshall_update_request ( TALLOC_CTX mem_ctx,
struct dns_update_request update,
struct dns_buffer **  pbuf 
)

dnsmarshall.c508 行で定義されています。

参照先 dns_marshall_request()dns_update2request().

参照元 dns_sign_update().

00511 {
00512         return dns_marshall_request(mem_ctx, dns_update2request(update), pbuf);
00513 }

DNS_ERROR dns_unmarshall_update_request ( TALLOC_CTX mem_ctx,
struct dns_buffer buf,
struct dns_update_request **  pupreq 
)

dnsmarshall.c515 行で定義されています。

参照先 bufdns_unmarshall_request().

00518 {
00519         /*
00520          * See comments above about portability. If the above works, this will
00521          * as well.
00522          */
00523 
00524         return dns_unmarshall_request(mem_ctx, buf,
00525                                       (struct dns_request **)(void *)pupreq);
00526 }

struct dns_request* dns_update2request ( struct dns_update_request update  ) 

dnsmarshall.c461 行で定義されています。

参照先 dns_request::additionalsdns_update_request::additionalsdns_request::answersdns_request::authsdns_request::flagsdns_update_request::flagsdns_request::iddns_update_request::iddns_request::num_additionalsdns_update_request::num_additionalsdns_request::num_answersdns_request::num_authsdns_update_request::num_preqsdns_request::num_questionsdns_update_request::num_updatesdns_update_request::num_zonesdns_update_request::preqsdns_request::questionsdns_update_request::updatesdns_update_request::zones.

参照元 dns_marshall_update_request()dns_update_transaction().

00462 {
00463         struct dns_request *req;
00464 
00465         /*
00466          * This is a non-specified construct that happens to work on Linux/gcc
00467          * and I would expect it to work everywhere else. dns_request and
00468          * dns_update_request are essentially the same structures with
00469          * different names, so any difference would mean that the compiler
00470          * applied two different variations of padding given the same types in
00471          * the structures.
00472          */
00473 
00474         req = (struct dns_request *)(void *)update;
00475 
00476         /*
00477          * The assert statement here looks like we could do the equivalent
00478          * assignments to get portable, but it would mean that we have to
00479          * allocate the dns_question record for the dns_zone records. We
00480          * assume that if this assert works then the same holds true for
00481          * dns_zone<>dns_question as well.
00482          */
00483 
00484 #ifdef DEVELOPER
00485         assert((req->id == update->id) && (req->flags == update->flags) &&
00486                (req->num_questions == update->num_zones) &&
00487                (req->num_answers == update->num_preqs) &&
00488                (req->num_auths == update->num_updates) &&
00489                (req->num_additionals == update->num_additionals) &&
00490                (req->questions ==
00491                 (struct dns_question **)(void *)update->zones) &&
00492                (req->answers == update->preqs) &&
00493                (req->auths == update->updates) &&
00494                (req->additionals == update->additionals));
00495 #endif
00496 
00497         return req;
00498 }

struct dns_update_request* dns_request2update ( struct dns_request request  ) 

dnsmarshall.c500 行で定義されています。

参照元 dns_update_transaction().

00501 {
00502         /*
00503          * For portability concerns see dns_update2request;
00504          */
00505         return (struct dns_update_request *)(void *)request;
00506 }

uint16 dns_response_code ( uint16  flags  ) 

dnsmarshall.c528 行で定義されています。

参照元 DoDNSUpdate().

00529 {
00530         return flags & 0xF;
00531 }

void display_status ( const char *  msg,
OM_uint32  maj_stat,
OM_uint32  min_stat 
)

dnsgss.c75 行で定義されています。

参照先 display_status_1().

00076 {
00077         display_status_1( msg, maj_stat, GSS_C_GSS_CODE );
00078         display_status_1( msg, min_stat, GSS_C_MECH_CODE );
00079 }

DNS_ERROR dns_negotiate_sec_ctx ( const char *  target_realm,
const char *  servername,
const char *  keyname,
gss_ctx_id_t *  gss_ctx,
enum dns_ServerType  srv_type 
)

dnsgss.c208 行で定義されています。

参照先 dns_negotiate_gss_ctx_int()dns_open_connection()errerrorstrupr()talloc_asprintf()talloc_init()talloc_strdup().

参照元 DoDNSUpdate().

00213 {
00214         OM_uint32 major, minor;
00215 
00216         char *upcaserealm, *targetname;
00217         DNS_ERROR err;
00218 
00219         gss_buffer_desc input_name;
00220         struct dns_connection *conn;
00221 
00222         gss_name_t targ_name;
00223 
00224         krb5_principal host_principal;
00225         krb5_context krb_ctx = NULL;
00226 
00227         gss_OID_desc nt_host_oid_desc =
00228                 { 10, (char *)"\052\206\110\206\367\022\001\002\002\002" };
00229 
00230         TALLOC_CTX *mem_ctx;
00231 
00232         if (!(mem_ctx = talloc_init("dns_negotiate_sec_ctx"))) {
00233                 return ERROR_DNS_NO_MEMORY;
00234         }
00235 
00236         err = dns_open_connection( servername, DNS_TCP, mem_ctx, &conn );
00237         if (!ERR_DNS_IS_OK(err)) goto error;
00238 
00239         if (!(upcaserealm = talloc_strdup(mem_ctx, target_realm))) {
00240                 err = ERROR_DNS_NO_MEMORY;
00241                 goto error;
00242         }
00243 
00244         strupr(upcaserealm);
00245 
00246         if (!(targetname = talloc_asprintf(mem_ctx, "dns/%s@%s",
00247                                            servername, upcaserealm))) {
00248                 err = ERROR_DNS_NO_MEMORY;
00249                 goto error;
00250         }
00251 
00252         krb5_init_context( &krb_ctx );
00253         krb5_parse_name( krb_ctx, targetname, &host_principal );
00254 
00255         /* don't free the principal until after you call
00256            gss_release_name() or else you'll get a segv
00257            as the krb5_copy_principal() does a structure 
00258            copy and not a deep copy.    --jerry*/
00259 
00260         input_name.value = &host_principal;
00261         input_name.length = sizeof( host_principal );
00262 
00263         major = gss_import_name( &minor, &input_name,
00264                                  &nt_host_oid_desc, &targ_name );
00265 
00266         if (major) {
00267                 krb5_free_principal( krb_ctx, host_principal );
00268                 krb5_free_context( krb_ctx );
00269                 err = ERROR_DNS_GSS_ERROR;
00270                 goto error;
00271         }
00272 
00273         err = dns_negotiate_gss_ctx_int(mem_ctx, conn, keyname, 
00274                                         targ_name, gss_ctx, srv_type );
00275         
00276         gss_release_name( &minor, &targ_name );
00277 
00278         /* now we can free the principal */
00279 
00280         krb5_free_principal( krb_ctx, host_principal );
00281         krb5_free_context( krb_ctx );
00282 
00283  error:
00284         TALLOC_FREE(mem_ctx);
00285 
00286         return err;
00287 }

DNS_ERROR dns_sign_update ( struct dns_update_request req,
gss_ctx_id_t  gss_ctx,
const char *  keyname,
const char *  algorithmname,
time_t  time_signed,
uint16  fudge 
)

dnsgss.c289 行で定義されています。

参照先 dns_update_request::additionalsbufdns_add_rrec()dns_create_tsig_record()dns_domain_name_from_string()dns_marshall_domain_name()dns_marshall_uint16()dns_marshall_uint32()dns_marshall_update_request()errerrordns_update_request::iddns_update_request::num_additionals.

参照元 DoDNSUpdate().

00294 {
00295         struct dns_buffer *buf;
00296         DNS_ERROR err;
00297         struct dns_domain_name *key, *algorithm;
00298         struct gss_buffer_desc_struct msg, mic;
00299         OM_uint32 major, minor;
00300         struct dns_rrec *rec;
00301 
00302         err = dns_marshall_update_request(req, req, &buf);
00303         if (!ERR_DNS_IS_OK(err)) return err;
00304 
00305         err = dns_domain_name_from_string(buf, keyname, &key);
00306         if (!ERR_DNS_IS_OK(err)) goto error;
00307 
00308         err = dns_domain_name_from_string(buf, algorithmname, &algorithm);
00309         if (!ERR_DNS_IS_OK(err)) goto error;
00310 
00311         dns_marshall_domain_name(buf, key);
00312         dns_marshall_uint16(buf, DNS_CLASS_ANY);
00313         dns_marshall_uint32(buf, 0); /* TTL */
00314         dns_marshall_domain_name(buf, algorithm);
00315         dns_marshall_uint16(buf, 0); /* Time prefix for 48-bit time_t */
00316         dns_marshall_uint32(buf, time_signed);
00317         dns_marshall_uint16(buf, fudge);
00318         dns_marshall_uint16(buf, 0); /* error */
00319         dns_marshall_uint16(buf, 0); /* other len */
00320 
00321         err = buf->error;
00322         if (!ERR_DNS_IS_OK(buf->error)) goto error;
00323 
00324         msg.value = (void *)buf->data;
00325         msg.length = buf->offset;
00326 
00327         major = gss_get_mic(&minor, gss_ctx, 0, &msg, &mic);
00328         if (major != 0) {
00329                 err = ERROR_DNS_GSS_ERROR;
00330                 goto error;
00331         }
00332 
00333         if (mic.length > 0xffff) {
00334                 gss_release_buffer(&minor, &mic);
00335                 err = ERROR_DNS_GSS_ERROR;
00336                 goto error;
00337         }
00338 
00339         err = dns_create_tsig_record(buf, keyname, algorithmname, time_signed,
00340                                      fudge, mic.length, (uint8 *)mic.value,
00341                                      req->id, 0, &rec);
00342         gss_release_buffer(&minor, &mic);
00343         if (!ERR_DNS_IS_OK(err)) goto error;
00344 
00345         err = dns_add_rrec(req, rec, &req->num_additionals, &req->additionals);
00346 
00347  error:
00348         TALLOC_FREE(buf);
00349         return err;
00350 }

DNS_ERROR dns_create_update_request ( TALLOC_CTX mem_ctx,
const char *  domainname,
const char *  hostname,
const struct in_addr *  ip_addr,
size_t  num_adds,
struct dns_update_request **  preq 
)

dnsrecord.c360 行で定義されています。

参照先 dns_add_rrec()dns_create_a_record()dns_create_delete_record()dns_create_rrec()dns_create_update()errerrordns_update_request::num_preqsdns_update_request::num_updatesdns_update_request::preqsdns_update_request::updates.

参照元 DoDNSUpdate().

00366 {
00367         struct dns_update_request *req;
00368         struct dns_rrec *rec;
00369         DNS_ERROR err;
00370         size_t i;       
00371 
00372         err = dns_create_update(mem_ctx, domainname, &req);
00373         if (!ERR_DNS_IS_OK(err)) return err;
00374 
00375         /*
00376          * The zone must be used at all
00377          */
00378 
00379         err = dns_create_rrec(req, domainname, QTYPE_ANY, DNS_CLASS_ANY,
00380                               0, 0, NULL, &rec);
00381         if (!ERR_DNS_IS_OK(err)) goto error;
00382 
00383         err = dns_add_rrec(req, rec, &req->num_preqs, &req->preqs);
00384         if (!ERR_DNS_IS_OK(err)) goto error;
00385 
00386         /*
00387          * Delete any existing A records
00388          */
00389 
00390         err = dns_create_delete_record(req, hostname, QTYPE_A, DNS_CLASS_ANY,
00391                                        &rec);
00392         if (!ERR_DNS_IS_OK(err)) goto error;
00393         
00394         err = dns_add_rrec(req, rec, &req->num_updates, &req->updates);
00395         if (!ERR_DNS_IS_OK(err)) goto error;
00396 
00397         /*
00398          * .. and add our IPs
00399          */
00400 
00401         for ( i=0; i<num_addrs; i++ ) {         
00402                 err = dns_create_a_record(req, hostname, 3600, ip_addrs[i], &rec);
00403                 if (!ERR_DNS_IS_OK(err)) 
00404                         goto error;
00405 
00406                 err = dns_add_rrec(req, rec, &req->num_updates, &req->updates);
00407                 if (!ERR_DNS_IS_OK(err)) 
00408                         goto error;
00409         }       
00410 
00411         *preq = req;
00412         return ERROR_DNS_SUCCESS;
00413 
00414  error:
00415         TALLOC_FREE(req);
00416         return err;
00417 }


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