Changeset 1e55d820 in rtems-libbsd


Ignore:
Timestamp:
Sep 19, 2018, 6:56:44 AM (13 months ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
c1e05b9ea378b2971e3d7704779112b4bc4296da, 4a77611a223ea883fb548679b516d326a020d447
Children:
2723609
Parents:
4c086a2
git-author:
Sebastian Huber <sebastian.huber@…> (09/19/18 06:56:44)
git-committer:
Sebastian Huber <sebastian.huber@…> (09/20/18 09:23:33)
Message:

mDNSResponder: Update to v878.20.3

The sources can be obtained via:

https://opensource.apple.com/tarballs/mDNSResponder/mDNSResponder-878.20.3.tar.gz

Update #3522.

Location:
mDNSResponder
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • mDNSResponder/Clients/dnssdutil.c

    r4c086a2 r1e55d820  
    2020
    2121#if( TARGET_OS_DARWIN )
     22        #include <dnsinfo.h>
    2223        #include <libproc.h>
    2324        #include <sys/proc_info.h>
     
    349350        BooleanOption( 'o', "oneshot",          &gQueryRecord_OneShot,                  "Finish after first set of results." ),
    350351        IntegerOption( 'l', "timeLimit",        &gQueryRecord_TimeLimitSecs,    "seconds", "Maximum duration of the query record operation. Use '0' for no time limit.", false ),
    351         BooleanOption( 'r', "raw",                      &gQueryRecord_RawRData,                 "Show record data as a hexdump." ),
     352        BooleanOption(  0 , "raw",                      &gQueryRecord_RawRData,                 "Show record data as a hexdump." ),
    352353       
    353354        ConnectionSection(),
     
    503504//===========================================================================================================================
    504505
    505 static const char *             gGAIPOSIX_Name          = NULL;
    506 static const char *             gGAIPOSIX_Family        = NULL;
     506static const char *             gGAIPOSIX_HostName                      = NULL;
     507static const char *             gGAIPOSIX_ServName                      = NULL;
     508static const char *             gGAIPOSIX_Family                        = NULL;
     509static int                              gGAIPOSIXFlag_AddrConfig        = false;
     510static int                              gGAIPOSIXFlag_All                       = false;
     511static int                              gGAIPOSIXFlag_CanonName         = false;
     512static int                              gGAIPOSIXFlag_NumericHost       = false;
     513static int                              gGAIPOSIXFlag_NumericServ       = false;
     514static int                              gGAIPOSIXFlag_Passive           = false;
     515static int                              gGAIPOSIXFlag_V4Mapped          = false;
     516#if( defined( AI_V4MAPPED_CFG ) )
     517static int                              gGAIPOSIXFlag_V4MappedCFG       = false;
     518#endif
     519#if( defined( AI_DEFAULT ) )
     520static int                              gGAIPOSIXFlag_Default           = false;
     521#endif
    507522
    508523static CLIOption                kGetAddrInfoPOSIXOpts[] =
    509524{
    510         StringOption(   'n', "name",    &gGAIPOSIX_Name,        "domain name", "Domain name to resolve.", true ),
    511         StringOptionEx( 'f', "family",  &gGAIPOSIX_Family,      "address family", "Address family to pass to getaddrinfo().", false,
    512                 "The address family value determines which value to use for the ai_family element of the hints struct addrinfo\n"
    513                 "argument used when calling getaddrinfo().\n"
     525        StringOption(   'n', "hostname",                        &gGAIPOSIX_HostName,            "hostname", "Domain name to resolve or an IPv4 or IPv6 address.", true ),
     526        StringOption(   's', "servname",                        &gGAIPOSIX_ServName,            "servname", "Port number in decimal or service name from services(5).", false ),
     527       
     528        CLI_OPTION_GROUP( "Hints " ),
     529        StringOptionEx( 'f', "family",                          &gGAIPOSIX_Family,                      "address family", "Address family to use for hints ai_family field.", false,
    514530                "\n"
    515531                "Possible address family values are 'inet' for AF_INET, 'inet6' for AF_INET6, or 'unspec' for AF_UNSPEC. If no\n"
    516                 "address family is specified, then AF_UNSPEC is used.\n" ),
     532                "address family is specified, then AF_UNSPEC is used.\n"
     533                "\n" ),
     534        BooleanOption(   0 , "flag-addrconfig",         &gGAIPOSIXFlag_AddrConfig,      "In hints ai_flags field, set AI_ADDRCONFIG." ),
     535        BooleanOption(   0 , "flag-all",                        &gGAIPOSIXFlag_All,                     "In hints ai_flags field, set AI_ALL." ),
     536        BooleanOption(   0 , "flag-canonname",          &gGAIPOSIXFlag_CanonName,       "In hints ai_flags field, set AI_CANONNAME." ),
     537        BooleanOption(   0 , "flag-numerichost",        &gGAIPOSIXFlag_NumericHost,     "In hints ai_flags field, set AI_NUMERICHOST." ),
     538        BooleanOption(   0 , "flag-numericserv",        &gGAIPOSIXFlag_NumericServ,     "In hints ai_flags field, set AI_NUMERICSERV." ),
     539        BooleanOption(   0 , "flag-passive",            &gGAIPOSIXFlag_Passive,         "In hints ai_flags field, set AI_PASSIVE." ),
     540        BooleanOption(   0 , "flag-v4mapped",           &gGAIPOSIXFlag_V4Mapped,        "In hints ai_flags field, set AI_V4MAPPED." ),
     541#if( defined( AI_V4MAPPED_CFG ) )
     542        BooleanOption(   0 , "flag-v4mappedcfg",        &gGAIPOSIXFlag_V4MappedCFG,     "In hints ai_flags field, set AI_V4MAPPED_CFG." ),
     543#endif
     544#if( defined( AI_DEFAULT ) )
     545        BooleanOption(   0 , "flag-default",            &gGAIPOSIXFlag_Default,         "In hints ai_flags field, set AI_DEFAULT." ),
     546#endif
     547       
     548        CLI_SECTION( "Notes", "See getaddrinfo(3) man page for more details.\n" ),
    517549        CLI_OPTION_END()
    518550};
     
    612644static int                      gDNSQuery_Verbose               = false;
    613645
     646#if( TARGET_OS_DARWIN )
     647        #define kDNSQueryServerOptionIsRequired         false
     648#else
     649        #define kDNSQueryServerOptionIsRequired         true
     650#endif
     651
    614652static CLIOption                kDNSQueryOpts[] =
    615653{
    616654        StringOption(  'n', "name",                     &gDNSQuery_Name,                        "name", "Question name (QNAME) to put in DNS query message.", true ),
    617655        StringOption(  't', "type",                     &gDNSQuery_Type,                        "type", "Question type (QTYPE) to put in DNS query message. Default value is 'A'.", false ),
    618         StringOption(  's', "server",           &gDNSQuery_Server,                      "IP address", "DNS server's IPv4 or IPv6 address.", true ),
     656        StringOption(  's', "server",           &gDNSQuery_Server,                      "IP address", "DNS server's IPv4 or IPv6 address.", kDNSQueryServerOptionIsRequired ),
    619657        IntegerOption( 'l', "timeLimit",        &gDNSQuery_TimeLimitSecs,       "seconds", "Specifies query time limit. Use '-1' for no limit and '0' to exit immediately after sending.", false ),
    620658        BooleanOption(  0 , "tcp",                      &gDNSQuery_UseTCP,                      "Send the DNS query via TCP instead of UDP." ),
    621659        IntegerOption( 'f', "flags",            &gDNSQuery_Flags,                       "flags", "16-bit value for DNS header flags/codes field. Default value is 0x0100 (Recursion Desired).", false ),
    622         BooleanOption( 'r', "raw",                      &gDNSQuery_RawRData,            "Present record data as a hexdump." ),
     660        BooleanOption(  0 , "raw",                      &gDNSQuery_RawRData,            "Present record data as a hexdump." ),
    623661        BooleanOption( 'v', "verbose",          &gDNSQuery_Verbose,                     "Prints the DNS message to be sent to the server." ),
    624662        CLI_OPTION_END()
     
    647685        StringOption(  's', "server",           &gDNSCrypt_Server,                      "IP address", "DNS server's IPv4 or IPv6 address.", true ),
    648686        IntegerOption( 'l', "timeLimit",        &gDNSCrypt_TimeLimitSecs,       "seconds", "Specifies query time limit. Use '-1' for no time limit and '0' to exit immediately after sending.", false ),
    649         BooleanOption( 'r', "raw",                      &gDNSCrypt_RawRData,            "Present record data as a hexdump." ),
     687        BooleanOption(  0 , "raw",                      &gDNSCrypt_RawRData,            "Present record data as a hexdump." ),
    650688        BooleanOption( 'v', "verbose",          &gDNSCrypt_Verbose,                     "Prints the DNS message to be sent to the server." ),
    651689        CLI_OPTION_END()
     
    665703static int                      gMDNSQuery_UseIPv6              = false;
    666704static int                      gMDNSQuery_AllResponses = false;
     705static int                      gMDNSQuery_ReceiveSecs  = 1;
    667706
    668707static CLIOption                kMDNSQueryOpts[] =
     
    673712        IntegerOption( 'p', "sourcePort",       &gMDNSQuery_SourcePort,         "port number", "UDP source port to use when sending mDNS messages. Default is 5353 for QM questions.", false ),
    674713        BooleanOption( 'u', "QU",                       &gMDNSQuery_IsQU,                       "Set the unicast-response bit, i.e., send a QU question." ),
    675         BooleanOption( 'r', "raw",                      &gMDNSQuery_RawRData,           "Present record data as a hexdump." ),
     714        BooleanOption(  0 , "raw",                      &gMDNSQuery_RawRData,           "Present record data as a hexdump." ),
    676715        BooleanOption(  0 , "ipv4",                     &gMDNSQuery_UseIPv4,            "Use IPv4." ),
    677716        BooleanOption(  0 , "ipv6",                     &gMDNSQuery_UseIPv6,            "Use IPv6." ),
    678         BooleanOption( 'a', "allResponses",     &gMDNSQuery_AllResponses,       "Print all responses." ),
     717        BooleanOption( 'a', "allResponses",     &gMDNSQuery_AllResponses,       "Print all received mDNS messages, not just those containing answers." ),
     718        IntegerOption( 'r', "receiveTime",      &gMDNSQuery_ReceiveSecs,        "seconds", "Amount of time to spend receiving messages after the query is sent. The default is one second. Use -1 for unlimited time.", false ),
    679719        CLI_OPTION_END()
    680720};
     
    932972static OSStatus         StringToInt32( const char *inString, int32_t *outValue );
    933973static OSStatus         StringToUInt32( const char *inString, uint32_t *outValue );
     974#if( TARGET_OS_DARWIN )
     975static OSStatus         GetDefaultDNSServer( sockaddr_ip *outAddr );
     976#endif
    934977
    935978#define AddRmvString( X )               ( ( (X) & kDNSServiceFlagsAdd ) ? "Add" : "Rmv" )
     
    16871730        Boolean                         oneShotMode;    // True if command is done after the first set of results (one-shot mode).
    16881731        Boolean                         gotRecord;              // True if in one-shot mode and received at least one record of the desired type.
    1689         Boolean                         printRawRData;  // True if RDATA results are not to be formatted.
     1732        Boolean                         printRawRData;  // True if RDATA results are not to be formatted when printed.
    16901733       
    16911734}       QueryRecordContext;
     
    27542797static void     GetAddrInfoPOSIXCmd( void )
    27552798{
    2756         OSStatus                                err;
    2757         struct addrinfo                 hints;
    2758         struct addrinfo *               addrInfo;
    2759         struct addrinfo *               addrInfoList = NULL;
    2760         int                                             addrCount;
    2761         char                                    time[ kTimestampBufLen ];
     2799        OSStatus                                        err;
     2800        struct addrinfo                         hints;
     2801        const struct addrinfo *         addrInfo;
     2802        struct addrinfo *                       addrInfoList = NULL;
     2803        char                                            time[ kTimestampBufLen ];
    27622804       
    27632805        memset( &hints, 0, sizeof( hints ) );
    27642806        hints.ai_socktype = SOCK_STREAM;
     2807       
     2808        // Set hints address family.
     2809       
    27652810        if( !gGAIPOSIX_Family )                                                                         hints.ai_family = AF_UNSPEC;
    27662811        else if( strcasecmp( gGAIPOSIX_Family, "inet" ) == 0 )          hints.ai_family = AF_INET;
     
    27742819        }
    27752820       
    2776         FPrintF( stdout, "Name:           %s\n", gGAIPOSIX_Name );
    2777         FPrintF( stdout, "Address family: %s\n", AddressFamilyStr( hints.ai_family ) );
     2821        // Set hints flags.
     2822       
     2823        if( gGAIPOSIXFlag_AddrConfig )  hints.ai_flags |= AI_ADDRCONFIG;
     2824        if( gGAIPOSIXFlag_All )                 hints.ai_flags |= AI_ALL;
     2825        if( gGAIPOSIXFlag_CanonName )   hints.ai_flags |= AI_CANONNAME;
     2826        if( gGAIPOSIXFlag_NumericHost ) hints.ai_flags |= AI_NUMERICHOST;
     2827        if( gGAIPOSIXFlag_NumericServ ) hints.ai_flags |= AI_NUMERICSERV;
     2828        if( gGAIPOSIXFlag_Passive )             hints.ai_flags |= AI_PASSIVE;
     2829        if( gGAIPOSIXFlag_V4Mapped )    hints.ai_flags |= AI_V4MAPPED;
     2830#if( defined( AI_V4MAPPED_CFG ) )
     2831        if( gGAIPOSIXFlag_V4MappedCFG ) hints.ai_flags |= AI_V4MAPPED_CFG;
     2832#endif
     2833#if( defined( AI_DEFAULT ) )
     2834        if( gGAIPOSIXFlag_Default )             hints.ai_flags |= AI_DEFAULT;
     2835#endif
     2836       
     2837        // Print prologue.
     2838       
     2839        FPrintF( stdout, "Hostname:       %s\n",        gGAIPOSIX_HostName );
     2840        FPrintF( stdout, "Servname:       %s\n",        gGAIPOSIX_ServName );
     2841        FPrintF( stdout, "Address family: %s\n",        AddressFamilyStr( hints.ai_family ) );
     2842        FPrintF( stdout, "Flags:          0x%X < ",     hints.ai_flags );
     2843        if( hints.ai_flags & AI_NUMERICSERV )   FPrintF( stdout, "AI_NUMERICSERV " );
     2844        if( hints.ai_flags & AI_V4MAPPED )              FPrintF( stdout, "AI_V4MAPPED " );
     2845        if( hints.ai_flags & AI_ADDRCONFIG )    FPrintF( stdout, "AI_ADDRCONFIG " );
     2846#if( defined( AI_V4MAPPED_CFG ) )
     2847        if( hints.ai_flags & AI_V4MAPPED_CFG )  FPrintF( stdout, "AI_V4MAPPED_CFG " );
     2848#endif
     2849        if( hints.ai_flags & AI_ALL )                   FPrintF( stdout, "AI_ALL " );
     2850        if( hints.ai_flags & AI_NUMERICHOST )   FPrintF( stdout, "AI_NUMERICHOST " );
     2851        if( hints.ai_flags & AI_CANONNAME )             FPrintF( stdout, "AI_CANONNAME " );
     2852        if( hints.ai_flags & AI_PASSIVE )               FPrintF( stdout, "AI_PASSIVE " );
     2853        FPrintF( stdout, ">\n" );
    27782854        FPrintF( stdout, "Start time:     %s\n", GetTimestampStr( time ) );
    27792855        FPrintF( stdout, "---\n" );
    27802856       
    2781         err = getaddrinfo( gGAIPOSIX_Name, NULL, &hints, &addrInfoList );
    2782         FPrintF( stdout, "%s:\n", GetTimestampStr( time ) );
     2857        // Call getaddrinfo().
     2858       
     2859        err = getaddrinfo( gGAIPOSIX_HostName, gGAIPOSIX_ServName, &hints, &addrInfoList );
     2860        GetTimestampStr( time );
    27832861        if( err )
    27842862        {
    2785                 FPrintF( stderr, "getaddrinfo() error %#m: %s.\n", err, gai_strerror( err ) );
    2786                 goto exit;
    2787         }
    2788        
    2789         addrCount = 0;
    2790         for( addrInfo = addrInfoList; addrInfo; addrInfo = addrInfo->ai_next ) { ++addrCount; }
    2791        
    2792         FPrintF( stdout, "Addresses (%d total):\n", addrCount );
    2793         for( addrInfo = addrInfoList; addrInfo; addrInfo = addrInfo->ai_next )
    2794         {
    2795                 FPrintF( stdout, "%##a\n", addrInfo->ai_addr );
    2796         }
     2863                FPrintF( stderr, "Error %#m: %s.\n", err, gai_strerror( err ) );
     2864        }
     2865        else
     2866        {
     2867                int             addrCount = 0;
     2868               
     2869                for( addrInfo = addrInfoList; addrInfo; addrInfo = addrInfo->ai_next ) { ++addrCount; }
     2870               
     2871                FPrintF( stdout, "Addresses (%d total):\n", addrCount );
     2872                for( addrInfo = addrInfoList; addrInfo; addrInfo = addrInfo->ai_next )
     2873                {
     2874                        FPrintF( stdout, "%##a\n", addrInfo->ai_addr );
     2875                }
     2876        }
     2877        FPrintF( stdout, "---\n" );
     2878        FPrintF( stdout, "End time:       %s\n", time );
    27972879       
    27982880exit:
    2799         FPrintF( stdout, "---\n" );
    2800         FPrintF( stdout, "End time:       %s\n", GetTimestampStr( time ) );
    2801        
    28022881        if( addrInfoList ) freeaddrinfo( addrInfoList );
    28032882        if( err ) exit( 1 );
     
    45714650        if( gDNSQuery_TimeLimitSecs < -1 )
    45724651        {
    4573                 FPrintF( stdout, "Invalid wait period: %d seconds.\n", gDNSQuery_TimeLimitSecs );
     4652                FPrintF( stdout, "Invalid time limit: %d seconds.\n", gDNSQuery_TimeLimitSecs );
    45744653                err = kParamErr;
    45754654                goto exit;
     
    45944673        context->printRawRData  = gDNSQuery_RawRData ? true : false;
    45954674       
    4596         err = StringToSockAddr( gDNSQuery_Server, &context->serverAddr, sizeof( context->serverAddr ), NULL );
    4597         require_noerr( err, exit );
     4675#if( TARGET_OS_DARWIN )
     4676        if( gDNSQuery_Server )
     4677#endif
     4678        {
     4679                err = StringToSockAddr( gDNSQuery_Server, &context->serverAddr, sizeof( context->serverAddr ), NULL );
     4680                require_noerr( err, exit );
     4681        }
     4682#if( TARGET_OS_DARWIN )
     4683        else
     4684        {
     4685                err = GetDefaultDNSServer( &context->serverAddr );
     4686                require_noerr( err, exit );
     4687        }
     4688#endif
    45984689        if( SockAddrGetPort( &context->serverAddr ) == 0 ) SockAddrSetPort( &context->serverAddr, kDNSPort );
    45994690       
     
    48944985        // Check command parameters.
    48954986       
    4896         if( gDNSQuery_TimeLimitSecs < -1 )
    4897         {
    4898                 FPrintF( stdout, "Invalid wait period: %d seconds.\n", gDNSQuery_TimeLimitSecs );
     4987        if( gDNSCrypt_TimeLimitSecs < -1 )
     4988        {
     4989                FPrintF( stdout, "Invalid time limit: %d seconds.\n", gDNSCrypt_TimeLimitSecs );
    48994990                err = kParamErr;
    49004991                goto exit;
     
    54105501//===========================================================================================================================
    54115502
    5412 #define kMDNSMulticastAddressIPv4       0xE00000FB      // 224.0.0.251
    54135503#define kMDNSPort                                       5353
    54145504
     
    54185508typedef struct
    54195509{
    5420         const char *                    qname;
    5421         dispatch_source_t               readSourceV4;
    5422         dispatch_source_t               readSourceV6;
    5423         int                                             receivedMsgCount;
    5424         int                                             localPort;
    5425         uint32_t                                ifIndex;
    5426         uint16_t                                type;
    5427         Boolean                                 isQU;
    5428         Boolean                                 printRawRData;
    5429         Boolean                                 useIPv4;
    5430         Boolean                                 useIPv6;
    5431         Boolean                                 allResponses;
    5432         char                                    ifName[ IF_NAMESIZE + 1 ];
    5433         uint8_t                                 domainName[ kDomainNameLengthMax ];
    5434         uint8_t                                 msgBuf[ 8940 ];
     5510        const char *                    qnameStr;                                                       // Name (QNAME) of the record being queried as a C string.
     5511        dispatch_source_t               readSourceV4;                                           // Read dispatch source for IPv4 socket.
     5512        dispatch_source_t               readSourceV6;                                           // Read dispatch source for IPv6 socket.
     5513        int                                             localPort;                                                      // The port number to which the sockets are bound.
     5514        int                                             receiveSecs;                                            // After send, the amount of time to spend receiving.
     5515        uint32_t                                ifIndex;                                                        // Index of the interface over which to send the query.
     5516        uint16_t                                qtype;                                                          // The type (QTYPE) of the record being queried.
     5517        Boolean                                 isQU;                                                           // True if the query is QU, i.e., requests unicast responses.
     5518        Boolean                                 allResponses;                                           // True if all mDNS messages received should be printed.
     5519        Boolean                                 printRawRData;                                          // True if RDATA should be printed as hexdumps.
     5520        Boolean                                 useIPv4;                                                        // True if the query should be sent via IPv4 multicast.
     5521        Boolean                                 useIPv6;                                                        // True if the query should be sent via IPv6 multicast.
     5522        char                                    ifName[ IF_NAMESIZE + 1 ];                      // Name of the interface over which to send the query.
     5523        uint8_t                                 qname[ kDomainNameLengthMax ];          // Buffer to hold the QNAME in label format.
     5524        uint8_t                                 msgBuf[ 8940 ];                                         // Message buffer. 8940 is max size used by mDNSResponder.
    54355525       
    54365526}       MDNSQueryContext;
     
    54495539        ssize_t                                 n;
    54505540        const char *                    ifNamePtr;
    5451         SocketContext *                 sockContext;
    54525541        size_t                                  msgLen;
     5542        unsigned int                    sendCount;
     5543       
     5544        // Check command parameters.
     5545       
     5546        if( gMDNSQuery_ReceiveSecs < -1 )
     5547        {
     5548                FPrintF( stdout, "Invalid receive time value: %d seconds.\n", gMDNSQuery_ReceiveSecs );
     5549                err = kParamErr;
     5550                goto exit;
     5551        }
    54535552       
    54545553        context = (MDNSQueryContext *) calloc( 1, sizeof( *context ) );
    54555554        require_action( context, exit, err = kNoMemoryErr );
    54565555       
    5457         context->qname                  = gMDNSQuery_Name;
     5556        context->qnameStr               = gMDNSQuery_Name;
     5557        context->receiveSecs    = gMDNSQuery_ReceiveSecs;
    54585558        context->isQU                   = gMDNSQuery_IsQU                 ? true : false;
     5559        context->allResponses   = gMDNSQuery_AllResponses ? true : false;
    54595560        context->printRawRData  = gMDNSQuery_RawRData     ? true : false;
    5460         context->allResponses   = gMDNSQuery_AllResponses ? true : false;
    54615561        context->useIPv4                = ( gMDNSQuery_UseIPv4 || !gMDNSQuery_UseIPv6 ) ? true : false;
    54625562        context->useIPv6                = ( gMDNSQuery_UseIPv6 || !gMDNSQuery_UseIPv4 ) ? true : false;
     
    54685568        require_action( ifNamePtr, exit, err = kNameErr );
    54695569       
    5470         err = RecordTypeFromArgString( gMDNSQuery_Type, &context->type );
     5570        err = RecordTypeFromArgString( gMDNSQuery_Type, &context->qtype );
    54715571        require_noerr( err, exit );
    54725572       
     
    54915591                mcastAddr4.sin_family           = AF_INET;
    54925592                mcastAddr4.sin_port                     = htons( kMDNSPort );
    5493                 mcastAddr4.sin_addr.s_addr      = htonl( kMDNSMulticastAddressIPv4 );
     5593                mcastAddr4.sin_addr.s_addr      = htonl( 0xE00000FB );  // The mDNS IPv4 multicast address is 224.0.0.251
    54945594               
    54955595                if( !context->isQU && ( context->localPort == kMDNSPort ) )
     
    55315631        }
    55325632       
    5533         // Write mDNS query message.
     5633        // Craft mDNS query message.
    55345634       
    55355635        check_compile_time_code( sizeof( context->msgBuf ) >= kDNSQueryMessageMaxLen );
    5536         err = WriteDNSQueryMessage( context->msgBuf, kDefaultMDNSMessageID, kDefaultMDNSQueryFlags, context->qname,
    5537                 context->type,
    5538                 context->isQU ? ( kDNSServiceClass_IN | kQClassUnicastResponseBit ) : kDNSServiceClass_IN, &msgLen );
     5636        err = WriteDNSQueryMessage( context->msgBuf, kDefaultMDNSMessageID, kDefaultMDNSQueryFlags, context->qnameStr,
     5637                context->qtype, context->isQU ? ( kDNSServiceClass_IN | kQClassUnicastResponseBit ) : kDNSServiceClass_IN, &msgLen );
    55395638        require_noerr( err, exit );
    55405639       
     
    55435642        MDNSQueryPrintPrologue( context );
    55445643       
    5545         if( context->useIPv4 )
     5644        // Send mDNS query message.
     5645       
     5646        sendCount = 0;
     5647        if( IsValidSocket( sockV4 ) )
    55465648        {
    55475649                n = sendto( sockV4, context->msgBuf, msgLen, 0, (struct sockaddr *) &mcastAddr4, (socklen_t) sizeof( mcastAddr4 ) );
    55485650                err = map_socket_value_errno( sockV4, n == (ssize_t) msgLen, n );
    5549                 require_noerr_quiet( err, exit );
     5651                if( err )
     5652                {
     5653                        FPrintF( stderr, "*** Failed to send query on IPv4 socket with error %#m\n", err );
     5654                        ForgetSocket( &sockV4 );
     5655                }
     5656                else
     5657                {
     5658                        ++sendCount;
     5659                }
     5660        }
     5661        if( IsValidSocket( sockV6 ) )
     5662        {
     5663                n = sendto( sockV6, context->msgBuf, msgLen, 0, (struct sockaddr *) &mcastAddr6, (socklen_t) sizeof( mcastAddr6 ) );
     5664                err = map_socket_value_errno( sockV6, n == (ssize_t) msgLen, n );
     5665                if( err )
     5666                {
     5667                        FPrintF( stderr, "*** Failed to send query on IPv6 socket with error %#m\n", err );
     5668                        ForgetSocket( &sockV6 );
     5669                }
     5670                else
     5671                {
     5672                        ++sendCount;
     5673                }
     5674        }
     5675        require_action_quiet( sendCount > 0, exit, err = kUnexpectedErr );
     5676       
     5677        // If there's no wait period after the send, then exit.
     5678       
     5679        if( context->receiveSecs == 0 ) goto exit;
     5680       
     5681        // Create dispatch read sources for socket(s).
     5682       
     5683        if( IsValidSocket( sockV4 ) )
     5684        {
     5685                SocketContext *         sockContext;
    55505686               
    55515687                sockContext = (SocketContext *) calloc( 1, sizeof( *sockContext ) );
     
    55635699        }
    55645700       
    5565         if( context->useIPv6 )
    5566         {
    5567                 n = sendto( sockV6, context->msgBuf, msgLen, 0, (struct sockaddr *) &mcastAddr6, (socklen_t) sizeof( mcastAddr6 ) );
    5568                 err = map_socket_value_errno( sockV6, n == (ssize_t) msgLen, n );
    5569                 require_noerr_quiet( err, exit );
     5701        if( IsValidSocket( sockV6 ) )
     5702        {
     5703                SocketContext *         sockContext;
    55705704               
    55715705                sockContext = (SocketContext *) calloc( 1, sizeof( *sockContext ) );
     
    55835717        }
    55845718       
     5719        if( context->receiveSecs > 0 )
     5720        {
     5721                dispatch_after_f( dispatch_time_seconds( context->receiveSecs ), dispatch_get_main_queue(), kExitReason_Timeout,
     5722                        Exit );
     5723        }
    55855724        dispatch_main();
    55865725       
     
    55975736static void     MDNSQueryPrintPrologue( const MDNSQueryContext *inContext )
    55985737{
    5599         char            time[ kTimestampBufLen ];
    5600        
    5601         FPrintF( stdout, "Interface:   %d (%s)\n",      (int32_t) inContext->ifIndex, inContext->ifName );
    5602         FPrintF( stdout, "Name:        %s\n",           inContext->qname );
    5603         FPrintF( stdout, "Type:        %s (%u)\n",      RecordTypeToString( inContext->type ), inContext->type );
    5604         FPrintF( stdout, "Class:       IN (%s)\n",      inContext->isQU ? "QU" : "QM" );
    5605         FPrintF( stdout, "Local port:  %d\n",           inContext->localPort );
     5738        const int               receiveSecs = inContext->receiveSecs;
     5739        char                    time[ kTimestampBufLen ];
     5740       
     5741        FPrintF( stdout, "Interface:        %d (%s)\n",         (int32_t) inContext->ifIndex, inContext->ifName );
     5742        FPrintF( stdout, "Name:             %s\n",                      inContext->qnameStr );
     5743        FPrintF( stdout, "Type:             %s (%u)\n",         RecordTypeToString( inContext->qtype ), inContext->qtype );
     5744        FPrintF( stdout, "Class:            IN (%s)\n",         inContext->isQU ? "QU" : "QM" );
     5745        FPrintF( stdout, "Local port:       %d\n",                      inContext->localPort );
     5746        FPrintF( stdout, "IP protocols:     %?s%?s%?s\n",
     5747                inContext->useIPv4, "IPv4", ( inContext->useIPv4 && inContext->useIPv6 ), ", ", inContext->useIPv6, "IPv6" );
     5748        FPrintF( stdout, "Receive duration: " );
     5749        if( receiveSecs >= 0 )  FPrintF( stdout, "%d second%?c\n", receiveSecs, receiveSecs != 1, 's' );
     5750        else                                    FPrintF( stdout, "∞\n" );
    56065751        FPrintF( stdout, "Start time:  %s\n",           GetTimestampStr( time ) );
    56075752}
     
    56335778                unsigned int                            rrCount, i;
    56345779                uint16_t                                        type, class;
    5635                 uint8_t                                         domainName[ kDomainNameLengthMax ];
     5780                uint8_t                                         name[ kDomainNameLengthMax ];
    56365781               
    56375782                err = DNSMessageGetAnswerSection( context->msgBuf, msgLen, &ptr );
    56385783                require_noerr( err, exit );
    56395784               
    5640                 if( context->domainName[ 0 ] == 0 )
    5641                 {
    5642                         err = DomainNameAppendString( context->domainName, context->qname, NULL );
     5785                if( context->qname[ 0 ] == 0 )
     5786                {
     5787                        err = DomainNameAppendString( context->qname, context->qnameStr, NULL );
    56435788                        require_noerr( err, exit );
    56445789                }
     
    56475792                for( i = 0; i < rrCount; ++i )
    56485793                {
    5649                         err = DNSMessageExtractRecord( context->msgBuf, msgLen, ptr, domainName, &type, &class, NULL, NULL, NULL, &ptr );
     5794                        err = DNSMessageExtractRecord( context->msgBuf, msgLen, ptr, name, &type, &class, NULL, NULL, NULL, &ptr );
    56505795                        require_noerr( err, exit );
    56515796                       
    5652                         if( ( type == context->type ) && DomainNameEqual( domainName, context->domainName ) )
     5797                        if( ( ( context->qtype == kDNSServiceType_ANY ) || ( type == context->qtype ) ) &&
     5798                                DomainNameEqual( name, context->qname ) )
    56535799                        {
    56545800                                foundAnswer = true;
     
    68186964        rcode                   = DNSFlagsGetRCode( flags );
    68196965       
    6820         FPrintF( stdout, "ID:               0x%04X\n", id );
     6966        FPrintF( stdout, "ID:               0x%04X (%u)\n", id, id );
    68216967        FPrintF( stdout, "Flags:            0x%04X %c/%s %cAA%cTC%cRD%cRA %s\n",
    68226968                flags,
     
    71557301        return( err );
    71567302}
     7303
     7304#if( TARGET_OS_DARWIN )
     7305//===========================================================================================================================
     7306//      GetDefaultDNSServer
     7307//===========================================================================================================================
     7308
     7309static OSStatus GetDefaultDNSServer( sockaddr_ip *outAddr )
     7310{
     7311        OSStatus                                err;
     7312        dns_config_t *                  config;
     7313        struct sockaddr *               addr;
     7314        int32_t                                 i;
     7315       
     7316        config = dns_configuration_copy();
     7317        require_action( config, exit, err = kUnknownErr );
     7318       
     7319        addr = NULL;
     7320        for( i = 0; i < config->n_resolver; ++i )
     7321        {
     7322                const dns_resolver_t * const            resolver = config->resolver[ i ];
     7323               
     7324                if( !resolver->domain && ( resolver->n_nameserver > 0 ) )
     7325                {
     7326                        addr = resolver->nameserver[ 0 ];
     7327                        break;
     7328                }
     7329        }
     7330        require_action_quiet( addr, exit, err = kNotFoundErr );
     7331       
     7332        SockAddrCopy( addr, outAddr );
     7333        err = kNoErr;
     7334       
     7335exit:
     7336        if( config ) dns_configuration_free( config );
     7337        return( err );
     7338}
     7339#endif
    71577340
    71587341//===========================================================================================================================
  • mDNSResponder/Makefile

    r4c086a2 r1e55d820  
    1717include $(MAKEFILEPATH)/pb_makefiles/platform.make
    1818
    19 MVERS = "mDNSResponder-878.1.1"
     19MVERS = "mDNSResponder-878.20.3"
    2020
    2121VER =
  • mDNSResponder/mDNSShared/dns_sd.h

    r4c086a2 r1e55d820  
    6767
    6868#ifndef _DNS_SD_H
    69 #define _DNS_SD_H 8780101
     69#define _DNS_SD_H 8782003
    7070
    7171#ifdef  __cplusplus
Note: See TracChangeset for help on using the changeset viewer.