• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /***
2   This file is part of avahi.
3 
4   avahi is free software; you can redistribute it and/or modify it
5   under the terms of the GNU Lesser General Public License as
6   published by the Free Software Foundation; either version 2.1 of the
7   License, or (at your option) any later version.
8 
9   avahi is distributed in the hope that it will be useful, but WITHOUT
10   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11   or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
12   Public License for more details.
13 
14   You should have received a copy of the GNU Lesser General Public
15   License along with avahi; if not, write to the Free Software
16   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
17   USA.
18 ***/
19 
20 #ifdef HAVE_CONFIG_H
21 #include <config.h>
22 #endif
23 
24 #include <sys/types.h>
25 #include <assert.h>
26 #include <stdio.h>
27 
28 #include <avahi-common/gccmacro.h>
29 #include <dns_sd.h>
30 
hexdump(const void * p,size_t size)31 static void hexdump(const void* p, size_t size) {
32     const uint8_t *c = p;
33     assert(p);
34 
35     printf("Dumping %zu bytes from %p:\n", size, p);
36 
37     while (size > 0) {
38         unsigned i;
39 
40         for (i = 0; i < 16; i++) {
41             if (i < size)
42                 printf("%02x ", c[i]);
43             else
44                 printf("   ");
45         }
46 
47         for (i = 0; i < 16; i++) {
48             if (i < size)
49                 printf("%c", c[i] >= 32 && c[i] < 127 ? c[i] : '.');
50             else
51                 printf(" ");
52         }
53 
54         printf("\n");
55 
56         c += 16;
57 
58         if (size <= 16)
59             break;
60 
61         size -= 16;
62     }
63 }
64 
65 
main(AVAHI_GCC_UNUSED int argc,AVAHI_GCC_UNUSED char * argv[])66 int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char *argv[]) {
67     const char *r;
68     TXTRecordRef ref;
69     uint8_t l;
70     const void *p;
71     char k[256];
72 
73     TXTRecordCreate(&ref, 0, NULL);
74 
75     hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref));
76 
77     TXTRecordSetValue(&ref, "foo", 7, "lennart");
78     hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref));
79 
80     TXTRecordSetValue(&ref, "waldo", 5, "rocks");
81     hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref));
82 
83     TXTRecordSetValue(&ref, "quux", 9, "the_house");
84     hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref));
85 
86     TXTRecordSetValue(&ref, "yeah", 0, NULL);
87     hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref));
88 
89     TXTRecordSetValue(&ref, "waldo", 6, "rocked");
90     hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref));
91 
92     TXTRecordRemoveValue(&ref, "foo");
93     hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref));
94 
95     TXTRecordRemoveValue(&ref, "waldo");
96     hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref));
97 
98     TXTRecordSetValue(&ref, "kawumm", 6, "bloerb");
99     hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref));
100 
101     TXTRecordSetValue(&ref, "one", 1, "1");
102     hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref));
103 
104     TXTRecordSetValue(&ref, "two", 1, "2");
105     hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref));
106 
107     TXTRecordSetValue(&ref, "three", 1, "3");
108     hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref));
109 
110     assert(TXTRecordContainsKey(TXTRecordGetLength(&ref), TXTRecordGetBytesPtr(&ref), "two"));
111     assert(!TXTRecordContainsKey(TXTRecordGetLength(&ref), TXTRecordGetBytesPtr(&ref), "four"));
112 
113     r = TXTRecordGetValuePtr(TXTRecordGetLength(&ref), TXTRecordGetBytesPtr(&ref), "kawumm", &l);
114 
115     hexdump(r, l);
116 
117     assert(TXTRecordGetCount(TXTRecordGetLength(&ref), TXTRecordGetBytesPtr(&ref)) == 6);
118 
119     TXTRecordGetItemAtIndex(TXTRecordGetLength(&ref), TXTRecordGetBytesPtr(&ref), 2, sizeof(k), k, &l, &p);
120 
121     fprintf(stderr, "key=<%s>\n", k);
122 
123     hexdump(p, l);
124 
125     assert(TXTRecordGetItemAtIndex(TXTRecordGetLength(&ref), TXTRecordGetBytesPtr(&ref), 20, sizeof(k), k, &l, &p) == kDNSServiceErr_Invalid);
126 
127     TXTRecordDeallocate(&ref);
128 }
129