nmbd/nmbd_namequery.c

ソースコードを見る。

関数

static void query_name_response (struct subnet_record *subrec, struct response_record *rrec, struct packet_struct *p)
static void query_name_timeout_response (struct subnet_record *subrec, struct response_record *rrec)
static BOOL query_local_namelists (struct subnet_record *subrec, struct nmb_name *nmbname, struct name_record **namerecp)
BOOL query_name (struct subnet_record *subrec, const char *name, int type, query_name_success_function success_fn, query_name_fail_function fail_fn, struct userdata_struct *userdata)
BOOL query_name_from_wins_server (struct in_addr ip_to, const char *name, int type, query_name_success_function success_fn, query_name_fail_function fail_fn, struct userdata_struct *userdata)


関数

static void query_name_response ( struct subnet_record subrec,
struct response_record rrec,
struct packet_struct p 
) [static]

nmbd_namequery.c30 行で定義されています。

参照先 nmb_packet::answersdbgtext()response_record::fail_fnnmb_packet::headerpacket_struct::ippacket_struct::nmbnmb_namestr()response_record::num_msgsnmb_packet::opcoderesponse_record::packetpacket_struct::packetnmb_packet::questionnmb_packet::question_namenmb_packet::rcoderes_rec::rdataresponse_record::repeat_countresponse_record::repeat_timesubnet_record::subnet_nameresponse_record::success_fnpacket_struct::timestampres_rec::ttlresponse_record::userdatazero_ip().

参照元 query_name()query_name_from_wins_server().

00033 {
00034         struct nmb_packet *nmb = &p->packet.nmb;
00035         BOOL success = False;
00036         struct nmb_name *question_name = &rrec->packet->packet.nmb.question.question_name;
00037         struct in_addr answer_ip;
00038 
00039         zero_ip(&answer_ip);
00040 
00041         /* Ensure we don't retry the query but leave the response record cleanup
00042                 to the timeout code. We may get more answer responses in which case
00043                 we should mark the name in conflict.. */
00044         rrec->repeat_count = 0;
00045 
00046         if(rrec->num_msgs == 1) {
00047                 /* This is the first response. */
00048 
00049                 if(nmb->header.opcode == NMB_WACK_OPCODE) {
00050                         /* WINS server is telling us to wait. Pretend we didn't get
00051                                 the response but don't send out any more query requests. */
00052 
00053                         if( DEBUGLVL( 5 ) ) {
00054                                 dbgtext( "query_name_response: " );
00055                                 dbgtext( "WACK from WINS server %s ", inet_ntoa(p->ip) );
00056                                 dbgtext( "in querying name %s ", nmb_namestr(question_name) );
00057                                 dbgtext( "on subnet %s.\n", subrec->subnet_name );
00058                         }
00059   
00060                         rrec->repeat_count = 0;
00061                         /* How long we should wait for. */
00062                         if (nmb->answers) {
00063                                 rrec->repeat_time = p->timestamp + nmb->answers->ttl;
00064                         } else {
00065                                 /* No answer - this is probably a corrupt
00066                                    packet.... */
00067                                 DEBUG(0,("query_name_response: missing answer record in "
00068                                         "NMB_WACK_OPCODE response.\n"));
00069                                 rrec->repeat_time = p->timestamp + 10;
00070                         }
00071                         rrec->num_msgs--;
00072                         return;
00073                 } else if(nmb->header.rcode != 0) {
00074 
00075                         success = False;
00076 
00077                         if( DEBUGLVL( 5 ) ) {
00078                                 dbgtext( "query_name_response: On subnet %s ", subrec->subnet_name );
00079                                 dbgtext( "- negative response from IP %s ", inet_ntoa(p->ip) );
00080                                 dbgtext( "for name %s. ", nmb_namestr(question_name) );
00081                                 dbgtext( "Error code was %d.\n", nmb->header.rcode );
00082                         }
00083                 } else {
00084                         if (!nmb->answers) {
00085                                 dbgtext( "query_name_response: On subnet %s ", subrec->subnet_name );
00086                                 dbgtext( "IP %s ", inet_ntoa(p->ip) );
00087                                 dbgtext( "returned a success response with no answer\n" );
00088                                 return;
00089                         }
00090 
00091                         success = True;
00092 
00093                         putip((char *)&answer_ip,&nmb->answers->rdata[2]);
00094         
00095                         if( DEBUGLVL( 5 ) ) {
00096                                 dbgtext( "query_name_response: On subnet %s ", subrec->subnet_name );
00097                                 dbgtext( "- positive response from IP %s ", inet_ntoa(p->ip) );
00098                                 dbgtext( "for name %s.  ", nmb_namestr(question_name) );
00099                                 dbgtext( "IP of that name is %s\n", inet_ntoa(answer_ip) );
00100                         }
00101 
00102                         /* Interestingly, we could add these names to our namelists, and
00103                                 change nmbd to a model that checked its own name cache first,
00104                                 before sending out a query. This is a task for another day, though.
00105                         */
00106                 }
00107         } else if( rrec->num_msgs > 1) {
00108 
00109                 if( DEBUGLVL( 0 ) ) {
00110                         if (nmb->answers)
00111                                 putip( (char *)&answer_ip, &nmb->answers->rdata[2] );
00112                         dbgtext( "query_name_response: " );
00113                         dbgtext( "Multiple (%d) responses ", rrec->num_msgs );
00114                         dbgtext( "received for a query on subnet %s ", subrec->subnet_name );
00115                         dbgtext( "for name %s.\nThis response ", nmb_namestr(question_name) );
00116                         dbgtext( "was from IP %s, reporting ", inet_ntoa(p->ip) );
00117                         dbgtext( "an IP address of %s.\n", inet_ntoa(answer_ip) );
00118                 }
00119 
00120                 /* We have already called the success or fail function, so we
00121                         don't call again here. Leave the response record around in
00122                         case we get more responses. */
00123 
00124                 return; 
00125         }
00126   
00127         if(success && rrec->success_fn)
00128                 (*(query_name_success_function)rrec->success_fn)(subrec, rrec->userdata, question_name, answer_ip, nmb->answers);
00129         else if( rrec->fail_fn)
00130                 (*(query_name_fail_function)rrec->fail_fn)(subrec, rrec, question_name, nmb->header.rcode);
00131 
00132 }

