dnssd 1.1.0 → 1.2
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/.autotest +10 -11
- data/History.txt +28 -3
- data/Manifest.txt +4 -2
- data/README.txt +10 -8
- data/ext/dnssd/dnssd.c +81 -4
- data/ext/dnssd/dnssd.h +3 -1
- data/ext/dnssd/errors.c +61 -39
- data/ext/dnssd/extconf.rb +4 -1
- data/ext/dnssd/flags.c +84 -22
- data/ext/dnssd/service.c +242 -553
- data/lib/dnssd.rb +138 -109
- data/lib/dnssd/flags.rb +13 -1
- data/lib/dnssd/reply.rb +71 -2
- data/lib/dnssd/service.rb +147 -4
- data/sample/enumerate_domains.rb +13 -0
- data/sample/resolve.rb +2 -2
- data/sample/server.rb +19 -0
- data/sample/socket.rb +18 -0
- data/test/test_dnssd.rb +75 -0
- data/test/test_dnssd_flags.rb +6 -1
- data/test/test_dnssd_reply.rb +67 -0
- metadata +30 -6
- metadata.gz.sig +0 -0
- data/ext/dnssd/dns_sd.h +0 -1493
- data/sample/highlevel_api.rb +0 -30
data.tar.gz.sig
ADDED
Binary file
|
data/.autotest
CHANGED
@@ -1,15 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
begin
|
2
|
+
require 'autotest/fsevent'
|
3
|
+
rescue LoadError
|
4
|
+
end
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
Autotest.add_hook :run_command do |at|
|
7
|
+
at.unit_diff = 'cat'
|
8
|
+
if ENV['ONENINE']
|
9
|
+
system "rake1.9 compile"
|
10
|
+
else
|
11
|
+
system "rake compile"
|
12
12
|
end
|
13
|
-
|
14
13
|
end
|
15
14
|
|
data/History.txt
CHANGED
@@ -1,13 +1,38 @@
|
|
1
|
+
=== 1.2.0 / 2009-08-11
|
2
|
+
|
3
|
+
* 3 major enhancements
|
4
|
+
* DNSSD::Service is now directly instantiable
|
5
|
+
* DNSSD.announce which registers a server socket you've created
|
6
|
+
* DNSSD::Reply.connect which connects to a browsed service
|
7
|
+
* Fix asynchronous service shutdown crash
|
8
|
+
|
9
|
+
* 3 minor enhancements
|
10
|
+
* DNSSD.resolve now optionally accepts a DNSSD::Reply from DNSSD.browse
|
11
|
+
* Use rb_thread_wait_fd instead of custom rb_thread_select code
|
12
|
+
* DNSSD::Reply#protocol and DNSSD::Reply#service_name
|
13
|
+
* Added missing error classes
|
14
|
+
* Added missing InterfaceUnicast constant
|
15
|
+
* Improved Documentation
|
16
|
+
* Use C constants in ext/dnssd/errors.c
|
17
|
+
* Reduced C code in ext/dnssd/service.c for greater control. See
|
18
|
+
DNSSD::Service
|
19
|
+
|
20
|
+
* 4 bug fixes
|
21
|
+
* Don't invoke block on callback if none was provided
|
22
|
+
* Remove ext/dnssd/dns_sd.h so the correct header is used
|
23
|
+
* DNSSD::NoMemoryError is now raised instead of NoMemError
|
24
|
+
* DNSSD::ReferenceUsedError is now correctly named DNSSD::RefusedError
|
25
|
+
|
1
26
|
=== 1.1.0 / 2009-08-10
|
2
27
|
|
3
|
-
* 2
|
28
|
+
* 2 major enhancements
|
4
29
|
* Packaging files that need to be here
|
5
30
|
* Increased the version number
|
6
31
|
|
7
|
-
* 1
|
32
|
+
* 1 minor enhancement
|
8
33
|
* Less C codes
|
9
34
|
|
10
|
-
* 1
|
35
|
+
* 1 bug fix
|
11
36
|
* Increased INTERNET!
|
12
37
|
|
13
38
|
=== 0.7.2 / 2009-08-05
|
data/Manifest.txt
CHANGED
@@ -3,7 +3,6 @@ History.txt
|
|
3
3
|
Manifest.txt
|
4
4
|
README.txt
|
5
5
|
Rakefile
|
6
|
-
ext/dnssd/dns_sd.h
|
7
6
|
ext/dnssd/dnssd.c
|
8
7
|
ext/dnssd/dnssd.h
|
9
8
|
ext/dnssd/errors.c
|
@@ -16,11 +15,14 @@ lib/dnssd/reply.rb
|
|
16
15
|
lib/dnssd/service.rb
|
17
16
|
lib/dnssd/text_record.rb
|
18
17
|
sample/browse.rb
|
18
|
+
sample/enumerate_domains.rb
|
19
19
|
sample/growl.rb
|
20
|
-
sample/highlevel_api.rb
|
21
20
|
sample/register.rb
|
22
21
|
sample/resolve.rb
|
23
22
|
sample/resolve_ichat.rb
|
23
|
+
sample/server.rb
|
24
|
+
sample/socket.rb
|
25
|
+
test/test_dnssd.rb
|
24
26
|
test/test_dnssd_flags.rb
|
25
27
|
test/test_dnssd_reply.rb
|
26
28
|
test/test_dnssd_text_record.rb
|
data/README.txt
CHANGED
@@ -10,17 +10,19 @@ resolving, registration and domain enumeration.
|
|
10
10
|
|
11
11
|
== FEATURES/PROBLEMS:
|
12
12
|
|
13
|
-
*
|
13
|
+
* Needs more pie.
|
14
|
+
* Not all of the DNSSD API is implemented
|
15
|
+
* Sometimes tests fail
|
14
16
|
|
15
17
|
== SYNOPSIS:
|
16
18
|
|
19
|
+
See the sample directory (Hint: gem contents --prefix dnssd)
|
20
|
+
|
17
21
|
Registering a service:
|
18
22
|
|
19
|
-
|
20
|
-
|
21
|
-
# ...
|
23
|
+
http = TCPServer.new nil, 80
|
22
24
|
|
23
|
-
|
25
|
+
DNSSD.announce http, 'my awesome HTTP server'
|
24
26
|
|
25
27
|
Browsing services:
|
26
28
|
|
@@ -32,12 +34,12 @@ Browsing services:
|
|
32
34
|
|
33
35
|
== REQUIREMENTS:
|
34
36
|
|
35
|
-
*
|
36
|
-
* The dns-sd library on other operating systems
|
37
|
+
* OS X
|
38
|
+
* The dns-sd library on other operating systems (or dns-sd shim)
|
37
39
|
|
38
40
|
== INSTALL:
|
39
41
|
|
40
|
-
|
42
|
+
sudo gem install dnssd
|
41
43
|
|
42
44
|
== LICENSE:
|
43
45
|
|
data/ext/dnssd/dnssd.c
CHANGED
@@ -4,15 +4,92 @@ void Init_DNSSD_Errors(void);
|
|
4
4
|
void Init_DNSSD_Flags(void);
|
5
5
|
void Init_DNSSD_Service(void);
|
6
6
|
|
7
|
+
/*
|
8
|
+
* call-seq:
|
9
|
+
* DNSSD.getservbyport(port, proto = nil) => service_name
|
10
|
+
*
|
11
|
+
* Wrapper for getservbyport(3) - returns the service name for +port+.
|
12
|
+
*
|
13
|
+
* DNSSD.getservbyport 1025 # => 'blackjack'
|
14
|
+
*/
|
15
|
+
|
16
|
+
static VALUE
|
17
|
+
dnssd_getservbyport(int argc, VALUE * argv, VALUE self) {
|
18
|
+
VALUE _port, _proto;
|
19
|
+
struct servent * result;
|
20
|
+
int port;
|
21
|
+
char * proto = NULL;
|
22
|
+
|
23
|
+
rb_scan_args(argc, argv, "11", &_port, &_proto);
|
24
|
+
|
25
|
+
port = htons(FIX2INT(_port));
|
26
|
+
|
27
|
+
if (RTEST(_proto))
|
28
|
+
proto = StringValueCStr(_proto);
|
29
|
+
|
30
|
+
result = getservbyport(port, proto);
|
31
|
+
|
32
|
+
if (result == NULL)
|
33
|
+
return Qnil;
|
34
|
+
|
35
|
+
return rb_str_new2(result->s_name);
|
36
|
+
}
|
37
|
+
|
38
|
+
/*
|
39
|
+
* call-seq:
|
40
|
+
* DNSSD.interface_name(interface_index) # => interface_name
|
41
|
+
*
|
42
|
+
* Returns the interface name for interface +interface_index+.
|
43
|
+
*
|
44
|
+
* DNSSD.interface_name 1 # => 'lo0'
|
45
|
+
*/
|
46
|
+
|
47
|
+
static VALUE
|
48
|
+
dnssd_if_nametoindex(VALUE self, VALUE name) {
|
49
|
+
return UINT2NUM(if_nametoindex(StringValueCStr(name)));
|
50
|
+
}
|
51
|
+
|
52
|
+
/*
|
53
|
+
* call-seq:
|
54
|
+
* DNSSD.interface_index(interface_name) # => interface_index
|
55
|
+
*
|
56
|
+
* Returns the interface index for interface +interface_name+.
|
57
|
+
*
|
58
|
+
* DNSSD.interface_index 'lo0' # => 1
|
59
|
+
*/
|
60
|
+
|
61
|
+
static VALUE
|
62
|
+
dnssd_if_indextoname(VALUE self, VALUE index) {
|
63
|
+
char buffer[IF_NAMESIZE];
|
64
|
+
|
65
|
+
if (if_indextoname(NUM2UINT(index), buffer))
|
66
|
+
return rb_str_new2(buffer);
|
67
|
+
|
68
|
+
rb_raise(rb_eArgError, "invalid interface %d", NUM2UINT(index));
|
69
|
+
|
70
|
+
return Qnil;
|
71
|
+
}
|
72
|
+
|
7
73
|
void
|
8
74
|
Init_dnssd(void) {
|
9
75
|
VALUE mDNSSD = rb_define_module("DNSSD");
|
10
76
|
|
11
|
-
/*
|
12
|
-
rb_define_const(mDNSSD, "InterfaceAny",
|
77
|
+
/* All interfaces */
|
78
|
+
rb_define_const(mDNSSD, "InterfaceAny",
|
79
|
+
ULONG2NUM(kDNSServiceInterfaceIndexAny));
|
80
|
+
|
81
|
+
/* Local interfaces, for services running only on the same machine */
|
82
|
+
rb_define_const(mDNSSD, "InterfaceLocalOnly",
|
83
|
+
ULONG2NUM(kDNSServiceInterfaceIndexLocalOnly));
|
84
|
+
|
85
|
+
/* Unicast interfaces */
|
86
|
+
rb_define_const(mDNSSD, "InterfaceUnicast",
|
87
|
+
ULONG2NUM(kDNSServiceInterfaceIndexUnicast));
|
88
|
+
|
89
|
+
rb_define_singleton_method(mDNSSD, "getservbyport", dnssd_getservbyport, -1);
|
13
90
|
|
14
|
-
|
15
|
-
|
91
|
+
rb_define_singleton_method(mDNSSD, "interface_index", dnssd_if_nametoindex, 1);
|
92
|
+
rb_define_singleton_method(mDNSSD, "interface_name", dnssd_if_indextoname, 1);
|
16
93
|
|
17
94
|
Init_DNSSD_Errors();
|
18
95
|
Init_DNSSD_Flags();
|
data/ext/dnssd/dnssd.h
CHANGED
@@ -23,11 +23,13 @@
|
|
23
23
|
#ifdef HAVE_SYS_IF_H
|
24
24
|
#include <sys/if.h>
|
25
25
|
#endif
|
26
|
+
#ifdef HAVE_NETDB_H
|
27
|
+
#include <netdb.h>
|
28
|
+
#endif
|
26
29
|
|
27
30
|
extern VALUE eDNSSDError;
|
28
31
|
|
29
32
|
void dnssd_check_error_code(DNSServiceErrorType e);
|
30
|
-
void dnssd_instantiation_error(const char *what);
|
31
33
|
|
32
34
|
#endif /* RDNSSD_INCLUDED */
|
33
35
|
|
data/ext/dnssd/errors.c
CHANGED
@@ -4,39 +4,30 @@
|
|
4
4
|
VALUE eDNSSDError;
|
5
5
|
static VALUE eDNSSDUnknownError;
|
6
6
|
|
7
|
-
#define DNSSD_ERROR_START (-
|
8
|
-
#define DNSSD_ERROR_END (-
|
7
|
+
#define DNSSD_ERROR_START (DNSServiceErrorType)(-65792) /* 0xFFFE FF00 */
|
8
|
+
#define DNSSD_ERROR_END (DNSServiceErrorType)(-65537) /* 0xFFFE FFFF */
|
9
9
|
|
10
10
|
static VALUE dnssd_errors[DNSSD_ERROR_END - DNSSD_ERROR_START];
|
11
11
|
|
12
12
|
static void
|
13
|
-
dnssd_errors_store(VALUE error,
|
14
|
-
assert(DNSSD_ERROR_START <=
|
15
|
-
dnssd_errors[
|
13
|
+
dnssd_errors_store(VALUE error, DNSServiceErrorType err) {
|
14
|
+
assert(DNSSD_ERROR_START <= err && err <= DNSSD_ERROR_END);
|
15
|
+
dnssd_errors[err - DNSSD_ERROR_START] = error;
|
16
16
|
}
|
17
17
|
|
18
18
|
void
|
19
|
-
dnssd_check_error_code(DNSServiceErrorType
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
"DNSSD operation failed with error code: %d", num);
|
19
|
+
dnssd_check_error_code(DNSServiceErrorType err) {
|
20
|
+
if (err) {
|
21
|
+
if(DNSSD_ERROR_START <= err && err < DNSSD_ERROR_END) {
|
22
|
+
rb_raise(dnssd_errors[err - DNSSD_ERROR_START],
|
23
|
+
"DNSSD operation failed with error code: %d", err);
|
25
24
|
} else {
|
26
25
|
rb_raise(eDNSSDUnknownError,
|
27
|
-
"DNSSD operation failed with unrecognized error code: %d",
|
26
|
+
"DNSSD operation failed with unrecognized error code: %d", err);
|
28
27
|
}
|
29
28
|
}
|
30
29
|
}
|
31
30
|
|
32
|
-
void
|
33
|
-
dnssd_instantiation_error(const char *what) {
|
34
|
-
rb_raise(rb_eRuntimeError,
|
35
|
-
"cannot instantiate %s, use DNSSD "
|
36
|
-
"enumerate_domains(), browse(), resolve() or register() instead",
|
37
|
-
what);
|
38
|
-
}
|
39
|
-
|
40
31
|
/* Document-class: DNSSD::Error
|
41
32
|
*
|
42
33
|
* Base class of all DNS Service Discovery related errors.
|
@@ -51,55 +42,86 @@ Init_DNSSD_Errors(void) {
|
|
51
42
|
eDNSSDError = rb_define_class_under(mDNSSD, "Error", rb_eStandardError);
|
52
43
|
|
53
44
|
eDNSSDUnknownError = rb_define_class_under(mDNSSD, "UnknownError", eDNSSDError);
|
54
|
-
dnssd_errors_store(eDNSSDUnknownError,
|
45
|
+
dnssd_errors_store(eDNSSDUnknownError, kDNSServiceErr_Unknown);
|
55
46
|
|
56
47
|
error_class = rb_define_class_under(mDNSSD, "NoSuchNameError", eDNSSDError);
|
57
|
-
dnssd_errors_store(error_class,
|
48
|
+
dnssd_errors_store(error_class, kDNSServiceErr_NoSuchName);
|
58
49
|
|
59
|
-
|
50
|
+
error_class = rb_define_class_under(mDNSSD, "NoMemoryError", eDNSSDError);
|
51
|
+
dnssd_errors_store(error_class, kDNSServiceErr_NoMemory);
|
60
52
|
|
61
53
|
error_class = rb_define_class_under(mDNSSD, "BadParamError", eDNSSDError);
|
62
|
-
dnssd_errors_store(error_class,
|
54
|
+
dnssd_errors_store(error_class, kDNSServiceErr_BadParam);
|
63
55
|
|
64
56
|
error_class = rb_define_class_under(mDNSSD, "BadReferenceError", eDNSSDError);
|
65
|
-
dnssd_errors_store(error_class,
|
57
|
+
dnssd_errors_store(error_class, kDNSServiceErr_BadReference);
|
66
58
|
|
67
59
|
error_class = rb_define_class_under(mDNSSD, "BadStateError", eDNSSDError);
|
68
|
-
dnssd_errors_store(error_class,
|
60
|
+
dnssd_errors_store(error_class, kDNSServiceErr_BadState);
|
69
61
|
|
70
62
|
error_class = rb_define_class_under(mDNSSD, "BadFlagsError", eDNSSDError);
|
71
|
-
dnssd_errors_store(error_class,
|
63
|
+
dnssd_errors_store(error_class, kDNSServiceErr_BadFlags);
|
72
64
|
|
73
65
|
error_class = rb_define_class_under(mDNSSD, "UnsupportedError", eDNSSDError);
|
74
|
-
dnssd_errors_store(error_class,
|
66
|
+
dnssd_errors_store(error_class, kDNSServiceErr_Unsupported);
|
75
67
|
|
76
68
|
error_class = rb_define_class_under(mDNSSD, "NotInitializedError", eDNSSDError);
|
77
|
-
dnssd_errors_store(error_class,
|
69
|
+
dnssd_errors_store(error_class, kDNSServiceErr_NotInitialized);
|
78
70
|
|
79
71
|
error_class = rb_define_class_under(mDNSSD, "AlreadyRegisteredError", eDNSSDError);
|
80
|
-
dnssd_errors_store(error_class,
|
72
|
+
dnssd_errors_store(error_class, kDNSServiceErr_AlreadyRegistered);
|
81
73
|
|
82
74
|
error_class = rb_define_class_under(mDNSSD, "NameConflictError", eDNSSDError);
|
83
|
-
dnssd_errors_store(error_class,
|
75
|
+
dnssd_errors_store(error_class, kDNSServiceErr_NameConflict);
|
84
76
|
|
85
77
|
error_class = rb_define_class_under(mDNSSD, "InvalidError", eDNSSDError);
|
86
|
-
dnssd_errors_store(error_class,
|
78
|
+
dnssd_errors_store(error_class, kDNSServiceErr_Invalid);
|
79
|
+
|
80
|
+
error_class = rb_define_class_under(mDNSSD, "FirewallError", eDNSSDError);
|
81
|
+
dnssd_errors_store(error_class, kDNSServiceErr_Firewall);
|
87
82
|
|
88
83
|
error_class = rb_define_class_under(mDNSSD, "ClientIncompatibleError", eDNSSDError);
|
89
|
-
dnssd_errors_store(error_class,
|
84
|
+
dnssd_errors_store(error_class, kDNSServiceErr_Incompatible);
|
90
85
|
|
91
86
|
error_class = rb_define_class_under(mDNSSD, "BadInterfaceIndexError", eDNSSDError);
|
92
|
-
dnssd_errors_store(error_class,
|
87
|
+
dnssd_errors_store(error_class, kDNSServiceErr_BadInterfaceIndex);
|
93
88
|
|
94
|
-
error_class = rb_define_class_under(mDNSSD, "
|
95
|
-
dnssd_errors_store(error_class,
|
89
|
+
error_class = rb_define_class_under(mDNSSD, "RefusedError", eDNSSDError);
|
90
|
+
dnssd_errors_store(error_class, kDNSServiceErr_Refused);
|
96
91
|
|
97
92
|
error_class = rb_define_class_under(mDNSSD, "NoSuchRecordError", eDNSSDError);
|
98
|
-
dnssd_errors_store(error_class,
|
93
|
+
dnssd_errors_store(error_class, kDNSServiceErr_NoSuchRecord);
|
99
94
|
|
100
95
|
error_class = rb_define_class_under(mDNSSD, "NoAuthenticationError", eDNSSDError);
|
101
|
-
dnssd_errors_store(error_class,
|
96
|
+
dnssd_errors_store(error_class, kDNSServiceErr_NoAuth);
|
102
97
|
|
103
98
|
error_class = rb_define_class_under(mDNSSD, "NoSuchKeyError", eDNSSDError);
|
104
|
-
dnssd_errors_store(error_class,
|
99
|
+
dnssd_errors_store(error_class, kDNSServiceErr_NoSuchKey);
|
100
|
+
|
101
|
+
error_class = rb_define_class_under(mDNSSD, "NATTraversalError", eDNSSDError);
|
102
|
+
dnssd_errors_store(error_class, kDNSServiceErr_NATTraversal);
|
103
|
+
|
104
|
+
error_class = rb_define_class_under(mDNSSD, "DoubleNATError", eDNSSDError);
|
105
|
+
dnssd_errors_store(error_class, kDNSServiceErr_DoubleNAT);
|
106
|
+
|
107
|
+
error_class = rb_define_class_under(mDNSSD, "BadTimeError", eDNSSDError);
|
108
|
+
dnssd_errors_store(error_class, kDNSServiceErr_BadTime);
|
109
|
+
|
110
|
+
error_class = rb_define_class_under(mDNSSD, "BadSigError", eDNSSDError);
|
111
|
+
dnssd_errors_store(error_class, kDNSServiceErr_BadSig);
|
112
|
+
|
113
|
+
error_class = rb_define_class_under(mDNSSD, "BadKeyError", eDNSSDError);
|
114
|
+
dnssd_errors_store(error_class, kDNSServiceErr_BadKey);
|
115
|
+
|
116
|
+
error_class = rb_define_class_under(mDNSSD, "TransientError", eDNSSDError);
|
117
|
+
dnssd_errors_store(error_class, kDNSServiceErr_Transient);
|
118
|
+
|
119
|
+
error_class = rb_define_class_under(mDNSSD, "ServiceNotRunningError", eDNSSDError);
|
120
|
+
dnssd_errors_store(error_class, kDNSServiceErr_ServiceNotRunning);
|
121
|
+
|
122
|
+
error_class = rb_define_class_under(mDNSSD, "NATPortMappingUnsupported", eDNSSDError);
|
123
|
+
dnssd_errors_store(error_class, kDNSServiceErr_NATPortMappingUnsupported);
|
124
|
+
|
125
|
+
error_class = rb_define_class_under(mDNSSD, "NATPortMappingDisabled", eDNSSDError);
|
126
|
+
dnssd_errors_store(error_class, kDNSServiceErr_NATPortMappingDisabled);
|
105
127
|
}
|
data/ext/dnssd/extconf.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# :
|
2
|
+
# :stopdoc:
|
3
3
|
#
|
4
4
|
# Extension configuration script for DNS_SD C Extension.
|
5
5
|
|
@@ -38,6 +38,7 @@ have_header "sys/param.h"
|
|
38
38
|
have_header "sys/if.h"
|
39
39
|
have_header "net/if.h"
|
40
40
|
have_header "arpa/inet.h"
|
41
|
+
have_header "netdb.h"
|
41
42
|
|
42
43
|
abort "need function #{f}" unless have_macro("htons") || have_func("htons")
|
43
44
|
abort "need function #{f}" unless have_macro("ntohs") || have_func("ntohs")
|
@@ -54,3 +55,5 @@ s1 >= s2 or abort("sizeof(void*) < sizeof(DNSServiceFlags) please contact the au
|
|
54
55
|
|
55
56
|
create_makefile "dnssd"
|
56
57
|
|
58
|
+
# :startdoc:
|
59
|
+
|
data/ext/dnssd/flags.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#include "dnssd.h"
|
2
2
|
|
3
|
-
/*
|
4
|
-
#define DNSSD_MAX_FLAGS
|
3
|
+
/* dnssd flags, flag IDs, flag names */
|
4
|
+
#define DNSSD_MAX_FLAGS 13
|
5
5
|
|
6
6
|
static const DNSServiceFlags dnssd_flag[DNSSD_MAX_FLAGS] = {
|
7
7
|
kDNSServiceFlagsMoreComing,
|
@@ -17,7 +17,15 @@ static const DNSServiceFlags dnssd_flag[DNSSD_MAX_FLAGS] = {
|
|
17
17
|
kDNSServiceFlagsBrowseDomains,
|
18
18
|
kDNSServiceFlagsRegistrationDomains,
|
19
19
|
|
20
|
-
kDNSServiceFlagsLongLivedQuery
|
20
|
+
kDNSServiceFlagsLongLivedQuery,
|
21
|
+
|
22
|
+
kDNSServiceFlagsAllowRemoteQuery,
|
23
|
+
|
24
|
+
kDNSServiceFlagsForceMulticast,
|
25
|
+
|
26
|
+
kDNSServiceFlagsForce,
|
27
|
+
|
28
|
+
kDNSServiceFlagsReturnIntermediates
|
21
29
|
};
|
22
30
|
|
23
31
|
static const char *dnssd_flag_name[DNSSD_MAX_FLAGS] = {
|
@@ -29,7 +37,11 @@ static const char *dnssd_flag_name[DNSSD_MAX_FLAGS] = {
|
|
29
37
|
"unique",
|
30
38
|
"browse_domains",
|
31
39
|
"registration_domains",
|
32
|
-
"long_lived_query"
|
40
|
+
"long_lived_query",
|
41
|
+
"allow_remote_query",
|
42
|
+
"force_multicast",
|
43
|
+
"force",
|
44
|
+
"return_intermediates"
|
33
45
|
};
|
34
46
|
|
35
47
|
void
|
@@ -42,7 +54,7 @@ Init_DNSSD_Flags(void) {
|
|
42
54
|
cDNSSDFlags = rb_define_class_under(mDNSSD, "Flags", rb_cObject);
|
43
55
|
|
44
56
|
/* flag constants */
|
45
|
-
#if DNSSD_MAX_FLAGS !=
|
57
|
+
#if DNSSD_MAX_FLAGS != 13
|
46
58
|
#error The code below needs to be updated.
|
47
59
|
#endif
|
48
60
|
|
@@ -60,7 +72,7 @@ Init_DNSSD_Flags(void) {
|
|
60
72
|
* they will be delivered as usual.
|
61
73
|
*/
|
62
74
|
rb_define_const(cDNSSDFlags, "MoreComing",
|
63
|
-
|
75
|
+
ULONG2NUM(kDNSServiceFlagsMoreComing));
|
64
76
|
|
65
77
|
/* Applies only to enumeration. An enumeration callback with the
|
66
78
|
* DNSSD::Flags::Add flag NOT set indicates a DNSSD::Flags::Remove, i.e. the
|
@@ -79,46 +91,96 @@ Init_DNSSD_Flags(void) {
|
|
79
91
|
* service. DNSSD::Flags::NoAutoRename overrides this behavior - with this
|
80
92
|
* flag set, name conflicts will result in a callback. The NoAutoRename flag
|
81
93
|
* is only valid if a name is explicitly specified when registering a service
|
82
|
-
* (
|
94
|
+
* (i.e. the default name is not used.)
|
83
95
|
*/
|
84
96
|
rb_define_const(cDNSSDFlags, "NoAutoRename",
|
85
|
-
|
97
|
+
ULONG2NUM(kDNSServiceFlagsNoAutoRename));
|
86
98
|
|
87
|
-
/* Flag for registering individual records on a connected
|
99
|
+
/* Flag for registering individual records on a connected DNSSD::Service.
|
88
100
|
*
|
89
101
|
* DNSSD::Flags::Shared indicates that there may be multiple records with
|
90
|
-
* this name on the network (e.g. PTR records).
|
91
|
-
*
|
92
|
-
*
|
93
|
-
* not used by the Ruby API.)
|
102
|
+
* this name on the network (e.g. PTR records).
|
103
|
+
*
|
104
|
+
* (Not used currently by the Ruby API)
|
94
105
|
*/
|
95
106
|
rb_define_const(cDNSSDFlags, "Shared", ULONG2NUM(kDNSServiceFlagsShared));
|
107
|
+
|
108
|
+
/* DNSSD::Flags::Unique indicates that the record's name is to be unique on
|
109
|
+
* the network (e.g. SRV records).
|
110
|
+
*
|
111
|
+
* (Not used currently by the Ruby API)
|
112
|
+
*/
|
96
113
|
rb_define_const(cDNSSDFlags, "Unique", ULONG2NUM(kDNSServiceFlagsUnique));
|
97
114
|
|
98
|
-
/*
|
115
|
+
/* Specifies domain enumeration type.
|
116
|
+
*
|
117
|
+
* DNSSD::Flags::BrowseDomains enumerates domains recommended for browsing
|
99
118
|
*/
|
100
119
|
rb_define_const(cDNSSDFlags, "BrowseDomains",
|
101
|
-
|
120
|
+
ULONG2NUM(kDNSServiceFlagsBrowseDomains));
|
102
121
|
|
103
|
-
/*
|
122
|
+
/* Specifies domain enumeration type.
|
123
|
+
*
|
124
|
+
* DNSSD::Flags::RegistrationDomains enumerates domains recommended for
|
104
125
|
* registration.
|
105
126
|
*/
|
106
|
-
|
107
127
|
rb_define_const(cDNSSDFlags, "RegistrationDomains",
|
108
|
-
|
128
|
+
ULONG2NUM(kDNSServiceFlagsRegistrationDomains));
|
109
129
|
|
110
|
-
/* Flag for creating a long-lived unicast query for
|
111
|
-
*
|
130
|
+
/* Flag for creating a long-lived unicast query for DNSSD.query_record
|
131
|
+
*
|
132
|
+
* (Not used by the Ruby API)
|
133
|
+
*/
|
112
134
|
rb_define_const(cDNSSDFlags, "LongLivedQuery",
|
113
|
-
|
135
|
+
ULONG2NUM(kDNSServiceFlagsLongLivedQuery));
|
136
|
+
|
137
|
+
/* Flag for creating a record for which we will answer remote queries
|
138
|
+
* (queries from hosts more than one hop away; hosts not directly connected
|
139
|
+
* to the local link).
|
140
|
+
*/
|
141
|
+
rb_define_const(cDNSSDFlags, "AllowRemoteQuery",
|
142
|
+
ULONG2NUM(kDNSServiceFlagsAllowRemoteQuery));
|
143
|
+
|
144
|
+
/* Flag for signifying that a query or registration should be performed
|
145
|
+
* exclusively via multicast DNS, even for a name in a domain (e.g.
|
146
|
+
* foo.apple.com.) that would normally imply unicast DNS.
|
147
|
+
*/
|
148
|
+
rb_define_const(cDNSSDFlags, "ForceMulticast",
|
149
|
+
ULONG2NUM(kDNSServiceFlagsForceMulticast));
|
150
|
+
|
151
|
+
/* Flag for signifying a "stronger" variant of an operation. Currently
|
152
|
+
* defined only for DNSSD.reconfirm_record, where it forces a record to
|
153
|
+
* be removed from the cache immediately, instead of querying for a few
|
154
|
+
* seconds before concluding that the record is no longer valid and then
|
155
|
+
* removing it. This flag should be used with caution because if a service
|
156
|
+
* browsing PTR record is indeed still valid on the network, forcing its
|
157
|
+
* removal will result in a user-interface flap -- the discovered service
|
158
|
+
* instance will disappear, and then re-appear moments later.
|
159
|
+
*/
|
160
|
+
rb_define_const(cDNSSDFlags, "Force", ULONG2NUM(kDNSServiceFlagsForce));
|
161
|
+
|
162
|
+
/* Flag for returning intermediate results. For example, if a query results
|
163
|
+
* in an authoritative NXDomain (name does not exist) then that result is
|
164
|
+
* returned to the client. However the query is not implicitly cancelled --
|
165
|
+
* it remains active and if the answer subsequently changes (e.g. because a
|
166
|
+
* VPN tunnel is subsequently established) then that positive result will
|
167
|
+
* still be returned to the client. Similarly, if a query results in a CNAME
|
168
|
+
* record, then in addition to following the CNAME referral, the intermediate
|
169
|
+
* CNAME result is also returned to the client. When this flag is not set,
|
170
|
+
* NXDomain errors are not returned, and CNAME records are followed silently
|
171
|
+
* without informing the client of the intermediate steps.
|
172
|
+
*/
|
173
|
+
rb_define_const(cDNSSDFlags, "ReturnIntermediates",
|
174
|
+
ULONG2NUM(kDNSServiceFlagsReturnIntermediates));
|
114
175
|
|
115
176
|
flags_hash = rb_hash_new();
|
116
177
|
|
117
178
|
for (i = 0; i < DNSSD_MAX_FLAGS; i++) {
|
118
179
|
rb_hash_aset(flags_hash, rb_str_new2(dnssd_flag_name[i]),
|
119
|
-
|
180
|
+
ULONG2NUM(dnssd_flag[i]));
|
120
181
|
}
|
121
182
|
|
183
|
+
/* Hash of flags => flag_name */
|
122
184
|
rb_define_const(cDNSSDFlags, "FLAGS", flags_hash);
|
123
185
|
}
|
124
186
|
|