static void query_name_timeout_response ( struct subnet_record subrec,
struct response_record rrec 
) [static]

nmbd_namequery.c138 行で定義されています。

参照先 dbgtext()response_record::fail_fnfailedpacket_struct::nmbnmb_namestr()response_record::num_msgspacket_struct::packetresponse_record::packetnmb_packet::questionnmb_packet::question_nameremove_response_record()subnet_record::subnet_name.

参照元 query_name()query_name_from_wins_server().

00140 {
00141         struct nmb_packet *sent_nmb = &rrec->packet->packet.nmb;
00142         /* We can only fail here, never succeed. */
00143         BOOL failed = True;
00144         struct nmb_name *question_name = &sent_nmb->question.question_name;
00145 
00146         if(rrec->num_msgs != 0) {
00147                 /* We got at least one response, and have called the success/fail
00148                         function already. */
00149 
00150                 failed = False; 
00151         }
00152 
00153         if(failed) {
00154                 if( DEBUGLVL( 5 ) ) {
00155                         dbgtext( "query_name_timeout_response: No response to " );
00156                         dbgtext( "query for name %s ", nmb_namestr(question_name) );
00157                         dbgtext( "on subnet %s.\n", subrec->subnet_name );
00158                 }
00159 
00160                 if(rrec->fail_fn)
00161                         (*(query_name_fail_function)rrec->fail_fn)(subrec, rrec, question_name, 0);
00162         }
00163 
00164         remove_response_record(subrec, rrec);
00165 }

static BOOL query_local_namelists ( struct subnet_record subrec,
struct nmb_name nmbname,
struct name_record **  namerecp 
) [static]

nmbd_namequery.c172 行で定義されています。

参照先 name_record::datafind_name_in_lmhosts()find_name_on_subnet()LMHOSTS_NAMESELF_NAMEnmb_data::source.

参照元 query_name().

00174 {
00175         struct name_record *namerec;
00176 
00177         *namerecp = NULL;
00178 
00179         if(find_name_in_lmhosts(nmbname, namerecp))
00180                 return True;
00181   
00182         if((namerec = find_name_on_subnet(subrec, nmbname, FIND_ANY_NAME))==NULL)
00183                 return False;
00184 
00185         if( NAME_IS_ACTIVE(namerec) && ( (namerec->data.source == SELF_NAME) || (namerec->data.source == LMHOSTS_NAME) ) ) {
00186                 *namerecp = namerec;
00187                 return True;
00188         } 
00189         return False;
00190 }

BOOL query_name ( struct subnet_record subrec,
const char *  name,
int  type,
query_name_success_function  success_fn,
query_name_fail_function  fail_fn,
struct userdata_struct userdata 
)

nmbd_namequery.c196 行で定義されています。

参照先 name_record::datadbgtext()nmb_data::ipmake_nmb_name()nmb_data::nb_flagsnmb_namestr()nmb_data::num_ipsquery_local_namelists()query_name_response()query_name_timeout_response()queue_query_name()set_nb_flags().

参照元 announce_and_sync_with_domain_master_browser()become_domain_master_browser_bcast()become_domain_master_browser_wins()check_master_browser_exists()collect_all_workgroup_names_from_wins_server()make_wins_proxy_name_query_request().

00200 {
00201         struct nmb_name nmbname;
00202         struct name_record *namerec;
00203 
00204         make_nmb_name(&nmbname, name, type);
00205 
00206         /*
00207          * We need to check our local namelists first.
00208          * It may be an magic name, lmhosts name or just
00209          * a name we have registered.
00210          */
00211 
00212         if(query_local_namelists(subrec, &nmbname, &namerec) == True) {
00213                 struct res_rec rrec;
00214                 int i;
00215 
00216                 memset((char *)&rrec, '\0', sizeof(struct res_rec));
00217 
00218                 /* Fake up the needed res_rec just in case it's used. */
00219                 rrec.rr_name = nmbname;
00220                 rrec.rr_type = RR_TYPE_NB;
00221                 rrec.rr_class = RR_CLASS_IN;
00222                 rrec.ttl = PERMANENT_TTL;
00223                 rrec.rdlength = namerec->data.num_ips * 6;
00224                 if(rrec.rdlength > MAX_DGRAM_SIZE) {
00225                         if( DEBUGLVL( 0 ) ) {
00226                                 dbgtext( "query_name: nmbd internal error - " );
00227                                 dbgtext( "there are %d ip addresses ", namerec->data.num_ips );
00228                                 dbgtext( "for name %s.\n", nmb_namestr(&nmbname) );
00229                         }
00230                         return False;
00231                 }
00232 
00233                 for( i = 0; i < namerec->data.num_ips; i++) {
00234                         set_nb_flags( &rrec.rdata[i*6], namerec->data.nb_flags );
00235                         putip( &rrec.rdata[(i*6) + 2], (char *)&namerec->data.ip[i]);
00236                 }
00237 
00238                 /* Call the success function directly. */
00239                 if(success_fn)
00240                         (*(query_name_success_function)success_fn)(subrec, userdata, &nmbname, namerec->data.ip[0], &rrec);
00241                 return False;
00242         }
00243 
00244         if(queue_query_name( subrec, query_name_response, query_name_timeout_response, success_fn, fail_fn, userdata, &nmbname) == NULL) {
00245                 if( DEBUGLVL( 0 ) ) {
00246                         dbgtext( "query_name: Failed to send packet " );
00247                         dbgtext( "trying to query name %s\n", nmb_namestr(&nmbname) );
00248                 }
00249                 return True;
00250         }
00251         return False;
00252 }

BOOL query_name_from_wins_server ( struct in_addr  ip_to,
const char *  name,
int  type,
query_name_success_function  success_fn,
query_name_fail_function  fail_fn,
struct userdata_struct userdata 
)

nmbd_namequery.c258 行で定義されています。

参照先 dbgtext()make_nmb_name()nmb_namestr()query_name_response()query_name_timeout_response()queue_query_name_from_wins_server().

参照元 wins_process_multihomed_name_registration_request()wins_process_name_registration_request().

00263 {
00264         struct nmb_name nmbname;
00265 
00266         make_nmb_name(&nmbname, name, type);
00267 
00268         if(queue_query_name_from_wins_server( ip_to, query_name_response, query_name_timeout_response, success_fn, fail_fn, userdata, &nmbname) == NULL) {
00269                 if( DEBUGLVL( 0 ) ) {
00270                         dbgtext( "query_name_from_wins_server: Failed to send packet " );
00271                         dbgtext( "trying to query name %s\n", nmb_namestr(&nmbname) );
00272                 }
00273                 return True;
00274         }
00275         return False;
00276 }


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